Index: trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp
===================================================================
--- trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp	(revision 50920)
+++ trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp	(revision 50921)
@@ -131,4 +131,6 @@
             pBuf->BasePrivate.Base.cbBuffer = cbBuf;
 
+            pBuf->BasePrivate.pHgsmi = &pPrivate->BasePrivate;
+
             pBuf->hAllocation = DdiAllocInfo.hAllocation;
 
@@ -199,13 +201,4 @@
 }
 
-void vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice)
-{
-    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
-    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
-    /* no escapes (for now) */
-    pHgsmi->BasePrivate.pfnEscape = NULL;
-    pHgsmi->pDevice = pDevice;
-}
-
 static DECLCALLBACK(int) vboxCrHhgsmiDispEscape(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess)
 {
@@ -228,4 +221,12 @@
 }
 
+void vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice)
+{
+    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
+    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
+    /* escape is still needed, since Ugfsmi uses it e.g. to query connection id */
+    pHgsmi->BasePrivate.pfnEscape = vboxCrHhgsmiDispEscape;
+    pHgsmi->pDevice = pDevice;
+}
 
 void vboxUhgsmiD3DEscInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice)
Index: trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp
===================================================================
--- trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp	(revision 50920)
+++ trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp	(revision 50921)
@@ -149,5 +149,8 @@
         pBuf->BasePrivate.Base.cbBuffer = cbBuf;
 
+        pBuf->BasePrivate.pHgsmi = &pPrivate->BasePrivate;
+
         pBuf->hAllocation = DdiAllocInfo.hAllocation;
+
 
         *ppBuf = &pBuf->BasePrivate.Base;
@@ -279,6 +282,6 @@
     pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate;
     pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit;
-     /* no escapes (for now) */
-    pHgsmi->BasePrivate.pfnEscape = NULL;
+    /* escape is still needed, since Ugfsmi uses it e.g. to query connection id */
+    pHgsmi->BasePrivate.pfnEscape = vboxCrHhgsmiKmtEscape;
 }
 
Index: trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp
===================================================================
--- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp	(revision 50920)
+++ trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp	(revision 50921)
@@ -587,7 +587,4 @@
     pCtx->indexRecordFirstUncompleted = (pCtx->indexRecordFirstUncompleted + 1) % VBVA_MAX_RECORDS;
     pCtx->off32DataUncompleted = (pCtx->off32DataUncompleted + cbBuffer) % pVBVA->cbData;
-#ifdef DEBUG
-    vboxHwBufferVerifyCompleted(pCtx);
-#endif
 }
 
@@ -1076,4 +1073,8 @@
     }
 
+#ifdef DEBUG
+    vboxHwBufferVerifyCompleted(&pVbva->Vbva);
+#endif
+
     return fHasCommandsCompletedPreempted;
 }
Index: trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 50920)
+++ trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 50921)
@@ -33,5 +33,5 @@
 #include <stdio.h>
 
-#define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof (RECT)
+#define VBOXWDDM_DUMMY_DMABUFFER_SIZE (sizeof (VBOXCMDVBVA_HDR) / 2)
 
 DWORD g_VBoxLogUm = 0;
@@ -2863,5 +2863,5 @@
         Assert(!pAllocationList->PhysicalAddress.HighPart);
         Assert(!(pAllocationList->PhysicalAddress.QuadPart & 0xfffUL)); /* <- just a check to ensure allocation offset does not go here */
-        *poffVram = pAllocationList->PhysicalAddress.LowPart + pPatchList->AllocationOffset;;
+        *poffVram = pAllocationList->PhysicalAddress.LowPart + pPatchList->AllocationOffset;
     }
 
@@ -5761,4 +5761,5 @@
 {
 //    LOGF(("ENTER, hContext(0x%x)", hContext));
+    vboxVDbgBreakF();
 
     if (pRender->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
@@ -5781,5 +5782,5 @@
 
     uint32_t cbBuffer = 0;
-    uint32_t cbCmdDma = 0;
+    uint32_t cbPrivateData = 0;
     VBOXCMDVBVA_HDR* pCmd = (VBOXCMDVBVA_HDR*)pRender->pDmaBufferPrivateData;
 
@@ -5807,21 +5808,14 @@
             }
 
-            cbBuffer = RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[pRender->AllocationListSize]);
-            if (cbBuffer > 4096)
-            {
-                /* this should not be bigger actually */
-                WARN(("too big command buffer %d", cbBuffer));
+            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
+            cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[pRender->AllocationListSize]);
+
+            if (pRender->DmaBufferPrivateDataSize < cbPrivateData)
+            {
+                WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbPrivateData));
                 return STATUS_INVALID_PARAMETER;
             }
 
-            cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
-
-            if (pRender->DmaBufferPrivateDataSize < cbBuffer)
-            {
-                WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbBuffer));
-                return STATUS_INVALID_PARAMETER;
-            }
-
-            if (pRender->DmaSize < cbCmdDma)
+            if (pRender->DmaSize < cbBuffer)
             {
                 WARN(("dma buffer %d too small", pRender->DmaSize));
@@ -5829,5 +5823,5 @@
             }
 
-            Assert(pRender->PatchLocationListOutSize == pRender->AllocationListSize);
+//            Assert(pRender->PatchLocationListOutSize == pRender->AllocationListSize);
 
             if (pRender->PatchLocationListOutSize < pRender->AllocationListSize)
@@ -5880,14 +5874,14 @@
         case VBOXVDMACMD_TYPE_DMA_NOP:
         {
-            cbBuffer = sizeof (VBOXCMDVBVA_HDR);
-            cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
-
-            if (pRender->DmaBufferPrivateDataSize < cbBuffer)
-            {
-                WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbBuffer));
+            cbPrivateData = sizeof (VBOXCMDVBVA_HDR);
+            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
+
+            if (pRender->DmaBufferPrivateDataSize < cbPrivateData)
+            {
+                WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbPrivateData));
                 return STATUS_INVALID_PARAMETER;
             }
 
-            if (pRender->DmaSize < cbCmdDma)
+            if (pRender->DmaSize < cbBuffer)
             {
                 WARN(("dma buffer %d too small", pRender->DmaSize));
@@ -5916,6 +5910,6 @@
     }
 
-    pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbBuffer;
-    pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbCmdDma;
+    pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbPrivateData;
+    pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbBuffer;
 
     pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
@@ -6091,5 +6085,5 @@
 //    LOGF(("ENTER, hContext(0x%x)", hContext));
 
-    vboxVDbgBreakF();
+    vboxVDbgBreakFv();
 
     PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext;
@@ -6172,4 +6166,5 @@
             {
                 pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY;
+                Assert((UINT)pSrcAlloc->AllocData.SurfDesc.VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
                 pBlt->Hdr.u.u8PrimaryID = pSrcAlloc->AllocData.SurfDesc.VidPnSourceId;
 
@@ -6186,4 +6181,5 @@
                 Assert(fDstPrimary);
                 pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY;
+                Assert((UINT)pDstAlloc->AllocData.SurfDesc.VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
                 pBlt->Hdr.u.u8PrimaryID = pDstAlloc->AllocData.SurfDesc.VidPnSourceId;
 
@@ -6252,8 +6248,13 @@
         pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_FLIP;
         pHdr->u8Flags = 0;
+        Assert((UINT)pSrcAlloc->AllocData.SurfDesc.VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
+        pHdr->u.u8PrimaryID = pSrcAlloc->AllocData.SurfDesc.VidPnSourceId;
         VBOXCMDVBVA_FLIP *pFlip = (VBOXCMDVBVA_FLIP*)pHdr;
 
         if (VBoxCVDdiFillAllocInfo(pHdr, &pFlip->src, pSrcAlloc, pSrc, false))
+        {
+            WARN(("VBoxCVDdiFillAllocInfo reported no host id for flip!"));
             u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_FLIP, src.u.offVRAM);
+        }
 
         cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
@@ -6693,6 +6694,13 @@
                     case VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D:
                     {
-                        Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
-                        Assert(Status == STATUS_SUCCESS);
+                        if (!pDevExt->fCmdVbvaEnabled)
+                        {
+                            Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
+                            if (!NT_SUCCESS(Status))
+                                WARN(("vboxVideoAMgrCtxCreate failed %#x", Status));
+                        }
+                        else
+                            Status = STATUS_SUCCESS;
+
                         if (Status == STATUS_SUCCESS)
                         {
@@ -6747,6 +6755,13 @@
                     {
                         pContext->enmType = pInfo->enmType;
-                        Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
-                        Assert(Status == STATUS_SUCCESS);
+                        if (!pDevExt->fCmdVbvaEnabled)
+                        {
+                            Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
+                            if (!NT_SUCCESS(Status))
+                                WARN(("vboxVideoAMgrCtxCreate failed %#x", Status));
+                        }
+                        else
+                            Status = STATUS_SUCCESS;
+
                         if (Status == STATUS_SUCCESS)
                         {
@@ -6981,5 +6996,5 @@
 {
     LOGF(("ENTER, hAdapter(0x%x)", hAdapter));
-    vboxVDbgBreakF();
+    vboxVDbgBreakFv();
 
     PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
Index: trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
===================================================================
--- trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp	(revision 50920)
+++ trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp	(revision 50921)
@@ -1212,5 +1212,5 @@
 static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, VBOXCMDVBVAPAGEIDX iPage, uint8_t *pu8Vram, bool fIn)
 {
-    RTGCPHYS phPage = (RTGCPHYS)(iPage >> PAGE_SHIFT);
+    RTGCPHYS phPage = (RTGCPHYS)(iPage << PAGE_SHIFT);
     PGMPAGEMAPLOCK Lock;
     int rc;
@@ -1250,5 +1250,5 @@
 static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVAPAGEIDX *piPages, uint32_t cPages, uint8_t *pu8Vram, bool fIn)
 {
-    for (uint32_t i = 0; i < cPages; ++i)
+    for (uint32_t i = 0; i < cPages; ++i, pu8Vram += PAGE_SIZE)
     {
         int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, piPages[i], pu8Vram, fIn);
Index: trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
===================================================================
--- trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp	(revision 50920)
+++ trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp	(revision 50921)
@@ -1465,5 +1465,5 @@
             }
 
-            rc = crServerVBoxWindowsShow(paParms[0].u.uint32);
+            rc = crServerVBoxWindowsShow(!!paParms[0].u.uint32);
             if (!RT_SUCCESS(rc))
                 WARN(("crServerVBoxWindowsShow failed rc %d", rc));
Index: trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
===================================================================
--- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 50920)
+++ trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 50921)
@@ -465,4 +465,5 @@
 
 int8_t crVBoxServerCrCmdBltProcess(const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd);
+int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip);
 
 //#define VBOX_WITH_CRSERVER_DUMPER
Index: trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
===================================================================
--- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c	(revision 50920)
+++ trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c	(revision 50921)
@@ -3073,5 +3073,5 @@
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid write cmd buffer size!");
+                    WARN(("invalid write cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
@@ -3081,5 +3081,5 @@
                 if (!pBuffer)
                 {
-                    crWarning("invalid buffer data received from guest!");
+                    WARN(("invalid buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
@@ -3089,4 +3089,5 @@
                 if (RT_FAILURE(rc))
                 {
+                    WARN(("crVBoxServerClientGet failed %d", rc));
                     break;
                 }
@@ -3101,12 +3102,14 @@
                 rc = crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
-            }
-            else
-            {
-                crWarning("invalid number of args");
-                rc = VERR_INVALID_PARAMETER;
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("crVBoxServerInternalClientWriteRead failed %d", rc));
+                    break;
+                }
                 break;
             }
+
+            WARN(("invalid number of args"));
+            rc = VERR_INVALID_PARAMETER;
             break;
         }
@@ -3128,5 +3131,5 @@
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid inject cmd buffer size!");
+                    WARN(("invalid inject cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
@@ -3136,5 +3139,5 @@
                 if (!pBuffer)
                 {
-                    crWarning("invalid buffer data received from guest!");
+                    WARN(("invalid buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
@@ -3144,4 +3147,5 @@
                 if (RT_FAILURE(rc))
                 {
+                    WARN(("crVBoxServerClientGet failed %d", rc));
                     break;
                 }
@@ -3156,8 +3160,14 @@
                 rc = crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("crVBoxServerInternalClientWriteRead failed %d", rc));
+                    break;
+                }
+
+                break;
             }
 
-            crWarning("invalid number of args");
+            WARN(("invalid number of args"));
             rc = VERR_INVALID_PARAMETER;
             break;
@@ -3179,13 +3189,12 @@
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid read cmd buffer size!");
+                    WARN(("invalid read cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
 
-
                 if (!pBuffer)
                 {
-                    crWarning("invalid buffer data received from guest!");
+                    WARN(("invalid buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
@@ -3195,4 +3204,5 @@
                 if (RT_FAILURE(rc))
                 {
+                    WARN(("crVBoxServerClientGet failed %d", rc));
                     break;
                 }
@@ -3208,7 +3218,11 @@
 
                 /* the read command is never pended, complete it right away */
-                pHdr->result = rc;
-
-                return VINF_SUCCESS;
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("crVBoxServerInternalClientRead failed %d", rc));
+                    break;
+                }
+
+                break;
             }
 
@@ -3238,14 +3252,13 @@
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid write_read cmd buffer size!");
+                    WARN(("invalid write_read cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
 
-
                 CRASSERT(cbBuffer);
                 if (!pBuffer)
                 {
-                    crWarning("invalid write buffer data received from guest!");
+                    WARN(("invalid write buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
@@ -3255,13 +3268,14 @@
                 if (!pWriteback)
                 {
-                    crWarning("invalid writeback buffer data received from guest!");
+                    WARN(("invalid writeback buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
+
                 rc = crVBoxServerClientGet(u32ClientID, &pClient);
                 if (RT_FAILURE(rc))
                 {
-                    pHdr->result = rc;
-                    return VINF_SUCCESS;
+                    WARN(("crVBoxServerClientGet failed %d", rc));
+                    break;
                 }
 
@@ -3275,5 +3289,12 @@
                 rc = crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("crVBoxServerInternalClientWriteRead failed %d", rc));
+                    break;
+                }
+
+                break;
             }
 
@@ -3306,9 +3327,7 @@
     }
 
-    /* we can be on fail only here */
-    CRASSERT(RT_FAILURE(rc));
     pHdr->result = rc;
 
-    return rc;
+    return VINF_SUCCESS;
 }
 
@@ -3500,4 +3519,17 @@
             return -1;
         }
+        case VBOXCMDVBVA_OPTYPE_FLIP:
+        {
+            const VBOXCMDVBVA_FLIP *pFlip;
+
+            if (cbCmd < sizeof (VBOXCMDVBVA_FLIP))
+            {
+                WARN(("invalid buffer size"));
+                return -1;
+            }
+
+            pFlip = (const VBOXCMDVBVA_FLIP*)pCmd;
+            return crVBoxServerCrCmdFlipProcess(pFlip);
+        }
         case VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID:
         {
Index: trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
===================================================================
--- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp	(revision 50920)
+++ trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp	(revision 50921)
@@ -4825,2 +4825,26 @@
     return 0;
 }
+
+int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip)
+{
+    uint32_t hostId;
+    if (pFlip->Hdr.u8Flags & VBOXCMDVBVA_OPF_ALLOC_SRCID)
+        hostId = pFlip->src.u.id;
+    else
+    {
+        WARN(("VBOXCMDVBVA_OPF_ALLOC_SRCID not specified"));
+        hostId = 0;
+    }
+
+    uint32_t idScreen = pFlip->Hdr.u.u8PrimaryID;
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(idScreen);
+    if (!hFb)
+    {
+        WARN(("request to present on disabled framebuffer, ignore"));
+        return 0;
+    }
+
+    const RTRECT *pRect = CrVrScrCompositorRectGet(&hFb->Compositor);
+    crServerDispatchVBoxTexPresent(hostId, idScreen, 0, 0, 1, (const GLint*)pRect);
+    return 0;
+}
