Index: uk/me/parabola/mkgmap/build/LocatorConfig.java
===================================================================
--- uk/me/parabola/mkgmap/build/LocatorConfig.java	(revision 3558)
+++ uk/me/parabola/mkgmap/build/LocatorConfig.java	(working copy)
@@ -156,9 +156,7 @@
 									setPoiDispTag(iso, poiDispTag);
 								}
 								Node driveOnLeft = attr.getNamedItem("driveOnLeft");
-								if (driveOnLeft != null && "true".equals(driveOnLeft.getNodeValue())){
-									driveOnLeftFlagMap.put(iso, true);
-								}
+								driveOnLeftFlagMap.put(iso, driveOnLeft != null && "true".equals(driveOnLeft.getNodeValue()));
 							}
 
 							if (iso != null) {
@@ -350,9 +348,14 @@
 	{
 		if (iso == null)
 			return false;
-		if (driveOnLeftFlagMap.containsKey(iso))
-			return true;
-		return false;
+		Boolean driveOnLeft = driveOnLeftFlagMap.get(iso);
+		if (driveOnLeft == null){
+			log.warn("Did not find iso code",iso,"in LocatorConfig.xml, assuming drive-on-right for it");
+			driveOnLeftFlagMap.put(iso,false);
+			return false;
+		}
+		else 
+			return driveOnLeft;
 	}
 }
 
Index: uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 3558)
+++ uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -134,6 +134,8 @@
 	private int numDriveOnSideUnknown;
 	private int numRoads;
 	
+	private String countryAbbr;
+
 	private final boolean checkRoundabouts;
 	private int reportDeadEnds; 
 	private final boolean linkPOIsToWays;
@@ -185,6 +187,9 @@
 		default:
 			throw new ExitException("invalid parameters for option drive-on:"+driveOn);
 		}
+		countryAbbr = props.getProperty("country-abbr", null);
+		if (countryAbbr != null)
+			countryAbbr = countryAbbr.toUpperCase();
 			
 		checkRoundabouts = props.getProperty("check-roundabouts",false);
 		reportDeadEnds = props.getProperty("report-dead-ends", 1);  
@@ -351,14 +356,23 @@
 		if (cw.isRoad()){
 			roads.add(cw);
 			numRoads++;
-			String country = way.getTag(countryTagKey);
-			if (country != null) {
-				if (LocatorConfig.get().getDriveOnLeftFlag(country))
-					numDriveOnLeftRoads++;
-				else
-					numDriveOnRightRoads++;
-			} else
-				numDriveOnSideUnknown++;
+			if (cw.isFerry() == false){
+				String country = way.getTag(countryTagKey);
+				if (country == null)
+					country = countryAbbr;
+				if (country != null) {
+					boolean drivingSideIsLeft =LocatorConfig.get().getDriveOnLeftFlag(country); 
+					if (drivingSideIsLeft)
+						numDriveOnLeftRoads++;
+					else
+						numDriveOnRightRoads++;
+					if (driveOnLeft != null && drivingSideIsLeft != driveOnLeft)
+						log.warn("wrong driving side",way.toBrowseURL());
+					if (log.isDebugEnabled())
+						log.debug("assumed driving side is",(drivingSideIsLeft ? "left" : "right"),way.toBrowseURL());
+				} else
+					numDriveOnSideUnknown++;
+			}
 			if (cw.isRoundabout()) {
 				if (wasReversed)
 					log.warn("Roundabout", way.getId(), "has reverse oneway tag (" + way.getPoints().get(0).toOSMURL() + ")");
