Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 64877)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 64878)
@@ -162,4 +162,8 @@
     bool fConfigured;
     bool fBlankedByPowerOff;
+
+    /* Whether the host has disabled the virtual screen. */
+    /** @todo This should be merged with fConnected. */
+    bool fDisabled;
 } VBOXWDDM_TARGET, *PVBOXWDDM_TARGET;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp	(revision 64877)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp	(revision 64878)
@@ -1339,9 +1339,13 @@
     }
 
+#ifdef VBOX_WDDM_REPLUG_ON_MODE_CHANGE
+    /* The VBOXESC_UPDATEMODES is a hint for VBoxVideoW8.sys to use new display mode as soon as VidPn
+     * manager will ask for it.
+     * Probably, some new interface is required to plug/unplug displays by calling
+     * VBoxWddmChildStatusReportReconnected.
+     * But it is a bad idea to mix sending a display mode hint and (un)plug displays in VBOXESC_UPDATEMODES.
+     */
+
     /* modes have changed, need to replug */
-/*  The VBOXESC_UPDATEMODES is a hint for VBoxVideoW8.sys to use new display mode as soon as VidPn manager will ask for it.
-    Probably, some new interface is required to plug/unplug displays by calling VBoxWddmChildStatusReportReconnected.
-    But it is a bad idea to mix sending a display mode hint and (un)plug displays in VBOXESC_UPDATEMODES.
-
     NTSTATUS Status = VBoxWddmChildStatusReportReconnected(pDevExt, u32TargetId);
     LOG(("VBoxWddmChildStatusReportReconnected returned (%d)", Status));
@@ -1351,5 +1355,6 @@
         return Status;
     }
-*/
+#endif
+
     LOGF(("LEAVE u32TargetId(%d)", u32TargetId));
     return STATUS_SUCCESS;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 64877)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 64878)
@@ -345,5 +345,5 @@
 }
 
-static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff)
+static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff, bool fDisabled)
 {
     uint16_t u16Flags;
@@ -355,5 +355,6 @@
     else
     {
-        if (   fPowerOff
+        if (   !fDisabled
+            && fPowerOff
             && RT_BOOL(VBoxCommonFromDeviceExt(pDevExt)->u16SupportedScreenFlags & VBVA_SCREEN_F_BLANK2))
         {
@@ -369,9 +370,9 @@
 }
 
-NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff)
+NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff, bool fDisabled)
 {
     NTSTATUS Status = STATUS_SUCCESS;
     bool fValidAlloc = pAllocData->SurfDesc.width > 0 && pAllocData->SurfDesc.height > 0;
-    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff);
+    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff, fDisabled);
 
     if (fValidAlloc)
@@ -420,9 +421,9 @@
 }
 
-NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff)
+NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff, bool fDisabled)
 {
     NTSTATUS Status = STATUS_SUCCESS;
     bool fValidAlloc = pAllocData->SurfDesc.width > 0 && pAllocData->SurfDesc.height > 0;
-    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff);
+    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff, fDisabled);
 
     if (fValidAlloc)
@@ -493,5 +494,5 @@
     }
 
-    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState, RT_BOOL(pSource->bBlankedByPowerOff));
+    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState, RT_BOOL(pSource->bBlankedByPowerOff), false);
     if (NT_SUCCESS(Status))
     {
@@ -539,5 +540,5 @@
     {
         AllocData.SurfDesc.VidPnSourceId = pTarget->u32Id;
-        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState, pTarget->fBlankedByPowerOff);
+        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState, pTarget->fBlankedByPowerOff, pTarget->fDisabled);
         if (NT_SUCCESS(Status))
             pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL;
@@ -584,5 +585,6 @@
         }
 
-        if (pTarget->fBlankedByPowerOff)
+        /* Explicitely disabled targets must not be skipped. */
+        if (pTarget->fBlankedByPowerOff && !pTarget->fDisabled)
         {
             LOG(("Skip doing DISABLED request for PowerOff tgt %d", pTarget->u32Id));
@@ -603,5 +605,5 @@
     VBOXWDDM_ALLOC_DATA AllocData;
     VBoxVidPnAllocDataInit(&AllocData, D3DDDI_ID_UNINITIALIZED);
-    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0, false);
+    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0, false, true);
     if (!NT_SUCCESS(Status))
     {
@@ -647,5 +649,5 @@
         fFound = true;
         AllocData.SurfDesc.VidPnSourceId = i;
-        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0, pTarget->fBlankedByPowerOff);
+        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0, pTarget->fBlankedByPowerOff, pTarget->fDisabled);
         if (NT_SUCCESS(Status))
             pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL;
@@ -4960,4 +4962,36 @@
                 break;
             }
+            case VBOXESC_TARGET_CONNECTIVITY:
+            {
+                if (!pEscape->Flags.HardwareAccess)
+                {
+                    WARN(("VBOXESC_TARGET_CONNECTIVITY called without HardwareAccess flag set, failing"));
+                    Status = STATUS_INVALID_PARAMETER;
+                    break;
+                }
+
+                if (pEscape->PrivateDriverDataSize != sizeof(VBOXDISPIFESCAPE_TARGETCONNECTIVITY))
+                {
+                    WARN(("VBOXESC_TARGET_CONNECTIVITY invalid private driver size %d", pEscape->PrivateDriverDataSize));
+                    Status = STATUS_INVALID_PARAMETER;
+                    break;
+                }
+
+                VBOXDISPIFESCAPE_TARGETCONNECTIVITY *pData = (VBOXDISPIFESCAPE_TARGETCONNECTIVITY *)pEscapeHdr;
+                LOG(("=> VBOXESC_TARGET_CONNECTIVITY[%d] 0x%08X", pData->u32TargetId, pData->fu32Connect));
+
+                if (pData->u32TargetId >= (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
+                {
+                    WARN(("VBOXESC_TARGET_CONNECTIVITY invalid screen index 0x%x", pData->u32TargetId));
+                    Status = STATUS_INVALID_PARAMETER;
+                    break;
+                }
+
+                PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[pData->u32TargetId];
+                pTarget->fDisabled = !RT_BOOL(pData->fu32Connect & 1);
+                pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY;
+
+                break;
+            }
             case VBOXESC_DBGPRINT:
             {
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp	(revision 64877)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp	(revision 64878)
@@ -1369,10 +1369,36 @@
     }
 
-/*  The code below was commented out because VBOXESC_UPDATEMODES should not cause (un)plugging virtual displays.
+#ifdef VBOX_WDDM_REPLUG_ON_MODE_CHANGE
+    /* The code was disabled because VBOXESC_UPDATEMODES should not cause (un)plugging virtual displays. */
     winEr =  vboxDispIfWaitDisplayDataInited(pOp);
     if (winEr != NO_ERROR)
         WARN(("VBoxTray: (WDDM) Failed vboxDispIfWaitDisplayDataInited winEr %d\n", winEr));
-*/
+#endif
+
     return winEr;
+}
+
+static DWORD vboxDispIfTargetConnectivityWDDM(VBOXDISPIF_OP *pOp, uint32_t u32TargetId, uint32_t fu32Connect)
+{
+    VBOXDISPIFESCAPE_TARGETCONNECTIVITY PrivateData;
+    RT_ZERO(PrivateData);
+    PrivateData.EscapeHdr.escapeCode = VBOXESC_TARGET_CONNECTIVITY;
+    PrivateData.u32TargetId = u32TargetId;
+    PrivateData.fu32Connect = fu32Connect;
+
+    D3DKMT_ESCAPE EscapeData;
+    RT_ZERO(EscapeData);
+    EscapeData.hAdapter = pOp->Adapter.hAdapter;
+    EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
+    EscapeData.Flags.HardwareAccess = 1;
+    EscapeData.pPrivateDriverData = &PrivateData;
+    EscapeData.PrivateDriverDataSize = sizeof(PrivateData);
+
+    NTSTATUS Status = pOp->pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
+    if (NT_SUCCESS(Status))
+        return ERROR_SUCCESS;
+
+    WARN(("VBoxTray: pfnD3DKMTEscape VBOXESC_TARGETCONNECTIVITY failed Status 0x%x\n", Status));
+    return ERROR_GEN_FAILURE;
 }
 
@@ -1479,4 +1505,6 @@
         LogFunc(("D3DKMTInvalidateActiveVidPn returned %d)\n", Status));
     }
+
+    vboxDispIfTargetConnectivityWDDM(&Op, iChangedMode, fEnable? 1: 0);
 
     /* Resize displays always to keep the display layout because
Index: /trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h	(revision 64877)
+++ /trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h	(revision 64878)
@@ -45,4 +45,5 @@
 # define VBOXESC_UPDATEMODES                0xABCD9016
 # define VBOXESC_GUEST_DISPLAYCHANGED       0xABCD9017
+# define VBOXESC_TARGET_CONNECTIVITY        0xABCD9018
 #endif /* #ifdef VBOX_WITH_WDDM */
 
@@ -77,4 +78,9 @@
 #ifdef VBOX_WITH_WDDM
 
+/* Enables code which performs (un)plugging of virtual displays in VBOXESC_UPDATEMODES.
+ * The code has been disabled as part of #8244.
+ */
+//#define VBOX_WDDM_REPLUG_ON_MODE_CHANGE
+
 /* for VBOX_VIDEO_MAX_SCREENS definition */
 #include <VBox/Hardware/VBoxVideoVBE.h>
@@ -105,4 +111,11 @@
 } VBOXDISPIFESCAPE_UPDATEMODES;
 
+typedef struct VBOXDISPIFESCAPE_TARGETCONNECTIVITY
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32TargetId;
+    uint32_t fu32Connect;
+} VBOXDISPIFESCAPE_TARGETCONNECTIVITY;
+
 #endif /* VBOX_WITH_WDDM */
 
