Index: trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 48978)
+++ trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 48983)
@@ -446,4 +446,5 @@
         case KStorageControllerType_I82078:      return QApplication::translate("VBoxGlobal", "I82078", "StorageControllerType");
         case KStorageControllerType_LsiLogicSas: return QApplication::translate("VBoxGlobal", "LsiLogic SAS", "StorageControllerType");
+        case KStorageControllerType_USB:         return QApplication::translate("VBoxGlobal", "USB", "StorageControllerType");
         AssertMsgFailed(("No text for %d", type)); break;
     }
@@ -598,4 +599,5 @@
     list.insert(QApplication::translate("VBoxGlobal", "I82078", "StorageControllerType"),       KStorageControllerType_I82078);
     list.insert(QApplication::translate("VBoxGlobal", "LsiLogic SAS", "StorageControllerType"), KStorageControllerType_LsiLogicSas);
+    list.insert(QApplication::translate("VBoxGlobal", "USB", "StorageControllerType"),          KStorageControllerType_USB);
     if (!list.contains(strType))
     {
Index: trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp	(revision 48978)
+++ trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp	(revision 48983)
@@ -171,4 +171,20 @@
             }
             strResult = QApplication::translate("VBoxGlobal", "Floppy Device %1", "StorageSlot").arg(storageSlot.device);
+            break;
+        }
+        case KStorageBus_USB:
+        {
+            int iMaxPort = vboxGlobal().virtualBox().GetSystemProperties().GetMaxPortCountForStorageBus(storageSlot.bus);
+            if (storageSlot.port < 0 || storageSlot.port > iMaxPort)
+            {
+                AssertMsgFailed(("No text for bus=%d & port=%d", storageSlot.bus, storageSlot.port));
+                break;
+            }
+            if (storageSlot.device != 0)
+            {
+                AssertMsgFailed(("No text for bus=%d & port=%d & device=%d", storageSlot.bus, storageSlot.port, storageSlot.device));
+                break;
+            }
+            strResult = QApplication::translate("VBoxGlobal", "USB Port %1", "StorageSlot").arg(storageSlot.port);
             break;
         }
Index: trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 48978)
+++ trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 48983)
@@ -156,4 +156,7 @@
                 mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::SATAControllerNormal + i);
                 break;
+            case KStorageBus_USB:
+                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::SATAControllerNormal + i);
+                break;
             default:
                 break;
@@ -275,4 +278,21 @@
     return 1;
 }
+
+/* USB Controller Type */
+USBStorageControllerType::USBStorageControllerType (KStorageControllerType aSubType)
+    : AbstractControllerType (KStorageBus_USB, aSubType)
+{
+}
+
+KStorageControllerType USBStorageControllerType::first() const
+{
+    return KStorageControllerType_USB;
+}
+
+uint USBStorageControllerType::size() const
+{
+    return 1;
+}
+
 
 /* Abstract Item */
@@ -416,4 +436,8 @@
             mCtrType = new SASControllerType (aControllerType);
             break;
+        case KStorageBus_USB:
+            mCtrType = new USBStorageControllerType (aControllerType);
+            break;
+
         default:
             AssertMsgFailed (("Wrong Controller Type {%d}!\n", aBusType));
@@ -1017,4 +1041,10 @@
                     vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus(chipsetType(), KStorageBus_SAS));
         }
+        case R_IsMoreUSBControllersPossible:
+        {
+            return (m_dialogType == SettingsDialogType_Offline) &&
+                   (static_cast<RootItem*>(mRootItem)->childCount(KStorageBus_USB) <
+                    vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus(chipsetType(), KStorageBus_USB));
+        }
         case R_IsMoreAttachmentsPossible:
         {
@@ -1552,5 +1582,5 @@
 {
     QMap<KStorageBus, int> currentMap;
-    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_SAS; ++iStorageBusType)
+    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_USB; ++iStorageBusType)
     {
         currentMap.insert((KStorageBus)iStorageBusType,
@@ -1563,5 +1593,5 @@
 {
     QMap<KStorageBus, int> maximumMap;
-    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_SAS; ++iStorageBusType)
+    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_USB; ++iStorageBusType)
     {
         maximumMap.insert((KStorageBus)iStorageBusType,
@@ -1722,5 +1752,5 @@
     : mStorageModel(0)
     , mAddCtrAction(0), mDelCtrAction(0)
-    , mAddIDECtrAction(0), mAddSATACtrAction(0), mAddSCSICtrAction(0), mAddSASCtrAction(0), mAddFloppyCtrAction(0)
+    , mAddIDECtrAction(0), mAddSATACtrAction(0), mAddSCSICtrAction(0), mAddSASCtrAction(0), mAddFloppyCtrAction(0), mAddUSBCtrAction(0)
     , mAddAttAction(0), mDelAttAction(0)
     , mAddHDAttAction(0), mAddCDAttAction(0), mAddFDAttAction(0)
@@ -1764,4 +1794,8 @@
     mAddSASCtrAction = new QAction (this);
     mAddSASCtrAction->setIcon(UIIconPool::iconSet(PixmapPool::pool()->pixmap (PixmapPool::SATAControllerAddEn),
+                                                  PixmapPool::pool()->pixmap (PixmapPool::SATAControllerAddDis)));
+
+    mAddUSBCtrAction = new QAction (this);
+    mAddUSBCtrAction->setIcon(UIIconPool::iconSet(PixmapPool::pool()->pixmap (PixmapPool::SATAControllerAddEn),
                                                   PixmapPool::pool()->pixmap (PixmapPool::SATAControllerAddDis)));
 
@@ -1844,4 +1878,5 @@
     connect (mAddSASCtrAction, SIGNAL (triggered (bool)), this, SLOT (addSASController()));
     connect (mAddFloppyCtrAction, SIGNAL (triggered (bool)), this, SLOT (addFloppyController()));
+    connect (mAddUSBCtrAction, SIGNAL (triggered (bool)), this, SLOT (addUSBController()));
     connect (mDelCtrAction, SIGNAL (triggered (bool)), this, SLOT (delController()));
     connect (mAddAttAction, SIGNAL (triggered (bool)), this, SLOT (addAttachment()));
@@ -2168,5 +2203,5 @@
     QMap<KStorageBus, int> currentType = mStorageModel->currentControllerTypes();
     QMap<KStorageBus, int> maximumType = mStorageModel->maximumControllerTypes();
-    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_SAS; ++iStorageBusType)
+    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_USB; ++iStorageBusType)
     {
         if (currentType[(KStorageBus)iStorageBusType] > maximumType[(KStorageBus)iStorageBusType])
@@ -2214,4 +2249,5 @@
     mAddSASCtrAction->setText (tr ("Add SAS Controller"));
     mAddFloppyCtrAction->setText (tr ("Add Floppy Controller"));
+    mAddUSBCtrAction->setText (tr ("Add USB Controller"));
     mDelCtrAction->setText (tr ("Remove Controller"));
     mAddAttAction->setText (tr ("Add Attachment"));
@@ -2323,4 +2359,5 @@
     menu.addAction (mAddSASCtrAction);
     menu.addAction (mAddFloppyCtrAction);
+    menu.addAction (mAddUSBCtrAction);
     menu.exec (QCursor::pos());
 }
@@ -2349,4 +2386,9 @@
 {
     addControllerWrapper (generateUniqueName ("SAS"), KStorageBus_SAS, KStorageControllerType_LsiLogicSas);
+}
+
+void UIMachineSettingsStorage::addUSBController()
+{
+    addControllerWrapper (generateUniqueName ("USB"), KStorageBus_USB, KStorageControllerType_USB);
 }
 
@@ -2474,5 +2516,5 @@
                 KStorageBus bus = mStorageModel->data (index, StorageModel::R_CtrBusType).value <KStorageBus>();
                 mLbPortCount->setVisible (bus == KStorageBus_SATA);
-                mSbPortCount->setVisible (bus == KStorageBus_SATA);
+                mSbPortCount->setVisible (bus == KStorageBus_SATA || bus == KStorageBus_SAS);
                 uint uPortCount = mStorageModel->data (index, StorageModel::R_CtrPortCount).toUInt();
                 mSbPortCount->setValue (uPortCount);
@@ -2755,4 +2797,5 @@
     bool isFloppyPossible = mStorageModel->data (index, StorageModel::R_IsMoreFloppyControllersPossible).toBool();
     bool isSASPossible = mStorageModel->data (index, StorageModel::R_IsMoreSASControllersPossible).toBool();
+    bool isUSBPossible = mStorageModel->data (index, StorageModel::R_IsMoreUSBControllersPossible).toBool();
 
     bool isController = mStorageModel->data (index, StorageModel::R_IsController).toBool();
@@ -2760,5 +2803,5 @@
     bool isAttachmentsPossible = mStorageModel->data (index, StorageModel::R_IsMoreAttachmentsPossible).toBool();
 
-    mAddCtrAction->setEnabled (isIDEPossible || isSATAPossible || isSCSIPossible || isFloppyPossible || isSASPossible);
+    mAddCtrAction->setEnabled (isIDEPossible || isSATAPossible || isSCSIPossible || isFloppyPossible || isSASPossible || isUSBPossible);
     mAddIDECtrAction->setEnabled (isIDEPossible);
     mAddSATACtrAction->setEnabled (isSATAPossible);
@@ -2766,4 +2809,5 @@
     mAddFloppyCtrAction->setEnabled (isFloppyPossible);
     mAddSASCtrAction->setEnabled (isSASPossible);
+    mAddUSBCtrAction->setEnabled (isUSBPossible);
 
     mAddAttAction->setEnabled (isController && isAttachmentsPossible);
@@ -3049,4 +3093,7 @@
         case KStorageBus_Floppy:
             Assert (mStorageModel->data (index, StorageModel::R_IsMoreFloppyControllersPossible).toBool());
+            break;
+        case KStorageBus_USB:
+            Assert (mStorageModel->data (index, StorageModel::R_IsMoreUSBControllersPossible).toBool());
             break;
         default:
Index: trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 48978)
+++ trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 48983)
@@ -229,4 +229,17 @@
 };
 
+/* USB Controller Type */
+class USBStorageControllerType : public AbstractControllerType
+{
+public:
+
+    USBStorageControllerType (KStorageControllerType aSubType);
+
+private:
+
+    KStorageControllerType first() const;
+    uint size() const;
+};
+
 /* Abstract Item */
 class AbstractItem
@@ -436,4 +449,5 @@
         R_IsMoreFloppyControllersPossible,
         R_IsMoreSASControllersPossible,
+        R_IsMoreUSBControllersPossible,
         R_IsMoreAttachmentsPossible,
 
@@ -692,4 +706,5 @@
     void addFloppyController();
     void addSASController();
+    void addUSBController();
     void delController();
 
@@ -770,4 +785,5 @@
     QAction *mAddSASCtrAction;
     QAction *mAddFloppyCtrAction;
+    QAction *mAddUSBCtrAction;
     QAction *mAddAttAction;
     QAction *mDelAttAction;
