Index: trunk/src/VBox/VMM/FTM.cpp
===================================================================
--- trunk/src/VBox/VMM/FTM.cpp	(revision 32050)
+++ trunk/src/VBox/VMM/FTM.cpp	(revision 32051)
@@ -570,4 +570,5 @@
 {
     int rc;
+    bool fFullSync = false;
 
     if (enmState != FTMSYNCSTATE_DELTA_MEMORY)
@@ -580,20 +581,22 @@
     {
     case FTMSYNCSTATE_FULL:
+        fFullSync = true;
+        /* no break */
+    case FTMSYNCSTATE_DELTA_VM:
     {
         bool fSuspended = false;
 
-        rc = ftmR3TcpSubmitCommand(pVM, "full-sync");
+        rc = ftmR3TcpSubmitCommand(pVM, (fFullSync) ? "full-sync" : "checkpoint");
         AssertRC(rc);
 
+        pVM->ftm.s.fDeltaLoadSaveActive = (fFullSync == false);
         rc = VMR3Save(pVM, NULL /* pszFilename */, &g_ftmR3TcpOps, pVM, true /* fContinueAfterwards */, NULL, NULL, &fSuspended);
+        pVM->ftm.s.fDeltaLoadSaveActive = false;
         AssertRC(rc);
 
-        rc = ftmR3TcpReadACK(pVM, "full-sync-complete");
+        rc = ftmR3TcpReadACK(pVM, (fFullSync) ? "full-sync-complete" : "checkpoint-complete");
         AssertRC(rc);
         break;
     }
-
-    case FTMSYNCSTATE_DELTA_VM:
-        break;
 
     case FTMSYNCSTATE_DELTA_MEMORY:
@@ -812,5 +815,7 @@
     for (;;)
     {
+        bool fFullSync = false;
         char szCmd[128];
+
         rc = ftmR3TcpReadLine(pVM, szCmd, sizeof(szCmd));
         AssertRC(rc);
@@ -866,13 +871,7 @@
         }
         else
-        if (!strcmp(szCmd, "heartbeat"))
-        {
-        }
-        else
-        if (!strcmp(szCmd, "checkpoint"))
-        {
-        }
-        else
-        if (!strcmp(szCmd, "full-sync"))
+        if (    !strcmp(szCmd, "checkpoint")
+            ||  (fFullSync = true)  /* intended assignment */
+            ||  !strcmp(szCmd, "full-sync"))
         {
             rc = ftmR3TcpWriteACK(pVM);
@@ -884,5 +883,7 @@
             pVM->ftm.s.syncstate.uOffStream = 0;
 
+            pVM->ftm.s.fDeltaLoadSaveActive = (fFullSync == false);
             rc = VMR3LoadFromStream(pVM, &g_ftmR3TcpOps, pVM, NULL, NULL);
+            pVM->ftm.s.fDeltaLoadSaveActive = false;
             RTSocketRelease(pVM->ftm.s.hSocket);
             AssertRC(rc);
@@ -907,5 +908,5 @@
             rc = ftmR3TcpWriteACK(pVM);
             AssertRC(rc);
-        }        
+        }
     }
     LogFlowFunc(("returns mRc=%Rrc\n", rc));
Index: trunk/src/VBox/VMM/FTMInternal.h
===================================================================
--- trunk/src/VBox/VMM/FTMInternal.h	(revision 32050)
+++ trunk/src/VBox/VMM/FTMInternal.h	(revision 32051)
@@ -60,5 +60,7 @@
     /** Set when this master VM is busy with checkpointing. */
     bool                fCheckpointingActive;
-    bool                fAlignment[6];
+    /** Set when VM save/restore should only include changed pages. */
+    bool                fDeltaLoadSaveActive;
+    bool                fAlignment[5];
 
     /** Current active socket. */
Index: trunk/src/VBox/VMM/PGMSavedState.cpp
===================================================================
--- trunk/src/VBox/VMM/PGMSavedState.cpp	(revision 32050)
+++ trunk/src/VBox/VMM/PGMSavedState.cpp	(revision 32051)
@@ -32,4 +32,5 @@
 #include <VBox/param.h>
 #include <VBox/err.h>
+#include <VBox/ftm.h>
 
 #include <iprt/asm.h>
@@ -398,4 +399,7 @@
 static int pgmR3SaveRomVirginPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave)
 {
+    if (FTMIsDeltaLoadSaveActive(pVM))
+        return VINF_SUCCESS;    /* nothing to do as nothing has changed here */
+
     pgmLock(pVM);
     for (PPGMROMRANGE pRom = pVM->pgm.s.pRomRangesR3; pRom; pRom = pRom->pNextR3)
@@ -473,4 +477,7 @@
 static int pgmR3SaveShadowedRomPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, bool fFinalPass)
 {
+    if (FTMIsDeltaLoadSaveActive(pVM))
+        return VINF_SUCCESS;    /* nothing to do as we deal with those pages seperately */
+
     /*
      * The Shadowed ROMs.
@@ -1513,4 +1520,6 @@
     RTGCPHYS GCPhysCur = 0;
     PPGMRAMRANGE pCur;
+    bool fFTMDeltaSaveActive = FTMIsDeltaLoadSaveActive(pVM);
+
     pgmLock(pVM);
     do
@@ -1538,4 +1547,6 @@
                     }
 
+                    PPGMPAGE pCurPage = &pCur->aPages[iPage];
+
                     /*
                      * Only save pages that haven't changed since last scan and are dirty.
@@ -1550,7 +1561,7 @@
                         if (paLSPages[iPage].fIgnore)
                             continue;
-                        if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM) /* in case of recent remappings */
+                        if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM) /* in case of recent remappings */
                             continue;
-                        if (    PGM_PAGE_GET_STATE(&pCur->aPages[iPage])
+                        if (    PGM_PAGE_GET_STATE(pCurPage)
                             !=  (  paLSPages[iPage].fZero
                                  ? PGM_PAGE_STATE_ZERO
@@ -1569,10 +1580,10 @@
                         {
 #ifdef PGMLIVESAVERAMPAGE_WITH_CRC32
-                            if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM)
+                            if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM)
                                 pgmR3StateVerifyCrc32ForRamPage(pVM, pCur, paLSPages, iPage, "save#1");
 #endif
                             continue;
                         }
-                        if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM)
+                        if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM)
                             continue;
                     }
@@ -1583,5 +1594,5 @@
                     int         rc;
                     RTGCPHYS    GCPhys = pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
-                    bool        fZero  = PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]) || PGM_PAGE_IS_BALLOONED(&pCur->aPages[iPage]);
+                    bool        fZero  = PGM_PAGE_IS_ZERO(pCurPage) || PGM_PAGE_IS_BALLOONED(pCurPage);
 
                     if (!fZero)
@@ -1593,5 +1604,5 @@
                         uint8_t     abPage[PAGE_SIZE];
                         void const *pvPage;
-                        rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, &pCur->aPages[iPage], GCPhys, &pvPage);
+                        rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pCurPage, GCPhys, &pvPage);
                         if (RT_SUCCESS(rc))
                         {
@@ -1608,12 +1619,26 @@
                         if (!ASMMemIsZeroPage(pvPage))
                         {
-                            if (GCPhys == GCPhysLast + PAGE_SIZE)
-                                SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW);
+                            if (fFTMDeltaSaveActive)
+                            {
+                                if (    PGM_PAGE_IS_WRITTEN_TO(pCurPage)
+                                    ||  PGM_PAGE_IS_FT_DIRTY(pCurPage))
+                                {
+                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
+                                    SSMR3PutGCPhys(pSSM, GCPhys);
+                                    rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
+                                }
+                                /* else nothing changed, so skip it. */
+                            }
                             else
                             {
-                                SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
-                                SSMR3PutGCPhys(pSSM, GCPhys);
+                                if (GCPhys == GCPhysLast + PAGE_SIZE)
+                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW);
+                                else
+                                {
+                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
+                                    SSMR3PutGCPhys(pSSM, GCPhys);
+                                }
+                                rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
                             }
-                            rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
                         }
                         else
@@ -1675,4 +1700,5 @@
         } /* for each range */
     } while (pCur);
+
     pgmUnlock(pVM);
 
Index: trunk/src/VBox/VMM/VMMAll/FTMAll.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMAll/FTMAll.cpp	(revision 32050)
+++ trunk/src/VBox/VMM/VMMAll/FTMAll.cpp	(revision 32051)
@@ -49,2 +49,16 @@
 #endif
 }
+
+
+/**
+ * Checks if the delta save/load is enabled
+ *
+ * @returns true/false
+ *
+ * @param   pVM         The VM to operate on.
+ */
+VMMDECL(bool)  FTMIsDeltaLoadSaveActive(PVM pVM)
+{
+    return pVM->ftm.s.fDeltaLoadSaveActive;
+}
+
