Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h	(revision 814)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h	(revision 815)
@@ -102,4 +102,5 @@
     void cannotSaveGlobalConfig (const CVirtualBox &vbox);
     void cannotSetSystemProperties (const CSystemProperties &props);
+    void cannotAccessUSB (const COMBase &obj);
 
     void cannotCreateMachine (const CVirtualBox &vbox,
@@ -113,5 +114,4 @@
                                     bool strict = true,
                                     QWidget *parent = 0);
-    void cannotGetUSBController (const CMachine &machine);
 
     void cannotStartMachine (const CConsole &console);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp	(revision 814)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp	(revision 815)
@@ -491,4 +491,20 @@
 }
 
+void VBoxProblemReporter::cannotAccessUSB (const COMBase &obj)
+{
+    /* if there is no error info available, it should mean that
+     * IMachine::GetUSBController(), IHost::GetUSBDevices() etc. just returned
+     * E_NOTIMPL, as for the OSE version. Don't show the error message in this
+     * case since it's normal. */
+    COMErrorInfo errInfo = obj.errorInfo();
+    if (obj.lastRC() == E_NOTIMPL && !errInfo.isBasicAvailable())
+        return;
+
+    message (mainWindowShown(), Error,
+             tr ("Failed to access the USB subsystem."),
+             formatErrorInfo (errInfo),
+             "cannotAccessUSB");
+}
+
 void VBoxProblemReporter::cannotCreateMachine (const CVirtualBox &vbox,
                                                QWidget *parent /* = 0 */)
@@ -555,21 +571,4 @@
                  .arg (machine.GetName()),
              formatErrorInfo (errInfo));
-}
-
-void VBoxProblemReporter::cannotGetUSBController (const CMachine &machine)
-{
-    /* if there is no error info available, it should mean that
-     * IMachine::GetUSBController returned just E_NOTIMPL, as for the OSE
-     * version. Don't show the error message in this case since it's normal. */
-    COMErrorInfo errInfo = machine.errorInfo();
-    if (machine.lastRC() == E_NOTIMPL && !errInfo.isBasicAvailable())
-        return;
-
-    message (mainWindowShown(), Error,
-             tr ("Failed to access the USB controller of the virtual "
-                 "machine <b>%1</b>.")
-                 .arg (machine.GetName()),
-             formatErrorInfo (errInfo),
-             "cannotGetUSBController");
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui	(revision 814)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui	(revision 815)
@@ -1022,4 +1022,5 @@
     <include location="local" impldecl="in implementation">VBoxUtils.h</include>
     <include location="local" impldecl="in implementation">VBoxGlobal.h</include>
+    <include location="local" impldecl="in implementation">VBoxProblemReporter.h</include>
     <include location="local" impldecl="in implementation">VBoxUSBFilterSettings.h</include>
 </includes>
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui.h	(revision 814)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui.h	(revision 815)
@@ -126,5 +126,5 @@
                                      6 /* seems that RichText adds some margin */ +
                                      whatsThisLabel->fontMetrics().width ('m') * 40);
-    
+
     /*
      *  create and layout non-standard widgets
@@ -215,5 +215,5 @@
     if (!object->isWidgetType())
         return QDialog::eventFilter (object, event);
-    
+
     QWidget *widget = static_cast <QWidget *> (object);
     if (widget->topLevelWidget() != this)
@@ -332,15 +332,33 @@
 
     CHost host = vboxGlobal().virtualBox().GetHost();
-    CHostUSBDeviceFilterEnumerator en = host.GetUSBDeviceFilters().Enumerate();
-    while (en.HasMore())
-    {
-        CHostUSBDeviceFilter hostFilter = en.GetNext();
-        CUSBDeviceFilter filter = CUnknown (hostFilter);
-        addUSBFilter (filter, false);
-    }
-    lvUSBFilters->setCurrentItem (lvUSBFilters->firstChild());
-    lvUSBFilters_currentChanged (lvUSBFilters->firstChild());
-
-//    wvalXXXX->revalidate();
+    CHostUSBDeviceFilterCollection coll = host.GetUSBDeviceFilters();
+    if (coll.isNull())
+    {
+        /* disable the USB host filters category if the USB is
+         * not available (i.e. in VirtualBox OSE) */
+
+        QListViewItem *usbItem = listView->findItem ("#usb", listView_Link);
+        Assert (usbItem);
+        usbItem->setVisible (false);
+
+        /* disable validators if any */
+        pageUSB->setEnabled (false);
+        
+        /* Show an error message (if there is any).
+         * This message box may be suppressed if the user wishes so. */
+        vboxProblem().cannotAccessUSB (host);
+    }
+    else
+    {
+        CHostUSBDeviceFilterEnumerator en = coll.Enumerate();
+        while (en.HasMore())
+        {
+            CHostUSBDeviceFilter hostFilter = en.GetNext();
+            CUSBDeviceFilter filter = CUnknown (hostFilter);
+            addUSBFilter (filter, false);
+        }
+        lvUSBFilters->setCurrentItem (lvUSBFilters->firstChild());
+        lvUSBFilters_currentChanged (lvUSBFilters->firstChild());
+    }
 }
 
@@ -440,5 +458,5 @@
     if (!warning.isEmpty())
         warningString = QString ("<font color=red>%1</font>").arg (warning);
-    
+
     if (!warningString.isEmpty())
         whatsThisLabel->setText (warningString);
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h	(revision 814)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h	(revision 815)
@@ -1242,8 +1242,8 @@
             pageUSB->setEnabled (false);
 
-            /* If machine has something to say, show the message.
+            /* Show an error message (if there is any).
              * Note that we don't use the generic cannotLoadMachineSettings()
              * call here because we want this message to be suppressable. */
-            vboxProblem().cannotGetUSBController (machine);
+            vboxProblem().cannotAccessUSB (machine);
         }
         else
Index: /trunk/src/VBox/Main/HostImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/HostImpl.cpp	(revision 814)
+++ /trunk/src/VBox/Main/HostImpl.cpp	(revision 815)
@@ -458,4 +458,5 @@
 STDMETHODIMP Host::COMGETTER(USBDevices)(IHostUSBDeviceCollection **aUSBDevices)
 {
+#ifdef VBOX_WITH_USB
     if (!aUSBDevices)
         return E_POINTER;
@@ -463,4 +464,7 @@
     AutoLock alock (this);
     CHECK_READY();
+
+    HRESULT rc = checkUSBProxyService();
+    CheckComRCReturnRC (rc);
 
     ComObjPtr <HostUSBDeviceCollection> collection;
@@ -469,8 +473,15 @@
     collection.queryInterfaceTo (aUSBDevices);
     return S_OK;
+#else
+    /* Note: The GUI depends on this method returning E_NOTIMPL with no
+     * extended error info to indicate that USB is simply not available
+     * (w/o treting it as a failure), for example, as in OSE */
+    return E_NOTIMPL;
+#endif
 }
 
 STDMETHODIMP Host::COMGETTER(USBDeviceFilters) (IHostUSBDeviceFilterCollection ** aUSBDeviceFilters)
 {
+#ifdef VBOX_WITH_USB
     if (!aUSBDeviceFilters)
         return E_POINTER;
@@ -478,4 +489,7 @@
     AutoLock alock (this);
     CHECK_READY();
+
+    HRESULT rc = checkUSBProxyService();
+    CheckComRCReturnRC (rc);
 
     ComObjPtr <HostUSBDeviceFilterCollection> collection;
@@ -484,4 +498,10 @@
     collection.queryInterfaceTo (aUSBDeviceFilters);
     return S_OK;
+#else
+    /* Note: The GUI depends on this method returning E_NOTIMPL with no
+     * extended error info to indicate that USB is simply not available
+     * (w/o treting it as a failure), for example, as in OSE */
+    return E_NOTIMPL;
+#endif
 }
 
@@ -762,4 +782,5 @@
 STDMETHODIMP Host::CreateUSBDeviceFilter (INPTR BSTR aName, IHostUSBDeviceFilter **aFilter)
 {
+#ifdef VBOX_WITH_USB
     if (!aFilter)
         return E_POINTER;
@@ -771,15 +792,25 @@
     CHECK_READY();
 
+    HRESULT rc = checkUSBProxyService();
+    CheckComRCReturnRC (rc);
+
     ComObjPtr <HostUSBDeviceFilter> filter;
     filter.createObject();
-    HRESULT rc = filter->init (this, aName);
+    rc = filter->init (this, aName);
     ComAssertComRCRet (rc, rc);
     rc = filter.queryInterfaceTo (aFilter);
     AssertComRCReturn (rc, rc);
     return S_OK;
+#else
+    /* Note: The GUI depends on this method returning E_NOTIMPL with no
+     * extended error info to indicate that USB is simply not available
+     * (w/o treting it as a failure), for example, as in OSE */
+    return E_NOTIMPL;
+#endif
 }
 
 STDMETHODIMP Host::InsertUSBDeviceFilter (ULONG aPosition, IHostUSBDeviceFilter *aFilter)
 {
+#ifdef VBOX_WITH_USB
     if (!aFilter)
         return E_INVALIDARG;
@@ -787,4 +818,7 @@
     AutoLock alock (this);
     CHECK_READY();
+
+    HRESULT rc = checkUSBProxyService();
+    CheckComRCReturnRC (rc);
 
     ComObjPtr <HostUSBDeviceFilter> filter = getDependentChild (aFilter);
@@ -798,12 +832,12 @@
             tr ("The given USB device filter is already in the list"));
 
-    // iterate to the position...
+    /* iterate to the position... */
     USBDeviceFilterList::iterator it = mUSBDeviceFilters.begin();
     std::advance (it, aPosition);
-    // ...and insert
+    /* ...and insert */
     mUSBDeviceFilters.insert (it, filter);
     filter->mInList = true;
 
-    // notify the proxy (only when the filter is active)
+    /* notify the proxy (only when the filter is active) */
     if (filter->data().mActive)
     {
@@ -813,11 +847,18 @@
     }
 
-    // save the global settings
+    /* save the global settings */
     alock.unlock();
     return mParent->saveSettings();
+#else
+    /* Note: The GUI depends on this method returning E_NOTIMPL with no
+     * extended error info to indicate that USB is simply not available
+     * (w/o treting it as a failure), for example, as in OSE */
+    return E_NOTIMPL;
+#endif
 }
 
 STDMETHODIMP Host::RemoveUSBDeviceFilter (ULONG aPosition, IHostUSBDeviceFilter **aFilter)
 {
+#ifdef VBOX_WITH_USB
     if (!aFilter)
         return E_POINTER;
@@ -825,4 +866,7 @@
     AutoLock alock (this);
     CHECK_READY();
+
+    HRESULT rc = checkUSBProxyService();
+    CheckComRCReturnRC (rc);
 
     if (!mUSBDeviceFilters.size())
@@ -837,10 +881,10 @@
     ComObjPtr <HostUSBDeviceFilter> filter;
     {
-        // iterate to the position...
+        /* iterate to the position... */
         USBDeviceFilterList::iterator it = mUSBDeviceFilters.begin();
         std::advance (it, aPosition);
-        // ...get an element from there...
+        /* ...get an element from there... */
         filter = *it;
-        // ...and remove
+        /* ...and remove */
         filter->mInList = false;
         mUSBDeviceFilters.erase (it);
@@ -849,5 +893,5 @@
     filter.queryInterfaceTo (aFilter);
 
-    // notify the proxy (only when the filter is active)
+    /* notify the proxy (only when the filter is active) */
     if (filter->data().mActive)
     {
@@ -857,7 +901,13 @@
     }
 
-    // save the global settings
+    /* save the global settings */
     alock.unlock();
     return mParent->saveSettings();
+#else
+    /* Note: The GUI depends on this method returning E_NOTIMPL with no
+     * extended error info to indicate that USB is simply not available
+     * (w/o treting it as a failure), for example, as in OSE */
+    return E_NOTIMPL;
+#endif
 }
 
@@ -1568,4 +1618,42 @@
 }
 
+/**
+ *  Checks for the presense and status of the USB Proxy Service.
+ *  Returns S_OK when the Proxy is present and OK, or E_FAIL and a
+ *  corresponding error message otherwise. Intended to be used by methods
+ *  that rely on the Proxy Service availability.
+ *
+ *  @note Locks this object for reading.
+ */
+HRESULT Host::checkUSBProxyService()
+{
+#ifdef VBOX_WITH_USB
+    AutoLock lock (this);
+    CHECK_READY();
+
+    AssertReturn (mUSBProxyService, E_FAIL);
+    if (!mUSBProxyService->isActive())
+    {
+        /* disable the USB controller completely to avoid assertions if the
+         * USB proxy service could not start. */
+
+        Assert (VBOX_FAILURE (mUSBProxyService->getLastError()));
+        if (mUSBProxyService->getLastError() == VERR_FILE_NOT_FOUND)
+            return setError (E_FAIL,
+                tr ("Could not load the Host USB Proxy Service (%Vrc)."
+                    "The service might be not installed on the host computer"),
+                mUSBProxyService->getLastError());
+        else
+            return setError (E_FAIL,
+                tr ("Could not load the Host USB Proxy service (%Vrc)"),
+                mUSBProxyService->getLastError());
+    }
+
+    return S_OK;
+#else
+    return E_NOTIMPL;
+#endif
+}
+
 #ifdef __WIN__
 
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 814)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 815)
@@ -1120,26 +1120,8 @@
     CheckComRCReturnRC (autoCaller.rc());
 
+    HRESULT rc = mParent->host()->checkUSBProxyService();
+    CheckComRCReturnRC (rc);
+
     AutoReaderLock alock (this);
-
-    USBProxyService *usbProxyService = mParent->host()->usbProxyService();
-    AssertReturn (usbProxyService, E_FAIL);
-    if (!usbProxyService->isActive())
-    {
-        /* disable the USB controller completely to avoid assertions if the
-         * USB proxy service could not start. */
-
-        Assert (VBOX_FAILURE (usbProxyService->getLastError()));
-        if (usbProxyService->getLastError() == VERR_FILE_NOT_FOUND)
-            return setError (E_FAIL,
-                tr ("Could not load the USB proxy service (%Vrc), "
-                    "the virtual USB Controller is not available."
-                    "The service may not be installed on the host computer"),
-                usbProxyService->getLastError());
-        else
-            return setError (E_FAIL,
-                tr ("Could not load the USB proxy service (%Vrc), "
-                    "the virtual USB Controller is not available"),
-                usbProxyService->getLastError());
-    }
 
     mUSBController.queryInterfaceTo (a_ppUSBController);
Index: /trunk/src/VBox/Main/include/HostImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/HostImpl.h	(revision 814)
+++ /trunk/src/VBox/Main/include/HostImpl.h	(revision 815)
@@ -115,4 +115,7 @@
     void onUSBDeviceStateChanged (HostUSBDevice *aDevice);
 
+    HRESULT checkUSBProxyService();
+    
+    /* must be called from under this object's lock */ 
     USBProxyService *usbProxyService() { return mUSBProxyService; }
 
