Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp	(revision 59380)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp	(revision 59381)
@@ -884,6 +884,12 @@
     else
     {
-        QString m = aDevice.GetManufacturer().trimmed();
-        QString p = aDevice.GetProduct().trimmed();
+        QVector<QString> devInfoVector = aDevice.GetDeviceInfo();
+        QString m;
+        QString p;
+
+        if (devInfoVector.size() >= 1)
+            m = devInfoVector[0].trimmed();
+        if (devInfoVector.size() >= 2)
+            p = devInfoVector[1].trimmed();
 
         if (m.isEmpty() && p.isEmpty())
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 59380)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 59381)
@@ -18021,5 +18021,5 @@
     uuid="5915d179-83c7-4f2b-a323-9a97f46f4e29"
     wsmap="managed"
-    reservedAttributes="3"
+    reservedAttributes="2"
     >
     <desc>
@@ -18108,4 +18108,16 @@
       <desc>
         The backend which will be used to communicate with this device.
+      </desc>
+    </attribute>
+
+    <attribute name="deviceInfo" type="wstring" readonly="yes" safearray="yes">
+      <desc>
+        Array of device attributes as single strings.
+
+        So far the following are used:
+          0: The manufacturer string, if the device doesn't expose the ID one is taken
+             from an internal database or an empty string if none is found.
+          1: The product string, if the device doesn't expose the ID one is taken
+             from an internal database or an empty string if none is found.
       </desc>
     </attribute>
Index: /trunk/src/VBox/Main/include/HostUSBDeviceImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/HostUSBDeviceImpl.h	(revision 59380)
+++ /trunk/src/VBox/Main/include/HostUSBDeviceImpl.h	(revision 59381)
@@ -261,7 +261,7 @@
     HRESULT getSpeed(USBConnectionSpeed_T *aSpeed);
     HRESULT getRemote(BOOL *aRemote);
-    HRESULT getName(com::Utf8Str &aName);
     HRESULT getState(USBDeviceState_T *aState);
     HRESULT getBackend(com::Utf8Str &aBackend);
+    HRESULT getDeviceInfo(std::vector<com::Utf8Str> &aInfo);
 
 
Index: /trunk/src/VBox/Main/include/RemoteUSBDeviceImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/RemoteUSBDeviceImpl.h	(revision 59380)
+++ /trunk/src/VBox/Main/include/RemoteUSBDeviceImpl.h	(revision 59381)
@@ -80,4 +80,5 @@
     HRESULT getRemote(BOOL *aRemote);
     HRESULT getBackend(com::Utf8Str &aBackend);
+    HRESULT getDeviceInfo(std::vector<com::Utf8Str> &aInfo);
 
     // wrapped IHostUSBDevice properties
Index: /trunk/src/VBox/Main/include/USBDeviceImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/USBDeviceImpl.h	(revision 59380)
+++ /trunk/src/VBox/Main/include/USBDeviceImpl.h	(revision 59381)
@@ -60,4 +60,5 @@
     HRESULT getRemote(BOOL *aRemote);
     HRESULT getBackend(com::Utf8Str &aBackend);
+    HRESULT getDeviceInfo(std::vector<com::Utf8Str> &aInfo);
 
     struct Data
Index: /trunk/src/VBox/Main/src-client/RemoteUSBDeviceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/RemoteUSBDeviceImpl.cpp	(revision 59380)
+++ /trunk/src/VBox/Main/src-client/RemoteUSBDeviceImpl.cpp	(revision 59381)
@@ -279,4 +279,14 @@
 }
 
+HRESULT RemoteUSBDevice::getDeviceInfo(std::vector<com::Utf8Str> &aInfo)
+{
+    /* this is const, no need to lock */
+    aInfo.resize(2);
+    aInfo[0] = mData.manufacturer;
+    aInfo[1] = mData.product;
+
+    return S_OK;
+}
+
 // IHostUSBDevice properties
 ////////////////////////////////////////////////////////////////////////////////
Index: /trunk/src/VBox/Main/src-client/USBDeviceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/USBDeviceImpl.cpp	(revision 59380)
+++ /trunk/src/VBox/Main/src-client/USBDeviceImpl.cpp	(revision 59381)
@@ -325,4 +325,14 @@
 }
 
+HRESULT OUSBDevice::getDeviceInfo(std::vector<com::Utf8Str> &aInfo)
+{
+    /* this is const, no need to lock */
+    aInfo.resize(2);
+    aInfo[0] = mData.manufacturer;
+    aInfo[1] = mData.product;
+
+    return S_OK;
+}
+
 // private methods
 /////////////////////////////////////////////////////////////////////////////
Index: /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp	(revision 59380)
+++ /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp	(revision 59381)
@@ -168,6 +168,4 @@
 
     aManufacturer = mUsb->pszManufacturer;
-    if (mUsb->pszManufacturer == NULL || mUsb->pszManufacturer[0] == 0)
-        aManufacturer = USBIdDatabase::findVendor(mUsb->idVendor);
     return S_OK;
 }
@@ -179,6 +177,4 @@
 
     aProduct = mUsb->pszProduct;
-    if (mUsb->pszProduct == NULL || mUsb->pszProduct[0] == 0)
-        aProduct = USBIdDatabase::findProduct(mUsb->idVendor, mUsb->idProduct);
     return S_OK;
 }
@@ -316,4 +312,29 @@
 }
 
+
+HRESULT HostUSBDevice::getDeviceInfo(std::vector<com::Utf8Str> &aInfo)
+{
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    com::Utf8Str strManufacturer;
+    com::Utf8Str strProduct;
+
+    if (mUsb->pszManufacturer && *mUsb->pszManufacturer)
+        strManufacturer = mUsb->pszManufacturer;
+    else
+        strManufacturer = USBIdDatabase::findVendor(mUsb->idVendor);
+
+    if (mUsb->pszProduct && *mUsb->pszProduct)
+        strProduct = mUsb->pszProduct;
+    else
+        strProduct = USBIdDatabase::findProduct(mUsb->idVendor, mUsb->idProduct);
+
+    aInfo.resize(2);
+    aInfo[0] = strManufacturer;
+    aInfo[1] = strProduct;
+
+    return S_OK;
+}
+
 // public methods only for internal purposes
 ////////////////////////////////////////////////////////////////////////////////
@@ -335,14 +356,14 @@
     if (haveManufacturer && haveProduct)
         name = Utf8StrFmt("%s %s", mUsb->pszManufacturer, mUsb->pszProduct);
-    else if (haveManufacturer)
-        name = mUsb->pszManufacturer;
-    else if (haveProduct)
-        name = mUsb->pszProduct;
     else
     {
         Utf8Str strProduct;
         Utf8Str strVendor = USBIdDatabase::findVendorAndProduct(mUsb->idVendor, mUsb->idProduct, &strProduct);
-        if (strVendor.isNotEmpty() && strProduct.isNotEmpty())
-            name = Utf8StrFmt("%s %s", strVendor.c_str(), strProduct.c_str());
+        if (   (strVendor.isNotEmpty() || haveManufacturer)
+            && (strProduct.isNotEmpty() || haveProduct))
+            name = Utf8StrFmt("%s %s", haveManufacturer ? mUsb->pszManufacturer
+                                                        : strVendor.c_str(),
+                                       haveProduct ? mUsb->pszProduct
+                                                   : strProduct.c_str());
         else
         {
