Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 20020)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 20021)
@@ -6418,4 +6418,9 @@
                     break;
 
+                vrc = static_cast <Console *>(console)->getDisplay()->registerSSM(pVM);
+                AssertRC (vrc);
+                if (VBOX_FAILURE (vrc))
+                    break;
+
                 /*
                  * Synchronize debugger settings
Index: /trunk/src/VBox/Main/DisplayImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/DisplayImpl.cpp	(revision 20020)
+++ /trunk/src/VBox/Main/DisplayImpl.cpp	(revision 20021)
@@ -110,4 +110,58 @@
 /////////////////////////////////////////////////////////////////////////////
 
+#define sSSMDisplayVer 0x00010001
+
+/**
+ * Save/Load some important guest state
+ */
+DECLCALLBACK(void)
+Display::displaySSMSave (PSSMHANDLE pSSM, void *pvUser)
+{
+    Display *that = static_cast<Display*>(pvUser);
+
+    int rc = SSMR3PutU32 (pSSM, that->mcMonitors);
+    AssertRC(rc);
+
+    for (unsigned i = 0; i < that->mcMonitors; i++)
+    {
+        rc = SSMR3PutU32 (pSSM, that->maFramebuffers[i].u32Offset);
+        AssertRC(rc);
+        rc = SSMR3PutU32 (pSSM, that->maFramebuffers[i].u32MaxFramebufferSize);
+        AssertRC(rc);
+        rc = SSMR3PutU32 (pSSM, that->maFramebuffers[i].u32InformationSize);
+        AssertRC(rc);
+    }
+}
+
+DECLCALLBACK(int)
+Display::displaySSMLoad (PSSMHANDLE pSSM, void *pvUser, uint32_t u32Version)
+{
+    Display *that = static_cast<Display*>(pvUser);
+    uint32_t cMonitors;
+
+    if (u32Version != sSSMDisplayVer)
+        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
+
+    int rc = SSMR3GetU32 (pSSM, &cMonitors);
+    if (cMonitors != that->mcMonitors)
+    {
+        LogRel(("Display: Number of monitors changed (%d->%d)!\n",
+                 cMonitors, that->mcMonitors));
+        return VERR_SSM_LOAD_CONFIG_MISMATCH;
+    }
+
+    for (unsigned i = 0; i < cMonitors; i++)
+    {
+        rc = SSMR3GetU32 (pSSM, &that->maFramebuffers[i].u32Offset);
+        AssertRC(rc);
+        rc = SSMR3GetU32 (pSSM, &that->maFramebuffers[i].u32MaxFramebufferSize);
+        AssertRC(rc);
+        rc = SSMR3GetU32 (pSSM, &that->maFramebuffers[i].u32InformationSize);
+        AssertRC(rc);
+    }
+
+    return VINF_SUCCESS;
+}
+
 /**
  * Initializes the display object.
@@ -197,4 +251,16 @@
     mpVMMDev = NULL;
     mfVMMDevInited = true;
+}
+
+/**
+ * Register the SSM methods. Called by the power up thread to be able to
+ * pass pVM
+ */
+int Display::registerSSM(PVM pVM)
+{
+    return SSMR3RegisterExternal(pVM, "DisplayData", 3*sizeof(uint32_t*),
+                                 sSSMDisplayVer, 0,
+                                 NULL, displaySSMSave, NULL,
+                                 NULL, displaySSMLoad, NULL, this);
 }
 
@@ -2366,11 +2432,11 @@
      * Init Interfaces.
      */
-    pDrvIns->IBase.pfnQueryInterface    = Display::drvQueryInterface;
-
-    pData->Connector.pfnResize          = Display::displayResizeCallback;
-    pData->Connector.pfnUpdateRect      = Display::displayUpdateCallback;
-    pData->Connector.pfnRefresh         = Display::displayRefreshCallback;
-    pData->Connector.pfnReset           = Display::displayResetCallback;
-    pData->Connector.pfnLFBModeChange   = Display::displayLFBModeChangeCallback;
+    pDrvIns->IBase.pfnQueryInterface       = Display::drvQueryInterface;
+
+    pData->Connector.pfnResize             = Display::displayResizeCallback;
+    pData->Connector.pfnUpdateRect         = Display::displayUpdateCallback;
+    pData->Connector.pfnRefresh            = Display::displayRefreshCallback;
+    pData->Connector.pfnReset              = Display::displayResetCallback;
+    pData->Connector.pfnLFBModeChange      = Display::displayLFBModeChangeCallback;
     pData->Connector.pfnProcessAdapterData = Display::displayProcessAdapterDataCallback;
     pData->Connector.pfnProcessDisplayData = Display::displayProcessDisplayDataCallback;
Index: /trunk/src/VBox/Main/include/DisplayImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 20020)
+++ /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 20021)
@@ -114,4 +114,5 @@
     HRESULT init (Console *aParent);
     void uninit();
+    int  registerSSM(PVM pVM);
 
     // public methods only for internal purposes
@@ -275,4 +276,7 @@
 #endif
 
+    static DECLCALLBACK(void)   displaySSMSave (PSSMHANDLE pSSM, void *pvUser);
+    static DECLCALLBACK(int)    displaySSMLoad (PSSMHANDLE pSSM, void *pvUser, uint32_t u32Version);
+
     const ComObjPtr <Console, ComWeakRef> mParent;
     /** Pointer to the associated display driver. */
