Index: src/uk/me/parabola/mkgmap/filters/ShapeMergeFilter.java
===================================================================
--- src/uk/me/parabola/mkgmap/filters/ShapeMergeFilter.java	(revision 4740)
+++ src/uk/me/parabola/mkgmap/filters/ShapeMergeFilter.java	(working copy)
@@ -485,6 +485,9 @@
 		}
 		// now merge the shapes. The longest sequence of common points is removed.
 		// The remaining points are connected in the direction of the 1st shape.
+//		GpxCreator.createGpx("e:/ld/s1", points1);
+//		GpxCreator.createGpx("e:/ld/s2", points2);
+		
 		int remaining = s1Size + s2Size - 2*longestSequence -1;
 		if (remaining < 3) {
 			return Collections.emptyList(); // may happen with self-intersecting duplicated shapes
@@ -507,6 +510,22 @@
 			else if (s2Pos+1 >= s2Size)
 				s2Pos = 0;
 		}
+//		GpxCreator.createGpx("e:/ld/m", merged);
+		merged.forEach(Coord::resetHighwayCount);
+		merged.forEach(Coord::incHighwayCount);
+		merged.get(0).decHighwayCount();
+		if (merged.stream().anyMatch(p -> p.getHighwayCount() > 1)) {
+//			GpxCreator.createGpx("e:/ld/m1", merged);
+			merged = WrongAngleFixer.fixAnglesInShape(merged);
+//			GpxCreator.createGpx("e:/ld/m2", merged);
+			merged.forEach(Coord::resetHighwayCount);
+			merged.forEach(Coord::incHighwayCount);
+			merged.get(0).decHighwayCount();
+			if (merged.stream().anyMatch(p -> p.getHighwayCount() > 1)) {
+//				log.debug("merge rejected (self-intersection)",longestSequence, sh1PositionsToCheck, sh2PositionsToCheck);
+				return null; // self intersection
+			}
+		}
 		return merged;
 	}
  	
