diff --git a/INSTALL.DPDK-ADVANCED.md b/INSTALL.DPDK-ADVANCED.md
index ca9e9bb..29eb78f 100644
--- a/INSTALL.DPDK-ADVANCED.md
+++ b/INSTALL.DPDK-ADVANCED.md
@@ -483,6 +483,33 @@ For users wanting to do packet forwarding using kernel stack below are the steps
        where `-L`: Changes the numbers of channels of the specified network device
        and `combined`: Changes the number of multi-purpose channels.
 
+    4. Enable OVS vHost client-mode & vHost reconnect (OPTIONAL)
+
+       By default, OVS DPDK acts as the vHost socket server and QEMU the
+       client. In QEMU v2.7 the option is available for QEMU to act as the
+       server. In order for this to work, OVS DPDK must be switched to 'client'
+       mode. This is possible by setting the 'vhost-driver-mode' DB entry to
+       'client' like so:
+
+       ```
+       ovs-vsctl set Open_vSwitch . other_config:vhost-driver-mode="client"
+       ```
+
+       This must be done before the switch is launched. It cannot sucessfully
+       be changed after switch has launched.
+
+       One must also append ',server' to the 'chardev' arguments on the QEMU
+       command line, to instruct QEMU to use vHost server mode, like so:
+
+       ````
+       -chardev socket,id=char0,path=/usr/local/var/run/openvswitch/vhost0,server
+       ````
+
+       One benefit of using this mode is the ability for vHost ports to
+       'reconnect' in event of the switch crashing or being brought down. Once
+       it is brought back up, the vHost ports will reconnect automatically and
+       normal service will resume.
+
   - VM Configuration with libvirt
 
     * change the user/group, access control policty and restart libvirtd.
diff --git a/NEWS b/NEWS
index 248d856..59f2dfb 100644
--- a/NEWS
+++ b/NEWS
@@ -67,6 +67,7 @@ Post-v2.5.0
      * vHost PMD integration brings vhost-user ports under control of the
        rte_ether DPDK API.
      * Support for DPDK 16.07
+     * OVS client mode for vHost and vHost reconnect (Requires QEMU 2.7)
    - Increase number of registers to 16.
    - ovs-benchmark: This utility has been removed due to lack of use and
      bitrot.
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 07e6045..dabd631 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -137,6 +137,7 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF / ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
                                           * yet mapped to another queue. */
 
 static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
+static int client_mode = 0; /* Denote whether client/server mode */
 
 #define VHOST_ENQ_RETRY_NUM 8
 #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
@@ -972,9 +973,10 @@ netdev_dpdk_vhost_construct(struct netdev *netdev)
         err = ENODEV;
         goto out;
     } else {
-        devargs = xasprintf("eth_vhost%u,iface=%s,queues=%i",
+        devargs = xasprintf("eth_vhost%u,iface=%s,queues=%i,client=%i",
                  driver_id, dev->vhost_id,
-                 MIN(OVS_VHOST_MAX_QUEUE_NUM, RTE_MAX_QUEUES_PER_PORT));
+                 MIN(OVS_VHOST_MAX_QUEUE_NUM, RTE_MAX_QUEUES_PER_PORT),
+                 client_mode);
         err = rte_eth_dev_attach(devargs, &port_no);
     }
 
@@ -982,9 +984,11 @@ netdev_dpdk_vhost_construct(struct netdev *netdev)
         VLOG_ERR("Failed to attach vhost-user device %s to DPDK",
                  dev->vhost_id);
     } else {
-        fatal_signal_add_file_to_unlink(dev->vhost_id);
-        VLOG_INFO("Socket %s created for vhost-user port %s\n",
-                  dev->vhost_id, name);
+        if (!client_mode) {
+            fatal_signal_add_file_to_unlink(dev->vhost_id);
+            VLOG_INFO("Socket %s created for vhost-user port %s\n",
+                      dev->vhost_id, name);
+        }
         dev->vhost_pmd_id = driver_id;
         set_vhost_drv_id(driver_id, 1);
         err = netdev_dpdk_init(netdev, port_no, DPDK_DEV_VHOST);
@@ -1053,7 +1057,8 @@ netdev_dpdk_vhost_destruct(struct netdev *netdev)
 
     if (rte_eth_dev_detach(dev->port_id, dev->vhost_id)) {
         VLOG_ERR("Error removing vhost device %s", dev->vhost_id);
-    } else {
+    } else if (!client_mode) {
+        /* OVS server mode - OVS may delete the socket */
         fatal_signal_remove_file_to_unlink(dev->vhost_id);
     }
     set_vhost_drv_id(dev->vhost_pmd_id, 0);
@@ -2861,6 +2866,7 @@ dpdk_init__(const struct smap *ovs_other_config)
     int err = 0;
     cpu_set_t cpuset;
     char *sock_dir_subcomponent;
+    const char *val;
 
     if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
         VLOG_INFO("DPDK Disabled - to change this requires a restart.\n");
@@ -2891,6 +2897,15 @@ dpdk_init__(const struct smap *ovs_other_config)
     } else {
         vhost_sock_dir = sock_dir_subcomponent;
     }
+    val = smap_get(ovs_other_config, "vhost-driver-mode");
+    if (val != NULL && strncmp(val, "client", strlen(val)) == 0) {
+        client_mode = 1;
+        VLOG_INFO("OVS client mode (QEMU server mode) selected for vHost");
+    } else  {
+        /* default case */
+        client_mode = 0;
+        VLOG_INFO("OVS server mode (QEMU client mode) selected for vHost");
+    }
 
     argv = grow_argv(&argv, 0, 1);
     argc = 1;
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 03f3638..e7954c3 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -299,6 +299,19 @@
         </p>
       </column>
 
+      <column name="other_config" key="vhost-driver-mode"
+              type='{"type": "string", "enum": ["set", ["server", "client"]]}'>
+        <p>
+          Specifies which mode OVS will use for vHost. In 'server' mode, OVS
+          creates and destroys the vHost User sockets. In 'client' mode, OVS
+          attaches to sockets created by QEMU.
+        </p>
+        <p>
+          Defaults to 'server' mode. Changing this value requires restarting
+          the daemon.
+        </p>
+      </column>
+
       <column name="other_config" key="n-handler-threads"
               type='{"type": "integer", "minInteger": 1}'>
         <p>
