Index: doc/styles/rules.txt
===================================================================
--- doc/styles/rules.txt	(revision 3132)
+++ doc/styles/rules.txt	(working copy)
@@ -665,6 +665,7 @@
 |=========================================================
 | Tag | Description     
 | +mkgmap:skipSizeFilter+  | If set to +true+ the line or polygon will pass the size filter, no matter what size it has    
+| +mkgmap:highest-resolution-only+  | If set to +true+ the object will only be added for the highest resolution configured in the element type definition.    
 |=========================================================
 
 [[Element_type]]
Index: resources/styles/default/lines
===================================================================
--- resources/styles/default/lines	(revision 3132)
+++ resources/styles/default/lines	(working copy)
@@ -193,6 +193,9 @@
 # calculate the access rules
 include 'inc/access';
 
+#limit artificial cycleways to to resolution 24
+mkgmap:synthesised=yes & mkgmap:bicycle=yes { set mkgmap:highest-resolution-only = true }
+
 name=* { name '${name}' }
 
 highway=* & ref=* { addlabel '${ref}' }
Index: src/uk/me/parabola/mkgmap/osmstyle/RoadMerger.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/RoadMerger.java	(revision 3132)
+++ src/uk/me/parabola/mkgmap/osmstyle/RoadMerger.java	(working copy)
@@ -115,6 +115,7 @@
 				add("mkgmap:skipSizeFilter");
 				add("junction");
 				add("mkgmap:synthesised");
+				add("mkgmap:highest-resolution-only");
 				add("mkgmap:flare-check");
 			}
 		};
Index: src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 3132)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -240,9 +240,20 @@
 			else
 				rules = wayRules;
 		}
-		
+
+		Way cycleWay = null;
+		String cycleWayTag = way.getTag("mkgmap:make-cycle-way");
+		if ("yes".equals(cycleWayTag)){
+			way.deleteTag("mkgmap:make-cycle-way");
+			cycleWay = makeCycleWay(way);
+			way.addTag("bicycle", "no"); // make sure that bicycles are using the added bicycle way 
+		}
 		wayTypeResult.setWay(way);
 		rules.resolveType(way, wayTypeResult);
+		if (cycleWay != null){
+			wayTypeResult.setWay(cycleWay);
+			rules.resolveType(cycleWay, wayTypeResult);
+		}
 	}
 
 
@@ -343,6 +354,30 @@
 	}
 
 	/**
+	 * Construct a cycleway that has the same points as an existing way.  Used for separate
+	 * cycle lanes.
+	 * @param way The original way.
+	 * @return The new way, which will have the same points and have suitable cycle tags.
+	 */
+	private Way makeCycleWay(Way way) {
+		Way cycleWay = new Way(way.getId(), way.getPoints());
+		cycleWay.copyTags(way);
+
+		String name = way.getTag("name");
+		if(name != null)
+			name += " (cycleway)";
+		else
+			name = "cycleway";
+		cycleWay.addTag("name", name);
+		cycleWay.addTag("access", "no");
+		cycleWay.addTag("bicycle", "yes");
+		cycleWay.addTag("foot", "no");
+		cycleWay.addTag("mkgmap:synthesised", "yes");
+		cycleWay.addTag("oneway", "no");
+		return cycleWay;
+	}
+	
+	/**
 	 * Recalculates the road class defined in the given {@link GType} object based on the tags
 	 * <ul>
 	 * <li>{@code mkgmap:road-class}</li>
@@ -1005,10 +1040,14 @@
 		ms.setMinResolution(gt.getMinResolution());
 		ms.setMaxResolution(gt.getMaxResolution());
 
+		if (element.isBoolTag("mkgmap:highest-resolution-only")){
+			ms.setMinResolution(ms.getMaxResolution());
+		}
+		
 		if (element.isBoolTag("mkgmap:skipSizeFilter") && ms instanceof MapLine){
 			((MapLine)ms).setSkipSizeFilter(true);
 		}
-			
+		
 		// Now try to get some address info for POIs
 		
 		String country      = element.getTag("mkgmap:country");
Index: src/uk/me/parabola/mkgmap/reader/osm/HighwayHooks.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/HighwayHooks.java	(revision 3132)
+++ src/uk/me/parabola/mkgmap/reader/osm/HighwayHooks.java	(working copy)
@@ -32,8 +32,6 @@
 public class HighwayHooks extends OsmReadingHooksAdaptor {
 	private static final Logger log = Logger.getLogger(HighwayHooks.class);
 
-	private static final long CYCLEWAY_ID_OFFSET = 0x10000000;
-
 	private final List<Way> motorways = new ArrayList<Way>();
 	private final List<Node> exits = new ArrayList<Node>();
 
@@ -157,7 +155,7 @@
 	public void onAddWay(Way way) {
 		String highway = way.getTag("highway");
 		if (highway != null || "ferry".equals(way.getTag("route"))) {
-			boolean oneway = way.isBoolTag("oneway");
+			
 
 			// if the way is a roundabout but isn't already
 			// flagged as "oneway", flag it here
@@ -168,20 +166,26 @@
 
 			}
 
+			String onewayTag = way.getTag("oneway");
+			boolean oneway = way.isBoolTag("oneway");
+			if (!oneway & onewayTag != null && ("-1".equals(onewayTag) || "reverse".equals(onewayTag)))
+				oneway = true;
+			
 			String cycleway = way.getTag("cycleway");
 			if (makeOppositeCycleways && cycleway != null && !"cycleway".equals(highway) && oneway &&
 			   ("opposite".equals(cycleway) ||
 				"opposite_lane".equals(cycleway) ||
-				"opposite_track".equals(cycleway)))
+				"opposite_track".equals(cycleway) ||
+				"no".equals(way.getTag("oneway:bicycle")) ||
+				"no".equals(way.getTag("bicycle:oneway"))))
 			{
 				// what we have here is a oneway street
 				// that allows bicycle traffic in both
 				// directions -- to enable bicycle routing
-				// in the reverse direction, we synthesise
+				// in the reverse direction, we will synthesise
 				// a cycleway that has the same points as
 				// the original way
-				Way cycleWay = makeCycleWay(way);
-				cycleWay.addTag("oneway", "no");
+				way.addTag("mkgmap:make-cycle-way", "yes");
 
 			} else if (makeCycleways && cycleway != null && !"cycleway".equals(highway) &&
 					("track".equals(cycleway) ||
@@ -192,12 +196,10 @@
 			{
 				// what we have here is a highway with a
 				// separate track for cycles -- to enable
-				// bicycle routing, we synthesise a cycleway
+				// bicycle routing, we will synthesise a cycleway
 				// that has the same points as the original
 				// way
-				makeCycleWay(way);
-				if (way.getTag("bicycle") == null)
-					way.addTag("bicycle", "no");
+				way.addTag("mkgmap:make-cycle-way", "yes");
 			}
 		}
 
@@ -205,42 +207,6 @@
 			motorways.add(way);
 	}
 
-	/**
-	 * Construct a cycleway that has the same points as an existing way.  Used for separate
-	 * cycle lanes.
-	 * @param way The original way.
-	 * @return The new way, which will have the same points and have suitable cycle tags.
-	 */
-	private Way makeCycleWay(Way way) {
-		long cycleWayId = way.getId() + CYCLEWAY_ID_OFFSET;
-		Way cycleWay = new Way(cycleWayId);
-		saver.addWay(cycleWay);
-
-		// this reverses the direction of the way but
-		// that isn't really necessary as the cycleway
-		// isn't tagged as oneway
-		List<Coord> points = way.getPoints();
-		//for (int i = points.size() - 1; i >= 0; --i)
-		//	cycleWay.addPoint(points.get(i));
-		for (Coord point : points)
-			cycleWay.addPoint(point);
-		
-		cycleWay.copyTags(way);
-
-		String name = way.getTag("name");
-		if(name != null)
-			name += " (cycleway)";
-		else
-			name = "cycleway";
-		cycleWay.addTag("name", name);
-		cycleWay.addTag("access", "no");
-		cycleWay.addTag("bicycle", "yes");
-		cycleWay.addTag("foot", "no");
-		cycleWay.addTag("mkgmap:synthesised", "yes");
-
-		return cycleWay;
-	}
-
 	public void end() {
 		finishExits();
 		exits.clear();
