 				return false;
 			}
 		}
-		
+
 		/**
 		 * Frame/timer callback that invokes each scheduled object.
 		 * @param event the event that triggered the callback
 		 */
-		public function tick(event:Event) : void
-        {
-        	// all events will see the same timestamp
-        	var time:Number = new Date().time;
-        	
-        	for each (var s:ISchedulable in _scheduled) {
-        		if (s.evaluate(time))
-        			remove(s);
-        	}
-        	if (_scheduled.length == 0) {
-        		pause();
-        	}
-        }
-        
+		public function tick(event:TimerEvent) : void
+		{
+			// all events will see the same timestamp
+			var time:Number = new Date().time;
+
+			for each (var s:ISchedulable in _scheduled) {
+				if (s.evaluate(time))
+					remove(s);
+			}
+			if (_scheduled.length == 0) {
+				pause();
+			}
+
+			// Defer rendering to the screen update (vertical blanking) period
+			event.updateAfterEvent();
+		}
+
 	} // end of class Scheduler
 }
 
 // scheduler lock class to enforce singleton pattern
-class _Lock { }+class _Lock { }

			}
			return (idx >= 0);
		}
		
		/**
		 * Indicates if an object with the given id is currently in the
		 * scheduler queue. 
		 * @param id the id to check for
		 * @return true if an object with that id is currently scheduled,
		 *  false otherwise

	 * the ISchedulable interface will need to be scheduled. Use the
	 * <tt>Scheduler.instance</tt> property, and not the constructor, to get
	 * a reference to the active scheduler.
	 *
	 * <p>By default, the Scheduler issues updates to all scheduled items each
	 * time the Flash Player advances to the next frame, as reported by the
	 * <code>Event.ENTER_FRAME</code> event. To instead set the update interval
