diff --git a/buck-tools/onos_stage.py b/buck-tools/onos_stage.py
new file mode 100755
index 0000000..5433cb2
--- /dev/null
+++ b/buck-tools/onos_stage.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#FIXME Add license
+
+import re
+from zipfile import ZipFile
+
+def stageOnos(output, files=[]):
+    # Note this is not a compressed zip
+    with ZipFile(output, 'a') as output:
+        written_files = set(output.namelist())
+        for file in files:
+            if '.zip' in file:
+                with ZipFile(file, 'r') as zip_part:
+                    for f in zip_part.namelist():
+                        dest = 'apache-karaf-3.0.5/system/' + f
+                        if dest not in written_files:
+                            output.writestr(dest, zip_part.open(f).read())
+                            written_files.add(dest)
+            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 = 'apps/%(name)s/%(name)s.oar' % { 'name': app_name}
+                    output.write(file, dest)
+                    dest = 'apps/%s/app.xml' % app_name
+                    output.writestr(dest, app_xml)
+                    for f in oar.namelist():
+                        if 'm2' in f:
+                            dest = 'apache-karaf-3.0.5/system/' + f[3:]
+                            if dest not in written_files:
+                                output.writestr(dest, oar.open(f).read())
+                                written_files.add(dest)
+            elif 'features.xml' in file:
+                dest = 'apache-karaf-3.0.5/system/org/onosproject/onos-features/1.6.0-SNAPSHOT/'
+                dest += 'onos-features-1.6.0-SNAPSHOT-features.xml'
+                with open(file) as f:
+                    output.writestr(dest, f.read())
+            # filename = file.split('/')[-1]
+            # if mvnCoords == 'APP':
+            #     dest = filename
+            # else:
+            #     groupId, artifactId, version = mvnCoords.split(':')
+            #     groupId = groupId.replace('.', '/')
+            #     extension = filename.split('.')[-1]
+            #     if extension == 'jar':
+            #         filename = '%s-%s.jar' % ( artifactId, version )
+            #     elif 'features.xml' in filename:
+            #         filename = '%s-%s-features.xml' % ( artifactId, version )
+            #     dest = 'system/%s/%s/%s/%s' % ( groupId, artifactId, version, filename )
+            # zip.write(file, dest)
+        output.writestr('apps/org.onosproject.drivers/active', '')
+        output.writestr('apps/org.onosproject.openflow-base/active', '')
+        output.writestr('apps/org.onosproject.lldp/active', '')
+        output.writestr('apps/org.onosproject.host/active', '')
+
+if __name__ == '__main__':
+    import sys
+
+    if len(sys.argv) < 2:
+        print 'USAGE'
+        sys.exit(1)
+
+    output = sys.argv[1]
+    args = sys.argv[2:]
+
+    # if len(args) % 2 != 0:
+    #     print 'There must be an even number of args: file mvn_coords'
+    #     sys.exit(2)
+
+    #files = zip(*[iter(args)]*2)
+    stageOnos(output, args)
