Index: /trunk/src/VBox/Main/include/HostUSBDeviceImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/HostUSBDeviceImpl.h	(revision 57993)
+++ /trunk/src/VBox/Main/include/HostUSBDeviceImpl.h	(revision 57994)
@@ -240,5 +240,5 @@
                             HostUSBDeviceSubState aNewSubState = kHostUSBDeviceSubState_Default);
     bool i_advanceTransition(bool aSkipReAttach = false);
-    bool i_failTransition();
+    bool i_failTransition(HostUSBDeviceState a_enmStateHint);
     USBDeviceState_T i_canonicalState() const;
 
Index: /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp	(revision 57993)
+++ /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp	(revision 57994)
@@ -455,5 +455,5 @@
     {
         alock.acquire();
-        i_failTransition();
+        i_failTransition(kHostUSBDeviceState_Invalid);
         mMachine.setNull();
         if (rc == VERR_SHARING_VIOLATION)
@@ -714,5 +714,5 @@
     {
         alock.acquire();
-        i_failTransition();
+        i_failTransition(kHostUSBDeviceState_Invalid);
         return E_FAIL;
     }
@@ -767,5 +767,5 @@
     {
         alock.acquire();
-        i_failTransition();
+        i_failTransition(kHostUSBDeviceState_Invalid);
         return E_FAIL;
     }
@@ -814,5 +814,5 @@
                     {
                         LogRel(("USB: Async operation timed out for device %s (state: %s)\n", mName, i_getStateName()));
-                        i_failTransition();
+                        i_failTransition(kHostUSBDeviceState_PhysDetached);
                     }
 #endif
@@ -1196,7 +1196,7 @@
                     /* Can only mean that we've failed capturing it. */
                     case kHostUSBDeviceState_Capturing:
-                        LogThisFunc(("{%s} capture failed!\n", mName));
+                        LogThisFunc(("{%s} capture failed! (#1)\n", mName));
                         mUSBProxyService->captureDeviceCompleted(this, false /* aSuccess */);
-                        *aRunFilters = i_failTransition();
+                        *aRunFilters = i_failTransition(kHostUSBDeviceState_UsedByHost);
                         mMachine.setNull();
                         break;
@@ -1264,7 +1264,7 @@
                     /* Can only mean that we've failed capturing it. */
                     case kHostUSBDeviceState_Capturing:
-                        LogThisFunc(("{%s} capture failed!\n", mName));
+                        LogThisFunc(("{%s} capture failed! (#2)\n", mName));
                         mUSBProxyService->captureDeviceCompleted(this, false /* aSuccess */);
-                        *aRunFilters = i_failTransition();
+                        *aRunFilters = i_failTransition(kHostUSBDeviceState_Capturable);
                         mMachine.setNull();
                         break;
@@ -1332,7 +1332,7 @@
 #endif
                         {
-                            LogThisFunc(("{%s} capture failed!\n", mName));
+                            LogThisFunc(("{%s} capture failed! (#3)\n", mName));
                             mUSBProxyService->captureDeviceCompleted(this, false /* aSuccess */);
-                            *aRunFilters = i_failTransition();
+                            *aRunFilters = i_failTransition(kHostUSBDeviceState_Unused);
                             mMachine.setNull();
                         }
@@ -1469,7 +1469,6 @@
              && i_hasAsyncOperationTimedOut())
     {
-        LogRel(("USB: timeout in %s for {%RTuuid} / {%s}\n",
-                i_getStateName(), mId.raw(), mName));
-        *aRunFilters = i_failTransition();
+        LogRel(("USB: timeout in %s for {%RTuuid} / {%s}\n", i_getStateName(), mId.raw(), mName));
+        *aRunFilters = i_failTransition(kHostUSBDeviceState_Invalid);
         fIsImportant = true;
     }
@@ -2019,5 +2018,5 @@
                 case kHostUSBDeviceState_Capturable:
                 case kHostUSBDeviceState_Unused:
-                    Assert(aNewState == mPrevUniState);
+                    Assert(aNewState == mPrevUniState); /** @todo This is kind of wrong, see i_failTransition. */
                     Assert(aNewPendingState == kHostUSBDeviceState_Invalid);
                     Assert(aNewSubState == kHostUSBDeviceSubState_Default);
@@ -2412,8 +2411,10 @@
  *
  * @return true if filters should be applied to the device, false if not.
+ * @param   a_enmStateHint  USB device state hint. kHostUSBDeviceState_Invalid
+ *                          if the caller doesn't have a clue to give.
  *
  * @note    The caller must own the write lock for this object.
  */
-bool HostUSBDevice::i_failTransition()
+bool HostUSBDevice::i_failTransition(HostUSBDeviceState a_enmStateHint)
 {
     AssertReturn(isWriteLockOnCurrentThread(), false);
@@ -2441,5 +2442,8 @@
                 case kHostUSBDeviceSubState_AwaitingReAttach:
                     enmSub = kHostUSBDeviceSubState_Default;
-                    enmState = kHostUSBDeviceState_PhysDetached;
+                    if (a_enmStateHint != kHostUSBDeviceState_Invalid)
+                        enmState = mPrevUniState; /** @todo enmState = a_enmStateHint is more correct, but i_setState doesn't like it. It will usually correct itself shortly. */
+                    else
+                        enmState = kHostUSBDeviceState_PhysDetached;
                     break;
                 default:
