 				methodTimeoutID = setTimeout(onMethodTimeout, currentMethod.timeout);
 			}
 			
+			// This is used to prevent async callbacks from triggering onMethodCompleted too early.
+			methodIsExecuting = true;
+			
 			if (currentMethod.expects) {
 				var errorClass:Class = getDefinitionByName(currentMethod.expects) as Class;
 				try {

				testListener.onTestSuccess(new TestSuccess(currentTest, currentMethod.name));
			}

			// Calling synchronously is slightly faster but keeps adding to the call stack.
			//runNextMethod();
			
			// green thread for runNextMethod()
			timer.reset();
			timer.start();
		}
		
		protected function onAsyncMethodCalled(event:TimeoutCommandEvent):void {

		}
		
		protected function onAsyncMethodCompleted(event:Event = null):void {
			if (!methodIsExecuting && !Async.instance.hasPending) {
				onMethodCompleted();
			}
		}
