 			}
 		}
 		
-		private var map_task_time:Object = new JS.WeakMap();
+		private var map_task_time:Object = new JS.WeakMap();
+		
+		private var d2d_context_task_token:Dictionary2D = new Dictionary2D(true, true, Object);
 		
 		public function startTask(relevantContext:Object, iterativeTask:Function, priority:uint, finalCallback:Function = null, description:String = null):void
-		{
+		{
+			var taskToken:Object = d2d_context_task_token.get(relevantContext || JS.global, iterativeTask);
+			
 			// do nothing if task already active
-			if (WeaveAPI.ProgressIndicator.hasTask(iterativeTask))
+			if (WeaveAPI.ProgressIndicator.hasTask(taskToken))
 				return;
 			
 			if (debug_async_time)

						JS.log('completed', JS.now()-map_task_time.get(task)[0], priority, map_task_time.get(task)[1], value2);
					}
					// task is done, so remove the task
					WeaveAPI.ProgressIndicator.removeTask(task);
					// run final callback after task completes and is removed
					if (finalCallback != null)
						finalCallback();
					return;
				}
				

				map_task_startTime.set(iterativeTask, JS.now());
				map_task_elapsedTime.set(iterativeTask, 0);
			}
			WeaveAPI.ProgressIndicator.addTask(taskToken, relevantContext as ILinkableObject, description);
			
			var useTimeParameter:Boolean = iterativeTask.length > 0;
			
