 			/* Only execute on the timer tick if we haven't loaded recently */
 			if (evt.type == TimerEvent.TIMER && (getTimer() < (lastUpdate + 200)) ) return;
 
-			if (evt.type == TimerEvent.TIMER) weaveTrace("timed out, jumpstarting canvas read");
-
 			var content:String;
 
 			/* TODO convert to raw ExternalInterface */
-			if (sourceId) content = JavaScript.exec(
-				{elementId: sourceId},
+			if (elementId.value) content = JavaScript.exec(
+				{elementId: elementId.value},
 				"var canvas = document.getElementById(elementId);",
 				"return canvas && canvas.toDataURL && canvas.toDataURL().split(',').pop();");
 
-			if (sourceId && content)
+			if (elementId.value && content)
 			{
 				setImage(content);	
 			}
-			
-
 		}
 
 		public function setImage(base64:String):void

{
	import weave.compiler.StandardLib;
	import weave.api.core.ILinkableObject;

	import mx.containers.Canvas;
	import mx.controls.Image;

		private var lastUpdate:int = 0;
		private var forceReadTimer:Timer;

		public const elementId:LinkableString = newLinkableChild(this, LinkableString);


		public function JavaScriptCanvas()
