[500962] Fix Incremental CG of root mapping
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
index 888dbf3..5564a6d 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
@@ -405,6 +405,7 @@
 	}
 
 	protected void doCreateIncrementalManagers() {
+		js.append("@Override\n");
 		js.append("protected ");
 		js.appendIsRequired(true);
 		js.append(" ");
@@ -417,6 +418,7 @@
 		js.popIndentation();
 		js.append("}\n");
 		js.append("\n");
+		js.append("@Override\n");
 		js.append("protected ");
 		js.appendIsRequired(true);
 		js.append(" ");
@@ -856,7 +858,12 @@
 		if (useGot) {
 			EPackage ePackage = ClassUtil.nonNullModel(eStructuralFeature.getEContainingClass().getEPackage());
 			//
-			js.append("objectManager.got(this, ");
+			js.append("objectManager.got(");
+			if (localPrefix != null) {
+				js.append(localPrefix);
+				js.append(".");
+			}
+			js.append("this, ");
 			js.appendValueName(source);
 			js.append(", ");
 			js.appendClassReference(genModelHelper.getQualifiedPackageInterfaceName(ePackage));
@@ -869,6 +876,7 @@
 	}
 
 	protected void doIsEqual(@NonNull List<@NonNull ? extends CGParameter> cgFreeVariables) {
+		js.append("@Override\n");
 		js.append("public boolean isEqual(");
 		js.appendIsRequired(true);
 		js.append(" ");
@@ -880,14 +888,19 @@
 		js.append(" [] thoseValues) {\n");
 		js.pushIndentation(null);
 		js.append("return ");
-		int index = 0;
-		for (@NonNull CGParameter cgFreeVariable : cgFreeVariables) {
-			if (index > 0) {
-				js.append("\n    && ");
+		if (cgFreeVariables.size() > 0) {
+			int index = 0;
+			for (@NonNull CGParameter cgFreeVariable : cgFreeVariables) {
+				if (index > 0) {
+					js.append("\n    && ");
+				}
+				js.append("idResolver.oclEquals(");
+				js.append(cgFreeVariable.getValueName());
+				js.append(", thoseValues[" + index++ + "])");
 			}
-			js.append("idResolver.oclEquals(");
-			js.append(cgFreeVariable.getValueName());
-			js.append(", thoseValues[" + index++ + "])");
+		}
+		else {
+			js.append("true");
 		}
 		js.append(";\n");
 		js.popIndentation();
@@ -908,7 +921,7 @@
 			js.pushIndentation(null);
 			String savedLocalPrefix = localPrefix;
 			try {
-				localPrefix = hasMappingClass ? cgMapping.getTransformation().getName() : localPrefix;
+				localPrefix = hasMappingClass ? getMappingName(cgMapping) : localPrefix;
 				if (!cgBody.isInlined()) {
 					cgBody.accept(this);
 				}
@@ -1109,8 +1122,18 @@
 		js.append("public boolean run() {\n");
 		js.pushIndentation(null);
 		js.append("return ");
-		js.append(getMappingName(cgRootMapping));
-		js.append("() && invocationManager.flush();\n");
+		if (isIncremental) {
+			js.append("new ");
+			js.append(getMappingName(cgRootMapping));
+			js.append("(new ");
+			js.appendIsRequired(true);
+			js.append(" Object[0]).execute()");
+		}
+		else {
+			js.append(getMappingName(cgRootMapping));
+			js.append("()");
+		}
+		js.append(" && invocationManager.flush();\n");
 		js.popIndentation();
 		js.append("}\n");
 	}
@@ -1615,7 +1638,7 @@
 				List<@NonNull CGGuardVariable> cgFreeVariables = ClassUtil.nullFree(cgMapping.getFreeVariables());
 				//
 				js.appendCommentWithOCL(null, cgMapping.getAst());
-				if (useClass(cgMapping) && (cgFreeVariables.size() > 0)) {
+				if (useClass(cgMapping) /*&& (cgFreeVariables.size() > 0)*/) {
 					js.append("protected class ");
 					js.append(getMappingName(cgMapping));
 					js.append(" extends ");
@@ -1631,6 +1654,7 @@
 					js.append("\n");
 					doMappingConstructor(cgMapping);
 					js.append("\n");
+					js.append("@Override\n");
 					js.append("public boolean execute() ");
 					doMappingBody(cgMapping, true);
 					js.append("\n");
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java
index 9b2f6e6..a4a9c0c 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java
@@ -40,9 +40,9 @@
 import org.eclipse.qvtd.debug.core.QVTiDebugCore;
 import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 
 public class QVTiLaunchConfigurationDelegate extends LaunchConfigurationDelegate implements QVTiLaunchConstants
@@ -51,7 +51,7 @@
 	protected static final IStatus fgLaunchErrorStatus = new Status(IStatus.ERROR, QVTiDebugPlugin.PLUGIN_ID, LAUNCH_ERROR_CODE, "Launch configuration error", null); //$NON-NLS-1$
 
 	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull ImperativeTransformation transformation) {
-		return new BasicQVTiExecutor(envFactory, transformation);
+		return new QVTiIncrementalExecutor(envFactory, transformation, QVTiIncrementalExecutor.Mode.LAZY);
 	}
 
 	protected @NonNull QVTiDebugCore getDebugCore() {
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
index a5f2694..012a665 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
@@ -65,7 +65,7 @@
 import org.eclipse.qvtd.runtime.evaluation.AbstractTransformer;
 import org.eclipse.qvtd.runtime.evaluation.InvocationFailedException;
 
-public class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor
+public abstract class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor
 {
 	protected final @NonNull ImperativeTransformation transformation;
 	private @Nullable QVTiTransformationAnalysis transformationAnalysis = null;
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java
index 3b8195d..bc8e14e 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     E.D.Willink - initial API and implementation
  ******************************************************************************/
@@ -73,15 +73,15 @@
 	protected static @NonNull String NULL_PLACEHOLDER = "\"<null>\""; //$NON-NLS-1$
 
 	protected final @NonNull GraphStringBuilder context;
-	
-	private Map<AssociationStatus, String> associationId = new HashMap<AssociationStatus, String>();
-	private Map<ClassStatus, String> classId = new HashMap<ClassStatus, String>();
-	private Map<Invocation, GraphNode> invocation2node = new HashMap<Invocation, GraphNode>();
-	private Map<Object, GraphNode> object2node = new HashMap<Object, GraphNode>();
-	private Map<SlotState, GraphNode> slot2node = new HashMap<SlotState, GraphNode>();
-//	private Map<String, String> propertyId2associationId = new HashMap<String, String>();
-//	private Map<String, PropertyStatus> associationId2propertyStatus = new HashMap<String, PropertyStatus>();
-	
+
+	private Map<@NonNull AssociationStatus, @NonNull String> associationId = new HashMap<>();
+	private Map<@NonNull ClassStatus, @NonNull String> classId = new HashMap<>();
+	private Map<@NonNull Invocation, @NonNull GraphNode> invocation2node = new HashMap<>();
+	private Map<@NonNull Object, @NonNull GraphNode> object2node = new HashMap<>();
+	private Map<@NonNull SlotState, @NonNull GraphNode> slot2node = new HashMap<>();
+	//	private Map<@NonNull String, @NonNull String> propertyId2associationId = new HashMap<>();
+	//	private Map<@NonNull String, @NonNull PropertyStatus> associationId2propertyStatus = new HashMap<>();
+
 	public Execution2GraphVisitor(@NonNull GraphStringBuilder s) {
 		this.context = s;
 	}
@@ -98,7 +98,7 @@
 			return associationStatus.isIsOutput() ? "#cc80ff" : "#cc0000";
 		}
 	}
-	
+
 	protected @NonNull String getAssociationId(@NonNull AssociationStatus object) {
 		String id = associationId.get(object);
 		if (id == null) {
@@ -137,7 +137,7 @@
 			return classStatus.isIsOutput() ? "#cc80ff" : "#cc0000";
 		}
 	}
-	
+
 	protected @NonNull String getClassId(@NonNull ClassStatus object) {
 		String id = classId.get(object);
 		if (id == null) {
@@ -150,14 +150,14 @@
 	protected @NonNull GraphNode getInvocationNode(@NonNull Invocation object) {
 		GraphNode node = invocation2node.get(object);
 		if (node == null) {
-//			id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
+			//			id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
 			final String label;
 			if (object instanceof EObject) {
 				label = ((EObject)object).eClass().getName() + "-" + (invocation2node.size() + 1);
 			}
 			else {
 				label = object.toString().replace("@",  "\n@");
-//				label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
+				//				label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
 			}
 			node = new GraphNode()
 			{
@@ -166,7 +166,7 @@
 					s.setLabel(label);
 					s.setShape("hexagon");
 					s.setColor("orange");
-//					context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-",  "\n"));
+					//					context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-",  "\n"));
 					s.appendAttributedNode(nodeName);
 				}
 			};
@@ -176,17 +176,17 @@
 		return node;
 	}
 
-	protected @NonNull GraphNode getObjectNode(@NonNull Object object) {
+	protected @NonNull GraphNode getObjectNode(@NonNull Object object, @NonNull String color) {
 		GraphNode node = object2node.get(object);
 		if (node == null) {
-//			id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
+			//			id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
 			final String label;
 			if (object instanceof EObject) {
 				label = ((EObject)object).eClass().getName() + "-" + (object2node.size() + 1);
 			}
 			else {
 				label = object.toString().replace("@",  "\n@");
-//				label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
+				//				label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
 			}
 			node = new GraphNode()
 			{
@@ -194,7 +194,7 @@
 				public void appendNode(@NonNull GraphStringBuilder s, @NonNull String nodeName) {
 					s.setLabel(label);
 					s.setShape("rectangle");
-					s.setColor("blue");
+					s.setColor(color);
 					s.appendAttributedNode(nodeName);
 				}
 			};
@@ -216,7 +216,7 @@
 		}
 	}
 
-	protected @NonNull GraphNode getSlotNode(SlotState.@NonNull Incremental object) {
+	protected @NonNull GraphNode getSlotNode(SlotState.@NonNull Incremental object, @NonNull String color) {
 		if (object.getValue() != null) {
 			object = object.getPrimarySlotState();
 		}
@@ -240,7 +240,7 @@
 					if (eFeature instanceof EAttribute) {
 						s.setStyle("rounded");
 					}
-					s.setColor("blue");
+					s.setColor(color);
 					s.appendAttributedNode(nodeName);
 				}
 			};
@@ -250,13 +250,13 @@
 		return node;
 	}
 
-/*	@Override
+	/*	@Override
 	public String visiting(@NonNull EvaluationElement visitable) {
 //		append(visitable.getClass().getName());
 		return null;
 	} */
 
-/*	@Override
+	/*	@Override
 	public @Nullable String visitAssociationStatus(@NonNull AssociationStatus object) {
 		String associationId = getAssociationId(object);
 		String fillColor = object.isIsError() ? "#ff0000" : getAssociationColor(object);
@@ -277,7 +277,7 @@
 		return null;
 	} */
 
-/*	@Override
+	/*	@Override
 	public @Nullable String visitAttributeStatus(@NonNull AttributeStatus object) {
 		ClassStatus classStatus = object.getOwningClassStatus();
 		assert classStatus != null;
@@ -301,7 +301,7 @@
 		return null;
 	} */
 
-/*	@Override
+	/*	@Override
 	public @Nullable String visitClassStatus(@NonNull ClassStatus object) {
 		String classId = getClassId(object);
 		context.appendNode(classId, "rectangle", getClassColor(object), 30, 120, classId.replace("-",  "\n"));
@@ -313,8 +313,9 @@
 
 	@Override
 	public @Nullable String visitInvocation(@NonNull Invocation object) {
+		@SuppressWarnings("unused")
 		GraphNode invocationNode = getInvocationNode(object);
-/*		context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-",  "\n"));
+		/*		context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-",  "\n"));
 		for (ElementStatus inputStatus : object.getInputs()) {
 			if (inputStatus instanceof ClassStatus) {
 				ClassStatus classStatus = (ClassStatus)inputStatus;
@@ -344,28 +345,28 @@
 
 	@Override
 	public @Nullable String visitInvocationManager(@NonNull InvocationManager object) {
-//		context.open();
-//			for (ClassStatus classStatus : object.getOwnedClassStatuses()) {
-//				classStatus.accept(this);
-//			}
-//			for (MappingStatus mappingStatus : object.getOwnedMappingStatuses()) {
-//				mappingStatus.accept(this);
-//			}
-//			for (AssociationStatus associationStatus : object.getOwnedAssociationStatuses()) {
-//				associationStatus.accept(this);
-//			}
-//		context.close();
+		//		context.open();
+		//			for (ClassStatus classStatus : object.getOwnedClassStatuses()) {
+		//				classStatus.accept(this);
+		//			}
+		//			for (MappingStatus mappingStatus : object.getOwnedMappingStatuses()) {
+		//				mappingStatus.accept(this);
+		//			}
+		//			for (AssociationStatus associationStatus : object.getOwnedAssociationStatuses()) {
+		//				associationStatus.accept(this);
+		//			}
+		//		context.close();
 		return null;
 	}
 
 	@Override
 	public @Nullable String visitObjectManager(@NonNull ObjectManager objectManager) {
-		Set<Invocation.@NonNull Incremental> allInvocations = new HashSet<Invocation.@NonNull Incremental>();
-		Set<SlotState.@NonNull Incremental> allSlots = new HashSet<SlotState.@NonNull Incremental>();
-		Map<@NonNull Object, List<SlotState.@NonNull Incremental>> object2slots = new HashMap<@NonNull Object, List<SlotState.@NonNull Incremental>>();
-		for (Object object : objectManager.getObjects()) {
-			List<SlotState.Incremental> objectSlots = new ArrayList<SlotState.Incremental>();
-			for (SlotState slotState : objectManager.getSlotStates(object)) {
+		Set<Invocation.@NonNull Incremental> allInvocations = new HashSet<>();
+		Set<SlotState.@NonNull Incremental> allSlots = new HashSet<>();
+		Map<@NonNull Object, @NonNull List<SlotState.@NonNull Incremental>> object2slots = new HashMap<>();
+		for (@NonNull Object object : objectManager.getObjects()) {
+			List<SlotState.@NonNull Incremental> objectSlots = new ArrayList<>();
+			for (@NonNull SlotState slotState : objectManager.getSlotStates(object)) {
 				if (slotState instanceof SlotState.Incremental) {
 					allSlots.add((SlotState.Incremental)slotState);
 					objectSlots.add((SlotState.Incremental)slotState);
@@ -381,28 +382,28 @@
 		for (Invocation.@NonNull Incremental invocation : allInvocations) {
 			invocation.accept(this);
 			GraphNode invocationNode = getInvocationNode(invocation);
-			for (Object createdObject : invocation.getCreatedObjects()) {
-				GraphNode objectNode = getObjectNode(createdObject);
+			for (@NonNull Object createdObject : invocation.getCreatedObjects()) {
+				GraphNode objectNode = getObjectNode(createdObject, "green");
 				appendEdge(invocationNode, objectNode, "green");
 			}
 		}
 		for (SlotState.@NonNull Incremental slotState : allSlots) {
-			GraphNode slotNode = getSlotNode(slotState);
+			GraphNode slotNode = getSlotNode(slotState, "green");
 			slotState.accept(this);
-			for (Invocation invocation : slotState.getSources()) {
+			for (@NonNull Invocation invocation : slotState.getSources()) {
 				appendEdge(getInvocationNode(invocation), slotNode, "green");
 			}
-			for (Invocation invocation : slotState.getTargets()) {
+			for (@NonNull Invocation invocation : slotState.getTargets()) {
 				appendEdge(slotNode, getInvocationNode(invocation), "cyan");
 			}
 			Iterables.addAll(allInvocations, slotState.getTargets());
 		}
-		for (Object object : objectManager.getObjects()) {
-			GraphNode objectNode = getObjectNode(object);
+		for (@NonNull Object object : objectManager.getObjects()) {
+			GraphNode objectNode = getObjectNode(object, "blue");
 			List<SlotState.@NonNull Incremental> slots = object2slots.get(object);
 			if (slots != null) {
 				for (SlotState.@NonNull Incremental slotState : slots) {
-					GraphNode slotNode = getSlotNode(slotState);
+					GraphNode slotNode = getSlotNode(slotState, "blue");
 					slotState.accept(this);
 					appendEdge(objectNode, slotNode, "blue");
 				}
@@ -413,7 +414,7 @@
 
 	@Override
 	public @Nullable String visitSlotState(@NonNull SlotState object) {
-		GraphNode slotNode = getSlotNode((SlotState.@NonNull Incremental) object);
+		//		GraphNode slotNode = getSlotNode((SlotState.@NonNull Incremental) object, "orange");
 		return null;
 	}
 
@@ -422,7 +423,7 @@
 		return null;
 	}
 
-/*	@Override
+	/*	@Override
 	public @Nullable String visitTransformationStatus(@NonNull TransformationStatus object) {
 		context.open();
 			for (ClassStatus classStatus : object.getOwnedClassStatuses()) {
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
index 2fd810d..f4edb7c 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
@@ -104,7 +104,7 @@
 			@NonNull Function asFunction, @Nullable Object @NonNull [] boxedSourceAndArgumentValues) {
 		Map<@NonNull Operation, Computation.@NonNull Constructor> operation2computationConstructor2 = operation2computationConstructor;
 		if (operation2computationConstructor2 == null) {
-			operation2computationConstructor = operation2computationConstructor2 = new HashMap<@NonNull Operation, Computation.@NonNull Constructor>();
+			operation2computationConstructor = operation2computationConstructor2 = new HashMap<>();
 		}
 		Computation.Constructor computationConstructor = operation2computationConstructor2.get(asFunction);
 		if (computationConstructor == null) {
@@ -159,7 +159,7 @@
 		}
 		Map<@NonNull Mapping, Invocation.@NonNull Constructor> mapping2invocationConstructor2 = mapping2invocationConstructor;
 		if (mapping2invocationConstructor2 == null) {
-			mapping2invocationConstructor = mapping2invocationConstructor2 = new HashMap<@NonNull Mapping, Invocation.@NonNull Constructor>();
+			mapping2invocationConstructor = mapping2invocationConstructor2 = new HashMap<>();
 		}
 		Invocation.Constructor invocationConstructor = mapping2invocationConstructor2.get(asMapping);
 		if (invocationConstructor == null) {
@@ -199,7 +199,7 @@
 
 						@Override
 						public String toString() {
-							return mappingCall.getReferredMapping().getName() + "@" + Integer.toHexString(System.identityHashCode(this));
+							return mappingCall.getReferredMapping().getName();// + "@" + Integer.toHexString(System.identityHashCode(this));
 						}
 					};
 					return invocation;
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java
index 2c0776e..6aaa900 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   E.D.Willink - Initial API and implementation
  *******************************************************************************/
@@ -36,7 +36,7 @@
 		@Override
 		public void addCreatedObject(@NonNull Object createdObject) {
 			if (createdObjects == null) {
-				createdObjects = new HashSet<@NonNull Object>();
+				createdObjects = new HashSet<>();
 			}
 			createdObjects.add(createdObject);
 		}
@@ -44,7 +44,7 @@
 		@Override
 		public void addReadSlot(SlotState.@NonNull Incremental readSlot) {
 			if (readSlots == null) {
-				readSlots = new HashSet<SlotState.@NonNull Incremental>();
+				readSlots = new HashSet<>();
 			}
 			readSlots.add(readSlot);
 			readSlot.addTargetInternal(this);
@@ -53,7 +53,7 @@
 		@Override
 		public void addWriteSlot(SlotState.@NonNull Incremental writeSlot) {
 			if (writeSlots == null) {
-				writeSlots = new HashSet<SlotState.@NonNull Incremental>();
+				writeSlots = new HashSet<>();
 			}
 			writeSlots.add(writeSlot);
 			writeSlot.addSourceInternal(this);
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
index 74b38b1..5858888 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
@@ -32,6 +32,7 @@
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationExecutor;
 import org.eclipse.qvtd.runtime.evaluation.TransformationExecutor;
 import org.eclipse.qvtd.runtime.evaluation.Transformer;
@@ -58,7 +59,7 @@
 		}
 
 		public @NonNull BasicQVTiExecutor createEvaluator(@NonNull ImperativeTransformation transformation) {
-			return new BasicQVTiExecutor(getEnvironmentFactory(), transformation);
+			return new QVTiIncrementalExecutor(getEnvironmentFactory(), transformation, QVTiIncrementalExecutor.Mode.LAZY);
 		}
 
 		public @NonNull TransformationExecutor createEvaluator(@NonNull Class<? extends Transformer> txClass) throws ReflectiveOperationException {
@@ -183,8 +184,6 @@
 
 	private void trackExample_Interpreted(MyQVT qvt, @NonNull ImperativeTransformation tx, URI baseURI, String modelName,
 			Map<String, List<Integer>> results)  throws Exception  {
-
-
 		long initStamp = System.currentTimeMillis();
 		executeModelsTX_Interpreted(qvt, tx, baseURI, modelName);
 		long finalStamp = System.currentTimeMillis();
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java
index b4b6546..54e612b 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java
@@ -117,9 +117,10 @@
 			return asResource;
 		}
 
-		protected @NonNull Class<? extends Transformer> generateCode(@NonNull Transformation asTransformation) throws Exception {
+		protected @NonNull Class<? extends Transformer> generateCode(@NonNull Transformation asTransformation, boolean isIncremental) throws Exception {
 			QVTiCodeGenerator cg = new QVTiCodeGenerator(getEnvironmentFactory(), asTransformation);
 			QVTiCodeGenOptions options = cg.getOptions();
+			options.setIsIncremental(isIncremental);
 			options.setUseNullAnnotations(true);
 			options.setPackagePrefix("cg_qvtimperative_tests");
 			cg.generateClassFile();
@@ -220,7 +221,7 @@
 		URI outputModelURI = getProjectFileURI("HSV2HLS/HLSNode.xmi");
 		URI referenceModelURI = getProjectFileURI("HSV2HLS/HLSNodeValidate.xmi");
 		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
-		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
 		Transformer tx = myQVT.createTransformer(txClass);
 		myQVT.loadInput(tx, "hsv", inputModelURI);
 		tx.run();
@@ -233,7 +234,7 @@
 		URI transformURI = getProjectFileURI("ClassesCS2AS/ClassesCS2AS.qvti");
 		URI genModelURI = getProjectFileURI("ClassesCS2AS/ClassesCS2AS.genmodel");
 		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
-		myQVT.generateCode(asTransformation);
+		myQVT.generateCode(asTransformation, false);
 		myQVT.dispose();
 	}
 
@@ -245,7 +246,7 @@
 		URI outputModelURI = getProjectFileURI("ClassesCS2AS/bug459225/example_output.xmi");
 		URI referenceModelURI = getProjectFileURI("ClassesCS2AS/bug459225/example_output_ref.xmi");
 		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
-		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
 		Transformer tx = myQVT.createTransformer(txClass);
 		myQVT.loadInput(tx, "leftCS", inputModelURI);
 		tx.run();
@@ -261,7 +262,7 @@
 		URI outputModelURI = getProjectFileURI("ManualUML2RDBMS/ManualRDBMSPeople.xmi");
 		URI referenceModelURI = getProjectFileURI("ManualUML2RDBMS/ManualRDBMSPeopleValidate.xmi");
 		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
-		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
 		Transformer tx = myQVT.createTransformer(txClass);
 		myQVT.loadInput(tx, "uml", inputModelURI);
 		tx.run();
@@ -277,7 +278,7 @@
 		URI outputModelURI = getProjectFileURI("SimpleUML2RDBMS/SimpleRDBMSPeople.xmi");
 		URI referenceModelURI = getProjectFileURI("SimpleUML2RDBMS/SimpleRDBMSPeopleValidate.xmi");
 		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
-		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
 		Transformer tx = myQVT.createTransformer(txClass);
 		myQVT.loadInput(tx, "uml", inputModelURI);
 		tx.run();
@@ -294,7 +295,24 @@
 		URI outputModelURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.xmi");
 		URI referenceModelURI = getProjectFileURI("Tree2TallTree/TallTreeValidate.xmi");
 		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
-		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
+		Transformer tx = myQVT.createTransformer(txClass);
+		myQVT.loadInput(tx, "tree", inputModelURI);
+		tx.run();
+		myQVT.saveOutput(tx, "talltree", outputModelURI, referenceModelURI, null);
+		myQVT.dispose();
+	}
+
+	public void testCG_Tree2TallTree_Incremental_qvti() throws Exception {
+		//		AbstractTransformer.INVOCATIONS.setState(true);
+		MyQVT myQVT = createQVT();
+		URI genModelURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.genmodel");
+		URI transformURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.qvti");
+		URI inputModelURI = getProjectFileURI("Tree2TallTree/Tree.xmi");
+		URI outputModelURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.xmi");
+		URI referenceModelURI = getProjectFileURI("Tree2TallTree/TallTreeValidate.xmi");
+		Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
+		Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, true);
 		Transformer tx = myQVT.createTransformer(txClass);
 		myQVT.loadInput(tx, "tree", inputModelURI);
 		tx.run();
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
index 8eaa5c1..4ed0079 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
@@ -46,7 +46,6 @@
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTypedModel;
 import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativePackage;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
@@ -486,8 +485,9 @@
 		assertLoadable(ClassUtil.nonNullState(txURI));
 
 		QVTiEnvironmentFactory environmentFactory = myQVT.getEnvironmentFactory();
-		BasicQVTiExecutor testExecutor =  new BasicQVTiExecutor(environmentFactory,
-			(@NonNull ImperativeTransformation) ClassUtil.nonNullState(loadTransformation(environmentFactory.getMetamodelManager(), txURI)));
+		QVTiIncrementalExecutor testExecutor =  new QVTiIncrementalExecutor(environmentFactory,
+			(ImperativeTransformation) ClassUtil.nonNullState(loadTransformation(environmentFactory.getMetamodelManager(), txURI)),
+			QVTiIncrementalExecutor.Mode.LAZY);
 
 		URI csModelURI = baseURI.appendSegment("example_input.xmi");
 		URI asModelURI = baseURI.appendSegment("example_output.xmi");