Allow preservation of previously set XMI IDs when using useIDs/removeIDs
diff --git a/plugins/org.eclipse.m2m.atl.drivers.emf4atl/src/org/eclipse/m2m/atl/drivers/emf4atl/EMFModelLoader.java b/plugins/org.eclipse.m2m.atl.drivers.emf4atl/src/org/eclipse/m2m/atl/drivers/emf4atl/EMFModelLoader.java
index 36ec2a9..9a9b262 100644
--- a/plugins/org.eclipse.m2m.atl.drivers.emf4atl/src/org/eclipse/m2m/atl/drivers/emf4atl/EMFModelLoader.java
+++ b/plugins/org.eclipse.m2m.atl.drivers.emf4atl/src/org/eclipse/m2m/atl/drivers/emf4atl/EMFModelLoader.java
@@ -307,19 +307,8 @@
 		if (href != null) {
 			r.setURI(URI.createURI(href));
 		}
-		
-		if(useIDs || removeIDs) {
-			XMIResource xr = (XMIResource)r;
-			int id = 1;
-			Set alreadySet = new HashSet();
-			for (Iterator i = r.getAllContents(); i.hasNext();) {
-				EObject eo = (EObject)i.next();
-				if (alreadySet.contains(eo)) {
-					continue; // because sometimes a single element gets processed twice
-				}
-				xr.setID(eo, removeIDs ? null : ("a" + (id++)));
-				alreadySet.add(eo);
-			}
+		if (r instanceof XMIResource) {
+			processIDs((XMIResource)r);
 		}
 		try {
 			r.save(saveOptions);
@@ -345,19 +334,8 @@
 	 */
 	public void save(ASMModel model, OutputStream out) throws IOException {
 		Resource r = ((ASMEMFModel)model).getExtent();
-		
-		if(useIDs || removeIDs) {
-			XMIResource xr = (XMIResource)r;
-			int id = 1;
-			Set alreadySet = new HashSet();
-			for (Iterator i = r.getAllContents(); i.hasNext();) {
-				EObject eo = (EObject)i.next();
-				if (alreadySet.contains(eo)) {
-					continue; // because sometimes a single element gets processed twice
-				}
-				xr.setID(eo, removeIDs ? null : ("a" + (id++)));
-				alreadySet.add(eo);
-			}
+		if (r instanceof XMIResource) {
+			processIDs((XMIResource)r);
 		}
 		try {
 			r.save(out, saveOptions);
@@ -368,6 +346,27 @@
 	}
 	
 	/**
+	 * Processes XMI IDs for xr
+	 * @param xr
+	 */
+	protected void processIDs(XMIResource xr) {
+		if (useIDs || removeIDs) {
+			int id = 1;
+			Set alreadySet = new HashSet();
+			for (Iterator i = xr.getAllContents(); i.hasNext();) {
+				EObject eo = (EObject)i.next();
+				if (alreadySet.contains(eo)) {
+					continue; // because sometimes a single element gets processed twice
+				}
+				String idStr = xr.getID(eo); // reuse existing IDs
+				String newId = removeIDs ? null : (idStr == null) ? "a" + (id++) : idStr;
+				xr.setID(eo, newId);
+				alreadySet.add(eo);
+			}
+		}
+	}
+	
+	/**
 	 * Adapts model if its metamodel is MOF, such that its NsURI is registered
 	 * and primitive datatypes are mapped to Java types.
 	 * @param model