 			if (handlers.length == 0 && error !== undefined)
 				reportError(error);
 			
+			var shouldCallLater:Boolean = false;
+			
 			for (var i:int = 0; i < handlers.length; i++)
 			{
 				var handler:Handler = handlers[i];
-				if (newHandlersOnly && handler.wasCalled)
+				if (newHandlersOnly != handler.isNew)
+				{
+					shouldCallLater = handler.isNew;
 					continue;
+				}
 				if (result !== undefined)
 					handler.onResult(result);
 				else if (error !== undefined)
 					handler.onError(error);
 			}
+			
+			if (shouldCallLater)
+				WeaveAPI.StageUtils.callLater(relevantContext, callHandlers, [true]);
 		}
 		
 		public function then(onFulfilled:Function = null, onRejected:Function = null):WeavePromise

			
			// call new handler(s) if promise has already been resolved
			if (result !== undefined || error !== undefined)
			{
				// callLater will not call the function if the context was disposed
				WeaveAPI.StageUtils.callLater(relevantContext, callHandlers, [true]);
			}
			
			return next;
		}

	
	public function onError(error:Object):void
	{
		isNew = true;
		try
		{
			next.setResult(onRejected(error));
		}
		catch (e:Error)
		{
