diff --git a/scripts/run.py b/scripts/run.py
index 97e8d1d99849856514dca4f03decf2030b80da06..642e916a2c43762e385c059180fac445a9179d37 100755
--- a/scripts/run.py
+++ b/scripts/run.py
@@ -2,6 +2,8 @@
 import subprocess
 import sys
 import argparse
+import os
+import tempfile
 
 stty_params=None
 
@@ -28,7 +30,7 @@ def set_imgargs():
     args = ["setargs", "build/%s/usr.img" % opt_path, cmdargs.execute]
     subprocess.call(["scripts/imgedit.py"] + args)
     
-def start_osv():
+def start_osv_qemu():
     args = [
         "-vnc", ":1",
         "-gdb", "tcp::1234,server,nowait",
@@ -53,16 +55,10 @@ def start_osv():
         args += ["-netdev", "user,id=un0,net=192.168.122.0/24,host=192.168.122.1"]
         args += ["-device", "virtio-net-pci,netdev=un0"]
         
-    if (cmdargs.hypervisor == "kvm"):
+    if cmdargs.hypervisor == "kvm":
         args += ["-enable-kvm", "-cpu", "host,+x2apic"]
-    elif ((cmdargs.hypervisor == "xen") or (cmdargs.hypervisor == "xenpv")):
-        print >> sys.stderr, "Support for Xen hypervisor not implemented"
-        return;
-    elif ((cmdargs.hypervisor == "none") or (cmdargs.hypervisor == "qemu")):
+    elif (cmdargs.hypervisor == "none") or (cmdargs.hypervisor == "qemu"):
         pass
-    else:
-        print >> sys.stderr, "Unrecognized hypervisor selected"
-        return;
 
     try:
         # Save the current settings of the stty
@@ -75,6 +71,86 @@ def start_osv():
     finally:
         cleanups()
 
+def start_osv_xen():
+    if cmdargs.hypervisor == "xen":
+        args = [
+            "builder='hvm'",
+            "xen_platform_pci=1",
+            "acpi=1",
+            "apic=1",
+            "boot='c'",
+        ]
+    else:
+        args = [ "kernel='%s/build/%s/loader.elf'" % (os.getcwd(), opt_path) ]
+
+    try:
+        memory = int(cmdargs.memsize)
+    except ValueError:
+        memory = cmdargs.memsize
+
+        if memory[-1:].upper() == "M":
+            memory = int(memory[:-1])
+        elif memory[-2:].upper() == "MB":
+            memory = int(memory[:-2])
+        elif memory[-1:].upper() == "G":
+            memory = 1024 * int(memory[:-1])
+        elif memory[-2:].upper() == "GB":
+            memory = memory[:-2]
+            memory = 1024 * int(memory[:-2])
+        else:
+            print >> sys.stderr, "Unrecognized memory size"
+            return;
+
+    args += [
+        "memory=%d" % (memory),
+        "vcpus=%s" % (cmdargs.vcpus),
+        "maxcpus=%s" % (cmdargs.vcpus),
+        "name='osv-%d'" % (os.getpid()),
+        "disk=['file://%s/build/%s/usr.img,hda,rw']" % (os.getcwd(), opt_path),
+        "serial='pty'",
+        "paused=0",
+        "on_crash='preserve'"
+    ]
+
+    if cmdargs.networking:
+        args += [ "vif=['bridge=virbr0']" ]
+
+    # Using xm would allow us to get away with creating the file, but it comes
+    # with its set of problems as well. Stick to xl.
+    xenfile = tempfile.NamedTemporaryFile(mode="w")
+    xenfile.writelines( "%s\n" % item for item in args )
+    xenfile.flush()
+
+    try:
+        # Save the current settings of the stty
+        stty_save()
+
+        # Launch qemu
+        cmdline = ["xl", "create" ]
+        if not cmdargs.detach:
+            cmdline += [ "-c" ]
+        cmdline += [ xenfile.name ]
+        subprocess.call(cmdline)
+    except:
+        pass
+    finally:
+        xenfile.close()
+        cleanups()
+
+def start_osv():
+    launchers = {
+            "xen" : start_osv_xen,
+            "xenpv" : start_osv_xen,
+            "none" : start_osv_qemu,
+            "qemu" : start_osv_qemu,
+            "kvm" : start_osv_qemu,
+    }
+    try:
+        launchers[cmdargs.hypervisor]()
+    except KeyError: 
+        print >> sys.stderr, "Unrecognized hypervisor selected"
+        return;
+
 def main():
     set_imgargs()
     start_osv()
@@ -96,6 +172,8 @@ if (__name__ == "__main__"):
                         help="edit command line before execution")
     parser.add_argument("-p", "--hypervisor", action="store", default="kvm",
                         help="choose hypervisor to run: kvm, xen, xenpv, none (plain qemu)")
+    parser.add_argument("-D", "--detach", action="store",
+                        help="run in background, do not connect the console (Xen only)")
     parser.add_argument("-H", "--no-shutdown", action="store_true",
                         help="don't restart qemu automatially (allow debugger to connect on early errors)")
     cmdargs = parser.parse_args()