diff --git a/tools/build/bazel/onos_stage.py b/tools/build/bazel/onos_stage.py
new file mode 100755
index 0000000..8991dfa
--- /dev/null
+++ b/tools/build/bazel/onos_stage.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+#FIXME Add license
+
+import re
+import os
+from zipfile import ZipFile
+from tarfile import TarFile, TarInfo
+import tarfile
+import time
+from cStringIO import StringIO
+import subprocess
+
+
+written_files = set()
+now = time.time()
+
+def addFile(tar, dest, file, file_size):
+    if dest not in written_files:
+        info = TarInfo(dest)
+        info.size = file_size
+        info.mtime = now
+        info.mode = 0777
+        tar.addfile(info, fileobj=file)
+        written_files.add(dest)
+
+def addString(tar, dest, string):
+    if dest not in written_files:
+        print dest, string
+        info = TarInfo(dest)
+        info.size = len(string)
+        info.mtime = now
+        info.mode = 0777
+        file = StringIO(string)
+        tar.addfile(info, fileobj=file)
+        file.close()
+        written_files.add(dest)
+
+def getHash():
+    p = subprocess.Popen('git rev-parse --verify HEAD --short', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+    (output, err) = p.communicate()
+    return output if p.wait() == 0 else '0000000000'
+
+def stageOnos(output, version, files=[]):
+    base = 'onos-%s/' % version
+
+    runtimeVersion = version
+    if version.endswith('-SNAPSHOT'):
+        runtimeVersion = version.replace('-SNAPSHOT', '.%s' % getHash())
+
+    # Note this is not a compressed zip
+    with tarfile.open(output, 'w:gz') as output:
+        for file in files:
+            if '.zip' in file:
+                with ZipFile(file, 'r') as zip_part:
+                    for f in zip_part.infolist():
+                        dest = f.filename
+                        if base not in dest:
+                            dest = base + 'apache-karaf-3.0.8/system/' + f.filename
+                        addFile(output, dest, zip_part.open(f), f.file_size)
+            elif '.oar' in file:
+                with ZipFile(file, 'r') as oar:
+                    app_xml = oar.open('app.xml').read()
+                    app_name = re.search('name="([^"]+)"', app_xml).group(1)
+                    dest = base + 'apps/%(name)s/%(name)s.oar' % { 'name': app_name}
+                    addFile(output, dest, open(file), os.stat(file).st_size)
+                    dest = base + 'apps/%s/app.xml' % app_name
+                    addString(output, dest, app_xml)
+                    for f in oar.infolist():
+                        filename = f.filename
+                        if 'm2' in filename:
+                            dest = base + 'apache-karaf-3.0.8/system/' + filename[3:]
+                            if dest not in written_files:
+                                addFile(output, dest, oar.open(f), f.file_size)
+                                written_files.add(dest)
+            elif 'features.xml' in file:
+                dest = base + 'apache-karaf-3.0.8/system/org/onosproject/onos-features/%s/' % version
+                dest += 'onos-features-%s-features.xml' % version
+                with open(file) as f:
+                    addFile(output, dest, f, os.stat(file).st_size)
+        addString(output, base + 'apps/org.onosproject.drivers/active', '')
+        addString(output, base + 'VERSION', runtimeVersion)
+
+if __name__ == '__main__':
+    import sys
+
+    if len(sys.argv) < 3:
+        print 'USAGE' #FIXME
+        sys.exit(1)
+
+    output = sys.argv[1]
+    version = sys.argv[2]
+    args = sys.argv[3:]
+
+    stageOnos(output, version, args)
