Index: uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 3740)
+++ uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -144,8 +144,8 @@
 	private final boolean linkPOIsToWays;
 	private final boolean mergeRoads;
 	private final boolean routable;
+	private final boolean filterEarly;
 	
-
 	private LineAdder lineAdder = new LineAdder() {
 		public void add(MapLine element) {
 			if (element instanceof MapRoad){
@@ -211,7 +211,7 @@
 		// undocumented option - usually used for debugging only
 		mergeRoads = props.getProperty("no-mergeroads", false) == false;
 		routable = props.containsKey("route");
-		
+		filterEarly = props.getProperty("no-filter-early", false) == false;
 	}
 
 	/** One type result for ways to avoid recreating one for each way. */ 
@@ -989,6 +989,9 @@
 		final MapShape shape = new MapShape(way.getId());
 		elementSetup(shape, gt, way);
 		shape.setPoints(way.getPoints());
+		if (filterEarly && !adaptMinRes(shape))
+			return;
+		
 
 		long areaVal = 0;
 		String tagStringVal = way.getTag(drawLevelTagKey);
@@ -1013,6 +1016,24 @@
 		clipper.clipShape(shape, collector);
 	}
 
+	/**
+	 * Set minimum resolution based on the size of the shape
+	 * @param shape the shape to check
+	 * @return false is not visible in the map
+	 */
+	private static boolean adaptMinRes(MapLine shape) {
+		if (shape.isSkipSizeFilter())
+			return true;
+		int maxDim = shape.getMaxDimension();
+		int minResVisible = Integer.numberOfLeadingZeros(maxDim) - 8;
+		if (minResVisible > shape.getMaxResolution())
+			return false;
+		if (minResVisible <= shape.getMinResolution())
+			return true;
+		shape.setMinResolution(minResVisible);
+		return true;
+	}
+
 	private void addPoint(Node node, GType gt) {
 		if (!clipper.contains(node.getLocation()))
 			return;
