diff --git a/org.eventb.texttools/src/org/eventb/texttools/Parser.java b/org.eventb.texttools/src/org/eventb/texttools/Parser.java
index a5f2eca8d376541785896f95789a03650426de87..c4b9b0c6afa3dbf4ac034f40aed1d76c191950f6 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/Parser.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/Parser.java
@@ -8,7 +8,6 @@ package org.eventb.texttools;
 
 import org.eclipse.jface.text.IDocument;
 import org.eventb.emf.core.EventBObject;
-import org.eventb.texttools.extensions.ExtendedEventB;
 import org.eventb.texttools.internal.parsing.TransformationVisitor;
 
 import de.be4.eventb.core.parser.BException;
@@ -22,13 +21,12 @@ import de.hhu.stups.sablecc.patch.SourcePositions;
 import de.hhu.stups.sablecc.patch.SourcecodeRange;
 
 public class Parser {
-	
+
 	private final Boolean allowSynatxExtensions = false;
-	
+
 	private final EventBParser parser = new EventBParser();
 	private final TransformationVisitor transformer = new TransformationVisitor();
-	
-	
+
 	/**
 	 * Parses the content of the given {@link IDocument}.
 	 * 
@@ -42,32 +40,20 @@ public class Parser {
 	 */
 	public <T extends EventBObject> T parse(final IDocument document)
 			throws ParseException {
-		
+
 		if (document == null) {
 			throw new IllegalArgumentException(
 					"Parser may not be called without input document");
 		}
 
-		
 		String input;
-		ExtendedEventB extendedEventB = null;
-		if (allowSynatxExtensions){
-			extendedEventB = ExtendedEventB.createFromInput(document.get());
-			input = extendedEventB.getPlainEventBCode();
-		}else{
-			input = document.get();
-		}
-		
+
+		input = document.get();
 
 		try {
 			final Start rootNode = parser.parse(input, false);
-			T transform = transformer.<T>transform(rootNode, document);
-			
-			if (allowSynatxExtensions && extendedEventB != null){
-				extendedEventB.assignElements((EventBObject)transform);
-				extendedEventB.runSyntaxExtensions();
-			}
-			
+			T transform = transformer.<T> transform(rootNode, document);
+
 			return transform;
 		} catch (final BException e) {
 			final Exception cause = e.getCause();
@@ -77,8 +63,8 @@ public class Parser {
 				final Token token = ex.getToken();
 
 				throw new ParseException(
-						adjustMessage(ex.getLocalizedMessage()), token
-								.getLine() - 1, token.getPos() - 1, token
+						adjustMessage(ex.getLocalizedMessage()),
+						token.getLine() - 1, token.getPos() - 1, token
 								.getText().length());
 			}
 			if (cause instanceof EventBLexerException) {
@@ -86,8 +72,8 @@ public class Parser {
 				final String lastText = ex.getLastText();
 
 				throw new ParseException(
-						adjustMessage(ex.getLocalizedMessage()), ex
-								.getLastLine() - 1, ex.getLastPos() - 1,
+						adjustMessage(ex.getLocalizedMessage()),
+						ex.getLastLine() - 1, ex.getLastPos() - 1,
 						lastText.length());
 			}
 
@@ -97,17 +83,18 @@ public class Parser {
 				final SourcePositions positions = parser.getSourcePositions();
 
 				if (range != null && positions != null) {
-					throw new ParseException(adjustMessage(ex
-							.getLocalizedMessage()), positions
-							.getBeginLine(range) - 1, positions
-							.getBeginColumn(range) - 1, positions
-							.getRangeString(range).length());
+					throw new ParseException(
+							adjustMessage(ex.getLocalizedMessage()),
+							positions.getBeginLine(range) - 1,
+							positions.getBeginColumn(range) - 1, positions
+									.getRangeString(range).length());
 				} else {
 					final Token token = ex.getToken();
 					if (token != null) {
-						throw new ParseException(adjustMessage(ex
-								.getLocalizedMessage()), token.getLine() - 1,
-								token.getPos() - 1, token.getText().length());
+						throw new ParseException(
+								adjustMessage(ex.getLocalizedMessage()),
+								token.getLine() - 1, token.getPos() - 1, token
+										.getText().length());
 					}
 				}
 			}
diff --git a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
index 92260bdcbeb5446a6b3263603ec54dbc53791d77..e4c2b968a7ec5f3dd1b291823d1b49c8510ba7da 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
@@ -32,12 +32,12 @@ import org.eventb.texttools.prettyprint.PrettyPrinter;
 public class PersistenceHelper {
 
 	public static final Boolean DEBUG = false;
-	
+
 	public static IResource getIResource(final Resource resource) {
 		final URI uri = resource.getURI();
 		if (uri.isPlatformResource()) {
-			return ResourcesPlugin.getWorkspace().getRoot().findMember(
-					uri.toPlatformString(true));
+			return ResourcesPlugin.getWorkspace().getRoot()
+					.findMember(uri.toPlatformString(true));
 		}
 
 		return null;
@@ -101,34 +101,35 @@ public class PersistenceHelper {
 		}
 		timeAttribute.setValue(timeStamp);
 	}
-	
-	
+
 	public static void addUsesAnnotation(final EventBElement element,
 			final String usesStatements) {
 		final EMap<String, Attribute> attributes = element.getAttributes();
-		Attribute usesAttribute = attributes.get(TextToolsPlugin.TYPE_USESEXTENSION.getId());
+		Attribute usesAttribute = attributes
+				.get(TextToolsPlugin.TYPE_USESEXTENSION.getId());
 		if (usesAttribute == null) {
 			usesAttribute = CoreFactory.eINSTANCE.createAttribute();
 			usesAttribute.setType(AttributeType.STRING);
 			attributes.put(TextToolsPlugin.TYPE_USESEXTENSION.getId(),
 					usesAttribute);
 		}
-		usesAttribute.setValue(usesStatements); 
+		usesAttribute.setValue(usesStatements);
 
 	}
-	
 
-	private static void mergeComponents(final EventBNamedCommentedComponentElement oldVersion,
-			final EventBNamedCommentedComponentElement newVersion, final IProgressMonitor monitor) {
+	private static void mergeComponents(
+			final EventBNamedCommentedComponentElement oldVersion,
+			final EventBNamedCommentedComponentElement newVersion,
+			final IProgressMonitor monitor) {
 		try {
 			long time0 = System.currentTimeMillis();
 			final ModelMerge merge = new ModelMerge(oldVersion, newVersion);
 			long time1 = System.currentTimeMillis();
 			merge.applyChanges(monitor);
 			long time2 = System.currentTimeMillis();
-			if (DEBUG){
-				System.out.println("new ModelMerge: " + (time1-time0));
-				System.out.println("merge.applyChanges: " + (time2-time1));
+			if (DEBUG) {
+				System.out.println("new ModelMerge: " + (time1 - time0));
+				System.out.println("merge.applyChanges: " + (time2 - time1));
 			}
 		} catch (final InterruptedException e) {
 			// TODO Auto-generated catch block
@@ -137,15 +138,17 @@ public class PersistenceHelper {
 	}
 
 	public static void mergeRootElement(final Resource resource,
-			final EventBNamedCommentedComponentElement newVersion, final IProgressMonitor monitor) {
+			final EventBNamedCommentedComponentElement newVersion,
+			final IProgressMonitor monitor) {
 		final EventBNamedCommentedComponentElement component = getComponent(resource);
 		if (component != null) {
 			// FIXME Hier stimmt die Reihenfolge noch
 			long start = System.currentTimeMillis();
 			mergeComponents(component, newVersion, monitor);
 			long end = System.currentTimeMillis();
-			if (DEBUG){
-				System.out.println("Time to merge components: "  + (end-start));
+			if (DEBUG) {
+				System.out
+						.println("Time to merge components: " + (end - start));
 			}
 			// Hier stimmt die Reihenfolge in component nicht mehr
 		} else {
@@ -212,9 +215,11 @@ public class PersistenceHelper {
 		return null;
 	}
 
-	private static EventBNamedCommentedComponentElement getComponent(final Resource resource) {
+	private static EventBNamedCommentedComponentElement getComponent(
+			final Resource resource) {
 		final EList<EObject> contents = resource.getContents();
-		if (contents.size() > 0 && contents.get(0) instanceof EventBNamedCommentedComponentElement) {
+		if (contents.size() > 0
+				&& contents.get(0) instanceof EventBNamedCommentedComponentElement) {
 			return (EventBNamedCommentedComponentElement) contents.get(0);
 		}
 
@@ -224,7 +229,7 @@ public class PersistenceHelper {
 	/**
 	 * Extracts the timestamp of the latest saved text representation from the
 	 * EMF and returns it.
-	 *
+	 * 
 	 * @param resource
 	 * @return timestamp or <code>-1</code> if none is found
 	 */
@@ -257,7 +262,7 @@ public class PersistenceHelper {
 	 * Checks if the text representation saved in the EMF is up-to-date. The
 	 * timestamps in the EMF and of the underlying file are compared for this
 	 * decision.
-	 *
+	 * 
 	 * @param resource
 	 * @return <code>true</code> if there was no external change and the text
 	 *         representation is still up-to-date
@@ -284,8 +289,10 @@ public class PersistenceHelper {
 				return true;
 			}
 		} catch (final CoreException e) {
-			TextToolsPlugin.getDefault().getLog().log(
-					new Status(IStatus.ERROR, TextToolsPlugin.PLUGIN_ID,
+			TextToolsPlugin
+					.getDefault()
+					.getLog()
+					.log(new Status(IStatus.ERROR, TextToolsPlugin.PLUGIN_ID,
 							"Error checking file timestamps", e));
 		}
 
diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/DefaultMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/DefaultMerger.java
deleted file mode 100644
index a9193d7577c4a6c8de8dd7c927deda8a2a42ebfc..0000000000000000000000000000000000000000
--- a/org.eventb.texttools/src/org/eventb/texttools/merge/DefaultMerger.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eventb.texttools.merge;
-
-import org.eclipse.emf.compare.diff.metamodel.DiffElement;
-import org.eclipse.emf.compare.diff.metamodel.DiffGroup;
-import org.eclipse.emf.compare.diff.metamodel.ModelElementChangeLeftTarget;
-import org.eclipse.emf.compare.diff.metamodel.ModelElementChangeRightTarget;
-import org.eclipse.emf.compare.diff.metamodel.ReferenceChange;
-import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeLeftTarget;
-import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeRightTarget;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EGenericType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EcorePackage;
-
-public class DefaultMerger extends
-		org.eclipse.emf.compare.diff.merge.DefaultMerger {
-
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.emf.compare.diff.merge.IMerger#applyInOrigin()
-	 */
-	public void applyInOrigin() {
-		handleMutuallyDerivedReferences();
-		removeFromContainer(diff);
-	}
-
-	/*
-	 * This function has been copied from emf-compare version 1.1.0M7 as a
-	 * bugfix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=288659
-	 */
-	private void handleMutuallyDerivedReferences() {
-		DiffElement toRemove = null;
-		if (diff instanceof ReferenceChange) {
-			final EReference reference = ((ReferenceChange) diff)
-					.getReference();
-			if (reference == EcorePackage.eINSTANCE.getEClass_ESuperTypes()) {
-				final EObject referenceType;
-				if (diff instanceof ReferenceChangeLeftTarget) {
-					referenceType = ((ReferenceChangeLeftTarget) diff)
-							.getRightTarget();
-				} else {
-					referenceType = ((ReferenceChangeRightTarget) diff)
-							.getLeftTarget();
-				}
-				for (final DiffElement siblingDiff : ((DiffGroup) diff
-						.eContainer()).getSubDiffElements()) {
-					if (siblingDiff instanceof ModelElementChangeLeftTarget) {
-						if (((ModelElementChangeLeftTarget) siblingDiff)
-								.getLeftElement() instanceof EGenericType
-								&& ((EGenericType) ((ModelElementChangeLeftTarget) siblingDiff)
-										.getLeftElement()).getEClassifier() == referenceType) {
-							toRemove = siblingDiff;
-							break;
-						}
-					} else if (siblingDiff instanceof ModelElementChangeRightTarget) {
-						if (((ModelElementChangeRightTarget) siblingDiff)
-								.getRightElement() instanceof EGenericType
-								&& ((EGenericType) ((ModelElementChangeRightTarget) siblingDiff)
-										.getRightElement()).getEClassifier() == referenceType) {
-							toRemove = siblingDiff;
-							break;
-						}
-					}
-				}
-			}
-		} else if (diff instanceof ModelElementChangeLeftTarget
-				&& ((ModelElementChangeLeftTarget) diff).getLeftElement() instanceof EGenericType) {
-			final ModelElementChangeLeftTarget theDiff = (ModelElementChangeLeftTarget) diff;
-			final EClassifier referenceType = ((EGenericType) theDiff
-					.getLeftElement()).getEClassifier();
-			for (final DiffElement siblingDiff : ((DiffGroup) diff.eContainer())
-					.getSubDiffElements()) {
-				if (siblingDiff instanceof ReferenceChangeLeftTarget
-						&& ((ReferenceChangeLeftTarget) siblingDiff)
-								.getReference().getFeatureID() == EcorePackage.ECLASS__ESUPER_TYPES) {
-					if (((ReferenceChangeLeftTarget) siblingDiff)
-							.getRightTarget() == referenceType) {
-						toRemove = siblingDiff;
-						break;
-					}
-				}
-			}
-		} else if (diff instanceof ModelElementChangeRightTarget
-				&& ((ModelElementChangeRightTarget) diff).getRightElement() instanceof EGenericType) {
-			final ModelElementChangeRightTarget theDiff = (ModelElementChangeRightTarget) diff;
-			final EClassifier referenceType = ((EGenericType) theDiff
-					.getRightElement()).getEClassifier();
-			for (final DiffElement siblingDiff : ((DiffGroup) diff.eContainer())
-					.getSubDiffElements()) {
-				if (siblingDiff instanceof ReferenceChangeRightTarget
-						&& ((ReferenceChangeRightTarget) siblingDiff)
-								.getReference().getFeatureID() == EcorePackage.ECLASS__ESUPER_TYPES) {
-					if (((ReferenceChangeRightTarget) siblingDiff)
-							.getLeftTarget() == referenceType) {
-						toRemove = siblingDiff;
-						break;
-					}
-				}
-			}
-		}
-		if (toRemove != null) {
-			removeFromContainer(toRemove);
-		}
-	}
-
-}
diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java
index eece51da676b2c463046324b2ad0db5a8f824ae3..5ee3d8c363b2c04f04bb0fbba2bf819998d760f6 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java
@@ -1,6 +1,7 @@
 package org.eventb.texttools.merge;
 
 import java.util.Iterator;
+import java.util.List;
 
 import org.eclipse.emf.compare.EMFComparePlugin;
 import org.eclipse.emf.compare.FactoryException;
@@ -24,6 +25,9 @@ public class ModelElementChangeRightTargetMerger extends DefaultMerger {
 		final ModelElementChangeRightTarget theDiff = (ModelElementChangeRightTarget) this.diff;
 		final EObject origin = theDiff.getLeftParent();
 		final EObject element = theDiff.getRightElement();
+		System.out.println("ModelElementChangeRightTargetMerger.applyInOrigin");
+		System.out.println("  element: " + element);
+		System.out.println("  origin: " + origin);
 
 		// Scenarios where we need to handle special:
 		// Machine sees Context
@@ -61,13 +65,26 @@ public class ModelElementChangeRightTargetMerger extends DefaultMerger {
 		final EReference ref = element.eContainmentFeature();
 		if (ref != null) {
 			try {
-				EFactory.eAdd(origin, ref.getName(), newOne);
+				int elementIndex = -1;
+				if (ref.isMany()) {
+					Object containmentRefVal = element.eContainer().eGet(ref);
+					if (containmentRefVal instanceof List) {
+						List listVal = (List) containmentRefVal;
+						elementIndex = listVal.indexOf(element);
+					}
+				}
+				EFactory.eAdd(origin, ref.getName(), newOne, elementIndex);
 				setXMIID(newOne, getXMIID(element));
 			} catch (final FactoryException e) {
 				EMFComparePlugin.log(e, true);
 			}
-		} else {
+		} else if (origin == null && getDiffModel().getLeftRoots().size() > 0) {
+			getDiffModel().getLeftRoots().get(0).eResource().getContents()
+					.add(newOne);
+		} else if (origin != null) {
 			origin.eResource().getContents().add(newOne);
+		} else {
+			// FIXME Throw exception : couldn't merge this
 		}
 		// we should now have a look for AddReferencesLinks needing this object
 		final Iterator<EObject> siblings = getDiffModel().eAllContents();
@@ -99,13 +116,14 @@ public class ModelElementChangeRightTargetMerger extends DefaultMerger {
 	 */
 	@Override
 	public void undoInTarget() {
-		final ModelElementChangeRightTarget theDiff = (ModelElementChangeRightTarget) this.diff;
-		final EObject element = theDiff.getRightElement();
-		final EObject parent = theDiff.getRightElement().eContainer();
-		EcoreUtil.remove(element);
-		// now removes all the dangling references
-		removeDanglingReferences(parent);
-		super.undoInTarget();
+		throw new RuntimeException();
+		// final ModelElementChangeRightTarget theDiff =
+		// (ModelElementChangeRightTarget) this.diff;
+		// final EObject element = theDiff.getRightElement();
+		// final EObject parent = theDiff.getRightElement().eContainer();
+		// EcoreUtil.remove(element);
+		// // now removes all the dangling references
+		// removeDanglingReferences(parent);
+		// super.undoInTarget();
 	}
-
 }
diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java
index afa99eb401e13938e598f1b3e5887845db7b53c5..772083ea8ac6c10566469f1b16a4dec19869acb4 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java
@@ -29,6 +29,7 @@ import org.eclipse.emf.compare.match.service.MatchService;
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
 import org.eventb.emf.core.Annotation;
@@ -94,8 +95,11 @@ public class ModelMerge {
 		final SubMonitor subMonitor = SubMonitor.convert(monitor,
 				"Analyzing model changes", 4);
 
+		// Fucking EMF and Eclipse reinventing the fucking wheel!!!
+		URI uri = URI.createURI(resource.getLocationURI().toString());
+		Resource resources = new ResourceImpl(uri);
 		final IMatchEngine matchEngine = MatchService
-				.getBestMatchEngine(resource.getFileExtension());
+				.getBestMatchEngine(resources);
 
 		// Workaround to make sure the models have an associated resource
 		// See setResourceFile() for Bug info
@@ -111,41 +115,41 @@ public class ModelMerge {
 			// setRodinResource(newVersion, extension, projectName);
 		}
 
-		matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR, subMonitor
-				.newChild(1));
-		
+		matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR,
+				subMonitor.newChild(1));
+
 		long timeStart = System.currentTimeMillis();
-		
+
 		final MatchModel matchModel = matchEngine.contentMatch(oldVersion,
 				newVersion, matchOptions);
-		
+
 		long timeMatch = System.currentTimeMillis();
-				
+
 		final DiffModel diff = getDiffModel(matchModel, subMonitor.newChild(2));
-		
+
 		long timeDiff = System.currentTimeMillis();
-				
+
 		final EList<DiffElement> ownedElements = diff.getOwnedElements();
-		
+
 		if (ownedElements.size() > 0) {
 			// MergeService
 			// .merge(new ArrayList<DiffElement>(ownedElements), false);
 			MergeService.merge(ownedElements, false);
 
-			matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR, subMonitor
-					.newChild(1));
+			matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR,
+					subMonitor.newChild(1));
 			subMonitor.worked(1);
 		}
 		long timeMerge = System.currentTimeMillis();
 
-		if (PersistenceHelper.DEBUG){
+		if (PersistenceHelper.DEBUG) {
 			System.out.println("*** applyChanges() ****");
-			System.out.println("  contentMatch: " + (timeMatch-timeStart));
-			System.out.println("  getDiffModel: " + (timeDiff-timeMatch));
-			System.out.println("         merge: " + (timeMerge-timeDiff));
+			System.out.println("  contentMatch: " + (timeMatch - timeStart));
+			System.out.println("  getDiffModel: " + (timeDiff - timeMatch));
+			System.out.println("         merge: " + (timeMerge - timeDiff));
 			System.out.println();
 		}
-		
+
 		// cleanup tmp files
 		EcoreUtil.remove(newVersion);
 		if (tmpFileNew != null) {
diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java
index 7765013fe0cb43ca5e4aa222294d38a3e863bea6..f7b59d751f9b3ef4b0333ffdc99268cff512e9ca 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java
@@ -5,10 +5,8 @@ import java.util.Iterator;
 import org.eclipse.emf.compare.EMFComparePlugin;
 import org.eclipse.emf.compare.FactoryException;
 import org.eclipse.emf.compare.diff.merge.DefaultMerger;
-import org.eclipse.emf.compare.diff.merge.service.MergeService;
 import org.eclipse.emf.compare.diff.metamodel.DiffElement;
 import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeLeftTarget;
-import org.eclipse.emf.compare.diff.metamodel.ReferenceOrderChange;
 import org.eclipse.emf.compare.diff.metamodel.ResourceDependencyChange;
 import org.eclipse.emf.compare.util.EFactory;
 import org.eclipse.emf.ecore.EObject;
@@ -28,6 +26,7 @@ import org.eclipse.emf.ecore.util.EcoreUtil;
  * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
  */
 public class ReferenceChangeLeftTargetMerger extends DefaultMerger {
+
 	/**
 	 * {@inheritDoc}
 	 * 
@@ -38,6 +37,10 @@ public class ReferenceChangeLeftTargetMerger extends DefaultMerger {
 		final ReferenceChangeLeftTarget theDiff = (ReferenceChangeLeftTarget) this.diff;
 		final EObject element = theDiff.getLeftElement();
 		final EObject leftTarget = theDiff.getRightTarget();
+		System.out.println("ReferenceChangeLeftTargetMerger.applyInOrigin");
+		System.out.println("  element: " + element);
+		System.out.println("  leftTarget: " + leftTarget);
+
 		try {
 			if (leftTarget != null) {
 				EFactory.eRemove(element, theDiff.getReference().getName(),
@@ -77,43 +80,49 @@ public class ReferenceChangeLeftTargetMerger extends DefaultMerger {
 		super.applyInOrigin();
 	}
 
+	@Override
+	public void undoInTarget() {
+		throw new RuntimeException();
+	}
+
 	/**
 	 * {@inheritDoc}
 	 * 
 	 * @see org.eclipse.emf.compare.diff.merge.DefaultMerger#undoInTarget()
 	 */
-	@Override
-	public void undoInTarget() {
-		final ReferenceChangeLeftTarget theDiff = (ReferenceChangeLeftTarget) this.diff;
-		final EObject element = theDiff.getRightElement();
-		final EObject leftTarget = theDiff.getRightTarget();
-		final EObject rightTarget = theDiff.getLeftTarget();
-		// FIXME respect ordering!
-		final EObject copiedValue = MergeService.getCopier(diff)
-				.copyReferenceValue(theDiff.getReference(), element,
-						leftTarget, rightTarget);
-
-		// we should now have a look for AddReferencesLinks needing this object
-		final Iterator<EObject> siblings = getDiffModel().eAllContents();
-		while (siblings.hasNext()) {
-			final DiffElement op = (DiffElement) siblings.next();
-			if (op instanceof ReferenceChangeLeftTarget) {
-				final ReferenceChangeLeftTarget link = (ReferenceChangeLeftTarget) op;
-				// now if I'm in the target References I should put my copy in
-				// the origin
-				if (link.getReference().equals(
-						theDiff.getReference().getEOpposite())
-						&& link.getLeftTarget().equals(element)) {
-					removeFromContainer(link);
-				}
-			} else if (op instanceof ReferenceOrderChange) {
-				final ReferenceOrderChange link = (ReferenceOrderChange) op;
-				if (link.getReference().equals(theDiff.getReference())) {
-					// FIXME respect ordering!
-					link.getRightTarget().add(copiedValue);
-				}
-			}
-		}
-		super.undoInTarget();
-	}
+	// @Override
+	// public void undoInTarget() {
+	// final ReferenceChangeLeftTarget theDiff = (ReferenceChangeLeftTarget)
+	// this.diff;
+	// final EObject element = theDiff.getRightElement();
+	// final EObject leftTarget = theDiff.getRightTarget();
+	// final EObject rightTarget = theDiff.getLeftTarget();
+	// // FIXME respect ordering!
+	// final EObject copiedValue = MergeService.getCopier(diff)
+	// .copyReferenceValue(theDiff.getReference(), element,
+	// leftTarget, rightTarget);
+	//
+	// // we should now have a look for AddReferencesLinks needing this object
+	// final Iterator<EObject> siblings = getDiffModel().eAllContents();
+	// while (siblings.hasNext()) {
+	// final DiffElement op = (DiffElement) siblings.next();
+	// if (op instanceof ReferenceChangeLeftTarget) {
+	// final ReferenceChangeLeftTarget link = (ReferenceChangeLeftTarget) op;
+	// // now if I'm in the target References I should put my copy in
+	// // the origin
+	// if (link.getReference().equals(
+	// theDiff.getReference().getEOpposite())
+	// && link.getLeftTarget().equals(element)) {
+	// removeFromContainer(link);
+	// }
+	// } else if (op instanceof ReferenceOrderChange) {
+	// final ReferenceOrderChange link = (ReferenceOrderChange) op;
+	// if (link.getReference().equals(theDiff.getReference())) {
+	// // FIXME respect ordering!
+	// link.getRightTarget().add(copiedValue);
+	// }
+	// }
+	// }
+	// super.undoInTarget();
+	// }
 }
diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java
index 9ecb28a30af0acac9156135be55eb442d80afdc4..b8010924e05e145f1a6347afd2d94e1881a7b6c1 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java
@@ -7,19 +7,15 @@
 package org.eventb.texttools.merge;
 
 import java.util.Iterator;
+import java.util.List;
 
-import org.eclipse.emf.compare.EMFComparePlugin;
-import org.eclipse.emf.compare.FactoryException;
 import org.eclipse.emf.compare.diff.merge.DefaultMerger;
 import org.eclipse.emf.compare.diff.merge.service.MergeService;
 import org.eclipse.emf.compare.diff.metamodel.DiffElement;
 import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeRightTarget;
 import org.eclipse.emf.compare.diff.metamodel.ReferenceOrderChange;
-import org.eclipse.emf.compare.diff.metamodel.ResourceDependencyChange;
-import org.eclipse.emf.compare.util.EFactory;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EReference;
 
 public class ReferenceChangeRightTargetMerger extends DefaultMerger {
 
@@ -29,22 +25,42 @@ public class ReferenceChangeRightTargetMerger extends DefaultMerger {
 		final EObject element = theDiff.getLeftElement();
 		final EObject leftTarget = theDiff.getLeftTarget();
 		final EObject rightTarget = theDiff.getRightTarget();
+		System.out.println("ReferenceChangeRightTargetMerger.applyInOrigin");
+		System.out.println("  element: " + element);
+		System.out.println("  leftTarget: " + leftTarget);
+		System.out.println("  rightTarget: " + rightTarget);
 
 		boolean applied = MergeUtil.rodinCopy(element, leftTarget, rightTarget);
+		System.out.println("  Applied: " + applied);
 
 		if (!applied)
 			originalApplyInOrigin();
 	}
 
-	public void originalApplyInOrigin() {
+	private void originalApplyInOrigin() {
 		final ReferenceChangeRightTarget theDiff = (ReferenceChangeRightTarget) this.diff;
 		final EObject element = theDiff.getLeftElement();
-		final EObject leftTarget = theDiff.getRightTarget();
-		final EObject rightTarget = theDiff.getLeftTarget();
+		// (mj) In the past, we had right and left toggled.
+		final EObject rightTarget = theDiff.getRightTarget();
+		final EObject leftTarget = theDiff.getLeftTarget();
+
 		// FIXME respect ordering!
+		EReference reference = theDiff.getReference();
+
+		// ordering handling:
+		int index = -1;
+		if (reference.isMany()) {
+
+			EObject rightElement = theDiff.getRightElement();
+			Object fightRefValue = rightElement.eGet(reference);
+			if (fightRefValue instanceof List) {
+				List refRightValueList = (List) fightRefValue;
+				index = refRightValueList.indexOf(rightTarget);
+			}
+		}
 		final EObject copiedValue = MergeService.getCopier(diff)
-				.copyReferenceValue(theDiff.getReference(), element,
-						rightTarget, leftTarget);
+				.copyReferenceValue(reference, element, rightTarget,
+						leftTarget, index);
 
 		// We'll now look through this reference's eOpposite as they are already
 		// taken care of
@@ -71,45 +87,52 @@ public class ReferenceChangeRightTargetMerger extends DefaultMerger {
 		super.applyInOrigin();
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.emf.compare.diff.merge.api.AbstractMerger#undoInTarget()
-	 */
 	@Override
 	public void undoInTarget() {
-		final ReferenceChangeRightTarget theDiff = (ReferenceChangeRightTarget) this.diff;
-		final EObject element = theDiff.getRightElement();
-		final EObject rightTarget = theDiff.getLeftTarget();
-		try {
-			EFactory.eRemove(element, theDiff.getReference().getName(),
-					rightTarget);
-		} catch (final FactoryException e) {
-			EMFComparePlugin.log(e, true);
-		}
-		// we should now have a look for AddReferencesLinks needing this object
-		final Iterator<EObject> related = getDiffModel().eAllContents();
-		while (related.hasNext()) {
-			final DiffElement op = (DiffElement) related.next();
-			if (op instanceof ReferenceChangeRightTarget) {
-				final ReferenceChangeRightTarget link = (ReferenceChangeRightTarget) op;
-				// now if I'm in the target References I should put my copy in
-				// the origin
-				if (link.getReference().equals(
-						theDiff.getReference().getEOpposite())
-						&& link.getLeftTarget().equals(element)) {
-					removeFromContainer(link);
-				}
-			} else if (op instanceof ResourceDependencyChange) {
-				final ResourceDependencyChange link = (ResourceDependencyChange) op;
-				final Resource res = link.getRoots().get(0).eResource();
-				if (res == rightTarget.eResource()) {
-					EcoreUtil.remove(link);
-					res.unload();
-				}
-			}
-		}
-		super.undoInTarget();
+		throw new RuntimeException();
 	}
 
+	// /**
+	// * {@inheritDoc}
+	// *
+	// * @see
+	// org.eclipse.emf.compare.diff.merge.api.AbstractMerger#undoInTarget()
+	// */
+	// @Override
+	// public void undoInTarget() {
+	// final ReferenceChangeRightTarget theDiff = (ReferenceChangeRightTarget)
+	// this.diff;
+	// final EObject element = theDiff.getRightElement();
+	// final EObject rightTarget = theDiff.getLeftTarget();
+	// try {
+	// EFactory.eRemove(element, theDiff.getReference().getName(),
+	// rightTarget);
+	// } catch (final FactoryException e) {
+	// EMFComparePlugin.log(e, true);
+	// }
+	// // we should now have a look for AddReferencesLinks needing this object
+	// final Iterator<EObject> related = getDiffModel().eAllContents();
+	// while (related.hasNext()) {
+	// final DiffElement op = (DiffElement) related.next();
+	// if (op instanceof ReferenceChangeRightTarget) {
+	// final ReferenceChangeRightTarget link = (ReferenceChangeRightTarget) op;
+	// // now if I'm in the target References I should put my copy in
+	// // the origin
+	// if (link.getReference().equals(
+	// theDiff.getReference().getEOpposite())
+	// && link.getLeftTarget().equals(element)) {
+	// removeFromContainer(link);
+	// }
+	// } else if (op instanceof ResourceDependencyChange) {
+	// final ResourceDependencyChange link = (ResourceDependencyChange) op;
+	// final Resource res = link.getRoots().get(0).eResource();
+	// if (res == rightTarget.eResource()) {
+	// EcoreUtil.remove(link);
+	// res.unload();
+	// }
+	// }
+	// }
+	// super.undoInTarget();
+	// }
+
 }
diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java
index 8200b69a2a9f9702241117cae0653a9d7b7a5e8c..96cf75f2562272b41a96dbea31860a7016d3d03f 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java
@@ -4,6 +4,7 @@ import java.util.List;
 
 import org.eclipse.emf.compare.EMFComparePlugin;
 import org.eclipse.emf.compare.FactoryException;
+import org.eclipse.emf.compare.diff.merge.DefaultMerger;
 import org.eclipse.emf.compare.diff.metamodel.ReferenceOrderChange;
 import org.eclipse.emf.compare.util.EFactory;
 import org.eclipse.emf.ecore.EObject;
@@ -24,14 +25,17 @@ public class ReferenceOrderChangeMerger extends DefaultMerger {
 		final ReferenceOrderChange theDiff = (ReferenceOrderChange) this.diff;
 		final EObject element = theDiff.getLeftElement();
 		final List<EObject> leftTarget = theDiff.getLeftTarget();
+		System.out.println("ReferenceOrderChangeMerger.applyInOrigin");
+		System.out.println("  element: " + element);
+		System.out.println("  leftTarget: " + leftTarget);
 
 		// (mj) START
 		if (leftTarget.size() == 0) {
 
 			// Handle Event Refinement changed
 			if (element instanceof Event
-					&& theDiff.getReference().getName().equals(
-							Constants.REFINES)) {
+					&& theDiff.getReference().getName()
+							.equals(Constants.REFINES)) {
 				Event leftEvent = (Event) element;
 				Event rightEvent = (Event) theDiff.getRightElement();
 				leftEvent.getRefines().clear();
@@ -44,15 +48,15 @@ public class ReferenceOrderChangeMerger extends DefaultMerger {
 					leftMachine.getRefines().clear();
 					leftMachine.getRefines().addAll(
 							EcoreUtil.copyAll(rightMachine.getRefines()));
-				} else if (theDiff.getReference().getName().equals(
-						Constants.SEES)) {
+				} else if (theDiff.getReference().getName()
+						.equals(Constants.SEES)) {
 					leftMachine.getSees().clear();
 					leftMachine.getSees().addAll(
 							EcoreUtil.copyAll(rightMachine.getSees()));
 				}
 			} else if (element instanceof Context
-					&& theDiff.getReference().getName().equals(
-							Constants.EXTENDS)) {
+					&& theDiff.getReference().getName()
+							.equals(Constants.EXTENDS)) {
 				Context leftContext = (Context) element;
 				Context rightContext = (Context) theDiff.getRightElement();
 				leftContext.getExtends().clear();
@@ -66,8 +70,7 @@ public class ReferenceOrderChangeMerger extends DefaultMerger {
 		// (mj) END
 
 		try {
-			EFactory
-					.eSet(element, theDiff.getReference().getName(), leftTarget);
+			EFactory.eSet(element, theDiff.getReference().getName(), leftTarget);
 		} catch (final FactoryException e) {
 			EMFComparePlugin.log(e, true);
 		}
@@ -81,16 +84,19 @@ public class ReferenceOrderChangeMerger extends DefaultMerger {
 	 */
 	@Override
 	public void undoInTarget() {
-		final ReferenceOrderChange theDiff = (ReferenceOrderChange) this.diff;
-		final EObject element = theDiff.getRightElement();
-		final List<EObject> rightTarget = theDiff.getRightTarget();
-		try {
-			EFactory.eSet(element, theDiff.getReference().getName(),
-					rightTarget);
-		} catch (final FactoryException e) {
-			EMFComparePlugin.log(e, true);
-		}
-		super.undoInTarget();
+		throw new RuntimeException();
+
+		// final ReferenceOrderChange theDiff = (ReferenceOrderChange)
+		// this.diff;
+		// final EObject element = theDiff.getRightElement();
+		// final List<EObject> rightTarget = theDiff.getRightTarget();
+		// try {
+		// EFactory.eSet(element, theDiff.getReference().getName(),
+		// rightTarget);
+		// } catch (final FactoryException e) {
+		// EMFComparePlugin.log(e, true);
+		// }
+		// super.undoInTarget();
 	}
 
 }
\ No newline at end of file