diff --git libcloud/compute/drivers/hostvirtual.py libcloud/compute/drivers/hostvirtual.py
index 088f4a7..0bbde5a 100644
--- libcloud/compute/drivers/hostvirtual.py
+++ libcloud/compute/drivers/hostvirtual.py
@@ -22,6 +22,7 @@ try:
 except ImportError:
     import json
 
+import time
 
 from libcloud.utils.py3 import httplib
 
@@ -78,8 +79,8 @@ class HostVirtualNodeDriver(NodeDriver):
             extra['image'] = data['os_id']
         if 'location_id' in data:
             extra['location'] = data['location_id']
-
-        public_ips.append(data['ip'])
+        if 'ip' in data:
+            public_ips.append(data['ip'])
 
         node = Node(id=data['mbpkgid'], name=data['fqdn'], state=state,
                     public_ips=public_ips, private_ips=private_ips,
@@ -137,40 +138,53 @@ class HostVirtualNodeDriver(NodeDriver):
             nodes.append(node)
         return nodes
 
+    def _check_node(self, node_id, timeout=30, interval=5):
+
+        # poll until we get a node
+        for i in range(0, timeout, interval):
+            try:
+                node = self.ex_get_node(node_id)
+                return node
+            except HostVirtualException:
+                time.sleep(interval)
+                pass
+
+        raise HostVirtualException(412, 'Timedout on getting node details')
+
     def create_node(self, **kwargs):
-        name = kwargs['name']  # expects fqdn ex: test.com
+
+        dc = None
+
         size = kwargs['size']
         image = kwargs['image']
-        auth = kwargs['auth']
-        dc = None
+
+        params = {'plan': size.name}
 
         if "location" in kwargs:
             dc = kwargs["location"].id
         else:
             dc = '3'
 
-        params = {'fqdn': name,
-                  'plan': size.name,
-                  'image': image.id,
-                  'location': dc
-                  }
+        # simply order a package first
+        result = self.connection.request(API_ROOT + '/cloud/buy/',
+                                         data=json.dumps(params),
+                                         method='POST').object
 
-        ssh_key = None
-        password = None
-        if isinstance(auth, NodeAuthSSHKey):
-            ssh_key = auth.pubkey
-            params['ssh_key'] = ssh_key
-        elif isinstance(auth, NodeAuthPassword):
-            password = auth.password
-            params['password'] = password
+        # create a stub node
+        stub_node = self._to_node({
+            'mbpkgid': result['id'],
+            'status': 'PENDING',
+            'fqdn': kwargs['name'],
+            'plan_id': size.id,
+            'os_id': image.id,
+            'location_id': dc
+        })
 
-        if not ssh_key and not password:
-            raise HostVirtualException(500, "Need SSH key or Root password")
+        # provisioning a server using the stub node
+        self.ex_provision_node(node=stub_node, auth=kwargs['auth'])
 
-        result = self.connection.request(API_ROOT + '/cloud/buy_build',
-                                         data=json.dumps(params),
-                                         method='POST').object
-        return self._to_node(result)
+        node = self._check_node(stub_node.id)
+        return node
 
     def reboot_node(self, node):
         params = {'force': 0, 'mbpkgid': node.id}
@@ -182,7 +196,11 @@ class HostVirtualNodeDriver(NodeDriver):
         return bool(result)
 
     def destroy_node(self, node):
-        params = {'mbpkgid': node.id}
+        params = {
+            'mbpkgid': node.id,
+            #'reason': 'Submitted through Libcloud API'
+        }
+
         result = self.connection.request(
             API_ROOT + '/cloud/cancel', data=json.dumps(params),
             method='POST').object
@@ -216,7 +234,7 @@ class HostVirtualNodeDriver(NodeDriver):
         """
         params = {'force': 0, 'mbpkgid': node.id}
         result = self.connection.request(
-            API_ROOT + '/cloud/server/stop',
+            API_ROOT + '/cloud/server/shutdown',
             data=json.dumps(params),
             method='POST').object
 
@@ -239,9 +257,9 @@ class HostVirtualNodeDriver(NodeDriver):
 
         return bool(result)
 
-    def ex_build_node(self, **kwargs):
+    def ex_provision_node(self, **kwargs):
         """
-        Build a server on a VR package and get it booted
+        Provision a server on a VR package and get it booted
 
         @keyword node: node which should be used
         @type    node: L{Node}
@@ -255,7 +273,8 @@ class HostVirtualNodeDriver(NodeDriver):
         @keyword location: which datacenter to create the server in
         @type    location: L{NodeLocation}
 
-        @rtype: C{bool}
+        @return: Node representing the newly built server
+        @rtype: L{Node}
         """
 
         node = kwargs['node']
diff --git libcloud/test/compute/fixtures/hostvirtual/create_node.json libcloud/test/compute/fixtures/hostvirtual/create_node.json
index fd92b81..b9b3a09 100644
--- libcloud/test/compute/fixtures/hostvirtual/create_node.json
+++ libcloud/test/compute/fixtures/hostvirtual/create_node.json
@@ -1,17 +1,3 @@
 {
-  "mbpkgid": "76070",
-  "package_status": "Active",
-  "domu_package": null,
-  "rescue": null,
-  "locked": null,
-  "state": null,
-  "installed": null,
-  "package": null,
-  "ipv6": "",
-  "city": null,
-  "fqdn": "test.com",
-  "uptime": false,
-  "ip": null,
-  "name": "VR512",
-  "status": "BUILDING"
+  "id": "62291"
 }
diff --git libcloud/test/compute/test_hostvirtual.py libcloud/test/compute/test_hostvirtual.py
index 9a83b15..997b435 100644
--- libcloud/test/compute/test_hostvirtual.py
+++ libcloud/test/compute/test_hostvirtual.py
@@ -103,8 +103,16 @@ class HostVirtualTest(unittest.TestCase):
             size=size,
             auth=auth
         )
-        self.assertEqual('76070', node.id)
-        self.assertEqual('test.com', node.name)
+        self.assertEqual('62291', node.id)
+        self.assertEqual('server1.vr-cluster.org', node.name)
+
+    def test_ex_provision_node(self):
+        node = self.driver.list_nodes()[0]
+        auth = NodeAuthPassword('vr!@#hosted#@!')
+        self.assertTrue(self.driver.ex_provision_node(
+            node=node,
+            auth=auth
+        ))
 
     def test_ex_build_node(self):
         node = self.driver.list_nodes()[0]
@@ -126,8 +134,8 @@ class HostVirtualTest(unittest.TestCase):
             auth=auth,
             location=location
         )
-        self.assertEqual('76070', node.id)
-        self.assertEqual('test.com', node.name)
+        self.assertEqual('62291', node.id)
+        self.assertEqual('server1.vr-cluster.org', node.name)
 
 
 class HostVirtualMockHttp(MockHttp):
@@ -161,7 +169,7 @@ class HostVirtualMockHttp(MockHttp):
         body = self.fixtures.load('node_reboot.json')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
-    def _vapi_cloud_server_stop(self, method, url, body, headers):
+    def _vapi_cloud_server_shutdown(self, method, url, body, headers):
         body = self.fixtures.load('node_stop.json')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
@@ -169,7 +177,7 @@ class HostVirtualMockHttp(MockHttp):
         body = self.fixtures.load('node_start.json')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
-    def _vapi_cloud_buy_build(self, method, url, body, headers):
+    def _vapi_cloud_buy(self, method, url, body, headers):
         body = self.fixtures.load('create_node.json')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
