Index: src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java	(revision 3122)
+++ src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java	(revision )
@@ -34,6 +34,7 @@
 	 */
 	public void writeSectData(ImgFileWriter writer) {
 		String lastName = null;
+		Mdr7Record prev = null;
 
 		int size = getSizes().getStreetSizeFlagged();
 
@@ -47,11 +48,10 @@
 			String name = Label.stripGarminCodes(street.getName());
 			
 			int flag = 1;
-			if (name.equals(lastName)) {
+			if (name.equals(lastName) && sameGroup(street, prev))
 				flag = 0;
-			} else {
-				lastName = name;
+			lastName = name;
-			}
+			prev = street;
 
 			if (hasLabel) {
 				putMapIndex(writer, street.getMapIndex());
@@ -98,4 +98,15 @@
 	protected void releaseMemory() {
 		streets = null;
 	}
+
+	/**
+	 * These sections are divided into groups based on city, region or country. This routine is
+	 * implemented to return true if the two streets are in the same group.
+	 *
+	 * It is not clear if this is needed for region or country.
+	 * @param street1 The first street.
+	 * @param street2 The street to compare against.
+	 * @return True if the streets are in the same group (city, region etc).
+	 */
+	protected abstract boolean sameGroup(Mdr7Record street1, Mdr7Record street2);
 }
Index: src/uk/me/parabola/imgfmt/app/mdr/Mdr22.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/Mdr22.java	(revision 3122)
+++ src/uk/me/parabola/imgfmt/app/mdr/Mdr22.java	(revision )
@@ -48,8 +48,8 @@
 	public void buildFromStreets(List<Mdr7Record> inStreets) {
 		Sort sort = getConfig().getSort();
 
-		List<SortKey<Mdr7Record>> keys = new ArrayList<SortKey<Mdr7Record>>();
-		Map<String, byte[]> cache = new HashMap<String, byte[]>();
+		List<SortKey<Mdr7Record>> keys = new ArrayList<>();
+		Map<String, byte[]> cache = new HashMap<>();
 		for (Mdr7Record s : inStreets) {
 			Mdr5Record city = s.getCity();
 			if (city == null) continue;
@@ -91,6 +91,10 @@
 		}
 	}
 
+	protected boolean sameGroup(Mdr7Record street1, Mdr7Record street2) {
+		return true;
+	}
+
 	public List<Mdr7Record> getStreets() {
 		return Collections.unmodifiableList(streets);
 	}
@@ -100,7 +104,7 @@
 	 */
 	public int getExtraValue() {
 		if (isForDevice())
-			return 0xc000a;
+			return 0x600a;
 		else
 			return 0x11000;
 	}
Index: src/uk/me/parabola/imgfmt/app/mdr/Mdr21.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/Mdr21.java	(revision 3122)
+++ src/uk/me/parabola/imgfmt/app/mdr/Mdr21.java	(revision )
@@ -42,8 +42,8 @@
 	public void buildFromStreets(List<Mdr7Record> inStreets) {
 		Sort sort = getConfig().getSort();
 
-		List<SortKey<Mdr7Record>> keys = new ArrayList<SortKey<Mdr7Record>>();
-		Map<String, byte[]> cache = new HashMap<String, byte[]>();
+		List<SortKey<Mdr7Record>> keys = new ArrayList<>();
+		Map<String, byte[]> cache = new HashMap<>();
 
 		for (Mdr7Record s : inStreets) {
 			Mdr5Record city = s.getCity();
@@ -83,6 +83,10 @@
 				lastName = name;
 			}
 		}
+	}
+
+	protected boolean sameGroup(Mdr7Record street1, Mdr7Record street2) {
+		return true;
 	}
 
 	/**
Index: .idea/inspectionProfiles/Mapping.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- .idea/inspectionProfiles/Mapping.xml	(revision 3122)
+++ .idea/inspectionProfiles/Mapping.xml	(revision )
@@ -640,7 +640,7 @@
     <inspection_tool class="DuplicateThrows" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="DuplicatedBeanNamesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="DuplicatedBlockNamesInspection" enabled="true" level="WARNING" enabled_by_default="true" />
-    <inspection_tool class="Duplicates" enabled="false" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="Duplicates" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="DynamicRegexReplaceableByCompiledPattern" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="DynamicallyGeneratedCodeJS" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="ELDeferredExpressionsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
\ No newline at end of file
Index: src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java	(revision 3122)
+++ src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java	(revision )
@@ -18,7 +18,6 @@
 import java.util.List;
 
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
-import uk.me.parabola.imgfmt.app.Label;
 import uk.me.parabola.imgfmt.app.srt.Sort;
 
 /**
@@ -33,7 +32,7 @@
 	private int maxIndex;
 
 	// We use mdr8record for all similar indexes.
-	private final List<Mdr8Record> index = new ArrayList<Mdr8Record>();
+	private final List<Mdr8Record> index = new ArrayList<>();
 
 	/**
 	 * Sets the config and the prefix length for this index.
@@ -129,14 +128,23 @@
 	 * prefix of name and padded with nulls if necessary to make up the length.
 	 */
 	private String getPrefix(String in) {
-		String name = Label.stripGarminCodes(in);
-		if (prefixLength > name.length()) {
-			StringBuilder sb = new StringBuilder(name);
-			while (sb.length() < prefixLength)
-				sb.append('\0');
-			return sb.toString();
+		StringBuilder sb = new StringBuilder();
+		char[] chars = in.toCharArray();
+		int ci = 0;
+		for (int i = 0; i < prefixLength; i++) {
+			char c = 0;
+			while (ci < chars.length) {
+				// TODO: simplify when initial spaces are removed
+				c = chars[ci++];
+				if (ci == 1 && c== 0x20)
+					continue;
+				if (c >= 0x20)
+					break;
-		}
+			}
-		return name.substring(0, prefixLength);
+			sb.append(c);
+		}
+
+		return sb.toString();
 	}
 
 	public int getPrefixLength() {
Index: src/uk/me/parabola/imgfmt/app/mdr/Mdr20.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/Mdr20.java	(revision 3122)
+++ src/uk/me/parabola/imgfmt/app/mdr/Mdr20.java	(revision )
@@ -125,6 +125,15 @@
 	}
 
 	/**
+	 * Two streets are in the same group if they have the same mdr20 id.
+	 */
+	protected boolean sameGroup(Mdr7Record street1, Mdr7Record street2) {
+		if (street2 != null && street1.getCity().getMdr20() == street2.getCity().getMdr20())
+			return true;
+		return false;
+	}
+
+	/**
 	 * Unknown.
 	 */
 	public int getExtraValue() {
Index: src/uk/me/parabola/imgfmt/app/mdr/MDRFile.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/uk/me/parabola/imgfmt/app/mdr/MDRFile.java	(revision 3122)
+++ src/uk/me/parabola/imgfmt/app/mdr/MDRFile.java	(revision )
@@ -373,7 +373,7 @@
 	private void writeSection(ImgFileWriter writer, int sectionNumber, MdrSection section) {
 
 		// Some sections are just not written in the device config
-		if (forDevice && Arrays.asList(12, 13, 14, 15, 21, 23, 26, 27, 28).contains(sectionNumber))
+		if (forDevice && Arrays.asList(13, 14, 15, 21, 23, 26, 27, 28).contains(sectionNumber))
 			return;
 
 		section.setSizes(sizes);
