Index: /trunk/src/VBox/Main/include/DisplayImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 54052)
+++ /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 54053)
@@ -380,10 +380,8 @@
      *  Does not go into the saved state as it is refreshed on restore. */
     bool        mfVMMDevSupportsGraphics;
-    /** Mirror of the current guest VBVA capabilities.
-     *  Does not go into the saved state as it is refreshed on restore. */
+    /** Mirror of the current guest VBVA capabilities. */
     uint32_t    mfGuestVBVACapabilities;
-    /** Mirror of the current host cursor integration support capability.
-     *  Does not go into the saved state as it is refreshed on restore. */
-    uint32_t    mfHostSupportsCursorIntegration;
+    /** Mirror of the current host cursor capabilities. */
+    uint32_t    mfHostCursorCapabilities;
 
     bool mfSourceBitmapEnabled;
Index: /trunk/src/VBox/Main/include/DisplayUtils.h
===================================================================
--- /trunk/src/VBox/Main/include/DisplayUtils.h	(revision 54052)
+++ /trunk/src/VBox/Main/include/DisplayUtils.h	(revision 54053)
@@ -24,4 +24,5 @@
 #define sSSMDisplayVer3 0x00010003
 #define sSSMDisplayVer4 0x00010004
+#define sSSMDisplayVer5 0x00010005
 
 int readSavedGuestScreenInfo(const Utf8Str &strStateFilePath, uint32_t u32ScreenId,
Index: /trunk/src/VBox/Main/src-client/DisplayImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/DisplayImpl.cpp	(revision 54052)
+++ /trunk/src/VBox/Main/src-client/DisplayImpl.cpp	(revision 54053)
@@ -125,4 +125,5 @@
     mfVMMDevSupportsGraphics = false;
     mfGuestVBVACapabilities = 0;
+    mfHostCursorCapabilities = 0;
 #endif
 #ifdef VBOX_WITH_VPX
@@ -511,4 +512,6 @@
     SSMR3PutU32(pSSM, that->cxInputMapping);
     SSMR3PutU32(pSSM, that->cyInputMapping);
+    SSMR3PutU32(pSSM, that->mfGuestVBVACapabilities);
+    SSMR3PutU32(pSSM, that->mfHostCursorCapabilities);
 }
 
@@ -521,5 +524,6 @@
         && uVersion != sSSMDisplayVer2
         && uVersion != sSSMDisplayVer3
-        && uVersion != sSSMDisplayVer4)
+        && uVersion != sSSMDisplayVer4
+        && uVersion != sSSMDisplayVer5)
         return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
@@ -537,5 +541,6 @@
         if (   uVersion == sSSMDisplayVer2
             || uVersion == sSSMDisplayVer3
-            || uVersion == sSSMDisplayVer4)
+            || uVersion == sSSMDisplayVer4
+            || uVersion == sSSMDisplayVer5)
         {
             uint32_t w;
@@ -547,5 +552,6 @@
         }
         if (   uVersion == sSSMDisplayVer3
-            || uVersion == sSSMDisplayVer4)
+            || uVersion == sSSMDisplayVer4
+            || uVersion == sSSMDisplayVer5)
         {
             int32_t xOrigin;
@@ -561,5 +567,6 @@
         }
     }
-    if (uVersion == sSSMDisplayVer4)
+    if (   uVersion == sSSMDisplayVer4
+        || uVersion == sSSMDisplayVer5)
     {
         SSMR3GetS32(pSSM, &that->xInputMappingOrigin);
@@ -567,4 +574,9 @@
         SSMR3GetU32(pSSM, &that->cxInputMapping);
         SSMR3GetU32(pSSM, &that->cyInputMapping);
+    }
+    if (uVersion == sSSMDisplayVer5)
+    {
+        SSMR3GetU32(pSSM, &that->mfGuestVBVACapabilities);
+        SSMR3GetU32(pSSM, &that->mfHostCursorCapabilities);
     }
 
@@ -706,7 +718,9 @@
 {
     /* Version 2 adds width and height of the framebuffer; version 3 adds
-     * the framebuffer offset in the virtual desktop and the framebuffer flags.
+     * the framebuffer offset in the virtual desktop and the framebuffer flags;
+     * version 4 adds guest to host input event mapping and version 5 adds
+     * guest VBVA and host cursor capabilities.
      */
-    int rc = SSMR3RegisterExternal(pUVM, "DisplayData", 0, sSSMDisplayVer4,
+    int rc = SSMR3RegisterExternal(pUVM, "DisplayData", 0, sSSMDisplayVer5,
                                    mcMonitors * sizeof(uint32_t) * 8 + sizeof(uint32_t),
                                    NULL, NULL, NULL,
@@ -1163,4 +1177,6 @@
      * ensures that mpDrv will remain valid. */
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+    uint32_t fHostCursorCapabilities =   (mfHostCursorCapabilities | fCapabilitiesAdded)
+                                       & ~fCapabilitiesRemoved;
 
     Console::SafeVMPtr ptrVM(mParent);
@@ -1171,5 +1187,6 @@
     mpDrv->pUpPort->pfnReportHostCursorCapabilities (mpDrv->pUpPort, fCapabilitiesAdded, fCapabilitiesRemoved);
     if (   mfGuestVBVACapabilities & VBVACAPS_DISABLE_CURSOR_INTEGRATION
-        && !(mfGuestVBVACapabilities & VBVACAPS_IRQ))
+        && !(mfGuestVBVACapabilities & VBVACAPS_IRQ)
+        && fHostCursorCapabilities != mfHostCursorCapabilities)
     {
         HRESULT hrc = mParent->i_sendACPIMonitorHotPlugEvent();
@@ -1177,4 +1194,5 @@
             return hrc;
     }
+    mfHostCursorCapabilities = fHostCursorCapabilities;
     return S_OK;
 }
