Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 50720)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 50721)
@@ -1777,4 +1777,5 @@
         bool fOhciEnabled = false;
         bool fEhciEnabled = false;
+        bool fXhciEnabled = false;
 
         for (unsigned i = 0; i < USBCtlColl.size(); i++)
@@ -1793,4 +1794,7 @@
                         fEhciEnabled = true;
                         break;
+                    case USBControllerType_XHCI:
+                        fXhciEnabled = true;
+                        break;
                     default:
                         break;
@@ -1808,4 +1812,9 @@
         else
             RTPrintf("EHCI:            %s\n", fEhciEnabled ? "enabled" : "disabled");
+
+        if (details == VMINFO_MACHINEREADABLE)
+            RTPrintf("xhci=\"%s\"\n", fXhciEnabled ? "on" : "off");
+        else
+            RTPrintf("XHCI:            %s\n", fXhciEnabled ? "enabled" : "disabled");
     }
 
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 50720)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 50721)
@@ -161,4 +161,5 @@
     MODIFYVM_VRDE,
     MODIFYVM_RTCUSEUTC,
+    MODIFYVM_USBXHCI,
     MODIFYVM_USBEHCI,
     MODIFYVM_USB,
@@ -323,4 +324,5 @@
     { "--vrdeextpack",              MODIFYVM_VRDE_EXTPACK,              RTGETOPT_REQ_STRING },
     { "--vrde",                     MODIFYVM_VRDE,                      RTGETOPT_REQ_BOOL_ONOFF },
+    { "--usbxhci",                  MODIFYVM_USBXHCI,                   RTGETOPT_REQ_BOOL_ONOFF },
     { "--usbehci",                  MODIFYVM_USBEHCI,                   RTGETOPT_REQ_BOOL_ONOFF },
     { "--usb",                      MODIFYVM_USB,                       RTGETOPT_REQ_BOOL_ONOFF },
@@ -2363,4 +2365,22 @@
             }
 
+            case MODIFYVM_USBXHCI:
+            {
+                ULONG cXhciCtrls = 0;
+                rc = machine->GetUSBControllerCountByType(USBControllerType_XHCI, &cXhciCtrls);
+                if (SUCCEEDED(rc))
+                {
+                    if (!cXhciCtrls && ValueUnion.f)
+                    {
+                        ComPtr<IUSBController> UsbCtl;
+                        CHECK_ERROR(machine, AddUSBController(Bstr("XHCI").raw(), USBControllerType_XHCI,
+                                                              UsbCtl.asOutParam()));
+                    }
+                    else if (cXhciCtrls && !ValueUnion.f)
+                        CHECK_ERROR(machine, RemoveUSBController(Bstr("XHCI").raw()));
+                }
+                break;
+            }
+
             case MODIFYVM_USBEHCI:
             {
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 50720)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 50721)
@@ -16899,5 +16899,6 @@
     <const name="OHCI"      value="1"/>
     <const name="EHCI"      value="2"/>
-    <const name="Last"      value="3">
+    <const name="XHCI"      value="3"/>
+    <const name="Last"      value="4">
       <desc>Last element (invalid). Used for parameter checks.</desc>
     </const>
Index: /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp	(revision 50720)
+++ /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp	(revision 50721)
@@ -72,4 +72,5 @@
     {"usb-ohci",      0,  6,  0, 0},
     {"usb-ehci",      0, 11,  0, 0},
+    {"usb-xhci",      0, 12,  0, 0},
 
     /* ACPI controller */
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 50720)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 50721)
@@ -1691,4 +1691,5 @@
         hrc = pMachine->COMGETTER(USBControllers)(ComSafeArrayAsOutParam(usbCtrls));        H();
         bool fOhciPresent = false; /**< Flag whether at least one OHCI controller is present. */
+        bool fXhciPresent = false; /**< Flag whether at least one XHCI controller is present. */
 
         for (size_t i = 0; i < usbCtrls.size(); ++i)
@@ -1701,11 +1702,15 @@
                 break;
             }
+            else if (enmCtrlType == USBControllerType_XHCI)
+            {
+                fXhciPresent = true;
+                break;
+            }
         }
 
         /*
-         * Currently EHCI is only enabled when a OHCI controller is present too.
-         * This might change when XHCI is supported.
+         * Currently EHCI is only enabled when an OHCI or XHCI controller is present as well.
          */
-        if (fOhciPresent)
+        if (fOhciPresent || fXhciPresent)
             mfVMHasUsbController = true;
 
@@ -1781,4 +1786,48 @@
                 }
 #endif
+                else if (enmCtrlType == USBControllerType_XHCI)
+                {
+                    /*
+                     * USB 3.0 is only available if the proper ExtPack is installed.
+                     *
+                     * Note. Configuring EHCI here and providing messages about
+                     * the missing extpack isn't exactly clean, but it is a
+                     * necessary evil to patch over legacy compatability issues
+                     * introduced by the new distribution model.
+                     */
+                    static const char *s_pszUsbExtPackName = "Oracle VM VirtualBox Extension Pack";
+# ifdef VBOX_WITH_EXTPACK
+                    if (mptrExtPackManager->isExtPackUsable(s_pszUsbExtPackName))
+# endif
+                    {
+                        InsertConfigNode(pDevices, "usb-xhci", &pDev);
+                        InsertConfigNode(pDev,     "0", &pInst);
+                        InsertConfigNode(pInst,    "Config", &pCfg);
+                        InsertConfigInteger(pInst, "Trusted", 1); /* boolean */
+                        hrc = pBusMgr->assignPCIDevice("usb-xhci", pInst);                  H();
+
+                        InsertConfigNode(pInst,    "LUN#0", &pLunL0);
+                        InsertConfigString(pLunL0, "Driver",               "VUSBRootHub");
+                        InsertConfigNode(pLunL0,   "Config", &pCfg);
+
+                        /*
+                         * Attach the status driver.
+                         */
+                        attachStatusDriver(pInst, &mapUSBLed[1], 0, 0, NULL, NULL, 0);
+                    }
+# ifdef VBOX_WITH_EXTPACK
+                    else
+                    {
+                        /* Always fatal. */
+                        return VMR3SetError(pUVM, VERR_NOT_FOUND, RT_SRC_POS,
+                                N_("Implementation of the USB 3.0 controller not found!\n"
+                                   "Because the USB 3.0 controller state is part of the saved "
+                                   "VM state, the VM cannot be started. To fix "
+                                   "this problem, either install the '%s' or disable USB 3.0 "
+                                   "support in the VM settings"),
+                                s_pszUsbExtPackName);
+                    }
+# endif
+                }
             } /* for every USB controller. */
 
Index: /trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp	(revision 50720)
+++ /trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp	(revision 50721)
@@ -575,4 +575,5 @@
         case USBControllerType_OHCI:
         case USBControllerType_EHCI:
+        case USBControllerType_XHCI:
         {
             cCtrs = 1;
Index: /trunk/src/VBox/Main/src-server/USBControllerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/USBControllerImpl.cpp	(revision 50720)
+++ /trunk/src/VBox/Main/src-server/USBControllerImpl.cpp	(revision 50721)
@@ -101,5 +101,5 @@
     ComAssertRet(aParent && !aName.isEmpty(), E_INVALIDARG);
     if (   (enmType <= USBControllerType_Null)
-        || (enmType >  USBControllerType_EHCI))
+        || (enmType >  USBControllerType_XHCI))
         return setError(E_INVALIDARG,
                         tr("Invalid USB controller type"));
@@ -263,4 +263,7 @@
             break;
         case USBControllerType_EHCI:
+            *aUSBStandard = 0x0200;
+            break;
+        case USBControllerType_XHCI:
             *aUSBStandard = 0x0200;
             break;
Index: /trunk/src/VBox/Main/xml/Settings.cpp
===================================================================
--- /trunk/src/VBox/Main/xml/Settings.cpp	(revision 50720)
+++ /trunk/src/VBox/Main/xml/Settings.cpp	(revision 50721)
@@ -3085,4 +3085,6 @@
                         else if (strCtrlType == "EHCI")
                             ctrl.enmType = USBControllerType_EHCI;
+                        else if (strCtrlType == "XHCI")
+                            ctrl.enmType = USBControllerType_XHCI;
                         else
                             throw ConfigFileError(this, pelmCtrl, N_("Invalid value '%s' for Controller/@type attribute"), strCtrlType.c_str());
@@ -4391,4 +4393,7 @@
                     strType = "EHCI";
                     break;
+                case USBControllerType_XHCI:
+                    strType = "XHCI";
+                    break;
                 default:
                     AssertMsgFailed(("Unknown USB controller type %d\n", ctrl.enmType));
