Index: /trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h	(revision 42484)
+++ /trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h	(revision 42485)
@@ -37,4 +37,7 @@
 #endif
 
+#ifdef LOG_GROUP
+ #undef LOG_GROUP
+#endif
 #define LOG_GROUP LOG_GROUP_GUEST_CONTROL
 #include <VBox/log.h>
Index: /trunk/src/VBox/Main/include/GuestSessionImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestSessionImpl.h	(revision 42484)
+++ /trunk/src/VBox/Main/include/GuestSessionImpl.h	(revision 42485)
@@ -140,7 +140,7 @@
     struct Data
     {
-        /** Guest control protocol version.
-         *  Guest control prior to VBox 4.2 has version 1,
-         *  guest control 2.0 has ...well, 2. */
+        /** Guest control protocol version to be used.
+         *  Guest Additions < VBox 4.2 have version 1,
+         *  any newer version will have version 2. */
         uint32_t             mProtocolVersion;
         /** Flag indicating if this is an internal session
@@ -157,7 +157,14 @@
         /** The session timeout. Default is 30s. */
         ULONG                mTimeout;
+        /** The next process ID for assignment. */
+        ULONG                mNextProcessID;
+        /** The session's environment block. Can be
+         *  overwritten/extended by ProcessCreate(Ex). */
         GuestEnvironment     mEnvironment;
+        /** Directory objects bound to this session. */
         SessionDirectories   mDirectories;
+        /** File objects bound to this session. */
         SessionFiles         mFiles;
+        /** Process objects bound to this session. */
         SessionProcesses     mProcesses;
     } mData;
Index: /trunk/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestCtrlPrivate.cpp	(revision 42484)
+++ /trunk/src/VBox/Main/src-client/GuestCtrlPrivate.cpp	(revision 42485)
@@ -150,5 +150,4 @@
     Assert((pvData == NULL) && !cbData);
 
-    int rc = VINF_SUCCESS;
     switch (enmType)
     {
@@ -185,10 +184,7 @@
     }
 
+    int rc = GuestCtrlEvent::Init();
     if (RT_SUCCESS(rc))
-    {
-        rc = GuestCtrlEvent::Init();
-        if (RT_SUCCESS(rc))
-            mType  = enmType;
-    }
+        mType  = enmType;
 
     LogFlowFuncLeaveRC(rc);
Index: /trunk/src/VBox/Main/src-client/GuestProcessImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestProcessImpl.cpp	(revision 42484)
+++ /trunk/src/VBox/Main/src-client/GuestProcessImpl.cpp	(revision 42485)
@@ -318,15 +318,19 @@
     /* Create a new context ID and assign it. */
     int rc = VERR_NOT_FOUND;
+
+    ULONG uCount = mData.mNextContextID++;
     ULONG uNewContextID = 0;
     ULONG uTries = 0;
     for (;;)
     {
+        if (uCount == VBOX_GUESTCTRL_MAX_CONTEXTS)
+            uCount = 0;
+
         /* Create a new context ID ... */
         uNewContextID = VBOX_GUESTCTRL_CONTEXTID_MAKE(uSessionID,
-                                                      mData.mProcessID, mData.mNextContextID);
-        if (mData.mNextContextID == VBOX_GUESTCTRL_MAX_CONTEXTS)
-            mData.mNextContextID = 0;
+                                                      mData.mProcessID, uCount);
+
         /* Is the context ID already used?  Try next ID ... */
-        if (!callbackExists(uNewContextID))
+        if (!callbackExists(uCount))
         {
             /* Callback with context ID was not found. This means
@@ -336,6 +340,6 @@
             break;
         }
-        mData.mNextContextID++;
-
+
+        uCount++;
         if (++uTries == UINT32_MAX)
             break; /* Don't try too hard. */
@@ -348,5 +352,5 @@
          *       the session + process ID), just the context count
          *       will be used here. */
-        mData.mCallbacks[mData.mNextContextID] = pCallback;
+        mData.mCallbacks[uCount] = pCallback;
         Assert(mData.mCallbacks.size());
 
@@ -356,5 +360,5 @@
 
         LogFlowThisFunc(("Added new callback (Session: %RU32, Process: %RU32, Count=%RU32) CID=%RU32\n",
-                     uSessionID, mData.mProcessID, mData.mNextContextID, uNewContextID));
+                     uSessionID, mData.mProcessID, uCount, uNewContextID));
     }
 
@@ -784,5 +788,8 @@
     {
         if (pData->pvData && pData->cbData)
+        {
             rc = pCallback->FillData(pData->pvData, pData->cbData);
+            Assert(pCallback->GetPayloadSize() == pData->cbData);
+        }
 
         int rc2 = pCallback->Signal();
Index: /trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp	(revision 42484)
+++ /trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp	(revision 42485)
@@ -76,4 +76,6 @@
     mData.mName = aName;
 
+    mData.mNextProcessID = 0;
+
     /* Confirm a successful initialization when it's the case. */
     autoInitSpan.setSucceeded();
@@ -482,5 +484,4 @@
 
     /* Create a new (host-based) process ID and assign it. */
-    ULONG uNewProcessID = 0;
     ULONG uTries = 0;
 
@@ -488,5 +489,5 @@
     {
         /* Is the context ID already used? */
-        if (!processExists(uNewProcessID, NULL /* pProgress */))
+        if (!processExists(mData.mNextProcessID, NULL /* pProgress */))
         {
             /* Callback with context ID was not found. This means
@@ -496,5 +497,7 @@
             break;
         }
-        uNewProcessID++;
+        mData.mNextProcessID++;
+        if (mData.mNextProcessID == UINT32_MAX)
+            mData.mNextProcessID = 0;
 
         if (++uTries == UINT32_MAX)
@@ -510,12 +513,12 @@
 
         rc = pProcess->init(mData.mParent->getConsole() /* Console */, this /* Session */,
-                            uNewProcessID, procInfo);
+                            mData.mNextProcessID, procInfo);
         if (RT_FAILURE(rc)) throw rc;
 
         /* Add the created process to our map. */
-        mData.mProcesses[uNewProcessID] = pProcess;
+        mData.mProcesses[mData.mNextProcessID] = pProcess;
 
         LogFlowFunc(("Added new process (Session: %RU32) with process ID=%RU32\n",
-                     mData.mId, uNewProcessID));
+                     mData.mId, mData.mNextProcessID));
     }
     catch (int rc2)
