Index: Core/Dxe/Event/Event.h
===================================================================
--- Core/Dxe/Event/Event.h	(revision 13568)
+++ Core/Dxe/Event/Event.h	(working copy)
@@ -31,6 +31,7 @@
   LIST_ENTRY      Link;
   UINT64          TriggerTime;
   UINT64          Period;
+  UINT64          Type;
 } TIMER_EVENT_INFO;
 
 #define EVENT_SIGNATURE         SIGNATURE_32('e','v','n','t')
Index: Core/Dxe/Event/Timer.c
===================================================================
--- Core/Dxe/Event/Timer.c	(revision 13568)
+++ Core/Dxe/Event/Timer.c	(working copy)
@@ -136,24 +136,30 @@
     //
     // If this is a periodic timer, set it
     //
-    if (Event->Timer.Period != 0) {
-      //
-      // Compute the timers new trigger time
-      //
-      Event->Timer.TriggerTime = Event->Timer.TriggerTime + Event->Timer.Period;
-
-      //
-      // If that's before now, then reset the timer to start from now
-      //
-      if (Event->Timer.TriggerTime <= SystemTime) {
+    if (Event->Timer.Type == TimerPeriodic) {
+      if (Event->Timer.Period != 0) {
+        //
+        // Compute the timers new trigger time
+        //
+        Event->Timer.TriggerTime = Event->Timer.TriggerTime + Event->Timer.Period;
+        
+        //
+        // If that's before now, then reset the timer to start from now
+        //
+        if (Event->Timer.TriggerTime <= SystemTime) {
+          Event->Timer.TriggerTime = SystemTime;
+          CoreSignalEvent (mEfiCheckTimerEvent);
+        }
+        
+        //
+        // Add the timer
+        //
+        CoreInsertEventTimer (Event);
+      } else {
         Event->Timer.TriggerTime = SystemTime;
-        CoreSignalEvent (mEfiCheckTimerEvent);
+        CoreInsertEventTimer (Event);
+        break;
       }
-
-      //
-      // Add the timer
-      //
-      CoreInsertEventTimer (Event);
     }
   }
 
@@ -277,6 +283,7 @@
 
   Event->Timer.TriggerTime = 0;
   Event->Timer.Period = 0;
+  Event->Timer.Type = Type;
 
   if (Type != TimerCancel) {
 
