 		
 		public function then(onFulfilled:Function = null, onRejected:Function = null):WeavePromise
 		{
+			if (Weave.wasDisposed(relevantContext))
+				return this;
+			
 			if (onFulfilled == null)
 				onFulfilled = noop;
 			if (onRejected == null)
 				onRejected = noop;
 			
 			var next:WeavePromise = new WeavePromise(this);
-			next.result = undefined;
 			handlers.push(new WeavePromiseHandler(onFulfilled, onRejected, next));
 			
+			// 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.Scheduler.callLater(relevantContext, callHandlers, [true]);
-				setBusy(true);
-			}
 			
 			return next;
 		}
 		
 		public function depend(...linkableObjects):WeavePromise
 		{
-			if (linkableObjects.length)
-			{
-				setBusy(true);
-			}
 			for each (var dependency:ILinkableObject in linkableObjects)
 			{
+				if (dependencies.indexOf(dependency) < 0)
+					dependencies.push(dependency);
 				Weave.getCallbacks(dependency).addGroupedCallback(relevantContext, callHandlers, true);
 			}
 			return this;

			return error;
		}
		
		private function setBusy(busy:Boolean):void
		{
			if (busy)
			{
				WeaveAPI.ProgressIndicator.addTask(rootPromise, relevantContext as ILinkableObject);
			}
			else
			{
				WeaveAPI.ProgressIndicator.removeTask(rootPromise);
			}
		}
		
		private function callHandlers(newHandlersOnly:Boolean = false):void
		{
			if (dependencies.some(Weave.isBusy))
			{
				if (handlers.length)
					setBusy(true);
				return;
			}
			
			// if there are no more handlers, remove the task
			if (handlers.length == 0)
				setBusy(false);
			
			if (Weave.wasDisposed(relevantContext))
			{
				setBusy(false);
				return;
			}
			
			for (var i:int = 0; i < handlers.length; i++)
			{

		 */
		public function setError(error:Object):WeavePromise
		{
			if (Weave.wasDisposed(relevantContext))
				return this;
			
			if (WeaveAPI.debugAsyncStack)
				stackTrace_resolved = new Error("WeavePromise resolved");
			
			this.result = undefined;
			this.error = error as Object;
			
