diff --git a/testcloud/config.py b/testcloud/config.py
--- a/testcloud/config.py
+++ b/testcloud/config.py
@@ -90,6 +90,9 @@
     DATA_DIR = "/var/lib/testcloud"
     CACHE_DIR = "/var/lib/testcloud/cache"
 
+    # libvirt domain XML Template
+    XML_TEMPLATE = "/var/lib/testcloud/domain-template.xml"
+
     # Data for cloud-init
 
     PASSWORD = 'passw0rd'
diff --git a/testcloud/instance.py b/testcloud/instance.py
--- a/testcloud/instance.py
+++ b/testcloud/instance.py
@@ -16,8 +16,11 @@
 
 import libvirt
 import shutil
+import uuid
+import xml.etree.ElementTree as ET
 
 from . import config
+from . import util
 from .exceptions import TestcloudInstanceError
 
 config_data = config.get_config()
@@ -135,6 +138,7 @@
         self.seed_path = "{}/{}-seed.img".format(self.path, self.name)
         self.meta_path = "{}/meta".format(self.path)
         self.local_disk = "{}/{}-local.qcow2".format(self.path, self.name)
+        self.xml_path = "{}/{}-domain.xml".format(self.path, self.name)
 
         self.ram = 512
         self.vnc = False
@@ -283,39 +287,55 @@
                                               self.name), 'w') as ip_file:
             ip_file.write(ip)
 
-    def spawn_vm(self):
-        """Create and boot the instance, using prepared data."""
+    def write_domain_xml(self):
+        """Load the default xml template, and populate it with the following:
+         - name
+         - uuid
+         - locations of disks
+         - network mac address
+
+         WARNING: This is fragile. It expects *exactly* the xml template
+         testcloud shipped with. In the future, we'll want this to be more
+         extensible, but we're not there yet."""
+
+        with open(config_data.XML_TEMPLATE, 'r') as template:
+            template_xml = ''.join([x for x in template.readlines()])
+
+        root = ET.fromstring(template_xml)
+
+        root.find('./name').text = self.name
+        root.find('./uuid').text = str(uuid.uuid4())
 
-        boot_args = ['/usr/bin/virt-install',
-                     '--connect',
-                     'qemu:///system',
-                     '--import',
-                     '-n',
-                     self.name,
-                     '-r',
-                     str(self.ram),
-                     '--os-type=linux',  # This should be configurable later
-                     '--disk',
-                     '{},device=disk,bus=virtio,format=qcow2'.format(
-                         self.local_disk),
-                     '--disk',
-                     '{},device=disk,bus=virtio'.format(self.seed_path),
-                     ]
+        # Set the disks - Yes this is ugly. These can be hard coded because
+        # we're only using the template we ship. It'll have to be more robust
+        # later.
+        disks = root.findall('./devices/disk')
+        disks[0][1].attrib['file'] = self.local_disk
+        disks[1][1].attrib['file'] = self.seed_path
 
-        # Extend with the customizations from the config_data file
-        boot_args.extend(config_data.CMD_LINE_ARGS)
+        # Set a random mac address to avoid collisions
+        net_interface = root.find('./devices/interface')[0]
+        net_interface.attrib['address'] = util.generate_mac_address()
 
-        if self.graphics:
-            boot_args.extend(['--noautoconsole'])
+        # Write out the final xml file for the domain
+        with open(self.xml_path, 'w') as dom_template:
+            dom_template.write(ET.tostring(root))
+
+        return
+
+    def spawn_vm(self):
+        """Create and boot the instance, using prepared data."""
 
-        if self.vnc:
-            boot_args.extend(['-vnc', '0.0.0.0:1'])
+        self.write_domain_xml()
 
-        vm = subprocess.Popen(boot_args)
+        with open(self.xml_path, 'r') as xml_file:
+            domain_xml = ''.join([x for x in xml_file.readlines()])
 
-        log.info("Successfully booted your local cloud image! PID: %d" % vm.pid)
+        conn = libvirt.open('qemu:///system')
+        domain = conn.defineXML(domain_xml)
+        self.boot()
 
-        return vm
+        log.info("Successfully booted your local cloud image!")
 
     def expand_qcow(self, size="+10G"):
         """Expand the storage for a qcow image. Currently only used for Atomic
diff --git a/testcloud/util.py b/testcloud/util.py
--- a/testcloud/util.py
+++ b/testcloud/util.py
@@ -11,6 +11,7 @@
 import subprocess
 import logging
 
+import random
 import libvirt
 import xml.etree.ElementTree as ET
 
@@ -55,3 +56,12 @@
     for entry in arp_list:
         if mac in entry:
             return entry.split()[1][1:-1]
+
+def generate_mac_address():
+    """Create a workable mac address for our instances."""
+
+    hex_mac = [0x52, 0x54, 0x00]  # These 3 are the prefix libvirt uses
+    hex_mac += [random.randint(0x00, 0xff) for x in range(3)]
+    mac = ':'.join(hex(x)[2:] for x in hex_mac)
+
+    return mac

