Index: trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 100737)
+++ trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 100772)
@@ -7431,5 +7431,5 @@
     <attribute name="USBProxyAvailable" type="boolean" readonly="yes">
       <desc>
-        Returns whether there is an USB proxy available.
+        Returns whether there is a USB proxy available.
       </desc>
     </attribute>
@@ -10955,5 +10955,5 @@
       <rest request="post" path="/vms/{vmid}/configuration/"/>
       <desc>
-        Detaches an USB device with the given UUID from the USB controller
+        Detaches a USB device with the given UUID from the USB controller
         of the virtual machine.
 
@@ -23083,28 +23083,26 @@
     >
     <desc>
-      The IUSBDeviceFilter interface represents an USB device filter used
-      to perform actions on a group of USB devices.
-
-      This type of filters is used by running virtual machines to
+      The IUSBDeviceFilter interface represents a USB device filter used
+      to perform actions on one or more USB devices.
+
+      USB device filters are used by running virtual machines to
       automatically capture selected USB devices once they are physically
       attached to the host computer.
 
-      A USB device is matched to the given device filter if and only if all
-      attributes of the device match the corresponding attributes of the
-      filter (that is, attributes are joined together using the logical AND
-      operation). On the other hand, all together, filters in the list of
-      filters carry the semantics of the logical OR operation. So if it is
-      desirable to create a match like "this vendor id OR this product id",
-      one needs to create two filters and specify "any match" (see below)
-      for unused attributes.
-
-      All filter attributes used for matching are strings. Each string
-      is an expression representing a set of values of the corresponding
-      device attribute, that will match the given filter. Currently, the
-      following filtering expressions are supported:
+      A USB device is matched to a specific device filter if and only if all
+      attributes of the device filter match the corresponding attributes of the
+      device (that is, attributes are joined together using a logical AND
+      operation). On the other hand filter attributes in separate USB
+      device filters are applied as a logical OR operation. So if one
+      would like to create a match such as "this vendor id OR this product id",
+      then one would need to create two filters and specify "any match" (see below)
+      for the other unused attributes.
+
+      All filter attributes used for matching are strings.  The following
+      filtering expressions are currently supported:
 
       <ul>
         <li><i>Interval filters</i>. Used to specify valid intervals for
-          integer device attributes (Vendor ID, Product ID and Revision).
+          integer device attributes (Vendor ID, Product ID, Revision and Port).
           The format of the string is:
 
@@ -23112,6 +23110,6 @@
 
           where <tt>m</tt> and <tt>n</tt> are integer numbers, either in octal
-          (starting from <tt>0</tt>), hexadecimal (starting from <tt>0x</tt>)
-          or decimal (otherwise) form, so that <tt>m &lt; n</tt>. If <tt>m</tt>
+          (starting with <tt>0</tt>), hexadecimal (starting with <tt>0x</tt>)
+          or decimal (otherwise), so that <tt>m &lt; n</tt>. If <tt>m</tt>
           is omitted before a dash (<tt>-</tt>), the minimum possible integer
           is assumed; if <tt>n</tt> is omitted after a dash, the maximum
@@ -23126,8 +23124,8 @@
         <li><i>Exact match</i>. Used to specify a single value for the given
           device attribute. Any string that doesn't start with <tt>int:</tt>
-          represents the exact match. String device attributes are compared to
-          this string including case of symbols. Integer attributes are first
+          represents an exact match. String device attributes are compared to
+          this string in a case-sensitive manner. Integer attributes are first
           converted to a string (see individual filter attributes) and then
-          compared ignoring case.
+          compared in a case-insensitive manner.
 
         </li>
@@ -23140,6 +23138,6 @@
 
       <note>
-        On the Windows host platform, interval filters are not currently
-        available. Also all string filter attributes
+        On Windows hosts, interval filters are not currently available.
+        Also all string filter attributes
         (<link to="#manufacturer"/>, <link to="#product"/>,
         <link to="#serialNumber"/>) are ignored, so they behave as
Index: trunk/src/VBox/Main/src-server/HostImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/HostImpl.cpp	(revision 100737)
+++ trunk/src/VBox/Main/src-server/HostImpl.cpp	(revision 100772)
@@ -217,5 +217,5 @@
 
 #ifdef VBOX_WITH_USB
-    USBDeviceFilterList     llChildren;                 // all USB device filters
+    USBDeviceFilterList     llChildren;                 // all global USB device filters
     USBDeviceFilterList     llUSBDeviceFilters;         // USB device filters in use by the USB proxy service
 
@@ -535,12 +535,20 @@
 
 #ifdef VBOX_WITH_USB
-    /* uninit all USB device filters still referenced by clients
-     * Note! HostUSBDeviceFilter::uninit() will modify llChildren.
-     * This list should be already empty, but better be safe than sorry. */
-    while (!m->llChildren.empty())
-    {
-        ComObjPtr<HostUSBDeviceFilter> &pChild = m->llChildren.front();
-        pChild->uninit();
-        m->llChildren.pop_front();
+    /* Clean up the list of global USB device filters. */
+    if (!m->llChildren.empty())
+    {
+        /*
+         * i_removeChild() modifies llChildren so we make a copy to traverse here. The
+         * removal of a global USB device filter from the llChildren list at this point
+         * in Host:uninit() will trigger HostUSBDeviceFilter::FinalRelease() ->
+         * HostUSBDeviceFilter::uninit() which will complete the remainder of the clean-up
+         * for each global USB device filter and thus we don't need to call
+         * HostUSBDeviceFilter::uninit() directly here ourselves.
+         */
+        USBDeviceFilterList llChildrenCopy(m->llChildren);
+        for (USBDeviceFilterList::iterator it = llChildrenCopy.begin();
+            it != llChildrenCopy.end();
+            ++it)
+            i_removeChild(*it);
     }
 
Index: trunk/src/VBox/Main/src-server/USBDeviceFilterImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/USBDeviceFilterImpl.cpp	(revision 100737)
+++ trunk/src/VBox/Main/src-server/USBDeviceFilterImpl.cpp	(revision 100772)
@@ -976,6 +976,4 @@
     bd.free();
 
-    mParent->i_removeChild(this);
-
     unconst(mParent) = NULL;
 }
