Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp	(revision 100173)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp	(revision 100174)
@@ -51,4 +51,5 @@
 #include "CPerformanceCollector.h"
 #include "CPerformanceMetric.h"
+#include <iprt/string.h>
 
 /* External includes: */
@@ -1237,5 +1238,5 @@
 void UIVMActivityMonitor::sltGuestAdditionsStateChange()
 {
-    bool fGuestAdditionsAvailable = guestAdditionsAvailable(6 /* minimum major version */);
+    bool fGuestAdditionsAvailable = guestAdditionsAvailable("6.1");
     if (m_fGuestAdditionsAvailable == fGuestAdditionsAvailable)
         return;
@@ -1311,23 +1312,14 @@
 }
 
-bool UIVMActivityMonitor::guestAdditionsAvailable(int iMinimumMajorVersion)
-{
-    if (m_comGuest.isNull())
+bool UIVMActivityMonitor::guestAdditionsAvailable(const char *pszMinimumVersion)
+{
+    if (m_comGuest.isNull() || !pszMinimumVersion)
         return false;
     bool fGuestAdditionsStatus = m_comGuest.GetAdditionsStatus(m_comGuest.GetAdditionsRunLevel());
-    if (fGuestAdditionsStatus)
-    {
-#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
-        QStringList versionStrings = m_comGuest.GetAdditionsVersion().split('.', Qt::SkipEmptyParts);
-#else
-        QStringList versionStrings = m_comGuest.GetAdditionsVersion().split('.', QString::SkipEmptyParts);
-#endif
-        if (!versionStrings.isEmpty())
-        {
-            bool fConvert = false;
-            int iMajorVersion = versionStrings[0].toInt(&fConvert);
-            if (fConvert && iMajorVersion >= iMinimumMajorVersion)
-                return true;
-        }
+    if (fGuestAdditionsStatus && m_comGuest.isOk())
+    {
+        QString strGAVersion = m_comGuest.GetAdditionsVersion();
+        if (m_comGuest.isOk())
+            return (RTStrVersionCompare(strGAVersion.toUtf8().constData(), pszMinimumVersion) >= 0);
     }
     return false;
@@ -1591,5 +1583,5 @@
         return;
 
-    m_fGuestAdditionsAvailable = guestAdditionsAvailable(6 /* minimum major version */);
+    m_fGuestAdditionsAvailable = guestAdditionsAvailable("6.1");
     enableDisableGuestAdditionDependedWidgets(m_fGuestAdditionsAvailable);
     if (m_pTimer)
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.h	(revision 100173)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.h	(revision 100174)
@@ -169,5 +169,5 @@
     void prepareMetrics();
     void prepareActions();
-    bool guestAdditionsAvailable(int iMinimumMajorVersion);
+    bool guestAdditionsAvailable(const char *pszMinimumVersion);
     void enableDisableGuestAdditionDependedWidgets(bool fEnable);
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.cpp	(revision 100173)
+++ trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.cpp	(revision 100174)
@@ -424,4 +424,5 @@
     , m_pGuestSessionWidget(0)
     , m_fIsCurrent(false)
+    , pszMinimumGuestAdditionVersion("6.1")
 {
     if (!m_comMachine.isNull())
@@ -484,5 +485,9 @@
                 break;
             case State_NoGuestAdditions:
-                strWarningText = UIFileManager::tr("File manager cannot work since the selected guest does not have the guest additions.");
+                strWarningText = UIFileManager::tr("File manager cannot work since no guest additions were detected.");
+                icon = UIIconPool::iconSet(":/status_error_16px.png");
+                break;
+            case State_GuestAdditionsTooOld:
+                strWarningText = UIFileManager::tr("File manager cannot work. The guest additions need to be updated.");
                 icon = UIIconPool::iconSet(":/status_error_16px.png");
                 break;
@@ -1293,9 +1298,22 @@
 }
 
-bool UIFileManagerGuestTable::isGuestAdditionsAvailable()
-{
-    if (m_comGuest.isNull())
-        return false;
-    return m_comGuest.GetAdditionsStatus(m_comGuest.GetAdditionsRunLevel());
+int UIFileManagerGuestTable::isGuestAdditionsAvailable(const char* pszMinimumVersion)
+{
+    if (m_comGuest.isNull() || !pszMinimumVersion)
+        return 0;
+    bool fGuestAdditionsStatus = m_comGuest.GetAdditionsStatus(m_comGuest.GetAdditionsRunLevel());
+    if (fGuestAdditionsStatus && m_comGuest.isOk())
+    {
+        QString strGAVersion = m_comGuest.GetAdditionsVersion();
+        if (m_comGuest.isOk())
+        {
+            int iCode = RTStrVersionCompare(strGAVersion.toUtf8().constData(), pszMinimumVersion);
+            if (iCode >= 0)
+                return 1;
+            else
+                return -1;
+        }
+    }
+    return 0;
 }
 
@@ -1396,36 +1414,41 @@
     setStateAndEnableWidgets();
 
-    if (m_comGuestSession.isOk())
-    {
-        emit sigLogOutput(QString("%1: %2").arg("Guest session status has changed").arg(gpConverter->toString(m_comGuestSession.GetStatus())),
-                  m_strTableName, FileManagerLogType_Info);
-
-        switch (m_comGuestSession.GetStatus())
-        {
-            case KGuestSessionStatus_Started:
+    if (m_comGuestSession.isNull())
+        emit sigLogOutput("Guest session is invalid!", m_strTableName, FileManagerLogType_Error);
+    else
+    {
+        if (m_comGuestSession.isOk())
+        {
+            emit sigLogOutput(QString("%1: %2").arg("Guest session status has changed").arg(gpConverter->toString(m_comGuestSession.GetStatus())),
+                              m_strTableName, FileManagerLogType_Info);
+
+            switch (m_comGuestSession.GetStatus())
             {
-                initFileTable();
-                break;
+                case KGuestSessionStatus_Started:
+                    {
+                        initFileTable();
+                        break;
+                    }
+                case KGuestSessionStatus_Terminating:
+                case KGuestSessionStatus_Terminated:
+                case KGuestSessionStatus_TimedOutKilled:
+                case KGuestSessionStatus_TimedOutAbnormally:
+                case KGuestSessionStatus_Down:
+                case KGuestSessionStatus_Error:
+                    {
+                        cleanupGuestSessionListener();
+                        closeGuestSession();
+                        break;
+                    }
+                case KGuestSessionStatus_Undefined:
+                case KGuestSessionStatus_Starting:
+                case KGuestSessionStatus_Max:
+                default:
+                    break;
             }
-            case KGuestSessionStatus_Terminating:
-            case KGuestSessionStatus_Terminated:
-            case KGuestSessionStatus_TimedOutKilled:
-            case KGuestSessionStatus_TimedOutAbnormally:
-            case KGuestSessionStatus_Down:
-            case KGuestSessionStatus_Error:
-            {
-                cleanupGuestSessionListener();
-                closeGuestSession();
-                break;
-            }
-            case KGuestSessionStatus_Undefined:
-            case KGuestSessionStatus_Starting:
-            case KGuestSessionStatus_Max:
-            default:
-                break;
-        }
-    }
-    else
-        emit sigLogOutput(UIErrorString::formatErrorInfo(m_comGuestSession), m_strTableName, FileManagerLogType_Error);
+        }
+        else
+            emit sigLogOutput(UIErrorString::formatErrorInfo(m_comGuestSession), m_strTableName, FileManagerLogType_Error);
+    }
 }
 
@@ -1459,9 +1482,17 @@
         return;
     }
-    if (!isGuestAdditionsAvailable())
+
+    int iGADetectCode = isGuestAdditionsAvailable(pszMinimumGuestAdditionVersion);
+    if (iGADetectCode == 0)
     {
         m_enmState = State_NoGuestAdditions;
         return;
     }
+    else if (iGADetectCode == -1)
+    {
+        m_enmState = State_GuestAdditionsTooOld;
+        return;
+    }
+
     if (!m_comGuestSession.isNull() && m_comGuestSession.GetStatus() == KGuestSessionStatus_Started)
     {
@@ -1538,7 +1569,17 @@
     }
 
-    if (!isGuestAdditionsAvailable())
-    {
-        emit sigLogOutput("Could not find Guest Additions", m_strTableName, FileManagerLogType_Error);
+    int iGADetectCode = isGuestAdditionsAvailable(pszMinimumGuestAdditionVersion);
+    if (iGADetectCode == 0)
+    {
+        emit sigLogOutput("Could not find Guest Additions",
+                          m_strTableName, FileManagerLogType_Error);
+        if (m_pGuestSessionWidget)
+            m_pGuestSessionWidget->markForError(true);
+        return false;
+    }
+    else if (iGADetectCode == -1)
+    {
+        emit sigLogOutput(QString("%1 %2").arg("The Guest Additions are older than ").arg(pszMinimumGuestAdditionVersion),
+                          m_strTableName, FileManagerLogType_Error);
         if (m_pGuestSessionWidget)
             m_pGuestSessionWidget->markForError(true);
Index: trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.h	(revision 100173)
+++ trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.h	(revision 100174)
@@ -121,4 +121,5 @@
         State_MachineNotRunning,
         State_NoGuestAdditions,
+        State_GuestAdditionsTooOld,
         State_SessionPossible,
         State_SessionRunning,
@@ -151,5 +152,6 @@
     bool openMachineSession();
     bool closeMachineSession();
-    bool isGuestAdditionsAvailable();
+    /* Return 0 if GA is not detected, -1 if it is there but older than @p pszMinimumGuestAdditionVersion, and 1 otherwise. */
+    int isGuestAdditionsAvailable(const char* pszMinimumVersion);
     void setStateAndEnableWidgets();
 
@@ -173,4 +175,5 @@
     bool m_fIsCurrent;
     State m_enmState;
+    const char *pszMinimumGuestAdditionVersion;
 };
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlInterface.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlInterface.cpp	(revision 100173)
+++ trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlInterface.cpp	(revision 100174)
@@ -585,5 +585,5 @@
 void UIGuestControlInterface::putCommand(const QString &strCommand)
 {
-    if (!isGuestAdditionsAvailable(m_comGuest))
+    if (!isGuestAdditionsAvailable(m_comGuest, "6.1"))
     {
         emit sigOutputString("No guest addtions detected. Guest control requires guest additions");
@@ -699,10 +699,18 @@
 
 /* static */
-bool UIGuestControlInterface::isGuestAdditionsAvailable(const CGuest &guest)
-{
-    if (!guest.isOk())
-        return false;
+bool UIGuestControlInterface::isGuestAdditionsAvailable(const CGuest &guest, const char *pszMinimumVersion)
+{
     CGuest guestNonConst = const_cast<CGuest&>(guest);
-    return guestNonConst.GetAdditionsStatus(guestNonConst.GetAdditionsRunLevel());
+
+    if (guestNonConst.isNull() || !pszMinimumVersion)
+        return false;
+    bool fGuestAdditionsStatus = guestNonConst.GetAdditionsStatus(guestNonConst.GetAdditionsRunLevel());
+    if (fGuestAdditionsStatus && guestNonConst.isOk())
+    {
+        QString strGAVersion = guestNonConst.GetAdditionsVersion();
+        if (guestNonConst.isOk())
+            return (RTStrVersionCompare(strGAVersion.toUtf8().constData(), pszMinimumVersion) >= 0);
+    }
+    return false;
 }
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlInterface.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlInterface.h	(revision 100173)
+++ trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlInterface.h	(revision 100174)
@@ -67,5 +67,5 @@
         /** Pass a non-const ref since for some reason CGuest::GetAdditionsStatus
             is non-const?! */
-       static bool    isGuestAdditionsAvailable(const CGuest &guest);
+       static bool    isGuestAdditionsAvailable(const CGuest &guest, const char *pszMinimumVersion);
        static QString getFsObjTypeString(KFsObjType type);
     /** @} */
