diff --git a/ast/JaddCodeGen.jrag b/ast/JaddCodeGen.jrag
index 8e6dde1babba57a691b0b6b8b0287eb200008ceb..7501a79acb51220eb6c12d909c2b3c138c831c08 100644
--- a/ast/JaddCodeGen.jrag
+++ b/ast/JaddCodeGen.jrag
@@ -693,6 +693,9 @@ aspect JaddCodeGen {
       stream.println(ind(5) + "that.setChild(node, i);");
       stream.println(ind(4) + "oldNode.in$Circle(false);");
       stream.println(ind(4) + "rewriteState = that.state().pop();");
+      // ES_2011-09-30: Code generation for incremental evaluation, rewrites
+      if (ASTNode.incremental) jjtGenIncrementalTrackRewrite3(stream);
+      //
       stream.println(ind(3) + "} while(rewriteState == ASTNode$State.REWRITE_CHANGE);");
       stream.println(ind(3) + "if(rewriteState == ASTNode$State.REWRITE_NOCHANGE && that.is$Final()) {");
       if(ASTNode.stagedRewrites)
@@ -990,6 +993,7 @@ aspect JaddCodeGen {
   public void ASTDecl.jjtGenIncrementalTrackRewrite1(PrintWriter stream) {
     stream.println(ind(2) + "if(that.init_children == null) {");
     stream.println(ind(3) +   "that.init_children = new ASTNode[that.children.length];");
+    stream.println(ind(3) +   "that.rewritten_children = new boolean[that.children.length];");
     stream.println(ind(2) + "}");
     stream.println(ind(2) + "if(that.init_children[i] == null) {");
     stream.println(ind(3) +   "that.init_children[i] = node.fullCopy();");
@@ -1004,6 +1008,12 @@ aspect JaddCodeGen {
     //stream.println(ind(2) + "that.children[i] = node;");
     //stream.println(ind(2) + "that.children[i].setParent(that);");
   }
+  // ES_2011-09-30: Code generation for incremental evaluation, tracking rewrites
+  public void ASTDecl.jjtGenIncrementalTrackRewrite3(PrintWriter stream) {
+    stream.println(ind(4) + "if (rewriteState == ASTNode$State.REWRITE_CHANGE) {");
+    stream.println(ind(5) +   "that.rewritten_children[i] = true;");
+    stream.println(ind(4) + "}");
+  }
 
 
   // ES_2011-09-20: Code generation for incremental evaluation, tracking getChild
@@ -1064,6 +1074,9 @@ aspect JaddCodeGen {
       stream.println(ind(3) +   "ASTNode d[] = new ASTNode[i << 1];");
       stream.println(ind(3) +   "System.arraycopy(init_children, 0, d, 0, init_children.length);");
       stream.println(ind(3) +   "init_children = d;");
+      stream.println(ind(3) +   "boolean[] b = new boolean[i << 1];");
+      stream.println(ind(3) +   "System.arraycopy(rewritten_children, 0, b, 0, rewritten_children.length);");
+      stream.println(ind(3) +   "rewritten_children = b;");
       stream.println(ind(2) + "}");
       //
       stream.println(ind(2) + "if (getChild_handler != null) {");
@@ -1130,6 +1143,13 @@ aspect JaddCodeGen {
       stream.println(ind(4) +     "System.arraycopy(init_children, i, d, i+1, init_children.length);");
       stream.println(ind(3) +   "}");
       stream.println(ind(3) +   "init_children = d;");
+      stream.println(ind(3) +   "boolean b[] = new boolean[i << 1];");
+      stream.println(ind(3) +   "System.arraycopy(rewritten_children, 0, b, 0, rewritten_children.length);");
+      stream.println(ind(3) +   "if (i < rewritten_children.length) {");
+      stream.println(ind(4) +     "System.arraycopy(rewritten_children, i, b, i+1, rewritten_children.length);");
+      stream.println(ind(3) +   "}");
+      stream.println(ind(3) +   "rewritten_children = b;");
+
       stream.println(ind(2) + "}");
       //
       stream.println(ind(2) + "if (getChild_handler != null) {");
@@ -1171,6 +1191,7 @@ aspect JaddCodeGen {
       stream.println(ind(3) + "if (init_children != null) {");
       stream.println(ind(4) +   "init_children[i] = null;");
       stream.println(ind(4) +   "System.arraycopy(init_children, i+1, init_children, i, init_children.length-i-1);");
+      stream.println(ind(4) +   "System.arraycopy(rewritten_children, i+1, rewritten_children, i, rewritten_children.length-i-1);");
       stream.println(ind(3) + "}");
       //
       stream.println(ind(3) + "if (getChild_handler != null) {");
@@ -1771,6 +1792,7 @@ aspect JaddCodeGen {
     // rewrite code
     if (name().equals("ASTNode")) {
       stream.println(ind + "protected ASTNode[] ASTNode.init_children;");
+      stream.println(ind + "protected boolean[] ASTNode.rewritten_children;");
     }
     //
 
@@ -1911,9 +1933,10 @@ aspect JaddCodeGen {
     if (name().equals("ASTNode")) {
       stream.println("      if (attrID.equals(\"getChild\")) {");
       stream.println("        int i = (Integer)_parameters;");
-      stream.println("        if (init_children != null && init_children[i] != null) {");
+      stream.println("        if (rewritten_children != null && rewritten_children[i]) {");
       stream.println("          getChild(i).notifyForRemove();");
       stream.println("          children[i] = init_children[i];");
+      stream.println("          rewritten_children[i] = false;");
       stream.println("          init_children[i] = null;");
       stream.println("        }");
       stream.println("      }");
@@ -2193,8 +2216,8 @@ aspect JaddCodeGen {
     stream.println("    public void " + name() + ".dumpCachedValues() {");
     if (name().equals("ASTNode")) {
       // rewrite code
-      stream.println("      for (int k = 0; init_children != null && k < init_children.length; k++) {");
-      stream.println("        if (init_children[k] != null) {");
+      stream.println("      for (int k = 0; rewritten_children != null && k < rewritten_children.length; k++) {");
+      stream.println("        if (rewritten_children[k]) {");
       stream.println("          System.out.println(getChildNoTransform(k).relativeNodeID() + " + 
                                       "\" rewritten from \" + init_children[k].relativeNodeID());");
       stream.println("        }");
diff --git a/test/Test120.result b/test/Test120.result
index bad19d3903493d3f9a9305987666a7d6162bef8a..4c68a25c8f4df28452b029c307c1c7f15314db10 100644
--- a/test/Test120.result
+++ b/test/Test120.result
@@ -1,14 +1,14 @@
 Dependencies:
 dep(A:a1 -> A:getName)
 dep(A:b2 -> A:getName)
-dep(A:b3 -> A:getName)
-dep(A:b6 -> A:getName)
-dep(A:c4 -> A:getName)
-dep(A:c5 -> A:getName)
 dep(A:a3 -> A:b3)
+dep(A:b3 -> A:getName)
 dep(A:a4 -> A:c4)
+dep(A:c4 -> A:getName)
 dep(A:b5 -> A:c5)
+dep(A:c5 -> A:getName)
 dep(A:a6 -> A:b6)
+dep(A:b6 -> A:getName)
 dep(A:a7 -> A:b7_2)
 dep(A:a7 -> A:c7_1)
 dep(A:a8 -> A:c8_1)
diff --git a/test/Test121.result b/test/Test121.result
index 30e865b6f736a2b77ec02a6e5d765650a58dd11f..b2f29da56f42e8ea5df1574ab3fe6d47d4d0283c 100644
--- a/test/Test121.result
+++ b/test/Test121.result
@@ -1,8 +1,8 @@
 Dependencies:
-dep(A:c_String[a] -> A:getName)
-dep(A:c_String[b] -> A:getName)
-dep(A:a1 -> A:c_String[b])
 dep(A:a0 -> A:c_String[a])
+dep(A:a1 -> A:c_String[b])
+dep(A:c_String[b] -> A:getName)
+dep(A:c_String[a] -> A:getName)
 Cached values:
 value(A:a0, false)
 value(A:a1, true)
diff --git a/test/Test122.result b/test/Test122.result
index df0f00c5ae5368cde15b4d11ec9c4e1ec51c00c7..280d6f4fe837781bb74d71cd42de78d369618bcb 100644
--- a/test/Test122.result
+++ b/test/Test122.result
@@ -1,31 +1,38 @@
 Dependencies after b1.decl:
-dep(A/List[0]/B[0]:decl -> A:getChild[0])
-dep(A/List[0]/B[0]:decl -> A/List[0]:getParent)
-dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0])
-dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1])
+dep(A:getChild[0] -> A/List[0]:getChild[0])
+dep(A:getChild[0] -> A/List[0]:getChild[1])
 dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getName)
-dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse)
 dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getParent)
+dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse)
 dep(A/List[0]/B[0]:decl -> A/List[0]/B[1]:getName)
+dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0])
+dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1])
+dep(A/List[0]/B[0]:decl -> A/List[0]:getParent)
+dep(A/List[0]/B[0]:decl -> A:getChild[0])
 Cached values after b1.decl:
+A/List[0] rewritten from A/List
 value(A/List[0]/B[0]:decl, A/List[0]/B[1])
 Dependencies after b2.decl:
-dep(A/List[0]/B[0]:decl -> A:getChild[0])
-dep(A/List[0]/B[1]:decl -> A:getChild[0])
-dep(A/List[0]/B[0]:decl -> A/List[0]:getParent)
-dep(A/List[0]/B[1]:decl -> A/List[0]:getParent)
-dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0])
-dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[0])
-dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1])
-dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[1])
+dep(A:getChild[0] -> A/List[0]:getChild[0])
+dep(A:getChild[0] -> A/List[0]:getChild[1])
 dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getName)
-dep(A/List[0]/B[1]:decl -> A/List[0]/B[0]:getName)
-dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse)
 dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getParent)
+dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse)
 dep(A/List[0]/B[0]:decl -> A/List[0]/B[1]:getName)
-dep(A/List[0]/B[1]:decl -> A/List[0]/B[1]:getUse)
+dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0])
+dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1])
+dep(A/List[0]/B[0]:decl -> A/List[0]:getParent)
+dep(A/List[0]/B[0]:decl -> A:getChild[0])
+dep(A/List[0]/B[1]:decl -> A/List[0]/B[0]:getName)
 dep(A/List[0]/B[1]:decl -> A/List[0]/B[1]:getParent)
+dep(A/List[0]/B[1]:decl -> A/List[0]/B[1]:getUse)
+dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[0])
+dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[1])
+dep(A/List[0]/B[1]:decl -> A/List[0]:getParent)
+dep(A/List[0]/B[1]:decl -> A:getChild[0])
 Cached values after b2.decl:
+A/List[0] rewritten from A/List
 value(A/List[0]/B[0]:decl, A/List[0]/B[1])
 value(A/List[0]/B[1]:decl, A/List[0]/B[0])
 
+
diff --git a/test/Test123.java b/test/Test123.java
index caf6e53da28e856cba5a134c008320db7d1e8d03..3c38886f6893845fd637d3c23da01304bf4021c7 100644
--- a/test/Test123.java
+++ b/test/Test123.java
@@ -8,14 +8,12 @@ public class Test123 {
 
     B b1 = new B("b", "a");
     B b2 = new B("a", "b");    
-
     A a = new A(new test.ast.List().add(b1).add(b2));
-
     b1 = a.getB(0);
     b2 = a.getB(1);
-    
 
     b1.decl();    
+
     System.out.println("Dependencies after b1.decl:");
     a.dumpDependencies();
     a.getChild(0).dumpDependencies();
@@ -27,8 +25,8 @@ public class Test123 {
     b1.dumpCachedValues();
     b2.dumpCachedValues();
 
-
     b2.setName("c");    
+
     System.out.println("Dependencies after b2.setName:");
     a.dumpDependencies();
     a.getChild(0).dumpDependencies();
diff --git a/test/shouldpass b/test/shouldpass
index 550a293c9447f90f46343410d653c7e6ff8f9c78..c4595d8bbfa8100eb6a28a813f31bd3f9fb28fdb 100644
--- a/test/shouldpass
+++ b/test/shouldpass
@@ -78,3 +78,4 @@ test/Test124.java passed
 test/Test125.java passed
 test/Test126.java passed
 test/Test127.java passed
+test/Test128.java passed