Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 23666)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 23667)
@@ -1291,4 +1291,51 @@
                 CHECK_ERROR(guest, COMSETTER(StatisticsUpdateInterval)(uVal));
         }
+        else if (!strcmp(a->argv[1], "migrate"))
+        {
+            Bstr        bstrHostname;
+            uint32_t    uPort = UINT32_MAX;
+            Bstr        bstrPassword("");
+            static const RTGETOPTDEF s_aMigrateOptions[] =
+            {
+                { "--hostname",    'h', RTGETOPT_REQ_STRING }, /** @todo RTGETOPT_FLAG_MANDATORY */
+                { "--port",        'p', RTGETOPT_REQ_UINT32 }, /** @todo RTGETOPT_FLAG_MANDATORY */
+                { "--password",    'P', RTGETOPT_REQ_STRING }
+            };
+            RTGETOPTSTATE GetOptState;
+            RTGetOptInit(&GetOptState, a->argc, a->argv, s_aMigrateOptions, RT_ELEMENTS(s_aMigrateOptions), 2, 0 /*fFlags*/);
+            int ch;
+            RTGETOPTUNION Value;
+            while (   SUCCEEDED(rc)
+                   && (ch = RTGetOpt(&GetOptState, &Value)))
+            {
+                switch (ch)
+                {
+                    case 'h': bstrHostname  = Value.psz; break;
+                    case 'p': uPort         = Value.u32; break;
+                    case 'P': bstrPassword  = Value.psz; break;
+                    default:
+                        errorGetOpt(USAGE_SNAPSHOT, ch, &Value);
+                        rc = E_FAIL;
+                        break;
+                }
+            }
+            if (FAILED(rc))
+                break;
+
+            ComPtr<IProgress> progress;
+            CHECK_ERROR_BREAK(console, Migrate(bstrHostname, uPort, bstrPassword, progress.asOutParam()));
+            showProgress(progress);
+
+            LONG iRc;
+            CHECK_ERROR_BREAK(progress, COMGETTER(ResultCode)(&iRc));
+            if (FAILED(iRc))
+            {
+                com::ProgressErrorInfo info(progress);
+                if (info.isBasicAvailable())
+                    RTPrintf("Error: live migration failed. Error message: %lS\n", info.getText().raw());
+                else
+                    RTPrintf("Error: live migration failed. No error message available!\n");
+            }
+        }
         else
         {
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 23666)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 23667)
@@ -250,5 +250,8 @@
         RTPrintf("                            [--usb on|off]\n"
                  "                            [--usbehci on|off]\n"
-                 "                            [--snapshotfolder default|<path>]\n");
+                 "                            [--snapshotfolder default|<path>]\n"
+                 "                            [--livemigrationtarget on|off]\n"
+                 "                            [--livemigrationport <port>]\n"
+                 "                            [--livemigrationpassword <password>]\n");
         RTPrintf("\n");
     }
@@ -316,7 +319,9 @@
             RTPrintf("                            vrdpport default|<port>] |\n");
         }
-        RTPrintf("                            setvideomodehint <xres> <yres> <bpp> [display]|\n"
+        RTPrintf("                            setvideomodehint <xres> <yres> <bpp> [display] |\n"
                  "                            setcredentials <username> <password> <domain>\n"
-                 "                                           [--allowlocallogon <yes|no>]\n"
+                 "                                           [--allowlocallogon <yes|no>] |\n"
+                 "                            migrate --hostname <name> --port <port>\n"
+                 "                                   [--password password]\n"
                  "\n");
     }
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 23666)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 23667)
@@ -109,4 +109,7 @@
     int   sataPortCount = -1;
     int   sataBootDevices[4] = {-1,-1,-1,-1};
+    int         fLiveMigrationTarget = -1;
+    uint32_t    uLiveMigrationPort = UINT32_MAX;
+    const char *pszLiveMigrationPassword = NULL;
 
     /* VM ID + at least one parameter. Parameter arguments are checked
@@ -869,4 +872,32 @@
             else
                 return errorArgument("Invalid --scsitype argument '%s'", a->argv[i]);
+        }
+        else if (!strcmp(a->argv[i], "--livemigrationtarget"))
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (!strcmp(a->argv[i], "on"))
+                fLiveMigrationTarget = 1;
+            else if (!strcmp(a->argv[i], "off"))
+                fLiveMigrationTarget = 0;
+            else
+                return errorArgument("Invalid --livemigrationtarget value '%s'", a->argv[i]);
+        }
+        else if (!strcmp(a->argv[i], "--livemigrationport"))
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            int vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uLiveMigrationPort);
+            if (vrc != VINF_SUCCESS)
+                return errorArgument("Invalid --livemigrationport value '%s'", a->argv[i]);
+        }
+        else if (!strcmp(a->argv[i], "--livemigrationpassword"))
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            pszLiveMigrationPassword = a->argv[i];
         }
         else
@@ -903,4 +934,8 @@
         if (name)
             CHECK_ERROR(machine, COMSETTER(Name)(name));
+/** @todo r=bird: What's the story on not reporting error some places
+ *        (CHECK_ERROR) and immediately returning in other cases
+ *        (CHECK_ERROR_RET)?  If there is a logic, a comment why would be
+ *        nice... */
         if (ostype)
         {
@@ -2091,4 +2126,14 @@
         }
 
+        /*
+         * Live Migration.
+         */
+        if (pszLiveMigrationPassword)
+            CHECK_ERROR_RET(machine, COMSETTER(LiveMigrationPassword)(Bstr(pszLiveMigrationPassword)), 1);
+        if (uLiveMigrationPort != UINT32_MAX)
+            CHECK_ERROR_RET(machine, COMSETTER(LiveMigrationPort)(uLiveMigrationPort), 1);
+        if (fLiveMigrationTarget != -1)
+            CHECK_ERROR_RET(machine, COMSETTER(LiveMigrationTarget)(fLiveMigrationTarget), 1);
+
         /* commit changes */
         CHECK_ERROR(machine, SaveSettings());
