Index: uk/me/parabola/mkgmap/osmstyle/TypeReader.java
===================================================================
--- uk/me/parabola/mkgmap/osmstyle/TypeReader.java	(revision 3337)
+++ uk/me/parabola/mkgmap/osmstyle/TypeReader.java	(working copy)
@@ -124,7 +124,7 @@
 				}
 				if (kind == FeatureKind.POLYLINE && gt.getMinLevel() == 0 && gt.getMaxLevel() >= 0){ 
 					if (GType.isSpecialRoutableLineType(usedType)){
-						if (gt.isRoad() == false){
+						if (gt.hasRoadAttribute() == false){
 							String msg = "Warning: routable type " + type  + " is used for non-routable line with level 0. This may break routing. Style file "+ ts.getFileName() + ", line " + ts.getLinenumber();
 							if (fromOverlays)
 								msg += typeOverlaidMsg;
@@ -142,7 +142,7 @@
 						foundRoutableType = true;
 				}
 			}
-			if (gt.isRoad() && foundRoutableType == false && gt.getMinLevel() == 0 && gt.getMaxLevel() >= 0){
+			if (gt.hasRoadAttribute() && foundRoutableType == false && gt.getMinLevel() == 0 && gt.getMaxLevel() >= 0){
 				String msg = "Warning: non-routable type " + type  + " is used in combination with road_class/road_speed. Line will not be routable. Style file "+ ts.getFileName() + ", line " + ts.getLinenumber();
 				if (fromOverlays)
 					msg += ". Type is overlaid, but not with a routable type";
Index: uk/me/parabola/mkgmap/reader/osm/GType.java
===================================================================
--- uk/me/parabola/mkgmap/reader/osm/GType.java	(revision 3337)
+++ uk/me/parabola/mkgmap/reader/osm/GType.java	(working copy)
@@ -45,7 +45,8 @@
 	private int roadClass;
 	private int roadSpeed;
 
-	private boolean road;
+	private boolean hasRoadAttribute;
+	private boolean levelsWereFixed = false;
 
 	/** If this is set, then we look for further types after this one is matched */
 	private boolean continueSearch;
@@ -133,6 +134,7 @@
 			if (info.getBits() <= maxResolution)
 				minLevel = info.getLevel();
 		}
+		levelsWereFixed = true;
 	}
 
 	public String toString() {
@@ -151,7 +153,7 @@
 			else
 				fmt.format(" level %d-%d", minLevel, maxLevel);
 		}
-		if (road)
+		if (hasRoadAttribute)
 			fmt.format(" road_class=%d road_speed=%d", roadClass, roadSpeed);
 		
 		if (continueSearch)
@@ -179,7 +181,7 @@
 	public void setRoadClass(int roadClass) {
 		// road class might also be set for nodes used by the link-pois-to-ways option
 		if (getFeatureKind() == FeatureKind.POLYLINE)
-			road = true;
+			hasRoadAttribute = true;
 		this.roadClass = roadClass;
 	}
 
@@ -190,12 +192,21 @@
 	public void setRoadSpeed(int roadSpeed) {
 		// road speed might also be set for nodes used by the link-pois-to-ways option
 		if (getFeatureKind() == FeatureKind.POLYLINE)
-			road = true;
+			hasRoadAttribute = true;
 		this.roadSpeed = roadSpeed;
 	}
 
+	public boolean hasRoadAttribute() {
+		return hasRoadAttribute;
+	}
+
+	/**
+	 * @return true if the object has valid attributes to be used as a routable way 
+	 */
 	public boolean isRoad() {
-		return road;
+		if (!levelsWereFixed)
+			log.error("internal: isRoad() called before fixLevels()");
+		return hasRoadAttribute && minLevel == 0;
 	}
 
 	public boolean isContinueSearch() {
@@ -217,7 +228,7 @@
 	/**
 	 * 
 	 * @param type the type value
-	 * @return true if the type is can be used for routable lines
+	 * @return true if the type can be used for routable lines
 	 */
 	public static boolean isRoutableLineType(int type){
 		return type >= 0x01 && type <= 0x3f;
