[461314] IncrementalExecutor works for LAZY and INCREMENTAL modes
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 869635f..9bc1855 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
@@ -25,7 +25,6 @@
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.examples.codegen.analyzer.NameManager;
-import org.eclipse.ocl.examples.codegen.cgmodel.CGElementId;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGExecutorProperty;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGFinalVariable;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGIterator;
@@ -46,7 +45,6 @@
 import org.eclipse.ocl.pivot.ids.ClassId;
 import org.eclipse.ocl.pivot.ids.CollectionTypeId;
 import org.eclipse.ocl.pivot.ids.ElementId;
-import org.eclipse.ocl.pivot.ids.PropertyId;
 import org.eclipse.ocl.pivot.ids.TypeId;
 import org.eclipse.ocl.pivot.utilities.ClassUtil;
 import org.eclipse.ocl.pivot.utilities.NameUtil;
@@ -322,7 +320,10 @@
     }
     
 	protected @Nullable String doOppositePropertyIds(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
-		Map<Property, Integer> opposites = transformationAnalysis.getSourceCaches();
+		return null;
+		// 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<Property, Integer> opposites = transformationAnalysis.getSourceCaches();
 		if (opposites.size() <= 0) {
 			return null;
 		}
@@ -339,7 +340,7 @@
 		//
 		js.append("/*\n");
 		js.append(" * Array of the source PropertyIds of each Property for which unnavigable opposite property navigation may occur.\n");
-		js.append(" */\n");
+		js.append(" * /\n");
 		String oppositeIndex2propertyIdName = nameManager.getGlobalSymbolName(null, "oppositeIndex2propertyId");
 		js.append("private static final ");
 		js.appendIsRequired(true);
@@ -362,7 +363,7 @@
 		}
 		js.popIndentation();
 		js.append("};\n");
-		return oppositeIndex2propertyIdName;
+		return oppositeIndex2propertyIdName; */
     }
 
 	protected void doRun(@NonNull CGTransformation cgTransformation) {
@@ -1020,6 +1021,7 @@
 
 	@Override
 	public @NonNull Boolean visitCGTransformation(@NonNull CGTransformation cgTransformation) {
+		js.appendClassHeader(cgTransformation.getContainingPackage());
 		@SuppressWarnings("null")@NonNull Transformation transformation = (Transformation) cgTransformation.getAst();
 		QVTiTransformationAnalysis transformationAnalysis = context.getTransformationAnalysis(transformation);
 		String className = cgTransformation.getName();
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 503edea..f2dffac 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
@@ -26,6 +26,7 @@
 import org.eclipse.ocl.examples.codegen.analyzer.DependencyVisitor;
 import org.eclipse.ocl.examples.codegen.analyzer.FieldingAnalyzer;
 import org.eclipse.ocl.examples.codegen.analyzer.ReferencesVisitor;
+import org.eclipse.ocl.examples.codegen.cgmodel.CGClass;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGModelFactory;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGPackage;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
@@ -57,7 +58,8 @@
 {	
 	protected final @NonNull QVTiAnalyzer cgAnalyzer;
 	protected final @NonNull Transformation transformation;
-	private/* @LazyNonNull */String javaSourceCode = null;
+	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>();
 
@@ -88,14 +90,36 @@
 	}
 
 	protected @NonNull CGPackage createCGPackage() {
-		String packagePrefix = getOptions().getPackagePrefix();
-		CGPackage cgPackage = CGModelFactory.eINSTANCE.createCGPackage();
-		cgPackage.setName(packagePrefix);
-		QVTiAS2CGVisitor pivot2CGVisitor = createAS2CGVisitor(cgAnalyzer,
-			getGlobalContext());
-		CGTransformation cgTransformation = (CGTransformation) ClassUtil
-			.nonNullState(transformation.accept(pivot2CGVisitor));
+		CGPackage cgPackage = createCGPackage(ClassUtil.nonNullModel(transformation.getOwningPackage()));
+		QVTiAS2CGVisitor pivot2CGVisitor = createAS2CGVisitor(cgAnalyzer, getGlobalContext());
+		CGTransformation cgTransformation = (CGTransformation) ClassUtil.nonNullState(transformation.accept(pivot2CGVisitor));
 		cgPackage.getClasses().add(cgTransformation);
+		while (cgPackage.eContainer() != null) {
+			cgPackage = (CGPackage)cgPackage.eContainer();
+		}
+		return cgPackage;
+	}
+
+	protected @NonNull CGPackage createCGPackage(@NonNull org.eclipse.ocl.pivot.Package asPackage) {
+		String packagePrefix = getOptions().getPackagePrefix();
+		CGPackage cgParentPackage;
+		org.eclipse.ocl.pivot.Package asParentPackage = asPackage.getOwningPackage();
+		if (asParentPackage != null) {
+			cgParentPackage = createCGPackage(asParentPackage);
+		}
+		else if (packagePrefix != null) {
+			cgParentPackage = CGModelFactory.eINSTANCE.createCGPackage();
+			cgParentPackage.setName(packagePrefix);		
+		}
+		else {
+			cgParentPackage = null;		
+		}
+		CGPackage cgPackage = CGModelFactory.eINSTANCE.createCGPackage();
+		String name = asPackage.getName();
+		cgPackage.setName((name != null) && (name.length() > 0)? name : "_" + transformation.getName());
+		if (cgParentPackage != null) {
+			cgParentPackage.getPackages().add(cgPackage);
+		}
 		return cgPackage;
 	}
 
@@ -131,11 +155,12 @@
 	public @NonNull String generateClassFile() {
 		String javaSourceCode2 = javaSourceCode;
 		if (javaSourceCode2 == null) {
-			CGPackage cgPackage = createCGPackage();
-			optimize(cgPackage);
+			CGPackage cgPackage2 = createCGPackage();
+			cgPackage = cgPackage2;
+			optimize(cgPackage2);
 			List<CGValuedElement> sortedGlobals = prepareGlobals();
-			QVTiCG2JavaVisitor generator = createCG2JavaVisitor(cgPackage, sortedGlobals);
-			generator.safeVisit(cgPackage);
+			QVTiCG2JavaVisitor generator = createCG2JavaVisitor(cgPackage2, sortedGlobals);
+			generator.safeVisit(cgPackage2);
 			Set<String> allImports = generator.getAllImports();
 			Map<String, String> long2ShortImportNames = ImportUtils.getLong2ShortImportNames(allImports);
 			javaSourceCode = javaSourceCode2 = ImportUtils.resolveImports(generator.toString(), long2ShortImportNames);
@@ -159,13 +184,18 @@
 	}
 
 	public @NonNull String getQualifiedName() {
-		String className = ClassUtil.nonNullState(transformation.getName());
-		String packagePrefix = getOptions().getPackagePrefix();
-		if (packagePrefix != null) {
-			return packagePrefix + "." + className;
-		} else {
-			return className;
+		StringBuilder s =  new StringBuilder();
+		CGPackage cgPackage = this.cgPackage;
+		s.append(cgPackage.getName());
+		while (cgPackage.getPackages().size() > 0) {
+			cgPackage = cgPackage.getPackages().get(0);
+			s.append(".");
+			s.append(cgPackage.getName());
 		}
+		s.append(".");
+		s.append(transformation.getName());
+		@SuppressWarnings("null")@NonNull String string = s.toString();
+		return string;
 	}
 
 	public @NonNull QVTiTransformationAnalysis getTransformationAnalysis(@NonNull Transformation transformation) {
@@ -180,13 +210,22 @@
 	}
 
 	public void saveSourceFile(@NonNull String savePath) throws IOException {
-		String javaCodeSource = generateClassFile();
-		String qualifiedName = getQualifiedName();
-		String saveDir = savePath + qualifiedName.replace('.', '/');
-		String fileName = saveDir + ".java";
-		new File(saveDir).getParentFile().mkdirs();
-		Writer writer = new FileWriter(fileName);
-		writer.append(javaCodeSource);
-		writer.close();
+		saveSourceFiles(ClassUtil.nonNullState(cgPackage), new File(savePath));
+	}
+
+	public void saveSourceFiles(@NonNull CGPackage cgPackage, @NonNull File parentFolder) throws IOException {
+		File folder = new File(parentFolder, cgPackage.getName());
+		for (CGPackage cgChildPackage : cgPackage.getPackages()) {
+			if (cgChildPackage != null) {
+				saveSourceFiles(cgChildPackage, folder);
+			}
+		}
+		for (CGClass cgClass : cgPackage.getClasses()) {
+			folder.mkdirs();
+			String javaCodeSource = generateClassFile();
+			Writer writer = new FileWriter(new File(folder, cgClass.getName() + ".java"));
+			writer.append(javaCodeSource);
+			writer.close();
+		}
 	}
 }
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 2e9da7e..5728feb 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
@@ -250,7 +250,7 @@
 		if (calledMapping != null) {
 			calledMapping.accept(undecoratedVisitor);
 		}
-    	return null;
+    	return true;
 	}
 
 	@Override
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 d646ee3..909ca9e 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
@@ -30,8 +30,8 @@
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.CollectionType;
-import org.eclipse.ocl.pivot.Element;
 import org.eclipse.ocl.pivot.NavigationCallExp;
+import org.eclipse.ocl.pivot.OCLExpression;
 import org.eclipse.ocl.pivot.Property;
 import org.eclipse.ocl.pivot.Type;
 import org.eclipse.ocl.pivot.Variable;
@@ -42,6 +42,7 @@
 import org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment;
 import org.eclipse.qvtd.pivot.qvtcorebase.RealizedVariable;
 import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage;
+import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.AssociationStatus;
@@ -52,368 +53,599 @@
 import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.MappingStatus;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.PropertyStatus;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.TransformationStatus;
-import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphMLBuilder;
 
 /**
  * An evaluator implementation for OCL expressions.
  */
 public class QVTiIncrementalExecutor extends BasicQVTiExecutor
 {
-	private enum Mode {
-		EXECUTE,					// EvaluationStatus is created lazily where necessary
+	public enum Mode {
+		LAZY,						// EvaluationStatus is created lazily where necessary
 		INCREMENTAL,				// EvaluationStatus is created for all mapping elements
 		REPAIR						// EvaluationStatus is updated for all mapping elements
 	};
-	private enum Usage { IN, OUT, INOUT };
-	
-	protected final @NonNull TransformationStatus transformationStatus = EvaluationStatusFactory.eINSTANCE.createTransformationStatus();
-	protected final @NonNull Map<Object, ClassStatus> object2ClassStatus = new HashMap<Object, ClassStatus>();
-	protected final @NonNull Stack<MappingStatus> mappingStatusStack = new Stack<MappingStatus>();
 	
 	/**
-	 * Non-null list while accumulating damage.
+	 * EvaluationStatusManager creates and locates elements of the EvaluationStatus model.
 	 */
-	private @Nullable Set<MappingStatus> dirtyMappingStatuses = new HashSet<MappingStatus>();
-	
-	/**
-	 * Mapping invocations that failed due to a not-ready value that is still not-ready.
-	 */
-	private final @NonNull Set<MappingStatus> blockedMappingStatuses = new HashSet<MappingStatus>();
-	
-	/**
-	 * Non-null while mapping invocations that failed due to a not-ready value that is now ready.
-	 */
-	private @Nullable Set<MappingStatus> unblockedMappingStatuses = null;
-	
-	private @NonNull Mode mode;
-	
-	public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI transformationURI) throws IOException {
-		super(environmentFactory, transformationURI);
-		mode = Mode.EXECUTE;
-	}
+	private static class EvaluationStatusManager
+	{
+		protected final@NonNull MappingAnalysis mappingAnalysis;
+		protected final @NonNull TransformationStatus transformationStatus = EvaluationStatusFactory.eINSTANCE.createTransformationStatus();
 
-	protected void allocateDirtyMappingStatuses(@NonNull List<Set<MappingStatus>> depth2dirtyMappingStatuses,
-			@NonNull Set<MappingStatus> dirtyMappingStatuses) {
-		for (MappingStatus mappingStatus : dirtyMappingStatuses) {
-			if (mappingStatus != null) {
-				int mappingDepth = EvaluationStatus2DepthVisitor.INSTANCE.visit(mappingStatus);
-				while (depth2dirtyMappingStatuses.size() <= mappingDepth) {
-					depth2dirtyMappingStatuses.add(null);
+		private final @NonNull Map<Object, ClassStatus> object2ClassStatus = new HashMap<Object, ClassStatus>();
+		
+		/**
+		 * Non-null list while accumulating damage.
+		 */
+		private @Nullable Set<MappingStatus> dirtyMappingStatuses = new HashSet<MappingStatus>();
+
+		public EvaluationStatusManager(@NonNull MappingAnalysis mappingAnalysis) {
+			this.mappingAnalysis = mappingAnalysis;
+		}
+
+		private void allocateDirtyMappingStatuses(@NonNull List<Set<MappingStatus>> depth2dirtyMappingStatuses,
+				@NonNull Set<MappingStatus> dirtyMappingStatuses) {
+			for (MappingStatus mappingStatus : dirtyMappingStatuses) {
+				if (mappingStatus != null) {
+					int mappingDepth = EvaluationStatus2DepthVisitor.INSTANCE.visit(mappingStatus);
+					while (depth2dirtyMappingStatuses.size() <= mappingDepth) {
+						depth2dirtyMappingStatuses.add(null);
+					}
+					Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(mappingDepth);
+					if (mappingStatuses == null) {
+						mappingStatuses = new HashSet<MappingStatus>();
+						depth2dirtyMappingStatuses.set(mappingDepth, mappingStatuses);
+					}
+					mappingStatuses.add(mappingStatus);
 				}
-				Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(mappingDepth);
-				if (mappingStatuses == null) {
-					mappingStatuses = new HashSet<MappingStatus>();
-					depth2dirtyMappingStatuses.set(mappingDepth, mappingStatuses);
+			}
+			dirtyMappingStatuses.clear();
+		}
+
+		public void checkForDamage(@NonNull Resource resource) {
+			for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) {
+				EObject eObject = tit.next();
+				ClassStatus classStatus = object2ClassStatus.get(eObject);
+				if (classStatus != null) {
+					for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
+						EStructuralFeature eFeature = attributeStatus.getEFeature();
+						Object newValue = eObject.eGet(eFeature);
+						setNewValue(attributeStatus, newValue);
+					}
 				}
-				mappingStatuses.add(mappingStatus);
 			}
 		}
-		dirtyMappingStatuses.clear();
-	}
 
-	protected void block(@NonNull MappingStatus mappingStatus) {
-		assert !mappingStatus.isIsBlocked();
-		mappingStatus.setIsBlocked(true);
-		blockedMappingStatuses.add(mappingStatus);
-		Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
-		if (unblockedMappingStatuses2 != null) {
-			unblockedMappingStatuses2.remove(mappingStatus);
+		private void computeAssociationRecursion(@NonNull EObject aThat, @NonNull EReference that2this, @NonNull Set<EObject> allThese, @NonNull EReference this2that, @NonNull Set<EObject> allThose) {
+			Object object = aThat.eGet(that2this);
+			if (!that2this.isMany()) {
+				allThese.add((EObject)object);
+			}
+			else {
+				@SuppressWarnings("unchecked") List<EObject> moreThese = (List<EObject>)object;
+				for (EObject aThis : moreThese) {
+					if ((aThis != null) && !allThese.contains(aThis)) {
+						allThese.add(aThis);
+						computeAssociationRecursion(aThis, this2that, allThose, that2this, allThese);
+					}
+				}
+			}
 		}
-	}
+		
+		private @NonNull ClassStatus createClassStatus(/*@NonNull*/ Type type, @NonNull EObject eObject) {
+			ClassStatus classStatus = EvaluationStatusFactory.eINSTANCE.createClassStatus();
+			classStatus.setType(type);
+			classStatus.setEObject(eObject);
+			object2ClassStatus.put(eObject, classStatus);
+			transformationStatus.getOwnedClassStatuses().add(classStatus);
+			return classStatus;
+		}
 
-	public void checkForDamage(@NonNull Resource resource) {
-		for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) {
-			EObject eObject = tit.next();
+		public @NonNull MappingStatus createMappingStatus(@NonNull MappingCall mappingCall, @NonNull List<Object> boundValues) {
+			MappingStatus newMappingStatus = EvaluationStatusFactory.eINSTANCE.createMappingStatus();
+			newMappingStatus.setReferredMappingCall(mappingCall);
+			newMappingStatus.getBoundValues().addAll(boundValues);
+			transformationStatus.getOwnedMappingStatuses().add(newMappingStatus);
+			return newMappingStatus;
+		}
+
+		private @Nullable PropertyStatus findAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) {
+			EReference that2thisEReference = this2thatEReference.getEOpposite();
+			assert that2thisEReference != null;
+			//
+			//	Return a pre-existing AssociationStatus
+			//
+			for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) {
+				EReference eReference = associationStatus.getForwardEReference();
+				if (eReference == this2thatEReference) {
+					if (associationStatus.getFromClassStatuses().contains(classStatus)) {
+						return associationStatus;
+					}
+				}
+				if (eReference == that2thisEReference) {
+					if (associationStatus.getToClassStatuses().contains(classStatus)) {
+						return associationStatus;
+					}
+				}
+			}
+			return null;
+		}
+		
+		private @Nullable AttributeStatus findAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) {
+			//
+			//	Return a pre-existing AttributeStatus
+			//
+			for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
+				if (attributeStatus.getEFeature() == eFeature) {
+					return attributeStatus;
+				}
+			}
+			return null;
+		}
+
+		private @Nullable ClassStatus findClassStatus(@NonNull EObject eObject) {
+			return object2ClassStatus.get(eObject);
+		}
+		
+		public @Nullable PropertyStatus findPropertyStatus(@NonNull EObject thisObject, @NonNull Property property) {
+			EObject eFeature = property.getESObject();
+			ClassStatus classStatus = findClassStatus(thisObject);
+			if (classStatus == null) {
+				return null;
+			}
+			if (eFeature instanceof EReference) {
+				EReference eReference = (EReference)eFeature;
+				if (eReference.getEOpposite() != null) {
+					return findAssociationStatus(classStatus, thisObject, eReference);
+				}
+			}
+			if (eFeature instanceof EStructuralFeature) {
+				return findAttributeStatus(classStatus, (EStructuralFeature)eFeature);
+			}
+			else if (property.isIsImplicit()) {				// Workaround Bug 463966
+				throw new UnsupportedOperationException();
+			}
+			else {
+				throw new UnsupportedOperationException();
+			}
+		}
+
+		private @NonNull PropertyStatus getAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) {
+			EReference that2thisEReference = this2thatEReference.getEOpposite();
+			assert that2thisEReference != null;
+			//
+			//	Return a pre-existing AssociationStatus
+			//
+			for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) {
+				EReference eReference = associationStatus.getForwardEReference();
+				if (eReference == this2thatEReference) {
+					if (associationStatus.getFromClassStatuses().contains(classStatus)) {
+						return associationStatus;
+					}
+				}
+				if (eReference == that2thisEReference) {
+					if (associationStatus.getToClassStatuses().contains(classStatus)) {
+						return associationStatus;
+					}
+				}
+			}
+			//
+			//	Identify the participating EObjects, recursing for M:N associations
+			//
+			Set<EObject> allThese = new HashSet<EObject>();
+			allThese.add(thisObject);
+			Set<EObject> allThose = new HashSet<EObject>();
+			computeAssociationRecursion(thisObject, this2thatEReference, allThose, that2thisEReference, allThese);
+			//
+			//	Create a new AssociationStatus
+			//
+			AssociationStatus associationStatus = EvaluationStatusFactory.eINSTANCE.createAssociationStatus();
+			associationStatus.setForwardEReference(this2thatEReference);
+			//
+			List<ClassStatus> fromClassStatuses = associationStatus.getFromClassStatuses();
+			for (EObject aThis : allThese) {
+				ClassStatus fromClassStatus = object2ClassStatus.get(aThis);
+				if (fromClassStatus != null) {
+					fromClassStatuses.add(fromClassStatus);
+					fromClassStatus.getAssociationStatuses().add(associationStatus);
+					if (fromClassStatus.isIsInput()) {
+						associationStatus.setIsInput(true);
+					}
+					if (fromClassStatus.isIsOutput()) {
+						associationStatus.setIsOutput(true);
+						associationStatus.setIsAssignable(true);
+					}
+					else {
+						associationStatus.setIsAssigned(true);
+					}
+				}
+			}
+			//
+			List<ClassStatus> toClassStatuses = associationStatus.getToClassStatuses();
+			for (EObject aThat : allThose) {
+				ClassStatus toClassStatus = object2ClassStatus.get(aThat);
+				if (toClassStatus != null) {
+					toClassStatuses.add(toClassStatus);
+					toClassStatus.getAssociationStatuses().add(associationStatus);
+					if (toClassStatus.isIsInput()) {
+						associationStatus.setIsInput(true);
+					}
+					if (toClassStatus.isIsOutput()) {
+						associationStatus.setIsOutput(true);
+						associationStatus.setIsAssignable(true);
+					}
+					else {
+						associationStatus.setIsAssigned(true);
+					}
+				}
+			}
+			//
+			transformationStatus.getOwnedAssociationStatuses().add(associationStatus);
+			return associationStatus;
+		}
+		
+		private @NonNull AttributeStatus getAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) {
+			//
+			//	Return a pre-existing AttributeStatus
+			//
+			for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
+				if (attributeStatus.getEFeature() == eFeature) {
+					return attributeStatus;
+				}
+			}
+			//
+			//	Create a new AttributeStatus
+			//
+			AttributeStatus attributeStatus = EvaluationStatusFactory.eINSTANCE.createAttributeStatus();
+			attributeStatus.setEFeature(eFeature);
+			classStatus.getOwnedAttributeStatuses().add(attributeStatus);
+			if (classStatus.isIsOutput()) {
+				attributeStatus.setIsAssignable(true);
+			}
+			else {
+				attributeStatus.setIsAssigned(true);
+			}
+			return attributeStatus;
+		}
+
+		public @NonNull ClassStatus getClassStatus(@Nullable DomainUsage domainUsage, /*@NonNull*/ Type type, @NonNull EObject eObject) {
 			ClassStatus classStatus = object2ClassStatus.get(eObject);
-			if (classStatus != null) {
-				for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
-					EStructuralFeature eFeature = attributeStatus.getEFeature();
-					Object newValue = eObject.eGet(eFeature);
-					setNewValue(attributeStatus, newValue);
+			if (classStatus == null) {
+				classStatus = createClassStatus(type, eObject);
+				if ((domainUsage == null) || !isOut(domainUsage)) {
+					classStatus.setIsInput(true);
+				}
+				if ((domainUsage == null) || !isIn(domainUsage)) {
+					classStatus.setIsOutput(true);
 				}
 			}
+			return classStatus;
 		}
-	}
-
-	private void computeAssociationRecursion(@NonNull EObject aThat, @NonNull EReference that2this, @NonNull Set<EObject> allThese, @NonNull EReference this2that, @NonNull Set<EObject> allThose) {
-		Object object = aThat.eGet(that2this);
-		if (!that2this.isMany()) {
-			allThese.add((EObject)object);
-		}
-		else {
-			@SuppressWarnings("unchecked") List<EObject> moreThese = (List<EObject>)object;
-			for (EObject aThis : moreThese) {
-				if ((aThis != null) && !allThese.contains(aThis)) {
-					allThese.add(aThis);
-					computeAssociationRecursion(aThis, this2that, allThose, that2this, allThese);
+		
+		public @NonNull PropertyStatus getPropertyStatus(@Nullable DomainUsage domainUsage, @NonNull EObject thisObject, @NonNull Property property) {
+			EObject eFeature = property.getESObject();
+			ClassStatus classStatus = getClassStatus(domainUsage, property.getOwningClass(), thisObject);
+			PropertyStatus propertyStatus = null;
+			if (eFeature instanceof EReference) {
+				EReference eReference = (EReference)eFeature;
+				if (eReference.getEOpposite() != null) {
+					propertyStatus = getAssociationStatus(classStatus, thisObject, eReference);
 				}
 			}
-		}
-	}
-
-	protected @NonNull ClassStatus createClassStatus(/*@NonNull*/ Type type, @NonNull EObject eObject) {
-		ClassStatus classStatus = EvaluationStatusFactory.eINSTANCE.createClassStatus();
-		classStatus.setType(type);
-		classStatus.setEObject(eObject);
-		object2ClassStatus.put(eObject, classStatus);
-		transformationStatus.getOwnedClassStatuses().add(classStatus);
-		return classStatus;
-	}
-
-	protected @NonNull MappingStatus createMappingStatus(@NonNull MappingCall mappingCall) {
-		MappingStatus mappingStatus = EvaluationStatusFactory.eINSTANCE.createMappingStatus();
-		mappingStatus.setReferredMappingCall(mappingCall);
-		List<Object> boundValues = mappingStatus.getBoundValues();
-		for (MappingCallBinding binding : mappingCall.getBinding()) {
-			Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable());
-			Object valueOrValues = getValueOf(boundVariable);
-			boundValues.add(valueOrValues);
-		}
-		transformationStatus.getOwnedMappingStatuses().add(mappingStatus);
-		return mappingStatus;
-	}
-
-	protected void flushUnblockedMappings(@NonNull EvaluationVisitor undecoratedVisitor) {
-		while (unblockedMappingStatuses != null) {
-			List<MappingStatus> unblockingMappingStatuses = new ArrayList<MappingStatus>(unblockedMappingStatuses);
-			unblockedMappingStatuses = null;
-			for (@SuppressWarnings("null")@NonNull MappingStatus unblockingMappingStatus : unblockingMappingStatuses) {
-				internalExecuteMappingCallRetry(unblockingMappingStatus, undecoratedVisitor);
-			}
-		}
-	}
-
-	protected @NonNull PropertyStatus getAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) {
-		EReference that2thisEReference = this2thatEReference.getEOpposite();
-		assert that2thisEReference != null;
-		//
-		//	Return a pre-existing AssociationStatus
-		//
-		for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) {
-			EReference eReference = associationStatus.getForwardEReference();
-			if (eReference == this2thatEReference) {
-				if (associationStatus.getFromClassStatuses().contains(classStatus)) {
-					return associationStatus;
+			if (propertyStatus == null) {
+				if (eFeature instanceof EStructuralFeature) {
+					propertyStatus = getAttributeStatus(classStatus, (EStructuralFeature)eFeature);
 				}
-			}
-			if (eReference == that2thisEReference) {
-				if (associationStatus.getToClassStatuses().contains(classStatus)) {
-					return associationStatus;
-				}
-			}
-		}
-		//
-		//	Identify the participating EObjects, recursing for M:N associations
-		//
-		Set<EObject> allThese = new HashSet<EObject>();
-		allThese.add(thisObject);
-		Set<EObject> allThose = new HashSet<EObject>();
-		computeAssociationRecursion(thisObject, this2thatEReference, allThose, that2thisEReference, allThese);
-		//
-		//	Create a new AssociationStatus
-		//
-		AssociationStatus associationStatus = EvaluationStatusFactory.eINSTANCE.createAssociationStatus();
-		associationStatus.setForwardEReference(this2thatEReference);
-		//
-		List<ClassStatus> fromClassStatuses = associationStatus.getFromClassStatuses();
-		for (EObject aThis : allThese) {
-			ClassStatus fromClassStatus = object2ClassStatus.get(aThis);
-			if (fromClassStatus != null) {
-				fromClassStatuses.add(fromClassStatus);
-				fromClassStatus.getAssociationStatuses().add(associationStatus);
-				if (fromClassStatus.isIsInput()) {
-					associationStatus.setIsInput(true);
-				}
-				if (fromClassStatus.isIsOutput()) {
-					associationStatus.setIsOutput(true);
-					associationStatus.setIsAssignable(true);
+				else if (property.isIsImplicit()) {				// Workaround Bug 463966
+					throw new UnsupportedOperationException();
 				}
 				else {
-					associationStatus.setIsAssigned(true);
+					throw new UnsupportedOperationException();
 				}
 			}
+			if ((domainUsage != null) && /*(propertyStatus != null) && */isIn(domainUsage) && !mappingAnalysis.isAssigned(property, domainUsage)) {
+				propertyStatus.setIsAssignable(false);
+				propertyStatus.setIsAssigned(true);
+			}
+			return propertyStatus;
 		}
-		//
-		List<ClassStatus> toClassStatuses = associationStatus.getToClassStatuses();
-		for (EObject aThat : allThose) {
-			ClassStatus toClassStatus = object2ClassStatus.get(aThat);
-			if (toClassStatus != null) {
-				toClassStatuses.add(toClassStatus);
-				toClassStatus.getAssociationStatuses().add(associationStatus);
-				if (toClassStatus.isIsInput()) {
-					associationStatus.setIsInput(true);
+		
+		public @NonNull TransformationStatus getTransformationStatus() {
+			return transformationStatus;
+		}
+
+		private boolean isIn(@NonNull DomainUsage domainUsage) {
+			return !domainUsage.isEnforceable();
+		}
+
+		private boolean isOut(@NonNull DomainUsage domainUsage) {
+			return domainUsage.isEnforceable() && !domainUsage.isCheckable();
+		}
+		
+		/**
+		 * Re-execute the dirtyMappingStatuses resulting from property value changes, and transitively any
+		 * downstream mappingStatuses affected by the re-execution.
+		 */
+		public void repairDamage() {
+			Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
+			if (dirtyMappingStatuses2 != null) {
+				List<Set<MappingStatus>> depth2dirtyMappingStatuses = new ArrayList<Set<MappingStatus>>();
+				for (int cleanDepth = 0; cleanDepth < depth2dirtyMappingStatuses.size(); cleanDepth++) {
+					if (dirtyMappingStatuses2.size() > 0) {
+						allocateDirtyMappingStatuses(depth2dirtyMappingStatuses, dirtyMappingStatuses2);
+					}
+					Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(cleanDepth);
+					if (mappingStatuses != null) {
+//						for (MappingStatus mappingStatus : mappingStatuses) {
+//						}
+					}
+					depth2dirtyMappingStatuses.set(cleanDepth, null);
 				}
-				if (toClassStatus.isIsOutput()) {
-					associationStatus.setIsOutput(true);
-					associationStatus.setIsAssignable(true);
+				dirtyMappingStatuses = null;
+			}
+		}
+
+		protected void setNewValue(@NonNull PropertyStatus propertyStatus, @Nullable Object newValue) {
+			if (!propertyStatus.isIsDirty()) {
+				if (propertyStatus instanceof AttributeStatus) {
+					AttributeStatus attributeStatus = (AttributeStatus)propertyStatus;
+					Object oldValue = attributeStatus.getObject();
+					if (!ClassUtil.safeEquals(newValue, oldValue)) {
+						attributeStatus.setIsDirty(true);
+						attributeStatus.setObject(newValue);
+					}
 				}
 				else {
-					associationStatus.setIsAssigned(true);
+				}
+				for (MappingStatus mappingStatus : propertyStatus.getTargets()) {
+					mappingStatus.setIsDirty(true);
+					Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
+					if (dirtyMappingStatuses2 == null) {
+						dirtyMappingStatuses = dirtyMappingStatuses2 = new HashSet<MappingStatus>();
+					}
+					dirtyMappingStatuses2.add(mappingStatus);
 				}
 			}
 		}
-		//
-		transformationStatus.getOwnedAssociationStatuses().add(associationStatus);
-		return associationStatus;
+	}
+
+	/**
+	 * MappingAnalysis manages additional properties determined by analysis of the Transformation or Mappings.. 
+	 */
+	private static class MappingAnalysis
+	{
+		private final @NonNull QVTiTransformationAnalysis transformationAnalysis;
+		private final @NonNull Set<Property> hazardousProperties = new HashSet<Property>();
+		private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments;
+		private final @NonNull Map<Property, Set<PropertyAssignment>> property2propertyAssignments = new HashMap<Property, Set<PropertyAssignment>>();
+
+		public MappingAnalysis(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
+			this.transformationAnalysis = transformationAnalysis;
+			Set<Mapping> hazardousMappings = transformationAnalysis.getHazardousMappings();
+			for (Map.Entry<Mapping, Set<Property>> entry : transformationAnalysis.getMapping2Property().entrySet()) {
+				Mapping mapping = entry.getKey();
+				if (hazardousMappings.contains(mapping)) {
+					hazardousProperties.addAll(entry.getValue());
+				}
+			}
+			mapping2propertyAssignments = transformationAnalysis.getMapping2PropertyAssignments();
+			for (Set<PropertyAssignment> propertyAssignments : mapping2propertyAssignments.values()) {
+				for (PropertyAssignment propertyAssignment : propertyAssignments) {
+					Property property = propertyAssignment.getTargetProperty();
+					Set<PropertyAssignment> assignments = property2propertyAssignments.get(property);
+					if (assignments == null) {
+						assignments = new HashSet<PropertyAssignment>();
+						property2propertyAssignments.put(property, assignments);
+					}
+					assignments.add(propertyAssignment);
+				}
+			}
+		}
+
+		public boolean hasHazardousRead(@NonNull MappingCall mappingCall) {
+			for (MappingCallBinding callBinding : mappingCall.getBinding()) {
+				if (callBinding.isIsPolled()) {
+					return true;
+				}
+			}
+			return false;
+		}
+
+		public boolean hasHazardousWrite(@NonNull MappingCall mappingCall) {
+			Mapping mapping = mappingCall.getReferredMapping();
+			Set<PropertyAssignment> propertyAssignments = mapping2propertyAssignments.get(mapping);
+			if (propertyAssignments == null) {
+				return false;
+			}
+			for (PropertyAssignment propertyAssignment : propertyAssignments) {
+				Property assignedProperty = propertyAssignment.getTargetProperty();
+				if (hazardousProperties.contains(assignedProperty)) {
+					return true;
+				}
+			}
+			return false;
+		}
+
+		public boolean isAssigned(@NonNull Property targetProperty, @NonNull DomainUsage domainUsage) {
+			Set<PropertyAssignment> propertyAssignments = property2propertyAssignments.get(targetProperty);
+			if (propertyAssignments == null) {
+				return false;
+			}
+			for (PropertyAssignment propertyAssignment : propertyAssignments) {
+				OCLExpression slotExpression = propertyAssignment.getSlotExpression();
+				DomainUsage slotUsage = transformationAnalysis.getDomainUsageAnalysis().getUsage(slotExpression);
+				if (domainUsage == slotUsage) {
+					return true;
+				}
+			}
+			return false;
+		}
+
+		public boolean isHazardous(@NonNull Property targetProperty) {
+			return hazardousProperties.contains(targetProperty);
+		}
+
 	}
 	
-	protected @NonNull AttributeStatus getAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) {
-		//
-		//	Return a pre-existing AttributeStatus
-		//
-		for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
-			if (attributeStatus.getEFeature() == eFeature) {
-				return attributeStatus;
+	/**
+	 * MappingInvocations manages the potentially repested mapping invocations, ensuring that repetitions are suppressed. 
+	 */
+	private static class MappingInvocations
+	{
+		protected final @NonNull EvaluationStatusManager statusManager;
+		
+		private final @NonNull Map<Integer, List<MappingStatus>> map = new HashMap<Integer, List<MappingStatus>>();
+		
+		public MappingInvocations(@NonNull EvaluationStatusManager statusManager) {
+			this.statusManager = statusManager;
+		}
+
+		/**
+		 * Return a new MappingStatus if mappingCall and boundValues represent a new mapping invocation.
+		 * Return null if they represent a repeated invocation.
+		 */
+		public @Nullable MappingStatus createUnrepeatedMappingStatus(@NonNull MappingCall mappingCall, @NonNull List<Object> boundValues) {
+			Mapping referredMapping = mappingCall.getReferredMapping();
+			int newHashCode = referredMapping.hashCode();
+			for (Object boundValue : boundValues) {
+				newHashCode = 3 * newHashCode + (boundValue != null ? boundValue.hashCode() : null);
+			}
+			List<MappingStatus> mappingStatuses = map.get(newHashCode);
+			if (mappingStatuses != null) {
+				for (MappingStatus oldMappingStatus : mappingStatuses) {
+					if (oldMappingStatus.getReferredMappingCall() == referredMapping) {
+						List<Object> oldValues = oldMappingStatus.getBoundValues();
+						if (oldValues.equals(boundValues)) {
+							return null;
+						}
+					}
+				}
+			}
+			else {
+				mappingStatuses = new ArrayList<MappingStatus>();
+				map.put(newHashCode, mappingStatuses);
+			}
+			MappingStatus newMappingStatus = statusManager.createMappingStatus(mappingCall, boundValues);
+			mappingStatuses.add(newMappingStatus);
+			return newMappingStatus;
+		}
+	}
+	
+	/**
+	 * PendingInvocations manges the Mapping invocations that are initially blockeed as a result of a failure to excute
+	 * and then unblocked once the problme is resulved and theya rea ready for a re-invocation.
+	 */
+	private static class PendingInvocations
+	{
+		/**
+		 * Mapping invocations that failed due to a not-ready value that is still not-ready.
+		 */
+		private final @NonNull Set<MappingStatus> blockedMappingStatuses = new HashSet<MappingStatus>();
+		
+		/**
+		 * Non-null while mapping invocations that failed due to a not-ready value that is now ready.
+		 */
+		private @Nullable Set<MappingStatus> unblockedMappingStatuses = null;
+
+		public void block(@NonNull MappingStatus mappingStatus) {
+			assert !mappingStatus.isIsBlocked();
+			mappingStatus.setIsBlocked(true);
+			blockedMappingStatuses.add(mappingStatus);
+			Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
+			if (unblockedMappingStatuses2 != null) {
+				unblockedMappingStatuses2.remove(mappingStatus);
 			}
 		}
-		//
-		//	Create a new AttributeStatus
-		//
-		AttributeStatus attributeStatus = EvaluationStatusFactory.eINSTANCE.createAttributeStatus();
-		attributeStatus.setEFeature(eFeature);
-		classStatus.getOwnedAttributeStatuses().add(attributeStatus);
-		if (classStatus.isIsOutput()) {
-			attributeStatus.setIsAssignable(true);
-		}
-		else {
-			attributeStatus.setIsAssigned(true);
-		}
-		return attributeStatus;
-	}
 
-	protected @NonNull ClassStatus getClassStatus(@NonNull Usage usage, /*@NonNull*/ Type type, @NonNull EObject eObject) {
-		ClassStatus classStatus = object2ClassStatus.get(eObject);
-		if (classStatus == null) {
-			classStatus = createClassStatus(type, eObject);
-			if (usage != Usage.OUT) {
-				classStatus.setIsInput(true);
-			}
-			if (usage != Usage.IN) {
-				classStatus.setIsOutput(true);
+		public void flush(@NonNull QVTiIncrementalExecutor executor, @NonNull EvaluationVisitor undecoratedVisitor) {
+			while (unblockedMappingStatuses != null) {
+				List<MappingStatus> unblockingMappingStatuses = new ArrayList<MappingStatus>(unblockedMappingStatuses);
+				unblockedMappingStatuses = null;
+				for (@SuppressWarnings("null")@NonNull MappingStatus unblockingMappingStatus : unblockingMappingStatuses) {
+					executor.internalExecuteMappingCallRetry(unblockingMappingStatus, undecoratedVisitor);
+				}
 			}
 		}
-		return classStatus;
+
+		public void unblock(@NonNull MappingStatus mappingStatus) {
+			assert mappingStatus.isIsBlocked();
+			boolean didRemove = blockedMappingStatuses.remove(mappingStatus);
+			assert didRemove;
+			mappingStatus.setIsBlocked(false);
+			Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
+			if (unblockedMappingStatuses2 == null) {
+				unblockedMappingStatuses = unblockedMappingStatuses2 = new HashSet<MappingStatus>();
+			}
+			boolean didAdd = unblockedMappingStatuses2.add(mappingStatus);
+			assert didAdd;
+		}
+	}
+	
+	protected final @NonNull Mode mode;
+	protected final @NonNull PendingInvocations pendingInvocations = new PendingInvocations();
+	protected final @NonNull MappingAnalysis mappingAnalysis;
+	protected final @NonNull Stack<MappingStatus> mappingStatusStack = new Stack<MappingStatus>();
+	protected final @NonNull EvaluationStatusManager statusManager;
+	protected final @NonNull MappingInvocations mappingInvocations;
+	
+	public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI transformationURI, @NonNull Mode mode) throws IOException {
+		super(environmentFactory, transformationURI);
+		this.mode = mode;
+		QVTiTransformationAnalysis transformationAnalysis = getModelManager().getTransformationAnalysis();
+		this.mappingAnalysis = new MappingAnalysis(transformationAnalysis);
+		this.statusManager = new EvaluationStatusManager(mappingAnalysis);
+		this.mappingInvocations = new MappingInvocations(statusManager);
 	}
 
-	public String getEvaluationStatusGraph() {
-		GraphMLBuilder s = new GraphMLBuilder();
-		transformationStatus.accept(new EvaluationStatus2GraphVisitor(s));
-		return s.toString();
-	}
-
-	protected @Nullable MappingStatus getMappingStatus() {
+	protected @Nullable MappingStatus findMappingStatus() {
 		if (mappingStatusStack.isEmpty()) {
 			return null;
 		}
 		MappingStatus mappingStatus = mappingStatusStack.peek();
-		assert mappingStatus != null;
+//		assert mappingStatus != null;
 		return mappingStatus;
 	}
 	
-	protected @NonNull PropertyStatus getPropertyStatus(@NonNull Usage usage, @NonNull EObject thisObject, @NonNull Property property) {
-		EObject eFeature = property.getESObject();
-		ClassStatus classStatus = getClassStatus(usage, property.getOwningClass(), thisObject);
-		if (eFeature instanceof EReference) {
-			EReference eReference = (EReference)eFeature;
-			if (eReference.getEOpposite() != null) {
-				return getAssociationStatus(classStatus, thisObject, eReference);
-			}
-		}
-		if (eFeature instanceof EStructuralFeature) {
-			return getAttributeStatus(classStatus, (EStructuralFeature)eFeature);
-		}
-		else if (property.isIsImplicit()) {				// Workaround Bug 463966
-			throw new UnsupportedOperationException();
-		}
-		else {
-			throw new UnsupportedOperationException();
-		}
+	public @NonNull TransformationStatus getTransformationStatus() {
+		return statusManager.getTransformationStatus();
 	}
-
-	protected @NonNull Usage getUsageForMetamodelElement(@NonNull Element element) {
-/*		EObject eContainer = null;
-		ExpressionInOCL expressionInOCL = null;
-		EReference eFeature = null;
-		for (EObject eChild = element; (eContainer = eChild.eContainer()) != null; eChild = eContainer) {
-//			if (eContainer instanceof ExpressionInOCL) {
-//				expressionInOCL = (ExpressionInOCL)eContainer;
-//				eFeature = eChild.eContainmentFeature();
-//				break;
-//			}
-			if (eContainer instanceof Operation) {
-				DomainUsageAnalysis operationUsageAnalysis = usageAnalysis.analyzeOperation((Operation)eContainer);
-				QVTiEvaluationEnvironment evaluationEnvironment = getEvaluationEnvironment();
-				break;
-			}
-			if (eContainer instanceof Pattern) {
-				break;
-			}
-			if (eContainer instanceof Rule) {
-				break;
-			}
-			if (eContainer instanceof org.eclipse.ocl.pivot.Class) {
-				break;
-			}
-			if (eContainer instanceof org.eclipse.ocl.pivot.Package) {
-				break;
-			}
-		}
-		if (expressionInOCL != null) {
-			DomainUsage domainUsage1 = transformationAnalysis.get(element);
-			DomainUsage domainUsage3 = transformationAnalysis.get(expressionInOCL);
-			DomainUsage domainUsage2 = transformationAnalysis.get(eFeature);
-			
-		}
-		DomainUsage domainUsage = transformationAnalysis.get(element); */
-		DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(element);
-		if (domainUsage == null) {
-			return Usage.INOUT;
-		}
-		else if (!domainUsage.isEnforceable()) {
-			return Usage.IN;
-		}
-		else if (domainUsage.isCheckable()) {
-			return Usage.INOUT;
-		}
-		else {
-			return Usage.OUT;
-		}
-/*		org.eclipse.ocl.pivot.Package asPackage = PivotUtil.getContainingPackage(element);
-		if (!checkablePackages.contains(asPackage)) {
-			return Usage.OUT;
-		}
-		else if (!enforceablePackages.contains(asPackage)) {
-			return Usage.IN;
-		}
-		else {
-			return Usage.INOUT;
-		} */
-	}
-
-//	protected @NonNull Usage getUsageForTransformationElement(@NonNull Element element) {
-//		Domain domain = QVTimperativeUtil.getContainingDomain(element);
-//		return domain == null ? Usage.INOUT : Usage.OUT;
-//	}
-
+	
 	@Override
 	public @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull EvaluationVisitor undecoratedVisitor) {
-		MappingStatus mappingStatus = createMappingStatus(mappingCall);
-		mappingStatusStack.push(mappingStatus);
-		try {
-			return super.internalExecuteMappingCall(mappingCall, undecoratedVisitor);
+		List<Object> newBoundValues = new ArrayList<Object>();
+		for (MappingCallBinding binding : mappingCall.getBinding()) {
+			Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable());
+			Object valueOrValues = getValueOf(boundVariable);
+			newBoundValues.add(valueOrValues);
 		}
-		catch (NotReadyValueException e) {
-			if (!mappingStatus.isIsBlocked()) {
-				block(mappingStatus);
+		MappingStatus mappingStatus = null;
+		if (mappingCall.isIsInfinite()) {
+			mappingStatus = mappingInvocations.createUnrepeatedMappingStatus(mappingCall, newBoundValues);
+			if (mappingStatus == null) {
+				return false;
 			}
 		}
-		finally {
+		if ((mode != Mode.LAZY) || mappingAnalysis.hasHazardousRead(mappingCall) || mappingAnalysis.hasHazardousWrite(mappingCall)) {
+			mappingStatus = statusManager.createMappingStatus(mappingCall, newBoundValues);
+		}
+		mappingStatusStack.push(mappingStatus);
+		try {
+			Object returnStatus = super.internalExecuteMappingCall(mappingCall, undecoratedVisitor);
 			mappingStatusStack.pop();
+			pendingInvocations.flush(this, undecoratedVisitor);
+			return returnStatus;
 		}
-		if (unblockedMappingStatuses != null) {
-			flushUnblockedMappings(undecoratedVisitor);
+		catch (NotReadyValueException e) {
+			mappingStatusStack.pop();
+			if (mappingStatus == null) {			// If LAZY execution deferred creating the MappingStatus
+				mappingStatus = statusManager.createMappingStatus(mappingCall, newBoundValues);
+			}
+			if (!mappingStatus.isIsBlocked()) {
+				pendingInvocations.block(mappingStatus);
+			}
+			return false;
 		}
-		return null;
 	}
 
 	protected void internalExecuteMappingCallRetry(@NonNull MappingStatus mappingStatus, @NonNull EvaluationVisitor undecoratedVisitor) {
@@ -434,7 +666,7 @@
 		}
 		catch (NotReadyValueException e) {
 			if (!mappingStatus.isIsBlocked()) {
-				block(mappingStatus);
+				pendingInvocations.block(mappingStatus);
 			}
 		}
 		finally {
@@ -444,30 +676,34 @@
 
 	@Override
 	public @Nullable Object internalExecuteNavigationCallExp(@NonNull NavigationCallExp navigationCallExp, @NonNull Property referredProperty, @Nullable Object object) {
+		MappingStatus mappingStatus = findMappingStatus();
+		PropertyStatus propertyStatus = null;
+		if ((mappingStatus != null) && mappingAnalysis.isHazardous(referredProperty)) {
+			assert object != null;
+			OCLExpression source = navigationCallExp.getOwnedSource();
+			DomainUsage domainUsage = source != null ? getEvaluationEnvironment().getUsageFor(source) : null;
+			propertyStatus = statusManager.getPropertyStatus(domainUsage, (EObject)object, referredProperty);
+			List<ElementStatus> mappingInputs = mappingStatus.getInputs();
+			if (!mappingInputs.contains(propertyStatus)) {
+				mappingInputs.add(propertyStatus);
+			}
+			if (!propertyStatus.isIsAssigned()) {
+				Type type = referredProperty.getType();
+				if (!(type instanceof CollectionType) || (((CollectionType)type).getLowerValue().signum() > 0)) {
+					propertyStatus.setIsError(true);
+					throw new NotReadyValueException("Reading unassigned value");
+				}
+			}
+			propertyStatus.setIsAssignable(false);
+		}
 		Object propertyValue = super.internalExecuteNavigationCallExp(navigationCallExp, referredProperty, object);		// FIXME values
-		MappingStatus mappingStatus = getMappingStatus();
+		if (mode == Mode.LAZY) {
+			return propertyValue;
+		}
+//		MappingStatus mappingStatus = findMappingStatus();
 		if (mappingStatus == null) {
 			return propertyValue;
 		}
-		assert object != null;
-		Usage usage = getUsageForMetamodelElement(navigationCallExp);
-		PropertyStatus propertyStatus = getPropertyStatus(usage, (EObject)object, referredProperty);
-		if (usage == Usage.IN) {
-			propertyStatus.setIsAssignable(false);
-			propertyStatus.setIsAssigned(true);
-		}
-		List<ElementStatus> mappingInputs = mappingStatus.getInputs();
-		if (!mappingInputs.contains(propertyStatus)) {
-			mappingInputs.add(propertyStatus);
-		}
-		if (!propertyStatus.isIsAssigned()) {
-			Type type = referredProperty.getType();
-			if (!(type instanceof CollectionType) || (((CollectionType)type).getLowerValue().signum() > 0)) {
-				propertyStatus.setIsError(true);
-				throw new NotReadyValueException("Reading unassigned value");
-			}
-		}
-		propertyStatus.setIsAssignable(false);
 				
 			if (propertyStatus instanceof AttributeStatus) {
 				AttributeStatus attributeStatus = (AttributeStatus)propertyStatus;
@@ -508,13 +744,22 @@
 	@Override
 	public @Nullable Object internalExecutePropertyAssignment(@NonNull PropertyAssignment propertyAssignment, @NonNull Object object, @Nullable Object ecoreValue) {
 		Object propertyValue = super.internalExecutePropertyAssignment(propertyAssignment, object, ecoreValue);
-		Usage usage = getUsageForMetamodelElement(propertyAssignment);
 		Property targetProperty = propertyAssignment.getTargetProperty();
 		assert targetProperty != null;
-		PropertyStatus propertyStatus = getPropertyStatus(usage, (EObject)object, targetProperty);
-		MappingStatus mappingStatus = getMappingStatus();
-		assert mappingStatus !=  null;
-		mappingStatus.getOutputs().add(propertyStatus);
+		PropertyStatus propertyStatus;
+		if ((mode == Mode.LAZY) && !mappingAnalysis.isHazardous(targetProperty)) {
+			propertyStatus = statusManager.findPropertyStatus((EObject)object, targetProperty);
+			if (propertyStatus == null) {
+				return propertyValue;
+			}
+		}
+		else {
+			DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(propertyAssignment.getSlotExpression());
+			propertyStatus = statusManager.getPropertyStatus(domainUsage, (EObject)object, targetProperty);
+			MappingStatus mappingStatus = findMappingStatus();
+			assert mappingStatus !=  null;
+			mappingStatus.getOutputs().add(propertyStatus);
+		}
 		if (!propertyStatus.isIsAssignable()) {				// Pure input
 			propertyValue = new InvalidValueException("Illegal assignment");
 			propertyStatus.setIsError(true);
@@ -524,7 +769,7 @@
 			propertyStatus.setIsError(false);
 			for (MappingStatus targetMappingStatus : propertyStatus.getTargets()) {
 				if (targetMappingStatus.isIsBlocked()) {
-					unblock(targetMappingStatus);
+					pendingInvocations.unblock(targetMappingStatus);
 				}
 			}
 			if (propertyStatus instanceof AttributeStatus) {
@@ -537,7 +782,7 @@
 					if (!ClassUtil.safeEquals(propertyValue, oldValue)) {
 						for (MappingStatus targetMappingStatus : attributeStatus.getTargets()) {
 							targetMappingStatus.setIsDirty(true);
-							unblock(targetMappingStatus);
+							pendingInvocations.unblock(targetMappingStatus);
 						}
 					}
 				}
@@ -563,14 +808,13 @@
 		}
 		return propertyValue;
 	}
-
 	@Override
 	public @Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor) {
 		Object element = super.internalExecuteRealizedVariable(realizedVariable, undecoratedVisitor);
-		if (element != null) {
-			Usage usage = getUsageForMetamodelElement(realizedVariable);
-			ClassStatus classStatus = getClassStatus(usage, realizedVariable.getType(), (EObject)element);
-			MappingStatus mappingStatus = getMappingStatus();
+		if ((element != null) && (mode == Mode.INCREMENTAL)) {
+			DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(realizedVariable);
+			ClassStatus classStatus = statusManager.getClassStatus(domainUsage, realizedVariable.getType(), (EObject)element);
+			MappingStatus mappingStatus = findMappingStatus();
 			assert mappingStatus != null;
 			mappingStatus.getOutputs().add(classStatus);
 		}
@@ -580,70 +824,7 @@
 	@Override
 	public @Nullable Object internalExecuteTransformation(@NonNull Transformation transformation, @NonNull EvaluationVisitor undecoratedVisitor) {
 		Object returnStatus = super.internalExecuteTransformation(transformation, undecoratedVisitor);
-		flushUnblockedMappings(undecoratedVisitor);
+		pendingInvocations.flush(this, undecoratedVisitor);
 		return returnStatus;
 	}
-
-	public void printEvaluationStatus() {
-		System.out.println(transformationStatus.toString());
-	}
-	
-	/**
-	 * Re-execute the dirtyMappingStatuses resulting from property value changes, and transitively any
-	 * downstream mappingStatuses affected by the re-execution.
-	 */
-	public void repairDamage() {
-		Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
-		if (dirtyMappingStatuses2 != null) {
-			List<Set<MappingStatus>> depth2dirtyMappingStatuses = new ArrayList<Set<MappingStatus>>();
-			for (int cleanDepth = 0; cleanDepth < depth2dirtyMappingStatuses.size(); cleanDepth++) {
-				if (dirtyMappingStatuses2.size() > 0) {
-					allocateDirtyMappingStatuses(depth2dirtyMappingStatuses, dirtyMappingStatuses2);
-				}
-				Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(cleanDepth);
-				if (mappingStatuses != null) {
-//					for (MappingStatus mappingStatus : mappingStatuses) {
-//					}
-				}
-				depth2dirtyMappingStatuses.set(cleanDepth, null);
-			}
-			dirtyMappingStatuses = null;
-		}
-	}
-
-	protected void setNewValue(@NonNull PropertyStatus propertyStatus, @Nullable Object newValue) {
-		if (!propertyStatus.isIsDirty()) {
-			if (propertyStatus instanceof AttributeStatus) {
-				AttributeStatus attributeStatus = (AttributeStatus)propertyStatus;
-				Object oldValue = attributeStatus.getObject();
-				if (!ClassUtil.safeEquals(newValue, oldValue)) {
-					attributeStatus.setIsDirty(true);
-					attributeStatus.setObject(newValue);
-				}
-			}
-			else {
-			}
-			for (MappingStatus mappingStatus : propertyStatus.getTargets()) {
-				mappingStatus.setIsDirty(true);
-				Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
-				if (dirtyMappingStatuses2 == null) {
-					dirtyMappingStatuses = dirtyMappingStatuses2 = new HashSet<MappingStatus>();
-				}
-				dirtyMappingStatuses2.add(mappingStatus);
-			}
-		}
-	}
-
-	protected void unblock(@NonNull MappingStatus mappingStatus) {
-		assert mappingStatus.isIsBlocked();
-		boolean didRemove = blockedMappingStatuses.remove(mappingStatus);
-		assert didRemove;
-		mappingStatus.setIsBlocked(false);
-		Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
-		if (unblockedMappingStatuses2 == null) {
-			unblockedMappingStatuses = unblockedMappingStatuses2 = new HashSet<MappingStatus>();
-		}
-		boolean didAdd = unblockedMappingStatuses2.add(mappingStatus);
-		assert didAdd;
-	}
 }
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java
index f83ba32..2ff06b5 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java
@@ -63,7 +63,7 @@
 				OperationCallExp operationCallExp = (OperationCallExp)callingObject;
 				Operation referredOperation = operationCallExp.getReferredOperation();
 				if (referredOperation != null) {
-					usageAnalysis = usageAnalysis2 = getRootEvaluationEnvironment().getUsageAnalysis().getAnalysis(referredOperation);
+					usageAnalysis = usageAnalysis2 = getExecutor().getModelManager().getTransformationAnalysis().getDomainUsageAnalysis().getAnalysis(referredOperation);
 					// FIXME Surely we need to 'specialize' for the actual usage of callingObject
 				}
 			}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java
index bd600ec..42c081e 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java
@@ -20,7 +20,7 @@
 
 public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment implements QVTiEvaluationEnvironment
 {
-	private @Nullable QVTimperativeDomainUsageAnalysis usageAnalysis;
+//	private @Nullable QVTimperativeDomainUsageAnalysis usageAnalysis;
 
 	public QVTiRootEvaluationEnvironment(@NonNull QVTiExecutor executor, @NonNull Transformation executableObject) {
 		super(executor, executableObject);
@@ -42,9 +42,15 @@
 		assert executableObject2 != null;
 		return (Transformation) executableObject2;
 	}
-
+	
 	@Override
 	public @Nullable DomainUsage getUsageFor(@NonNull Element element) {
+		QVTimperativeDomainUsageAnalysis usageAnalysis = getExecutor().getModelManager().getTransformationAnalysis().getDomainUsageAnalysis();;
+		return usageAnalysis.getUsage(element);
+	}
+
+/*	@Override
+	public @Nullable DomainUsage getUsageFor(@NonNull Element element) {
 		QVTimperativeDomainUsageAnalysis usageAnalysis2 = usageAnalysis;
 		if (usageAnalysis2 == null) {
 			usageAnalysis2 = getUsageAnalysis();
@@ -59,5 +65,5 @@
 			usageAnalysis2.analyzeTransformation(getTransformation());
 		}
 		return usageAnalysis2;
-	}
+	} */
 }
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
index f550988..a80cc3b 100644
--- 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
@@ -27,6 +27,7 @@
 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.Type;
 import org.eclipse.ocl.pivot.ids.IdManager;
 import org.eclipse.ocl.pivot.ids.OperationId;
@@ -36,6 +37,8 @@
 import org.eclipse.qvtd.pivot.qvtbase.Transformation;
 import org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment;
 import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage;
+import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
+import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeDomainUsageAnalysis;
 
 /**
@@ -57,7 +60,6 @@
 	 */
 	private final @NonNull QVTimperativeDomainUsageAnalysis domainAnalysis;
 
-
 	/**
 	 *  Set of all types for which allInstances() is invoked.
 	 */
@@ -81,15 +83,27 @@
 	/**
 	 * Map from oppositePropertyCallExp to the cache index identifying the relevant un-navigable lookup cache.
 	 */
-	private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>();;
+	private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>();
 
 	/**
-	 * @deprecated Use EnvironmentFactoryInternal constructor
+	 * Map from operation to the properties that it may access.
 	 */
-	@Deprecated
-	public QVTiTransformationAnalysis(@NonNull MetamodelManagerInternal metamodelManager) {
-	    this(metamodelManager.getEnvironmentFactory());
-	}
+	private final @NonNull Map<Operation, Set<Property>> operation2property = new HashMap<Operation, Set<Property>>();
+
+	/**
+	 * Map from mapping to the properties that it may access.
+	 */
+	private final @NonNull Map<Mapping, Set<Property>> mapping2property = new HashMap<Mapping, Set<Property>>();
+
+	/**
+	 * Map from mapping to the properties that it may assign.
+	 */
+	private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments = new HashMap<Mapping, Set<PropertyAssignment>>();
+
+	/**
+	 * Mappings that have an isPolled input.
+	 */
+	private final @NonNull Set<Mapping> hazardousMappings = new HashSet<Mapping>();
 
 	public QVTiTransformationAnalysis(@NonNull EnvironmentFactoryInternal environmentFactory) {
 	    this.environmentFactory = environmentFactory;
@@ -111,8 +125,73 @@
 		}
 		return cacheIndex;
 	}
+	
+	private @NonNull Set<Property> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) {
+		Set<Property> accessedProperties = mapping2property.get(mapping);
+		if (accessedProperties != null) {
+			return accessedProperties;
+		}
+		accessedProperties = new HashSet<Property>();
+		mapping2property.put(mapping, accessedProperties);
+		analyzeTree(accessedProperties, mapping.eAllContents());
+		return accessedProperties;
+	}
+	
+	private @NonNull Set<PropertyAssignment> analyzeMappingPropertyAssignments(@NonNull Mapping mapping) {
+		Set<PropertyAssignment> assignedProperties = mapping2propertyAssignments.get(mapping);
+		if (assignedProperties == null) {
+			assignedProperties = new HashSet<PropertyAssignment>();
+			mapping2propertyAssignments.put(mapping, assignedProperties);
+		}
+		for (TreeIterator<EObject> treeIterator = mapping.eAllContents(); treeIterator.hasNext(); ) {
+			EObject eObject = treeIterator.next();
+			if (eObject instanceof PropertyAssignment) {
+				assignedProperties.add((PropertyAssignment) eObject);
+			}
+		}
+		return assignedProperties;
+	}
+
+	private @NonNull Set<Property> analyzeOperation(@NonNull Operation operation) {
+		Set<Property> operationProperties = operation2property.get(operation);
+		if (operationProperties != null) {
+			return operationProperties;
+		}
+		operationProperties = new HashSet<Property>();
+		operation2property.put(operation, operationProperties);
+		analyzeTree(operationProperties, operation.eAllContents());
+		return operationProperties;
+	}
+
+	protected void analyzeTree(@NonNull Set<Property> 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) {
+				Property referredProperty = ((PropertyCallExp)eObject).getReferredProperty();
+				if (referredProperty != null) {
+					properties.add(referredProperty);
+				}
+			}
+			else if (eObject instanceof OppositePropertyCallExp) {
+				Property referredOppositeProperty = ((OppositePropertyCallExp)eObject).getReferredProperty();
+				if (referredOppositeProperty != null) {
+					Property referredProperty = referredOppositeProperty.getOpposite();
+					if (referredProperty != null) {
+						properties.add(referredProperty);
+					}
+				}
+			}
+		}
+	}
 
 	public void analyzeTransformation(@NonNull Transformation transformation) {
+		domainAnalysis.analyzeTransformation(transformation);
 		transformation.accept(QVTiTuneUpVisitor.INSTANCE);
 		//
 		//	First pass
@@ -128,7 +207,18 @@
 		List<PropertyAssignment> propertyAssignments = new ArrayList<PropertyAssignment>();
 		for (TreeIterator<EObject> tit = transformation.eAllContents(); tit.hasNext(); ) {
 			EObject eObject = tit.next();
-			if (eObject instanceof OppositePropertyCallExp) {
+			if (eObject instanceof Mapping) {
+				analyzeMappingPropertyAccesses((Mapping)eObject);
+				analyzeMappingPropertyAssignments((Mapping)eObject);
+			}
+			else if (eObject instanceof MappingCallBinding) {
+				MappingCallBinding mappingCallBinding = (MappingCallBinding)eObject;
+				if (mappingCallBinding.isIsPolled()) {
+					Mapping mapping = mappingCallBinding.getMappingCall().getReferredMapping();
+					hazardousMappings.add(mapping);
+				}
+			}
+			else if (eObject instanceof OppositePropertyCallExp) {
 				OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject;
 				Property navigableProperty = oppositePropertyCallExp.getReferredProperty();
 				if (navigableProperty != null) {
@@ -192,7 +282,7 @@
 			}
 		}
 	}
-	
+
 	public @NonNull Set<org.eclipse.ocl.pivot.Class> getAllInstancesClasses() {
 		return allInstancesClasses;
 	}
@@ -212,6 +302,14 @@
 	public @NonNull Map<Property, Integer> getCaches() {
 		return property2cacheIndex;
 	}
+	
+	public @NonNull QVTimperativeDomainUsageAnalysis getDomainUsageAnalysis() {
+		return domainAnalysis;
+	}
+
+	public @NonNull Set<Mapping> getHazardousMappings() {
+		return hazardousMappings;
+	}
 
 	/**
 	 * Return a Map from each instanceClasses to the subset of instanceClasses that are transitive superClasses of the particular instanceClass.
@@ -238,6 +336,14 @@
 		return instancesClassAnalysis;
 	}
 
+	public @NonNull Map<Mapping, Set<Property>> getMapping2Property() {
+		return mapping2property;
+	}
+
+	public @NonNull Map<Mapping, Set<PropertyAssignment>> getMapping2PropertyAssignments() {
+		return mapping2propertyAssignments;
+	}
+
 	public @NonNull MetamodelManagerInternal getMetamodelManager() {
 		return environmentFactory.getMetamodelManager();
 	}
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 d35306b..b686e37 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
@@ -45,7 +45,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import cg.classescs2as_qvtp_qvtias;
+import cg._classescs2as_qvtp_qvtias.classescs2as_qvtp_qvtias;
 
 /**
  * @author asbh500
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias
index 8179e8c..f281522 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias
@@ -9,12 +9,8 @@
   <ownedImports importedNamespace="pivot:Model TargetLookup.ocl.oclas#/"/>
   <ownedPackages xmi:id="P." name="">
     <ownedClasses xsi:type="qvtb:Transformation" xmi:id="T..Source2Target_qvtp_qvtias" name="Source2Target_qvtp_qvtias">
-      <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.leftCS" name="leftCS" usedPackage="SourceMM1.ecore.oclas#P.source">
-        <ownedContext name="leftCS" type="pivot:Class http://www.eclipse.org/qvt/2015/QVTimperativeLibrary.oclas#T.qvtbaselibrary.Model"/>
-      </modelParameter>
-      <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.rightAS" name="rightAS" usedPackage="TargetMM1.ecore.oclas#P.target">
-        <ownedContext name="rightAS" type="pivot:Class http://www.eclipse.org/qvt/2015/QVTimperativeLibrary.oclas#T.qvtbaselibrary.Model"/>
-      </modelParameter>
+      <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.leftCS" name="leftCS" usedPackage="SourceMM1.ecore.oclas#P.source"/>
+      <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.rightAS" name="rightAS" usedPackage="TargetMM1.ecore.oclas#P.target"/>
       <rule xsi:type="qvti:Mapping" xmi:id="m..Source2Target_qvtp_qvtias.cSRoot_2_TRoot" name="cSRoot_2_TRoot">
         <domain xsi:type="qvtcb:CoreDomain" name="leftCS" isCheckable="true" isEnforceable="false" typedModel="#qT..Source2Target_qvtp_qvtias.leftCS">
           <guardPattern>
@@ -262,18 +258,7 @@
         </domain>
         <guardPattern/>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.0"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.TRoot.ownedA">
             <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.0" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.1" referredProperty="SourceMM1.ecore.oclas#p.source.SRoot.ownedX">
                 <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/>
@@ -282,17 +267,20 @@
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                     referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
                   <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true"
-                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.8/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.8/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
                 </ownedSource>
                 <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                     referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A"/>
               </ownedBody>
               <ownedIterators name="1_" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.OrderedSet.collect..T"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.TRoot.ownedA">
-            <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.0" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -328,27 +316,18 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+                referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
+              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/>
+            </value>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
                 <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/>
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1">
-            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
-              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -384,18 +363,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.2"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.leftCS.guard.x"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
             <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.2" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T">
               <ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.3" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY">
@@ -403,7 +371,7 @@
                 </ownedSource>
                 <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                   <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true"
-                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/>
+                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/>
                   <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                       referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y2"/>
                 </ownedBody>
@@ -412,17 +380,20 @@
               <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                     referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                  <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+                  <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
                 </ownedSource>
                 <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                     referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
               </ownedBody>
               <ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
-            <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.leftCS.guard.x"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -455,27 +426,18 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+                referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
+              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/>
+            </value>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
                 <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/>
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1">
-            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
-              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -508,18 +470,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.2"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.leftCS.guard.x"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
             <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.2" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T">
               <ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.3" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY">
@@ -527,7 +478,7 @@
                 </ownedSource>
                 <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                   <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true"
-                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/>
+                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/>
                   <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                       referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y2"/>
                 </ownedBody>
@@ -536,17 +487,20 @@
               <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                     referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                  <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+                  <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
                 </ownedSource>
                 <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                     referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
               </ownedBody>
               <ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
-            <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.leftCS.guard.x"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -570,27 +524,18 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+                referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
+              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/>
+            </value>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
                 <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/>
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1">
-            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
-              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -614,18 +559,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.5"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.leftCS.guard.x"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A1.ownsB">
             <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.5" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T">
               <ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.6" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY">
@@ -633,7 +567,7 @@
                 </ownedSource>
                 <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                   <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true"
-                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/>
+                      referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/>
                   <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                       referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y1"/>
                 </ownedBody>
@@ -642,17 +576,20 @@
               <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                     referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                  <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+                  <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
                 </ownedSource>
                 <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
                     referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
               </ownedBody>
               <ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A1.ownsB">
-            <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.5" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.leftCS.guard.x"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -669,18 +606,7 @@
         </domain>
         <guardPattern/>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1" name="_1" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.leftCS.guard.y1"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.B.ownsD">
             <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
@@ -690,10 +616,13 @@
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.B.ownsD">
-            <value xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.leftCS.guard.y1"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -710,27 +639,18 @@
         </domain>
         <guardPattern/>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+                referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
+              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/>
+            </value>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
                 <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/>
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._1">
-            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
-              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._0"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -747,18 +667,7 @@
         </domain>
         <guardPattern/>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1" name="_1" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.leftCS.guard.y2"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.C.ownsD">
             <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
@@ -768,10 +677,13 @@
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.C.ownsD">
-            <value xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.leftCS.guard.y2"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -788,27 +700,18 @@
         </domain>
         <guardPattern/>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+                referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
+              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/>
+            </value>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
               <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
                   referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
                 <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/>
               </ownedSource>
               <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._1">
-            <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
-              <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
-                referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._0"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -839,18 +742,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.leftCS.guard.z"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
             <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredProperty="TargetMM1.ecore.oclas#p.target.C.toA2">
               <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -869,10 +761,13 @@
                     referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
               </ownedSource>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.leftCS.guard.z"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -903,18 +798,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsC">
             <value xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="TargetLookup.ocl.oclas#o.target.D.lookupC..source.Z">
               <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -926,10 +810,13 @@
               </ownedSource>
               <ownedArguments xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsC">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -956,18 +843,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.leftCS.guard.z"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
             <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredProperty="TargetMM1.ecore.oclas#p.target.B.toA1">
               <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -986,10 +862,13 @@
                     referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
               </ownedSource>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.leftCS.guard.z"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -1016,18 +895,7 @@
           </predicate>
         </guardPattern>
         <bottomPattern>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-          <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0">
-            <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
-              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
-                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
-                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/>
-              </ownedSource>
-              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
-            </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1">
+          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsB">
             <value xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="TargetLookup.ocl.oclas#o.target.D.lookupB..source.Z">
               <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
                 <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -1039,10 +907,13 @@
               </ownedSource>
               <ownedArguments xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/>
             </value>
-          </assignment>
-          <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsB">
-            <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1"/>
-            <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0"/>
+            <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+              <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+                  referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+                <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/>
+              </ownedSource>
+              <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+            </slotExpression>
           </assignment>
         </bottomPattern>
       </rule>
@@ -1351,7 +1222,6 @@
           </mappingStatements>
         </mappingStatement>
       </rule>
-      <ownedContext name="this"/>
     </ownedClasses>
   </ownedPackages>
   <ownedPackages xmi:id="P.$$" name="$$" URI="http://www.eclipse.org/ocl/2015/Orphanage" nsPrefix="orphanage">
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java
similarity index 99%
rename from tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java
rename to tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java
index 399644b..e3f3be3 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg._Source2Target_qvtp_qvtias;
 
 import example1.source.PathElementCS;
 import example1.source.PathNameCS;
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java
similarity index 99%
rename from tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java
rename to tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java
index 6c32eae..618b88f 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg._classescs2as_qvtp_qvtias;
 
 import example2.classes.ClassesFactory;
 import example2.classes.ClassesPackage;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java
similarity index 99%
rename from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java
rename to tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java
index acc8518..71db8ee 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg._ManualUML2RDBMS;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java
similarity index 99%
rename from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java
rename to tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java
index da91ef1..b9c3fc1 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg._classescs2as;
 
 import classes.ClassesFactory;
 import classes.ClassesPackage;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java
similarity index 99%
rename from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java
rename to tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java
index 1bd49ef..1b80047 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg._classescs2as_Bug459225;
 
 import classes.ClassesFactory;
 import classes.ClassesPackage;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java
similarity index 99%
rename from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java
rename to tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java
index 0f155cc..b65d536 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg._hsv2hls;
 
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java
similarity index 99%
rename from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java
rename to tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java
index 8105203..92198e5 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java
@@ -7,7 +7,7 @@
  * Do not edit it.
  ********************************************************************************/
 
-package cg;
+package cg.test;
 
 import java.util.HashMap;
 import java.util.Iterator;
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 170aa7f..2ef9e56 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
@@ -41,8 +41,10 @@
 import org.eclipse.qvtd.pivot.qvtcorebase.QVTcoreBasePackage;
 import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EvaluationStatus2GraphVisitor;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
 import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphMLBuilder;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
 import org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase;
 import org.eclipse.qvtd.xtext.qvtbase.tests.utilities.TestsXMLUtil;
@@ -69,6 +71,10 @@
 			return new MyQvtiExecutor(getEnvironmentFactory(), fileNamePrefix, transformationFileName);
 		}
 
+		public @NonNull MyQvtiExecutor createEvaluator(@NonNull String fileNamePrefix, @NonNull String transformationFileName, @NonNull QVTiIncrementalExecutor.Mode mode) throws IOException {
+			return new MyQvtiExecutor(getEnvironmentFactory(), fileNamePrefix, transformationFileName, mode);
+		}
+
 		public @NonNull QVTiEnvironmentFactory getEnvironmentFactory() {
 			return (QVTiEnvironmentFactory) super.getEnvironmentFactory();
 		}
@@ -95,7 +101,10 @@
 		 * @throws IOException Signals that an I/O exception has occurred.
 		 */
 		public MyQvtiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull String fileNamePrefix, @NonNull String transformationFileName) throws IOException {
-			super(environmentFactory, getProjectFileURI(fileNamePrefix + "/"  + transformationFileName));
+			this(environmentFactory, fileNamePrefix, transformationFileName, QVTiIncrementalExecutor.Mode.INCREMENTAL);
+		}
+		public MyQvtiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull String fileNamePrefix, @NonNull String transformationFileName, @NonNull Mode mode) throws IOException {
+			super(environmentFactory, getProjectFileURI(fileNamePrefix + "/"  + transformationFileName), mode);
 			this.fileNamePrefix = fileNamePrefix + "/";
 		}
 		
@@ -172,11 +181,12 @@
 		        }
 	        }
 	        finally {
-		       	String s = getEvaluationStatusGraph();
+	        	GraphMLBuilder s = new GraphMLBuilder();
+	        	getTransformationStatus().accept(new EvaluationStatus2GraphVisitor(s));
 		    	File projectFile = getProjectFile();
-	    		File graphFile = new File(projectFile.toString() + "/" + fileNamePrefix + "EvaluationStatus.graphml");
+	    		File graphFile = new File(projectFile.toString() + "/" + fileNamePrefix + transformation.getName() + "_" + mode + ".graphml");
 	    		FileWriter writer = new FileWriter(graphFile);
-	    		writer.append(s);
+	    		writer.append(s.toString());
 	        	writer.close();
 	       }
 	    }
@@ -307,15 +317,34 @@
     }
 
     /**
-     * Test hsv 2 hls.
-     *
-     * @throws Exception the exception
+     * Test tree2talltree using the INCREMENTAL evaluator.
      */
     @Test
-    public void testTree2TallTree() throws Exception {
+    public void testTree2TallTreeIncremental() throws Exception {
     	MyQVT myQVT = createQVT();
     	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
-    	MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti");
+    	MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti", QVTiIncrementalExecutor.Mode.INCREMENTAL);
+    	testEvaluator.saveTransformation(null);
+    	testEvaluator.loadModel("tree", "Tree.xmi");
+        testEvaluator.createModel("tree2talltree", "Tree2TallTree.xmi");
+        testEvaluator.createModel("talltree", "TallTree.xmi");
+        testEvaluator.loadReference("talltree", "TallTreeValidate.xmi");
+        testEvaluator.test();
+        testEvaluator.dispose();
+        
+        URI txURI = ClassUtil.nonNullState(testEvaluator.getTransformation().eResource().getURI());
+        assertLoadable(txURI);
+        myQVT.dispose();
+    }
+
+    /**
+     * Test tree2talltree using the LAZY evaluator.
+     */
+    @Test
+    public void testTree2TallTreeLazy() throws Exception {
+    	MyQVT myQVT = createQVT();
+    	myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
+    	MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti", QVTiIncrementalExecutor.Mode.LAZY);
     	testEvaluator.saveTransformation(null);
     	testEvaluator.loadModel("tree", "Tree.xmi");
         testEvaluator.createModel("tree2talltree", "Tree2TallTree.xmi");
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
index 534e4e4..2e3985d 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
@@ -2,14 +2,14 @@
 import simpleuml : 'SimpleUML.ecore#/';
 import umltordbms : 'SimpleUML2RDBMS.ecore#/';
 
-transformation SimpleUML2RDBMS
+transformation test::SimpleUML2RDBMS
 {
 	uml imports simpleuml;
 	rdbms imports simplerdbms;
 	middle imports umltordbms;
 }
 
-map packageToSchema_LM in SimpleUML2RDBMS
+map packageToSchema_LM in test::SimpleUML2RDBMS
 {
 	check uml(p : Package) {}
 	enforce middle() {
@@ -21,7 +21,7 @@
 	}
 }
 
-map packageToSchema_MR in SimpleUML2RDBMS
+map packageToSchema_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms() {
 		realize s : Schema
@@ -33,7 +33,7 @@
 	}
 }
 
-map integerToNumber_LM in SimpleUML2RDBMS
+map integerToNumber_LM in test::SimpleUML2RDBMS
 {
 	check uml(p : Package,
 		prim : PrimitiveDataType) {}
@@ -49,7 +49,7 @@
 	}
 }
 
-map integerToNumber_MR in SimpleUML2RDBMS
+map integerToNumber_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms() {}
 	check middle(p2s : PackageToSchema,
@@ -61,7 +61,7 @@
 	}
 }
 
-map booleanToBoolean_MR in SimpleUML2RDBMS
+map booleanToBoolean_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms() {}
 	check middle(p2s : PackageToSchema,
@@ -74,7 +74,7 @@
 	}
 }
 
-map booleanToBoolean_LM in SimpleUML2RDBMS
+map booleanToBoolean_LM in test::SimpleUML2RDBMS
 {
 	check uml(p : Package,
 		prim : PrimitiveDataType) {}
@@ -90,7 +90,7 @@
 	}
 }
 
-map stringToVarchar_MR in SimpleUML2RDBMS
+map stringToVarchar_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms() {}
 	check middle(p2s : PackageToSchema,
@@ -102,7 +102,7 @@
 	}
 }
 
-map stringToVarchar_LM in SimpleUML2RDBMS
+map stringToVarchar_LM in test::SimpleUML2RDBMS
 {
 	check uml(p : Package,
 		prim : PrimitiveDataType) {}
@@ -118,7 +118,7 @@
 	}
 }
 
-map classToTable_MR in SimpleUML2RDBMS
+map classToTable_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms(s : Schema) {
 		realize t : Table,
@@ -146,7 +146,7 @@
 	}
 }
 
-map classToTable_LM in SimpleUML2RDBMS
+map classToTable_LM in test::SimpleUML2RDBMS
 {
 	check uml(p : Package,
 		c : Class) {}
@@ -162,7 +162,7 @@
 	}
 }
 
-map associationToForeignKey_MR in SimpleUML2RDBMS
+map associationToForeignKey_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms(s : Schema,
 		st : Table,
@@ -196,7 +196,7 @@
 	}
 }
 
-map associationToForeignKey_LM in SimpleUML2RDBMS
+map associationToForeignKey_LM in test::SimpleUML2RDBMS
 {
 	check uml(p : Package,
 		sc : Class,
@@ -237,7 +237,7 @@
 	}
 }
 
-map classPrimitiveAttributes_LM in SimpleUML2RDBMS
+map classPrimitiveAttributes_LM in test::SimpleUML2RDBMS
 {
 	check uml(t : PrimitiveDataType,
 		c : Class,
@@ -262,7 +262,7 @@
 	}
 }
 
-map classComplexAttributes_LM in SimpleUML2RDBMS
+map classComplexAttributes_LM in test::SimpleUML2RDBMS
 {
 	check uml(t : Class,
 		c : Class,
@@ -283,7 +283,7 @@
 	}
 }
 
-map complexAttributePrimitiveAttributes_LM in SimpleUML2RDBMS
+map complexAttributePrimitiveAttributes_LM in test::SimpleUML2RDBMS
 {
 	check uml(ca : Attribute,
 		c : Class,
@@ -311,7 +311,7 @@
 	}
 }
 
-map complexAttributeComplexAttributes_LM in SimpleUML2RDBMS
+map complexAttributeComplexAttributes_LM in test::SimpleUML2RDBMS
 {
 	check uml(ca : Attribute,
 		c : Class,
@@ -336,7 +336,7 @@
 	}
 }
 
-map attributeColumns_MR in SimpleUML2RDBMS
+map attributeColumns_MR in test::SimpleUML2RDBMS
 {
 	enforce rdbms(t : Table,
 		ct : String) {
@@ -358,7 +358,7 @@
 	}
 }
 
-map __root__ in SimpleUML2RDBMS
+map __root__ in test::SimpleUML2RDBMS
 {
 	where () {}
 	for p : simpleuml::Package in uml.objectsOfKind(Package) {