 				now = getTimer();
 				if (countdown == 0 || now > pStop)
 				{
-					// keep track of the actual elapsed time for this priority
-					// if we went overtime, let the overflow value carry over to the next frame (but not after that)
-					_priorityElapsedTimes[_activePriority] = Math.min(Math.max(0, now - pStart), pAlloc);
+					// add the time we just spent on this priority
+					_activePriorityElapsedTime += now - pStart;
 					
 					// if max computation time was reached for this frame or we have visited all priorities, stop now
 					if (now > allStop || _activePriority == lastPriority)

					if (remaining == 0)
						break;
					
					// switch to next priority
					_activePriority++;
					if (_activePriority == _priorityCallLaterQueues.length)
						_activePriority = minPriority;
					pStart = now;
					pAlloc = int(_priorityAllocatedTimes[_activePriority]);
					pElapsed = int(_priorityElapsedTimes[_activePriority]);
					pStop = Math.min(allStop, pStart + pAlloc - pElapsed);
					queue = _priorityCallLaterQueues[_activePriority] as Array;
					countdown = queue.length;
					

			var lastPriority:int = _activePriority == minPriority ? _priorityCallLaterQueues.length - 1 : _activePriority - 1;
			var pStart:int = getTimer();
			var pAlloc:int = int(_priorityAllocatedTimes[_activePriority]);
			var pStop:int = Math.min(allStop, pStart + pAlloc - _activePriorityElapsedTime); // continue where we left off
			queue = _priorityCallLaterQueues[_activePriority] as Array;
			countdown = queue.length;
			while (true)
