Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h	(revision 58311)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h	(revision 58312)
@@ -152,7 +152,15 @@
 public:
 
+    /** Proxy states. */
+    enum ProxyState
+    {
+        ProxyState_Disabled,
+        ProxyState_Enabled,
+        ProxyState_Auto
+    };
+
     /** Constructs object which parses passed @a strProxySettings. */
     UIProxyManager(const QString &strProxySettings = QString())
-        : m_fProxyEnabled(false)
+        : m_enmProxyState(ProxyState_Auto)
         , m_fAuthEnabled(false)
     {
@@ -164,5 +172,5 @@
         /* Parse proxy state, host and port: */
         if (proxySettings.size() > 0)
-            m_fProxyEnabled = proxySettings[0] == "proxyEnabled";
+            m_enmProxyState = proxyStateFromString(proxySettings[0]);
         if (proxySettings.size() > 1)
             m_strProxyHost = proxySettings[1];
@@ -184,9 +192,9 @@
         /* Serialize settings: */
         QString strResult;
-        if (m_fProxyEnabled || !m_strProxyHost.isEmpty() || !m_strProxyPort.isEmpty() ||
+        if (m_enmProxyState != ProxyState_Auto || !m_strProxyHost.isEmpty() || !m_strProxyPort.isEmpty() ||
             m_fAuthEnabled || !m_strAuthLogin.isEmpty() || !m_strAuthPassword.isEmpty())
         {
             QStringList proxySettings;
-            proxySettings << QString(m_fProxyEnabled ? "proxyEnabled" : "proxyDisabled");
+            proxySettings << proxyStateToString(m_enmProxyState);
             proxySettings << m_strProxyHost;
             proxySettings << m_strProxyPort;
@@ -199,6 +207,6 @@
     }
 
-    /** Returns whether the proxy is enabled. */
-    bool proxyEnabled() const { return m_fProxyEnabled; }
+    /** Returns the proxy state. */
+    ProxyState proxyState() const { return m_enmProxyState; }
     /** Returns the proxy host. */
     const QString& proxyHost() const { return m_strProxyHost; }
@@ -213,6 +221,6 @@
     const QString& authPassword() const { return m_strAuthPassword; }
 
-    /** Defines whether the proxy is @a fEnabled. */
-    void setProxyEnabled(bool fEnabled) { m_fProxyEnabled = fEnabled; }
+    /** Defines the proxy @a enmState. */
+    void setProxyState(ProxyState enmState) { m_enmProxyState = enmState; }
     /** Defines the proxy @a strHost. */
     void setProxyHost(const QString &strHost) { m_strProxyHost = strHost; }
@@ -229,6 +237,30 @@
 private:
 
-    /** Holds whether the proxy is enabled. */
-    bool m_fProxyEnabled;
+    /** Converts passed @a state to corresponding #QString. */
+    static QString proxyStateToString(ProxyState state)
+    {
+        switch (state)
+        {
+            case ProxyState_Disabled: return QString("ProxyDisabled");
+            case ProxyState_Enabled:  return QString("ProxyEnabled");
+            case ProxyState_Auto:     break;
+        }
+        return QString("ProxyAuto");
+    }
+
+    /** Converts passed @a strState to corresponding #ProxyState. */
+    static ProxyState proxyStateFromString(const QString &strState)
+    {
+        /* Compose the map of known states: */
+        QMap<QString, ProxyState> states;
+        states["ProxyDisabled"] = ProxyState_Disabled; // New since VBox 5.0
+        states["proxyEnabled"]  = ProxyState_Enabled;  // Old since VBox 4.1
+        states["ProxyEnabled"]  = ProxyState_Enabled;  // New since VBox 5.0
+        /* Return one of registered or 'Auto' by default: */
+        return states.value(strState, ProxyState_Auto);
+    }
+
+    /** Holds the proxy state. */
+    ProxyState m_enmProxyState;
     /** Holds the proxy host. */
     QString m_strProxyHost;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp	(revision 58311)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp	(revision 58312)
@@ -383,25 +383,24 @@
 
 #ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
-    /* Get the proxymanager: */
+    /* Get the proxy-manager: */
     UIProxyManager proxyManager(vboxGlobal().settings().proxySettings());
 
-    /* If the specific proxy settings aren't enabled, we'll use the
-       system default proxy.  Otherwise assume it's configured. */
-    if (proxyManager.proxyEnabled())
-        return RTHttpSetProxy(m_hHttp,
-                              proxyManager.proxyHost().toUtf8().constData(),
-                              proxyManager.proxyPort().toUInt(),
-                              NULL /* pszProxyUser */, NULL /* pszProxyPwd */);
-
-    /** @todo This should be some kind of tristate:
-     *      - system configured proxy ("proxyDisabled" as well as default "")
-     *      - user configured proxy ("proxyEnabled").
-     *      - user configured "no proxy" (currently missing).
-     * In the two last cases, call RTHttpSetProxy.
-     *
-     * Alternatively, we could opt not to give the user a way of doing "no proxy",
-     * that would require no real changes to the visible GUI... Just a thought.
-     */
-#endif
+    /* If the specific proxy settings are enabled, we'll use them
+     * unless user disabled that functionality manually. */
+    switch (proxyManager.proxyState())
+    {
+        case UIProxyManager::ProxyState_Enabled:
+            return RTHttpSetProxy(m_hHttp,
+                                  proxyManager.proxyHost().toUtf8().constData(),
+                                  proxyManager.proxyPort().toUInt(),
+                                  NULL /* pszProxyUser */, NULL /* pszProxyPwd */);
+        case UIProxyManager::ProxyState_Disabled:
+            return VINF_SUCCESS;
+        default:
+            break;
+    }
+#endif /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */
+
+    /* By default, use system proxy: */
     return RTHttpUseSystemProxySettings(m_hHttp);
 }
@@ -532,5 +531,5 @@
             if (RT_SUCCESS(rc))
             {
-                m_reply = QByteArray((char*)pvResponse, cbResponse);
+                m_reply = QByteArray((char*)pvResponse, (int)cbResponse);
                 RTHttpFreeResponse(pvResponse);
             }
@@ -559,5 +558,5 @@
             if (RT_SUCCESS(rc))
             {
-                m_reply = QByteArray((char*)pvResponse, cbResponse);
+                m_reply = QByteArray((char*)pvResponse, (int)cbResponse);
                 RTHttpFreeResponse(pvResponse);
             }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.cpp	(revision 58311)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.cpp	(revision 58312)
@@ -38,4 +38,8 @@
 
     /* Setup widgets: */
+    QButtonGroup *pButtonGroup = new QButtonGroup(this);
+    pButtonGroup->addButton(m_pRadioProxyAuto);
+    pButtonGroup->addButton(m_pRadioProxyDisabled);
+    pButtonGroup->addButton(m_pRadioProxyEnabled);
     m_pPortEditor->setFixedWidthByText(QString().fill('0', 6));
     m_pHostEditor->setValidator(new QRegExpValidator(QRegExp("\\S+"), m_pHostEditor));
@@ -43,5 +47,5 @@
 
     /* Setup connections: */
-    connect(m_pCheckboxProxy, SIGNAL(toggled(bool)), this, SLOT(sltProxyToggled()));
+    connect(pButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(sltProxyToggled()));
     connect(m_pHostEditor, SIGNAL(textEdited(const QString&)), this, SLOT(revalidate()));
     connect(m_pPortEditor, SIGNAL(textEdited(const QString&)), this, SLOT(revalidate()));
@@ -60,5 +64,5 @@
     /* Load to cache: */
     UIProxyManager proxyManager(m_settings.proxySettings());
-    m_cache.m_fProxyEnabled = proxyManager.proxyEnabled();
+    m_cache.m_enmProxyState = proxyManager.proxyState();
     m_cache.m_strProxyHost = proxyManager.proxyHost();
     m_cache.m_strProxyPort = proxyManager.proxyPort();
@@ -73,5 +77,10 @@
 {
     /* Fetch from cache: */
-    m_pCheckboxProxy->setChecked(m_cache.m_fProxyEnabled);
+    switch (m_cache.m_enmProxyState)
+    {
+        case UIProxyManager::ProxyState_Auto:     m_pRadioProxyAuto->setChecked(true); break;
+        case UIProxyManager::ProxyState_Disabled: m_pRadioProxyDisabled->setChecked(true); break;
+        case UIProxyManager::ProxyState_Enabled:  m_pRadioProxyEnabled->setChecked(true); break;
+    }
     m_pHostEditor->setText(m_cache.m_strProxyHost);
     m_pPortEditor->setText(m_cache.m_strProxyPort);
@@ -87,5 +96,7 @@
 {
     /* Upload to cache: */
-    m_cache.m_fProxyEnabled = m_pCheckboxProxy->isChecked();
+    m_cache.m_enmProxyState = m_pRadioProxyEnabled->isChecked()  ? UIProxyManager::ProxyState_Enabled :
+                              m_pRadioProxyDisabled->isChecked() ? UIProxyManager::ProxyState_Disabled :
+                                                                   UIProxyManager::ProxyState_Auto;
     m_cache.m_strProxyHost = m_pHostEditor->text();
     m_cache.m_strProxyPort = m_pPortEditor->text();
@@ -100,5 +111,5 @@
 
     UIProxyManager proxyManager;
-    proxyManager.setProxyEnabled(m_cache.m_fProxyEnabled);
+    proxyManager.setProxyState(m_cache.m_enmProxyState);
     proxyManager.setProxyHost(m_cache.m_strProxyHost);
     proxyManager.setProxyPort(m_cache.m_strProxyPort);
@@ -112,5 +123,5 @@
 {
     /* Pass if proxy is disabled: */
-    if (!m_pCheckboxProxy->isChecked())
+    if (!m_pRadioProxyEnabled->isChecked())
         return true;
 
@@ -146,6 +157,8 @@
 {
     /* Configure navigation: */
-    setTabOrder(pWidget, m_pCheckboxProxy);
-    setTabOrder(m_pCheckboxProxy, m_pHostEditor);
+    setTabOrder(pWidget, m_pRadioProxyAuto);
+    setTabOrder(m_pRadioProxyAuto, m_pRadioProxyDisabled);
+    setTabOrder(m_pRadioProxyDisabled, m_pRadioProxyEnabled);
+    setTabOrder(m_pRadioProxyEnabled, m_pHostEditor);
     setTabOrder(m_pHostEditor, m_pPortEditor);
 }
@@ -160,5 +173,5 @@
 {
     /* Update widgets availability: */
-    m_pContainerProxy->setEnabled(m_pCheckboxProxy->isChecked());
+    m_pContainerProxy->setEnabled(m_pRadioProxyEnabled->isChecked());
 
     /* Revalidate: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h	(revision 58311)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h	(revision 58312)
@@ -20,4 +20,5 @@
 
 /* Local includes */
+#include "VBoxUtils.h"
 #include "UISettingsPage.h"
 #include "UIGlobalSettingsProxy.gen.h"
@@ -27,7 +28,7 @@
 {
     UISettingsCacheGlobalProxy()
-        : m_fProxyEnabled(false)
+        : m_enmProxyState(UIProxyManager::ProxyState_Auto)
     {}
-    bool m_fProxyEnabled;
+    UIProxyManager::ProxyState m_enmProxyState;
     QString m_strProxyHost;
     QString m_strProxyPort;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.ui	(revision 58311)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.ui	(revision 58312)
@@ -20,14 +20,34 @@
    </property>
    <item row="0" column="0" colspan="2">
-    <widget class="QCheckBox" name="m_pCheckboxProxy">
+    <widget class="QRadioButton" name="m_pRadioProxyAuto">
      <property name="whatsThis">
-      <string>When checked, VirtualBox will use the proxy settings supplied for tasks like downloading Guest Additions from the network or checking for updates.</string>
+      <string>When chosen, VirtualBox will try to auto-detect host proxy settings for tasks like downloading Guest Additions from the network or checking for updates.</string>
      </property>
      <property name="text">
-      <string>&amp;Enable Proxy</string>
+      <string>&amp;Auto-detect Host Proxy Settings</string>
      </property>
     </widget>
    </item>
-   <item row="1" column="0">
+   <item row="1" column="0" colspan="2">
+    <widget class="QRadioButton" name="m_pRadioProxyDisabled">
+     <property name="whatsThis">
+      <string>When chosen, VirtualBox will use direct Internet connection for tasks like downloading Guest Additions from the network or checking for updates.</string>
+     </property>
+     <property name="text">
+      <string>&amp;Direct Connection to the Internet</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QRadioButton" name="m_pRadioProxyEnabled">
+     <property name="whatsThis">
+      <string>When chosen, VirtualBox will use the proxy settings supplied for tasks like downloading Guest Additions from the network or checking for updates.</string>
+     </property>
+     <property name="text">
+      <string>&amp;Manual Proxy Configuration</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0">
     <spacer>
      <property name="orientation">
@@ -45,5 +65,5 @@
     </spacer>
    </item>
-   <item row="1" column="1" colspan="2">
+   <item row="3" column="1">
     <widget class="QWidget" name="m_pContainerProxy">
      <property name="sizePolicy">
@@ -100,5 +120,5 @@
     </widget>
    </item>
-   <item row="2" column="0" colspan="3">
+   <item row="4" column="0" colspan="2">
     <spacer>
      <property name="orientation">
