diff --git a/src/template/incremental/ASTChange.tt b/src/template/incremental/ASTChange.tt
index 3bd945d2971b4687a58ec18e974a1deff4c89215..687bc476880026f70565a2fb4c3b3404b7ce96ce 100644
--- a/src/template/incremental/ASTChange.tt
+++ b/src/template/incremental/ASTChange.tt
@@ -27,6 +27,7 @@
 
 ASTNode.incHookSetParent = [[
 $if (IncrementalEnabled)
+$include(ASTNode.traceFlushIncBeginSetParent)
 $if (IncrementalLevelParam)
 if (state().disableDeps == 0 && !state().IN_ATTR_STORE_EVAL) {
   getParent_handler.notifyDependencies();
@@ -51,6 +52,7 @@ if (state().disableDeps == 0 && !(state().IN_COMPUTATION > 0)) {
   }
 }
 $endif
+$include(ASTNode.traceFlushIncEndSetParent)
 /*
 if (node != null) {
   inc_changeState(node.inc_state);
@@ -63,6 +65,7 @@ $endif
 
 ASTNode.incHookSetChild1 = [[
 $if(IncrementalEnabled)
+$include(ASTNode.traceFlushIncBeginSetChild)
 
 $if(IncrementalLevelParam)
 if (state().disableDeps == 0 && !state().IN_ATTR_STORE_EVAL) {
@@ -162,13 +165,13 @@ $endif
 
 ASTNode.incHookSetChild5 = [[
 $if(IncrementalEnabled)
-
+$include(ASTNode.traceFlushIncEndSetChild)
 $endif
 ]]
 
 ASTNode.incHookInsertChild1 = [[
 $if(IncrementalEnabled)
-
+$include(ASTNode.traceFlushIncBeginInsertChild)
 $if(IncrementalLevelParam)
 if (state().disableDeps == 0 && !state().IN_ATTR_STORE_EVAL) {
   numChildren_handler.notifyDependencies();
@@ -235,6 +238,7 @@ if (getChild_handler != null) {
   getChild_handler = h;
 }
 $endif
+$include(ASTNode.traceFlushIncEndInsertChild)
 
 $endif
 ]]
@@ -242,7 +246,7 @@ $endif
 
 ASTNode.incHookRemoveChild1 = [[
 $if(IncrementalEnabled)
-
+$include(ASTNode.traceFlushIncBeginRemoveChild)
 $if(IncrementalLevelParam)
 if (state().disableDeps == 0 && !state().IN_ATTR_STORE_EVAL) {
   if (children[i] != null) {
@@ -314,12 +318,14 @@ if (getChild_handler != null && this instanceof $List) {
   getChild_handler[numChildren] = null;
 }
 $endif
+$include(ASTNode.traceFlushIncEndRemoveChild)
 
 $endif
 ]]
 
 TokenComponent.incHookSetToken = [[
 $if(IncrementalEnabled)
+$include(TokenComponent.traceFlushIncBeginSetToken)
 
 $if(IncrementalLevelParam)
 if (state().disableDeps == 0 && !state().IN_ATTR_STORE_EVAL) {
@@ -390,6 +396,6 @@ if (state().disableDeps == 0 && !(state().IN_COMPUTATION > 0)) {
 $endif
 
 }
-
+$include(TokenComponent.traceFlushIncEndSetToken)
 $endif
 ]]
diff --git a/src/template/trace/TraceHooks.tt b/src/template/trace/TraceHooks.tt
index 31090ec4998e0d27036c3eca54d79a7cd2c8e1b4..784f39bbb55cef496677d87399c46b9fb425a66d 100644
--- a/src/template/trace/TraceHooks.tt
+++ b/src/template/trace/TraceHooks.tt
@@ -323,6 +323,66 @@ state().trace().flushAttr("#getAspectName", this, "#hostClassName.#signatureJava
 $endif
 ]]
 
+ASTNode.traceFlushIncBeginSetChild [[
+$if (TraceFlush)
+state().trace().flushIncStart(this, "ASTNode.setChild", i, node);
+$endif
+]]
+
+TokenComponent.traceFlushIncBeginSetToken [[
+$if (TraceFlush)
+state().trace().flushIncStart(this, "set$(Id)", "", value);
+$endif
+]]
+
+ASTNode.traceFlushIncBeginInsertChild [[
+$if (TraceFlush)
+state().trace().flushIncStart(this, "ASTNode.insertChild", i, node);
+$endif
+]]
+
+ASTNode.traceFlushIncBeginRemoveChild [[
+$if (TraceFlush)
+state().trace().flushIncStart(this, "ASTNode.removeChild", i, "");
+$endif
+]]
+
+ASTNode.traceFlushIncBeginSetParent [[
+$if (TraceFlush)
+state().trace().flushIncStart(this, "ASTNode.setParent", "", node);
+$endif
+]]
+
+ASTNode.traceFlushIncEndSetChild [[
+$if (TraceFlush)
+state().trace().flushIncEnd(this, "ASTNode.setChild", i, node);
+$endif
+]]
+
+TokenComponent.traceFlushIncEndSetToken [[
+$if (TraceFlush)
+state().trace().flushIncEnd(this, "set$(Id)", "", value);
+$endif
+]]
+
+ASTNode.traceFlushIncEndInsertChild [[
+$if (TraceFlush)
+state().trace().flushIncEnd(this, "ASTNode.insertChild", i, node);
+$endif
+]]
+
+ASTNode.traceFlushIncEndRemoveChild [[
+$if (TraceFlush)
+state().trace().flushIncEnd(this, "ASTNode.removeChild", i, "");
+$endif
+]]
+
+ASTNode.traceFlushIncEndSetParent [[
+$if (TraceFlush)
+state().trace().flushIncEnd(this, "ASTNode.setParent", "", node);
+$endif
+]]
+
 AttrDecl.traceFlushIncAttr [[
 $if (TraceFlush)
 state.trace().flushIncAttr("#getAspectName", fNode, fAttrID, "", "");
diff --git a/src/template/trace/Tracer.tt b/src/template/trace/Tracer.tt
index 481a03472d22de8f56758725d2a217efc1fdcd04..f2ce9a230c0f34693d3089f161de8d7e717dce1a 100644
--- a/src/template/trace/Tracer.tt
+++ b/src/template/trace/Tracer.tt
@@ -79,7 +79,9 @@ public static class Trace {
     FLUSH_ATTR,
     FLUSH_REWRITE,
     FLUSH_REWRITE_INIT,
+    INC_FLUSH_START,
     INC_FLUSH_ATTR,
+    INC_FLUSH_END,
 
     // Flag: --tracing=coll
     CONTRIBUTION_CHECK_BEGIN,
@@ -348,6 +350,20 @@ public static class Trace {
     receiver.accept($StateClass.Trace.Event.INC_FLUSH_ATTR, aspect, node, attr, params, value);
   }
 
+  /**
+   * Trace that flushing done by incremental evaluation begun.
+   */
+  public void flushIncStart($ASTNode node, String attr, Object params, Object value) {
+    receiver.accept($StateClass.Trace.Event.INC_FLUSH_START, ASPECT_AST, node, attr, params, value);
+  }
+
+  /**
+   * Trace that flushing done by incremental evaluation ended.
+   */
+  public void flushIncEnd($ASTNode node, String attr, Object params, Object value) {
+    receiver.accept($StateClass.Trace.Event.INC_FLUSH_END, ASPECT_AST, node, attr, params, value);
+  }
+
   /**
    * Trace that a contribution check to a collection attribute begun.
    */