Index: src/uk/me/parabola/mkgmap/build/MapBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/build/MapBuilder.java	(revision 4689)
+++ src/uk/me/parabola/mkgmap/build/MapBuilder.java	(working copy)
@@ -1183,7 +1183,7 @@
 		// Maybe more efficient if merging before creating subdivisions.
 		if (mergeLines) {
 			LineMergeFilter merger = new LineMergeFilter();
-			lines = merger.merge(lines, res);
+			lines = merger.merge(lines, res, isOverviewCombined || config.getLevel() > 0);
 		}
 		
 		LayerFilterChain filters = new LayerFilterChain(config);
Index: src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java
===================================================================
--- src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java	(revision 4689)
+++ src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java	(working copy)
@@ -32,6 +32,7 @@
 	private final double filterDistance;
 	private double maxErrorDistance;
 	private int resolution;
+	private int level;
 
 	public DouglasPeuckerFilter(double filterDistance) {
 		this.filterDistance = filterDistance;
@@ -41,6 +42,7 @@
 	public void init(FilterConfig config) {
 		this.resolution = config.getResolution();
 		this.maxErrorDistance = filterDistance * (1<< config.getShift());
+		this.level = config.getLevel();
 	}
 
 	/**
@@ -54,7 +56,7 @@
 	public void doFilter(MapElement element, MapFilterChain next) {
 		// First off we don't touch things if at the highest level of detail
 		if (resolution == 24) {
-			// XXX 24 is not necessarily the highest level.
+			// Assume that WrongAngleFilter has already simplified as much as possible
 			next.doFilter(element);
 			return;
 		}
@@ -70,7 +72,7 @@
 		int endIndex = coords.size()-1;
 		for(int i = endIndex-1; i > 0; i--) {
 			Coord p = coords.get(i);
-			if (p.preserved()) {
+			if (/*level == 0 &&*/ p.preserved()) {
 				// point is "preserved", don't remove it
 				douglasPeucker(coords, i, endIndex, maxErrorDistance);
 				endIndex = i;
Index: src/uk/me/parabola/mkgmap/filters/LineMergeFilter.java
===================================================================
--- src/uk/me/parabola/mkgmap/filters/LineMergeFilter.java	(revision 4689)
+++ src/uk/me/parabola/mkgmap/filters/LineMergeFilter.java	(working copy)
@@ -1,7 +1,9 @@
 package uk.me.parabola.mkgmap.filters;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.log.Logger;
@@ -53,15 +55,23 @@
 		endPoints.add(points.get(points.size()-1), line);
 	}
 
+	/**
+	 * Filter lines which are not visible at the given resolution, merge them if type and name are equal. 
+	 * @param lines the lines to merge 
+	 * @param res the resolution
+	 * @param mergeRoads set to true if roads can be merged, too
+	 * @return list of visible lines, merged as much as possible 
+	 */
 	//TODO: This routine has a side effect: it modifies some of the MapLine instances
 	// instead of creating copies. It seems that this has no bad effect, but it is not clean
-	public List<MapLine> merge(List<MapLine> lines, int res) {
+	
+	public List<MapLine> merge(List<MapLine> lines, int res, boolean mergeRoads) {
 		linesMerged = new ArrayList<>(lines.size());	//better use LinkedList??
 		for (MapLine line : lines) {
 			if (line.getMinResolution() > res || line.getMaxResolution() < res)
 				continue;
 			
-			if (line.isRoad()){
+			if (line.isRoad() && !mergeRoads) {
 				linesMerged.add(line);
 				continue;
 			}
@@ -74,13 +84,13 @@
 			// Search for start point in hashlist 
 			// (can the end of current line connected to an existing line?)
 			for (MapLine line2 : startPoints.get(end)) {
-				if (line.isSimilar(line2)) {
+				if (isSimilar(line, line2)) {
 					addPointsAtStart(line2, points);
 					// Search for endpoint in hashlist
 					// (if the other end (=start of line =start of line2) could be connected to an existing line,
 					//  both lines has to be merged and one of them dropped)
 					for (MapLine line1 : endPoints.get(start)) {
-						if (line2.isSimilar(line1)
+						if (isSimilar(line2, line1)
 						 && !line2.equals(line1)) // don't make a closed loop a double loop
 						{
 							mergeLines(line1, line2);
@@ -97,7 +107,7 @@
 			// Search for endpoint in hashlist
 			// (can the start of current line connected to an existing line?)
 			for (MapLine line2 : endPoints.get(start)) {
-				if (line.isSimilar(line2)) {
+				if (isSimilar(line, line2)) {
 					addPointsAtEnd(line2, points);
 					isMerged = true;
 					break;
@@ -115,5 +125,15 @@
 		return linesMerged;
 	}
 
+	
+	private static boolean isSimilar(MapLine l1, MapLine l2) {
+		if (l1.isRoad() == l2.isRoad() && l1.getType() == l2.getType() && Objects.equals(l1.getName(), l2.getName())) {
+			if (l1.isRoad()) {
+				return Arrays.equals(l1.getLabels(), l2.getLabels());
+			}
+			return true;
+		}
+		return false;
+	}
 }
 
Index: src/uk/me/parabola/mkgmap/general/MapElement.java
===================================================================
--- src/uk/me/parabola/mkgmap/general/MapElement.java	(revision 4689)
+++ src/uk/me/parabola/mkgmap/general/MapElement.java	(working copy)
@@ -16,7 +16,6 @@
 package uk.me.parabola.mkgmap.general;
 
 import java.util.Arrays;
-import java.util.Objects;
 
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.imgfmt.app.trergn.ExtTypeAttributes;
@@ -195,17 +194,6 @@
 		this.type = type;
 	}
 
-	public boolean isSimilar(MapElement other) {
-		if (this.minResolution != other.minResolution)
-			return false;
-		if (this.maxResolution != other.maxResolution)
-			return false;
-		if (this.type != other.type)
-			return false;
-
-		return Objects.equals(getName(), other.getName());
-	}
-
 	public boolean hasExtendedType() {
 		return MapObject.hasExtendedType(type);
 	}
