diff --git a/src/uk/me/parabola/imgfmt/app/Label.java b/src/uk/me/parabola/imgfmt/app/Label.java
index 3ac3a44..6dee205 100644
--- a/src/uk/me/parabola/imgfmt/app/Label.java
+++ b/src/uk/me/parabola/imgfmt/app/Label.java
@@ -32,7 +32,7 @@ import uk.me.parabola.log.Logger;
  *
  * @author Steve Ratcliffe
  */
-public class Label {
+public class Label implements Comparable {
 	private static final Logger log = Logger.getLogger(Label.class);
 
 	// The compressed form of the label text.
@@ -107,4 +107,18 @@ public class Label {
 	public int hashCode() {
 		return offset;
 	}
+
+    	public int compareTo(Object other) {
+		Label o = (Label)other;
+		if(this == other)
+			return 0;
+		for(int i = 0; i < length && i < o.length; ++i) {
+			int diff = (ctext[i] & 0xff) - (o.ctext[i] & 0xff);
+			if(diff != 0)
+				return diff;
+		}
+		if(length == o.length)
+			return 0;
+		return (length > o.length)? 1 : -1;
+	}
 }
diff --git a/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java b/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java
index 40a5529..60a34ac 100644
--- a/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java
+++ b/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java
@@ -155,6 +155,10 @@ public class LBLFile extends ImgFile {
 		return places.createCity(country, city, unique);
 	}
 
+	public Map<String, City>getCities() {
+		return places.getCities();
+	}
+
 	public Zip createZip(String code) {
 		return places.createZip(code);
 	}
diff --git a/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java b/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java
index 7f5e6bf..78a8974 100644
--- a/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java
+++ b/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java
@@ -240,4 +240,8 @@ public class PlacesFile {
 			return city;
 		}
 	}
+
+	public Map<String, City>getCities() {
+		return cities;
+	}
 }
diff --git a/src/uk/me/parabola/imgfmt/app/net/NETFile.java b/src/uk/me/parabola/imgfmt/app/net/NETFile.java
index 2460271..738af45 100644
--- a/src/uk/me/parabola/imgfmt/app/net/NETFile.java
+++ b/src/uk/me/parabola/imgfmt/app/net/NETFile.java
@@ -16,6 +16,8 @@
  */
 package uk.me.parabola.imgfmt.app.net;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import uk.me.parabola.imgfmt.Utils;
@@ -60,8 +62,22 @@ public class NETFile extends ImgFile {
 	}
 
 	public void writePost(ImgFileWriter rgn) {
-		for (RoadDef rd : roads)
+		List<RoadDef> sortedRoads = new ArrayList<RoadDef>(roads.size());
+
+		for (RoadDef rd : roads) {
 			rd.writeRgnOffsets(rgn);
+			if(rd.getNumLabels() != 0)
+				sortedRoads.add(rd);
+		}
+
+		if(sortedRoads.size() > 0) {
+			Collections.sort(sortedRoads);
+			ImgFileWriter writer = netHeader.makeSortedRoadWriter(getWriter());
+			for(RoadDef rd : sortedRoads) {
+				writer.put3(rd.getOffsetNet1());
+			}
+			Utils.closeFile(writer);
+		}
 
 		getHeader().writeHeader(getWriter());
 	}
diff --git a/src/uk/me/parabola/imgfmt/app/net/NETHeader.java b/src/uk/me/parabola/imgfmt/app/net/NETHeader.java
index 3dd1bf0..c8a2b0d 100644
--- a/src/uk/me/parabola/imgfmt/app/net/NETHeader.java
+++ b/src/uk/me/parabola/imgfmt/app/net/NETHeader.java
@@ -95,4 +95,9 @@ public class NETHeader extends CommonHeader {
 		roadDefinitions.setPosition(writer.position());
 		return new SectionWriter(writer, roadDefinitions);
 	}
+
+	ImgFileWriter makeSortedRoadWriter(ImgFileWriter writer) {
+		sortedRoads.setPosition(writer.position());
+		return new SectionWriter(writer, sortedRoads);
+	}
 }
diff --git a/src/uk/me/parabola/imgfmt/app/net/RoadDef.java b/src/uk/me/parabola/imgfmt/app/net/RoadDef.java
index 9f630cd..a5ba6fb 100644
--- a/src/uk/me/parabola/imgfmt/app/net/RoadDef.java
+++ b/src/uk/me/parabola/imgfmt/app/net/RoadDef.java
@@ -23,6 +23,7 @@ import java.util.TreeMap;
 
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.app.Label;
+import uk.me.parabola.imgfmt.app.lbl.City;
 import uk.me.parabola.imgfmt.app.trergn.Polyline;
 import uk.me.parabola.log.Logger;
 
@@ -47,7 +48,7 @@ import uk.me.parabola.log.Logger;
  * @author Robert Vollmert
  */
 
-public class RoadDef {
+public class RoadDef implements Comparable {
 	private static final Logger log = Logger.getLogger(RoadDef.class);
 
 	// the offset in Nod2 of our Nod2 record
@@ -74,10 +75,10 @@ public class RoadDef {
 	 * Everything that's relevant for writing to NET1.
 	 */
 
-	private static final int NET_FLAG_NODINFO = 0x40;
-	private static final int NET_FLAG_UNK1 = 0x04;
-	private static final int NET_FLAG_ONEWAY = 0x02;
-	private static final int NET_FLAG_ADDRINFO = 0x01;
+	private static final int NET_FLAG_NODINFO  = 0x40;
+	private static final int NET_FLAG_ADDRINFO = 0x10;
+	private static final int NET_FLAG_UNK1     = 0x04;
+	private static final int NET_FLAG_ONEWAY   = 0x02;
 
 	private int netFlags = NET_FLAG_UNK1;
 
@@ -93,6 +94,8 @@ public class RoadDef {
 
 	private final SortedMap<Integer,List<RoadIndex>> roadIndexes = new TreeMap<Integer,List<RoadIndex>>();
 
+	private City city;
+
 	/**
 	 * This is for writing to NET1.
 	 * @param writer A writer that is positioned within NET1.
@@ -112,6 +115,12 @@ public class RoadDef {
 
 		writeLevelDivs(writer, maxlevel);
 
+		if(city != null) {
+			writer.put((byte)0);
+			writer.put((byte)0xec);
+			writer.putChar((char)city.getIndex());
+		}
+
 		if (hasNodInfo()) {
 			// This is the offset of an entry in NOD2
 			int val = offsetNod2;
@@ -166,6 +175,10 @@ public class RoadDef {
 			log.warn("discarding extra label", l);
 	}
 
+	public int getNumLabels() {
+		return numlabels;
+	}
+
 	/**
 	 * Add a polyline to this road.
 	 *
@@ -458,4 +471,18 @@ public class RoadDef {
 		tabAInfo |= TABA_FLAG_ONEWAY;
 		netFlags |= NET_FLAG_ONEWAY;
 	}
+
+	public void setCity(City city) {
+		this.city = city;
+		netFlags |= NET_FLAG_ADDRINFO;
+	}
+
+	public int compareTo(Object other) {
+		RoadDef o = (RoadDef)other;
+		if(labels[0] != null && o.labels[0] != null)
+			return labels[0].compareTo(o.labels[0]);
+		if(labels[0] == null && o.labels[0] == null)
+			return 0;
+		return (labels[0] == null)? -1 : 1;
+	}
 }
diff --git a/src/uk/me/parabola/mkgmap/build/MapBuilder.java b/src/uk/me/parabola/mkgmap/build/MapBuilder.java
index 6ecf9f1..a9ecb63 100644
--- a/src/uk/me/parabola/mkgmap/build/MapBuilder.java
+++ b/src/uk/me/parabola/mkgmap/build/MapBuilder.java
@@ -216,7 +216,7 @@ public class MapBuilder implements Configurable {
 			{
 				Country thisCountry;
 				Region 	thisRegion;
-				City 		thisCity;
+				City	thisCity;
 
 				String CountryStr = p.getCountry();
 				String RegionStr  = p.getRegion();
@@ -693,10 +693,18 @@ public class MapBuilder implements Configurable {
 		filters.addFilter(new RemoveEmpty());
 		filters.addFilter(new LineAddFilter(div, map, doRoads));
 		
+		LBLFile lbl = map.getLblFile();
 		for (MapLine line : lines) {
 			if (line.getMinResolution() > res || line.getMaxResolution() < res)
 				continue;
 
+			if(line.isRoad()) {
+				String cityName = line.getCity();
+			    	if(cityName != null) {
+	  				((MapRoad)line).setCity(lbl.getCities().get(cityName));
+				}
+			}
+
 			filters.startFilter(line);
 		}
 	}
diff --git a/src/uk/me/parabola/mkgmap/general/MapRoad.java b/src/uk/me/parabola/mkgmap/general/MapRoad.java
index 0262e0d..9b21183 100644
--- a/src/uk/me/parabola/mkgmap/general/MapRoad.java
+++ b/src/uk/me/parabola/mkgmap/general/MapRoad.java
@@ -16,6 +16,7 @@
  */
 package uk.me.parabola.mkgmap.general;
 
+import uk.me.parabola.imgfmt.app.lbl.City;
 import uk.me.parabola.imgfmt.app.net.RoadDef;
 
 /**
@@ -101,4 +102,8 @@ public class MapRoad extends MapLine {
 	public RoadDef getRoadDef() {
 		return roadDef;
 	}
+
+	public void setCity(City c) {
+		this.roadDef.setCity(c);
+	}
 }
diff --git a/src/uk/me/parabola/mkgmap/main/MapMaker.java b/src/uk/me/parabola/mkgmap/main/MapMaker.java
index b8c5cfa..60e24a3 100644
--- a/src/uk/me/parabola/mkgmap/main/MapMaker.java
+++ b/src/uk/me/parabola/mkgmap/main/MapMaker.java
@@ -207,12 +207,6 @@ public class MapMaker implements MapProcessor {
 				}
 			}
 
-			List<MapPoint> cities = new ArrayList<MapPoint>();
-			for(MapPoint mp : src.getPoints()) {
-				if(mp.isCity())
-					cities.add(mp);
-			}
-
 			// generate a POI for each named road
 			for(List<MapLine> lr : findConnectedRoadsWithSameName(namedRoads)) {
 				// connected roads are not ordered so just use first in list
@@ -315,11 +309,12 @@ public class MapMaker implements MapProcessor {
 			int i2 = numPoints / 2;
 			int i1 = i2 - 1;
 			coord = new Coord((points.get(i1).getLatitude() +
-					points.get(i2).getLatitude()) / 2,
-					(points.get(i1).getLongitude() +
-							points.get(i2).getLongitude()) / 2);
-		} else
+					   points.get(i2).getLatitude()) / 2,
+					  (points.get(i1).getLongitude() +
+					   points.get(i2).getLongitude()) / 2);
+		} else {
 			coord = points.get(numPoints / 2);
+		}
 
 		String name = road.getName();
 		MapPoint rnp = new MapPoint();
