Index: /trunk/include/VBox/VMMDev.h
===================================================================
--- /trunk/include/VBox/VMMDev.h	(revision 31240)
+++ /trunk/include/VBox/VMMDev.h	(revision 31241)
@@ -589,6 +589,7 @@
 typedef struct VBoxGuestInfo
 {
-    /** The VMMDev interface version expected by additions. */
-    uint32_t additionsVersion;
+    /** The VMMDev interface version expected by additions.
+      * *Deprecated*, do not use anymore! Will be removed. */
+    uint32_t interfaceVersion;
     /** Guest OS type. */
     VBOXOSTYPE osType;
@@ -628,8 +629,8 @@
     /** Feature mask, currently unused. */
     uint32_t additionsFeatures;
-    /** some additional information, for example 'Beta 1' or something like that */
+    /** Some additional information, for example 'Beta 1' or something like that. */
     char     szName[128];
 } VBoxGuestInfo2;
-
+AssertCompileSize(VBoxGuestInfo2, 144);
 
 /**
Index: /trunk/include/VBox/pdmifs.h
===================================================================
--- /trunk/include/VBox/pdmifs.h	(revision 31240)
+++ /trunk/include/VBox/pdmifs.h	(revision 31241)
@@ -2112,4 +2112,14 @@
 
     /**
+     * Reports the detailed Guest Additions version.
+     * Called whenever the Additions issue a guest version report request or the VM is reset.
+     *
+     * @param   pInterface          Pointer to this interface.
+     * @param   guestInfo           Pointer to Guest Additions information structure.
+	 * @thread  The emulation thread.
+ 	 */
+    DECLR3CALLBACKMEMBER(void, pfnUpdateGuestInfo2,(PPDMIVMMDEVCONNECTOR pInterface, const struct VBoxGuestInfo2 *pGuestInfo));
+
+    /**
      * Update the guest additions capabilities.
      * This is called when the guest additions capabilities change. The new capabilities
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp	(revision 31240)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp	(revision 31241)
@@ -204,5 +204,5 @@
     if (RT_SUCCESS(rc))
     {
-        pReq->guestInfo.additionsVersion = VMMDEV_VERSION;
+        pReq->guestInfo.interfaceVersion = VMMDEV_VERSION;
 
         /* we've already determined the Windows product before */
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 31240)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 31241)
@@ -270,5 +270,5 @@
     if (RT_SUCCESS(rc))
     {
-        pReq->guestInfo.additionsVersion = VMMDEV_VERSION;
+        pReq->guestInfo.interfaceVersion = VMMDEV_VERSION;
         pReq->guestInfo.osType = enmOSType;
         rc = VbglGRPerform(&pReq->header);
Index: /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
===================================================================
--- /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 31240)
+++ /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 31241)
@@ -59,21 +59,21 @@
 #define VMMDEVSTATE_2_DEVINS(pVMMDevState)         ( (pVMMDevState)->pDevIns )
 
-#define VBOX_GUEST_ADDITIONS_VERSION_1_03(s) \
-    (   RT_HIWORD((s)->guestInfo.additionsVersion) == 1 \
-     && RT_LOWORD((s)->guestInfo.additionsVersion) == 3 )
-
-#define VBOX_GUEST_ADDITIONS_VERSION_OK(additionsVersion) \
+#define VBOX_GUEST_INTERFACE_VERSION_1_03(s) \
+    (   RT_HIWORD((s)->guestInfo.interfaceVersion) == 1 \
+     && RT_LOWORD((s)->guestInfo.interfaceVersion) == 3 )
+
+#define VBOX_GUEST_INTERFACE_VERSION_OK(additionsVersion) \
       (   RT_HIWORD(additionsVersion) == RT_HIWORD(VMMDEV_VERSION) \
        && RT_LOWORD(additionsVersion) <= RT_LOWORD(VMMDEV_VERSION) )
 
-#define VBOX_GUEST_ADDITIONS_VERSION_OLD(additionsVersion) \
+#define VBOX_GUEST_INTERFACE_VERSION_OLD(additionsVersion) \
       (   (RT_HIWORD(additionsVersion) < RT_HIWORD(VMMDEV_VERSION) \
        || (   RT_HIWORD(additionsVersion) == RT_HIWORD(VMMDEV_VERSION) \
            && RT_LOWORD(additionsVersion) <= RT_LOWORD(VMMDEV_VERSION) ) )
 
-#define VBOX_GUEST_ADDITIONS_VERSION_TOO_OLD(additionsVersion) \
+#define VBOX_GUEST_INTERFACE_VERSION_TOO_OLD(additionsVersion) \
       ( RT_HIWORD(additionsVersion) < RT_HIWORD(VMMDEV_VERSION) )
 
-#define VBOX_GUEST_ADDITIONS_VERSION_NEW(additionsVersion) \
+#define VBOX_GUEST_INTERFACE_VERSION_NEW(additionsVersion) \
       (   RT_HIWORD(additionsVersion) > RT_HIWORD(VMMDEV_VERSION) \
        || (   RT_HIWORD(additionsVersion) == RT_HIWORD(VMMDEV_VERSION) \
@@ -185,5 +185,5 @@
     Log3(("VMMDevNotifyGuest_EMT: u32EventMask = 0x%08X.\n", u32EventMask));
 
-    if (VBOX_GUEST_ADDITIONS_VERSION_1_03 (pVMMDevState))
+    if (VBOX_GUEST_INTERFACE_VERSION_1_03 (pVMMDevState))
     {
         Log3(("VMMDevNotifyGuest_EMT: Old additions detected.\n"));
@@ -487,8 +487,8 @@
 
                     /* Check additions version */
-                    pThis->fu32AdditionsOk = VBOX_GUEST_ADDITIONS_VERSION_OK(pThis->guestInfo.additionsVersion);
+                    pThis->fu32AdditionsOk = VBOX_GUEST_INTERFACE_VERSION_OK(pThis->guestInfo.interfaceVersion);
 
                     LogRel(("Guest Additions information report: Interface = 0x%08X osType = 0x%08X\n",
-                            pThis->guestInfo.additionsVersion,
+                            pThis->guestInfo.interfaceVersion,
                             pThis->guestInfo.osType));
                     pThis->pDrv->pfnUpdateGuestInfo(pThis->pDrv, &pThis->guestInfo);
@@ -516,8 +516,10 @@
             else
             {
-                VBoxGuestInfo2 *guestInfo2 = &((VMMDevReportGuestInfo2*)pRequestHeader)->guestInfo;
+                VBoxGuestInfo2 *pGuestInfo2 = &((VMMDevReportGuestInfo2*)pRequestHeader)->guestInfo;
+                AssertPtr(pGuestInfo2);
                 LogRel(("Guest Additions information report: Version %d.%d.%d r%d '%.*s'\n",
-                        guestInfo2->additionsMajor, guestInfo2->additionsMinor, guestInfo2->additionsBuild,
-                        guestInfo2->additionsRevision, sizeof(guestInfo2->szName), guestInfo2->szName));
+                        pGuestInfo2->additionsMajor, pGuestInfo2->additionsMinor, pGuestInfo2->additionsBuild,
+                        pGuestInfo2->additionsRevision, sizeof(pGuestInfo2->szName), pGuestInfo2->szName));
+                pThis->pDrv->pfnUpdateGuestInfo2(pThis->pDrv, pGuestInfo2);
                 pRequestHeader->rc = VINF_SUCCESS;
             }
@@ -1123,5 +1125,5 @@
             else
             {
-                if (VBOX_GUEST_ADDITIONS_VERSION_1_03 (pThis))
+                if (VBOX_GUEST_INTERFACE_VERSION_1_03 (pThis))
                 {
                     vmmdevSetIRQ_Legacy_EMT (pThis);
@@ -2603,5 +2605,5 @@
     {
         LogRel(("Guest Additions information report: additionsVersion = 0x%08X, osType = 0x%08X\n",
-                pThis->guestInfo.additionsVersion,
+                pThis->guestInfo.interfaceVersion,
                 pThis->guestInfo.osType));
         if (pThis->pDrv)
@@ -2692,9 +2694,9 @@
     /* Reset means that additions will report again. */
     const bool fVersionChanged = pThis->fu32AdditionsOk
-                              || pThis->guestInfo.additionsVersion
+                              || pThis->guestInfo.interfaceVersion
                               || pThis->guestInfo.osType != VBOXOSTYPE_Unknown;
     if (fVersionChanged)
         Log(("vmmdevReset: fu32AdditionsOk=%d additionsVersion=%x osType=%#x\n",
-             pThis->fu32AdditionsOk, pThis->guestInfo.additionsVersion, pThis->guestInfo.osType));
+             pThis->fu32AdditionsOk, pThis->guestInfo.interfaceVersion, pThis->guestInfo.osType));
     pThis->fu32AdditionsOk = false;
     memset (&pThis->guestInfo, 0, sizeof (pThis->guestInfo));
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMInformationDlg.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMInformationDlg.cpp	(revision 31240)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMInformationDlg.cpp	(revision 31241)
@@ -467,17 +467,6 @@
             VBoxGlobal::tr ("Enabled", "details report (Nested Paging)") :
             VBoxGlobal::tr ("Disabled", "details report (Nested Paging)");
-        QString addVersion = m.GetGuestPropertyValue("/VirtualBox/GuestAdd/Version");
-        QString addRevision = m.GetGuestPropertyValue("/VirtualBox/GuestAdd/Revision");
-        QString addVersionStr;
-        if (!addVersion.isEmpty() && !addRevision.isEmpty())
-        {
-            QString addInfo = console.GetGuest().GetAdditionsVersion();
-            addVersionStr = (addInfo.isEmpty() ? "(" : "")
-                          + addVersion
-                          + " r"
-                          + m.GetGuestPropertyValue("/VirtualBox/GuestAdd/Revision")
-                          + (addInfo.isEmpty() ? ")" : "");
-        }
-        else
+        QString addVersionStr = console.GetGuest().GetAdditionsVersion();
+        if (addVersionStr.isEmpty())
             addVersionStr = tr ("Not Detected", "guest additions");
         QString osType = console.GetGuest().GetOSTypeId();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp	(revision 31240)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp	(revision 31241)
@@ -825,26 +825,7 @@
     sltCheckRequestedModes();
 
-    /* Check the GA version only in case of additions are active: */
-    if (!fIsAdditionsActive)
-        return;
-    /* Check the Guest Additions version and warn the user about possible compatibility issues in case if the installed version is outdated. */
-    CGuest guest = session().GetConsole().GetGuest();
-    QString strVersion = guest.GetAdditionsVersion();
-    uint uVersion = strVersion.toUInt();
-    /** @todo r=bird: This isn't want we want! We want the VirtualBox version of the additions, all three numbers. See @bugref{4084}.*/
-    QString strRealVersion = QString("%1.%2").arg(RT_HIWORD(uVersion)).arg(RT_LOWORD(uVersion));
-    QString strExpectedVersion = QString("%1.%2").arg(VMMDEV_VERSION_MAJOR).arg(VMMDEV_VERSION_MINOR);
-    if (RT_HIWORD(uVersion) < VMMDEV_VERSION_MAJOR)
-    {
-        vboxProblem().warnAboutTooOldAdditions(0, strRealVersion, strExpectedVersion);
-    }
-    else if (RT_HIWORD(uVersion) == VMMDEV_VERSION_MAJOR && RT_LOWORD(uVersion) <  VMMDEV_VERSION_MINOR)
-    {
-        vboxProblem().warnAboutOldAdditions(0, strRealVersion, strExpectedVersion);
-    }
-    else if (uVersion > VMMDEV_VERSION)
-    {
-        vboxProblem().warnAboutNewAdditions(0, strRealVersion, strExpectedVersion);
-    }
+    /* A check whether the installed Guest Additions on the guest are up-to-date is now
+     * performed by the Guest Additions itself (via VBoxTray/VBoxClient), so no need to
+     * do something here anymore. */
 }
 
Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 31240)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 31241)
@@ -4671,4 +4671,9 @@
 /**
  * @note Locks this object for reading.
+ *       This notification only is for reporting an incompatible
+ *       Guest Additions interface, *not* the Guest Additions version!
+ *
+ *       The user will be notified inside the guest if new Guest
+ *       Additions are available (via VBoxTray/VBoxClient).
  */
 void Console::onAdditionsOutdated()
@@ -4678,10 +4683,4 @@
 
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
-
-    /** @todo Use the On-Screen Display feature to report the fact.
-     * The user should be told to install additions that are
-     * provided with the current VBox build:
-     * VBOX_VERSION_MAJOR.VBOX_VERSION_MINOR.VBOX_VERSION_BUILD
-     */
 }
 
Index: /trunk/src/VBox/Main/GuestImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/GuestImpl.cpp	(revision 31240)
+++ /trunk/src/VBox/Main/GuestImpl.cpp	(revision 31241)
@@ -1441,10 +1441,10 @@
 /**
  * Sets the general Guest Additions information like
- * API version and OS type.
+ * API (interface) version and OS type.
  *
- * @param aVersion
+ * @param aInterfaceVersion
  * @param aOsType
  */
-void Guest::setAdditionsInfo(Bstr aVersion, VBOXOSTYPE aOsType)
+void Guest::setAdditionsInfo(Bstr aInterfaceVersion, VBOXOSTYPE aOsType)
 {
     AutoCaller autoCaller(this);
@@ -1454,8 +1454,8 @@
 
     /*
-     * Set the Guest Additions API (interface) version.
-     * Note that this is *not* the actual Guest Additions version and may differ!
+     * Note: The Guest Additions API (interface) version is deprecated
+     * and will not be used anymore!
      */
-    mData.mAdditionsVersion = aVersion;
+
     /*
      * Older Additions rely on the Additions API version whether they
@@ -1463,5 +1463,5 @@
      * this immediately.
      */
-    mData.mAdditionsActive = !aVersion.isEmpty();
+    mData.mAdditionsActive = !aInterfaceVersion.isEmpty();
     /*
      * Older Additions didn't have this finer grained capability bit,
@@ -1478,4 +1478,20 @@
 
     mData.mOSTypeId = Global::OSTypeId (aOsType);
+}
+
+/**
+ * Sets the Guest Additions version information details.
+ *
+ * @param aAdditionsVersion
+ * @param aVersionName
+ */
+void Guest::setAdditionsInfo2(Bstr aAdditionsVersion, Bstr aVersionName)
+{
+    AutoCaller autoCaller(this);
+    AssertComRCReturnVoid (autoCaller.rc());
+
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    mData.mAdditionsVersion = aAdditionsVersion;
 }
 
@@ -1487,5 +1503,5 @@
  * @param ulFlags
  */
-void Guest::setAdditionsStatus (VBoxGuestStatusFacility Facility, VBoxGuestStatusCurrent Status, ULONG ulFlags)
+void Guest::setAdditionsStatus(VBoxGuestStatusFacility Facility, VBoxGuestStatusCurrent Status, ULONG ulFlags)
 {
     AutoCaller autoCaller(this);
@@ -1507,5 +1523,5 @@
  * @param ulActive
  */
-void Guest::setSupportedFeatures (ULONG64 ulCaps, ULONG64 ulActive)
+void Guest::setSupportedFeatures(ULONG64 ulCaps, ULONG64 ulActive)
 {
     AutoCaller autoCaller(this);
Index: /trunk/src/VBox/Main/VMMDevInterface.cpp
===================================================================
--- /trunk/src/VBox/Main/VMMDevInterface.cpp	(revision 31240)
+++ /trunk/src/VBox/Main/VMMDevInterface.cpp	(revision 31241)
@@ -189,5 +189,5 @@
  *
  * @param   pInterface          Pointer to this interface.
- * @param   guestInfo           Pointer to guest information structure
+ * @param   guestInfo           Pointer to guest information structure.
  * @thread  The emulation thread.
  */
@@ -200,5 +200,5 @@
         return;
 
-    /* Store that information in IGuest */
+    /* Store that information in IGuest. */
     Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
     Assert(guest);
@@ -206,8 +206,8 @@
         return;
 
-    if (guestInfo->additionsVersion != 0)
-    {
-        char version[20];
-        RTStrPrintf(version, sizeof(version), "%d", guestInfo->additionsVersion);
+    if (guestInfo->interfaceVersion != 0)
+    {
+        char version[16];
+        RTStrPrintf(version, sizeof(version), "%d", guestInfo->interfaceVersion);
         guest->setAdditionsInfo(Bstr(version), guestInfo->osType);
 
@@ -218,5 +218,5 @@
         pDrv->pVMMDev->getParent()->onAdditionsStateChange();
 
-        if (guestInfo->additionsVersion < VMMDEV_VERSION)
+        if (guestInfo->interfaceVersion < VMMDEV_VERSION)
             pDrv->pVMMDev->getParent()->onAdditionsOutdated();
     }
@@ -227,8 +227,58 @@
          * or driver unload.
          */
-        guest->setAdditionsInfo(Bstr(), guestInfo->osType);
+        guest->setAdditionsInfo(Bstr(), guestInfo->osType); /* Clear interface version + OS type. */
+        guest->setAdditionsInfo2(Bstr(), Bstr()); /* Clear Guest Additions version. */
         guest->setAdditionsStatus(VBoxGuestStatusFacility_Unknown,
                                   VBoxGuestStatusCurrent_Disabled,
                                   0); /* Flags; not used. */
+        pDrv->pVMMDev->getParent()->onAdditionsStateChange();
+    }
+}
+
+/**
+ * Reports the detailed Guest Additions version.
+ * Called whenever the Additions issue a guest version report request or the VM is reset.
+ *
+ * @param   pInterface          Pointer to this interface.
+ * @param   guestInfo           Pointer to Guest Additions information structure.
+ * @thread  The emulation thread.
+ */
+DECLCALLBACK(void) vmmdevUpdateGuestInfo2(PPDMIVMMDEVCONNECTOR pInterface, const VBoxGuestInfo2 *guestInfo)
+{
+    PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
+
+    Assert(guestInfo);
+    if (!guestInfo)
+        return;
+
+    /* Store that information in IGuest. */
+    Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
+    Assert(guest);
+    if (!guest)
+        return;
+
+    if (   guestInfo->additionsMajor    != 0
+        && guestInfo->additionsRevision != 0)
+    {
+        char version[32];
+        RTStrPrintf(version, sizeof(version), "%d.%d.%dr%ld", guestInfo->additionsMajor,
+                                                              guestInfo->additionsMinor,
+                                                              guestInfo->additionsBuild,
+                                                              guestInfo->additionsRevision);
+        guest->setAdditionsInfo2(Bstr(version), Bstr(guestInfo->szName));
+
+        /*
+         * Tell the console interface about the event
+         * so that it can notify its consumers.
+         */
+        pDrv->pVMMDev->getParent()->onAdditionsStateChange();
+    }
+    else
+    {
+        /*
+         * The guest additions was disabled because of a reset
+         * or driver unload.
+         */
+        guest->setAdditionsInfo2(Bstr(), Bstr());
         pDrv->pVMMDev->getParent()->onAdditionsStateChange();
     }
@@ -796,4 +846,5 @@
     pData->Connector.pfnUpdateGuestStatus             = vmmdevUpdateGuestStatus;
     pData->Connector.pfnUpdateGuestInfo               = vmmdevUpdateGuestInfo;
+    pData->Connector.pfnUpdateGuestInfo2              = vmmdevUpdateGuestInfo2;
     pData->Connector.pfnUpdateGuestCapabilities       = vmmdevUpdateGuestCapabilities;
     pData->Connector.pfnUpdateMouseCapabilities       = vmmdevUpdateMouseCapabilities;
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 31240)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 31241)
@@ -7772,9 +7772,7 @@
     <attribute name="additionsVersion" type="wstring" readonly="yes">
       <desc>
-        Version of the Guest Additions (3 decimal numbers separated
-        by dots) or empty when the Additions are not installed. The
-        Additions may also report a version but yet not be active as
-        the version might be refused by VirtualBox (incompatible) or
-        other failures occurred.
+        Version of the Guest Additions including the revision (3 decimal numbers
+        separated by dots + revision number) installed on the guest or empty
+        when the Additions are not installed.
       </desc>
     </attribute>
Index: /trunk/src/VBox/Main/include/GuestImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestImpl.h	(revision 31240)
+++ /trunk/src/VBox/Main/include/GuestImpl.h	(revision 31241)
@@ -80,10 +80,6 @@
 #endif
     STDMETHOD(COMGETTER(AdditionsActive)) (BOOL *aAdditionsActive);
-#if 0
-    /** @todo Will replace AdditionsVersion to be more clear. */
-    STDMETHOD(COMGETTER(AdditionsAPIVersion)) (BSTR *aAdditionsVersion);
-#endif
     STDMETHOD(COMGETTER(AdditionsVersion)) (BSTR *aAdditionsVersion);
-    /** @todo Remove */
+    /** @todo Remove later by replacing it by AdditionsFeatureAvailable(). */
     STDMETHOD(COMGETTER(SupportsSeamless)) (BOOL *aSupportsSeamless);
     STDMETHOD(COMGETTER(SupportsGraphics)) (BOOL *aSupportsGraphics);
@@ -113,5 +109,6 @@
 
     // Public methods that are not in IDL (only called internally).
-    void setAdditionsInfo(Bstr aVersion, VBOXOSTYPE aOsType);
+    void setAdditionsInfo(Bstr aInterfaceVersion, VBOXOSTYPE aOsType);
+    void setAdditionsInfo2(Bstr aAdditionsVersion, Bstr aVersionName);
     void setAdditionsStatus(VBoxGuestStatusFacility Facility, VBoxGuestStatusCurrent Status, ULONG ulFlags);
     void setSupportedFeatures(ULONG64 ulCaps, ULONG64 ulActive);
