Index: /trunk/Config.kmk
===================================================================
--- /trunk/Config.kmk	(revision 24745)
+++ /trunk/Config.kmk	(revision 24746)
@@ -516,7 +516,7 @@
 endif
 # Enable the new I/O path
-#if1of ($(KBUILD_TARGET), linux solaris win freebsd darwin)
-# VBOX_WITH_NEW_IO_CODE = 1
-#endif
+if1of ($(KBUILD_TARGET), linux solaris win freebsd darwin)
+ VBOX_WITH_NEW_IO_CODE = 1
+endif
 
 #
Index: /trunk/src/VBox/Devices/Storage/DrvVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 24745)
+++ /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 24746)
@@ -1011,23 +1011,4 @@
     AssertRC(rc);
 
-#ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
-    pThis->VDIAsyncIOCallbacks.cbSize                  = sizeof(VDINTERFACEASYNCIO);
-    pThis->VDIAsyncIOCallbacks.enmInterface            = VDINTERFACETYPE_ASYNCIO;
-    pThis->VDIAsyncIOCallbacks.pfnOpen                 = drvvdAsyncIOOpen;
-    pThis->VDIAsyncIOCallbacks.pfnClose                = drvvdAsyncIOClose;
-    pThis->VDIAsyncIOCallbacks.pfnGetSize              = drvvdAsyncIOGetSize;
-    pThis->VDIAsyncIOCallbacks.pfnSetSize              = drvvdAsyncIOSetSize;
-    pThis->VDIAsyncIOCallbacks.pfnReadSync             = drvvdAsyncIOReadSync;
-    pThis->VDIAsyncIOCallbacks.pfnWriteSync            = drvvdAsyncIOWriteSync;
-    pThis->VDIAsyncIOCallbacks.pfnFlushSync            = drvvdAsyncIOFlushSync;
-    pThis->VDIAsyncIOCallbacks.pfnReadAsync            = drvvdAsyncIOReadAsync;
-    pThis->VDIAsyncIOCallbacks.pfnWriteAsync           = drvvdAsyncIOWriteAsync;
-    pThis->VDIAsyncIOCallbacks.pfnFlushAsync           = drvvdAsyncIOFlushAsync;
-
-    rc = VDInterfaceAdd(&pThis->VDIAsyncIO, "DrvVD_AsyncIO", VDINTERFACETYPE_ASYNCIO,
-                        &pThis->VDIAsyncIOCallbacks, pThis, &pThis->pVDIfsDisk);
-    AssertRC(rc);
-#endif
-
     /* This is just prepared here, the actual interface is per-image, so it's
      * added later. No need to have separate callback tables. */
@@ -1049,4 +1030,5 @@
      */
     bool        fHostIP = false;
+    bool        fUseNewIo = false;
     unsigned    iLevel = 0;
     PCFGMNODE   pCurNode = pCfgHandle;
@@ -1063,5 +1045,5 @@
                                           "Format\0Path\0"
                                           "ReadOnly\0TempReadOnly\0HonorZeroWrites\0"
-                                          "HostIPStack\0");
+                                          "HostIPStack\0UseNewIo\0");
         }
         else
@@ -1117,4 +1099,11 @@
                 break;
             }
+            rc = CFGMR3QueryBoolDef(pCurNode, "UseNewIo", &fUseNewIo, false);
+            if (RT_FAILURE(rc))
+            {
+                rc = PDMDRV_SET_ERROR(pDrvIns, rc,
+                                      N_("DrvVD: Configuration error: Querying \"UseNewIo\" as boolean failed"));
+                break;
+            }
         }
 
@@ -1168,4 +1157,29 @@
                                 &pThis->pVDIfsDisk);
         }
+
+        if (RT_SUCCESS(rc) && fUseNewIo)
+        {
+#ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
+            pThis->VDIAsyncIOCallbacks.cbSize        = sizeof(VDINTERFACEASYNCIO);
+            pThis->VDIAsyncIOCallbacks.enmInterface  = VDINTERFACETYPE_ASYNCIO;
+            pThis->VDIAsyncIOCallbacks.pfnOpen       = drvvdAsyncIOOpen;
+            pThis->VDIAsyncIOCallbacks.pfnClose      = drvvdAsyncIOClose;
+            pThis->VDIAsyncIOCallbacks.pfnGetSize    = drvvdAsyncIOGetSize;
+            pThis->VDIAsyncIOCallbacks.pfnSetSize    = drvvdAsyncIOSetSize;
+            pThis->VDIAsyncIOCallbacks.pfnReadSync   = drvvdAsyncIOReadSync;
+            pThis->VDIAsyncIOCallbacks.pfnWriteSync  = drvvdAsyncIOWriteSync;
+            pThis->VDIAsyncIOCallbacks.pfnFlushSync  = drvvdAsyncIOFlushSync;
+            pThis->VDIAsyncIOCallbacks.pfnReadAsync  = drvvdAsyncIOReadAsync;
+            pThis->VDIAsyncIOCallbacks.pfnWriteAsync = drvvdAsyncIOWriteAsync;
+            pThis->VDIAsyncIOCallbacks.pfnFlushAsync = drvvdAsyncIOFlushAsync;
+
+            rc = VDInterfaceAdd(&pThis->VDIAsyncIO, "DrvVD_AsyncIO", VDINTERFACETYPE_ASYNCIO,
+                                &pThis->VDIAsyncIOCallbacks, pThis, &pThis->pVDIfsDisk);
+#else /* !VBOX_WITH_PDM_ASYNC_COMPLETION */
+            rc = PDMDrvHlpVMSetError(pDrvIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES,
+                                     RT_SRC_POS, N_("DrvVD: Configuration error: Async Completion Framework not compiled in"));
+#endif /* !VBOX_WITH_PDM_ASYNC_COMPLETION */
+        }
+
         if (RT_SUCCESS(rc))
         {
