Index: trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 47105)
+++ trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 47106)
@@ -726,4 +726,6 @@
 
     ConsoleVRDPServer * const mConsoleVRDPServer;
+    bool mfVRDEChangeInProcess;
+    bool mfVRDEChangePending;
 
     const ComObjPtr<Guest> mGuest;
Index: trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 47105)
+++ trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 47106)
@@ -370,4 +370,6 @@
     : mSavedStateDataLoaded(false)
     , mConsoleVRDPServer(NULL)
+    , mfVRDEChangeInProcess(false)
+    , mfVRDEChangePending(false)
     , mpUVM(NULL)
     , mVMCallers(0)
@@ -4846,42 +4848,56 @@
     if (ptrVM.isOk())
     {
-        if (    mVRDEServer
-            &&  (   mMachineState == MachineState_Running
-                 || mMachineState == MachineState_Teleporting
-                 || mMachineState == MachineState_LiveSnapshotting
-                 || mMachineState == MachineState_Paused
-                 )
-           )
-        {
-            BOOL vrdpEnabled = FALSE;
-
-            rc = mVRDEServer->COMGETTER(Enabled)(&vrdpEnabled);
-            ComAssertComRCRetRC(rc);
-
-            if (aRestart)
-            {
-                /* VRDP server may call this Console object back from other threads (VRDP INPUT or OUTPUT). */
-                alock.release();
-
-                if (vrdpEnabled)
+        /* Serialize. */
+        if (mfVRDEChangeInProcess)
+            mfVRDEChangePending = true;
+        else
+        {
+            do {
+                mfVRDEChangeInProcess = true;
+                mfVRDEChangePending = false;
+
+                if (    mVRDEServer
+                    &&  (   mMachineState == MachineState_Running
+                         || mMachineState == MachineState_Teleporting
+                         || mMachineState == MachineState_LiveSnapshotting
+                         || mMachineState == MachineState_Paused
+                         )
+                   )
                 {
-                    // If there was no VRDP server started the 'stop' will do nothing.
-                    // However if a server was started and this notification was called,
-                    // we have to restart the server.
-                    mConsoleVRDPServer->Stop();
-
-                    if (RT_FAILURE(mConsoleVRDPServer->Launch()))
-                        rc = E_FAIL;
-                    else
-                        mConsoleVRDPServer->EnableConnections();
+                    BOOL vrdpEnabled = FALSE;
+
+                    rc = mVRDEServer->COMGETTER(Enabled)(&vrdpEnabled);
+                    ComAssertComRCRetRC(rc);
+
+                    if (aRestart)
+                    {
+                        /* VRDP server may call this Console object back from other threads (VRDP INPUT or OUTPUT). */
+                        alock.release();
+
+                        if (vrdpEnabled)
+                        {
+                            // If there was no VRDP server started the 'stop' will do nothing.
+                            // However if a server was started and this notification was called,
+                            // we have to restart the server.
+                            mConsoleVRDPServer->Stop();
+
+                            if (RT_FAILURE(mConsoleVRDPServer->Launch()))
+                                rc = E_FAIL;
+                            else
+                                mConsoleVRDPServer->EnableConnections();
+                        }
+                        else
+                            mConsoleVRDPServer->Stop();
+
+                        alock.acquire();
+                    }
                 }
                 else
-                    mConsoleVRDPServer->Stop();
-
-                alock.acquire();
-            }
-        }
-        else
-            rc = setInvalidMachineStateError();
+                    rc = setInvalidMachineStateError();
+
+                mfVRDEChangeInProcess = false;
+            } while (mfVRDEChangePending && SUCCEEDED(rc));
+        }
+
         ptrVM.release();
     }
