diff --git a/conf/settings-example.py b/conf/settings-example.py
--- a/conf/settings-example.py
+++ b/conf/settings-example.py
@@ -37,3 +37,8 @@
 # Customize as needed :)
 
 #CMD_LINE_ARGS = []
+
+# The timeout, in seconds, to wait for an instance to boot before
+# failing the boot process. Setting this to 0 disables waiting and
+# returns immediately after starting the boot process.
+#BOOT_TIMEOUT = 30
diff --git a/testcloud/cli.py b/testcloud/cli.py
--- a/testcloud/cli.py
+++ b/testcloud/cli.py
@@ -83,9 +83,12 @@
         # prepare instance
         tc_instance.prepare()
 
-        # boot instance
+        # create instance domain
         tc_instance.spawn_vm()
 
+        # start created domain
+        tc_instance.boot(args.timeout)
+
         # find vm ip
         vm_ip = find_vm_ip(args.name)
 
@@ -108,7 +111,7 @@
         raise TestcloudCliError("Cannot start instance {} because it does "
                                 "not exist".format(args.name))
 
-    tc_instance.start()
+    tc_instance.start(args.timeout)
 
 
 def _stop_instance(args):
@@ -203,6 +206,12 @@
     instarg_start = instarg_subp.add_parser("start", help="start instance")
     instarg_start.add_argument("name",
                                help="name of instance to start")
+    instarg_start.add_argument("--timeout",
+                               help="Time (in seconds) to wait for boot to "
+                               "complete before completion, setting to 0"
+                               " disables all waiting.",
+                               type=int,
+                               default=config_data.BOOT_TIMEOUT)
     instarg_start.set_defaults(func=_start_instance)
 
     # instance stop
@@ -240,6 +249,12 @@
                                 "--url",
                                 help="URL to qcow2 image is required.",
                                 type=str)
+    instarg_create.add_argument("--timeout",
+                                help="Time (in seconds) to wait for boot to "
+                                     "complete before completion, setting to 0"
+                                     " disables all waiting.",
+                                type=int,
+                                default=config_data.BOOT_TIMEOUT)
 
     imgarg = subparsers.add_parser("image", help="help on image options")
     imgarg_subp = imgarg.add_subparsers(title="subcommands",
diff --git a/testcloud/config.py b/testcloud/config.py
--- a/testcloud/config.py
+++ b/testcloud/config.py
@@ -120,6 +120,9 @@
 
     CMD_LINE_ARGS = []
 
+    # timeout, in seconds for instance boot process
+    BOOT_TIMEOUT = 30
+
     def merge_object(self, obj):
         '''Overwrites default values with values from a python object which have
         names containing all upper case letters.
diff --git a/testcloud/instance.py b/testcloud/instance.py
--- a/testcloud/instance.py
+++ b/testcloud/instance.py
@@ -13,6 +13,7 @@
 import subprocess
 import glob
 import logging
+import time
 
 import libvirt
 import shutil
@@ -330,9 +331,6 @@
 
         conn = libvirt.open('qemu:///system')
         conn.defineXML(domain_xml)
-        self.boot()
-
-        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
@@ -351,17 +349,59 @@
         """Set the seed image for the instance."""
         self.seed = path
 
-    def boot(self):
-        """Boot an already spawned instance."""
+    def boot(self, timeout=config_data.BOOT_TIMEOUT):
+        """Deprecated alias for :py:meth:`start`"""
+
+        log.warn("instance.boot has been depricated and will be removed in a "
+                 "future release, use instance.start instead")
 
-        self._get_domain().create()
+        self.start(timeout)
 
-    def start(self):
-        """Start the instance"""
+    def start(self, timeout=config_data.BOOT_TIMEOUT):
+        """Start an existing instance and wait up to :py:attr:`timeout` seconds
+        for a network interface to appear.
 
-        log.debug("attempting to start instance {}.".format(self.name))
+        :param int timeout: number of seconds to wait before timing out.
+                            Setting this to 0 will disable timeout, default
+                            is configured with :py:const:`BOOT_TIMEOUT` config
+                            value.
+        :raises TestcloudInstanceError: if there is an error while creating the
+                                        instance or if the timeout is reached
+                                        while looking for a network interface
+        """
 
-        self._get_domain().create()
+        log.debug("Creating domain {}".format(self.name))
+        dom = self._get_domain()
+        create_status = dom.create()
+
+        # libvirt doesn't directly raise errors on boot failure, check the
+        # return code to verify that the boot process was successful from
+        # libvirt's POV
+        if create_status != 0:
+            raise TestcloudInstanceError("Instance {} did not start "
+                                         "successfully, see libvirt logs for "
+                                         "details".format(self.name))
+        log.debug("Polling domain for active network interface")
+
+        poll_tick = 0.5
+        timeout_ticks = timeout / poll_tick
+        count = 0
+
+        # poll libvirt for domain interfaces, returning when an interface is
+        # found, indicating that the boot process is post-cloud-init
+        while count <= timeout_ticks:
+            domif = dom.interfaceAddresses(0)
+
+            if len(domif) > 0 or timeout_ticks == 0:
+                log.info("Successfully booted instance {}".format(self.name))
+                return
+
+            count += 1
+            time.sleep(poll_tick)
+
+        # If we get here, the boot process has timed out
+        raise TestcloudInstanceError("Instance {} has failed to boot in {} "
+                                     "seconds".format(self.name, timeout))
 
     def stop(self):
         """Stop the instance"""

