diff --git a/resources/help/en/options b/resources/help/en/options
index 5dc82cc..80fff50 100644
--- a/resources/help/en/options
+++ b/resources/help/en/options
@@ -168,6 +168,11 @@ Misc options:
 	direction and this option makes a way with the same points as
 	the original that allows bicycle traffic (in both directions).
 
+--make-cycleway-tracks
+	Some streets have a separate cycleway just for bicycle traffic
+	and this option makes a way with the same points as the
+	original that allows bicycle traffic.
+
 --link-pois-to-ways
 	If this option is enabled, POIs that are situated at a point
 	in a way will be associated with that way and may modify the
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
index 2f463f0..3b90407 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
@@ -87,6 +87,7 @@ class Osm5XmlHandler extends DefaultHandler {
 	private long nextFakeId = 1;
 
 	private final boolean makeOppositeCycleways;
+	private final boolean makeCyclewayTracks;
 	private final boolean ignoreBounds;
 	private final boolean ignoreTurnRestrictions;
 	private final boolean linkPOIsToWays;
@@ -96,6 +97,7 @@ class Osm5XmlHandler extends DefaultHandler {
 
 	public Osm5XmlHandler(EnhancedProperties props) {
 		makeOppositeCycleways = props.getProperty("make-opposite-cycleways", false);
+		makeCyclewayTracks = props.getProperty("make-cycleway-tracks", false);
 		linkPOIsToWays = props.getProperty("link-pois-to-ways", false);
 		ignoreBounds = props.getProperty("ignore-osm-bounds", false);
 		routing = props.containsKey("route");
@@ -293,33 +295,74 @@ class Osm5XmlHandler extends DefaultHandler {
 								currentWay.addTag("mkgmap:frig_roundabout", frigRoundabouts);
 						}
 					}
-					if(makeOppositeCycleways && currentWay.isBoolTag("oneway")) {
-						String cyclewayTag = currentWay.getTag("cycleway");
-						if("opposite".equals(cyclewayTag) ||
-						   "opposite_lane".equals(cyclewayTag) ||
-						   "opposite_track".equals(cyclewayTag)) {
-							// what we have here is a oneway street
-							// that allows bicycle traffic in both
-							// directions -- to enable bicyle routing
-							// in the reverse direction, we synthesise
-							// a cycleway that has the same points as
-							// the original way
-							long cycleWayId = currentWay.getId() + CYCLEWAY_ID_OFFSET;
-							Way cycleWay = new Way(cycleWayId);
-							wayMap.put(cycleWayId, 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 = currentWay.getPoints();
-							for(int i = points.size() - 1; i >= 0; --i)
-								cycleWay.addPoint(points.get(i));
-							cycleWay.copyTags(currentWay);
-							cycleWay.addTag("name", currentWay.getTag("name") + " (cycleway)");
-							cycleWay.addTag("oneway", "no");
-							cycleWay.addTag("access", "no");
-							cycleWay.addTag("bicycle", "yes");
-							log.info("Making opposite cycleway '" + cycleWay.getTag("name") + "'");
-						}
+					String cycleway = currentWay.getTag("cycleway");
+					if(makeOppositeCycleways &&
+					   cycleway != null &&
+					   !"cycleway".equals(highway) &&
+					   currentWay.isBoolTag("oneway") &&
+					   ("opposite".equals(cycleway) ||
+						"opposite_lane".equals(cycleway) ||
+						"opposite_track".equals(cycleway))) {
+						// what we have here is a oneway street
+						// that allows bicycle traffic in both
+						// directions -- to enable bicyle routing
+						// in the reverse direction, we synthesise
+						// a cycleway that has the same points as
+						// the original way
+						long cycleWayId = currentWay.getId() + CYCLEWAY_ID_OFFSET;
+						Way cycleWay = new Way(cycleWayId);
+						wayMap.put(cycleWayId, 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 = currentWay.getPoints();
+						for(int i = points.size() - 1; i >= 0; --i)
+							cycleWay.addPoint(points.get(i));
+						cycleWay.copyTags(currentWay);
+						//cycleWay.addTag("highway", "cycleway");
+						String name = currentWay.getTag("name");
+						if(name != null)
+							name += " (cycleway)";
+						else
+							name = "cycleway";
+						cycleWay.addTag("name", name);
+						cycleWay.addTag("oneway", "no");
+						cycleWay.addTag("access", "no");
+						cycleWay.addTag("bicycle", "yes");
+						cycleWay.addTag("foot", "no");
+						log.info("Making " + cycleway + " cycleway '" + cycleWay.getTag("name") + "'");
+					}
+					else if(makeCyclewayTracks &&
+							cycleway != null &&
+							!"cycleway".equals(highway) &&
+							("track".equals(cycleway) ||
+							 "lane".equals(cycleway) ||
+							 "both".equals(cycleway) ||
+							 "left".equals(cycleway) ||
+							 "right".equals(cycleway))) {
+						// what we have here is a highway with a
+						// separate track for cycles -- to enable
+						// bicyle routing, we synthesise a cycleway
+						// that has the same points as the original
+						// way
+						long cycleWayId = currentWay.getId() + CYCLEWAY_ID_OFFSET;
+						Way cycleWay = new Way(cycleWayId);
+						wayMap.put(cycleWayId, cycleWay);
+						List<Coord> points = currentWay.getPoints();
+						for(int i = 0; i < points.size(); ++i)
+							cycleWay.addPoint(points.get(i));
+						cycleWay.copyTags(currentWay);
+						//cycleWay.addTag("highway", "cycleway");
+						String name = currentWay.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");
+						log.info("Making " + cycleway + " cycleway '" + cycleWay.getTag("name") + "'");
 					}
 				}
 				if("motorway".equals(highway) ||
