diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java
index 21b8066..5f9c4bc 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java
@@ -138,7 +138,7 @@
 import org.eclipse.qvtd.pivot.qvtimperative.SimpleParameterBinding;
 import org.eclipse.qvtd.pivot.qvtimperative.Statement;
 import org.eclipse.qvtd.pivot.qvtimperative.VariableStatement;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationAnalysis;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EntryPointsAnalysis;
 import org.eclipse.qvtd.pivot.qvtimperative.util.QVTimperativeVisitor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 
@@ -1029,7 +1029,7 @@
 
 	@Override
 	public @Nullable CGNamedElement visitImperativeTransformation(@NonNull ImperativeTransformation asTransformation) {
-		/*QVTiTransformationAnalysis transformationAnalysis =*/ analyzer.getCodeGenerator().getTransformationAnalysis(asTransformation);
+		/*QVTiTransformationAnalysis entryPointsAnalysis =*/ analyzer.getCodeGenerator().getEntryPointsAnalysis(asTransformation);
 		CGTransformation cgTransformation = QVTiCGModelFactory.eINSTANCE.createCGTransformation();
 		setAst(cgTransformation, asTransformation);
 		pushCurrentClass(cgTransformation);
@@ -1203,8 +1203,8 @@
 	@Override
 	public @Nullable CGNamedElement visitSetStatement(@NonNull SetStatement asSetStatement) {
 		ImperativeTransformation asTransformation = QVTimperativeUtil.getContainingTransformation(asSetStatement);
-		QVTiTransformationAnalysis transformationAnalysis = analyzer.getCodeGenerator().getTransformationAnalysis(asTransformation);
-		Integer cacheIndex = transformationAnalysis.getCacheIndex(asSetStatement);
+		EntryPointsAnalysis entryPointsAnalysis = analyzer.getCodeGenerator().getEntryPointsAnalysis(asTransformation);
+		Integer cacheIndex = entryPointsAnalysis.getCacheIndex(asSetStatement);
 		if (cacheIndex != null) {
 			//			Property asProperty = ClassUtil.nonNullModel(asPropertyAssignment.getTargetProperty());
 			CGMiddlePropertyAssignment cgPropertyAssignment = QVTiCGModelFactory.eINSTANCE.createCGMiddlePropertyAssignment();
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaPreVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaPreVisitor.java
index f0421a3..4929a8b 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaPreVisitor.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaPreVisitor.java
@@ -41,7 +41,7 @@
 import org.eclipse.qvtd.codegen.qvticgmodel.util.QVTiCGModelVisitor;
 import org.eclipse.qvtd.codegen.utilities.QVTiCGUtil;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationAnalysis;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EntryPointsAnalysis;
 
 public class QVTiCG2JavaPreVisitor extends CG2JavaPreVisitor implements QVTiCGModelVisitor<@Nullable Object>
 {
@@ -165,8 +165,8 @@
 	@Override
 	public Object visitCGTransformation(@NonNull CGTransformation cgTransformation) {
 		ImperativeTransformation transformation = QVTiCGUtil.getAST(cgTransformation);
-		QVTiTransformationAnalysis transformationAnalysis = getCodeGenerator().getTransformationAnalysis(transformation);
-		Map<@NonNull Property, @NonNull Integer> opposites = transformationAnalysis.getCaches();
+		EntryPointsAnalysis entryPointsAnalysis = getCodeGenerator().getEntryPointsAnalysis(transformation);
+		Map<@NonNull Property, @NonNull Integer> opposites = entryPointsAnalysis.getCaches();
 		for (@NonNull Property property : opposites.keySet()) {
 			CGElementId cgPropertyId = analyzer.getElementId(property.getPropertyId());
 			cgPropertyId.accept(this);
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 de691c2..c6ace48 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
@@ -13,6 +13,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -114,6 +115,7 @@
 import org.eclipse.qvtd.codegen.qvticgmodel.CGTypedModel;
 import org.eclipse.qvtd.codegen.qvticgmodel.util.QVTiCGModelVisitor;
 import org.eclipse.qvtd.codegen.utilities.QVTiCGUtil;
+import org.eclipse.qvtd.pivot.qvtbase.Function;
 import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
 import org.eclipse.qvtd.pivot.qvtimperative.AppendParameterBinding;
 import org.eclipse.qvtd.pivot.qvtimperative.BufferStatement;
@@ -130,8 +132,9 @@
 import org.eclipse.qvtd.pivot.qvtimperative.NewStatement;
 import org.eclipse.qvtd.pivot.qvtimperative.ObservableStatement;
 import org.eclipse.qvtd.pivot.qvtimperative.SetStatement;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EntryPointAnalysis;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiModelsManager;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationAnalysis;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EntryPointsAnalysis;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.TypedModelAnalysis;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.runtime.evaluation.AbstractComputation;
@@ -160,10 +163,10 @@
 		private @NonNull String @Nullable [] names = null;
 		private @Nullable String extentOppositesName = null;
 
-		public AllInstancesAnalysis(@NonNull QVTiTransformationAnalysis transformationAnalysis, @NonNull TypedModel typedModel, @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses) {
-			super(transformationAnalysis, typedModel, allInstancesCompleteClasses);
+		public AllInstancesAnalysis(@NonNull EntryPointsAnalysis entryPointsAnalysis, @NonNull TypedModel typedModel, @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses) {
+			super(entryPointsAnalysis, typedModel, allInstancesCompleteClasses);
 			ClassId extentClassId = QVTiModelsManager.EXTENT_CLASSID;
-			Map<@NonNull Property, @NonNull Integer> opposites = transformationAnalysis.getCaches();
+			Map<@NonNull Property, @NonNull Integer> opposites = entryPointsAnalysis.getCaches();
 			for (@NonNull Property property : opposites.keySet()) {
 				org.eclipse.ocl.pivot.Class owningClass = PivotUtil.getOwningClass(property);
 				TypeId typeId = owningClass.getTypeId();
@@ -217,7 +220,6 @@
 	protected boolean isIncremental = false;
 	protected boolean alwaysUseClasses = false;
 	protected boolean useGot = true;
-	protected QVTiTransformationAnalysis transformationAnalysis;
 
 	/* Non-null while wrapping a function-implemented mapping in a SimpleInvocation */
 	private @Nullable Mapping invocationWrapper = null;
@@ -336,10 +338,11 @@
 		}
 	}
 
-	protected @Nullable List<@Nullable AllInstancesAnalysis> doAllInstances(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
+	protected @Nullable List<@Nullable AllInstancesAnalysis> doAllInstances(@NonNull EntryPointAnalysis entryPointAnalysis) {
+		EntryPointsAnalysis entryPointsAnalysis = entryPointAnalysis.getEntryPointsAnalysis();
 		CompleteModelInternal completeModel = environmentFactory.getCompleteModel();
 		Set<@NonNull CompleteClass> allInstancesCompleteClasses = new HashSet<>();
-		for (@NonNull CompleteClass allInstancesCompleteClass : transformationAnalysis.getAllInstancesCompleteClasses()) {
+		for (@NonNull CompleteClass allInstancesCompleteClass : entryPointAnalysis.getAllInstancesCompleteClasses()) {
 			allInstancesCompleteClasses.add(allInstancesCompleteClass);
 		}
 		if (allInstancesCompleteClasses.size() <= 0) {
@@ -347,14 +350,14 @@
 		}
 		List<@Nullable AllInstancesAnalysis> allInstancesAnalyses = new ArrayList<>();
 		int typedModelNumber = 0;
-		for (@NonNull TypedModel typedModel : QVTimperativeUtil.getModelParameters(transformationAnalysis.getTransformation())) {
+		for (@NonNull TypedModel typedModel : QVTimperativeUtil.getModelParameters(entryPointsAnalysis.getTransformation())) {
 			Set<@NonNull CompleteClass> allInstancesCompleteClasses2 = new HashSet<>();
 			for (org.eclipse.ocl.pivot.@NonNull Class usedClass : QVTimperativeUtil.getUsedClasses(typedModel)) {
 				allInstancesCompleteClasses2.add(completeModel.getCompleteClass(usedClass));
 			}
 			allInstancesCompleteClasses2.retainAll(allInstancesCompleteClasses);
 			if (!allInstancesCompleteClasses2.isEmpty()) {
-				AllInstancesAnalysis allInstancesAnalysis = new AllInstancesAnalysis(transformationAnalysis, typedModel, allInstancesCompleteClasses2);
+				AllInstancesAnalysis allInstancesAnalysis = new AllInstancesAnalysis(entryPointsAnalysis, typedModel, allInstancesCompleteClasses2);
 				Map<@NonNull CompleteClass, @NonNull Integer> instancesClass2index = allInstancesAnalysis.getInstancesCompleteClass2index();
 				List<@NonNull CompleteClass> sortedCompleteClasses = allInstancesAnalysis.getSortedCompleteClasses();
 				Map<@NonNull CompleteClass, @Nullable List<@NonNull CompleteClass>> instancesClassAnalysis = allInstancesAnalysis.getInstancesCompleteClassAnalysis();
@@ -945,6 +948,9 @@
 	}
 
 	protected boolean doFunctionBody2(@NonNull CGFunction cgFunction, @NonNull CGShadowExp cgShadowExp, @NonNull String instanceName) {
+		Function function = QVTiCGUtil.getAST(cgFunction);
+		ImperativeTransformation transformation = QVTimperativeUtil.getContainingTransformation(function);
+		EntryPointsAnalysis entryPointsAnalysis = context.getEntryPointsAnalysis(transformation);
 		String functionName = getFunctionName(cgFunction);
 		js.append(" {\n");
 		js.pushIndentation(null);
@@ -1007,7 +1013,7 @@
 		ImperativeTypedModel bestOutputTypedModel = null;
 		ImperativeTypedModel bestMiddleTypedModel = null;
 		ImperativeTypedModel bestInputTypedModel = null;
-		for (@NonNull ImperativeTypedModel typedModel : QVTimperativeUtil.getOwnedTypedModels(transformationAnalysis.getTransformation())) {
+		for (@NonNull ImperativeTypedModel typedModel : QVTimperativeUtil.getOwnedTypedModels(entryPointsAnalysis.getTransformation())) {
 			ImperativeTypedModel imperativeTypedModel = null;
 			for (org.eclipse.ocl.pivot.Package usedPackage : typedModel.getUsedPackage()) {
 				if (usedPackage.getESObject() == ePackage) {
@@ -2024,8 +2030,8 @@
 		//		}
 	}
 
-	protected void doOppositeCaches(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
-		Map<@NonNull Property, @NonNull Integer> opposites = transformationAnalysis.getCaches();
+	protected void doOppositeCaches(@NonNull EntryPointsAnalysis entryPointsAnalysis) {
+		Map<@NonNull Property, @NonNull Integer> opposites = entryPointsAnalysis.getCaches();
 		if (opposites.size() <= 0) {
 			return;
 		}
@@ -2056,10 +2062,10 @@
 		}
 	}
 
-	protected @Nullable String doOppositePropertyIds(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
+	protected @Nullable String doOppositePropertyIds(@NonNull EntryPointsAnalysis entryPointsAnalysis) {
 		// This code is no longer used, and since it is not used it generates undefined references
 		// It appears to have 'worked' only because a duplicate incomplete TransformationAnalysis was in use.
-		Map<@NonNull Property, @NonNull Integer> opposites = transformationAnalysis.getCaches();
+		Map<@NonNull Property, @NonNull Integer> opposites = entryPointsAnalysis.getCaches();
 		if (opposites.size() <= 0) {
 			return null;
 		}
@@ -2107,38 +2113,67 @@
 		CompleteModelInternal completeModel = environmentFactory.getCompleteModel();
 		Map<@NonNull TypedModel, @NonNull CGTypedModel> asTypedModel2cgTypedModel = new HashMap<>();
 		ImperativeTransformation asTransformation = QVTiCGUtil.getAST(cgTransformation);
+		List<@NonNull TypedModel> asTypedModels = QVTimperativeUtil.Internal.getModelParameterList(asTransformation);
 		for (@NonNull CGTypedModel cgTypedModel : QVTiCGUtil.getOwnedTypedModels(cgTransformation)) {
 			TypedModel asTypedModel = QVTiCGUtil.getAST(cgTypedModel);
 			asTypedModel2cgTypedModel.put(asTypedModel, cgTypedModel);
 		}
-		List<@NonNull EntryPoint> asEntryPoints = new ArrayList<>();
-		for (@NonNull Mapping asMapping : QVTimperativeUtil.getOwnedMappings(asTransformation)) {
+		List<@NonNull CGMapping> cgRootMappings = new ArrayList<>();
+		//		CGMapping cgRootMapping = NameUtil.getNameable(cgTransformation.getOwnedMappings(), QVTscheduleConstants.ROOT_MAPPING_NAME);	// Obsolete relic
+		for (@NonNull CGMapping cgMapping : QVTiCGUtil.getOwnedMappings(cgTransformation)) {
+			Mapping asMapping = QVTiCGUtil.getAST(cgMapping);
 			if (asMapping instanceof EntryPoint) {
-				asEntryPoints.add((EntryPoint) asMapping);
+				cgRootMappings.add(cgMapping);
 			}
-
 		}
-		EntryPoint asEntryPoint = (asEntryPoints.size() > 0) ? asEntryPoints.get(0) : null;
-		CGMapping cgRootMapping = QVTiCGUtil.getRootMapping(cgTransformation);
+		Collections.sort(cgRootMappings, new Comparator<@NonNull CGMapping>() {
+
+			@Override
+			public int compare(@NonNull CGMapping o1, @NonNull CGMapping o2) {
+				EntryPoint asEntryPoint1 = (EntryPoint) QVTiCGUtil.getAST(o1);
+				EntryPoint asEntryPoint2 = (EntryPoint) QVTiCGUtil.getAST(o2);
+				TypedModel asTypedModel1 = asEntryPoint1.getEnforcedTypedModels().get(0);
+				TypedModel asTypedModel2 = asEntryPoint2.getEnforcedTypedModels().get(0);
+				int index1 = asTypedModels.indexOf(asTypedModel1);
+				int index2 = asTypedModels.indexOf(asTypedModel2);
+				return index1 - index2;
+			}});
+		boolean isMultiDirectional = cgRootMappings.size() > 1;
 		js.append("@Override\n");
-		js.append("public boolean run() {\n");
+		js.append("public boolean run(");
+		if (isMultiDirectional) {
+			js.append("int targetTypedModelIndex");
+		}
+		js.append(") {\n");
 		js.pushIndentation(null);
-		for (@NonNull CGGuardVariable cgGuardVariable : QVTiCGUtil.getOwnedGuardVariables(cgRootMapping)) {
-			//			js.appendDeclaration(cgGuardVariable);
-			js.append("final ");
-			js.appendClassReference(true, Connection.class);
-			js.append(" ");
-			js.appendValueName(cgGuardVariable);
-			js.append(" = ");
-			js.append(QVTiGlobalContext.MODELS_NAME);
-			js.append("[");
-			VariableDeclaration asGuardVariable = QVTiCGUtil.getAST(cgGuardVariable);
-			Type type = QVTimperativeUtil.getType(asGuardVariable);
-			org.eclipse.ocl.pivot.Package asPackage = PivotUtil.getContainingPackage(type);
-			assert asPackage != null;
-			AllInstancesAnalysis allInstancesAnalysis = null;
-			CGTypedModel cgTypedModel = null;
-			if (asEntryPoint != null) {
+		if (isMultiDirectional) {
+			js.append("switch (targetTypedModelIndex) {\n");
+			js.pushIndentation(null);
+		}
+		for (@NonNull CGMapping cgRootMapping : cgRootMappings) {
+			EntryPoint asEntryPoint = (EntryPoint) QVTiCGUtil.getAST(cgRootMapping);
+			if (isMultiDirectional) {
+				js.append("case ");
+				TypedModel asTargetTypedModel = asEntryPoint.getEnforcedTypedModels().get(0);
+				js.appendIntegerString(asTypedModels.indexOf(asTargetTypedModel));
+				js.append(": { /* " + asTargetTypedModel.getName() + " */\n");
+				js.pushIndentation(null);
+			}
+			for (@NonNull CGGuardVariable cgGuardVariable : QVTiCGUtil.getOwnedGuardVariables(cgRootMapping)) {
+				//			js.appendDeclaration(cgGuardVariable);
+				js.append("final ");
+				js.appendClassReference(true, Connection.class);
+				js.append(" ");
+				js.appendValueName(cgGuardVariable);
+				js.append(" = ");
+				js.append(QVTiGlobalContext.MODELS_NAME);
+				js.append("[");
+				VariableDeclaration asGuardVariable = QVTiCGUtil.getAST(cgGuardVariable);
+				Type type = QVTimperativeUtil.getType(asGuardVariable);
+				org.eclipse.ocl.pivot.Package asPackage = PivotUtil.getContainingPackage(type);
+				assert asPackage != null;
+				AllInstancesAnalysis allInstancesAnalysis = null;
+				CGTypedModel cgTypedModel = null;
 				for (@NonNull TypedModel asTypedModel : QVTimperativeUtil.getCheckedTypedModels(asEntryPoint)) {
 					if (asTypedModel.getUsedPackage().contains(asPackage)) {
 						cgTypedModel = asTypedModel2cgTypedModel.get(asTypedModel);
@@ -2147,51 +2182,51 @@
 						}
 					}
 				}
-			}
-			else {			// FIXME Obsolete non-EntryPoint support
-				for (@NonNull CGTypedModel cgTypedModel2 : QVTiCGUtil.getOwnedTypedModels(cgTransformation)) {
-					ImperativeTypedModel asTypedModel = QVTiCGUtil.getAST(cgTypedModel2);
-					if (asTypedModel.isIsChecked() && asTypedModel.getUsedPackage().contains(asPackage)) {
-						cgTypedModel = cgTypedModel2;
-						break;
-					}
+				if (cgTypedModel != null) {
+					appendModelIndex(cgTypedModel);
+					assert allInstancesAnalyses != null;
+					allInstancesAnalysis = allInstancesAnalyses.get(cgTypedModel.getModelIndex());
 				}
+				js.append("].getConnection(");
+				assert allInstancesAnalysis != null;
+				CompleteClass completeType = completeModel.getCompleteClass(type);
+				Integer classIndex = allInstancesAnalysis.getInstancesCompleteClass2index().get(completeType);
+				js.append(classIndex + "/*" + type + "*/");
+				js.append(");\n");
 			}
-			if (cgTypedModel != null) {
-				appendModelIndex(cgTypedModel);
-				assert allInstancesAnalyses != null;
-				allInstancesAnalysis = allInstancesAnalyses.get(cgTypedModel.getModelIndex());
+			if (isIncremental || useClass(cgRootMapping)) {
+				js.append(getMappingCtorName(cgRootMapping) + ".invoke(");
 			}
-			js.append("].getConnection(");
-			assert allInstancesAnalysis != null;
-			CompleteClass completeType = completeModel.getCompleteClass(type);
-			Integer classIndex = allInstancesAnalysis.getInstancesCompleteClass2index().get(completeType);
-			js.append(classIndex + "/*" + type + "*/");
-			js.append(");\n");
-		}
-		if (isIncremental || useClass(cgRootMapping)) {
-			js.append(getMappingCtorName(cgRootMapping) + ".invoke(");
-		}
-		else {
-			js.append("return ");
-			js.append(getMappingName(cgRootMapping));
-			js.append("(");
-		}
-		boolean isFirst = true;
-		for (@NonNull CGGuardVariable cgGuardVariable : QVTiCGUtil.getOwnedGuardVariables(cgRootMapping)) {
-			if (!isFirst) {
-				js.append(", ");
+			else {
+				js.append("return ");
+				js.append(getMappingName(cgRootMapping));
+				js.append("(");
 			}
-			js.appendValueName(cgGuardVariable);
-			isFirst = false;
+			boolean isFirst = true;
+			for (@NonNull CGGuardVariable cgGuardVariable : QVTiCGUtil.getOwnedGuardVariables(cgRootMapping)) {
+				if (!isFirst) {
+					js.append(", ");
+				}
+				js.appendValueName(cgGuardVariable);
+				isFirst = false;
+			}
+			js.append(")");
+			if (isIncremental || useClass(cgRootMapping)) {
+				js.append(";\n");
+				js.append("return invocationManager.flush();\n");
+			}
+			else {
+				js.append(" && invocationManager.flush();\n");
+			}
+			if (isMultiDirectional) {
+				js.popIndentation();
+				js.append("}\n");
+			}
 		}
-		js.append(")");
-		if (isIncremental || useClass(cgRootMapping)) {
-			js.append(";\n");
-			js.append("return invocationManager.flush();\n");
-		}
-		else {
-			js.append(" && invocationManager.flush();\n");
+		if (isMultiDirectional) {
+			js.append("default: return false;\n");
+			js.popIndentation();
+			js.append("}\n");
 		}
 		js.popIndentation();
 		js.append("}\n");
@@ -3146,7 +3181,7 @@
 	public @NonNull Boolean visitCGShadowExp(@NonNull CGShadowExp cgShadowExp) {
 		super.visitCGShadowExp(cgShadowExp);
 		ShadowExp asShadowExp = (ShadowExp)ClassUtil.nonNullState(cgShadowExp.getAst());
-		DomainUsage usage = transformationAnalysis.getDomainUsageAnalysis().getUsage(asShadowExp);
+		DomainUsage usage = entryPointsAnalysis.getDomainUsageAnalysis().getUsage(asShadowExp);
 		TypedModel asTypedModel = ClassUtil.nonNullState(usage.getTypedModel(asShadowExp));
 		CGTypedModel cgTypedModel = context.getAnalyzer().getTypedModel(asTypedModel);
 		js.append(QVTiGlobalContext.MODELS_NAME);
@@ -3162,8 +3197,8 @@
 	public @NonNull Boolean visitCGTransformation(@NonNull CGTransformation cgTransformation) {
 		js.appendClassHeader(cgTransformation.getContainingPackage());
 		ImperativeTransformation transformation = QVTiCGUtil.getAST(cgTransformation);
-		QVTiTransformationAnalysis transformationAnalysis = context.getTransformationAnalysis(transformation);
-		this.transformationAnalysis = transformationAnalysis;
+		EntryPointsAnalysis entryPointsAnalysis = context.getEntryPointsAnalysis(transformation);
+		//		this.entryPointsAnalysis = entryPointsAnalysis;
 		String className = cgTransformation.getName();
 		assert className != null;
 		js.append("/**\n");
@@ -3188,29 +3223,32 @@
 				cgElement.accept(this);
 			}
 		}
-		doOppositeCaches(transformationAnalysis);
+		doOppositeCaches(entryPointsAnalysis);
 		js.append("\n");
-		String oppositeIndex2propertyIdName = doOppositePropertyIds(transformationAnalysis);
+		String oppositeIndex2propertyIdName = doOppositePropertyIds(entryPointsAnalysis);
 		if (oppositeIndex2propertyIdName != null) {
 			js.append("\n");
 		}
-		List<@Nullable AllInstancesAnalysis> allInstancesAnalyses = doAllInstances(transformationAnalysis);
-		//	@NonNull String @Nullable [] allInstancesNames = allInstancesAnalysis != null ? allInstancesAnalysis.getNames() : null;
-		js.append("\n");
 		List<@NonNull CGMapping> cgMappings = ClassUtil.nullFree(cgTransformation.getOwnedMappings());
 		List<CGOperation> cgOperations = cgTransformation.getOperations();
 		doMappingConstructorConstants(cgMappings);
 		doFunctionConstructorConstants(ClassUtil.nullFree(cgOperations));
 		js.append("\n");
-		doConstructor(cgTransformation, oppositeIndex2propertyIdName, allInstancesAnalyses);
-		js.append("\n");
-		/*		if (isIncremental) {
-			doCreateIncrementalManagers();
+		for (@NonNull EntryPointAnalysis entryPointAnalysis : entryPointsAnalysis.getEntryPointAnalyses()) {
+			List<@Nullable AllInstancesAnalysis> allInstancesAnalyses = doAllInstances(entryPointAnalysis);
+			//	@NonNull String @Nullable [] allInstancesNames = allInstancesAnalysis != null ? allInstancesAnalysis.getNames() : null;
 			js.append("\n");
-		} */
-		/*	doCreateInterval(cgTransformation);
-		js.append("\n"); */
-		doRun(cgTransformation, allInstancesAnalyses);
+			doConstructor(cgTransformation, oppositeIndex2propertyIdName, allInstancesAnalyses);
+			js.append("\n");
+			/*		if (isIncremental) {
+				doCreateIncrementalManagers();
+				js.append("\n");
+			} */
+			/*	doCreateInterval(cgTransformation);
+			js.append("\n"); */
+			doRun(cgTransformation, allInstancesAnalyses);
+			break;
+		}
 		for (@NonNull CGOperation cgOperation : ClassUtil.nullFree(cgOperations)) {
 			if (!(cgOperation instanceof CGCachedOperation)) {
 				js.append("\n");
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java
index f86747a..89e49a6 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java
@@ -54,7 +54,7 @@
 import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationAnalysis;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EntryPointsAnalysis;
 
 /**
  * QVTiCodeGenerator supports generation of the content of a JavaClassFile to
@@ -67,7 +67,7 @@
 	private/* @LazyNonNull*/ CGPackage cgPackage;
 	private/* @LazyNonNull*/ String javaSourceCode = null;
 	protected final @NonNull QVTiGlobalContext globalContext = new QVTiGlobalContext(this);
-	protected final @NonNull Map<Transformation, QVTiTransformationAnalysis> transformation2analysis = new HashMap<Transformation, QVTiTransformationAnalysis>();
+	protected final @NonNull Map<@NonNull Transformation, @NonNull EntryPointsAnalysis> transformation2analysis = new HashMap<>();
 
 	public QVTiCodeGenerator(@NonNull QVTbaseEnvironmentFactory environmentFactory, @NonNull Transformation transformation) {
 		super(environmentFactory);
@@ -259,15 +259,15 @@
 		}
 	}
 
-	public @NonNull QVTiTransformationAnalysis getTransformationAnalysis(@NonNull ImperativeTransformation transformation) {
+	public @NonNull EntryPointsAnalysis getEntryPointsAnalysis(@NonNull ImperativeTransformation transformation) {
 		//		Map<Transformation, QVTiTransformationAnalysis> transformation2analysis = new HashMap<Transformation, QVTiTransformationAnalysis>();
-		QVTiTransformationAnalysis transformationAnalysis = transformation2analysis.get(transformation);
-		if (transformationAnalysis == null) {
-			transformationAnalysis = new QVTiTransformationAnalysis(getEnvironmentFactory(), transformation);
-			transformationAnalysis.analyzeTransformation();
-			transformation2analysis.put(transformation, transformationAnalysis);
+		EntryPointsAnalysis entryPointsAnalysis = transformation2analysis.get(transformation);
+		if (entryPointsAnalysis == null) {
+			entryPointsAnalysis = new EntryPointsAnalysis(getEnvironmentFactory(), transformation);
+			entryPointsAnalysis.analyzeTransformation();
+			transformation2analysis.put(transformation, entryPointsAnalysis);
 		}
-		return transformationAnalysis;
+		return entryPointsAnalysis;
 	}
 
 	public @NonNull File saveSourceFile(@NonNull String savePath) throws IOException {
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java
index 0e66d9b..1e057b1 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java
@@ -16,11 +16,8 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-
 import javax.tools.JavaFileObject;
 
 import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
@@ -37,20 +34,9 @@
 import org.eclipse.ocl.examples.codegen.dynamic.JavaClasspath;
 import org.eclipse.ocl.examples.codegen.dynamic.JavaFileUtil;
 import org.eclipse.ocl.examples.codegen.dynamic.JavaSourceFileObject;
-import org.eclipse.ocl.pivot.Import;
-import org.eclipse.ocl.pivot.Iteration;
-import org.eclipse.ocl.pivot.LoopExp;
-import org.eclipse.ocl.pivot.Namespace;
-import org.eclipse.ocl.pivot.Operation;
-import org.eclipse.ocl.pivot.OperationCallExp;
-import org.eclipse.ocl.pivot.OppositePropertyCallExp;
-import org.eclipse.ocl.pivot.Property;
-import org.eclipse.ocl.pivot.PropertyCallExp;
 import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
 import org.eclipse.ocl.pivot.utilities.ClassUtil;
-import org.eclipse.ocl.pivot.utilities.NameUtil;
 import org.eclipse.ocl.pivot.utilities.PivotUtil;
-import org.eclipse.ocl.pivot.utilities.TreeIterable;
 import org.eclipse.qvtd.codegen.qvti.QVTiCodeGenOptions;
 import org.eclipse.qvtd.codegen.qvti.java.QVTiCodeGenerator;
 import org.eclipse.qvtd.compiler.internal.qvtb2qvts.ScheduleManager;
@@ -71,7 +57,6 @@
 import org.eclipse.qvtd.pivot.qvtcore.utilities.QVTcoreUtil;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel;
 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.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtschedule.MappingRegion;
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTcExecutor.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTcExecutor.java
index cece963..e64e322 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTcExecutor.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTcExecutor.java
@@ -11,7 +11,7 @@
 package org.eclipse.qvtd.debug.evaluator;
 
 import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
@@ -25,7 +25,7 @@
  */
 public class BasicQVTcExecutor extends QVTiIncrementalExecutor
 {
-	public BasicQVTcExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull ImperativeTransformation transformation) {
-		super(environmentFactory, transformation, ModeFactory.LAZY);
+	public BasicQVTcExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull EntryPoint entryPoint) {
+		super(environmentFactory, entryPoint, ModeFactory.LAZY);
 	}
 }
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTrExecutor.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTrExecutor.java
index d4b39ba..b9facd9 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTrExecutor.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/BasicQVTrExecutor.java
@@ -11,7 +11,7 @@
 package org.eclipse.qvtd.debug.evaluator;
 
 import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
@@ -25,7 +25,7 @@
  */
 public class BasicQVTrExecutor extends QVTiIncrementalExecutor
 {
-	public BasicQVTrExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull ImperativeTransformation transformation) {
-		super(environmentFactory, transformation, ModeFactory.LAZY);
+	public BasicQVTrExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull EntryPoint entryPoint) {
+		super(environmentFactory, entryPoint, ModeFactory.LAZY);
 	}
 }
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMExecutor.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMExecutor.java
index 662422b..e27730d 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMExecutor.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMExecutor.java
@@ -35,7 +35,7 @@
 	private long envId = 0;
 
 	public QVTiVMExecutor(@NonNull IVMContext vmContext, @NonNull URI transformationURI) throws IOException {
-		super((QVTiEnvironmentFactory)vmContext.getEnvironmentFactory(), QVTimperativeUtil.loadTransformation((QVTiEnvironmentFactory)vmContext.getEnvironmentFactory(), transformationURI, vmContext.keepDebug()), ModeFactory.LAZY);
+		super((QVTiEnvironmentFactory)vmContext.getEnvironmentFactory(), QVTimperativeUtil.getDefaultEntryPoint(QVTimperativeUtil.loadTransformation((QVTiEnvironmentFactory)vmContext.getEnvironmentFactory(), transformationURI, vmContext.keepDebug())), ModeFactory.LAZY);
 		this.vmContext = vmContext;
 	}
 
@@ -57,6 +57,11 @@
 	}
 
 	@Override
+	public Boolean execute() {
+		return execute(null);
+	}
+
+	@Override
 	protected Boolean executeInternal() {
 		QVTiVMEvaluationVisitor visitor = (QVTiVMEvaluationVisitor) getEvaluationVisitor();
 		VMEvaluationStepper vmStepper = visitor.getVMEvaluationStepper();
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcLaunchConfigurationDelegate.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcLaunchConfigurationDelegate.java
index cb4f476..9aa6dc9 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcLaunchConfigurationDelegate.java
@@ -25,7 +25,7 @@
 import org.eclipse.qvtd.debug.QVTiDebugPlugin;
 import org.eclipse.qvtd.debug.core.QVTiDebugCore;
 import org.eclipse.qvtd.debug.evaluator.BasicQVTcExecutor;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
@@ -101,8 +101,8 @@
 	}
 
 	@Override
-	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull ImperativeTransformation transformation) {
-		return new BasicQVTcExecutor(envFactory, transformation);
+	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull EntryPoint entryPoint) {
+		return new BasicQVTcExecutor(envFactory, entryPoint);
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcompiledJob.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcompiledJob.java
index e74ec08..5be0459 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcompiledJob.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTcompiledJob.java
@@ -117,7 +117,7 @@
 			//	if (!generatedExecutor.preExecute()) {
 			//
 			//	}
-			if (!generatedExecutor.execute()) {
+			if (!generatedExecutor.execute(null)) {		// FIXME TypedModel index
 				//	if (!suppressFailureDiagnosis) {						// FIXME BUG 511028
 				StringBuilder s = new StringBuilder();
 				transformer.getInvocationManager().diagnoseWorkLists(s);
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 a265edf..84846d3 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
@@ -26,7 +26,7 @@
 import org.eclipse.qvtd.compiler.DefaultCompilerOptions;
 import org.eclipse.qvtd.debug.QVTiDebugPlugin;
 import org.eclipse.qvtd.debug.core.QVTiDebugCore;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
@@ -56,8 +56,8 @@
 		return new DefaultCompilerOptions();
 	}
 
-	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull ImperativeTransformation transformation) {
-		return new QVTiIncrementalExecutor(envFactory, transformation, ModeFactory.LAZY);
+	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull EntryPoint entryPoint) {
+		return new QVTiIncrementalExecutor(envFactory, entryPoint, ModeFactory.LAZY);
 	}
 
 	protected @NonNull QVTiDebugCore getDebugCore() {
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTinterpretedJob.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTinterpretedJob.java
index 5b7eeb7..5c54015 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTinterpretedJob.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTinterpretedJob.java
@@ -30,6 +30,7 @@
 import org.eclipse.ocl.pivot.resource.BasicProjectManager;
 import org.eclipse.ocl.pivot.utilities.ClassUtil;
 import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
@@ -62,7 +63,7 @@
 				environmentFactory.setEvaluationTracingEnabled(true);
 			}
 			subMonitor.split(LOAD_TX_TICKS, SubMonitor.SUPPRESS_NONE).beginTask("Loading '" + txURI + "'", LOAD_TX_TICKS);
-			ImperativeTransformation transformation = QVTimperativeUtil.loadTransformation(environmentFactory, txURI, environmentFactory.keepDebug());
+			ImperativeTransformation iTransformation = QVTimperativeUtil.loadTransformation(environmentFactory, txURI, environmentFactory.keepDebug());
 			if (monitor.isCanceled()) {
 				throw new OperationCanceledException();
 			}
@@ -70,9 +71,10 @@
 
 			//		QVTiExecutor executor2 = new QVTiTransformationExecutor(getEnvironmentFactory(), txClass);
 
-			QVTiExecutor executor = launchConfigurationDelegate.createExecutor(environmentFactory, transformation);
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+			QVTiExecutor executor = launchConfigurationDelegate.createExecutor(environmentFactory, iEntryPoint);
 			QVTiModelsManager modelsManager = executor.getModelsManager();
-			for (@NonNull TypedModel typedModel : ClassUtil.nullFree(transformation.getModelParameter())) {
+			for (@NonNull TypedModel typedModel : ClassUtil.nullFree(iTransformation.getModelParameter())) {
 				if (monitor.isCanceled()) {
 					throw new OperationCanceledException();
 				}
@@ -105,7 +107,7 @@
 				throw new OperationCanceledException();
 			}
 			subMonitor.split(EXECUTING_TICKS, SubMonitor.SUPPRESS_NONE).beginTask("Executing '" + txURI + "'", EXECUTING_TICKS);
-			executor.execute();
+			executor.execute(null);
 			if (monitor.isCanceled()) {
 				throw new OperationCanceledException();
 			}
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTrLaunchConfigurationDelegate.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTrLaunchConfigurationDelegate.java
index b17a2af..73a27fb 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTrLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTrLaunchConfigurationDelegate.java
@@ -25,7 +25,7 @@
 import org.eclipse.qvtd.debug.QVTiDebugPlugin;
 import org.eclipse.qvtd.debug.core.QVTiDebugCore;
 import org.eclipse.qvtd.debug.evaluator.BasicQVTrExecutor;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
@@ -106,8 +106,8 @@
 	}
 
 	@Override
-	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull ImperativeTransformation transformation) {
-		return new BasicQVTrExecutor(envFactory, transformation);
+	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull EntryPoint entryPoint) {
+		return new BasicQVTrExecutor(envFactory, entryPoint);
 	}
 
 	@Override
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 377f7af..325c1c8 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
@@ -11,7 +11,6 @@
 package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -102,8 +101,10 @@
 		}
 	}
 
+	//	protected final @NonNull Mapping entryPoint;
 	protected final @NonNull ImperativeTransformation transformation;
-	protected final @NonNull QVTiTransformationAnalysis transformationAnalysis;
+	protected final @NonNull EntryPointsAnalysis entryPointsAnalysis;
+	protected final @NonNull EntryPointAnalysis entryPointAnalysis;
 	protected final @NonNull ModeFactory modeFactory;
 	protected final @NonNull QVTiModelsManager modelsManager;
 	private @Nullable WrappedModelManager wrappedModelManager = null;
@@ -111,13 +112,15 @@
 	protected final boolean debugInvocations = AbstractTransformer.INVOCATIONS.isActive();
 	private final @NonNull Map<@NonNull Mapping, @NonNull Interval> mapping2interval = new HashMap<>();;
 
-	public BasicQVTiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull ImperativeTransformation transformation, @NonNull ModeFactory modeFactory) {
+	public BasicQVTiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull EntryPoint entryPoint, @NonNull ModeFactory modeFactory) {
 		super(environmentFactory);
-		this.transformation = transformation;
-		this.transformationAnalysis = environmentFactory.createTransformationAnalysis(transformation);
+		//		this.entryPoint = entryPoint;
+		this.transformation = QVTimperativeUtil.getContainingTransformation(entryPoint);
+		this.entryPointsAnalysis = environmentFactory.createEntryPointsAnalysis(transformation);
 		this.modeFactory = modeFactory;
-		transformationAnalysis.analyzeTransformation();
-		this.modelsManager = environmentFactory.createModelsManager(transformationAnalysis);
+		entryPointsAnalysis.analyzeTransformation();
+		this.entryPointAnalysis = entryPointsAnalysis.getEntryPointAnalysis(entryPoint);
+		this.modelsManager = environmentFactory.createModelsManager(entryPointAnalysis);
 		for (@NonNull TypedModel typedModel : QVTimperativeUtil.getModelParameters(transformation)) {
 			QVTiTypedModelInstance typedModelInstance = createTypedModelInstance((ImperativeTypedModel)typedModel);
 			modelsManager.initTypedModelInstance(typedModelInstance);
@@ -184,7 +187,7 @@
 	}
 
 	@Override
-	public Boolean execute() {
+	public Boolean execute(@Nullable Integer targetTypedModelIndex) {
 		modelsManager.analyzeInputResources();
 		initializeEvaluationEnvironment(transformation);
 		getRootEvaluationEnvironment();
@@ -202,6 +205,10 @@
 		return (Boolean) getEvaluationVisitor().visit(transformation);
 	}
 
+	//	public @NonNull EntryPointsAnalysis getEntryPointsAnalysis() {
+	//		return entryPointsAnalysis;
+	//	}
+
 	@Override
 	public @NonNull QVTiEnvironmentFactory getEnvironmentFactory() {
 		return (QVTiEnvironmentFactory) super.getEnvironmentFactory();
@@ -249,10 +256,6 @@
 		return transformation;
 	}
 
-	public @NonNull QVTiTransformationAnalysis getTransformationAnalysis() {
-		return transformationAnalysis;
-	}
-
 	public @NonNull ImperativeTypedModel getTypedModel(@NonNull String name) {
 		ImperativeTypedModel typedModel = NameUtil.getNameable(QVTimperativeUtil.getOwnedTypedModels(transformation), name);
 		if (typedModel == null) {
@@ -266,6 +269,18 @@
 		return typedModel;
 	}
 
+	@Override
+	public int getTypedModelIndex(@NonNull String targetModelName) {
+		int index = 0;
+		for (@NonNull TypedModel typedModel : QVTimperativeUtil.getOwnedTypedModels(transformation)) {
+			if (targetModelName.equals(typedModel.getName())) {
+				return index;
+			}
+			index++;
+		}
+		return -1;
+	}
+
 	protected @Nullable Object internalExecuteFunctionCallExp(@NonNull OperationCallExp operationCallExp,
 			@NonNull Function referredFunction, @Nullable Object @NonNull [] boxedSourceAndArgumentValues) {
 		//		PivotUtil.checkExpression(expressionInOCL);
@@ -448,49 +463,26 @@
 		else {
 			targetProperty.initValue(slotObject, ecoreValue);
 		}
-		Integer cacheIndex = modelsManager.getTransformationAnalysis().getCacheIndex(setStatement);
+		Integer cacheIndex = entryPointsAnalysis.getCacheIndex(setStatement);
 		if (cacheIndex != null) {
 			modelsManager.setUnnavigableOpposite(cacheIndex, slotObject, ecoreValue);
 		}
 	}
 
 	@Override
-	public @Nullable Object internalExecuteTransformation(@NonNull ImperativeTransformation transformation, @NonNull EvaluationVisitor undecoratedVisitor) {
-		Mapping rule = QVTimperativeUtil.getRootMapping(transformation);
+	public @Nullable Object internalExecuteTransformation(@NonNull EntryPoint entryPoint, @NonNull EvaluationVisitor undecoratedVisitor) {
 		CallExp callExp = PivotFactory.eINSTANCE.createOperationCallExp();		// FIXME TransformationCallExp
-		pushEvaluationEnvironment(rule, (TypedElement)callExp);
+		pushEvaluationEnvironment(entryPoint, (TypedElement)callExp);
 		try {
-			List<@NonNull EntryPoint> asEntryPoints = new ArrayList<>();
-			for (@NonNull Mapping asMapping : QVTimperativeUtil.getOwnedMappings(transformation)) {
-				if (asMapping instanceof EntryPoint) {
-					asEntryPoints.add((EntryPoint) asMapping);
-				}
-
-			}
-			EntryPoint asEntryPoint = (asEntryPoints.size() > 0) ? asEntryPoints.get(0) : null;
 			Interval rootInterval = getInvocationManager().getRootInterval();
-			mapping2interval.put(rule, rootInterval);
+			mapping2interval.put(entryPoint, rootInterval);
 			TypedModelInstance modelInstance = null;
-			TypedModel typedModel = null;
-			if (asEntryPoint != null) {
-				for (@NonNull TypedModel typedModel2 : QVTimperativeUtil.getCheckedTypedModels(asEntryPoint)) {
-					typedModel = typedModel2;
-					break;
-				}
-			}
-			else {			// FIXME Obsolete non-EntryPoint support
-				for (@NonNull ImperativeTypedModel typedModel2 : QVTimperativeUtil.getOwnedTypedModels(transformation)) {
-					if (typedModel2.isIsChecked()) {
-						typedModel = typedModel2;
-						break;
-					}
-				}
-			}
-			if (typedModel != null) {
+			for (@NonNull TypedModel typedModel : QVTimperativeUtil.getCheckedTypedModels(entryPoint)) {
 				modelInstance = getModelsManager().getTypedModelInstance(typedModel);
+				break;
 			}
 			assert modelInstance != null;
-			for (@NonNull MappingParameter mappingParameter : QVTimperativeUtil.getOwnedMappingParameters(rule)) {
+			for (@NonNull MappingParameter mappingParameter : QVTimperativeUtil.getOwnedMappingParameters(entryPoint)) {
 				if (mappingParameter instanceof AppendParameter) {
 					org.eclipse.ocl.pivot.Class type = QVTimperativeUtil.getClassType(mappingParameter);
 					Connection theConnection = null;
@@ -504,7 +496,8 @@
 					getEvaluationEnvironment().add(mappingParameter, theConnection);
 				}
 			}
-			rule.accept(undecoratedVisitor);			// Use an outer InvocationConstructor?
+			//	rule.accept(undecoratedVisitor);			// Use an outer InvocationConstructor?
+			internalExecuteMapping(entryPoint, undecoratedVisitor);
 			getInvocationManager().flush();
 		}
 		finally {
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/EntryPointAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/EntryPointAnalysis.java
new file mode 100644
index 0000000..307fd68
--- /dev/null
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/EntryPointAnalysis.java
@@ -0,0 +1,330 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Willink Transformations and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *     E.D.Willink - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.ocl.pivot.CollectionType;
+import org.eclipse.ocl.pivot.CompleteClass;
+import org.eclipse.ocl.pivot.NavigationCallExp;
+import org.eclipse.ocl.pivot.OCLExpression;
+import org.eclipse.ocl.pivot.Operation;
+import org.eclipse.ocl.pivot.OperationCallExp;
+import org.eclipse.ocl.pivot.OppositePropertyCallExp;
+import org.eclipse.ocl.pivot.PrimitiveType;
+import org.eclipse.ocl.pivot.Property;
+import org.eclipse.ocl.pivot.PropertyCallExp;
+import org.eclipse.ocl.pivot.Type;
+import org.eclipse.ocl.pivot.TypedElement;
+import org.eclipse.ocl.pivot.ids.IdManager;
+import org.eclipse.ocl.pivot.ids.OperationId;
+import org.eclipse.ocl.pivot.ids.TypeId;
+import org.eclipse.ocl.pivot.library.LibraryFeature;
+import org.eclipse.ocl.pivot.library.oclany.OclElementOclContainerProperty;
+import org.eclipse.ocl.pivot.utilities.TreeIterable;
+import org.eclipse.ocl.pivot.utilities.UniqueList;
+import org.eclipse.qvtd.pivot.qvtimperative.AppendParameter;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
+import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
+import org.eclipse.qvtd.pivot.qvtimperative.SetStatement;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
+
+/**
+ * EntryPointAnalysis provides the pre-execution analysis of a particular transformation entry-point.
+ */
+public class EntryPointAnalysis
+{
+	protected final @NonNull EntryPointsAnalysis entryPointsAnalysis;
+	protected final @NonNull EntryPoint entryPoint;
+	protected final @NonNull UniqueList<@NonNull Mapping> mappings = new UniqueList<>();
+
+	/**
+	 *  Set of all types for which allInstances() is invoked.
+	 */
+	private final @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses = new HashSet<>();
+	/**
+	 * Map from oppositePropertyCallExp to the cache index identifying the relevant un-navigable lookup cache.
+	 */
+	private final @NonNull Map<@NonNull OppositePropertyCallExp, @NonNull Integer> oppositePropertyCallExp2cacheIndex = new HashMap<>();
+
+	/**
+	 * Mappings that have an isPolled input.
+	 */
+	private final @NonNull Set<@NonNull Mapping> hazardousMappings = new HashSet<>();
+
+	/**
+	 * Map from mapping to the properties that it may access.
+	 */
+	private final @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> mapping2property = new HashMap<>();
+
+	/**
+	 * Map from mapping to the properties that it may assign.
+	 */
+	private final @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull SetStatement>> mapping2propertyAssignments = new HashMap<>();
+
+	/**
+	 * Map from operation to the properties that it may access.
+	 */
+	private final @NonNull Map<@NonNull Operation, @NonNull Set<@NonNull NavigationCallExp>> operation2property = new HashMap<>();
+
+	/**
+	 * The SetStatements to each Property.
+	 */
+	private final @NonNull Map<@NonNull Property, @NonNull Set<@NonNull SetStatement>> property2propertyAssignments = new HashMap<>();
+
+	/**
+	 * Map of all oclContainer() accesses.
+	 */
+	private final @NonNull Map<@NonNull Type, @NonNull List<@NonNull Type>> parentClass2childClasses = new HashMap<>();
+
+	public EntryPointAnalysis(@NonNull EntryPointsAnalysis entryPointsAnalysis, @NonNull EntryPoint entryPoint) {
+		this.entryPointsAnalysis = entryPointsAnalysis;
+		this.entryPoint = entryPoint;
+		mappings.add(entryPoint);
+	}
+
+	private void addAllInstancesClass(@NonNull TypedElement asExpression) {
+		Type asType = asExpression instanceof OCLExpression ? ((OCLExpression)asExpression).getTypeValue() : null;
+		if (asType == null) {
+			asType = asExpression.getType();
+		}
+		if (asType instanceof org.eclipse.ocl.pivot.Class) {
+			assert !(asType instanceof PrimitiveType);
+			assert !(asType instanceof CollectionType);
+			CompleteClass completeClass = entryPointsAnalysis.environmentFactory.getCompleteModel().getCompleteClass(asType);
+			allInstancesCompleteClasses.add(completeClass);
+		}
+	}
+
+	public boolean addMapping(@NonNull Mapping iMapping) {
+		return mappings.add(iMapping);
+	}
+
+	public void analyze() {
+		//
+		//	First pass
+		//  - identify all allInstances() source types
+		//  - identify all SetStatements
+		//  - identify all assigned PropertyCallExp and allocate a cacheIndex
+		//
+		List<@NonNull SetStatement> setStatements = new ArrayList<>();
+		Type oclElementType = entryPointsAnalysis.environmentFactory.getStandardLibrary().getOclElementType();
+		Type modelType = entryPointsAnalysis.environmentFactory.getStandardLibrary().getLibraryType("Model");
+		OperationId allInstancesOperationId = oclElementType.getTypeId().getOperationId(0, "allInstances", IdManager.getParametersId());
+		OperationId objectsOfKindOperationId = modelType.getTypeId().getOperationId(1, "objectsOfKind", IdManager.getParametersId(TypeId.T_1));
+		OperationId objectsOfTypeOperationId = modelType.getTypeId().getOperationId(1, "objectsOfType", IdManager.getParametersId(TypeId.T_1));
+		for (@NonNull Mapping iMapping : getMappings()) {
+			for (EObject eObject : new TreeIterable(iMapping, true)) {
+				if (eObject instanceof Mapping) {
+					Mapping mapping = (Mapping)eObject;
+					analyzeMappingPropertyAccesses(mapping);
+					analyzeMappingSetStatements(mapping);
+					if (QVTimperativeUtil.isObserver(mapping)) {
+						hazardousMappings.add(mapping);
+					}
+				}
+				else if (eObject instanceof OppositePropertyCallExp) {
+					OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject;
+					Property navigableProperty = oppositePropertyCallExp.getReferredProperty();
+					if ((navigableProperty != null) && !navigableProperty.isIsComposite()) {
+						int cacheIndex = entryPointsAnalysis.allocateCacheIndex(oppositePropertyCallExp.getOwnedSource(), navigableProperty);
+						oppositePropertyCallExp2cacheIndex.put(oppositePropertyCallExp, cacheIndex);
+					}
+				}
+				else if (eObject instanceof SetStatement) {
+					setStatements.add((SetStatement)eObject);
+				}
+				else if (eObject instanceof AppendParameter) {
+					Mapping mapping = QVTimperativeUtil.getContainingMapping(eObject);
+					if (entryPoint == mapping) {
+						addAllInstancesClass((AppendParameter)eObject);
+					}
+				}
+				else if (eObject instanceof OperationCallExp) {
+					OperationCallExp operationCallExp = (OperationCallExp)eObject;
+					Operation referredOperation = operationCallExp.getReferredOperation();
+					if (referredOperation != null) {
+						OperationId operationId = referredOperation.getOperationId();
+						if (operationId == allInstancesOperationId) {
+							OCLExpression source = operationCallExp.getOwnedSource();
+							if (source != null) {
+								addAllInstancesClass(source);
+							}
+						}
+						else if ((operationId == objectsOfKindOperationId) || (operationId == objectsOfTypeOperationId)) {
+							OCLExpression argument = operationCallExp.getOwnedArguments().get(0);
+							if (argument != null) {
+								addAllInstancesClass(argument);
+							}
+						}
+					}
+				}
+				/*			else if (eObject instanceof OppositePropertyCallExp) {
+					OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject;
+					Property referredProperty = oppositePropertyCallExp.getReferredProperty();
+					if (referredProperty != null) {
+						getOppositeCacheIndex(referredProperty);
+					}
+				} */
+			}
+			//
+			//	Second pass
+			//  - install cacheIndex allocated to MiddlePropertyCallExp in each MiddleSetStatement
+			//
+			entryPointsAnalysis.analyzeStatements(setStatements);
+			//
+			analyzeProperties();
+		}
+	}
+
+	private @NonNull Set<@NonNull NavigationCallExp> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) {
+		Set<@NonNull NavigationCallExp> accessedProperties = mapping2property.get(mapping);
+		if (accessedProperties != null) {
+			return accessedProperties;
+		}
+		accessedProperties = new HashSet<>();
+		mapping2property.put(mapping, accessedProperties);
+		analyzeTree(accessedProperties, mapping.eAllContents());
+		return accessedProperties;
+	}
+
+	private @NonNull Set<@NonNull SetStatement> analyzeMappingSetStatements(@NonNull Mapping mapping) {
+		Set<@NonNull SetStatement> assignedProperties = mapping2propertyAssignments.get(mapping);
+		if (assignedProperties == null) {
+			assignedProperties = new HashSet<>();
+			mapping2propertyAssignments.put(mapping, assignedProperties);
+		}
+		for (TreeIterator<EObject> treeIterator = mapping.eAllContents(); treeIterator.hasNext(); ) {
+			EObject eObject = treeIterator.next();
+			if (eObject instanceof SetStatement) {
+				assignedProperties.add((SetStatement) eObject);
+			}
+		}
+		return assignedProperties;
+	}
+
+	private @NonNull Set<@NonNull NavigationCallExp> analyzeOperation(@NonNull Operation operation) {
+		Set<@NonNull NavigationCallExp> operationProperties = operation2property.get(operation);
+		if (operationProperties != null) {
+			return operationProperties;
+		}
+		operationProperties = new HashSet<>();
+		operation2property.put(operation, operationProperties);
+		analyzeTree(operationProperties, operation.eAllContents());
+		return operationProperties;
+	}
+
+	private void analyzeProperties() {
+		for (@NonNull Set<@NonNull SetStatement> propertyAssignments : mapping2propertyAssignments.values()) {
+			for (@NonNull SetStatement propertyAssignment : propertyAssignments) {
+				Property property = propertyAssignment.getTargetProperty();
+				assert property != null;
+				Set<@NonNull SetStatement> assignments = property2propertyAssignments.get(property);
+				if (assignments == null) {
+					assignments = new HashSet<>();
+					property2propertyAssignments.put(property, assignments);
+				}
+				assignments.add(propertyAssignment);
+			}
+		}
+	}
+
+	protected void analyzeTree(@NonNull Set<NavigationCallExp> properties, /*@NonNull*/ TreeIterator<EObject> treeIterator) {
+		while (treeIterator.hasNext()) {
+			EObject eObject = treeIterator.next();
+			if (eObject instanceof OperationCallExp) {
+				Operation referredOperation = ((OperationCallExp)eObject).getReferredOperation();
+				if (referredOperation != null) {
+					properties.addAll(analyzeOperation(referredOperation));
+				}
+			}
+			else if (eObject instanceof PropertyCallExp) {
+				PropertyCallExp asPropertyCallExp = (PropertyCallExp)eObject;
+				Property referredProperty = asPropertyCallExp.getReferredProperty();
+				if (referredProperty != null) {
+					LibraryFeature implementation = referredProperty.getImplementation();
+					if (implementation instanceof OclElementOclContainerProperty) {
+						Type childType = asPropertyCallExp.getOwnedSource().getType();
+						assert childType != null;
+						Type parentType = asPropertyCallExp.getType();
+						assert parentType != null;
+						List<@NonNull Type> childClasses = parentClass2childClasses .get(parentType);
+						if (childClasses == null) {
+							childClasses = new ArrayList<>();
+							parentClass2childClasses.put(parentType, childClasses);
+						}
+						if (!childClasses.contains(childType)) {
+							childClasses.add(childType);
+						}
+					}
+					else {
+						properties.add(asPropertyCallExp);
+					}
+				}
+			}
+			else if (eObject instanceof OppositePropertyCallExp) {
+				OppositePropertyCallExp asOppositePropertyCallExp = (OppositePropertyCallExp)eObject;
+				Property referredOppositeProperty = asOppositePropertyCallExp.getReferredProperty();
+				if (referredOppositeProperty != null) {
+					Property referredProperty = referredOppositeProperty.getOpposite();
+					if (referredProperty != null) {
+						properties.add(asOppositePropertyCallExp);
+					}
+				}
+			}
+		}
+	}
+
+	public @NonNull Set<@NonNull CompleteClass> getAllInstancesCompleteClasses() {
+		return allInstancesCompleteClasses;
+	}
+
+	public @Nullable Integer getCacheIndex(@NonNull OppositePropertyCallExp oppositePropertyCallExp) {
+		return oppositePropertyCallExp2cacheIndex.get(oppositePropertyCallExp);
+	}
+
+	public @NonNull EntryPoint getEntryPoint() {
+		return entryPoint;
+	}
+
+	public @NonNull EntryPointsAnalysis getEntryPointsAnalysis() {
+		return entryPointsAnalysis;
+	}
+
+	//		public @NonNull Set<@NonNull Mapping> getHazardousMappings() {
+	//			return hazardousMappings;
+	//		}
+
+	//		public @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> getMapping2Property() {
+	//			return mapping2property;
+	//		}
+
+	//		public @NonNull Map<Mapping, @NonNull Set<@NonNull SetStatement>> getMapping2SetStatements() {
+	//			return mapping2propertyAssignments;
+	//		}
+
+	public @NonNull List<@NonNull Mapping> getMappings() {
+		return mappings;
+	}
+
+	public boolean isHazardous(@NonNull Mapping mapping) {
+		return hazardousMappings.contains(mapping);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/EntryPointsAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/EntryPointsAnalysis.java
new file mode 100644
index 0000000..6d4a16c
--- /dev/null
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/EntryPointsAnalysis.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2018 Willink Transformations and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *     E.D.Willink - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.ocl.pivot.CompleteClass;
+import org.eclipse.ocl.pivot.OCLExpression;
+import org.eclipse.ocl.pivot.Property;
+import org.eclipse.ocl.pivot.ids.PropertyId;
+import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
+import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
+import org.eclipse.ocl.pivot.utilities.ClassUtil;
+import org.eclipse.ocl.pivot.utilities.EnvironmentFactory;
+import org.eclipse.ocl.pivot.utilities.TreeIterable;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
+import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
+import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
+import org.eclipse.qvtd.pivot.qvtimperative.SetStatement;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
+
+/**
+ * EntryPointsAnalysis accumulates salient characteristics of one or more entry points for a transformation
+ * prior to execution so that those characteristics can be exploited during execution.
+ * <p>
+ * Salient characteristics are:
+ * <br>
+ * - the source types of allInstances() calls
+ * - cache indexes of MiddleSetStatement/MiddlePropertyCallExp
+ */
+public class EntryPointsAnalysis
+{
+	protected final @NonNull EnvironmentFactoryInternal environmentFactory;
+
+	protected final @NonNull ImperativeTransformation transformation;
+
+	/**
+	 *  Map from navigable property to sequential index in any TypedModel.
+	 */
+	private final @NonNull Map<@NonNull Property, @NonNull Integer> property2cacheIndex = new HashMap<>();
+
+	/**
+	 * Map from propertyAssignment to the cache index of an un-navigable lookup cache to be updated by the assignment.
+	 */
+	private final @NonNull Map<@NonNull SetStatement, @NonNull Integer> setStatement2cacheIndex = new HashMap<>();
+
+
+	/**
+	 * Mappings that can be used as entry points.
+	 */
+	private final @NonNull Map<@NonNull EntryPoint, @NonNull EntryPointAnalysis> entryPoint2entryPointAnalysis = new HashMap<>();
+
+	/**
+	 * Mapping and their entry points.
+	 */
+	private final @NonNull Map<@NonNull Mapping, @NonNull EntryPointAnalysis> mapping2entryPointAnalysis = new HashMap<>();
+
+	public EntryPointsAnalysis(@NonNull EnvironmentFactoryInternal environmentFactory, @NonNull ImperativeTransformation transformation) {
+		this.environmentFactory = environmentFactory;
+		this.transformation = transformation;
+	}
+
+	protected @NonNull Integer allocateCacheIndex(@Nullable OCLExpression sourceExpression, @NonNull Property navigableProperty) {
+		Integer cacheIndex = property2cacheIndex.get(navigableProperty);
+		if (cacheIndex == null) {
+			Integer size = property2cacheIndex.size();
+			property2cacheIndex.put(navigableProperty, size);
+			cacheIndex = size;
+		}
+		return cacheIndex;
+	}
+
+	protected void analyzeStatements(@NonNull Iterable<@NonNull SetStatement> setStatements) {
+		for (@NonNull SetStatement propertyAssignment : setStatements) {
+			Property navigableProperty = propertyAssignment.getTargetProperty();
+			if (navigableProperty != null) {
+				Integer cacheIndex = property2cacheIndex.get(navigableProperty);
+				if (cacheIndex != null) { 		// No need to set cacheIndex if it is never accessed by an OppositePropertyCallExp
+					setStatement2cacheIndex.put(propertyAssignment, cacheIndex);
+				}
+			}
+		}
+	}
+
+	public void analyzeTransformation() {
+		for (@NonNull Mapping iMapping : QVTimperativeUtil.getOwnedMappings(transformation)) {
+			if (iMapping instanceof EntryPoint) {
+				EntryPoint iEntryPoint = (EntryPoint) iMapping;
+				EntryPointAnalysis entryPointAnalysis = new EntryPointAnalysis(this, iEntryPoint);
+				entryPoint2entryPointAnalysis.put(iEntryPoint, entryPointAnalysis);
+				mapping2entryPointAnalysis.put(iEntryPoint, entryPointAnalysis);
+				List<@NonNull Mapping> mappings = entryPointAnalysis.getMappings();
+				for (int i = 0; i < mappings.size(); i++) {
+					for (EObject eObject : new TreeIterable(mappings.get(i), true)) {
+						if (eObject instanceof MappingCall) {
+							MappingCall iMappingCall = (MappingCall)eObject;
+							Mapping referredMapping = QVTimperativeUtil.getReferredMapping(iMappingCall);
+							if (entryPointAnalysis.addMapping(referredMapping)) {
+								mapping2entryPointAnalysis.put(referredMapping, entryPointAnalysis);
+							}
+						}
+					}
+				}
+			}
+		}
+		assert !entryPoint2entryPointAnalysis.isEmpty();
+		for (@NonNull EntryPointAnalysis entryPointAnalysis : entryPoint2entryPointAnalysis.values()) {
+			entryPointAnalysis.analyze();
+		}
+	}
+
+	public @Nullable Integer getCacheIndex(@NonNull SetStatement setStatement) {
+		return setStatement2cacheIndex.get(setStatement);
+	}
+
+	public int getCacheIndexes() {
+		return property2cacheIndex.size();
+	}
+
+	public @NonNull Map<@NonNull Property, @NonNull Integer> getCaches() {
+		return property2cacheIndex;
+	}
+
+	//	@Deprecated
+	//	public @NonNull EntryPointAnalysis getDefaultEntryPointAnalysis() {
+	//		return entryPoint2entryPointAnalysis.values().iterator().next();
+	//	}
+
+	public @NonNull EnvironmentFactory getEnvironmentFactory() {
+		return environmentFactory;
+	}
+
+	public @NonNull Iterable<@NonNull EntryPointAnalysis> getEntryPointAnalyses() {
+		return entryPoint2entryPointAnalysis.values();
+	}
+
+	public @NonNull EntryPointAnalysis getEntryPointAnalysis(@NonNull EntryPoint entryPoint) {
+		return ClassUtil.nonNullState(entryPoint2entryPointAnalysis.get(entryPoint));
+	}
+
+	/**
+	 * Return a Map from each instanceClasses to the subset of instanceClasses that are transitive superClasses of the particular instanceClass.
+	 */
+	public @NonNull Map<@NonNull CompleteClass, @Nullable List<@NonNull CompleteClass>> getInstancesCompleteClassAnalysis(@NonNull Iterable<@NonNull CompleteClass> instanceCompleteClasses) {
+		Map<@NonNull CompleteClass, @Nullable List<@NonNull CompleteClass>> instancesClassAnalysis = new HashMap<>();
+		for (@NonNull CompleteClass instanceCompleteClass : instanceCompleteClasses) {
+			instancesClassAnalysis.put(instanceCompleteClass, null);
+		}
+		for (@NonNull CompleteClass instanceCompleteClass : instancesClassAnalysis.keySet()) {
+			List<@NonNull CompleteClass> superInstanceCompleteClasses = new ArrayList<>();
+			superInstanceCompleteClasses.add(instanceCompleteClass);
+			for (@NonNull CompleteClass superCompleteClass : instanceCompleteClass.getProperSuperCompleteClasses()) {
+				if (instancesClassAnalysis.containsKey(superCompleteClass)) {
+					superInstanceCompleteClasses.add(superCompleteClass);
+				}
+				instancesClassAnalysis.put(instanceCompleteClass, superInstanceCompleteClasses);
+			}
+		}
+		return instancesClassAnalysis;
+	}
+
+	public @NonNull MetamodelManagerInternal getMetamodelManager() {
+		return environmentFactory.getMetamodelManager();
+	}
+
+	public @NonNull PropertyId @NonNull [] getPropertyIndex2propertyId() {
+		@NonNull PropertyId @NonNull [] propertyIndex2propertyId = new @NonNull PropertyId[property2cacheIndex.size()];
+		for (@NonNull Property property : property2cacheIndex.keySet()) {
+			Integer index = property2cacheIndex.get(property);
+			assert index != null;
+			propertyIndex2propertyId[index] = property.getPropertyId();
+		}
+		return propertyIndex2propertyId;
+	}
+
+	public @NonNull ImperativeTransformation getTransformation() {
+		return transformation;
+	}
+}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEnvironmentFactory.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEnvironmentFactory.java
index 2fe0d5d..4efd644 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEnvironmentFactory.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEnvironmentFactory.java
@@ -42,13 +42,17 @@
 		getStandardLibrary().setDefaultStandardLibraryURI(QVTimperativeLibrary.STDLIB_URI);
 	}
 
+	public @NonNull EntryPointsAnalysis createEntryPointsAnalysis(@NonNull ImperativeTransformation transformation) {
+		return new EntryPointsAnalysis(this, transformation);
+	}
+
 	//	@Override
 	//	public @NonNull BasicOCLExecutor createExecutor( @NonNull ModelManager modelManager) {
 	//		return new BasicOCLExecutor(this, modelManager);		// Inherited functionality used for validation
 	//	}
 
-	public @NonNull QVTiModelsManager createModelsManager(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
-		return new QVTiModelsManager(transformationAnalysis);
+	public @NonNull QVTiModelsManager createModelsManager(@NonNull EntryPointAnalysis entryPointAnalysis) {
+		return new QVTiModelsManager(entryPointAnalysis);
 	}
 
 	@Override
@@ -56,10 +60,6 @@
 		return new QVTimperativeFlowAnalysis(this, contextExpression);
 	}
 
-	public @NonNull QVTiTransformationAnalysis createTransformationAnalysis(@NonNull ImperativeTransformation transformation) {
-		return new QVTiTransformationAnalysis(this, transformation);
-	}
-
 	public boolean keepDebug() {
 		return false;
 	}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java
index ca35280..0f05fc7 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java
@@ -358,7 +358,7 @@
 
 	@Override
 	public @Nullable Object visitEntryPoint(@NonNull EntryPoint entryPoint) {
-		return visitMapping(entryPoint);
+		return executor.internalExecuteTransformation(entryPoint, undecoratedVisitor);
 	}
 
 	@Override
@@ -391,7 +391,8 @@
 
 	@Override
 	public @Nullable Object visitImperativeTransformation(@NonNull ImperativeTransformation transformation) {
-		return executor.internalExecuteTransformation(transformation, undecoratedVisitor);
+		EntryPoint entryPoint = QVTimperativeUtil.getDefaultEntryPoint(transformation);
+		return executor.internalExecuteTransformation(entryPoint, undecoratedVisitor);
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java
index 6ec6093..0036d3d 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java
@@ -21,7 +21,7 @@
 import org.eclipse.ocl.pivot.TypedElement;
 import org.eclipse.ocl.pivot.evaluation.EvaluationVisitor;
 import org.eclipse.ocl.pivot.internal.evaluation.ExecutorInternal;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
 import org.eclipse.qvtd.pivot.qvtimperative.NewStatement;
@@ -33,7 +33,7 @@
 public interface QVTiExecutor extends ExecutorInternal
 {
 	void checkModels() throws CoreException;
-	Boolean execute();
+	Boolean execute(@Nullable Integer targetTypedModelIndex);
 	@Override
 	@NonNull QVTiEvaluationEnvironment getEvaluationEnvironment();
 	@NonNull Interval getInterval(@NonNull Mapping asMapping);
@@ -45,7 +45,7 @@
 	@Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, @NonNull EvaluationVisitor undecoratedVisitor);
 	@Nullable Object internalExecuteNewStatement(@NonNull NewStatement newStatement, @NonNull EvaluationVisitor undecoratedVisitor);
 	void internalExecuteSetStatement(@NonNull SetStatement setStatement, @NonNull Object slotObject, @Nullable Object ecoreValue);
-	@Nullable Object internalExecuteTransformation(@NonNull ImperativeTransformation transformation, @NonNull EvaluationVisitor undecoratedVisitor);
+	@Nullable Object internalExecuteTransformation(@NonNull EntryPoint entryPoint, @NonNull EvaluationVisitor undecoratedVisitor);
 	boolean replace(@NonNull TypedElement referredVariable, @Nullable Object value, boolean checkType);
 	void saveModels(@Nullable Map<?, ?> savingOptions) throws IOException;
 	void saveOutput(@NonNull String outName, @NonNull URI outURI);
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 bb31e20..2e91c0a 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
@@ -38,7 +38,7 @@
 import org.eclipse.ocl.pivot.values.InvalidValueException;
 import org.eclipse.qvtd.pivot.qvtbase.Function;
 import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTypedModel;
 import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
@@ -164,13 +164,13 @@
 	private @Nullable Map<@NonNull Mapping, @NonNull InvocationConstructor> mapping2invocationConstructor = null;
 	private @Nullable Map<@NonNull Operation, Computation.@NonNull Constructor> operation2computationConstructor = null;
 
-	public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull ImperativeTransformation transformation, @NonNull ModeFactory modeFactory) {
-		super(environmentFactory, transformation, modeFactory);
+	public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull EntryPoint entryPoint, @NonNull ModeFactory modeFactory) {
+		super(environmentFactory, entryPoint, modeFactory);
 		boolean isLazy = modeFactory.isLazy();
 		this.invocationManager = isLazy ? new LazyInvocationManager(this) : new IncrementalInvocationManager(this);
 		this.objectManager = isLazy ? new LazyObjectManager((LazyInvocationManager)invocationManager) : new IncrementalObjectManager((IncrementalInvocationManager)invocationManager);
-		Set<@NonNull CompleteClass> allInstancesCompleteClasses = transformationAnalysis.getAllInstancesCompleteClasses();
-		@NonNull PropertyId @NonNull [] propertyIndex2propertyId = transformationAnalysis.getPropertyIndex2propertyId();
+		Set<@NonNull CompleteClass> allInstancesCompleteClasses = entryPointAnalysis.getAllInstancesCompleteClasses();
+		@NonNull PropertyId @NonNull [] propertyIndex2propertyId = entryPointsAnalysis.getPropertyIndex2propertyId();
 		modelsManager.initOpposites(propertyIndex2propertyId);
 
 		for (@NonNull QVTiTypedModelInstance typedModelInstance : modelsManager.getTypedModelInstances()) {
@@ -180,7 +180,7 @@
 				usedCompleteClasses.add(environmentFactory.getCompleteModel().getCompleteClass(usedClass));
 			}
 			usedCompleteClasses.retainAll(allInstancesCompleteClasses);
-			TypedModelAnalysis typedModelAnalysis = new TypedModelAnalysis(transformationAnalysis, typedModel, usedCompleteClasses);
+			TypedModelAnalysis typedModelAnalysis = new TypedModelAnalysis(entryPointsAnalysis, typedModel, usedCompleteClasses);
 			@NonNull ClassId @NonNull [] classIndex2classId = typedModelAnalysis.getClassIndex2ClassId();
 			int @Nullable [] @NonNull [] classIndex2allClassIndexes = typedModelAnalysis.getClassIndex2allClassIndexes();
 			typedModelInstance.initClassIds(classIndex2classId, classIndex2allClassIndexes);
@@ -189,7 +189,7 @@
 				Map<@NonNull Object, Object> extentOpposites = modelsManager.getExtentOpposites();
 				typedModelInstance.initExtent(extentClassIndex, extentOpposites);
 			}
-			typedModelAnalysis.toString();
+			//			typedModelAnalysis.toString();
 		}
 		initConnections();
 	}
@@ -305,7 +305,7 @@
 	public @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, @NonNull EvaluationVisitor undecoratedVisitor) {
 		Mapping asMapping = ClassUtil.nonNullState(mappingCall.getReferredMapping());
 		if (modeFactory.isLazy()) {
-			if (!transformationAnalysis.isHazardous(asMapping)) {
+			if (!entryPointAnalysis.isHazardous(asMapping)) {
 				return super.internalExecuteMappingCall(mappingCall, boundValues, undecoratedVisitor);
 			}
 		}
@@ -318,7 +318,7 @@
 	public @Nullable Object internalExecuteNavigationCallExp(@NonNull NavigationCallExp navigationCallExp, @NonNull Property referredProperty, @Nullable Object sourceValue) {
 		if (referredProperty.isIsImplicit()) {
 			QVTiModelsManager modelManager = getModelsManager();
-			Integer cacheIndex = modelManager.getTransformationAnalysis().getCacheIndex((OppositePropertyCallExp) navigationCallExp);
+			Integer cacheIndex = entryPointAnalysis.getCacheIndex((OppositePropertyCallExp) navigationCallExp);
 			if (cacheIndex != null) {
 				if (sourceValue != null) {
 					return modelManager.getUnnavigableOpposite(cacheIndex, sourceValue);
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiModelsManager.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiModelsManager.java
index f6ea2e2..82ebeb5 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiModelsManager.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiModelsManager.java
@@ -54,7 +54,8 @@
 	@SuppressWarnings("null")
 	public static final @NonNull ClassId EXTENT_CLASSID = IdManager.getClassId(QVTruntimeLibraryPackage.Literals.EXTENT);
 
-	protected final @NonNull QVTiTransformationAnalysis transformationAnalysis;
+	protected final @NonNull EntryPointAnalysis entryPointAnalysis;
+	protected final @NonNull EntryPointsAnalysis entryPointsAnalysis;
 	protected final @NonNull EnvironmentFactoryInternalExtension environmentFactory;
 
 	/**
@@ -82,11 +83,12 @@
 	 * Instantiates a new QVTi Domain Manager. Responsible for creating new
 	 * instances of the middle model and the middle model EFactory.
 	 */
-	public QVTiModelsManager(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
-		this.transformationAnalysis = transformationAnalysis;
-		this.environmentFactory = (EnvironmentFactoryInternalExtension) transformationAnalysis.getEnvironmentFactory();
-		//	this.allInstancesClasses = transformationAnalysis.getAllInstancesClasses();
-		int cacheIndexes = transformationAnalysis.getCacheIndexes();
+	public QVTiModelsManager(@NonNull EntryPointAnalysis entryPointAnalysis) {
+		this.entryPointAnalysis = entryPointAnalysis;
+		this.entryPointsAnalysis = entryPointAnalysis.getEntryPointsAnalysis();
+		this.environmentFactory = (EnvironmentFactoryInternalExtension) entryPointsAnalysis.getEnvironmentFactory();
+		//	this.allInstancesClasses = entryPointsAnalysis.getAllInstancesClasses();
+		int cacheIndexes = entryPointsAnalysis.getCacheIndexes();
 		this.unnavigableOpposites = new @NonNull Map<?, ?>[cacheIndexes];
 		for (int i = 0; i < cacheIndexes; i++) {
 			this.unnavigableOpposites[i] = new HashMap<>();
@@ -110,11 +112,9 @@
 	 */
 	public @NonNull Set<@NonNull Object> get(org.eclipse.ocl.pivot.@NonNull Class type) {
 		Set<@NonNull Object> elements = new HashSet<>();
-		for (@NonNull ImperativeTypedModel typedModel : QVTimperativeUtil.getOwnedTypedModels(transformationAnalysis.getTransformation())) {
-			if (typedModel.isIsChecked()) {
-				TypedModelInstance typedModelInstance = getTypedModelInstance(typedModel);
-				Iterables.addAll(elements, typedModelInstance.getObjectsOfKind(type));
-			}
+		for (@NonNull TypedModel typedModel : QVTimperativeUtil.getCheckedTypedModels(entryPointAnalysis.getEntryPoint())) {
+			TypedModelInstance typedModelInstance = getTypedModelInstance(typedModel);
+			Iterables.addAll(elements, typedModelInstance.getObjectsOfKind(type));
 		}
 		return elements;
 	}
@@ -145,8 +145,8 @@
 		throw new UnsupportedOperationException();
 	}
 
-	public @NonNull QVTiTransformationAnalysis getTransformationAnalysis() {
-		return transformationAnalysis;
+	public @NonNull EntryPointsAnalysis getTransformationAnalysis() {
+		return entryPointsAnalysis;
 	}
 
 	/*	public List<EObject> getTypeModelEObjectList(@NonNull ImperativeTypedModel model) {
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java
deleted file mode 100644
index 165f160..0000000
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013, 2018 Willink Transformations and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v2.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v20.html
- *
- * Contributors:
- *     E.D.Willink - initial API and implementation
- ******************************************************************************/
-package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.ocl.pivot.CollectionType;
-import org.eclipse.ocl.pivot.CompleteClass;
-import org.eclipse.ocl.pivot.NavigationCallExp;
-import org.eclipse.ocl.pivot.OCLExpression;
-import org.eclipse.ocl.pivot.Operation;
-import org.eclipse.ocl.pivot.OperationCallExp;
-import org.eclipse.ocl.pivot.OppositePropertyCallExp;
-import org.eclipse.ocl.pivot.PrimitiveType;
-import org.eclipse.ocl.pivot.Property;
-import org.eclipse.ocl.pivot.PropertyCallExp;
-import org.eclipse.ocl.pivot.Type;
-import org.eclipse.ocl.pivot.TypedElement;
-import org.eclipse.ocl.pivot.ids.IdManager;
-import org.eclipse.ocl.pivot.ids.OperationId;
-import org.eclipse.ocl.pivot.ids.PropertyId;
-import org.eclipse.ocl.pivot.ids.TypeId;
-import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
-import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
-import org.eclipse.ocl.pivot.library.LibraryFeature;
-import org.eclipse.ocl.pivot.library.oclany.OclElementOclContainerProperty;
-import org.eclipse.ocl.pivot.utilities.EnvironmentFactory;
-import org.eclipse.ocl.pivot.utilities.TreeIterable;
-import org.eclipse.qvtd.pivot.qvtimperative.AppendParameter;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
-import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
-import org.eclipse.qvtd.pivot.qvtimperative.SetStatement;
-import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
-
-/**
- * QVTiTransformationAnalysis accumulates salient characteristics of one or more
- * transformations prior to execution so that those characteristics can be exploited
- * during execution.
- * <p>
- * Salient characteristics are:
- * <br>
- * - the source types of allInstances() calls
- * - cache indexes of MiddleSetStatement/MiddlePropertyCallExp
- */
-public class QVTiTransformationAnalysis
-{
-	protected final @NonNull EnvironmentFactoryInternal environmentFactory;
-
-	protected final @NonNull ImperativeTransformation transformation;
-
-	/**
-	 *  Set of all types for which allInstances() is invoked.
-	 */
-	private final @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses = new HashSet<>();
-
-	/**
-	 *  Map from navigable property to sequential index in any TypedModel.
-	 */
-	private final @NonNull Map<@NonNull Property, @NonNull Integer> property2cacheIndex = new HashMap<>();
-
-	/**
-	 * Map from propertyAssignment to the cache index of an un-navigable lookup cache to be updated by the assignment.
-	 */
-	private final @NonNull Map<@NonNull SetStatement, @NonNull Integer> setStatement2cacheIndex = new HashMap<>();
-
-	/**
-	 * Map from oppositePropertyCallExp to the cache index identifying the relevant un-navigable lookup cache.
-	 */
-	private final @NonNull Map<@NonNull OppositePropertyCallExp, @NonNull Integer> oppositePropertyCallExp2cacheIndex = new HashMap<>();
-
-	/**
-	 * Map from operation to the properties that it may access.
-	 */
-	private final @NonNull Map<@NonNull Operation, @NonNull Set<@NonNull NavigationCallExp>> operation2property = new HashMap<>();
-
-	/**
-	 * Map from mapping to the properties that it may access.
-	 */
-	private final @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> mapping2property = new HashMap<>();
-
-	/**
-	 * Map from mapping to the properties that it may assign.
-	 */
-	private final @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull SetStatement>> mapping2propertyAssignments = new HashMap<>();
-
-	/**
-	 * Mappings that have an isPolled input.
-	 */
-	private final @NonNull Set<@NonNull Mapping> hazardousMappings = new HashSet<>();
-
-	/**
-	 * The SetStatements to each Property.
-	 */
-	private final @NonNull Map<@NonNull Property, @NonNull Set<@NonNull SetStatement>> property2propertyAssignments = new HashMap<>();
-
-	/**
-	 * Map of all oclContainer() accesses.
-	 */
-	private final @NonNull Map<@NonNull Type, @NonNull List<@NonNull Type>> parentClass2childClasses = new HashMap<>();
-
-	public QVTiTransformationAnalysis(@NonNull EnvironmentFactoryInternal environmentFactory, @NonNull ImperativeTransformation transformation) {
-		this.environmentFactory = environmentFactory;
-		this.transformation = transformation;
-	}
-
-	private void addAllInstancesClass(@NonNull TypedElement asExpression) {
-		Type asType = asExpression instanceof OCLExpression ? ((OCLExpression)asExpression).getTypeValue() : null;
-		if (asType == null) {
-			asType = asExpression.getType();
-		}
-		if (asType instanceof org.eclipse.ocl.pivot.Class) {
-			assert !(asType instanceof PrimitiveType);
-			assert !(asType instanceof CollectionType);
-			CompleteClass completeClass = environmentFactory.getCompleteModel().getCompleteClass(asType);
-			allInstancesCompleteClasses.add(completeClass);
-		}
-	}
-
-	protected @NonNull Integer allocateCacheIndex(@Nullable OCLExpression sourceExpression, @NonNull Property navigableProperty) {
-		Integer cacheIndex = property2cacheIndex.get(navigableProperty);
-		if (cacheIndex == null) {
-			Integer size = property2cacheIndex.size();
-			property2cacheIndex.put(navigableProperty, size);
-			cacheIndex = size;
-		}
-		return cacheIndex;
-	}
-
-	private @NonNull Set<@NonNull NavigationCallExp> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) {
-		Set<@NonNull NavigationCallExp> accessedProperties = mapping2property.get(mapping);
-		if (accessedProperties != null) {
-			return accessedProperties;
-		}
-		accessedProperties = new HashSet<>();
-		mapping2property.put(mapping, accessedProperties);
-		analyzeTree(accessedProperties, mapping.eAllContents());
-		return accessedProperties;
-	}
-
-	private @NonNull Set<@NonNull SetStatement> analyzeMappingSetStatements(@NonNull Mapping mapping) {
-		Set<@NonNull SetStatement> assignedProperties = mapping2propertyAssignments.get(mapping);
-		if (assignedProperties == null) {
-			assignedProperties = new HashSet<>();
-			mapping2propertyAssignments.put(mapping, assignedProperties);
-		}
-		for (TreeIterator<EObject> treeIterator = mapping.eAllContents(); treeIterator.hasNext(); ) {
-			EObject eObject = treeIterator.next();
-			if (eObject instanceof SetStatement) {
-				assignedProperties.add((SetStatement) eObject);
-			}
-		}
-		return assignedProperties;
-	}
-
-	private @NonNull Set<@NonNull NavigationCallExp> analyzeOperation(@NonNull Operation operation) {
-		Set<@NonNull NavigationCallExp> operationProperties = operation2property.get(operation);
-		if (operationProperties != null) {
-			return operationProperties;
-		}
-		operationProperties = new HashSet<>();
-		operation2property.put(operation, operationProperties);
-		analyzeTree(operationProperties, operation.eAllContents());
-		return operationProperties;
-	}
-
-	private void analyzeProperties() {
-		for (@NonNull Set<@NonNull SetStatement> propertyAssignments : mapping2propertyAssignments.values()) {
-			for (@NonNull SetStatement propertyAssignment : propertyAssignments) {
-				Property property = propertyAssignment.getTargetProperty();
-				assert property != null;
-				Set<@NonNull SetStatement> assignments = property2propertyAssignments.get(property);
-				if (assignments == null) {
-					assignments = new HashSet<>();
-					property2propertyAssignments.put(property, assignments);
-				}
-				assignments.add(propertyAssignment);
-			}
-		}
-	}
-
-	protected void analyzeTree(@NonNull Set<NavigationCallExp> properties, /*@NonNull*/ TreeIterator<EObject> treeIterator) {
-		while (treeIterator.hasNext()) {
-			EObject eObject = treeIterator.next();
-			if (eObject instanceof OperationCallExp) {
-				Operation referredOperation = ((OperationCallExp)eObject).getReferredOperation();
-				if (referredOperation != null) {
-					properties.addAll(analyzeOperation(referredOperation));
-				}
-			}
-			else if (eObject instanceof PropertyCallExp) {
-				PropertyCallExp asPropertyCallExp = (PropertyCallExp)eObject;
-				Property referredProperty = asPropertyCallExp.getReferredProperty();
-				if (referredProperty != null) {
-					LibraryFeature implementation = referredProperty.getImplementation();
-					if (implementation instanceof OclElementOclContainerProperty) {
-						Type childType = asPropertyCallExp.getOwnedSource().getType();
-						assert childType != null;
-						Type parentType = asPropertyCallExp.getType();
-						assert parentType != null;
-						List<@NonNull Type> childClasses = parentClass2childClasses .get(parentType);
-						if (childClasses == null) {
-							childClasses = new ArrayList<>();
-							parentClass2childClasses.put(parentType, childClasses);
-						}
-						if (!childClasses.contains(childType)) {
-							childClasses.add(childType);
-						}
-					}
-					else {
-						properties.add(asPropertyCallExp);
-					}
-				}
-			}
-			else if (eObject instanceof OppositePropertyCallExp) {
-				OppositePropertyCallExp asOppositePropertyCallExp = (OppositePropertyCallExp)eObject;
-				Property referredOppositeProperty = asOppositePropertyCallExp.getReferredProperty();
-				if (referredOppositeProperty != null) {
-					Property referredProperty = referredOppositeProperty.getOpposite();
-					if (referredProperty != null) {
-						properties.add(asOppositePropertyCallExp);
-					}
-				}
-			}
-		}
-	}
-
-	public void analyzeTransformation() {
-		//
-		//	First pass
-		//  - identify all allInstances() source types
-		//  - identify all SetStatements
-		//  - identify all assigned PropertyCallExp and allocate a cacheIndex
-		//
-		Type oclElementType = environmentFactory.getStandardLibrary().getOclElementType();
-		Type modelType = environmentFactory.getStandardLibrary().getLibraryType("Model");
-		OperationId allInstancesOperationId = oclElementType.getTypeId().getOperationId(0, "allInstances", IdManager.getParametersId());
-		OperationId objectsOfKindOperationId = modelType.getTypeId().getOperationId(1, "objectsOfKind", IdManager.getParametersId(TypeId.T_1));
-		OperationId objectsOfTypeOperationId = modelType.getTypeId().getOperationId(1, "objectsOfType", IdManager.getParametersId(TypeId.T_1));
-		List<@NonNull SetStatement> setStatements = new ArrayList<>();
-		for (EObject eObject : new TreeIterable(transformation, true)) {
-			if (eObject instanceof Mapping) {
-				Mapping mapping = (Mapping)eObject;
-				analyzeMappingPropertyAccesses(mapping);
-				analyzeMappingSetStatements(mapping);
-				if (QVTimperativeUtil.isObserver(mapping)) {
-					hazardousMappings.add(mapping);
-				}
-			}
-			else if (eObject instanceof OppositePropertyCallExp) {
-				OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject;
-				Property navigableProperty = oppositePropertyCallExp.getReferredProperty();
-				if ((navigableProperty != null) && !navigableProperty.isIsComposite()) {
-					int cacheIndex = allocateCacheIndex(oppositePropertyCallExp.getOwnedSource(), navigableProperty);
-					oppositePropertyCallExp2cacheIndex.put(oppositePropertyCallExp, cacheIndex);
-				}
-			}
-			else if (eObject instanceof SetStatement) {
-				setStatements.add((SetStatement)eObject);
-			}
-			else if (eObject instanceof AppendParameter) {
-				Mapping mapping = QVTimperativeUtil.getContainingMapping(eObject);
-				Mapping rootMapping = QVTimperativeUtil.getRootMapping(QVTimperativeUtil.getContainingTransformation(mapping));
-				if (rootMapping == mapping) {
-					addAllInstancesClass((AppendParameter)eObject);
-				}
-			}
-			else if (eObject instanceof OperationCallExp) {
-				OperationCallExp operationCallExp = (OperationCallExp)eObject;
-				Operation referredOperation = operationCallExp.getReferredOperation();
-				if (referredOperation != null) {
-					OperationId operationId = referredOperation.getOperationId();
-					if (operationId == allInstancesOperationId) {
-						OCLExpression source = operationCallExp.getOwnedSource();
-						if (source != null) {
-							addAllInstancesClass(source);
-						}
-					}
-					else if ((operationId == objectsOfKindOperationId) || (operationId == objectsOfTypeOperationId)) {
-						OCLExpression argument = operationCallExp.getOwnedArguments().get(0);
-						if (argument != null) {
-							addAllInstancesClass(argument);
-						}
-					}
-				}
-			}
-			/*			else if (eObject instanceof OppositePropertyCallExp) {
-				OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject;
-				Property referredProperty = oppositePropertyCallExp.getReferredProperty();
-				if (referredProperty != null) {
-					getOppositeCacheIndex(referredProperty);
-				}
-			} */
-		}
-		//
-		//	Second pass
-		//  - install cacheIndex allocated to MiddlePropertyCallExp in each MiddleSetStatement
-		//
-		for (@NonNull SetStatement propertyAssignment : setStatements) {
-			Property navigableProperty = propertyAssignment.getTargetProperty();
-			if (navigableProperty != null) {
-				Integer cacheIndex = property2cacheIndex.get(navigableProperty);
-				if (cacheIndex != null) { 		// No need to set cacheIndex if it is never accessed by an OppositePropertyCallExp
-					setStatement2cacheIndex.put(propertyAssignment, cacheIndex);
-				}
-			}
-		}
-		//
-		analyzeProperties();
-	}
-
-	public @NonNull Set<@NonNull CompleteClass> getAllInstancesCompleteClasses() {
-		return allInstancesCompleteClasses;
-	}
-
-	public @Nullable Integer getCacheIndex(@NonNull OppositePropertyCallExp oppositePropertyCallExp) {
-		return oppositePropertyCallExp2cacheIndex.get(oppositePropertyCallExp);
-	}
-
-	public @Nullable Integer getCacheIndex(@NonNull SetStatement setStatement) {
-		return setStatement2cacheIndex.get(setStatement);
-	}
-
-	public int getCacheIndexes() {
-		return property2cacheIndex.size();
-	}
-
-	public @NonNull Map<@NonNull Property, @NonNull Integer> getCaches() {
-		return property2cacheIndex;
-	}
-
-	public @NonNull EnvironmentFactory getEnvironmentFactory() {
-		return environmentFactory;
-	}
-
-	public @NonNull Set<@NonNull Mapping> getHazardousMappings() {
-		return hazardousMappings;
-	}
-
-	/**
-	 * Return a Map from each instanceClasses to the subset of instanceClasses that are transitive superClasses of the particular instanceClass.
-	 */
-	public @NonNull Map<@NonNull CompleteClass, @Nullable List<@NonNull CompleteClass>> getInstancesCompleteClassAnalysis(@NonNull Iterable<@NonNull CompleteClass> instanceCompleteClasses) {
-		Map<@NonNull CompleteClass, @Nullable List<@NonNull CompleteClass>> instancesClassAnalysis = new HashMap<>();
-		for (@NonNull CompleteClass instanceCompleteClass : instanceCompleteClasses) {
-			instancesClassAnalysis.put(instanceCompleteClass, null);
-		}
-		for (@NonNull CompleteClass instanceCompleteClass : instancesClassAnalysis.keySet()) {
-			List<@NonNull CompleteClass> superInstanceCompleteClasses = new ArrayList<>();
-			superInstanceCompleteClasses.add(instanceCompleteClass);
-			for (@NonNull CompleteClass superCompleteClass : instanceCompleteClass.getProperSuperCompleteClasses()) {
-				if (instancesClassAnalysis.containsKey(superCompleteClass)) {
-					superInstanceCompleteClasses.add(superCompleteClass);
-				}
-				instancesClassAnalysis.put(instanceCompleteClass, superInstanceCompleteClasses);
-			}
-		}
-		return instancesClassAnalysis;
-	}
-
-	public @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> getMapping2Property() {
-		return mapping2property;
-	}
-
-	public @NonNull Map<Mapping, @NonNull Set<@NonNull SetStatement>> getMapping2SetStatements() {
-		return mapping2propertyAssignments;
-	}
-
-	public @NonNull MetamodelManagerInternal getMetamodelManager() {
-		return environmentFactory.getMetamodelManager();
-	}
-
-	public @NonNull PropertyId @NonNull [] getPropertyIndex2propertyId() {
-		@NonNull PropertyId @NonNull [] propertyIndex2propertyId = new @NonNull PropertyId[property2cacheIndex.size()];
-		for (@NonNull Property property : property2cacheIndex.keySet()) {
-			Integer index = property2cacheIndex.get(property);
-			assert index != null;
-			propertyIndex2propertyId[index] = property.getPropertyId();
-		}
-		return propertyIndex2propertyId;
-	}
-
-	public @NonNull ImperativeTransformation getTransformation() {
-		return transformation;
-	}
-
-	public boolean isHazardous(@NonNull Mapping mapping) {
-		return hazardousMappings.contains(mapping);
-	}
-}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/TypedModelAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/TypedModelAnalysis.java
index 06c3c4f..ea715e7 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/TypedModelAnalysis.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/TypedModelAnalysis.java
@@ -28,9 +28,12 @@
 import org.eclipse.ocl.pivot.utilities.PivotUtil;
 import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
 
+/**
+ * TypedModelAnalysis captures the class and property relationships of the use packges of a TypedModel.
+ */
 public class TypedModelAnalysis
 {
-	protected final @NonNull QVTiTransformationAnalysis transformationAnalysis;
+	protected final @NonNull EntryPointsAnalysis entryPointsAnalysis;
 	protected final @NonNull TypedModel typedModel;
 	protected final @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses;
 	protected final @NonNull Map<@NonNull CompleteClass, @Nullable List<@NonNull CompleteClass>> instancesCompleteClassAnalysis;
@@ -39,11 +42,11 @@
 	protected final int extentClassIndex;
 	protected @Nullable List<@NonNull Integer> extentOppositePropertyIndexes = null;
 
-	public TypedModelAnalysis(@NonNull QVTiTransformationAnalysis transformationAnalysis, @NonNull TypedModel typedModel, @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses) {
-		this.transformationAnalysis = transformationAnalysis;
+	public TypedModelAnalysis(@NonNull EntryPointsAnalysis entryPointsAnalysis, @NonNull TypedModel typedModel, @NonNull Set<@NonNull CompleteClass> allInstancesCompleteClasses) {
+		this.entryPointsAnalysis = entryPointsAnalysis;
 		this.typedModel = typedModel;
 		this.allInstancesCompleteClasses = allInstancesCompleteClasses;
-		this.instancesCompleteClassAnalysis = transformationAnalysis.getInstancesCompleteClassAnalysis(allInstancesCompleteClasses);
+		this.instancesCompleteClassAnalysis = entryPointsAnalysis.getInstancesCompleteClassAnalysis(allInstancesCompleteClasses);
 		//
 		// Populate a mapping from instancesClass to linear index.
 		//
@@ -62,7 +65,7 @@
 		}
 		this.extentClassIndex = extentClassIndex;
 		//
-		Map<@NonNull Property, @NonNull Integer> opposites = transformationAnalysis.getCaches();
+		Map<@NonNull Property, @NonNull Integer> opposites = entryPointsAnalysis.getCaches();
 		for (@NonNull Property property : opposites.keySet()) {
 			org.eclipse.ocl.pivot.Class owningClass = PivotUtil.getOwningClass(property);
 			TypeId typeId = owningClass.getTypeId();
@@ -90,7 +93,7 @@
 
 	public int @Nullable [] @NonNull [] getClassIndex2allClassIndexes() {
 		int iMax = sortedCompleteClasses.size();
-		int [] @NonNull [] classIndex2allClassIndexes = new int @Nullable [iMax] [];
+		int [] @NonNull [] classIndex2allClassIndexes = new int [iMax] @NonNull [];
 		for (int i = 0; i < iMax; i++) {
 			CompleteClass instancesClass = sortedCompleteClasses.get(i);
 			List<@NonNull CompleteClass> superInstancesClasses = ClassUtil.nonNullState(instancesCompleteClassAnalysis.get(instancesClass));
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java
index edbc44e..607c80b 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java
@@ -139,6 +139,20 @@
 		return ClassUtil.nonNullState(basicGetContainingTransformation(eObject));
 	}
 
+	/**
+	 * Return the default (first) entry point of asTransformation.
+	 *
+	 * This method is close to deprecated being mainly intended for legacy / unidirectional usage.
+	 */
+	public static @NonNull EntryPoint getDefaultEntryPoint(@NonNull ImperativeTransformation asTransformation) {
+		for (@NonNull Mapping mapping : getOwnedMappings(asTransformation)) {
+			if (mapping instanceof EntryPoint) {
+				return (EntryPoint)mapping;
+			}
+		}
+		throw new IllegalStateException();
+	}
+
 	public static @NonNull Iterable<@NonNull TypedModel> getEnforcedTypedModels(@NonNull EntryPoint entryPoint) {
 		return ClassUtil.nullFree(entryPoint.getEnforcedTypedModels());
 	}
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractTransformationExecutor.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractTransformationExecutor.java
index c5c71e4..1a497d2 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractTransformationExecutor.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractTransformationExecutor.java
@@ -14,6 +14,7 @@
 import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.Property;
 import org.eclipse.ocl.pivot.evaluation.AbstractModelManager;
 import org.eclipse.ocl.pivot.evaluation.ModelManager;
@@ -61,9 +62,9 @@
 	}
 
 	@Override
-	public final Boolean execute() throws Exception {
+	public final Boolean execute(@Nullable Integer targetTypedModelIndex) throws Exception {
 		transformer.analyzeInputResources();
-		if (transformer.run()) {
+		if (targetTypedModelIndex != null ? transformer.run(targetTypedModelIndex) : transformer.run()) {
 			return Boolean.TRUE;
 		}
 		if (!suppressFailureDiagnosis) {						// FIXME BUG 511028
@@ -109,6 +110,11 @@
 	}
 
 	@Override
+	public int getTypedModelIndex(@NonNull String targetModelName) {
+		return transformer.getTypedModelIndex(targetModelName);
+	}
+
+	@Override
 	public @NonNull TypedModelInstance getTypedModelInstance(@NonNull String modelName) {
 		return transformer.getTypedModelInstance(modelName);
 	}
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/TransformationExecutor.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/TransformationExecutor.java
index 5ded05a..ca03fe2 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/TransformationExecutor.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/TransformationExecutor.java
@@ -11,6 +11,7 @@
 package org.eclipse.qvtd.runtime.evaluation;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.evaluation.Executor;
 
 /**
@@ -22,9 +23,10 @@
 {
 	@Override
 	void dispose();
-	Boolean execute() throws Exception;
+	Boolean execute(@Nullable Integer targetTypedModelIndex) throws Exception;
 	@NonNull ModelsManager getModelsManager();
 	@NonNull Transformer getTransformer();
+	int getTypedModelIndex(@NonNull String targetModelName);
 	@NonNull TypedModelInstance getTypedModelInstance(@NonNull String modelName);
 	void setSuppressFailureDiagnosis(boolean suppressFailureDiagnosis);
 }
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Transformer.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Transformer.java
index aeb9d96..1b57ce6 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Transformer.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Transformer.java
@@ -44,6 +44,8 @@
 	@NonNull InvocationManager getInvocationManager();
 	@NonNull ModelsManager getModelsManager();
 	@NonNull ObjectManager getObjectManager();
+	int getTypedModelIndex(@NonNull String targetModelName);
 	@NonNull TypedModelInstance getTypedModelInstance(@NonNull String modelName);
 	boolean run() throws Exception;
+	boolean run(int targetTypedModelIndex) throws Exception;
 }
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractTransformerInternal.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractTransformerInternal.java
index 26769a4..60a349b 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractTransformerInternal.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractTransformerInternal.java
@@ -270,6 +270,11 @@
 	} */
 
 	@Override
+	public int getTypedModelIndex(@NonNull String targetModelName) {
+		return modelsManager.getTypedModelIndex(targetModelName);
+	}
+
+	@Override
 	public @NonNull TypedModelInstance getTypedModelInstance(@NonNull String modelName) {
 		return modelsManager.getTypedModelInstance(modelName);
 	}
@@ -377,8 +382,12 @@
 	} */
 
 	@Override
-	public boolean run()throws Exception {
-		// TODO Auto-generated method stub
+	public boolean run() throws Exception {
+		return false;
+	}
+
+	@Override
+	public boolean run(int targetTypedModelIndex) throws Exception {
 		return false;
 	}
 
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/RuntimeModelsManager.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/RuntimeModelsManager.java
index 0ee0972..f27c634 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/RuntimeModelsManager.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/RuntimeModelsManager.java
@@ -98,6 +98,17 @@
 		throw new IllegalStateException("Unknown model name '" + modelName + "'");
 	}
 
+	public int getTypedModelIndex(@NonNull String targetModelName) {
+		int index = 0;
+		for (@NonNull Model model : models) {
+			if (targetModelName.equals(model.getName())) {
+				return index;
+			}
+			index++;
+		}
+		throw new IllegalStateException("Unknown model name '" + targetModelName + "'");
+	}
+
 	@Override
 	public @NonNull Iterable<@NonNull TypedModelInstance> getTypedModelInstances() {
 		return new ArrayIterable<@NonNull TypedModelInstance>(models);
diff --git a/plugins/org.eclipse.qvtd.umlx.ui/src/org/eclipse/qvtd/umlx/ui/launching/UMLXLaunchConfigurationDelegate.java b/plugins/org.eclipse.qvtd.umlx.ui/src/org/eclipse/qvtd/umlx/ui/launching/UMLXLaunchConfigurationDelegate.java
index 97e6764..bfaedd2 100644
--- a/plugins/org.eclipse.qvtd.umlx.ui/src/org/eclipse/qvtd/umlx/ui/launching/UMLXLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.qvtd.umlx.ui/src/org/eclipse/qvtd/umlx/ui/launching/UMLXLaunchConfigurationDelegate.java
@@ -27,7 +27,7 @@
 import org.eclipse.qvtd.debug.launching.QVTcLaunchConstants;
 import org.eclipse.qvtd.debug.launching.QVTiLaunchConfigurationDelegate;
 import org.eclipse.qvtd.debug.launching.QVTrLaunchConfigurationDelegate;
-import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
@@ -97,8 +97,8 @@
 	}
 
 	@Override
-	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull ImperativeTransformation transformation) {
-		return new BasicQVTrExecutor(envFactory, transformation);
+	protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull EntryPoint entryPoint) {
+		return new BasicQVTrExecutor(envFactory, entryPoint);
 	}
 
 	@Override
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 a5a5a6e..4ab19fc 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
@@ -30,6 +30,7 @@
 import org.eclipse.ocl.pivot.utilities.OCL;
 import org.eclipse.ocl.xtext.completeocl.CompleteOCLStandaloneSetup;
 import org.eclipse.qvtd.compiler.DefaultCompilerOptions;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
@@ -37,6 +38,7 @@
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.runtime.evaluation.ModeFactory;
 import org.eclipse.qvtd.runtime.evaluation.ModelsManager;
 import org.eclipse.qvtd.runtime.evaluation.TransformationExecutor;
@@ -63,8 +65,8 @@
 			super(environmentFactory);
 		}
 
-		public @NonNull BasicQVTiExecutor createEvaluator(@NonNull ImperativeTransformation transformation) {
-			return new QVTiIncrementalExecutor(getEnvironmentFactory(), transformation, ModeFactory.LAZY);
+		public @NonNull BasicQVTiExecutor createEvaluator(@NonNull EntryPoint entryPoint) {
+			return new QVTiIncrementalExecutor(getEnvironmentFactory(), entryPoint, ModeFactory.LAZY);
 		}
 
 		public @NonNull TransformationExecutor createEvaluator(@NonNull Class<? extends Transformer> txClass) throws ReflectiveOperationException {
@@ -110,13 +112,14 @@
 
 			ImperativeTransformation qvtiTransf = getTransformation(myQVT.getMetamodelManager().getASResourceSet(), txURI);
 			assert qvtiTransf != null;
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model1", results);
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model2", results);
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model3", results);
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model4", results);
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model5", results);
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model6", results);
-			trackExample_Interpreted(myQVT, qvtiTransf, baseURI, "model7", results);
+			EntryPoint entryPoint = QVTimperativeUtil.getDefaultEntryPoint(qvtiTransf);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model1", results);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model2", results);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model3", results);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model4", results);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model5", results);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model6", results);
+			trackExample_Interpreted(myQVT, entryPoint, baseURI, "model7", results);
 			myQVT.dispose();
 
 		}
@@ -192,10 +195,10 @@
 		System.out.println("Iteration on " +modelName+": " + (finalStamp - initStamp) + " ms");
 	}
 
-	private void trackExample_Interpreted(MyQVT qvt, @NonNull ImperativeTransformation tx, URI baseURI, String modelName,
+	private void trackExample_Interpreted(MyQVT qvt, @NonNull EntryPoint entryPoint, URI baseURI, String modelName,
 			Map<String, List<Integer>> results)  throws Exception  {
 		long initStamp = System.currentTimeMillis();
-		executeModelsTX_Interpreted(qvt, tx, baseURI, modelName);
+		executeModelsTX_Interpreted(qvt, entryPoint, baseURI, modelName);
 		long finalStamp = System.currentTimeMillis();
 		trackResults(results, modelName, initStamp, finalStamp);
 		System.out.println("Iteration on " +modelName+": " + (finalStamp - initStamp) + " ms");
@@ -268,12 +271,12 @@
 	// Execute the transformation with the CGed transformation
 	//
 
-	protected void executeModelsTX_Interpreted(MyQVT qvt, @NonNull ImperativeTransformation tx, URI baseURI, String modelName) throws Exception {
+	protected void executeModelsTX_Interpreted(MyQVT qvt, @NonNull EntryPoint entryPoint, URI baseURI, String modelName) throws Exception {
 		URI samplesBaseUri = baseURI.appendSegment("samples");
 		URI csModelURI = samplesBaseUri.appendSegment(String.format("%s_input.xmi", modelName));
 		URI asModelURI = samplesBaseUri.appendSegment(String.format("%s_output_Interpreted.xmi", modelName));
 
-		BasicQVTiExecutor testEvaluator = qvt.createEvaluator(tx);
+		BasicQVTiExecutor testEvaluator = qvt.createEvaluator(entryPoint);
 		testEvaluator.saveTransformation(null, null);
 		ModelsManager modelsManager = testEvaluator.getModelsManager();
 		TypedModelInstance inputTypedModelInstance = modelsManager.getTypedModelInstance("leftCS");
@@ -281,7 +284,7 @@
 		ResourceSet rSet = qvt.getResourceSet();
 		Resource inputResource = ClassUtil.nonNullState(rSet.getResource(csModelURI, true));
 		inputTypedModelInstance.addInputResource(inputResource);
-		boolean success = testEvaluator.execute();
+		boolean success = testEvaluator.execute(null);
 		Resource outputResource = ClassUtil.nonNullState(rSet.createResource(asModelURI));
 		outputTypedModelInstance.addOutputResource(outputResource);
 		modelsManager.saveModels(DefaultCompilerOptions.defaultSavingOptions);
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java
index 325b165..bf41840 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java
@@ -47,9 +47,11 @@
 import org.eclipse.qvtd.cs2as.compiler.internal.OCL2QVTm;
 import org.eclipse.qvtd.pivot.qvtbase.Transformation;
 import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbase;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.pivot.qvtschedule.impl.RuleRegionImpl;
 import org.eclipse.qvtd.runtime.evaluation.Transformer;
 import org.eclipse.qvtd.xtext.qvtbase.tests.AbstractTestQVT;
@@ -133,7 +135,8 @@
 			String inputURIstring = modelTestName + "/" + modelSamples + "/" + modelName + "_input.xmi";
 			String outURIstring = modelName + "_output_Interpreted.xmi";
 			String refURIstring = modelTestName + "/" + modelSamples + "/" + modelName + "_output_ref.xmi";
-			createInterpretedExecutor(tx);
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(tx);
+			createInterpretedExecutor(iEntryPoint);
 			addInputURI(OCL2QVTm.LEFT_MODEL_TYPE_NAME, getModelsURI(inputURIstring));
 			assertTrue(executeTransformation());
 			addOutputURI(OCL2QVTm.RIGHT_MODEL_TYPE_NAME, getTestURI(outURIstring));
diff --git a/tests/org.eclipse.qvtd.doc.bigmde2016.tests/src/org/eclipse/qvtd/doc/bigmde2016/tests/BigMDE2016InterpreterTests.java b/tests/org.eclipse.qvtd.doc.bigmde2016.tests/src/org/eclipse/qvtd/doc/bigmde2016/tests/BigMDE2016InterpreterTests.java
index 72e2bdf..0330c76 100644
--- a/tests/org.eclipse.qvtd.doc.bigmde2016.tests/src/org/eclipse/qvtd/doc/bigmde2016/tests/BigMDE2016InterpreterTests.java
+++ b/tests/org.eclipse.qvtd.doc.bigmde2016.tests/src/org/eclipse/qvtd/doc/bigmde2016/tests/BigMDE2016InterpreterTests.java
@@ -12,8 +12,10 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.qvtd.doc.bigmde2016.tests.qvtc.BigMDE2016CGTests;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.xtext.qvtcore.tests.QVTcCompilerTests;
 import org.junit.Test;
 
@@ -31,10 +33,11 @@
 		MyQVT myQVT = createQVT("Families2Persons", getModelsURI("families2persons/Families2Persons.qvtc"));
 		//    	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("person");
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("person");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
 			int[] tests = PrintAndLog.getTestSizes();
 			for (int testSize : tests) {
-				BasicQVTiExecutor interpretedExecutor = myQVT.createInterpretedExecutor(asTransformation);
+				BasicQVTiExecutor interpretedExecutor = myQVT.createInterpretedExecutor(iEntryPoint);
 				myQVT.addInputURI("family", getModelsURI("families2persons/samples/Families.xmi"));
 				Resource inResource = interpretedExecutor.getModel("family");
 				inResource.getContents().clear();
diff --git a/tests/org.eclipse.qvtd.doc.exe2016.tests/src/org/eclipse/qvtd/doc/exe2016/tests/qvtc/EXE2016InterpreterTests.java b/tests/org.eclipse.qvtd.doc.exe2016.tests/src/org/eclipse/qvtd/doc/exe2016/tests/qvtc/EXE2016InterpreterTests.java
index 0c8c0cf..928d207 100644
--- a/tests/org.eclipse.qvtd.doc.exe2016.tests/src/org/eclipse/qvtd/doc/exe2016/tests/qvtc/EXE2016InterpreterTests.java
+++ b/tests/org.eclipse.qvtd.doc.exe2016.tests/src/org/eclipse/qvtd/doc/exe2016/tests/qvtc/EXE2016InterpreterTests.java
@@ -20,8 +20,10 @@
 import org.eclipse.qvtd.doc.exe2016.tests.qvtc.doublylinkedlist.DoublyLinkedList;
 import org.eclipse.qvtd.doc.exe2016.tests.qvtc.doublylinkedlist.DoublylinkedlistPackage;
 import org.eclipse.qvtd.doc.exe2016.tests.qvtc.list2list.List2listPackage;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.xtext.qvtcore.tests.QVTcCompilerTests;
 import org.junit.Test;
 
@@ -43,10 +45,11 @@
 		myQVT.loadEcoreFile(getModelsURI("forward2reverse/List2List.ecore"), List2listPackage.eINSTANCE);
 		//    	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("reverse");
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("reverse");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
 			int[] tests = /**new int[]{100000}; //*/PrintAndLog.getTestSizes();
 			for (int testSize : tests) {
-				@SuppressWarnings("unused")BasicQVTiExecutor interpretedExecutor = myQVT.createInterpretedExecutor(asTransformation);
+				@SuppressWarnings("unused")BasicQVTiExecutor interpretedExecutor = myQVT.createInterpretedExecutor(iEntryPoint);
 				Resource inResource = myQVT.addInputURI("forward", getModelsURI("families2persons/samples/EmptyList.xmi"));
 				assert inResource != null;
 				inResource.getContents().clear();
@@ -87,9 +90,10 @@
 		myQVT.loadEcoreFile(getModelsURI("forward2reverse/List2List.ecore"), List2listPackage.eINSTANCE);
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("reverse");
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("reverse");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
 			int testSize = 100000;
-			BasicQVTiExecutor interpretedExecutor = myQVT.createInterpretedExecutor(asTransformation);
+			BasicQVTiExecutor interpretedExecutor = myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("families2persons/samples/EmptyList.xmi"));
 			Resource inResource = interpretedExecutor.getModel("forward");
 			assert inResource != null;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java b/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java
index 1c03606..e80f2ae 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java
@@ -60,6 +60,7 @@
 import org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner.RootPartitionAnalysis;
 import org.eclipse.qvtd.pivot.qvtbase.Transformation;
 import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbase;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.Execution2GraphVisitor;
@@ -384,14 +385,14 @@
 		return new QVTiTransformationExecutor(environmentFactory, txClass);
 	}
 
-	public @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull ImperativeTransformation asTransformation) throws Exception {
-		BasicQVTiExecutor interpretedExecutor = createInterpretedExecutor(getEnvironmentFactory(), asTransformation);
+	public @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull EntryPoint entryPoint) throws Exception {
+		BasicQVTiExecutor interpretedExecutor = createInterpretedExecutor(getEnvironmentFactory(), entryPoint);
 		this.executor = interpretedExecutor;
 		return interpretedExecutor;
 	}
 
-	protected @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull ImperativeTransformation asTransformation) throws Exception {
-		return new QVTiIncrementalExecutor(environmentFactory, asTransformation, ModeFactory.LAZY);
+	protected @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull EntryPoint entryPoint) throws Exception {
+		return new QVTiIncrementalExecutor(environmentFactory, entryPoint, ModeFactory.LAZY);
 	}
 
 	@Override
@@ -495,7 +496,15 @@
 		if (suppressFailureDiagnosis) {
 			executor.setSuppressFailureDiagnosis(true);
 		}
-		Boolean success = executor.execute();
+		Boolean success = executor.execute(null);
+		return success == Boolean.TRUE;
+	}
+
+	public boolean executeTransformation(@NonNull String targetModelName) throws Exception {
+		if (suppressFailureDiagnosis) {
+			executor.setSuppressFailureDiagnosis(true);
+		}
+		Boolean success = executor.execute(executor.getTypedModelIndex(targetModelName));
 		return success == Boolean.TRUE;
 	}
 
diff --git a/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
index 3a7cea5..7fe1933 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
@@ -34,8 +34,10 @@
 import org.eclipse.qvtd.compiler.internal.qvtm2qvts.QVTm2QVTs;
 import org.eclipse.qvtd.compiler.internal.qvts2qvts.splitter.Splitter;
 import org.eclipse.qvtd.pivot.qvtcore.utilities.QVTcore;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.pivot.qvtschedule.impl.RuleRegionImpl;
 import org.eclipse.qvtd.runtime.evaluation.Transformer;
 import org.eclipse.qvtd.xtext.qvtbase.tests.AbstractTestQVT;
@@ -173,8 +175,9 @@
 		myQVT.loadEcoreFile(getModelsURI("families2persons/Persons.ecore"), PersonsPackage.eINSTANCE);
 		//    	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("person");
-			myQVT.createInterpretedExecutor(asTransformation);
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("person");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("family", getModelsURI("families2persons/samples/Families.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("person", getTestURI("Persons_Interpreted.xmi"));
@@ -239,30 +242,31 @@
 		myQVT.loadEcoreFile(getModelsURI("forward2reverse/List2List.ecore"), List2listPackage.eINSTANCE);
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("reverse");
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("reverse");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/EmptyList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("EmptyList_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("EmptyList_Interpreted.xmi"), getModelsURI("forward2reverse/samples/EmptyList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/OneElementList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("OneElementList_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("OneElementList_Interpreted.xmi"), getModelsURI("forward2reverse/samples/OneElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/TwoElementList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("TwoElementList_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("TwoElementList_Interpreted.xmi"), getModelsURI("forward2reverse/samples/TwoElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/ThreeElementList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("ThreeElementList_Interpreted.xmi"));
@@ -346,8 +350,9 @@
 		myQVT.loadEcoreFile(getModelsURI("hsv2hsl/HSLTree.ecore"), HSLTreePackage.eINSTANCE);
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("hsl");
-			myQVT.createInterpretedExecutor(asTransformation);
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("hsl");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("hsv", getModelsURI("hsv2hsl/samples/SolarizedHSV.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("hsl", getTestURI("SolarizedHSL_Interpreted.xmi"));
@@ -401,22 +406,23 @@
 		myQVT.loadEcoreFile(getModelsURI("uml2rdbms/SimpleRDBMS.ecore"), SimplerdbmsPackage.eINSTANCE);
 		//    	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("rdbms");
-			myQVT.createInterpretedExecutor(asTransformation);
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("rdbms");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("uml", getModelsURI("uml2rdbms/samples/SimplerUMLPeople.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("rdbms", getTestURI("SimplerRDBMSPeople_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("SimplerRDBMSPeople_Interpreted.xmi"), getModelsURI("uml2rdbms/samples/SimplerRDBMSPeople_expected.xmi"), SimpleRDBMSNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("uml", getModelsURI("uml2rdbms/samples/SimplerUMLPeople2.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("rdbms", getTestURI("SimplerRDBMSPeople2_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("SimplerRDBMSPeople2_Interpreted.xmi"), getModelsURI("uml2rdbms/samples/SimplerRDBMSPeople2_expected.xmi"), SimpleRDBMSNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("uml", getModelsURI("uml2rdbms/samples/SimpleUMLPeople.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("rdbms", getTestURI("SimpleRDBMSPeople_Interpreted.xmi"));
@@ -560,8 +566,9 @@
 		MyQVT myQVT = createQVT("Upper2Lower", getModelsURI("upper2lower/Upper2Lower.qvtcas"));
 		//    	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("lowerGraph");
-			myQVT.createInterpretedExecutor(asTransformation);
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("lowerGraph");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("upperGraph", getModelsURI("upper2lower/samples/SimpleGraph.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("lowerGraph", getTestURI("SimpleGraphLower_Interpreted.xmi"));
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/ClassesCS2AS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/ClassesCS2AS.qvti
index 6b05231..0578ae4 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/ClassesCS2AS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/ClassesCS2AS.qvti
@@ -4,8 +4,8 @@
 
 transformation classescs2as
 {
-	check leftCS imports classescs;
-	enforce rightAS imports classes;
+	leftCS imports classescs;
+	rightAS imports classes;
 	middle imports classescstraces;
 }
 
@@ -85,7 +85,7 @@
 	set	_'package'.ownedClasses := ownedClasses;
 }
 
-map __root__ in classescs2as
+entry __root__ check leftCS enforce rightAS in classescs2as
 {
 	for packageCS : classescs::PackageCS in classescs::PackageCS.allInstances() {
 		call mPackageCS2Package_LM {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug456900/ClassesCS2AS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug456900/ClassesCS2AS.qvti
index 30da960..9ef025f 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug456900/ClassesCS2AS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug456900/ClassesCS2AS.qvti
@@ -3,8 +3,8 @@
 
 transformation classescs2as
 {
-	check leftCS imports classescs;
-	enforce rightAS imports classes;
+	leftCS imports classescs;
+	rightAS imports classes;
 }
 
 map mCreationRootCS2Root in classescs2as
@@ -36,7 +36,8 @@
 	set z1.ownedPackages :=
 		rootCS.ownedPackages.ast.oclAsType(classes::Package)->asOrderedSet();
 }
-map __root__ in classescs2as
+
+entry __root__ check leftCS enforce rightAS in classescs2as
 {
 	for rootCS : classescs::RootCS in classescs::RootCS.allInstances() {
 		call mCreationRootCS2Root {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2AS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2AS.qvti
index 12b6895..04e590f 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2AS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2AS.qvti
@@ -4,8 +4,8 @@
 
 transformation classescs2as
 {
-	check leftCS imports classescs;
-	enforce rightAS imports classes;
+	leftCS imports classescs;
+	rightAS imports classes;
 }
 
 map createPackage in classescs2as
@@ -18,7 +18,7 @@
 						endif;
 }
 
-map __root__ in classescs2as
+entry __root__ check leftCS enforce rightAS in classescs2as
 {
 	for packageCS : classescs::PackageCS in classescs::PackageCS.allInstances() {
 		call createPackage {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2.qvti
index 9ac842e..f70324c 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2.qvti
@@ -4,8 +4,8 @@
 
 transformation classescs2as
 {
-	check leftCS imports classescs;
-	enforce rightAS imports classes;
+	leftCS imports classescs;
+	rightAS imports classes;
 }
 
 map createPackage in classescs2as
@@ -19,7 +19,7 @@
 						endif;
 }
 
-map __root__ in classescs2as
+entry __root__ check leftCS enforce rightAS in classescs2as
 {
 	for packageCS : classescs::PackageCS in classescs::PackageCS.allInstances() {
 		call createPackage {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2_AS.qvtias b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2_AS.qvtias
index e04bd8c..fb8f47d 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2_AS.qvtias
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2_AS.qvtias
@@ -1,69 +1,67 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <qvti:ImperativeModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pivot="http://www.eclipse.org/ocl/2015/Pivot"
     xmlns:qvti="http://www.eclipse.org/qvt/2016/QVTimperative" xsi:schemaLocation="http://www.eclipse.org/ocl/2015/Pivot java://org.eclipse.ocl.pivot.PivotPackage http://www.eclipse.org/qvt/2016/QVTimperative java://org.eclipse.qvtd.pivot.qvtimperative.QVTimperativePackage"
-    name="ClassesCS2ASv2.qvti" externalURI="platform:/resource/org.eclipse.qvtd.xtext.qvtimperative.tests/bin/org/eclipse/qvtd/xtext/qvtimperative/tests/ClassesCS2AS/bug457239/ClassesCS2ASv2.qvti">
-  <ownedImports name="classes" importedNamespace="pivot:Model ../Classes.ecore.oclas#/"/>
-  <ownedImports name="classescs" importedNamespace="pivot:Model ../ClassesCS.ecore.oclas#/"/>
-  <ownedImports importedNamespace="pivot:Model helpers.ocl.oclas#/"/>
-  <ownedPackages xmi:id="P." name="">
-    <ownedClasses xsi:type="qvti:ImperativeTransformation" xmi:id="T..classescs2as" name="classescs2as" superClasses="http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.OclElement">
-      <modelParameter xsi:type="qvti:ImperativeTypedModel" xmi:id="qT..classescs2as.leftCS" name="leftCS" usedPackage="helpers.ocl.oclas#P.classescs"
-          isChecked="true">
-        <ownedContext xsi:type="pivot:ParameterVariable" xmi:id="qV..classescs2as.leftCS.leftCS" name="leftCS" type="pivot:Class http://www.eclipse.org/qvt/2016/QVTimperativeLibrary.oclas#T.qvtruntimelibrary.Model"/>
+    xmi:id="AAAAA" name="ClassesCS2ASv2.qvti" externalURI="platform:/resource/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug457239/ClassesCS2ASv2.qvti"
+    xmiidVersion="1">
+  <ownedImports name="classes" importedNamespace="pivot:Package ../Classes.ecore.oclas#gm0v7" xmiidVersion="1"/>
+  <ownedImports name="classescs" importedNamespace="pivot:Package ../ClassesCS.ecore.oclas#QSeUI" xmiidVersion="1"/>
+  <ownedImports importedNamespace="pivot:Model helpers.ocl.oclas#AAAAA" xmiidVersion="1"/>
+  <ownedPackages xmi:id="6Fh3I" name="">
+    <ownedClasses xsi:type="qvti:ImperativeTransformation" xmi:id="ll3DG" name="classescs2as" superClasses="http://www.eclipse.org/ocl/2015/Library.oclas#zfDWR">
+      <modelParameter xsi:type="qvti:ImperativeTypedModel" xmi:id="IsZt9" name="leftCS" usedPackage="../ClassesCS.ecore.oclas#QSeUI">
+        <ownedContext xsi:type="pivot:ParameterVariable" name="leftCS" type="pivot:Class http://www.eclipse.org/qvt/2016/QVTimperativeLibrary.oclas#qeoBC"/>
       </modelParameter>
-      <modelParameter xsi:type="qvti:ImperativeTypedModel" xmi:id="qT..classescs2as.rightAS" name="rightAS" usedPackage="../Classes.ecore.oclas#P.classes"
-          isEnforced="true">
-        <ownedContext xsi:type="pivot:ParameterVariable" xmi:id="qV..classescs2as.rightAS.rightAS" name="rightAS" type="pivot:Class http://www.eclipse.org/qvt/2016/QVTimperativeLibrary.oclas#T.qvtruntimelibrary.Model"/>
+      <modelParameter xsi:type="qvti:ImperativeTypedModel" xmi:id="fuoOH" name="rightAS" usedPackage="../Classes.ecore.oclas#gm0v7">
+        <ownedContext xsi:type="pivot:ParameterVariable" name="rightAS" type="pivot:Class http://www.eclipse.org/qvt/2016/QVTimperativeLibrary.oclas#qeoBC"/>
       </modelParameter>
-      <rule xsi:type="qvti:Mapping" xmi:id="m..classescs2as.createPackage" name="createPackage">
-        <ownedMappingParameters xsi:type="qvti:GuardParameter" name="packageCS" isRequired="false" type="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS"
-            referredTypedModel="#qT..classescs2as.leftCS"/>
-        <ownedStatements xsi:type="qvti:NewStatement" xmi:id="qV..classescs2as.createPackage._package" name="_package" isRequired="false"
-            type="pivot:Class ../Classes.ecore.oclas#T.classes.Package" referredTypedModel="#qT..classescs2as.rightAS"/>
-        <ownedStatements xsi:type="qvti:SetStatement" targetVariable="#qV..classescs2as.createPackage._package" targetProperty="../Classes.ecore.oclas#p.classes.NamedElement.name">
-          <ownedExpression xsi:type="pivot:IfExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String">
-            <ownedCondition xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean"
-                referredOperation="helpers.ocl.oclas#o.ocl.OclElement.aBooleanElementOp">
-              <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS"
-                  referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@ownedMappingParameters.0"/>
+      <rule xsi:type="qvti:Mapping" xmi:id="nJ3jC" name="createPackage">
+        <ownedMappingParameters xsi:type="qvti:GuardParameter" xmi:id="AYM4v" name="packageCS" isRequired="false" type="pivot:Class ../ClassesCS.ecore.oclas#rYaOy"
+            referredTypedModel="#IsZt9"/>
+        <ownedStatements xsi:type="qvti:NewStatement" xmi:id="f7sVT" name="_package" isRequired="false" type="pivot:Class ../Classes.ecore.oclas#LACyd"
+            referredTypedModel="#fuoOH"/>
+        <ownedStatements xsi:type="qvti:SetStatement" targetVariable="#f7sVT" targetProperty="../Classes.ecore.oclas#LKAVE">
+          <ownedExpression xsi:type="pivot:IfExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#AlwVZ">
+            <ownedCondition xsi:type="pivot:OperationCallExp" name="aBooleanElementOp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#XEMMs"
+                referredOperation="helpers.ocl.oclas#S+Y2+">
+              <ownedSource xsi:type="pivot:VariableExp" name="packageCS" isRequired="false" type="pivot:Class ../ClassesCS.ecore.oclas#rYaOy"
+                  referredVariable="#AYM4v"/>
             </ownedCondition>
-            <ownedElse xsi:type="pivot:StringLiteralExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+            <ownedElse xsi:type="pivot:StringLiteralExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#AlwVZ"
                 stringSymbol="unexpected"/>
-            <ownedThen xsi:type="pivot:StringLiteralExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+            <ownedThen xsi:type="pivot:StringLiteralExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#AlwVZ"
                 stringSymbol="transformation worked"/>
           </ownedExpression>
         </ownedStatements>
       </rule>
-      <rule xsi:type="qvti:Mapping" xmi:id="m..classescs2as.__root__" name="__root__">
+      <rule xsi:type="qvti:EntryPoint" name="__root__" checkedTypedModels="#IsZt9" enforcedTypedModels="#fuoOH">
         <ownedStatements xsi:type="qvti:MappingLoop">
-          <ownedIterators name="packageCS" type="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS"/>
-          <ownedMappingStatements xsi:type="qvti:MappingCall" referredMapping="#m..classescs2as.createPackage">
-            <ownedMappingParameterBindings xsi:type="qvti:LoopParameterBinding" boundVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@ownedMappingParameters.0"
-                value="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@ownedStatements.0/@ownedIterators.0"/>
+          <ownedIterators xmi:id="GM8oC" name="packageCS" type="pivot:Class ../ClassesCS.ecore.oclas#rYaOy"/>
+          <ownedMappingStatements xsi:type="qvti:MappingCall" referredMapping="#nJ3jC">
+            <ownedMappingParameterBindings xsi:type="qvti:LoopParameterBinding" boundVariable="#AYM4v" value="#GM8oC"/>
           </ownedMappingStatements>
-          <ownedExpression xsi:type="pivot:OperationCallExp" type="#//@ownedPackages.1/@ownedClasses.0" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclElement.allInstances">
-            <ownedSource xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Pivot.oclas#T.pivot.Class" referredType="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS"/>
+          <ownedExpression xsi:type="pivot:OperationCallExp" name="allInstances" type="#MA2i0" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#5w96x">
+            <ownedSource xsi:type="pivot:TypeExp" name="PackageCS" type="pivot:Class http://www.eclipse.org/ocl/2015/Pivot.oclas#pDcbe"
+                referredType="pivot:Class ../ClassesCS.ecore.oclas#rYaOy"/>
           </ownedExpression>
         </ownedStatements>
       </rule>
-      <ownedContext xsi:type="pivot:ParameterVariable" xmi:id="qV..classescs2as.this" name="this" type="#T..classescs2as"/>
+      <ownedContext xsi:type="pivot:ParameterVariable" name="this" type="#ll3DG"/>
     </ownedClasses>
   </ownedPackages>
-  <ownedPackages xmi:id="P.$$" name="$$" URI="http://www.eclipse.org/ocl/2015/Orphanage" nsPrefix="orphanage">
-    <ownedClasses xsi:type="pivot:SetType" name="Set" superClasses="#//@ownedPackages.1/@ownedClasses.1"
-        isNullFree="true">
+  <ownedPackages name="$$" URI="http://www.eclipse.org/ocl/2015/Orphanage" nsPrefix="orphanage">
+    <ownedClasses xsi:type="pivot:SetType" xmi:id="MA2i0" name="Set" superClasses="#0VKgz" isNullFree="true">
       <ownedBindings>
-        <ownedSubstitutions actual="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS" formal="http://www.eclipse.org/ocl/2015/Library.oclas#t.ocl..SetT"/>
+        <ownedSubstitutions actual="pivot:Class ../ClassesCS.ecore.oclas#rYaOy" formal="http://www.eclipse.org/ocl/2015/Library.oclas#ODsm5"/>
       </ownedBindings>
     </ownedClasses>
-    <ownedClasses xsi:type="pivot:CollectionType" name="UniqueCollection" superClasses="#//@ownedPackages.1/@ownedClasses.2">
+    <ownedClasses xsi:type="pivot:CollectionType" xmi:id="0VKgz" name="UniqueCollection" superClasses="#DbakD">
       <ownedBindings>
-        <ownedSubstitutions actual="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS" formal="http://www.eclipse.org/ocl/2015/Library.oclas#t.ocl..UniqueCollectionT"/>
+        <ownedSubstitutions actual="pivot:Class ../ClassesCS.ecore.oclas#rYaOy" formal="http://www.eclipse.org/ocl/2015/Library.oclas#jdfjE"/>
       </ownedBindings>
     </ownedClasses>
-    <ownedClasses xsi:type="pivot:CollectionType" name="Collection" superClasses="http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.OclAny">
+    <ownedClasses xsi:type="pivot:CollectionType" xmi:id="DbakD" name="Collection" superClasses="http://www.eclipse.org/ocl/2015/Library.oclas#jbMkR">
       <ownedBindings>
-        <ownedSubstitutions actual="pivot:Class ../ClassesCS.ecore.oclas#T.classescs.PackageCS" formal="http://www.eclipse.org/ocl/2015/Library.oclas#t.ocl..CollectionT"/>
+        <ownedSubstitutions actual="pivot:Class ../ClassesCS.ecore.oclas#rYaOy" formal="http://www.eclipse.org/ocl/2015/Library.oclas#qs59R"/>
       </ownedBindings>
     </ownedClasses>
   </ownedPackages>
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug459225/ClassesCS2AS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug459225/ClassesCS2AS.qvti
index 1d74cc8..b4a417d 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug459225/ClassesCS2AS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ClassesCS2AS/bug459225/ClassesCS2AS.qvti
@@ -4,8 +4,8 @@
 
 transformation classescs2as_Bug459225
 {
-	check leftCS imports classescs;
-	enforce rightAS imports classes;
+	leftCS imports classescs;
+	rightAS imports classes;
 }
 
 map createPackage in classescs2as_Bug459225
@@ -18,7 +18,7 @@
 						endif;
 }
 
-map __root__ in classescs2as_Bug459225
+entry __root__ check leftCS enforce rightAS in classescs2as_Bug459225
 {
 	for packageCS : classescs::PackageCS in classescs::PackageCS.allInstances() {
 		call createPackage {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphHierarchical/Graph2GraphHierarchical.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphHierarchical/Graph2GraphHierarchical.qvti
index 6eeebba..c282fd0 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphHierarchical/Graph2GraphHierarchical.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphHierarchical/Graph2GraphHierarchical.qvti
@@ -2,12 +2,12 @@
 import SimpleGraph2Graph : '../Graph2GraphMinimal/SimpleGraph2Graph.ecore'::simplegraph2graph;
 
 transformation CopyGraph {
-	check upperGraph imports SimpleGraph;
-	enforce lowerGraph imports SimpleGraph;
+	upperGraph imports SimpleGraph;
+	lowerGraph imports SimpleGraph;
 	middle imports SimpleGraph2Graph;
 }
 
-map __root__ in CopyGraph {
+entry __root__ check upperGraph enforce lowerGraph in CopyGraph {
     
     for g1 : SimpleGraph::Graph in SimpleGraph::Graph.allInstances() {
         call Graph2Middle {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphMinimal/Graph2GraphMinimal.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphMinimal/Graph2GraphMinimal.qvti
index 2344657..52618ab 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphMinimal/Graph2GraphMinimal.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Graph2GraphMinimal/Graph2GraphMinimal.qvti
@@ -2,8 +2,8 @@
 import SimpleGraph2Graph : 'SimpleGraph2Graph.ecore'::simplegraph2graph;
 
 transformation CopyGraphMinimal {
-	check upperGraph imports SimpleGraph;
-	enforce lowerGraph imports SimpleGraph;
+	upperGraph imports SimpleGraph;
+	lowerGraph imports SimpleGraph;
 	middle imports SimpleGraph2Graph;
 }
 
@@ -24,7 +24,7 @@
     set g2.name := g2gout.name;
 }
 
-map __root__ in CopyGraphMinimal {
+entry __root__ check upperGraph enforce lowerGraph in CopyGraphMinimal {
     for g1 : SimpleGraph::Graph in SimpleGraph::Graph.allInstances() {
         call graph2graphLM {
             g1 iterates g1;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/HSV2HSL/HSV2HSL.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/HSV2HSL/HSV2HSL.qvti
index 7aaae89..c470dae 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/HSV2HSL/HSV2HSL.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/HSV2HSL/HSV2HSL.qvti
@@ -6,8 +6,8 @@
 -- library '../../myOclHelper.ocl'; -- Import a complete OCL with helpers
 
 transformation hsv2hsl {
-	check hsv imports HSVTree;  -- Should specify the correct package
-	enforce hsl imports HSLTree;  --
+	hsv imports HSVTree;  -- Should specify the correct package
+	hsl imports HSLTree;  --
 	-- hsl imports "strict" HSLTree;  -- 
 	-- hsl imports HSLTree{strict};   -- The model has to strictly conform to the HSLTree mm, without strict the model can have classes that match the name but not completely conform to the mm  
 	middle imports HSV2HSL;
@@ -18,7 +18,7 @@
 query hsv2hsl::rgb2hsl(color : HSV2HSL::RGB) : HSLTree::HSL;
 query hsv2hsl::rgb2hsv(color : HSV2HSL::RGB) : HSVTree::HSV;
 
-map __root__ in hsv2hsl {
+entry __root__ check hsv enforce hsl in hsv2hsl {
 	append nodes : HSVTree::HSVNode;
     for hsvRoot : HSVTree::HSVNode in nodes {
         call HSV2MiddleRoot {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ManualUML2RDBMS/ManualUML2RDBMS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ManualUML2RDBMS/ManualUML2RDBMS.qvti
index 20ac270..295c096 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ManualUML2RDBMS/ManualUML2RDBMS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/ManualUML2RDBMS/ManualUML2RDBMS.qvti
@@ -3,12 +3,12 @@
 import UML2RDBMS: 'ManualUML2RDBMS.ecore'::uml2rdbms;
 
 transformation ManualUML2RDBMS {
-    check uml imports UML;
-    enforce rdbms imports RDBMS;
+    uml imports UML;
+    rdbms imports RDBMS;
     middle imports UML2RDBMS;
 }
 
-map __root__ in ManualUML2RDBMS {
+entry __root__ check uml enforce rdbms in ManualUML2RDBMS {
     for p1 : UML::Package in UML::Package.allInstances() {
         call packageToSchemaLM {
             p iterates p1;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
index d644918..4adb3cd 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
@@ -6,8 +6,8 @@
 {
 	transformation SimpleUML2RDBMS
 	{
-		check uml imports simpleuml;
-		enforce rdbms imports simplerdbms;
+		uml imports simpleuml;
+		rdbms imports simplerdbms;
 		middle imports umltordbms;
 	}
 }
@@ -320,7 +320,7 @@
 	set c.type := ct;
 }
 
-map __root__ in simpleUML2RDBMS::SimpleUML2RDBMS
+entry __root__ check uml enforce rdbms in simpleUML2RDBMS::SimpleUML2RDBMS
 {
 	for p : simpleuml::Package in uml.objectsOfKind(Package) {
 		call packageToSchema_LM {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Tree2TallTree/Tree2TallTree.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Tree2TallTree/Tree2TallTree.qvti
index 83e390a..24382c4 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Tree2TallTree/Tree2TallTree.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/models/Tree2TallTree/Tree2TallTree.qvti
@@ -3,12 +3,12 @@
 import 'Tree2TallTree.ecore'::tree2talltree;
 
 transformation Tree2TallTree {
-	check tree imports tree;
-	enforce talltree imports talltree;
+	tree imports tree;
+	talltree imports talltree;
 	tree2talltree imports tree2talltree;
 }
 
-map __root__ in Tree2TallTree {
+entry __root__ check tree enforce talltree in Tree2TallTree {
     append nodes : tree::Node;
     buffer node2tallNodes : tree2talltree::Node2TallNode;
     install Node2MiddleNode {
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 a6a91a5..32929f9 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
@@ -38,6 +38,7 @@
 import org.eclipse.qvtd.compiler.QVTiCompilerChain;
 import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphMLBuilder;
 import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphMLStringBuilder;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativePackage;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
@@ -70,8 +71,8 @@
 		}
 
 		@Override
-		protected @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull ImperativeTransformation asTransformation) throws Exception {
-			return new QVTiIncrementalExecutor(environmentFactory, asTransformation, modeFactory);
+		protected @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull EntryPoint entryPoint) throws Exception {
+			return new QVTiIncrementalExecutor(environmentFactory, entryPoint, modeFactory);
 		}
 
 		@Override
@@ -190,8 +191,9 @@
 		URI outputURI = getTestURI("Graph2GraphMinimal.xmi");
 		URI traceURI = getTestURI("Graph2Graph.xmi");
 		MyQVT myQVT = createQVT("Graph2GraphMinimal", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -221,8 +223,9 @@
 		URI outputURI = getTestURI("Graph2GraphHierarchical.xmi");
 		URI traceURI = getTestURI("Graph2Graph.xmi");
 		MyQVT myQVT = createQVT("Graph2GraphHierarchical", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -255,8 +258,9 @@
 		URI outputURI = getTestURI("HSLNode.xmi");
 		URI traceURI = getTestURI("HSV2HSLNode.xmi");
 		MyQVT myQVT = createQVT("HSV2HSL", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -281,8 +285,9 @@
 		URI outputURI = getTestURI("TallTree.xmi");
 		URI traceURI = getTestURI("Tree2TallTree.xmi");
 		MyQVT myQVT = createQVT("Tree2TallTree", txURI, ModeFactory.INCREMENTAL);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -309,8 +314,9 @@
 		URI outputURI = getTestURI("TallTree.xmi");
 		URI traceURI = getTestURI("Tree2TallTree.xmi");
 		MyQVT myQVT = createQVT("Tree2TallTree", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -343,8 +349,9 @@
 		@SuppressWarnings("unused")
 		CompleteOCLEObjectValidator completeOCLEObjectValidator2 = new CompleteOCLEObjectValidator(ClassUtil.nonNullState(QVTimperativePackage.eINSTANCE), oclURI, myQVT.getEnvironmentFactory());
 
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -378,8 +385,9 @@
 		@SuppressWarnings("unused")
 		CompleteOCLEObjectValidator completeOCLEObjectValidator2 = new CompleteOCLEObjectValidator(ClassUtil.nonNullState(QVTimperativePackage.eINSTANCE), oclURI, environmentFactory);
 
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -401,8 +409,9 @@
 		URI inputURI = getModelsURI("ClassesCS2AS/bug456900/example_input.xmi");
 		URI outputURI = getTestURI("example_output.xmi");
 		MyQVT myQVT = createQVT("ClassesCS2AS", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -424,8 +433,9 @@
 		URI inputURI = getModelsURI("ClassesCS2AS/bug457239/example_input.xmi");
 		URI outputURI = getTestURI("example_output.xmi");
 		MyQVT myQVT = createQVT("ClassesCS2AS", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		BasicQVTiExecutor testEvaluator = myQVT.createInterpretedExecutor(iEntryPoint);
 		testEvaluator.saveTransformation(txASURI, null);
 		assertLoadable(txASURI);
 		//
@@ -446,8 +456,9 @@
 		URI inputURI = getModelsURI("ClassesCS2AS/bug457239/example_input.xmi");
 		URI outputURI = getTestURI("example_output.xmi");
 		MyQVT myQVT = createQVT("ClassesCS2AS", txURI, ModeFactory.LAZY);
-		ImperativeTransformation asTransformation = myQVT.loadTransformation();
-		myQVT.createInterpretedExecutor(asTransformation);
+		ImperativeTransformation iTransformation = myQVT.loadTransformation();
+		EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
+		myQVT.createInterpretedExecutor(iEntryPoint);
 		//
 		myQVT.addInputURI("leftCS", inputURI);
 		assertTrue(myQVT.executeTransformation());
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java
index c3ead40..4e9e012 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java
@@ -52,8 +52,10 @@
 import org.eclipse.qvtd.compiler.internal.qvtc2qvtu.QVTuConfiguration;
 import org.eclipse.qvtd.compiler.internal.qvtm2qvts.QVTm2QVTs;
 import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil;
+import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.pivot.qvtrelation.utilities.QVTrelation;
 import org.eclipse.qvtd.pivot.qvtrelation.utilities.QVTrelationToStringVisitor;
 import org.eclipse.qvtd.pivot.qvtschedule.impl.RuleRegionImpl;
@@ -789,7 +791,7 @@
 		try {
 			ImperativeTransformation asTransformation = myQVT.compileTransformation("as");
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(QVTimperativeUtil.getDefaultEntryPoint(asTransformation));
 			myQVT.addInputURI("ecore", ecoreURI);
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("as", asURI2);
@@ -981,30 +983,31 @@
 		MyQVT myQVT = createQVT("Forward2Reverse", getModelsURI("forward2reverse/Forward2Reverse.qvtr"));
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("reverse");
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("reverse");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/EmptyList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("EmptyList_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("EmptyList_Interpreted.xmi"), getModelsURI("forward2reverse/samples/EmptyList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/OneElementList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("OneElementList_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("OneElementList_Interpreted.xmi"), getModelsURI("forward2reverse/samples/OneElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/TwoElementList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("TwoElementList_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("TwoElementList_Interpreted.xmi"), getModelsURI("forward2reverse/samples/TwoElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("forward", getModelsURI("forward2reverse/samples/ThreeElementList.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("reverse", getTestURI("ThreeElementList_Interpreted.xmi"));
@@ -1033,8 +1036,8 @@
 		try {
 			Iterable<@NonNull String> forwardOutputNames = Collections.singletonList("forward");
 			Iterable<@NonNull String> reverseOutputNames = Collections.singletonList("reverse");
-			//			txClass = myQVT1.buildTransformation(Lists.newArrayList(reverseOutputNames, forwardOutputNames), false);//,
-			txClass = myQVT1.buildTransformation(Collections.singletonList(reverseOutputNames), false);//,
+			txClass = myQVT1.buildTransformation(Lists.newArrayList(reverseOutputNames, forwardOutputNames), false);//,
+			//			txClass = myQVT1.buildTransformation(Collections.singletonList(reverseOutputNames), false);//,
 			//			Class<? extends Transformer> txClass = Forward2Reverse.class;
 			//			myQVT1.assertRegionCount(ActivatorRegionImpl.class, 2);
 			//	myQVT1.assertRegionCount(RuleRegionImpl.class, 1);
@@ -1052,31 +1055,38 @@
 			//
 			myQVT2.createGeneratedExecutor(txClass);
 			myQVT2.addInputURI("forward", getModelsURI("forward2reverse/samples/EmptyList.xmi"));
-			myQVT2.executeTransformation();
+			myQVT2.executeTransformation("reverse");
 			myQVT2.addOutputURI("reverse", getTestURI("EmptyList_CG.xmi"));
 			myQVT2.saveModels(null);
 			myQVT2.checkOutput(getTestURI("EmptyList_CG.xmi"), getModelsURI("forward2reverse/samples/EmptyList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
 			myQVT2.createGeneratedExecutor(txClass);
 			myQVT2.addInputURI("forward", getModelsURI("forward2reverse/samples/OneElementList.xmi"));
-			myQVT2.executeTransformation();
+			myQVT2.executeTransformation("reverse");
 			myQVT2.addOutputURI("reverse", getTestURI("OneElementList_CG.xmi"));
 			myQVT2.saveModels(null);
 			myQVT2.checkOutput(getTestURI("OneElementList_CG.xmi"), getModelsURI("forward2reverse/samples/OneElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
 			myQVT2.createGeneratedExecutor(txClass);
 			myQVT2.addInputURI("forward", getModelsURI("forward2reverse/samples/TwoElementList.xmi"));
-			myQVT2.executeTransformation();
+			myQVT2.executeTransformation("reverse");
 			myQVT2.addOutputURI("reverse", getTestURI("TwoElementList_CG.xmi"));
 			myQVT2.saveModels(null);
 			myQVT2.checkOutput(getTestURI("TwoElementList_CG.xmi"), getModelsURI("forward2reverse/samples/TwoElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 			//
 			myQVT2.createGeneratedExecutor(txClass);
 			myQVT2.addInputURI("forward", getModelsURI("forward2reverse/samples/ThreeElementList.xmi"));
-			myQVT2.executeTransformation();
+			myQVT2.executeTransformation("reverse");
 			myQVT2.addOutputURI("reverse", getTestURI("ThreeElementList_CG.xmi"));
 			myQVT2.saveModels(null);
 			myQVT2.checkOutput(getTestURI("ThreeElementList_CG.xmi"), getModelsURI("forward2reverse/samples/ThreeElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
+			//
+			myQVT2.createGeneratedExecutor(txClass);
+			myQVT2.addInputURI("reverse", getModelsURI("forward2reverse/samples/ThreeElementList.xmi"));
+			myQVT2.executeTransformation("forward");
+			myQVT2.addOutputURI("forward", getTestURI("ThreeElementList_CG.xmi"));
+			myQVT2.saveModels(null);
+			myQVT2.checkOutput(getTestURI("ThreeElementList_CG.xmi"), getModelsURI("forward2reverse/samples/ThreeElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
 		}
 		finally {
 			myQVT2.dispose();
@@ -1090,23 +1100,24 @@
 		MyQVT myQVT = createQVT("HierarchicalStateMachine2FlatStateMachine", getModelsURI("hstm2fstm/HierarchicalStateMachine2FlatStateMachine.qvtr"));
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
-			ImperativeTransformation asTransformation = myQVT.compileTransformation("flat");
+			ImperativeTransformation iTransformation = myQVT.compileTransformation("flat");
+			EntryPoint iEntryPoint = QVTimperativeUtil.getDefaultEntryPoint(iTransformation);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("hier", getModelsURI("hstm2fstm/samples/MiniModel.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("flat", getTestURI("MiniModel_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("MiniModel_Interpreted.xmi"), getModelsURI("hstm2fstm/samples/MiniModel_expected.xmi"), FlatStateMachineNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("hier", getModelsURI("hstm2fstm/samples/SimpleModel.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("flat", getTestURI("SimpleModel_Interpreted.xmi"));
 			myQVT.saveModels(null);
 			myQVT.checkOutput(getTestURI("SimpleModel_Interpreted.xmi"), getModelsURI("hstm2fstm/samples/SimpleModel_expected.xmi"), FlatStateMachineNormalizer.INSTANCE);
 			//
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(iEntryPoint);
 			myQVT.addInputURI("hier", getModelsURI("hstm2fstm/samples/LargerModel.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("flat", getTestURI("LargerModel_Interpreted.xmi"));
@@ -1453,7 +1464,7 @@
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
 			ImperativeTransformation asTransformation = myQVT.compileTransformation("stm");
-			myQVT.createInterpretedExecutor(asTransformation);
+			myQVT.createInterpretedExecutor(QVTimperativeUtil.getDefaultEntryPoint(asTransformation));
 			myQVT.addInputURI("seqDgm", getModelsURI("seq2stm/samples/Seq.xmi"));
 			myQVT.executeTransformation();
 			myQVT.addOutputURI("stm", getTestURI("Stmc_Interpreted.xmi"));
