Index: /trunk/src/VBox/VMM/PGMSavedState.cpp
===================================================================
--- /trunk/src/VBox/VMM/PGMSavedState.cpp	(revision 23542)
+++ /trunk/src/VBox/VMM/PGMSavedState.cpp	(revision 23543)
@@ -719,5 +719,6 @@
      * Special handling of zero pages.
      */
-    if (pLSPage->fZero)
+    bool const fZero = pLSPage->fZero;
+    if (fZero)
     {
         if (ASMMemIsZeroPage(pbPage))
@@ -771,4 +772,6 @@
         pVM->pgm.s.LiveSave.Mmio2.cReadyPages--;
         pVM->pgm.s.LiveSave.Mmio2.cDirtyPages++;
+        if (fZero)
+            pVM->pgm.s.LiveSave.Mmio2.cZeroPages--;
     }
     return true;
@@ -937,4 +940,6 @@
                 pVM->pgm.s.LiveSave.Mmio2.cDirtyPages--;
                 pVM->pgm.s.LiveSave.Mmio2.cReadyPages++;
+                if (u8Type == PGM_STATE_REC_MMIO2_ZERO)
+                    pVM->pgm.s.LiveSave.Mmio2.cZeroPages++;
                 iPageLast = iPage;
             }
@@ -1246,6 +1251,4 @@
                                     Assert(!paLSPages[iPage].fWriteMonitored);
                                     pVM->pgm.s.LiveSave.Ram.cMonitoredPages++;
-                                    if (paLSPages[iPage].fZero)
-                                        pVM->pgm.s.LiveSave.Ram.cZeroPages--;
                                 }
 
@@ -1253,4 +1256,6 @@
                                 {
                                     pVM->pgm.s.LiveSave.Ram.cReadyPages--;
+                                    if (paLSPages[iPage].fZero)
+                                        pVM->pgm.s.LiveSave.Ram.cZeroPages--;
                                     pVM->pgm.s.LiveSave.Ram.cDirtyPages++;
                                     if (++paLSPages[iPage].cDirtied > PGMLIVSAVEPAGE_MAX_DIRTIED)
@@ -1301,9 +1306,4 @@
                                 if (!paLSPages[iPage].fZero)
                                 {
-                                    paLSPages[iPage].fZero = 1;
-                                    paLSPages[iPage].fShared = 0;
-#ifdef PGMLIVESAVERAMPAGE_WITH_CRC32
-                                    paLSPages[iPage].u32Crc = PGM_STATE_CRC32_ZERO_PAGE;
-#endif
                                     if (!paLSPages[iPage].fDirty)
                                     {
@@ -1312,5 +1312,9 @@
                                         pVM->pgm.s.LiveSave.Ram.cDirtyPages++;
                                     }
-                                    pVM->pgm.s.LiveSave.Ram.cZeroPages++;
+                                    paLSPages[iPage].fZero = 1;
+                                    paLSPages[iPage].fShared = 0;
+#ifdef PGMLIVESAVERAMPAGE_WITH_CRC32
+                                    paLSPages[iPage].u32Crc = PGM_STATE_CRC32_ZERO_PAGE;
+#endif
                                 }
                                 break;
@@ -1319,4 +1323,12 @@
                                 if (!paLSPages[iPage].fShared)
                                 {
+                                    if (!paLSPages[iPage].fDirty)
+                                    {
+                                        paLSPages[iPage].fDirty = 1;
+                                        pVM->pgm.s.LiveSave.Ram.cReadyPages--;
+                                        if (paLSPages[iPage].fZero)
+                                            pVM->pgm.s.LiveSave.Ram.cZeroPages--;
+                                        pVM->pgm.s.LiveSave.Ram.cDirtyPages++;
+                                    }
                                     paLSPages[iPage].fZero = 0;
                                     paLSPages[iPage].fShared = 1;
@@ -1324,10 +1336,4 @@
                                     pgmR3StateCalcCrc32ForRamPage(pVM, pCur, paLSPages, iPage);
 #endif
-                                    if (!paLSPages[iPage].fDirty)
-                                    {
-                                        paLSPages[iPage].fDirty = 1;
-                                        pVM->pgm.s.LiveSave.Ram.cReadyPages--;
-                                        pVM->pgm.s.LiveSave.Ram.cDirtyPages++;
-                                    }
                                 }
                                 break;
@@ -1365,5 +1371,9 @@
                             pVM->pgm.s.LiveSave.Ram.cDirtyPages--;
                         else
+                        {
                             pVM->pgm.s.LiveSave.Ram.cReadyPages--;
+                            if (paLSPages[iPage].fZero)
+                                pVM->pgm.s.LiveSave.Ram.cZeroPages--;
+                        }
                         pVM->pgm.s.LiveSave.cIgnoredPages++;
                     }
@@ -1526,7 +1536,7 @@
                         paLSPages[iPage].fDirty = 0;
                         pVM->pgm.s.LiveSave.Ram.cReadyPages++;
-                        pVM->pgm.s.LiveSave.Ram.cDirtyPages--;
                         if (fZero)
                             pVM->pgm.s.LiveSave.Ram.cZeroPages++;
+                        pVM->pgm.s.LiveSave.Ram.cDirtyPages--;
                     }
                     if (idRamRangesGen != pVM->pgm.s.idRamRangesGen)
