Index: resources/styles/default/lines
===================================================================
--- resources/styles/default/lines	(revision 2651)
+++ resources/styles/default/lines	(working copy)
@@ -69,9 +69,10 @@
          'Exit ${mkgmap:exit_hint_ref}'
        }
               
-highway=trunk {name '${ref|highway-symbol:hbox} ${name}' | '${ref|highway-symbol:hbox}' | '${name}'; add mkgmap:display_name = '${name} (${ref})' }
-highway=primary {name '${ref|highway-symbol:box} ${name}' | '${ref|highway-symbol:box}' | '${name}'; add mkgmap:display_name = '${name} (${ref})' }
-highway=secondary | highway=tertiary {name '${ref|highway-symbol:oval} ${name}' | '${ref|highway-symbol:oval}' | '${name}'; add mkgmap:display_name = '${name} (${ref})' }
+(highway=trunk | highway=primary | highway=secondary | highway=tertiary ) & ref=* & name=* { add mkgmap:display_name='${name}' }
+highway=trunk {name '${ref|highway-symbol:hbox} ${name}' | '${ref|highway-symbol:hbox}' | '${name}' }
+highway=primary {name '${ref|highway-symbol:box} ${name}' | '${ref|highway-symbol:box}' | '${name}' }
+highway=secondary | highway=tertiary {name '${ref|highway-symbol:oval} ${name}' | '${ref|highway-symbol:oval}' | '${name}' }
 highway=* {name '${name}' | '${ref}' }
 
 # Flag unpaved roads.
Index: src/uk/me/parabola/mkgmap/combiners/MdrBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/MdrBuilder.java	(revision 2651)
+++ src/uk/me/parabola/mkgmap/combiners/MdrBuilder.java	(working copy)
@@ -334,7 +334,7 @@
 		List<RoadDef> roads = mr.getRoads();
 
 		for (RoadDef road : roads) {
-			String name = road.getName();
+			String name = Label.removeShield(road.getName());
 			if (name == null || name.isEmpty())
 				continue;
 
Index: src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java	(revision 2651)
+++ src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java	(working copy)
@@ -22,6 +22,7 @@
 
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.imgfmt.app.CoordNode;
+import uk.me.parabola.imgfmt.app.Label;
 import uk.me.parabola.imgfmt.app.net.NumberStyle;
 import uk.me.parabola.imgfmt.app.net.Numbers;
 import uk.me.parabola.log.Logger;
@@ -64,13 +65,12 @@
 	 * @return the street name (or {@code null} if no street name set)
 	 */
 	private String getStreetname(Element e) {
-		if (e.getTag("mkgmap:street") != null) {
-			return e.getTag("mkgmap:street");
+		
+		String street = Label.removeShield(e.getTag("mkgmap:street"));
+		if (street != null) {
+			return street;
 		}
-		if (e.getTag("addr:street") != null) {
-			return e.getTag("addr:street");
-		}	
-		return null;
+		return Label.removeShield(e.getTag("addr:street"));
 	}
 	
 	/**
@@ -111,8 +111,26 @@
 	 */
 	public void addRoad(MapRoad road) {
 		roads.add(road);
-		if (numbersEnabled &&  road.getName() != null) {
-			roadByNames.add(road.getName(), road);
+		if (numbersEnabled) {
+			String name = Label.removeShield(road.getName());
+			if (name != null) {
+				roadByNames.add(name, road);
+			} else {
+				name = road.getRef();
+				if (name != null) {
+					String[] refs = name.split(";");
+					if (refs != null)
+					for (String ref : refs) {
+						name = Label.removeShield(ref);
+						if (name != null) {
+							roadByNames.add(name, road);
+							break;
+						}
+					}
+
+				}
+			}
+			
 		} 
 	}
 	
Index: src/uk/me/parabola/imgfmt/app/mdr/MDRFile.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/MDRFile.java	(revision 2651)
+++ src/uk/me/parabola/imgfmt/app/mdr/MDRFile.java	(working copy)
@@ -27,6 +27,7 @@
 import uk.me.parabola.imgfmt.app.srt.Sort;
 import uk.me.parabola.imgfmt.app.trergn.Point;
 import uk.me.parabola.imgfmt.fs.ImgChannel;
+import uk.me.parabola.log.Logger;
 
 /**
  * The MDR file.  This is embedded into a .img file, either its own
@@ -35,6 +36,7 @@
  * @author Steve Ratcliffe
  */
 public class MDRFile extends ImgFile {
+	private static final Logger log = Logger.getLogger(MDRFile.class);
 	private final MDRHeader mdrHeader;
 
 	// The sections
@@ -222,11 +224,14 @@
 			
 			String name = lab.getText();
 			String cleanName = cleanUpName(name);
+			if (cleanName == null)
+				continue;
+			
 			int strOff = createString(cleanName);
 
 			// We sort on the dirty name (ie with the Garmin shield codes) although those codes do not
 			// affect the sort order. The string for mdr15 does not include the shield codes.
-			mdr7.addStreet(currentMap, name, lab.getOffset(), strOff, mdrCity);
+			mdr7.addStreet(currentMap, cleanName, lab.getOffset(), strOff, mdrCity);
 		}
 	}
 
@@ -237,7 +242,7 @@
 	 * @return The name as it will go into the index.
 	 */
 	private String cleanUpName(String name) {
-		return Label.stripGarminCodes(name);
+		return Label.stripGarminCodes(Label.removeShield(name));
 	}
 
 	public void write() {
Index: src/uk/me/parabola/imgfmt/app/Label.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/Label.java	(revision 2651)
+++ src/uk/me/parabola/imgfmt/app/Label.java	(working copy)
@@ -75,6 +75,32 @@
 		return s.trim();
 	}
 
+	/**
+	 * Removes the shield from the given string. This is the shield character 
+	 * including the following part until the first whitespace. 
+	 * @param s a label
+	 * @return the label without shield ({@code null} if stripped label is empty)
+	 */
+	public static String removeShield(String s) {
+		if (s == null || s.isEmpty())
+			return null;
+		
+		if (SHIELDS.matcher(s.substring(0, 1)).matches()) {
+			int whitespaceIndex = s.indexOf(' ', 1);
+			if (whitespaceIndex < 0) {
+				return null;
+			} else {
+				s = s.substring(whitespaceIndex);
+			}
+		}
+		s = s.trim();
+		if (s.isEmpty()) {
+			return null;
+		}
+		return s;
+		
+	}
+	
 	public static String squashSpaces(String s) {
 		if(s == null || s.isEmpty())
 			return null;
