[412341] Provide Multi-Resource ResourceRenamer
diff --git a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/GeneratePivotModel.mwe2 b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/GeneratePivotModel.mwe2
index f56a2e1..e5ebf6f 100644
--- a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/GeneratePivotModel.mwe2
+++ b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/GeneratePivotModel.mwe2
@@ -182,28 +182,37 @@
     }
 
 
+	bean = ResourceSetImpl : pivotRenameResourceSet {}
+    bean = ProjectMapSetup { resourceSet = pivotRenameResourceSet }
+    bean = UMLStandaloneSetup { resourceSet = pivotRenameResourceSet }
+    bean = OCLStandaloneSetup {}
+    bean = EcoreGenModelSetup { resourceSet = pivotRenameResourceSet }
+    component = ResourceRenamer { resourceSet = pivotRenameResourceSet skipOnErrors = true
+    	projectName = "${buildProjectName}"
+    	resourceRename = {
+    		from = "model-gen/RawPivot.ecore"
+    		to = "../${internalProjectName}/model/Pivot.ecore"
+    	}
+    }
+    //
+    //
+    //
 	bean = ResourceSetImpl : pivotMergeResourceSet {}
     bean = ProjectMapSetup { resourceSet = pivotMergeResourceSet }
     bean = UMLStandaloneSetup { resourceSet = pivotMergeResourceSet }
     bean = OCLStandaloneSetup {}
     bean = EcoreGenModelSetup { resourceSet = pivotMergeResourceSet }
+    component = ConstraintMerger { resourceSet = pivotMergeResourceSet skipOnErrors = true
+    	projectName = "${internalProjectName}"
+    	libraryURI = "http://www.eclipse.org/ocl/2015/Library"
+    	ecoreURI = "model/Pivot.ecore"
+    	oclURI = "model/Pivot.ocl"
+    	invariantPrefix = "validate"
+    }
     component = ResourceReader { resourceSet = pivotMergeResourceSet skipOnErrors = true
     	modelSlot = "${ecoreSlot}"
-    	uri = "/${buildProjectName}/model-gen/RawPivot.ecore"
-	}
-    component = ResourceRenamer { /*resourceSet = pivotGenerateResourceSet*/ skipOnErrors = true
-    	modelSlot = "${ecoreSlot}"
     	uri = "/${internalProjectName}/model/Pivot.ecore"
 	}
-    component = EConstraintRemover { skipOnErrors = true
-    	modelSlot = "${ecoreSlot}"
-    }
-    component = ConstraintMerger { resourceSet = pivotMergeResourceSet skipOnErrors = true
-    	projectName = "${internalProjectName}"
-    	modelSlot = "${ecoreSlot}"
-    	uri = "model/Pivot.ocl"
-    	invariantPrefix = "validate"
-    }
     component = EPackageAlphabetizer { skipOnErrors = true
     	modelSlot = "${ecoreSlot}"
     }
@@ -230,7 +239,6 @@
     bean = EcoreGenModelSetup { resourceSet = pivotGenerateResourceSet }
      component = GenmodelReloader { resourceSet = pivotGenerateResourceSet skipOnErrors = true
     	projectName = "${internalProjectName}"
-    	modelSlot = "xyzzy"
     	genModel = "/${internalProjectName}/model/Pivot.genmodel"
     	ecoreFile = "/${internalProjectName}/model/Pivot.ecore"
     }
diff --git a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/QuickGeneratePivotModel.mwe2 b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/QuickGeneratePivotModel.mwe2
index e800c1d..82172d7 100644
--- a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/QuickGeneratePivotModel.mwe2
+++ b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/QuickGeneratePivotModel.mwe2
@@ -21,7 +21,6 @@
 
 var buildProjectName = "org.eclipse.ocl.examples.build"
 var ecoreSlot = "ecore"
-var umlSlot = "uml"
 //var pivotProjectName = "org.eclipse.ocl.pivot"
 var internalProjectName = "org.eclipse.ocl.pivot"
 //var platformURI = ".."
@@ -34,107 +33,37 @@
 Workflow {
     bean = CompleteOCLStandaloneSetup {}
 
-	bean = ResourceSetImpl : uml2pivotResourceSet {}
-    bean = ProjectMapSetup { resourceSet = uml2pivotResourceSet }
-    bean = UMLStandaloneSetup { resourceSet = uml2pivotResourceSet }
+	bean = ResourceSetImpl : pivotRenameResourceSet {}
+    bean = ProjectMapSetup { resourceSet = pivotRenameResourceSet }
+    bean = UMLStandaloneSetup { resourceSet = pivotRenameResourceSet }
     bean = OCLStandaloneSetup {}
-//    bean = GenModelSetup { resourceSet = uml2pivotResourceSet }
-//    bean = UMLGenModelSetup { resourceSet = uml2pivotResourceSet }
-    bean = EcoreGenModelSetup { resourceSet = uml2pivotResourceSet }
-    component = ResourceReader { resourceSet = uml2pivotResourceSet skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    	uri = "/${buildProjectName}/model-gen/RawPivot.ecore"
-	}
-//    component = PackageMerger { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-    component = EPackageAlphabetizer { skipOnErrors = true
-    	modelSlot = "${umlSlot}"
+    bean = EcoreGenModelSetup { resourceSet = pivotRenameResourceSet }
+    component = ResourceRenamer { resourceSet = pivotRenameResourceSet skipOnErrors = true
+    	projectName = "${buildProjectName}"
+    	resourceRename = {
+    		from = "model-gen/RawPivot.ecore"
+    		to = "../${internalProjectName}/model/Pivot.ecore"
+    	}
     }
-    component = EConstraintRemover { skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    }
-//    component = NonAbstractTypeZapper { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-//    component = CommentNormalizer { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-//    component = UMLIDAssigner { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-    component = ResourceWriter { resourceSet = uml2pivotResourceSet skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    	uri = "/${internalProjectName}/model/Pivot.ecore"
-//		contentTypeIdentifier = "org.eclipse.uml2.uml_5_0_0" // UMLResource.UML_CONTENT_TYPE_IDENTIFIER
-    }
-     component = GenmodelReloader { resourceSet = uml2pivotResourceSet skipOnErrors = true
-    	projectName = "${internalProjectName}"
-    	modelSlot = "${ecoreSlot}"
-    	genModel = "/${internalProjectName}/model/Pivot.genmodel"
-    	ecoreFile = "/${internalProjectName}/model/Pivot.ecore"
-//    	modelImporter = "org.eclipse.uml2.uml.ecore.importer.UMLImporter"
-//    	modelImporter = "org.eclipse.ocl.examples.build.utilities.UMLImporterWithDelegates"	
-    }
-	bean = ResourceSetImpl : pivot2modelsResourceSet {}
-    bean = ProjectMapSetup { resourceSet = pivot2modelsResourceSet }
-    bean = UMLStandaloneSetup { resourceSet = pivot2modelsResourceSet }
+    //
+    //
+    //
+	bean = ResourceSetImpl : pivotMergeResourceSet {}
+    bean = ProjectMapSetup { resourceSet = pivotMergeResourceSet }
+    bean = UMLStandaloneSetup { resourceSet = pivotMergeResourceSet }
     bean = OCLStandaloneSetup {}
-//    bean = GenModelSetup { resourceSet = pivot2modelsResourceSet }
-//    bean = UMLGenModelSetup { resourceSet = pivot2modelsResourceSet }
-    bean = EcoreGenModelSetup { resourceSet = pivot2modelsResourceSet }
-    component = ResourceReader { resourceSet = pivot2modelsResourceSet skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    	uri = "/${buildProjectName}/model-gen/RawPivot.ecore"
-	}
-     component = ResourceReader { resourceSet = pivot2modelsResourceSet skipOnErrors = true
-    	modelSlot = "${ecoreSlot}"
-    	uri = "/${internalProjectName}/model/Pivot.ecore"
-    }
-    component = ConstraintMerger { resourceSet = pivot2modelsResourceSet skipOnErrors = true
+    bean = EcoreGenModelSetup { resourceSet = pivotMergeResourceSet }
+    component = ConstraintMerger { resourceSet = pivotMergeResourceSet skipOnErrors = true
     	projectName = "${internalProjectName}"
-    	modelSlot = "${ecoreSlot}"
-    	uri = "model/Pivot.ocl"
+    	libraryURI = "http://www.eclipse.org/ocl/2015/Library"
+    	ecoreURI = "model/Pivot.ecore"
+    	oclURI = "model/Pivot.ocl"
     	invariantPrefix = "validate"
     }
-    component = EPackageAlphabetizer { skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    }
-    component = EConstraintRemover { skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    }
-//    component = NonAbstractTypeZapper { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-//    component = CommentNormalizer { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-//    component = UMLIDAssigner { skipOnErrors = true
-//    	modelSlot = "${umlSlot}"
-//    }
-    component = ResourceWriter { resourceSet = pivot2modelsResourceSet skipOnErrors = true
-    	modelSlot = "${umlSlot}"
-    	uri = "/${internalProjectName}/model/Pivot.ecore"
-//		contentTypeIdentifier = "org.eclipse.uml2.uml_5_0_0" // UMLResource.UML_CONTENT_TYPE_IDENTIFIER
-    }
-     component = GenmodelReloader { resourceSet = pivot2modelsResourceSet skipOnErrors = true
-    	projectName = "${internalProjectName}"
-    	modelSlot = "${ecoreSlot}"
-    	genModel = "/${internalProjectName}/model/Pivot.genmodel"
-    	ecoreFile = "/${internalProjectName}/model/Pivot.ecore"
-//    	modelImporter = "org.eclipse.uml2.uml.ecore.importer.UMLImporter"
-//    	modelImporter = "org.eclipse.ocl.examples.build.utilities.UMLImporterWithDelegates"	
-    }
-     component = ResourceReader { resourceSet = pivot2modelsResourceSet skipOnErrors = true
+    component = ResourceReader { resourceSet = pivotMergeResourceSet skipOnErrors = true
     	modelSlot = "${ecoreSlot}"
     	uri = "/${internalProjectName}/model/Pivot.ecore"
-    }
-    component = ConstraintMerger { resourceSet = pivot2modelsResourceSet skipOnErrors = true
-    	projectName = "${internalProjectName}"
-    	modelSlot = "${ecoreSlot}"
-    	uri = "model/Pivot.ocl"
-    	invariantPrefix = "validate"
-    }
+	}
     component = EPackageAlphabetizer { skipOnErrors = true
     	modelSlot = "${ecoreSlot}"
     }
@@ -144,17 +73,28 @@
     component = SetASmetamodel { skipOnErrors = true
     	modelSlot = "${ecoreSlot}"
     }
-//    component = PivotWorkarounds { skipOnErrors = true
-//    	modelSlot = "${ecoreSlot}"
-//    }
-//    component = OCLDelegateActivator { skipOnErrors = true
-//    	modelSlot = "${pivotSlot}"
-//    }
-    component = ResourceWriter { resourceSet = pivot2modelsResourceSet skipOnErrors = true
+    component = StructuralENamedElementIdAssigner { skipOnErrors = true
     	modelSlot = "${ecoreSlot}"
     }
+    component = ResourceWriter { resourceSet = pivotMergeResourceSet skipOnErrors = true
+    	modelSlot = "${ecoreSlot}"
+    	uri = "/${internalProjectName}/model/Pivot.ecore"
+    }
+    //
+    //
+    //
+	bean = ResourceSetImpl : pivotGenerateResourceSet {}
+    bean = ProjectMapSetup { resourceSet = pivotGenerateResourceSet }
+    bean = UMLStandaloneSetup { resourceSet = pivotGenerateResourceSet }
+    bean = OCLStandaloneSetup {}
+    bean = EcoreGenModelSetup { resourceSet = pivotGenerateResourceSet }
+     component = GenmodelReloader { resourceSet = pivotGenerateResourceSet skipOnErrors = true
+    	projectName = "${internalProjectName}"
+    	genModel = "/${internalProjectName}/model/Pivot.genmodel"
+    	ecoreFile = "/${internalProjectName}/model/Pivot.ecore"
+    }
     
-    component = GenerateModel { resourceSet = pivot2modelsResourceSet skipOnErrors = true
+    component = GenerateModel { resourceSet = pivotGenerateResourceSet skipOnErrors = true
 //    	projectName = "${internalProjectName}"
     	genModel = "/${internalProjectName}/model/Pivot.genmodel"
 //    	clearResourceSet = false
diff --git a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/AbstractProjectComponent.java b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/AbstractProjectComponent.java
index a604ceb..e70c1a5 100644
--- a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/AbstractProjectComponent.java
+++ b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/AbstractProjectComponent.java
@@ -13,19 +13,18 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.mwe.core.issues.Issues;
-import org.eclipse.emf.mwe.core.lib.WorkflowComponentWithModelSlot;
+import org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.internal.resource.StandaloneProjectMap;
 
-public abstract class AbstractProjectComponent extends WorkflowComponentWithModelSlot
+public abstract class AbstractProjectComponent extends AbstractWorkflowComponent
 {
-	private ResourceSet resourceSet = null;	
+	private ResourceSet resourceSet = null;
 	private String projectName;
 
 	@Override
 	public void checkConfiguration(Issues issues) {
-		super.checkConfiguration(issues);
 		if (projectName == null) {
 			issues.addError(this, "projectName not specified.");
 		}
@@ -49,7 +48,7 @@
 	public void setProjectName(@NonNull String projectName) {
 		this.projectName = projectName;
 	}
-	
+
 	public void setResourceSet(@NonNull ResourceSet resourceSet) {
 		this.resourceSet = resourceSet;
 	}
diff --git a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ConstraintMerger.java b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ConstraintMerger.java
index 8c75383..151663d 100644
--- a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ConstraintMerger.java
+++ b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ConstraintMerger.java
@@ -25,6 +25,7 @@
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.mwe.core.WorkflowContext;
 import org.eclipse.emf.mwe.core.issues.Issues;
 import org.eclipse.emf.mwe.core.monitor.ProgressMonitor;
@@ -49,9 +50,12 @@
 import org.eclipse.ocl.pivot.model.OCLstdlib;
 import org.eclipse.ocl.pivot.resource.ASResource;
 import org.eclipse.ocl.pivot.resource.CSResource;
+import org.eclipse.ocl.pivot.resource.ProjectManager;
+import org.eclipse.ocl.pivot.resource.ProjectManager.IResourceDescriptor;
 import org.eclipse.ocl.pivot.utilities.ClassUtil;
 import org.eclipse.ocl.pivot.utilities.MetamodelManager;
 import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.XMIUtil;
 import org.eclipse.ocl.xtext.completeocl.CompleteOCLStandaloneSetup;
 
 import com.google.common.collect.Sets;
@@ -62,7 +66,9 @@
 public class ConstraintMerger extends AbstractProjectComponent
 {
 	private Logger log = Logger.getLogger(getClass());
-	protected String uri;
+	protected @NonNull List<@NonNull String> ecoreURIs = new ArrayList<>();
+	protected String libraryURI = null;
+	protected @NonNull List<@NonNull String> oclURIs = new ArrayList<>();
 	protected String invariantPrefix;
 
 	public ConstraintMerger() {
@@ -70,52 +76,81 @@
 		CompleteOCLStandaloneSetup.doSetup();
 	}
 
+	public void addEcoreURI(String ecoreURI) {
+		assert ecoreURI != null;
+		ecoreURIs.add(ecoreURI);
+	}
+
+	public void addOclURI(String oclURI) {
+		assert oclURI != null;
+		oclURIs.add(oclURI);
+	}
+
 	@Override
 	public void checkConfiguration(Issues issues) {
 		super.checkConfiguration(issues);
-		if (uri == null) {
-			issues.addError(this, "uri not specified.");
+		if (ecoreURIs.size() <= 0) {
+			issues.addError(this, "no ecoreURI specified.");
 		}
-	}
-
-	public String getUri() {
-		return uri;
+		if (oclURIs.size() <= 0) {
+			issues.addError(this, "no oclURI specified.");
+		}
 	}
 
 	@Override
 	public void invokeInternal(WorkflowContext ctx, ProgressMonitor arg1, Issues arg2) {
+		ResourceSet resourceSet = getResourceSet();
 		StandaloneProjectMap.IProjectDescriptor projectDescriptor = ClassUtil.nonNullState(getProjectDescriptor());
-		assert uri != null;
-		URI inputURI = projectDescriptor.getPlatformResourceURI(uri);
-		log.info("Merging '" + inputURI + "'");
-		Resource ecoreResource = (Resource) ctx.get(getModelSlot());
-		EPackage ecorePivotPackage = (EPackage) ecoreResource.getContents().get(0);
-		final String pivotNsURI = ClassUtil.nonNullState(ecorePivotPackage.getNsURI());
-		OCLInternal ocl = OCLInternal.newInstance();
+		//		Resource ecoreResource = (Resource) ctx.get(getModelSlot());
+		//		EPackage ecorePivotPackage = (EPackage) ecoreResource.getContents().get(0);
+		//		final String pivotNsURI = ClassUtil.nonNullState(ecorePivotPackage.getNsURI());
+		OCLInternal ocl = OCLInternal.newInstance(resourceSet);
 		EnvironmentFactoryInternal environmentFactory = ocl.getEnvironmentFactory();
 		MetamodelManagerInternal metamodelManager = ocl.getMetamodelManager();
 		ResourceSet asResourceSet = metamodelManager.getASResourceSet();
-		ocl.getResourceSet().getResources().add(ecoreResource);		// Don't load another copy
-		ocl.getStandardLibrary().setDefaultStandardLibraryURI(pivotNsURI);
-		StandardLibraryContribution.REGISTRY.put(pivotNsURI, new OCLstdlib.Loader());
-		for (EObject eObject : ecoreResource.getContents()) {
-			if (eObject instanceof EPackage) {
-				EPackage ePackage = (EPackage) eObject;
-				ClassUtil.getMetamodelAnnotation(ePackage); // Install EAnnotation
-			}
+		//		ocl.getResourceSet().getResources().add(ecoreResource);		// Don't load another copy
+		String libraryURI2 = libraryURI;
+		if (libraryURI2 != null) {
+			ocl.getStandardLibrary().setDefaultStandardLibraryURI(libraryURI2);
+			StandardLibraryContribution.REGISTRY.put(libraryURI2, new OCLstdlib.Loader());
 		}
-		Ecore2AS ecore2as = Ecore2AS.getAdapter(ecoreResource, ocl.getEnvironmentFactory());
-		Model pivotModel = ecore2as.getASModel();
-		ASResource asResource = ClassUtil.nonNullState((ASResource)pivotModel.eResource());
-		Set<@NonNull Resource> primaryASResources = Sets.newHashSet(asResource);
-		//FIXME		diagnoseErrors(asResource);
+
+
+		//
 		try {
-			CSResource csResource = ocl.getCSResource(inputURI);
+			for (@NonNull String ecoreURI : ecoreURIs) {
+				URI uri = projectDescriptor.getPlatformResourceURI(ecoreURI);
+				log.info("Loading " + uri);
+				Resource ecoreResource = resourceSet.getResource(uri, true);
+				EcoreUtil.resolveAll(ecoreResource);
+				ResourceUtils.checkResource(ecoreResource);
+				for (EObject eObject : ecoreResource.getContents()) {
+					if (eObject instanceof EPackage) {
+						EPackage ePackage = (EPackage) eObject;
+						ClassUtil.getMetamodelAnnotation(ePackage); // Install EAnnotation
+					}
+				}
+				Ecore2AS ecore2as = Ecore2AS.getAdapter(ecoreResource, environmentFactory);
+				Model pivotModel = ecore2as.getASModel();
+				ASResource asResource = ClassUtil.nonNullState((ASResource)pivotModel.eResource());
+				ResourceUtils.checkResource(asResource);
+			}
+			EcoreUtil.resolveAll(resourceSet);
+			ResourceUtils.checkResourceSet(resourceSet);
+			Set<@NonNull Resource> primaryASResources = Sets.newHashSet(ClassUtil.nullFree(asResourceSet.getResources()));
+			//
+			for (@NonNull String oclURI : oclURIs) {
+				URI uri = projectDescriptor.getPlatformResourceURI(oclURI);
+				log.info("Merging " + uri);
+				CSResource csResource = ocl.getCSResource(uri);
+				ResourceUtils.checkResourceSet(asResourceSet);
+				@SuppressWarnings("unused") Resource oclResource = csResource.getASResource();
+			}
 			ResourceUtils.checkResourceSet(asResourceSet);
-			@SuppressWarnings("unused") Resource oclResource = csResource.getASResource();
+			//
 			Set<@NonNull Resource> modifiedPrimaryASResources = new HashSet<>();
 			Map<@NonNull CompleteClass, @NonNull List<org.eclipse.ocl.pivot.Class>> completeClass2mergeTypes = new HashMap<>();
-			for (Resource secondaryASResource : metamodelManager.getASResourceSet().getResources()) {
+			for (Resource secondaryASResource : asResourceSet.getResources()) {
 				if (!primaryASResources.contains(secondaryASResource)) {
 					for (TreeIterator<EObject> tit = secondaryASResource.getAllContents(); tit.hasNext(); ) {
 						EObject eObject = tit.next();
@@ -162,14 +197,31 @@
 			Map<@NonNull String, @Nullable Object> options = new HashMap<>();
 			options.put(AS2Ecore.OPTION_SUPPRESS_DUPLICATES, true);
 			options.put(AS2Ecore.OPTION_INVARIANT_PREFIX, invariantPrefix);
+			ProjectManager projectManager = StandaloneProjectMap.findAdapter(resourceSet);
+			resourceSet.getResources().clear();
 			for (@NonNull Resource modifiedPrimaryASResource : modifiedPrimaryASResources) {
 				Model asModel = PivotUtil.getModel(modifiedPrimaryASResource);
 				String externalURI = asModel.getExternalURI();
 				URI ecoreURI = URI.createURI(externalURI);
-				Resource ecoreResource2 = AS2Ecore.createResource(environmentFactory, asResource, ecoreURI, options);
-				ctx.set(getModelSlot(), ecoreResource2);
-				projectDescriptor.configure(ecoreResource2.getResourceSet(), StandaloneProjectMap.LoadBothStrategy.INSTANCE, null);
-				ocl.getResourceSet().getResources().remove(ecoreResource2);
+				//				Resource oldEcoreResource = resourceSet.getResource(ecoreURI, false);
+				//				if (oldEcoreResource != null) {
+				//
+				//				}
+				if (projectManager != null) {
+					IResourceDescriptor resourceDescriptor = null;
+					resourceDescriptor = projectManager.getResourceDescriptor(ecoreURI);
+					if (resourceDescriptor != null) {
+						resourceDescriptor.unload(resourceSet);
+						resourceDescriptor.configure(resourceSet,
+							StandaloneProjectMap.CreateStrategy.INSTANCE,
+							StandaloneProjectMap.MapToFirstConflictHandlerWithLog.INSTANCE);
+					}
+				}
+				Resource newEcoreResource = AS2Ecore.createResource(environmentFactory, modifiedPrimaryASResource, ecoreURI, options);
+				//				projectDescriptor.configure(ecoreResource2.getResourceSet(), StandaloneProjectMap.LoadBothStrategy.INSTANCE, null);
+				XMIUtil.assignIds(newEcoreResource, new XMIUtil.StructuralENamedElementIdCreator(), null);
+				newEcoreResource.save(null); //getSaveOptions());
+				//				resourceSet.getResources().remove(ecoreResource2);
 			}
 			ocl.dispose();
 		} catch (IOException e) {
@@ -228,9 +280,9 @@
 		}
 	}
 
-	public void setUri(String uri) {
-		this.uri = uri;
-	}
+	//	public void setUri(String uri) {
+	//		this.uri = uri;
+	//	}
 
 	/**
 	 * Define a prefix such as "validate" for all invariant operation names.
@@ -238,4 +290,11 @@
 	public void setInvariantPrefix(String invariantPrefix) {
 		this.invariantPrefix = invariantPrefix;
 	}
+
+	/**
+	 * Define a URI to bw loade as the OCL Standard Library.
+	 */
+	public void setLibraryURI(String libraryURI) {
+		this.libraryURI = libraryURI;
+	}
 }
diff --git a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ResourceRenamer.java b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ResourceRenamer.java
index f8ab20b..ae7b981 100644
--- a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ResourceRenamer.java
+++ b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/utilities/ResourceRenamer.java
@@ -10,41 +10,89 @@
  *******************************************************************************/
 package org.eclipse.ocl.examples.build.utilities;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.log4j.Logger;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.mwe.core.WorkflowContext;
 import org.eclipse.emf.mwe.core.issues.Issues;
-import org.eclipse.emf.mwe.core.lib.WorkflowComponentWithModelSlot;
 import org.eclipse.emf.mwe.core.monitor.ProgressMonitor;
+import org.eclipse.emf.mwe.utils.Mapping;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.internal.resource.StandaloneProjectMap;
+import org.eclipse.ocl.pivot.utilities.ClassUtil;
+import org.eclipse.ocl.pivot.utilities.XMIUtil;
 
 /**
- * Renames a Resource in a designated <tt>modelSlot</tt> by changing its URI to a specified <tt>uri</tt> and
- * by registering the new URO with its ResourceSet so that references to the new URI resolve to the Resource.
+ * Renames a set of Resources as a group. All from Resources are loaded, then URIs are changed and saved.
  */
-public class ResourceRenamer extends WorkflowComponentWithModelSlot
+public class ResourceRenamer extends AbstractProjectComponent
 {
 	private Logger log = Logger.getLogger(getClass());
-	protected String uri;
+	private final @NonNull Map<@NonNull String, @NonNull String> resourceRenameMap = new HashMap<>();
 
-	public String getUri() {
-		return uri;
+	/**
+	 * Defines a package rename only from some package to another package.
+	 */
+	public void addResourceRename(Mapping mapping) {
+		String from = mapping.getFrom();
+		String to = mapping.getTo();
+		assert (from != null) && (to != null);
+		String oldTo = resourceRenameMap.put(from, to);
+		assert oldTo == null;
+	}
+
+	protected Map<?, ?> getSaveOptions() {
+		Map<Object, Object> result = XMIUtil.createSaveOptions();
+		result.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+		return result;
 	}
 
 	@Override
 	public void invokeInternal(WorkflowContext ctx, ProgressMonitor arg1, Issues arg2) {
-		URI fileURI = URI.createPlatformResourceURI(uri, true);
-		log.info("Renaming as '" + fileURI + "'");
-		Resource resource = (Resource) ctx.get(getModelSlot());
-		resource.setURI(fileURI);
-		Map<URI, Resource> uriResourceMap = ((ResourceSetImpl)resource.getResourceSet()).getURIResourceMap();
-		uriResourceMap.put(fileURI, resource);
-	}
-
-	public void setUri(String uri) {
-		this.uri = uri;
+		StandaloneProjectMap.IProjectDescriptor projectDescriptor = ClassUtil.nonNullState(getProjectDescriptor());
+		ResourceSet resourceSet = getResourceSet();
+		Map<@NonNull String, @NonNull Resource> from2resource = new HashMap<>();
+		List<@NonNull String> froms = new ArrayList<>(resourceRenameMap.keySet());
+		Collections.sort(froms);
+		for (@NonNull String from : froms) {
+			URI uri = projectDescriptor.getPlatformResourceURI(from);
+			Resource resource = resourceSet.getResource(uri, true);
+			assert resource != null;
+			EcoreUtil.resolveAll(resource);
+			ResourceUtils.checkResource(resource);
+			from2resource.put(from,  resource);
+		}
+		EcoreUtil.resolveAll(resourceSet);
+		ResourceUtils.checkResourceSet(resourceSet);
+		//
+		for (@NonNull String from : froms) {
+			Resource resource = from2resource.get(from);
+			assert resource != null;
+			String to = resourceRenameMap.get(from);
+			assert to != null;
+			URI uri = projectDescriptor.getPlatformResourceURI(to);
+			log.info("Renaming " + resource.getURI() + " as " + uri);
+			resource.setURI(uri);
+			XMIUtil.assignIds(resource, new XMIUtil.StructuralENamedElementIdCreator(), null);
+		}
+		//
+		try {
+			for (@NonNull String from : froms) {
+				Resource resource = from2resource.get(from);
+				assert resource != null;
+				resource.save(getSaveOptions());
+			}
+		} catch (IOException e) {
+			throw new RuntimeException("Problems running " + getClass().getSimpleName(), e);
+		}
 	}
 }