Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui	(revision 363)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui	(revision 364)
@@ -1942,4 +1942,30 @@
                                             <widget class="QToolButton">
                                                 <property name="name">
+                                                    <cstring>tbAddUSBFilterFrom</cstring>
+                                                </property>
+                                                <property name="focusPolicy">
+                                                    <enum>TabFocus</enum>
+                                                </property>
+                                                <property name="text">
+                                                    <string></string>
+                                                </property>
+                                                <property name="accel">
+                                                    <string>Ins</string>
+                                                </property>
+                                                <property name="iconSet">
+                                                    <iconset></iconset>
+                                                </property>
+                                                <property name="textLabel">
+                                                    <string>Add existing</string>
+                                                </property>
+                                                <property name="autoRaise">
+                                                    <bool>true</bool>
+                                                </property>
+                                                <property name="whatsThis" stdset="0">
+                                                    <string>Adds a new USB filter from an existing USB device.</string>
+                                                </property>
+                                            </widget>
+                                            <widget class="QToolButton">
+                                                <property name="name">
                                                     <cstring>tbRemoveUSBFilter</cstring>
                                                 </property>
@@ -2532,4 +2558,10 @@
     </connection>
     <connection>
+        <sender>tbAddUSBFilterFrom</sender>
+        <signal>clicked()</signal>
+        <receiver>VBoxVMSettingsDlg</receiver>
+        <slot>tbAddUSBFilterFrom_clicked()</slot>
+    </connection>
+    <connection>
         <sender>tbRemoveUSBFilter</sender>
         <signal>clicked()</signal>
@@ -2590,4 +2622,5 @@
     <tabstop>lvUSBFilters</tabstop>
     <tabstop>tbAddUSBFilter</tabstop>
+    <tabstop>tbAddUSBFilterFrom</tabstop>
     <tabstop>tbRemoveUSBFilter</tabstop>
     <tabstop>tbUSBFilterUp</tabstop>
@@ -2613,4 +2646,5 @@
     <include location="global" impldecl="in implementation">qfocusdata.h</include>
     <include location="global" impldecl="in implementation">qtimer.h</include>
+    <include location="global" impldecl="in implementation">qpopupmenu.h</include>
     <include location="local" impldecl="in declaration">COMDefs.h</include>
     <include location="local" impldecl="in declaration">QIWidgetValidator.h</include>
@@ -2625,4 +2659,5 @@
     <forward>class VBoxMediaComboBox</forward>
     <forward>class VBoxDiskImageManagerDlg</forward>
+    <forward>class QPopupMenu</forward>
 </forwards>
 <variables>
@@ -2655,4 +2690,7 @@
     <variable access="private">VBoxMediaComboBox *cbISODVD;</variable>
     <variable access="private">VBoxMediaComboBox *cbISOFloppy;</variable>
+    <variable access="private">QPopupMenu *usbDevicesMenu;</variable>
+    <variable access="private">QMap&lt;int, CUSBDevice&gt; usbDevicesMap;</variable>
+    <variable access="private">int mUsbDevicesMenuNoDevicesId;</variable>
 </variables>
 <slots>
@@ -2679,4 +2717,7 @@
     <slot>lvUSBFilters_setCurrentText( const QString &amp; aText )</slot>
     <slot>tbAddUSBFilter_clicked()</slot>
+    <slot>tbAddUSBFilterFrom_clicked()</slot>
+    <slot>menuAddUSBFilterFrom_activated( int )</slot>
+    <slot>menuAddUSBFilterFrom_highlighted( int )</slot>
     <slot>tbRemoveUSBFilter_clicked()</slot>
     <slot>tbUSBFilterUp_clicked()</slot>
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h	(revision 363)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h	(revision 364)
@@ -447,4 +447,6 @@
     tbAddUSBFilter->setIconSet (VBoxGlobal::iconSet ("usb_add_16px.png",
                                                      "usb_add_disabled_16px.png"));
+    tbAddUSBFilterFrom->setIconSet (VBoxGlobal::iconSet ("usb_read_16px.png",
+                                                         "usb_read_16px.png"));
     tbRemoveUSBFilter->setIconSet (VBoxGlobal::iconSet ("usb_remove_16px.png",
                                                         "usb_remove_disabled_16px.png"));
@@ -453,7 +455,10 @@
     tbUSBFilterDown->setIconSet (VBoxGlobal::iconSet ("usb_movedown_16px.png",
                                                       "usb_movedown_disabled_16px.png"));
-
+    usbDevicesMenu = new QPopupMenu (this, "usbDevicesMenu");
+    connect (usbDevicesMenu, SIGNAL(activated(int)), this, SLOT(menuAddUSBFilterFrom_activated(int)));
+    connect (usbDevicesMenu, SIGNAL(highlighted(int)), this, SLOT(menuAddUSBFilterFrom_highlighted(int)));
     mLastUSBFilterNum = 0;
     mUSBFilterListModified = false;
+    mUsbDevicesMenuNoDevicesId = -1;
 
     /* VRDP Page */
@@ -1711,4 +1716,81 @@
 }
 
+void VBoxVMSettingsDlg::tbAddUSBFilterFrom_clicked()
+{
+    usbDevicesMenu->clear();
+    usbDevicesMap.clear();
+    CHost host = vboxGlobal().virtualBox().GetHost();
+
+    bool isUSBEmpty = host.GetUSBDevices().GetCount() == 0;
+    if (isUSBEmpty)
+    {
+        mUsbDevicesMenuNoDevicesId = usbDevicesMenu->insertItem (
+            tr ("<no available devices>", "USB devices"));
+        usbDevicesMenu->setItemEnabled (mUsbDevicesMenuNoDevicesId, false);
+    }
+    else
+    {
+        mUsbDevicesMenuNoDevicesId = -1;
+        CHostUSBDeviceEnumerator en = host.GetUSBDevices().Enumerate();
+        while (en.HasMore())
+        {
+            CHostUSBDevice iterator = en.GetNext();
+            CUSBDevice usb = CUnknown (iterator);
+            int id = usbDevicesMenu->insertItem (vboxGlobal().details (usb));
+            usbDevicesMap [id] = usb;
+        }
+    }
+    usbDevicesMenu->exec (QCursor::pos());
+}
+
+void VBoxVMSettingsDlg::menuAddUSBFilterFrom_highlighted (int aIndex)
+{
+    /* the <no available devices> item is highlighted */
+    if (aIndex == mUsbDevicesMenuNoDevicesId)
+    {
+        QToolTip::add (usbDevicesMenu,
+            tr ("No supported devices connected to the host PC",
+                "USB device tooltip"));
+        return;
+    }
+
+    CUSBDevice usb = usbDevicesMap [aIndex];
+    /* if null then some other item but a USB device is highlighted */
+    if (usb.isNull())
+    {
+        QToolTip::remove (usbDevicesMenu);
+        return;
+    }
+
+    QString tip = vboxGlobal().toolTip (usb);
+    QToolTip::add (usbDevicesMenu, tip);
+}
+
+void VBoxVMSettingsDlg::menuAddUSBFilterFrom_activated (int aIndex)
+{
+    CUSBDevice usb = usbDevicesMap [aIndex];
+    /* if null then some other item but a USB device is selected */
+    if (usb.isNull())
+        return;
+
+    CUSBDeviceFilter filter = cmachine.GetUSBController()
+        .CreateDeviceFilter (tr ("New Filter %1", "usb")
+                                 .arg (++ mLastUSBFilterNum));
+
+    filter.SetVendorId (QString().sprintf ("%04hX", usb.GetVendorId()));
+    filter.SetProductId (QString().sprintf ("%04hX", usb.GetProductId()));
+    filter.SetRevision (QString().sprintf ("%04hX", usb.GetRevision()));
+    filter.SetPort (QString().sprintf ("%04hX", usb.GetPort()));
+    filter.SetManufacturer (usb.GetManufacturer());
+    filter.SetProduct (usb.GetProduct());
+    filter.SetSerialNumber (usb.GetSerialNumber());
+    filter.SetRemote (usb.GetRemote() ? "yes" : "no");
+
+    filter.SetActive (true);
+    addUSBFilter (filter, true /* isNew */);
+
+    mUSBFilterListModified = true;
+}
+
 void VBoxVMSettingsDlg::tbRemoveUSBFilter_clicked()
 {
