     {
         if (!measureProgram) measure();
         if (!updateProgram) compileUpdateProgram();
-        run(measuredUpdateProgram || updateProgram);
+
+        if (measuredUpdateProgram)
+            measuredUpdateProgram.run();
+        else
+            updateProgram.run();
     }
 
     public function optimize():void
     {
         if (!measureProgram) measure();
         if (!updateProgram) compileUpdateProgram();
-        measuredUpdateProgram = copyProgram(updateProgram);
-        filterProgram(measuredUpdateProgram, new ReadOnlyEvaluator());
-        filterProgram(measuredUpdateProgram, new ArithmeticConstFolder());
-        filterProgram(measuredUpdateProgram, new ArithmeticOptimizer());
+        measuredUpdateProgram = updateProgram.clone();
+        measuredUpdateProgram.filter(new ReadOnlyEvaluator());
+        measuredUpdateProgram.filter(new ArithmeticConstFolder());
+        measuredUpdateProgram.filter(new ArithmeticOptimizer());
     }
 
     public function dumpPrograms(linebuf:Array):void

        dumpAST(dumper, measureProgram, linebuf);

        linebuf.push(DUMP_SEPARATOR, "virtualUpdateProgram:");
        dumpAST(dumper, Vector.<ASTNode>(virtualUpdateProgram), linebuf);

        linebuf.push(DUMP_SEPARATOR, "updateProgram:");
        dumpAST(dumper, updateProgram, linebuf);

            // b is span
            // target.axis = a - (b * .5)
            // target.span = b
            programNodes.push(
                new SetRuntimeProp(target, _axis,
                     new Subtract(
                        a,
