[514590] Suppress abstract region merging
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java
index f3b21cc..e89c7e4 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java
@@ -23,6 +23,7 @@
 import org.eclipse.ocl.pivot.Property;
 import org.eclipse.ocl.pivot.utilities.ClassUtil;
 import org.eclipse.qvtd.compiler.internal.qvtm2qvts.RegionUtil;
+import org.eclipse.qvtd.pivot.qvtschedule.BasicMappingRegion;
 import org.eclipse.qvtd.pivot.qvtschedule.Edge;
 import org.eclipse.qvtd.pivot.qvtschedule.MappingRegion;
 import org.eclipse.qvtd.pivot.qvtschedule.NavigableEdge;
@@ -35,6 +36,16 @@
 class Correlator
 {
 	public static @Nullable Correlator correlate(@NonNull MappingRegion secondaryRegion, @NonNull MappingRegion primaryRegion, @NonNull CorrelationStrategy strategy, @Nullable Map<@NonNull Node, @NonNull Node> primaryNode2secondaryNode) {
+		if (secondaryRegion instanceof BasicMappingRegion) {
+			if (((BasicMappingRegion)secondaryRegion).getReferredMapping().isIsAbstract()) {
+				return null;
+			}
+		}
+		if (primaryRegion instanceof BasicMappingRegion) {
+			if (((BasicMappingRegion)primaryRegion).getReferredMapping().isIsAbstract()) {
+				return null;
+			}
+		}
 		Correlator correlator = new Correlator(primaryRegion, secondaryRegion, strategy, primaryNode2secondaryNode);
 		return correlator.correlate() ? correlator : null;
 	}
@@ -225,25 +236,34 @@
 		Node secondaryHeadNode = secondaryHeadNodes.get(0);
 		CompleteClass completeClass = secondaryHeadNode.getCompleteClass();
 		List<@NonNull Node> primaryNodes = completeClass2primaryNodes.get(completeClass);
-		if (primaryNodes == null) {
+		if ((primaryNodes == null) || (primaryNodes.size() == 0)) {
 			if (debugFailures) {
 				AbstractMerger.FAILURE.println("No primary nodes of type: " + completeClass);
 			}
 			return false;
 		}
 		Node primaryHeadNode = secondaryNode2primaryNode.get(secondaryHeadNode);
-		if (primaryHeadNode != null) {
-			return true;
-		}
-		primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes);
 		if (primaryHeadNode == null) {
-			primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes);		// FIXME debugging
-			if (debugFailures) {
-				AbstractMerger.FAILURE.println("No primary head node to match: " + secondaryHeadNode);
+			primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes);
+			if (primaryHeadNode == null) {
+				primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes);		// FIXME debugging
+				if (debugFailures) {
+					AbstractMerger.FAILURE.println("No primary head node to match: " + secondaryHeadNode);
+				}
+				return false;
 			}
-			return false;
+			secondaryNode2primaryNode.put(secondaryHeadNode, primaryHeadNode);
 		}
-		secondaryNode2primaryNode.put(secondaryHeadNode, primaryHeadNode);
+		if (primaryNodes.size() > 1) {
+			for (@NonNull Node primaryNode : primaryNodes) {
+				if ((primaryNode != primaryHeadNode) && !primaryNode.isLoaded()) {
+					if (debugFailures) {		// FIXME multiple matching not-speculated might be ok
+						AbstractMerger.FAILURE.println("Multiple primary nodes of type: " + completeClass);
+					}
+					return false;
+				}
+			}
+		}
 		return true;
 	}
 
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java
index ce16f34..493c213 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java
@@ -438,6 +438,9 @@
 		}
 	}
 
+	/**
+	 * Return the lists of child regions that have consecutive indexes.
+	 */
 	protected @NonNull Iterable<@NonNull List<@NonNull MappingRegion>> selectConsecutiveRegionRuns(@NonNull NodeConnection nodeConnection) {
 		Map<@NonNull Integer, @NonNull MappingRegion> index2region = new HashMap<>();
 		for (@NonNull Region targetRegion : nodeConnection.getTargetRegions()) {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
index a000305..aa068f6 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
@@ -334,6 +334,7 @@
 		//		myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
 		try {
 			Class<? extends Transformer> txClassReverse = myQVT.buildTransformation("Forward2Reverse.qvtc", "forward", "List2List.genmodel");
+			//			Class<? extends Transformer> txClassReverse = Forward2Reverse.class;
 			myQVT.assertRegionCount(BasicMappingRegionImpl.class, 0);
 			myQVT.assertRegionCount(EarlyMerger.EarlyMergedMappingRegion.class, 0);
 			myQVT.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 0);
@@ -415,8 +416,8 @@
 			Class<? extends Transformer> txClass = myQVT.buildTransformation("HSV2HSL.qvtc", "hsl", "HSV2HSL.genmodel");
 			myQVT.assertRegionCount(BasicMappingRegionImpl.class, 1);
 			myQVT.assertRegionCount(EarlyMerger.EarlyMergedMappingRegion.class, 0);
-			myQVT.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 1);
-			myQVT.assertRegionCount(MicroMappingRegionImpl.class, 1);
+			myQVT.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 0);
+			myQVT.assertRegionCount(MicroMappingRegionImpl.class, 4);
 			//
 			myQVT.createGeneratedExecutor(txClass);
 			myQVT.loadInput("hsv", "SolarizedHSV.xmi");