Index: /trunk/src/VBox/Main/ConsoleImplTeleporter.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImplTeleporter.cpp	(revision 23903)
+++ /trunk/src/VBox/Main/ConsoleImplTeleporter.cpp	(revision 23904)
@@ -92,8 +92,10 @@
     Utf8Str             mstrHostname;
     uint32_t            muPort;
-
-    TeleporterStateSrc(Console *pConsole, PVM pVM, Progress *pProgress)
+    MachineState_T      menmOldMachineState;
+
+    TeleporterStateSrc(Console *pConsole, PVM pVM, Progress *pProgress, MachineState_T enmOldMachineState)
         : TeleporterState(pConsole, pVM, pProgress, true /*fIsSource*/)
         , muPort(UINT32_MAX)
+        , menmOldMachineState(enmOldMachineState)
     {
     }
@@ -110,12 +112,14 @@
     PRTTCPSERVER        mhServer;
     PRTTIMERLR          mphTimerLR;
+    bool                mfStartPaused;
     int                 mRc;
 
     TeleporterStateTrg(Console *pConsole, PVM pVM, Progress *pProgress,
-                       IMachine *pMachine, PRTTIMERLR phTimerLR)
+                       IMachine *pMachine, PRTTIMERLR phTimerLR, bool fStartPaused)
         : TeleporterState(pConsole, pVM, pProgress, false /*fIsSource*/)
         , mpMachine(pMachine)
         , mhServer(NULL)
         , mphTimerLR(phTimerLR)
+        , mfStartPaused(false)
         , mRc(VINF_SUCCESS)
     {
@@ -617,5 +621,5 @@
     void *pvUser = static_cast<void *>(static_cast<TeleporterState *>(pState));
     vrc = VMR3Teleport(pState->mpVM, &g_teleporterTcpOps, pvUser, teleporterProgressCallback, pvUser);
-    if (vrc)
+    if (RT_FAILURE(vrc))
         return setError(E_FAIL, tr("VMR3Teleport -> %Rrc"), vrc);
 
@@ -623,4 +627,18 @@
     if (FAILED(hrc))
         return hrc;
+
+    /*
+     * If we're paused, mention this to the target side.
+     *
+     * Note: This means you have to resume the target manually if you pause it
+     *       during the teleportation.
+     */
+    if (    vrc == VINF_SSM_LIVE_SUSPENDED
+        ||  pState->menmOldMachineState == MachineState_Paused)
+    {
+        hrc = teleporterSrcSubmitCommand(pState, "pause");
+        if (FAILED(hrc))
+            return hrc;
+    }
 
     /*
@@ -686,5 +704,8 @@
                 case VMSTATE_RESETTING:
                 case VMSTATE_RESETTING_LS:
-                    pState->mptrConsole->setMachineState(MachineState_Running);
+                    if (pState->menmOldMachineState == MachineState_Running)
+                        pState->mptrConsole->setMachineState(MachineState_Running);
+                    else
+                        pState->mptrConsole->setMachineState(MachineState_Paused);
                     break;
                 case VMSTATE_GURU_MEDITATION:
@@ -777,5 +798,5 @@
     CheckComRCReturnRC(hrc);
 
-    TeleporterStateSrc *pState = new TeleporterStateSrc(this, mpVM, ptrProgress);
+    TeleporterStateSrc *pState = new TeleporterStateSrc(this, mpVM, ptrProgress, mMachineState);
     pState->mstrPassword = aPassword;
     pState->mstrHostname = aHostname;
@@ -888,5 +909,5 @@
              * Do the job, when it returns we're done.
              */
-            TeleporterStateTrg State(this, pVM, pProgress, pMachine, &hTimerLR);
+            TeleporterStateTrg State(this, pVM, pProgress, pMachine, &hTimerLR, fStartPaused);
             State.mstrPassword      = strPassword;
             State.mhServer          = hServer;
@@ -904,5 +925,5 @@
                     if (RT_SUCCESS(vrc))
                     {
-                        if (fStartPaused)
+                        if (State.mfStartPaused)
                             setMachineState(MachineState_Paused);
                         else
@@ -1085,6 +1106,4 @@
 
             vrc = teleporterTcpWriteACK(pState);
-            if (RT_FAILURE(vrc))
-                break;
         }
         /** @todo implement config verification and hardware compatability checks. Or
@@ -1096,4 +1115,9 @@
             LogRel(("Teleporter: Received cancel command.\n"));
             vrc = VERR_SSM_CANCELLED;
+        }
+        else if (!strcmp(szCmd, "pause"))
+        {
+            pState->mfStartPaused = true;
+            vrc = teleporterTcpWriteACK(pState);
         }
         else if (!strcmp(szCmd, "done"))
@@ -1118,4 +1142,7 @@
             break;
         }
+
+        if (RT_FAILURE(vrc))
+            break;
     }
 
Index: /trunk/src/VBox/VMM/VM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VM.cpp	(revision 23903)
+++ /trunk/src/VBox/VMM/VM.cpp	(revision 23904)
@@ -1533,9 +1533,11 @@
      */
     int rc = VINF_SUCCESS;
-    if (VMR3GetState(pVM) == VMSTATE_SUSPENDED_LS)
+    VMSTATE enmVMState = VMR3GetState(pVM);
+    if (enmVMState == VMSTATE_SUSPENDED_LS)
         vmR3SetState(pVM, VMSTATE_SAVING, VMSTATE_SUSPENDED_LS);
     else
     {
-        vmR3SetState(pVM, VMSTATE_SAVING, VMSTATE_SUSPENDED_EXT_LS);
+        if (enmVMState != VMSTATE_SAVING)
+            vmR3SetState(pVM, VMSTATE_SAVING, VMSTATE_SUSPENDED_EXT_LS);
         rc = VINF_SSM_LIVE_SUSPENDED;
     }
@@ -1602,10 +1604,11 @@
                              VMSTATE_SAVING,     VMSTATE_SUSPENDED,
                              VMSTATE_RUNNING_LS, VMSTATE_RUNNING);
-    if (rc == 1)
-    {
+    if (rc == 1 && enmAfter != SSMAFTER_TELEPORT)
+    {
+        Assert(!pStreamOps);
         rc = SSMR3Save(pVM, pszFilename, enmAfter, pfnProgress, pvProgressUser);
         vmR3SetState(pVM, VMSTATE_SUSPENDED, VMSTATE_SAVING);
     }
-    else if (rc == 2)
+    else if (rc == 2 || enmAfter == SSMAFTER_TELEPORT)
     {
         rc = SSMR3LiveSave(pVM, pszFilename, pStreamOps, pvStreamOpsUser,
@@ -1656,15 +1659,16 @@
         if (RT_SUCCESS(rc))
         {
-            for (;;)
-            {
-                /* Try suspend the VM. */
-                rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_DESCENDING | VMMEMTRENDEZVOUS_FLAGS_STOP_ON_ERROR,
-                                        vmR3LiveDoSuspend, NULL);
-                if (rc != VERR_TRY_AGAIN)
-                    break;
-
-                /* Wait for the state to change. */
-                RTThreadSleep(250); /** @todo LS: fix this polling wait by some smart use of multiple release event  semaphores.. */
-            }
+            if (VMR3GetState(pVM) != VMSTATE_SAVING)
+                for (;;)
+                {
+                    /* Try suspend the VM. */
+                    rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_DESCENDING | VMMEMTRENDEZVOUS_FLAGS_STOP_ON_ERROR,
+                                            vmR3LiveDoSuspend, NULL);
+                    if (rc != VERR_TRY_AGAIN)
+                        break;
+
+                    /* Wait for the state to change. */
+                    RTThreadSleep(250); /** @todo LS: fix this polling wait by some smart use of multiple release event  semaphores.. */
+                }
             if (RT_SUCCESS(rc))
                 rc = VMR3ReqCallWaitU(pVM->pUVM, 0 /*idDstCpu*/, (PFNRT)vmR3LiveDoStep2, 2, pVM, pSSM);
