Index: trunk/src/VBox/Devices/USB/VUSBDevice.cpp
===================================================================
--- trunk/src/VBox/Devices/USB/VUSBDevice.cpp	(revision 37346)
+++ trunk/src/VBox/Devices/USB/VUSBDevice.cpp	(revision 37359)
@@ -58,6 +58,4 @@
     /** User argument to pfnDone. */
     void               *pvUser;
-    /** The timer used to notify EMT. */
-    PTMTIMER            pTimer;
 } VUSBRESETARGS, *PVUSBRESETARGS;
 
@@ -1168,6 +1166,4 @@
             PVUSBRESETARGS pArgs = (PVUSBRESETARGS)pDev->pvResetArgs;
             Assert(pArgs->pDev == pDev);
-            TMR3TimerDestroy(pArgs->pTimer);
-            pArgs->pTimer = NULL;
             RTMemTmpFree(pArgs);
 
@@ -1185,4 +1181,5 @@
     RTMemFree(pDev->paIfStates);
     pDev->enmState = VUSB_DEVICE_STATE_DESTROYED;
+    TMR3TimerDestroy(pDev->pResetTimer);
 }
 
@@ -1252,11 +1249,14 @@
  * Timer callback for doing reset completion.
  *
+ * @param   pUsbIns     The USB device instance.
+ * @param   pTimer      The timer instance.
+ * @param   pvUser      The VUSB device data.
  * @thread EMT
  */
-static DECLCALLBACK(void) vusbDevResetDoneTimer(void *pvUser)
-{
-    PVUSBRESETARGS pArgs = (PVUSBRESETARGS)pvUser;
-    PVUSBDEV pDev = pArgs->pDev;
-    Assert(pDev->pvResetArgs == pArgs);
+static DECLCALLBACK(void) vusbDevResetDoneTimer(PPDMUSBINS pUsbIns, PTMTIMER pTimer, void *pvUser)
+{
+    PVUSBDEV        pDev  = (PVUSBDEV)pvUser;
+    PVUSBRESETARGS  pArgs = (PVUSBRESETARGS)pDev->pvResetArgs;
+    AssertPtr(pArgs); Assert(pArgs->pDev == pDev); Assert(pDev->pUsbIns == pUsbIns);
 
     /*
@@ -1266,5 +1266,5 @@
     AssertRC(rc);
     pDev->hResetThread = NIL_RTTHREAD;
-    pDev->pvResetArgs = NULL;
+    pDev->pvResetArgs  = NULL;
 
     /*
@@ -1273,5 +1273,4 @@
     vusbDevResetDone(pArgs->pDev, pArgs->rc, pArgs->pfnDone, pArgs->pvUser);
 
-    TMR3TimerDestroy(pArgs->pTimer);
     RTMemTmpFree(pArgs);
 }
@@ -1291,4 +1290,5 @@
 {
     PVUSBRESETARGS  pArgs = (PVUSBRESETARGS)pvUser;
+    PVUSBDEV        pDev  = pArgs->pDev;
     LogFlow(("vusb: reset thread started\n"));
 
@@ -1296,8 +1296,8 @@
      * Tell EMT that we're in flow and then perform the reset.
      */
-    uint64_t u64EndTS = TMTimerGet(pArgs->pTimer) + TMTimerFromMilli(pArgs->pTimer, 10);
+    uint64_t u64EndTS = TMTimerGet(pDev->pResetTimer) + TMTimerFromMilli(pDev->pResetTimer, 10);
     RTThreadUserSignal(Thread);
 
-    int rc = pArgs->rc = vusbDevResetWorker(pArgs->pDev, pArgs->fResetOnLinux);
+    int rc = pArgs->rc = vusbDevResetWorker(pDev, pArgs->fResetOnLinux);
 
     /*
@@ -1306,5 +1306,5 @@
      * us more accurate scheduling than making this thread sleep.
      */
-    int rc2 = TMTimerSet(pArgs->pTimer, u64EndTS);
+    int rc2 = TMTimerSet(pDev->pResetTimer, u64EndTS);
     AssertReleaseRC(rc2);
 
@@ -1318,5 +1318,5 @@
  *
  * Since a device reset shall take at least 10ms from the guest point of view,
- * it must be performed asynchronously. We create a thread which performs this
+ * it must be performed asynchronously.  We create a thread which performs this
  * operation and ensures it will take at least 10ms.
  *
@@ -1371,25 +1371,20 @@
         if (pArgs)
         {
-            pArgs->pTimer = TMR3TimerCreateExternal(pVM, TMCLOCK_VIRTUAL, vusbDevResetDoneTimer, pArgs, "USB Device Reset Timer.");
-            if (pArgs->pTimer)
+            pDev->pvResetArgs = pArgs;
+            pArgs->pDev = pDev;
+            pArgs->fResetOnLinux = fResetOnLinux;
+            pArgs->rc = VERR_INTERNAL_ERROR;
+            pArgs->pfnDone = pfnDone;
+            pArgs->pvUser = pvUser;
+            int rc = RTThreadCreate(&pDev->hResetThread, vusbDevResetThread, pArgs, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "USBRESET");
+            if (RT_SUCCESS(rc))
             {
-                pDev->pvResetArgs = pArgs;
-                pArgs->pDev = pDev;
-                pArgs->fResetOnLinux = fResetOnLinux;
-                pArgs->rc = VERR_INTERNAL_ERROR;
-                pArgs->pfnDone = pfnDone;
-                pArgs->pvUser = pvUser;
-                int rc = RTThreadCreate(&pDev->hResetThread, vusbDevResetThread, pArgs, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "USBRESET");
-                if (RT_SUCCESS(rc))
-                {
-                    /* give the thread a chance to get started. */
-                    RTThreadUserWait(pDev->hResetThread, 2);
-                    return rc;
-                }
-
-                pDev->pvResetArgs = NULL;
-                pDev->hResetThread = NIL_RTTHREAD;
-                TMR3TimerDestroy(pArgs->pTimer);
+                /* give the thread a chance to get started. */
+                RTThreadUserWait(pDev->hResetThread, 2);
+                return rc;
             }
+
+            pDev->pvResetArgs  = NULL;
+            pDev->hResetThread = NIL_RTTHREAD;
             RTMemTmpFree(pArgs);
         }
@@ -1554,4 +1549,12 @@
     pDev->hResetThread = NIL_RTTHREAD;
     pDev->pvResetArgs = NULL;
+    pDev->pResetTimer = NULL;
+
+    /*
+     * Create the reset timer.
+     */
+    int rc = PDMUsbHlpTMTimerCreate(pUsbIns, TMCLOCK_VIRTUAL, vusbDevResetDoneTimer, pDev, 0 /*fFlags*/,
+                                    "USB Device Reset Timer",  &pDev->pResetTimer);
+    AssertRCReturn(rc, rc);
 
     /*
Index: trunk/src/VBox/Devices/USB/VUSBInternal.h
===================================================================
--- trunk/src/VBox/Devices/USB/VUSBInternal.h	(revision 37346)
+++ trunk/src/VBox/Devices/USB/VUSBInternal.h	(revision 37359)
@@ -212,4 +212,6 @@
     /** Pointer to the reset thread arguments. */
     void               *pvResetArgs;
+    /** The reset timer handle. */
+    PTMTIMER            pResetTimer;
 } VUSBDEV;
 
