diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py
index 0df7e422d7868a516b42efbbc0d21cf69f3634a0..19d96453ce5d8d953b7f06b3217782393e3f316d 100644
--- a/lib/hypervisor/hv_kvm.py
+++ b/lib/hypervisor/hv_kvm.py
@@ -264,18 +264,25 @@ class KVMHypervisor(hv_base.BaseHypervisor):
     vnc_bind_address = instance.hvparams[constants.HV_VNC_BIND_ADDRESS]
     if vnc_bind_address:
       kvm_cmd.extend(['-usbdevice', 'tablet'])
-      if instance.network_port > constants.HT_HVM_VNC_BASE_PORT:
-        display = instance.network_port - constants.HT_HVM_VNC_BASE_PORT
-        if vnc_bind_address == '0.0.0.0':
-          vnc_arg = ':%d' % (display)
+      if utils.IsValidIP(vnc_bind_address):
+        if instance.network_port > constants.HT_HVM_VNC_BASE_PORT:
+          display = instance.network_port - constants.HT_HVM_VNC_BASE_PORT
+          if vnc_bind_address == '0.0.0.0':
+            vnc_arg = ':%d' % (display)
+          else:
+            vnc_arg = '%s:%d' % (constants.HV_VNC_BIND_ADDRESS, display)
         else:
-          vnc_arg = '%s:%d' % (constants.HV_VNC_BIND_ADDRESS, display)
-        kvm_cmd.extend(['-vnc', vnc_arg])
+          logging.error("Network port is not a valid VNC display (%d < %d)."
+                        " Not starting VNC" %
+                        (instance.network_port,
+                         constants.HT_HVM_VNC_BASE_PORT))
+          vnc_arg = 'none'
       else:
-        logging.error("Network port is not a valid VNC display (%d < %d)."
-                      " Not starting VNC" %
-                      (instance.network_port, constants.HT_HVM_VNC_BASE_PORT))
-        kvm_cmd.extend(['-vnc', 'none'])
+        if os.path.isdir(vnc_bind_address):
+          vnc_arg = 'unix:%s/%s.vnc' % (vnc_bind_address, instance.name)
+        else:
+          vnc_arg = 'unix:%s' % vnc_bind_address
+      kvm_cmd.extend(['-vnc', vnc_arg])
     else:
       kvm_cmd.extend(['-nographic'])
 
@@ -683,9 +690,11 @@ class KVMHypervisor(hv_base.BaseHypervisor):
     vnc_bind_address = hvparams[constants.HV_VNC_BIND_ADDRESS]
     if vnc_bind_address:
       if not utils.IsValidIP(vnc_bind_address):
-        raise errors.OpPrereqError("given VNC bind address '%s' doesn't look"
-                                   " like a valid IP address" %
-                                   vnc_bind_address)
+        if not os.path.isabs(vnc_bind_address):
+          raise errors.HypervisorError("The VNC bind address must be either"
+                                       " a valid IP address or an absolute"
+                                       " pathname. '%s' given" %
+                                       vnc_bind_address)
 
   def ValidateParameters(self, hvparams):
     """Check the given parameters for validity.