diff --git libcloud/common/hostvirtual.py libcloud/common/hostvirtual.py
index 2c7f06a..f88d8b3 100644
--- libcloud/common/hostvirtual.py
+++ libcloud/common/hostvirtual.py
@@ -19,6 +19,7 @@ except ImportError:
 
 from libcloud.utils.py3 import httplib
 from libcloud.common.base import ConnectionKey, JsonResponse
+from libcloud.compute.types import InvalidCredsError
 from libcloud.common.types import LibcloudError
 
 API_HOST = 'www.vr.org'
@@ -62,8 +63,7 @@ class HostVirtualResponse(JsonResponse):
         status = int(self.status)
 
         if self.status == httplib.UNAUTHORIZED:
-            raise InvalidCredsError(
-                data['error']['code'] + ': ' + data['error']['message'])
+            raise InvalidCredsError("%(code)s:%(message)s" % data['error'])
         elif self.status == httplib.PRECONDITION_FAILED:
             raise HostVirtualException(
                 data['error']['code'], data['error']['message'])
diff --git libcloud/compute/drivers/hostvirtual.py libcloud/compute/drivers/hostvirtual.py
index 6a84084..3bc4a60 100644
--- libcloud/compute/drivers/hostvirtual.py
+++ libcloud/compute/drivers/hostvirtual.py
@@ -29,7 +29,7 @@ from libcloud.common.hostvirtual import HostVirtualResponse
 from libcloud.common.hostvirtual import HostVirtualConnection
 from libcloud.common.hostvirtual import HostVirtualException
 from libcloud.compute.providers import Provider
-from libcloud.compute.types import NodeState, InvalidCredsError
+from libcloud.compute.types import NodeState
 from libcloud.compute.base import Node, NodeDriver
 from libcloud.compute.base import NodeImage, NodeSize, NodeLocation
 from libcloud.compute.base import NodeAuthSSHKey, NodeAuthPassword
@@ -72,6 +72,13 @@ class HostVirtualNodeDriver(NodeDriver):
         private_ips = []
         extra = {}
 
+        if 'plan_id' in data:
+            extra['size'] = data['plan_id']
+        if 'os_id' in data:
+            extra['image'] = data['os_id']
+        if 'location_id' in data:
+            extra['location'] = data['location_id']
+
         public_ips.append(data['ip'])
 
         node = Node(id=data['mbpkgid'], name=data['fqdn'], state=state,
@@ -99,7 +106,7 @@ class HostVirtualNodeDriver(NodeDriver):
             data=json.dumps(params)).object
         sizes = []
         for size in result:
-            n = NodeSize(id=size['plan'],
+            n = NodeSize(id=size['plan_id'],
                          name=size['plan'],
                          ram=size['ram'],
                          disk=size['disk'],
@@ -116,9 +123,9 @@ class HostVirtualNodeDriver(NodeDriver):
             i = NodeImage(id=image["id"],
                           name=image["os"],
                           driver=self.connection.driver,
-                          extra={
-                              'hypervisor': image['tech'],
-                              'arch': image['bits']})
+                          extra=image)
+            del i.extra['id']
+            del i.extra['os']
             images.append(i)
         return images
 
@@ -143,7 +150,7 @@ class HostVirtualNodeDriver(NodeDriver):
             dc = '3'
 
         params = {'fqdn': name,
-                  'plan': size.id,
+                  'plan': size.name,
                   'image': image.id,
                   'location': dc
                   }
@@ -158,16 +165,40 @@ class HostVirtualNodeDriver(NodeDriver):
             params['password'] = password
 
         if not ssh_key and not password:
-            raise HostVirtualException(500, "Need SSH key or root password")
-
-        if password is None:
-            raise HostVirtualException(500, "Root password cannot be empty")
+            raise HostVirtualException(500, "Need SSH key or Root password")
 
         result = self.connection.request(API_ROOT + '/cloud/buy_build',
                                          data=json.dumps(params),
                                          method='POST').object
         return self._to_node(result)
 
+    def ex_build_node(self, **kwargs):
+        params = {
+            'mbpkgid': kwargs['id'],
+            'image': kwargs['image'],
+            'location': kwargs['location'],
+            'fqdn': kwargs['name']
+        }
+
+        auth = kwargs['auth']
+
+        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
+
+        if not ssh_key and not password:
+            raise HostVirtualException(500, "Need SSH key or Root password")
+
+        result = self.connection.request(API_ROOT + '/cloud/server/build',
+                                         data=json.dumps(params),
+                                         method='POST').object
+        return bool(result)
+
     def reboot_node(self, node):
         params = {'force': 0, 'mbpkgid': node.id}
         result = self.connection.request(
@@ -185,6 +216,13 @@ class HostVirtualNodeDriver(NodeDriver):
 
         return bool(result)
 
+    def ex_get_node(self, node_id):
+        params = {'mbpkgid': node_id}
+        result = self.connection.request(
+            API_ROOT + '/cloud/server', params=params).object
+        node = self._to_node(result)
+        return node
+
     def ex_stop_node(self, node):
         """
         Stop a node.
diff --git libcloud/dns/drivers/hostvirtual.py libcloud/dns/drivers/hostvirtual.py
index bab8feb..c0ac57a 100644
--- libcloud/dns/drivers/hostvirtual.py
+++ libcloud/dns/drivers/hostvirtual.py
@@ -21,8 +21,6 @@ from libcloud.utils.misc import merge_valid_keys, get_new_obj
 from libcloud.common.hostvirtual import HostVirtualResponse
 from libcloud.common.hostvirtual import HostVirtualConnection
 from libcloud.compute.drivers.hostvirtual import API_ROOT
-from libcloud.compute.drivers.hostvirtual import HostVirtualConnection
-from libcloud.compute.drivers.hostvirtual import HostVirtualResponse
 from libcloud.dns.types import Provider, RecordType
 from libcloud.dns.types import ZoneDoesNotExistError, RecordDoesNotExistError
 from libcloud.dns.base import DNSDriver, Zone, Record
