Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 23702)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 23703)
@@ -397,4 +397,10 @@
         case MachineState_Restoring:
             pszState = "restoring";
+            break;
+        case MachineState_MigratingFrom:
+            if (details == VMINFO_MACHINEREADABLE)
+                pszState = "migratingfrom";
+            else
+                pszState = "migrating from";
             break;
         default:
Index: /trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp	(revision 23702)
+++ /trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp	(revision 23703)
@@ -605,4 +605,5 @@
             case MachineState_Running:             return "Running";
             case MachineState_Restoring:           return "Restoring";
+            case MachineState_MigratingFrom:       return "MigratingFrom";
             case MachineState_Starting:            return "Starting";
             case MachineState_PoweredOff:          return "PoweredOff";
@@ -2017,5 +2018,7 @@
         if (    rc == S_OK
             &&  (   machineState == MachineState_Starting
-                 || machineState == MachineState_Restoring))
+                 || machineState == MachineState_Restoring
+                 || machineState == MachineState_MigratingFrom)
+            )
         {
             /*
@@ -2111,5 +2114,7 @@
     } while (   rc == S_OK
              && (   machineState == MachineState_Starting
-                 || machineState == MachineState_Restoring));
+                 || machineState == MachineState_Restoring
+                 || machineState == MachineState_MigratingFrom)
+            );
 
     /* kill the timer again */
@@ -4209,4 +4214,15 @@
                                 " - Restoring...");
             }
+            else if (machineState == MachineState_MigratingFrom)
+            {
+                ULONG cPercentNow;
+                HRESULT rc = gProgress->COMGETTER(Percent)(&cPercentNow);
+                if (SUCCEEDED(rc))
+                    RTStrPrintf(szTitle + strlen(szTitle), sizeof(szTitle) - strlen(szTitle),
+                                " - Migrating %d%%...", (int)cPercentNow);
+                else
+                    RTStrPrintf(szTitle + strlen(szTitle), sizeof(szTitle) - strlen(szTitle),
+                                " - Migrating...");
+            }
             /* ignore other states, we could already be in running or aborted state */
             break;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp	(revision 23702)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp	(revision 23703)
@@ -4194,4 +4194,5 @@
          mLastState == KMachineState_Paused ||
          mLastState == KMachineState_Restoring ||
+         mLastState == KMachineState_MigratingFrom ||
          mLastState == KMachineState_Saving))
         updateDockIcon();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp	(revision 23702)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp	(revision 23703)
@@ -2642,4 +2642,5 @@
     mMachineStates [KMachineState_Saving] =     tr ("Saving", "MachineState");
     mMachineStates [KMachineState_Restoring] =  tr ("Restoring", "MachineState");
+    mMachineStates [KMachineState_MigratingFrom] = tr ("Migrating From", "MachineState");
     mMachineStates [KMachineState_Discarding] = tr ("Discarding", "MachineState");
     mMachineStates [KMachineState_SettingUp] =  tr ("Setting Up", "MachineState");
@@ -4611,4 +4612,5 @@
         {KMachineState_Saving, ":/state_saving_16px.png"},
         {KMachineState_Restoring, ":/state_restoring_16px.png"},
+        {KMachineState_MigratingFrom, ":/state_restoring_16px.png"}, /** @todo Live Migration: New icon? (not really important) */
         {KMachineState_Discarding, ":/state_discarding_16px.png"},
         {KMachineState_SettingUp, ":/settings_16px.png"},
@@ -4632,4 +4634,5 @@
     mVMStateColors.insert (KMachineState_Saving,        new QColor (Qt::green));
     mVMStateColors.insert (KMachineState_Restoring,     new QColor (Qt::green));
+    mVMStateColors.insert (KMachineState_MigratingFrom, new QColor (Qt::green));
     mVMStateColors.insert (KMachineState_Discarding,    new QColor (Qt::green));
     mVMStateColors.insert (KMachineState_SettingUp,     new QColor (Qt::green));
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp	(revision 23702)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp	(revision 23703)
@@ -1513,4 +1513,5 @@
         case KMachineState_Starting:
         case KMachineState_Restoring:
+        case KMachineState_MigratingFrom:
         {
             refreshAll();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/darwin/VBoxDockIconPreview.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/darwin/VBoxDockIconPreview.cpp	(revision 23702)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/darwin/VBoxDockIconPreview.cpp	(revision 23703)
@@ -119,5 +119,6 @@
     if (mMainWnd->machineState() == KMachineState_Paused)
         img = mStatePaused;
-    else if (mMainWnd->machineState() == KMachineState_Restoring)
+    else if (   mMainWnd->machineState() == KMachineState_Restoring
+             || mMainWnd->machineState() == KMachineState_MigratingFrom)
         img = mStateRestoring;
     else if (mMainWnd->machineState() == KMachineState_Saving)
Index: /trunk/src/VBox/Main/ConsoleImpl-LiveMigration.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl-LiveMigration.cpp	(revision 23702)
+++ /trunk/src/VBox/Main/ConsoleImpl-LiveMigration.cpp	(revision 23703)
@@ -174,4 +174,5 @@
         if (RT_FAILURE(rc))
         {
+            *pszBuf = '\0';
             LogRel(("Migration: RTTcpRead -> %Rrc while reading string ('%s')\n", rc, pszStart));
             return rc;
@@ -179,12 +180,15 @@
         if (    ch == '\n'
             ||  ch == '\0')
+        {
+            *pszBuf = '\0';
             return VINF_SUCCESS;
+        }
         if (cchBuf <= 1)
         {
+            *pszBuf = '\0';
             LogRel(("Migration: String buffer overflow: '%s'\n", pszStart));
             return VERR_BUFFER_OVERFLOW;
         }
         *pszBuf++ = ch;
-        *pszBuf   = '\0';
         cchBuf--;
     }
@@ -197,4 +201,5 @@
  * @returns S_OK on ACK, E_FAIL+setError() on failure or NACK.
  * @param   pState              The live migration source state.
+ * @param   pszWhich            Which ACK is this this?
  * @param   pszNAckMsg          Optional NACK message.
  *
@@ -202,10 +207,11 @@
  */
 HRESULT
-Console::migrationSrcReadACK(MigrationStateSrc *pState, const char *pszNAckMsg /*= NULL*/)
+Console::migrationSrcReadACK(MigrationStateSrc *pState, const char *pszWhich,
+                             const char *pszNAckMsg /*= NULL*/)
 {
     char szMsg[128];
     int vrc = migrationTcpReadLine(pState, szMsg, sizeof(szMsg));
     if (RT_FAILURE(vrc))
-        return setError(E_FAIL, tr("Failed reading ACK: %Rrc"), vrc);
+        return setError(E_FAIL, tr("Failed reading ACK(%s): %Rrc"), pszWhich, vrc);
     if (strcmp(szMsg, "ACK"))
     {
@@ -218,11 +224,11 @@
                 if (pszNAckMsg)
                 {
-                    LogRel(("Migration: NACK=%Rrc (%d)\n", vrc2, vrc2));
+                    LogRel(("Migration: %s: NACK=%Rrc (%d)\n", pszWhich, vrc2, vrc2));
                     return setError(E_FAIL, pszNAckMsg);
                 }
-                return setError(E_FAIL, "NACK - %Rrc (%d)", vrc2, vrc2);
+                return setError(E_FAIL, "NACK(%s) - %Rrc (%d)", pszWhich, vrc2, vrc2);
             }
         }
-        return setError(E_FAIL, tr("Expected ACK or NACK, got '%s'"), szMsg);
+        return setError(E_FAIL, tr("%s: Expected ACK or NACK, got '%s'"), pszWhich, szMsg);
     }
     return S_OK;
@@ -247,7 +253,9 @@
     if (RT_SUCCESS(vrc))
         vrc = RTTcpWrite(pState->mhSocket, "\n", sizeof("\n") - 1);
+    if (RT_SUCCESS(vrc))
+        vrc = RTTcpFlush(pState->mhSocket);
     if (RT_FAILURE(vrc))
         return setError(E_FAIL, tr("Failed writing command '%s': %Rrc"), pszCommand, vrc);
-    return migrationSrcReadACK(pState);
+    return migrationSrcReadACK(pState, pszCommand);
 }
 
@@ -456,4 +464,6 @@
         MIGRATIONTCPHDR EofHdr = { MIGRATIONTCPHDR_MAGIC, 0 };
         int rc = RTTcpWrite(pState->mhSocket, &EofHdr, sizeof(EofHdr));
+        if (RT_SUCCESS(rc))
+            rc = RTTcpFlush(pState->mhSocket);
         if (RT_FAILURE(rc))
         {
@@ -546,5 +556,5 @@
 
     /* ACK */
-    hrc = migrationSrcReadACK(pState, tr("Invalid password"));
+    hrc = migrationSrcReadACK(pState, "password", tr("Invalid password"));
     if (FAILED(hrc))
         return hrc;
@@ -567,5 +577,5 @@
         return setError(E_FAIL, tr("VMR3Migrate -> %Rrc"), vrc);
 
-    hrc = migrationSrcReadACK(pState);
+    hrc = migrationSrcReadACK(pState, "load-complete");
     if (FAILED(hrc))
         return hrc;
@@ -574,4 +584,7 @@
      * State fun? Automatic power off?
      */
+    hrc = migrationSrcSubmitCommand(pState, "done");
+    if (FAILED(hrc))
+        return hrc;
 
     return S_OK;
@@ -591,5 +604,10 @@
     MigrationStateSrc *pState = (MigrationStateSrc *)pvUser;
 
-    HRESULT hrc = pState->mptrConsole->migrationSrc(pState);
+    AutoVMCaller autoVMCaller(pState->mptrConsole);
+    HRESULT hrc = autoVMCaller.rc();
+
+    if (SUCCEEDED(hrc))
+        hrc = pState->mptrConsole->migrationSrc(pState);
+
     pState->mptrProgress->notifyComplete(hrc);
 
@@ -629,6 +647,7 @@
                 case VMSTATE_SUSPENDING_EXT_LS:
                     pState->mptrConsole->setMachineState(MachineState_Paused);
-                    pState->mptrConsole->Resume(); /** @todo somehow make the VMM report back external pause even on error. */
-                    autoLock.unlock();
+                    /** @todo somehow make the VMM report back external pause even on error. */
+                    autoLock.leave();
+                    VMR3Resume(pState->mpVM);
                     break;
             }
@@ -946,5 +965,7 @@
         else
         {
-            LogRel(("Migration: Unknown command '%s'\n", szCmd));
+            LogRel(("Migration: Unknown command '%s' (%.*Rxs)\n", szCmd, strlen(szCmd), szCmd));
+            vrc = VERR_NOT_IMPLEMENTED;
+            migrationTcpWriteNACK(pState, vrc);
             break;
         }
Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 23702)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 23703)
@@ -4730,7 +4730,8 @@
      * any error reporting and appropriate state change! */
 
-    if (   mMachineState == MachineState_Saved
-        || fLiveMigrationTarget)
+    if (mMachineState == MachineState_Saved)
         setMachineState(MachineState_Restoring);
+    else if (fLiveMigrationTarget)
+        setMachineState(MachineState_MigratingFrom);
     else
         setMachineState(MachineState_Starting);
@@ -4798,4 +4799,5 @@
               mMachineState == MachineState_Starting ||
               mMachineState == MachineState_Restoring ||
+              mMachineState == MachineState_MigratingFrom || /** @todo LiveMigration ???*/
               mMachineState == MachineState_Stopping,
               ("Invalid machine state: %s\n", Global::stringifyMachineState(mMachineState)));
@@ -4809,7 +4811,9 @@
      * powerUpThread() is calling us on failure, so the VM is already off at
      * that point. */
-    if (!mVMPoweredOff &&
-        (mMachineState == MachineState_Starting ||
-         mMachineState == MachineState_Restoring))
+    if (   !mVMPoweredOff
+        && (   mMachineState == MachineState_Starting
+            || mMachineState == MachineState_Restoring
+            || mMachineState == MachineState_MigratingFrom)
+       )
         mVMPoweredOff = true;
 
@@ -4819,7 +4823,9 @@
      * inappropriate operations while leaving the lock below, Saving or
      * Restoring should be fine too */
-    if (mMachineState != MachineState_Saving &&
-        mMachineState != MachineState_Restoring &&
-        mMachineState != MachineState_Stopping)
+    if (   mMachineState != MachineState_Saving
+        && mMachineState != MachineState_Restoring
+        && mMachineState != MachineState_MigratingFrom
+        && mMachineState != MachineState_Stopping
+       )
         setMachineState(MachineState_Stopping);
 
@@ -5504,5 +5510,7 @@
             if (   that->mMachineState != MachineState_Stopping
                 && that->mMachineState != MachineState_Saving
-                && that->mMachineState != MachineState_Restoring)
+                && that->mMachineState != MachineState_Restoring
+                && that->mMachineState != MachineState_MigratingFrom
+               )
             {
                 LogFlowFunc(("VM has powered itself off but Console still thinks it is running. Notifying.\n"));
@@ -5598,4 +5606,8 @@
                     that->setMachineState(MachineState_Saved);
                     break;
+                case MachineState_MigratingFrom:
+                    /* Migration failed or was cancelled.  Back to powered off. */
+                    that->setMachineState(MachineState_PoweredOff);
+                    break;
             }
             break;
@@ -5635,4 +5647,5 @@
                            && aOldState == VMSTATE_POWERING_ON)
                        || (   (   that->mMachineState == MachineState_Restoring
+                               || that->mMachineState == MachineState_MigratingFrom
                                || that->mMachineState == MachineState_Paused)
                            && aOldState == VMSTATE_RESUMING));
@@ -6828,6 +6841,8 @@
     catch (HRESULT aRC) { rc = aRC; }
 
-    if (console->mMachineState == MachineState_Starting ||
-        console->mMachineState == MachineState_Restoring)
+    if (   console->mMachineState == MachineState_Starting
+        || console->mMachineState == MachineState_Restoring
+        || console->mMachineState == MachineState_MigratingFrom
+       )
     {
         /* We are still in the Starting/Restoring state. This means one of:
Index: /trunk/src/VBox/Main/Global.cpp
===================================================================
--- /trunk/src/VBox/Main/Global.cpp	(revision 23702)
+++ /trunk/src/VBox/Main/Global.cpp	(revision 23703)
@@ -197,4 +197,5 @@
         case MachineState_Saving:       return "Saving";
         case MachineState_Restoring:    return "Restoring";
+        case MachineState_MigratingFrom:return "MigratingFrom";
         case MachineState_Discarding:   return "Discarding";
         case MachineState_SettingUp:    return "SettingUp";
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23702)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23703)
@@ -6002,10 +6002,5 @@
 
         if (    mData->mMachineState == MachineState_Saved
-#ifdef VBOX_WITH_LIVE_MIGRATION /** @todo fix this properly... a new state for indicating migration? */
-             || (   mData->mMachineState == MachineState_Restoring
-                 && !mSSData->mStateFilePath.isEmpty() )
-#else
              || mData->mMachineState == MachineState_Restoring
-#endif
            )
         {
@@ -9274,4 +9269,5 @@
         case MachineState_Starting:
         case MachineState_Restoring:
+        case MachineState_MigratingFrom:
         case MachineState_Paused:
         case MachineState_Running:
@@ -10147,6 +10143,7 @@
     AutoWriteLock alock(this);
 
-    AssertReturn(mData->mMachineState == MachineState_Starting ||
-                  mData->mMachineState == MachineState_Restoring, E_FAIL);
+    AssertReturn(   mData->mMachineState == MachineState_Starting
+                 || mData->mMachineState == MachineState_Restoring
+                 || mData->mMachineState == MachineState_MigratingFrom, E_FAIL);
 
     typedef std::list <ComPtr<IMedium> > MediaList;
@@ -10333,8 +10330,11 @@
     /* detect some state transitions */
 
-    if ((oldMachineState == MachineState_Saved &&
-           aMachineState == MachineState_Restoring) ||
-        (oldMachineState < MachineState_Running /* any other OFF state */ &&
-           aMachineState == MachineState_Starting))
+    if (   (   oldMachineState == MachineState_Saved
+            && aMachineState   == MachineState_Restoring)
+        || (   oldMachineState == MachineState_PoweredOff
+            && aMachineState   == MachineState_MigratingFrom)
+        || (   oldMachineState <  MachineState_Running /* any other OFF state */
+            && aMachineState   == MachineState_Starting)
+       )
     {
         /* The EMT thread is about to start */
@@ -10345,13 +10345,13 @@
         /// change anything when in the Starting/Restoring state
     }
-    else
-    if (oldMachineState >= MachineState_Running &&
-        oldMachineState != MachineState_Discarding &&
-        oldMachineState != MachineState_SettingUp &&
-        aMachineState < MachineState_Running &&
-        /* ignore PoweredOff->Saving->PoweredOff transition when taking a
-         * snapshot */
-        (mSnapshotData.mSnapshot.isNull() ||
-         mSnapshotData.mLastState >= MachineState_Running))
+    else if (   oldMachineState >= MachineState_Running
+             && oldMachineState != MachineState_Discarding
+             && oldMachineState != MachineState_SettingUp
+             && aMachineState < MachineState_Running
+             /* ignore PoweredOff->Saving->PoweredOff transition when taking a
+              * snapshot */
+             && (   mSnapshotData.mSnapshot.isNull()
+                 || mSnapshotData.mLastState >= MachineState_Running)
+            )
     {
         /* The EMT thread has just stopped, unlock attached media. Note that as
@@ -10377,8 +10377,8 @@
         }
     }
-    else
-    if (oldMachineState == MachineState_Saved &&
-        (aMachineState == MachineState_PoweredOff ||
-         aMachineState == MachineState_Aborted))
+    else if (   oldMachineState == MachineState_Saved
+             && (   aMachineState == MachineState_PoweredOff
+                 || aMachineState == MachineState_Aborted)
+            )
     {
         /*
@@ -10403,6 +10403,8 @@
     }
 
-    if (aMachineState == MachineState_Starting ||
-        aMachineState == MachineState_Restoring)
+    if (   aMachineState == MachineState_Starting
+        || aMachineState == MachineState_Restoring
+        || aMachineState == MachineState_MigratingFrom
+       )
     {
         /* set the current state modified flag to indicate that the current
@@ -10416,10 +10418,5 @@
     }
 
-#ifdef VBOX_WITH_LIVE_MIGRATION /** @todo fix this properly... a new state for indicating migration? */
-    if (   deleteSavedState
-        && !mSSData->mStateFilePath.isNull())
-#else
     if (deleteSavedState)
-#endif
     {
         if (mRemoveSavedState)
Index: /trunk/src/VBox/Main/cbinding/tstXPCOMCCall.c
===================================================================
--- /trunk/src/VBox/Main/cbinding/tstXPCOMCCall.c	(revision 23702)
+++ /trunk/src/VBox/Main/cbinding/tstXPCOMCCall.c	(revision 23703)
@@ -84,4 +84,5 @@
         case MachineState_Saving:              return "Saving";
         case MachineState_Restoring:           return "Restoring";
+        case MachineState_MigratingFrom:       return "MigratingFrom";
         case MachineState_Discarding:          return "Discarding";
         case MachineState_SettingUp:           return "SettingUp";
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 23702)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 23703)
@@ -473,5 +473,5 @@
   <enum
     name="MachineState"
-    uuid="73bf04d0-7c4f-4684-9abf-d65a9ad74343"
+    uuid="f532545d-9ae7-4402-8b5f-1ea7d778cfc7"
   >
     <desc>
@@ -673,10 +673,15 @@
       </desc>
     </const>
-    <const name="Discarding"            value="11">
+    <const name="MigratingFrom"         value="11">
+      <desc>
+        Migrating the machine state from another host or process.
+      </desc>
+    </const>
+    <const name="Discarding"            value="12">
       <desc>
         Snapshot of the machine is being discarded.
       </desc>
     </const>
-    <const name="SettingUp"             value="12">
+    <const name="SettingUp"             value="13">
       <desc>
         Lengthy setup operation is in progress.
@@ -689,5 +694,5 @@
       </desc>
     </const>
-    <const name="LastOnline"  value="10" wsmap="suppress"> <!-- Restoring -->
+    <const name="LastOnline"  value="11" wsmap="suppress"> <!-- Restoring -->
       <desc>
         Pseudo-state: last online state (for use in relational expressions).
@@ -700,5 +705,5 @@
       </desc>
     </const>
-    <const name="LastTransient"  value="12" wsmap="suppress"> <!-- SettingUp -->
+    <const name="LastTransient"  value="13" wsmap="suppress"> <!-- SettingUp -->
       <desc>
         Pseudo-state: last transient state (for use in relational expressions).
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 23702)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 23703)
@@ -518,5 +518,5 @@
     static DECLCALLBACK(int)    migrationSrcThreadWrapper(RTTHREAD hThread, void *pvUser);
     HRESULT                     migrationSrc(MigrationStateSrc *pState);
-    HRESULT                     migrationSrcReadACK(MigrationStateSrc *pState, const char *pszNAckMsg = NULL);
+    HRESULT                     migrationSrcReadACK(MigrationStateSrc *pState, const char *pszWhich, const char *pszNAckMsg = NULL);
     HRESULT                     migrationSrcSubmitCommand(MigrationStateSrc *pState, const char *pszCommand);
     int                         migrationDst(PVM pVM, IMachine *pMachine, bool fStartPaused, void *pvVMCallbackTask);
