Index: trunk/src/VBox/Devices/Makefile
===================================================================
--- trunk/src/VBox/Devices/Makefile	(revision 2278)
+++ trunk/src/VBox/Devices/Makefile	(revision 2285)
@@ -53,4 +53,7 @@
 ifdef VBOX_WITH_INTERNAL_NETWORKING
  DEFS += VBOX_WITH_INTERNAL_NETWORKING
+endif
+ifeq ($(USERNAME),bird)
+ DEFS += VBOX_WITH_VIRTUAL_SYNC_TIMERS
 endif
 
Index: trunk/src/VBox/Devices/PC/DevACPI.cpp
===================================================================
--- trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 2278)
+++ trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 2285)
@@ -1595,5 +1595,9 @@
     }
 
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    rc = PDMDevHlpTMTimerCreate (pDevIns, TMCLOCK_VIRTUAL_SYNC, acpiTimer, "ACPI Timer", &s->tsHC);
+#else
     rc = PDMDevHlpTMTimerCreate (pDevIns, TMCLOCK_VIRTUAL, acpiTimer, "ACPI Timer", &s->tsHC);
+#endif 
     if (VBOX_FAILURE(rc))
     {
Index: trunk/src/VBox/Devices/PC/DevAPIC.cpp
===================================================================
--- trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 2278)
+++ trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 2285)
@@ -1725,5 +1725,9 @@
      * Create the APIC timer.
      */
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, apicTimer,
+#else
     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, apicTimer,
+#endif
                                 "APIC Timer", &pData->CTXSUFF(pTimer));
     if (VBOX_FAILURE(rc))
Index: trunk/src/VBox/Devices/PC/DevPit-i8254.cpp
===================================================================
--- trunk/src/VBox/Devices/PC/DevPit-i8254.cpp	(revision 2278)
+++ trunk/src/VBox/Devices/PC/DevPit-i8254.cpp	(revision 2285)
@@ -93,6 +93,8 @@
      * As apposed to the next_transition_time which contains the correct time of the next tick. */
     uint64_t            u64NextTS;
+#ifndef VBOX_WITH_VIRTUAL_SYNC_TIMERS
     /** When to give up catching up. (negative number) */
     int64_t             i64MaxCatchupTS;
+#endif
 
     /** (count_load_time is only set by TMTimerGet() which returns uint64_t) */
@@ -136,8 +138,10 @@
     /** Profiling the timer callback handler. */
     STAMPROFILEADV          StatPITHandler;
+#ifndef VBOX_WITH_VIRTUAL_SYNC_TIMERS
     /** The number of times we've had to speed up the time because we lagged too far behind. */
     STAMCOUNTER             StatPITCatchup;
     /** The number of times we've lagged too far behind for it to be worth trying to catch up. */
     STAMCOUNTER             StatPITGiveup;
+#endif
 } PITState;
 
@@ -400,4 +404,11 @@
     }
 
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    if (expire_time != -1)
+    {
+        s->u64NextTS = expire_time;
+        TMTimerSet(s->CTXSUFF(pTimer), s->u64NextTS);
+    }
+#else
     /* check if it expires too soon - move at 4x rate if it does. */
     if (expire_time != -1)
@@ -439,4 +450,5 @@
         TMTimerSet(s->CTXSUFF(pTimer), s->u64NextTS);
     }
+#endif 
     else
     {
@@ -981,5 +993,9 @@
      * Create timer, register I/O Ports and save state.
      */
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, pitTimer, "i8254 Programmable Interval Timer",
+#else
     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, pitTimer, "i8254 Programmable Interval Timer",
+#endif
                                 &pData->channels[0].CTXSUFF(pTimer));
     if (VBOX_FAILURE(rc))
@@ -1024,4 +1040,5 @@
         return rc;
 
+#ifndef VBOX_WITH_VIRTUAL_SYNC_TIMERS
     /*
      * Calculate max catchup time.
@@ -1029,4 +1046,5 @@
     pData->channels[0].i64MaxCatchupTS = pData->channels[1].i64MaxCatchupTS
         = pData->channels[2].i64MaxCatchupTS = -TMTimerFromMilli(pData->channels[0].CTXSUFF(pTimer), 1000*60*2); /* 2 min */
+#endif 
 
     /*
@@ -1040,6 +1058,8 @@
     PDMDevHlpSTAMRegister(pDevIns, &pData->StatPITIrq,      STAMTYPE_COUNTER, "/TM/PIT/Irq",      STAMUNIT_OCCURENCES,     "The number of times a timer interrupt was triggered.");
     PDMDevHlpSTAMRegister(pDevIns, &pData->StatPITHandler,  STAMTYPE_PROFILE, "/TM/PIT/Handler",  STAMUNIT_TICKS_PER_CALL, "Profiling timer callback handler.");
+#ifndef VBOX_WITH_VIRTUAL_SYNC_TIMERS
     PDMDevHlpSTAMRegister(pDevIns, &pData->StatPITCatchup,  STAMTYPE_COUNTER, "/TM/PIT/Catchup",  STAMUNIT_OCCURENCES,     "The number of times we lagged too far behind.");
     PDMDevHlpSTAMRegister(pDevIns, &pData->StatPITGiveup,   STAMTYPE_COUNTER, "/TM/PIT/Giveup",   STAMUNIT_OCCURENCES,     "The number of times we lagged so far behind that we simply gave up.");
+#endif 
 
     PDMDevHlpDBGFInfoRegister(pDevIns, "pit", "Display PIT (i8254) status. (no arguments)", pitInfo);
Index: trunk/src/VBox/Devices/PC/DevRTC.cpp
===================================================================
--- trunk/src/VBox/Devices/PC/DevRTC.cpp	(revision 2278)
+++ trunk/src/VBox/Devices/PC/DevRTC.cpp	(revision 2285)
@@ -149,6 +149,5 @@
 {
     int period_code, period;
-    uint64_t cur_clock, next_irq_clock, now, quarter_period_time;
-    int64_t delta;
+    uint64_t cur_clock, next_irq_clock;
     uint32_t freq;
 
@@ -166,9 +165,12 @@
         next_irq_clock = (cur_clock & ~(uint64_t)(period - 1)) + period;
         s->next_periodic_time = ASMMultU64ByU32DivByU32(next_irq_clock, freq, 32768) + 1;
-
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+        TMTimerSet(s->CTXSUFF(pPeriodicTimer), s->next_periodic_time);
+        
+#else
         /* fiddly bits for dealing with running to keep up and losing interrupts. */
-        quarter_period_time = ASMMultU64ByU32DivByU32(period, freq, 32768 * 4);
-        now = TMTimerGet(s->CTXSUFF(pPeriodicTimer));
-        delta = s->next_periodic_time - now;
+        uint64_t quarter_period_time = ASMMultU64ByU32DivByU32(period, freq, 32768 * 4);
+        uint64_t now = TMTimerGet(s->CTXSUFF(pPeriodicTimer));
+        int64_t delta = s->next_periodic_time - now;
         if (delta >= (int64_t)quarter_period_time)
         {
@@ -183,4 +185,5 @@
                   s->next_periodic_time, delta, now, next));
         }
+#endif
     } else {
         TMTimerStop(s->CTXSUFF(pPeriodicTimer));
@@ -853,5 +856,9 @@
      * Create timers, arm them, register I/O Ports and save state.
      */
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, rtcTimerPeriodic, "MC146818 RTC/CMOS - Periodic", &pData->pPeriodicTimerHC);
+#else
     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, rtcTimerPeriodic, "MC146818 RTC/CMOS - Periodic", &pData->pPeriodicTimerHC);
+#endif
     if (VBOX_FAILURE(rc))
     {
@@ -859,5 +866,9 @@
         return rc;
     }
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, rtcTimerSecond, "MC146818 RTC/CMOS - Second", &pData->pSecondTimerHC);
+#else
     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, rtcTimerSecond, "MC146818 RTC/CMOS - Second", &pData->pSecondTimerHC);
+#endif 
     if (VBOX_FAILURE(rc))
     {
@@ -865,5 +876,9 @@
         return rc;
     }
+#ifdef VBOX_WITH_VIRTUAL_SYNC_TIMERS
+    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, rtcTimerSecond2, "MC146818 RTC/CMOS - Second2", &pData->pSecondTimer2HC);
+#else
     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, rtcTimerSecond2, "MC146818 RTC/CMOS - Second2", &pData->pSecondTimer2HC);
+#endif 
     if (VBOX_FAILURE(rc))
     {
Index: trunk/src/VBox/Devices/testcase/Makefile
===================================================================
--- trunk/src/VBox/Devices/testcase/Makefile	(revision 2278)
+++ trunk/src/VBox/Devices/testcase/Makefile	(revision 2285)
@@ -26,4 +26,10 @@
 #
 PROGRAMS = tstDeviceStructSize tstDeviceStructSizeGC
+
+# temp hack.
+ifeq ($(USERNAME),bird)
+ DEFS += VBOX_WITH_VIRTUAL_SYNC_TIMERS
+endif
+
 
 #
Index: trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp
===================================================================
--- trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp	(revision 2278)
+++ trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp	(revision 2285)
@@ -447,5 +447,7 @@
     GEN_CHECK_OFF(PITChannelState, u64ReloadTS);
     GEN_CHECK_OFF(PITChannelState, u64NextTS);
+#ifndef VBOX_WITH_VIRTUAL_SYNC_TIMERS
     GEN_CHECK_OFF(PITChannelState, i64MaxCatchupTS);
+#endif
     GEN_CHECK_OFF(PITChannelState, count_load_time);
     GEN_CHECK_OFF(PITChannelState, next_transition_time);
@@ -472,6 +474,8 @@
     GEN_CHECK_OFF(PITState, StatPITIrq);
     GEN_CHECK_OFF(PITState, StatPITHandler);
+#ifndef VBOX_WITH_VIRTUAL_SYNC_TIMERS
     GEN_CHECK_OFF(PITState, StatPITCatchup);
     GEN_CHECK_OFF(PITState, StatPITGiveup);
+#endif
 
     /* PC/DevRTC.cpp */
