diff --git a/setup.py b/setup.py
index 4cf4294e2791a2298fa94aa517b587ae49f3d9e1..b185e4df4aa4cfd4b49e42fff160dc4ffd4d4e26 100755
--- a/setup.py
+++ b/setup.py
@@ -1,9 +1,75 @@
 #!/usr/bin/env python
 
+from pathlib import Path
+import collections
 import setuptools
+import sys
+import zipfile
+
+from distutils.cmd import Command
+from distutils.errors import DistutilsOptionError
+from distutils import dir_util, log
+
+sys.dont_write_bytecode = True
+
+
+# noinspection PyAttributeOutsideInit
+class ZipCommand(Command):
+    """Ensures that 'setup.py dist' creates a zip file with a wheel and other useful stuff."""
+
+    description = "create a zip with a wheel and other useful files"
+    user_options = [
+        ('dist-dir=', 'd',
+         "directory to put the archive in "
+         "[default: dist]"),
+    ]
+
+    def initialize_options(self):
+        self.dist_dir = None
+
+    def finalize_options(self):
+        if self.dist_dir is None:
+            self.dist_dir = "dist"
+
+    def run(self):
+        self.run_command('bdist_wheel')
+        if not self.distribution.dist_files:
+            msg = "No dist file created, even though we ran 'bdist_wheel' ourselves."
+            raise DistutilsOptionError(msg)
+
+        base_dir = Path(self.distribution.get_fullname())
+        zip_base = Path(self.dist_dir) / base_dir
+        zip_name = zip_base.with_name(zip_base.name + '.zip')
+
+        log.info('Creating ZIP file %s', zip_name)
+
+        with zipfile.ZipFile(str(zip_name), mode='w') as archive:
+            def add_to_root(fname: Path):
+                log.info('    adding %s', fname.name)
+                archive.write(str(fname), fname.name)
+
+            for command, pyversion, filename in self.distribution.dist_files:
+                add_to_root(Path(filename))
+
+            add_to_root(Path('flamenco-worker.cfg'))
+            add_to_root(Path('LICENSE.txt'))
+            add_to_root(Path('README.md'))
+
+            paths = collections.deque([Path('system-integration')])
+            while paths:
+                this_path = paths.popleft()
+                if this_path.is_dir():
+                    paths.extend(this_path.iterdir())
+                    continue
+
+                log.info('    adding %s', this_path)
+                archive.write(str(this_path), str(this_path))
+
+
 
 if __name__ == '__main__':
     setuptools.setup(
+        cmdclass={'zip': ZipCommand},
         name='flamenco-worker',
         version='2.0-beta10-worker6',
         description='Flamenco Worker implementation',