Index: doc/options.txt
===================================================================
--- doc/options.txt	(revision 4457)
+++ doc/options.txt	(working copy)
@@ -675,10 +675,18 @@
 ;--report-dead-ends=LEVEL
 : 	Set the dead end road warning level. The value of LEVEL (which
 defaults to 1 if this option is not specified) determines
-those roads to report: 0 = none, 1 = multiple one-way roads
-that join together but go nowhere, 2 = individual one-way roads
-that go nowhere.
+those roads to report:
+:* 0 = none
+:* 1 = report on connected one-way roads that go nowhere
+:* 2 = also report on individual one-way roads that go nowhere.
 
+;--dead-ends[=key[=value]][,key[=value]...]
+:	Specify a list of keys and optional values that should be considered
+to be valid dead ends when found on the node at the end of a way. Ways with
+nodes matching any of the items in the list will not be reported as dead ends.
+If no value or * is specified for value then presence of the key alone will
+cause the dead end check to be skipped. The default is --dead-ends=fixme,FIXME.
+
 ;--add-pois-to-lines
 : 	Generate POIs for lines. For each line (must not be closed) POIs are
 created at several points of the line. Each POI is tagged with the
@@ -696,13 +704,11 @@
 the area/multipolygon. Additionally the tag mkgmap:area2poi=true is
 set so that it is possible to use that information in the points style
 file. Artificial polygons created by multipolyon processing are not used.
-The POIs are created at the following positions (first rule that applies):
-:;polygons: 
-::First rule that applies of
+The POIs are created at the following positions:
+:;polygons: the first rule that applies of:
 ::* the first node tagged with a tag defined by the --pois-to-areas-placement option
 ::* the centre point  
-:;multipolygons:
-::First rule that applies of
+:;multipolygons: the first rule that applies of:
 ::* the node with role=label
 ::* the centre point of the biggest area
 ;--pois-to-areas-placement=tag=value[;tag=value...]
Index: resources/help/en/options
===================================================================
--- resources/help/en/options	(revision 4457)
+++ resources/help/en/options	(working copy)
@@ -658,10 +658,19 @@
 
 --report-dead-ends=LEVEL
     Set the dead end road warning level. The value of LEVEL (which defaults to
-    1 if this option is not specified) determines those roads to report: 0 =
-    none, 1 = multiple one-way roads that join together but go nowhere, 2 =
-    individual one-way roads that go nowhere.
+    1 if this option is not specified) determines those roads to report:
+    * 0 = none
+    * 1 = report on connected one-way roads that go nowhere
+    * 2 = also report on individual one-way roads that go nowhere.
 
+--dead-ends[=key[=value]][,key[=value]...]
+    Specify a list of keys and optional values that should be considered to be
+    valid dead ends when found on the node at the end of a way. Ways with nodes
+    matching any of the items in the list will not be reported as dead ends. If
+    no value or * is specified for value then presence of the key alone will
+    cause the dead end check to be skipped. The default is
+    --dead-ends=fixme,FIXME.
+
 --add-pois-to-lines
     Generate POIs for lines. For each line (must not be closed) POIs are
     created at several points of the line. Each POI is tagged with the same
@@ -678,15 +687,12 @@
     is tagged with the same tags of the area/multipolygon. Additionally the tag
     mkgmap:area2poi=true is set so that it is possible to use that information
     in the points style file. Artificial polygons created by multipolyon
-    processing are not used. The POIs are created at the following positions
-    (first rule that applies):
-    polygons:
-        First rule that applies of
+    processing are not used. The POIs are created at the following positions:
+    polygons: the first rule that applies of:
         * the first node tagged with a tag defined by the
         --pois-to-areas-placement option
         * the centre point
-    multipolygons:
-        First rule that applies of
+    multipolygons: the first rule that applies of:
         * the node with role=label
         * the centre point of the biggest area
 --pois-to-areas-placement=tag=value[;tag=value...]
Index: src/uk/me/parabola/imgfmt/app/Coord.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/Coord.java	(revision 4457)
+++ src/uk/me/parabola/imgfmt/app/Coord.java	(working copy)
@@ -41,7 +41,7 @@
 	private static final short PRESERVED_MASK = 0x0002; // bit in flags is true if point should not be filtered out
 	private static final short REPLACED_MASK = 0x0004;  // bit in flags is true if point was replaced 
 	private static final short ADDED_BY_CLIPPER_MASK = 0x0008; // bit in flags is true if point was added by clipper 
-	private static final short FIXME_NODE_MASK = 0x0010; // bit in flags is true if a node with this coords has a fixme tag
+	private static final short SKIP_DEAD_END_CHECK_NODE_MASK = 0x0010; // bit in flags is true if a node with this coords has a tag listed in --dead-ends
 	private static final short REMOVE_MASK = 0x0020; // bit in flags is true if this point should be removed
 	private static final short VIA_NODE_MASK = 0x0040; // bit in flags is true if a node with this coords is the via node of a RestrictionRelation
 	
@@ -232,23 +232,23 @@
 		if (b) 
 			this.flags |= ADDED_BY_CLIPPER_MASK;
 		else 
-			this.flags &= ~ADDED_BY_CLIPPER_MASK; 
+			this.flags &= ~ADDED_BY_CLIPPER_MASK;
 	} 
 	
 	/**
-	 * Does this coordinate belong to a node with a fixme tag?
+	 * Does this coordinate belong to a node with a tag specified in --dead-ends?
 	 * Note that the value is set after evaluating the points style. 
-	 * @return true if the fixme flag is set, else false
+	 * @return true if the flag is set, else false
 	 */
-	public boolean isFixme() {
-		return (flags & FIXME_NODE_MASK) != 0;
+	public boolean isSkipDeadEndCheck() {
+		return (flags & SKIP_DEAD_END_CHECK_NODE_MASK) != 0;
 	}
 	
-	public void setFixme(boolean b) {
+	public void setSkipDeadEndCheck(boolean b) {
 		if (b) 
-			this.flags |= FIXME_NODE_MASK;
+			this.flags |= SKIP_DEAD_END_CHECK_NODE_MASK;
 		else 
-			this.flags &= ~FIXME_NODE_MASK; 
+			this.flags &= ~SKIP_DEAD_END_CHECK_NODE_MASK;
 	}
 	
 	public boolean isToRemove() {
@@ -259,7 +259,7 @@
 		if (b) 
 			this.flags |= REMOVE_MASK;
 		else 
-			this.flags &= ~REMOVE_MASK; 
+			this.flags &= ~REMOVE_MASK;
 	}
 	
 	/**
Index: src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 4457)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -311,7 +311,7 @@
 
 				if (way.tagIsLikeYes(onewayTagKey)) {
 					way.addTag(onewayTagKey, "yes");
-					if (foundType.isRoad() && checkFixmeCoords(way) )
+					if (foundType.isRoad() && hasSkipDeadEndCheckNode(way))
 						way.addTag("mkgmap:dead-end-check", "false");
 				} else { 
 					way.deleteTag(onewayTagKey);
@@ -388,12 +388,12 @@
 		}
 
 		/**
-		 * Check if the first or last of the coords of the way has the fixme flag set
+		 * Check if the first or last of the coords of the way has a flag set for skipping dead end check
 		 * @param way the way to check 
-		 * @return true if fixme flag was found
+		 * @return true if flag was found
 		 */
-		private boolean checkFixmeCoords(Way way) {
-			return way.getFirstPoint().isFixme() || way.getLastPoint().isFixme();
+		private boolean hasSkipDeadEndCheckNode(Way way) {
+			return way.getFirstPoint().isSkipDeadEndCheck() || way.getLastPoint().isSkipDeadEndCheck();
 		}
 
 
@@ -736,7 +736,7 @@
 		for (RestrictionRelation rr : rrList) {
 			if (!rr.isValidWithoutWay(way.getId())) {
 				if (log.isLoggable(logLevel)) {
-					log.log(logLevel, "restriction", rr.toBrowseURL(), " is ignored because referenced way",
+					log.log(logLevel, "restriction", rr.toBrowseURL(), "is ignored because referenced way",
 							way.toBrowseURL(), reason);
 				}
 				rr.setInvalid();
@@ -967,7 +967,7 @@
 		log.info("Found", numRoads, "roads",
 				numDriveOnLeftRoads, "in drive-on-left country,",
 				numDriveOnRightRoads, "in drive-on-right country, and",
-				numDriveOnSideUnknown, " with unknwon country");
+				numDriveOnSideUnknown, " with unknown country");
 		if (numDriveOnLeftRoads> 0 &&  numDriveOnRightRoads > 0)
 			log.error("Attention: Tile contains both drive-on-left (" + numDriveOnLeftRoads + 
 					") and drive-on-right roads (" + numDriveOnRightRoads + ")");
Index: src/uk/me/parabola/mkgmap/osmstyle/StyleImpl.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyleImpl.java	(revision 4457)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyleImpl.java	(working copy)
@@ -105,6 +105,7 @@
 	private OverlayReader overlays;
 	private final boolean performChecks;
 	
+	private Collection<String> deadEndTags = new ArrayList<>();
 	
 	/**
 	 * Create a style from the given location and name.
@@ -130,6 +131,14 @@
 	 * include the version file being missing.
 	 */
 	public StyleImpl(String loc, String name, EnhancedProperties props, boolean performChecks) throws FileNotFoundException {
+		String s = props.getProperty("dead-ends");
+		if (s != null) {
+			String[] deadEndTagsAndValues = s.split(",");
+			for (String deadEndTag : deadEndTagsAndValues) {
+				deadEndTags.add(deadEndTag.split("=", 2)[0]);
+			}
+		}
+
 		location = loc;
 		fileLoader = StyleFileLoader.createStyleLoader(loc, name);
 		this.performChecks = performChecks;
@@ -212,7 +221,8 @@
 		set.addAll(lines.getUsedTags());
 		set.addAll(polygons.getUsedTags());
 		set.addAll(nodes.getUsedTags());
-
+		set.addAll(deadEndTags);
+		
 		// this is to allow style authors to say that tags are really used even
 		// if they are not found in the style file.  This is mostly to work
 		// around situations that we haven't thought of - the style is expected
Index: src/uk/me/parabola/mkgmap/reader/osm/ElementSaver.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/ElementSaver.java	(revision 4457)
+++ src/uk/me/parabola/mkgmap/reader/osm/ElementSaver.java	(working copy)
@@ -66,6 +66,7 @@
 
 	// Options
 	private final boolean ignoreTurnRestrictions;
+	private final String[] deadEndArgs;
 
 	/** name of the tag that contains a ;-separated list of tag names that should be removed after all elements have been processed */
 	public static final short MKGMAP_REMOVE_TAG_KEY = TagDict.getInstance().xlate("mkgmap:removetags");
@@ -82,6 +83,7 @@
 		}
 
 		ignoreTurnRestrictions = args.getProperty("ignore-turn-restrictions", false) || !args.containsKey("route");
+		deadEndArgs = args.getProperty("dead-ends", "fixme,FIXME").split(",");
 	}
 
 	/**
@@ -224,12 +226,21 @@
 		for (Relation r : relationMap.values())
 			converter.convertRelation(r);
 
-		short fixmeTagKey = TagDict.getInstance().xlate("fixme"); 
-		short fixmeTagKey2 = TagDict.getInstance().xlate("FIXME"); 
-		for (Node n : nodeMap.values()){
+		for (Node n : nodeMap.values()) {
 			converter.convertNode(n);
-			if (n.getTag(fixmeTagKey) != null || n.getTag(fixmeTagKey2) != null){
-				n.getLocation().setFixme(true);
+			for (String deadEndArg : deadEndArgs) {
+				String[] arg = deadEndArg.split("=", 2);
+				String key = arg[0];
+				String value = arg.length < 2 || arg[1] == "*" ? "" : arg[1];
+				String tagValue = n.getTag(key);
+				if (tagValue != null) {
+					if (tagValue.equals(value) || (value == "")) {
+						Coord location = n.getLocation();
+						if (location != null)
+							location.setSkipDeadEndCheck(true);
+						break;
+					}
+				}
 			}
 		}
 
