Index: src/uk/me/parabola/imgfmt/app/net/NOD1Part.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/NOD1Part.java	(revision 4555)
+++ src/uk/me/parabola/imgfmt/app/net/NOD1Part.java	(working copy)
@@ -266,7 +266,9 @@
 		List<RouteCenter> centers = new LinkedList<>();
 
 		if (satisfiesConstraints()) {
-			centers.add(this.toRouteCenter());
+			if (nodesSize > 0) {
+				centers.add(this.toRouteCenter());
+			}
 			return centers;
 		}
 
Index: src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java	(revision 4555)
+++ src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java	(working copy)
@@ -240,22 +240,26 @@
 			return;
 		assert centers.isEmpty() : "already subdivided into centers";
 
-		// sort nodes by NodeGroup 
 		List<RouteNode> nodeList = new ArrayList<>(nodes.values());
 		nodes.clear(); // return to GC
+
+		nodeList.forEach(this::performChecks);
+
+		// first add all nodes without arcs (they always come first in Garmin maps)
+		NOD1Part nod1 = new NOD1Part();
+		nodeList.stream().filter(node -> node.getArcs().isEmpty()).forEach(nod1::addNode);
+		centers.addAll(nod1.subdivide());
+		nodeList.removeIf(node -> node.getArcs().isEmpty());
+		
+		// group remaining nodes by NodeGroup
 		for (int group = 0; group <= 4; group++){
-			NOD1Part nod1 = new NOD1Part();
-			int n = 0;
+			nod1 = new NOD1Part();
 			for (RouteNode node : nodeList) {
 				if (node.getGroup() == group) {
-					performChecks(node);
-
 					nod1.addNode(node);
-					n++;
 				}
 			}
-			if (n > 0)
-				centers.addAll(nod1.subdivide());
+			centers.addAll(nod1.subdivide());
 		}
 	}
 
