Index: /trunk/include/VBox/vmm/tm.h
===================================================================
--- /trunk/include/VBox/vmm/tm.h	(revision 87766)
+++ /trunk/include/VBox/vmm/tm.h	(revision 87767)
@@ -171,8 +171,8 @@
  *
  * @param   pDevIns         Device instance of the device which registered the timer.
- * @param   pTimer          The timer handle.
+ * @param   hTimer          The timer handle.
  * @param   pvUser          User argument specified upon timer creation.
  */
-typedef DECLCALLBACKTYPE(void, FNTMTIMERDEV,(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser));
+typedef DECLCALLBACKTYPE(void, FNTMTIMERDEV,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser));
 /** Pointer to a device timer callback function. */
 typedef FNTMTIMERDEV *PFNTMTIMERDEV;
@@ -183,8 +183,8 @@
  * @param   pUsbIns         The USB device instance the timer is associated
  *                          with.
- * @param   pTimer          The timer handle.
+ * @param   hTimer          The timer handle.
  * @param   pvUser          User argument specified upon timer creation.
  */
-typedef DECLCALLBACKTYPE(void, FNTMTIMERUSB,(PPDMUSBINS pUsbIns, PTMTIMER pTimer, void *pvUser));
+typedef DECLCALLBACKTYPE(void, FNTMTIMERUSB,(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, void *pvUser));
 /** Pointer to a timer callback for a USB device. */
 typedef FNTMTIMERUSB *PFNTMTIMERUSB;
@@ -194,8 +194,8 @@
  *
  * @param   pDrvIns         Device instance of the device which registered the timer.
- * @param   pTimer          The timer handle.
+ * @param   hTimer          The timer handle.
  * @param   pvUser          User argument specified upon timer creation.
  */
-typedef DECLCALLBACKTYPE(void, FNTMTIMERDRV,(PPDMDRVINS pDrvIns, PTMTIMER pTimer, void *pvUser));
+typedef DECLCALLBACKTYPE(void, FNTMTIMERDRV,(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer, void *pvUser));
 /** Pointer to a driver timer callback function. */
 typedef FNTMTIMERDRV *PFNTMTIMERDRV;
@@ -205,7 +205,7 @@
  *
  * @param   pSrvIns         Service instance of the device which registered the timer.
- * @param   pTimer          The timer handle.
- */
-typedef DECLCALLBACKTYPE(void, FNTMTIMERSRV,(PPDMSRVINS pSrvIns, PTMTIMER pTimer));
+ * @param   hTimer          The timer handle.
+ */
+typedef DECLCALLBACKTYPE(void, FNTMTIMERSRV,(PPDMSRVINS pSrvIns, TMTIMERHANDLE hTimer));
 /** Pointer to a service timer callback function. */
 typedef FNTMTIMERSRV *PFNTMTIMERSRV;
Index: /trunk/src/VBox/Devices/Audio/DevHDA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHDA.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Audio/DevHDA.cpp	(revision 87767)
@@ -2643,5 +2643,5 @@
  * @callback_method_impl{FNTMTIMERDEV, Main routine for the stream's timer.}
  */
-static DECLCALLBACK(void) hdaR3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) hdaR3Timer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PHDASTATE       pThis         = PDMDEVINS_2_DATA(pDevIns, PHDASTATE);
@@ -2651,6 +2651,5 @@
     PHDASTREAM      pStreamShared = &pThis->aStreams[idxStream];
     PHDASTREAMR3    pStreamR3     = &pThisCC->aStreams[idxStream];
-    TMTIMERHANDLE   hTimer        = pStreamShared->hTimer;
-    RT_NOREF(pTimer);
+    Assert(hTimer == pStreamShared->hTimer);
 
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect));
Index: /trunk/src/VBox/Devices/Audio/DevIchAc97.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevIchAc97.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Audio/DevIchAc97.cpp	(revision 87767)
@@ -694,6 +694,4 @@
 static DECLCALLBACK(void) ichac97R3Reset(PPDMDEVINS pDevIns);
 
-static DECLCALLBACK(void) ichac97R3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser);
-
 static void               ichac97R3MixerRemoveDrvStreams(PAC97STATER3 pThisCC, PAUDMIXSINK pMixSink, PDMAUDIODIR enmDir,
                                                          PDMAUDIODSTSRCUNION dstSrc);
@@ -2749,5 +2747,5 @@
  * Timer callback which handles the audio data transfers on a periodic basis.}
  */
-static DECLCALLBACK(void) ichac97R3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) ichac97R3Timer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PAC97STATE      pThis     = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
@@ -2756,5 +2754,5 @@
     PAC97STREAM     pStream   = (PAC97STREAM)pvUser;
     PAC97STREAMR3   pStreamCC = &RT_SAFE_SUBSCRIPT8(pThisCC->aStreams, pStream->u8SD);
-    RT_NOREF(pTimer);
+    Assert(hTimer == pStream->hTimer); RT_NOREF(hTimer);
 
     Assert(pStream - &pThis->aStreams[0] == pStream->u8SD);
Index: /trunk/src/VBox/Devices/Audio/DevSB16.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevSB16.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Audio/DevSB16.cpp	(revision 87767)
@@ -300,8 +300,8 @@
  * @callback_method_impl{PFNTMTIMERDEV}
  */
-static DECLCALLBACK(void) sb16TimerIRQ(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) sb16TimerIRQ(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PSB16STATE pThis = PDMDEVINS_2_DATA(pDevIns, PSB16STATE);
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser, hTimer);
 
     pThis->can_write = 1;
@@ -1689,10 +1689,10 @@
  * @callback_method_impl{FNTMTIMERDEV}
  */
-static DECLCALLBACK(void) sb16TimerIO(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) sb16TimerIO(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PSB16STATE pThis = PDMDEVINS_2_DATA(pDevIns, PSB16STATE);
-    RT_NOREF(pTimer, pvUser);
-
-    uint64_t cTicksNow     = PDMDevHlpTimerGet(pDevIns, pThis->hTimerIO);
+    Assert(hTimer == pThis->hTimerIO); RT_NOREF(pvUser);
+
+    uint64_t cTicksNow     = PDMDevHlpTimerGet(pDevIns, hTimer);
     bool     fIsPlaying    = false; /* Whether one or more streams are still playing. */
     bool     fDoTransfer   = false;
@@ -1749,5 +1749,5 @@
         uint64_t cTicks = pThis->cTicksTimerIOInterval;
         /** @todo adjust cTicks down by now much cbOutMin represents. */
-        PDMDevHlpTimerSet(pDevIns, pThis->hTimerIO, cTicksNow + cTicks);
+        PDMDevHlpTimerSet(pDevIns, hTimer, cTicksNow + cTicks);
     }
 }
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 87767)
@@ -5445,9 +5445,9 @@
  * @callback_method_impl{FNTMTIMERDEV, VGA Refresh Timer}
  */
-static DECLCALLBACK(void) vgaR3TimerRefresh(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) vgaR3TimerRefresh(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PVGASTATE   pThis   = PDMDEVINS_2_DATA(pDevIns, PVGASTATE);
     PVGASTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVGASTATECC);
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser);
 
     if (pThis->fScanLineCfg & VBVASCANLINECFG_ENABLE_VSYNC_IRQ)
@@ -5458,5 +5458,5 @@
 
     if (pThis->cMilliesRefreshInterval)
-        PDMDevHlpTimerSetMillies(pDevIns, pThis->hRefreshTimer, pThis->cMilliesRefreshInterval);
+        PDMDevHlpTimerSetMillies(pDevIns, hTimer, pThis->cMilliesRefreshInterval);
 
 # ifdef VBOX_WITH_VIDEOHWACCEL
Index: /trunk/src/VBox/Devices/Input/DevPS2K.cpp
===================================================================
--- /trunk/src/VBox/Devices/Input/DevPS2K.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Input/DevPS2K.cpp	(revision 87767)
@@ -957,9 +957,9 @@
  * done because it would needlessly slow things down.
  */
-static DECLCALLBACK(void) ps2kR3ThrottleTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+static DECLCALLBACK(void) ps2kR3ThrottleTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PPS2K       pThis = (PS2K *)pvUser;
     unsigned    uHaveData;
+    RT_NOREF(hTimer);
 
     /* Grab the lock to avoid races with event delivery or EMTs. */
@@ -985,8 +985,8 @@
  * @note    Note that only the last key held down repeats (if typematic).
  */
-static DECLCALLBACK(void) ps2kR3TypematicTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+static DECLCALLBACK(void) ps2kR3TypematicTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PPS2K pThis = (PS2K *)pvUser;
+    Assert(hTimer == pThis->hKbdTypematicTimer);
     LogFlowFunc(("Typematic state=%d, key %08X\n", pThis->enmTypematicState, pThis->u32TypematicKey));
 
@@ -1002,5 +1002,5 @@
         {
             ps2kR3ProcessKeyEvent(pDevIns, pThis, pThis->u32TypematicKey, true /* Key down */ );
-            PDMDevHlpTimerSetMillies(pDevIns, pThis->hKbdTypematicTimer, pThis->uTypematicRepeat);
+            PDMDevHlpTimerSetMillies(pDevIns, hTimer, pThis->uTypematicRepeat);
         }
     }
@@ -1013,8 +1013,8 @@
  * to delay sending the result to the host for at least a tiny little while.
  */
-static DECLCALLBACK(void) ps2kR3DelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+static DECLCALLBACK(void) ps2kR3DelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PPS2K pThis = (PS2K *)pvUser;
+    RT_NOREF(hTimer);
 
     LogFlowFunc(("Delay timer: cmd %02X\n", pThis->u8CurrCmd));
Index: /trunk/src/VBox/Devices/Input/DevPS2M.cpp
===================================================================
--- /trunk/src/VBox/Devices/Input/DevPS2M.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Input/DevPS2M.cpp	(revision 87767)
@@ -724,9 +724,9 @@
  * Event rate throttling timer to emulate the auxiliary device sampling rate.}
  */
-static DECLCALLBACK(void) ps2mR3ThrottleTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+static DECLCALLBACK(void) ps2mR3ThrottleTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PPS2M       pThis = (PS2M *)pvUser;
     uint32_t    uHaveEvents;
+    Assert(hTimer == pThis->hThrottleTimer);
 
     /* Grab the lock to avoid races with PutEvent(). */
@@ -743,5 +743,5 @@
         ps2mReportAccumulatedEvents(pThis, &pThis->evtQ.Hdr, RT_ELEMENTS(pThis->evtQ.abQueue), pThis->evtQ.abQueue, true);
         KBCUpdateInterrupts(pDevIns);
-        PDMDevHlpTimerSetMillies(pDevIns, pThis->hThrottleTimer, pThis->uThrottleDelay);
+        PDMDevHlpTimerSetMillies(pDevIns, hTimer, pThis->uThrottleDelay);
     }
     else
@@ -758,9 +758,9 @@
  * while.
  */
-static DECLCALLBACK(void) ps2mR3DelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) ps2mR3DelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PPS2M   pThis   = &PDMDEVINS_2_DATA(pDevIns, PKBDSTATE)->Aux;
     PPS2MR3 pThisCC = &PDMDEVINS_2_DATA_CC(pDevIns, PKBDSTATER3)->Aux;
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser, hTimer);
 
     LogFlowFunc(("Delay timer: cmd %02X\n", pThis->u8CurrCmd));
Index: /trunk/src/VBox/Devices/Network/DevE1000.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 87767)
@@ -2191,5 +2191,5 @@
             uint64_t tsNow = PDMDevHlpTimerGet(pDevIns, pThis->hIntTimer);
             if (!!ITR && tsNow - pThis->u64AckedAt < ITR * 256
-                     && pThis->fItrEnabled && (pThis->fItrRxEnabled || !(ICR & ICR_RXT0)))
+                && pThis->fItrEnabled && (pThis->fItrRxEnabled || !(ICR & ICR_RXT0)))
             {
                 E1K_INC_ISTAT_CNT(pThis->uStatIntEarly);
@@ -3509,17 +3509,11 @@
 # ifdef E1K_TX_DELAY
 /**
- * Transmit Delay Timer handler.
- *
- * @remarks We only get here when the timer expires.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3TxDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+ * @callback_method_impl{FNTMTIMERDEV, Transmit Delay Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3TxDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PE1KSTATE pThis = (PE1KSTATE)pvUser;
     Assert(PDMCritSectIsOwner(&pThis->csTx));
+    RT_NOREF(hTimer);
 
     E1K_INC_ISTAT_CNT(pThis->uStatTxDelayExp);
@@ -3537,18 +3531,10 @@
 
 /**
- * Transmit Interrupt Delay Timer handler.
- *
- * @remarks We only get here when the timer expires.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3TxIntDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns);
-    RT_NOREF(pTimer);
+ * @callback_method_impl{FNTMTIMERDEV, Transmit Interrupt Delay Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3TxIntDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PE1KSTATE pThis = (PE1KSTATE)pvUser;
+    Assert(hTimer == pThis->hTIDTimer); RT_NOREF(hTimer);
 
     E1K_INC_ISTAT_CNT(pThis->uStatTID);
@@ -3561,18 +3547,10 @@
 
 /**
- * Transmit Absolute Delay Timer handler.
- *
- * @remarks We only get here when the timer expires.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3TxAbsDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns);
-    RT_NOREF(pTimer);
+ * @callback_method_impl{FNTMTIMERDEV, Transmit Absolute Delay Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3TxAbsDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PE1KSTATE pThis = (PE1KSTATE)pvUser;
+    Assert(hTimer == pThis->hTADTimer); RT_NOREF(hTimer);
 
     E1K_INC_ISTAT_CNT(pThis->uStatTAD);
@@ -3586,16 +3564,10 @@
 
 /**
- * Receive Interrupt Delay Timer handler.
- *
- * @remarks We only get here when the timer expires.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3RxIntDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+ * @callback_method_impl{FNTMTIMERDEV, Receive Interrupt Delay Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3RxIntDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PE1KSTATE pThis = (PE1KSTATE)pvUser;
+    Assert(hTimer == pThis->hRIDTimer); RT_NOREF(hTimer);
 
     E1K_INC_ISTAT_CNT(pThis->uStatRID);
@@ -3606,16 +3578,10 @@
 
 /**
- * Receive Absolute Delay Timer handler.
- *
- * @remarks We only get here when the timer expires.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3RxAbsDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+ * @callback_method_impl{FNTMTIMERDEV, Receive Absolute Delay Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3RxAbsDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PE1KSTATE pThis = (PE1KSTATE)pvUser;
+    Assert(hTimer == pThis->hRADTimer); RT_NOREF(hTimer);
 
     E1K_INC_ISTAT_CNT(pThis->uStatRAD);
@@ -3628,15 +3594,11 @@
 
 /**
- * Late Interrupt Timer handler.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3LateIntTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+ * @callback_method_impl{FNTMTIMERDEV, Late Interrupt Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3LateIntTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PE1KSTATE pThis = (PE1KSTATE)pvUser;
+    Assert(hTimer == pThis->hIntTimer); RT_NOREF(hTimer);
+    RT_NOREF(hTimer);
 
     STAM_PROFILE_ADV_START(&pThis->StatLateIntTimer, a);
@@ -3652,16 +3614,11 @@
 
 /**
- * Link Up Timer handler.
- *
- * @param   pDevIns     Pointer to device instance structure.
- * @param   pTimer      Pointer to the timer.
- * @param   pvUser      NULL.
- * @thread  EMT
- */
-static DECLCALLBACK(void) e1kR3LinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pTimer);
+ * @callback_method_impl{FNTMTIMERDEV, Link Up Timer handler.}
+ */
+static DECLCALLBACK(void) e1kR3LinkUpTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PE1KSTATE   pThis   = (PE1KSTATE)pvUser;
     PE1KSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PE1KSTATECC);
+    Assert(hTimer == pThis->hLUTimer); RT_NOREF(hTimer);
 
     /*
Index: /trunk/src/VBox/Devices/Network/DevPCNet.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevPCNet.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Network/DevPCNet.cpp	(revision 87767)
@@ -4009,10 +4009,10 @@
  * @callback_method_impl{FNTMTIMERDEV, Poll timer}
  */
-static DECLCALLBACK(void) pcnetR3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) pcnetR3Timer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PPCNETSTATE   pThis   = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE);
     PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC);
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect));
-    RT_NOREF(pvUser, pTimer);
+    Assert(hTimer == pThis->hTimerPoll); RT_NOREF(pvUser, hTimer);
 
     STAM_PROFILE_ADV_START(&pThis->StatTimer, a);
@@ -4026,9 +4026,9 @@
  *      Software interrupt timer callback function.}
  */
-static DECLCALLBACK(void) pcnetR3TimerSoftInt(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) pcnetR3TimerSoftInt(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE);
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect));
-    RT_NOREF(pvUser, pTimer);
+    Assert(hTimer == pThis->hTimerSoftInt); RT_NOREF(pvUser, hTimer);
 
     pThis->aCSR[7] |= 0x0800; /* STINT */
@@ -4045,8 +4045,8 @@
  * should be considered lost.
  */
-static DECLCALLBACK(void) pcnetR3TimerRestore(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) pcnetR3TimerRestore(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE);
-    RT_NOREF(pTimer, pvUser);
+    Assert(hTimer == pThis->hTimerRestore); RT_NOREF(pvUser);
 
     int rc = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VERR_SEM_BUSY);
@@ -4056,5 +4056,5 @@
     if (pThis->cLinkDownReported <= PCNET_MAX_LINKDOWN_REPORTED)
     {
-        rc = PDMDevHlpTimerSetMillies(pDevIns, pThis->hTimerRestore, 1500);
+        rc = PDMDevHlpTimerSetMillies(pDevIns, hTimer, 1500);
         AssertRC(rc);
     }
Index: /trunk/src/VBox/Devices/Network/DevVirtioNet.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevVirtioNet.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Network/DevVirtioNet.cpp	(revision 87767)
@@ -625,9 +625,9 @@
  * @callback_method_impl{FNTMTIMERDEV, Link Up Timer handler.}
  */
-static DECLCALLBACK(void) vnetR3LinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) vnetR3LinkUpTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PVNETSTATE   pThis   = PDMDEVINS_2_DATA(pDevIns, PVNETSTATE);
     PVNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVNETSTATECC);
-    RT_NOREF(pTimer, pvUser);
+    RT_NOREF(hTimer, pvUser);
 
     int rc = vnetR3CsEnter(pDevIns, pThis, VERR_SEM_BUSY);
@@ -1509,9 +1509,9 @@
  * @callback_method_impl{FNTMTIMERDEV, Transmit Delay Timer handler.}
  */
-static DECLCALLBACK(void) vnetR3TxTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) vnetR3TxTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PVNETSTATE      pThis   = PDMDEVINS_2_DATA(pDevIns, PVNETSTATE);
     PVNETSTATECC    pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVNETSTATECC);
-    RT_NOREF(pTimer, pvUser);
+    RT_NOREF(hTimer, pvUser);
 
     uint32_t u32MicroDiff = (uint32_t)((RTTimeNanoTS() - pThis->u64NanoTS) / 1000);
@@ -1527,9 +1527,6 @@
 //    Log3(("%s vnetR3TxTimer: Expired\n", INSTANCE(pThis)));
     vnetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pThisCC->pTxQueue, false /*fOnWorkerThread*/);
-    if (RT_FAILURE(vnetR3CsEnter(pDevIns, pThis, VERR_SEM_BUSY)))
-    {
-        LogRel(("vnetR3TxTimer: Failed to enter critical section!/n"));
-        return;
-    }
+    int rc = vnetR3CsEnter(pDevIns, pThis, VERR_SEM_BUSY)
+    AssertLogRelRCReturnVoid(rc);
     vringSetNotification(pDevIns, &pThisCC->pTxQueue->VRing, true);
     vnetR3CsLeave(pDevIns, pThis);
Index: /trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp	(revision 87767)
@@ -2446,9 +2446,9 @@
  * @callback_method_impl{FNTMTIMERDEV, Link Up Timer handler.}
  */
-static DECLCALLBACK(void) virtioNetR3LinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) virtioNetR3LinkUpTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PVIRTIONET   pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
     PVIRTIONETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIONETCC);
-    RT_NOREF(pTimer, pvUser);
+    RT_NOREF(hTimer, pvUser);
 
     SET_LINK_UP(pThis);
Index: /trunk/src/VBox/Devices/PC/DevACPI.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 87767)
@@ -1172,9 +1172,8 @@
     Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pThis->hPmTimer));
 
-    pThis->uPmTimerVal = ASMMultU64ByU32DivByU32(u64Elapsed, PM_TMR_FREQ,
-                                                 PDMDevHlpTimerGetFreq(pDevIns, pThis->hPmTimer))
+    pThis->uPmTimerVal = ASMMultU64ByU32DivByU32(u64Elapsed, PM_TMR_FREQ, PDMDevHlpTimerGetFreq(pDevIns, pThis->hPmTimer))
                        & TMR_VAL_MASK;
 
-    if ( (pThis->uPmTimerVal & TMR_VAL_MSB) != msb)
+    if ((pThis->uPmTimerVal & TMR_VAL_MSB) != msb)
         acpiUpdatePm1a(pDevIns, pThis, pThis->pm1a_sts | TMR_STS, pThis->pm1a_en);
 }
@@ -1185,9 +1184,10 @@
  * @callback_method_impl{FNTMTIMERDEV, PM Timer callback}
  */
-static DECLCALLBACK(void) acpiR3PmTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) acpiR3PmTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PACPISTATE pThis = PDMDEVINS_2_DATA(pDevIns, PACPISTATE);
-    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pThis->hPmTimer));
-    RT_NOREF(pTimer, pvUser);
+    Assert(pThis->hPmTimer == hTimer);
+    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, hTimer));
+    RT_NOREF(pvUser);
 
     DEVACPI_LOCK_R3(pDevIns, pThis);
@@ -1195,9 +1195,9 @@
          pThis->pm1a_sts, (pThis->pm1a_sts & TMR_STS) != 0,
          pThis->pm1a_en, (pThis->pm1a_en & TMR_EN) != 0));
-    uint64_t u64Now = PDMDevHlpTimerGet(pDevIns, pThis->hPmTimer);
-    acpiPmTimerUpdate(pDevIns, pThis, u64Now);
+    uint64_t tsNow = PDMDevHlpTimerGet(pDevIns, hTimer);
+    acpiPmTimerUpdate(pDevIns, pThis, tsNow);
     DEVACPI_UNLOCK(pDevIns, pThis);
 
-    acpiR3PmTimerReset(pDevIns, pThis, u64Now);
+    acpiR3PmTimerReset(pDevIns, pThis, tsNow);
 }
 
Index: /trunk/src/VBox/Devices/PC/DevHPET.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevHPET.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/PC/DevHPET.cpp	(revision 87767)
@@ -1104,12 +1104,9 @@
 }
 
-/**
- * Device timer callback function.
- *
- * @param   pDevIns         Device instance of the device which registered the timer.
- * @param   pTimer          The timer handle.
- * @param   pvUser          Pointer to the HPET timer state.
- */
-static DECLCALLBACK(void) hpetR3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+
+/**
+ * @callback_method_impl{FNTMTIMERDEV, Device timer callback function.}
+ */
+static DECLCALLBACK(void) hpetR3Timer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PHPET       pThis      = PDMDEVINS_2_DATA(pDevIns, PHPET);
@@ -1118,5 +1115,5 @@
     uint64_t    u64CurTick = hpetGetTicks(pDevIns, pThis);
     uint64_t    u64Diff;
-    RT_NOREF(pTimer);
+    Assert(hTimer == pHpetTimer->hTimer);
 
     if (pHpetTimer->u64Config & HPET_TN_PERIODIC)
@@ -1133,5 +1130,5 @@
                 Log4(("HPET: periodic: next in %llu\n", hpetTicksToNs(pThis, u64Diff)));
                 STAM_REL_COUNTER_INC(&pHpetTimer->StatSetTimer);
-                PDMDevHlpTimerSetNano(pDevIns, pHpetTimer->hTimer, hpetTicksToNs(pThis, u64Diff));
+                PDMDevHlpTimerSetNano(pDevIns, hTimer, hpetTicksToNs(pThis, u64Diff));
             }
             else
@@ -1147,5 +1144,5 @@
         {
             u64Diff = hpetComputeDiff(pHpetTimer, u64CurTick);
-            PDMDevHlpTimerSetNano(pDevIns, pHpetTimer->hTimer, hpetTicksToNs(pThis, u64Diff));
+            PDMDevHlpTimerSetNano(pDevIns, hTimer, hpetTicksToNs(pThis, u64Diff));
             pHpetTimer->u8Wrap = 0;
         }
Index: /trunk/src/VBox/Devices/PC/DevPit-i8254.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevPit-i8254.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/PC/DevPit-i8254.cpp	(revision 87767)
@@ -1114,16 +1114,16 @@
  * @callback_method_impl{FNTMTIMERDEV, User argument points to the PIT channel state.}
  */
-static DECLCALLBACK(void) pitR3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) pitR3Timer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PPITSTATE   pThis = PDMDEVINS_2_DATA(pDevIns, PPITSTATE);
     PPITCHANNEL pChan = (PPITCHANNEL)pvUser;
-    RT_NOREF(pTimer);
     STAM_PROFILE_ADV_START(&pThis->StatPITHandler, a);
+    Assert(hTimer == pChan->hTimer);
 
     Log(("pitR3Timer\n"));
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect));
-    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pChan->hTimer));
-
-    pitR3IrqTimerUpdate(pDevIns, pThis, pChan, pChan->next_transition_time, PDMDevHlpTimerGet(pDevIns, pChan->hTimer), true);
+    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, hTimer));
+
+    pitR3IrqTimerUpdate(pDevIns, pThis, pChan, pChan->next_transition_time, PDMDevHlpTimerGet(pDevIns, hTimer), true);
 
     STAM_PROFILE_ADV_STOP(&pThis->StatPITHandler, a);
Index: /trunk/src/VBox/Devices/PC/DevRTC.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevRTC.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/PC/DevRTC.cpp	(revision 87767)
@@ -584,10 +584,11 @@
  * @callback_method_impl{FNTMTIMERDEV, periodic}
  */
-static DECLCALLBACK(void) rtcTimerPeriodic(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF2(pTimer, pvUser);
+static DECLCALLBACK(void) rtcTimerPeriodic(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PRTCSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PRTCSTATE);
-    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pThis->hPeriodicTimer));
+    Assert(hTimer == pThis->hPeriodicTimer);
+    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, hTimer));
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, pDevIns->CTX_SUFF(pCritSectRo)));
+    RT_NOREF2(hTimer, pvUser);
 
     rtc_timer_update(pDevIns, pThis, pThis->next_periodic_time);
@@ -666,5 +667,5 @@
  * @callback_method_impl{FNTMTIMERDEV, Second timer.}
  */
-static DECLCALLBACK(void) rtcR3TimerSecond(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) rtcR3TimerSecond(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PRTCSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PRTCSTATE);
@@ -672,5 +673,5 @@
     Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pThis->hPeriodicTimer));
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, pDevIns->CTX_SUFF(pCritSectRo)));
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser, hTimer);
 
     /* if the oscillator is not in normal operation, we do not update */
@@ -728,5 +729,5 @@
  * @callback_method_impl{FNTMTIMERDEV, Second2 timer.}
  */
-static DECLCALLBACK(void) rtcR3TimerSecond2(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) rtcR3TimerSecond2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PRTCSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PRTCSTATE);
@@ -734,5 +735,5 @@
     Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pThis->hPeriodicTimer));
     Assert(PDMDevHlpCritSectIsOwner(pDevIns, pDevIns->CTX_SUFF(pCritSectRo)));
-    RT_NOREF2(pTimer, pvUser);
+    RT_NOREF2(hTimer, pvUser);
 
     if (!(pThis->cmos_data[RTC_REG_B] & REG_B_SET))
Index: /trunk/src/VBox/Devices/Serial/UartCore.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/UartCore.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Serial/UartCore.cpp	(revision 87767)
@@ -1499,10 +1499,10 @@
  * @callback_method_impl{FNTMTIMERDEV, Fifo timer function.}
  */
-static DECLCALLBACK(void) uartR3RcvFifoTimeoutTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    LogFlowFunc(("pDevIns=%#p pTimer=%#p pvUser=%#p\n", pDevIns, pTimer, pvUser));
+static DECLCALLBACK(void) uartR3RcvFifoTimeoutTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
+    LogFlowFunc(("pDevIns=%#p hTimer=%#p pvUser=%#p\n", pDevIns, hTimer, pvUser));
     PUARTCORER3 pThisCC = (PUARTCORECC)pvUser;
     PUARTCORE   pThis   = pThisCC->pShared;
-    RT_NOREF(pTimer);
+    RT_NOREF(hTimer);
 
     if (pThis->FifoRecv.cbUsed < pThis->FifoRecv.cbItl)
@@ -1514,15 +1514,16 @@
 
 /**
- * @callback_method_impl{FNTMTIMERDEV, TX timer function when there is no driver connected for draining the THR/FIFO.}
- */
-static DECLCALLBACK(void) uartR3TxUnconnectedTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    LogFlowFunc(("pDevIns=%#p pTimer=%#p pvUser=%#p\n", pDevIns, pTimer, pvUser));
+ * @callback_method_impl{FNTMTIMERDEV,
+ *      TX timer function when there is no driver connected for
+ *      draining the THR/FIFO.}
+ */
+static DECLCALLBACK(void) uartR3TxUnconnectedTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
+    LogFlowFunc(("pDevIns=%#p hTimer=%#p pvUser=%#p\n", pDevIns, hTimer, pvUser));
     PUARTCORER3 pThisCC = (PUARTCORECC)pvUser;
     PUARTCORE   pThis   = pThisCC->pShared;
-    RT_NOREF(pTimer);
-
-    VBOXSTRICTRC rc1 = PDMDevHlpTimerLockClock2(pDevIns, pThis->hTimerTxUnconnected, &pThis->CritSect,
-                                                VINF_SUCCESS /* must get it */);
+    Assert(hTimer == pThis->hTimerTxUnconnected);
+
+    VBOXSTRICTRC rc1 = PDMDevHlpTimerLockClock2(pDevIns, hTimer, &pThis->CritSect, VINF_SUCCESS /* must get it */);
     AssertRCReturnVoid(VBOXSTRICTRC_VAL(rc1));
 
@@ -1566,5 +1567,5 @@
 
     if (cbRead == 1)
-        PDMDevHlpTimerSetRelative(pDevIns, pThis->hTimerTxUnconnected, pThis->cSymbolXferTicks, NULL);
+        PDMDevHlpTimerSetRelative(pDevIns, hTimer, pThis->cSymbolXferTicks, NULL);
     else
     {
@@ -1573,5 +1574,5 @@
     }
 
-    PDMDevHlpTimerUnlockClock2(pDevIns, pThis->hTimerTxUnconnected, &pThis->CritSect);
+    PDMDevHlpTimerUnlockClock2(pDevIns, hTimer, &pThis->CritSect);
 }
 
Index: /trunk/src/VBox/Devices/Storage/DevAHCI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevAHCI.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Storage/DevAHCI.cpp	(revision 87767)
@@ -963,7 +963,7 @@
  * @callback_method_impl{FNTMTIMERDEV, Assert irq when an CCC timeout occurs.}
  */
-static DECLCALLBACK(void) ahciCccTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+static DECLCALLBACK(void) ahciCccTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
+    RT_NOREF(pDevIns, hTimer);
     PAHCI pThis = (PAHCI)pvUser;
 
Index: /trunk/src/VBox/Devices/Storage/DevFdc.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevFdc.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/Storage/DevFdc.cpp	(revision 87767)
@@ -2214,9 +2214,9 @@
  * @callback_method_impl{FNTMTIMERDEV}
  */
-static DECLCALLBACK(void) fdcTimerCallback(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) fdcTimerCallback(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     fdctrl_t *fdctrl = PDMDEVINS_2_DATA(pDevIns, fdctrl_t *);
     fdrive_t *cur_drv = get_cur_drv(fdctrl);
-    RT_NOREF(pTimer, pvUser);
+    RT_NOREF(hTimer, pvUser);
 
     /* Pretend we are spinning.
@@ -2298,8 +2298,8 @@
  * @callback_method_impl{FNTMTIMERDEV}
  */
-static DECLCALLBACK(void) fdcTransferDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) fdcTransferDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     fdctrl_t *fdctrl = PDMDEVINS_2_DATA(pDevIns, fdctrl_t *);
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser, hTimer);
     fdctrl_stop_transfer_now(fdctrl, fdctrl->st0, fdctrl->st1, fdctrl->st2);
 }
@@ -2309,8 +2309,8 @@
  * @callback_method_impl{FNTMTIMERDEV}
  */
-static DECLCALLBACK(void) fdcIrqDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) fdcIrqDelayTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     fdctrl_t *fdctrl = PDMDEVINS_2_DATA(pDevIns, fdctrl_t *);
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser, hTimer);
     fdctrl_raise_irq_now(fdctrl, fdctrl->st0);
 }
Index: /trunk/src/VBox/Devices/USB/DevOHCI.cpp
===================================================================
--- /trunk/src/VBox/Devices/USB/DevOHCI.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/USB/DevOHCI.cpp	(revision 87767)
@@ -904,5 +904,4 @@
 static int                  ohciR3InDoneQueueFind(POHCICC pThisCC, uint32_t GCPhysTD);
 # endif
-static DECLCALLBACK(void)   ohciR3LoadReattachDevices(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser);
 #endif /* IN_RING3 */
 RT_C_DECLS_END
@@ -5804,4 +5803,31 @@
 
 /**
+ * @callback_method_impl{FNTMTIMERDEV,
+ *      Reattaches devices after a saved state load.}
+ */
+static DECLCALLBACK(void) ohciR3LoadReattachDevices(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
+    POHCICC      pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC);
+    POHCILOAD    pLoad   = pThisCC->pLoad;
+    LogFlow(("ohciR3LoadReattachDevices:\n"));
+    Assert(hTimer == pLoad->hTimer); RT_NOREF(pvUser);
+
+    /*
+     * Reattach devices.
+     */
+    for (unsigned i = 0; i < pLoad->cDevs; i++)
+        VUSBIRhAttachDevice(pThisCC->RootHub.pIRhConn, pLoad->apDevs[i]);
+
+    /*
+     * Cleanup.
+     */
+    PDMDevHlpTimerDestroy(pDevIns, hTimer);
+    pLoad->hTimer = NIL_TMTIMERHANDLE;
+    PDMDevHlpMMHeapFree(pDevIns, pLoad);
+    pThisCC->pLoad = NULL;
+}
+
+
+/**
  * Done state load operation.
  *
@@ -5830,31 +5856,4 @@
 
     return VINF_SUCCESS;
-}
-
-
-/**
- * @callback_method_impl{FNTMTIMERDEV,
- *      Reattaches devices after a saved state load.}
- */
-static DECLCALLBACK(void) ohciR3LoadReattachDevices(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    POHCICC      pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC);
-    POHCILOAD    pLoad   = pThisCC->pLoad;
-    LogFlow(("ohciR3LoadReattachDevices:\n"));
-    RT_NOREF(pTimer, pvUser);
-
-    /*
-     * Reattach devices.
-     */
-    for (unsigned i = 0; i < pLoad->cDevs; i++)
-        VUSBIRhAttachDevice(pThisCC->RootHub.pIRhConn, pLoad->apDevs[i]);
-
-    /*
-     * Cleanup.
-     */
-    PDMDevHlpTimerDestroy(pDevIns, pLoad->hTimer);
-    pLoad->hTimer = NIL_TMTIMERHANDLE;
-    PDMDevHlpMMHeapFree(pDevIns, pLoad);
-    pThisCC->pLoad = NULL;
 }
 
Index: /trunk/src/VBox/Devices/USB/VUSBDevice.cpp
===================================================================
--- /trunk/src/VBox/Devices/USB/VUSBDevice.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/USB/VUSBDevice.cpp	(revision 87767)
@@ -1372,17 +1372,13 @@
 
 /**
- * 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(PPDMUSBINS pUsbIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pUsbIns, pTimer);
+ * @callback_method_impl{FNTMTIMERUSB,
+ *          Timer callback for doing reset completion.}
+ */
+static DECLCALLBACK(void) vusbDevResetDoneTimer(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PVUSBDEV        pDev  = (PVUSBDEV)pvUser;
     PVUSBRESETARGS  pArgs = (PVUSBRESETARGS)pDev->pvArgs;
     Assert(pDev->pUsbIns == pUsbIns);
+    RT_NOREF(pUsbIns, hTimer);
 
     AssertPtr(pArgs);
Index: /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
===================================================================
--- /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 87766)
+++ /trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 87767)
@@ -511,11 +511,11 @@
  * @remarks Does not take the VMMDev critsect.
  */
-static DECLCALLBACK(void) vmmDevHeartbeatFlatlinedTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
-    RT_NOREF(pDevIns, pTimer);
+static DECLCALLBACK(void) vmmDevHeartbeatFlatlinedTimer(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
+{
     PVMMDEV pThis = (PVMMDEV)pvUser;
+    Assert(hTimer == pThis->hFlatlinedTimer);
     if (pThis->fHeartbeatActive)
     {
-        uint64_t cNsElapsed = PDMDevHlpTimerGetNano(pDevIns, pThis->hFlatlinedTimer) - pThis->nsLastHeartbeatTS;
+        uint64_t cNsElapsed = PDMDevHlpTimerGetNano(pDevIns, hTimer) - pThis->nsLastHeartbeatTS;
         if (   !pThis->fFlatlined
             && cNsElapsed >= pThis->cNsHeartbeatInterval)
Index: /trunk/src/VBox/ExtPacks/BusMouseSample/DevBusMouse.cpp
===================================================================
--- /trunk/src/VBox/ExtPacks/BusMouseSample/DevBusMouse.cpp	(revision 87766)
+++ /trunk/src/VBox/ExtPacks/BusMouseSample/DevBusMouse.cpp	(revision 87767)
@@ -237,10 +237,11 @@
  * @callback_method_impl{FNTMTIMERDEV}
  */
-static DECLCALLBACK(void) bmsR3TimerCallback(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) bmsR3TimerCallback(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PBMSSTATE   pThis   = PDMDEVINS_2_DATA(pDevIns, PBMSSTATE);
     PBMSSTATER3 pThisCC = PDMDEVINS_2_DATA(pDevIns, PBMSSTATER3);
     uint8_t     irq_bit;
-    RT_NOREF(pvUser, pTimer);
+    RT_NOREF(pvUser, hTimer);
+    Assert(hTimer == pThis->hMouseTimer);
 
     /* Toggle the IRQ line if interrupts are enabled. */
@@ -283,5 +284,5 @@
 
     /* Re-arm the timer. */
-    PDMDevHlpTimerSetMillies(pDevIns, pThis->hMouseTimer, pThis->cTimerPeriodMs);
+    PDMDevHlpTimerSetMillies(pDevIns, hTimer, pThis->cTimerPeriodMs);
 }
 
Index: /trunk/src/VBox/VMM/VMMR3/APIC.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/APIC.cpp	(revision 87766)
+++ /trunk/src/VBox/VMM/VMMR3/APIC.cpp	(revision 87767)
@@ -1112,5 +1112,5 @@
  *          thread.
  */
-static DECLCALLBACK(void) apicR3TimerCallback(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(void) apicR3TimerCallback(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, void *pvUser)
 {
     PVMCPU      pVCpu    = (PVMCPU)pvUser;
@@ -1119,5 +1119,5 @@
     Assert(pVCpu);
     LogFlow(("APIC%u: apicR3TimerCallback\n", pVCpu->idCpu));
-    RT_NOREF(pDevIns, pTimer, pApicCpu);
+    RT_NOREF(pDevIns, hTimer, pApicCpu);
 
     PXAPICPAGE     pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
Index: /trunk/src/VBox/VMM/VMMR3/TM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/TM.cpp	(revision 87766)
+++ /trunk/src/VBox/VMM/VMMR3/TM.cpp	(revision 87767)
@@ -2303,7 +2303,7 @@
             switch (pTimer->enmType)
             {
-                case TMTIMERTYPE_DEV:       pTimer->u.Dev.pfnTimer(pTimer->u.Dev.pDevIns, pTimer, pTimer->pvUser); break;
-                case TMTIMERTYPE_USB:       pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break;
-                case TMTIMERTYPE_DRV:       pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer, pTimer->pvUser); break;
+                case TMTIMERTYPE_DEV:       pTimer->u.Dev.pfnTimer(pTimer->u.Dev.pDevIns, pTimer->hSelf, pTimer->pvUser); break;
+                case TMTIMERTYPE_USB:       pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer->hSelf, pTimer->pvUser); break;
+                case TMTIMERTYPE_DRV:       pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer->hSelf, pTimer->pvUser); break;
                 case TMTIMERTYPE_INTERNAL:  pTimer->u.Internal.pfnTimer(pVM, pTimer->hSelf, pTimer->pvUser); break;
                 default:
@@ -2487,7 +2487,7 @@
         switch (pTimer->enmType)
         {
-            case TMTIMERTYPE_DEV:       pTimer->u.Dev.pfnTimer(pTimer->u.Dev.pDevIns, pTimer, pTimer->pvUser); break;
-            case TMTIMERTYPE_USB:       pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break;
-            case TMTIMERTYPE_DRV:       pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer, pTimer->pvUser); break;
+            case TMTIMERTYPE_DEV:       pTimer->u.Dev.pfnTimer(pTimer->u.Dev.pDevIns, pTimer->hSelf, pTimer->pvUser); break;
+            case TMTIMERTYPE_USB:       pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer->hSelf, pTimer->pvUser); break;
+            case TMTIMERTYPE_DRV:       pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer->hSelf, pTimer->pvUser); break;
             case TMTIMERTYPE_INTERNAL:  pTimer->u.Internal.pfnTimer(pVM, pTimer->hSelf, pTimer->pvUser); break;
             default:
