Index: src/uk/me/parabola/imgfmt/app/net/AddrInfo.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/AddrInfo.java	(revision 0)
+++ src/uk/me/parabola/imgfmt/app/net/AddrInfo.java	(working copy)
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 Gerd Petermann
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 or
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+package uk.me.parabola.imgfmt.app.net;
+
+/**
+ * Describes the house numbering or other address info 
+ * from a node on one side of the road.
+ * @author Gerd Petermaann
+ */
+public class AddrInfo {
+//	String zipCode;
+//	CityInfo cityInfo;
+	private Numbers numbers;
+	
+	public AddrInfo() {
+	}
+	
+	public Numbers getNumbers() {
+		return numbers;
+	}
+	public void setNumbers(Numbers numbers) {
+		this.numbers = numbers;
+	}
+
+	
+}
Index: src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java	(revision 3540)
+++ src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java	(working copy)
@@ -30,7 +30,7 @@
  */
 public class NumberPreparer {
 
-	private final List<Numbers> numbers;
+	private final List<RoadAddrInfo> numbers;
 	private boolean valid;
 
 	// The minimum values of the start and end bit widths.
@@ -40,7 +40,7 @@
 	private BitWriter bw;
 	private boolean swappedDefaultStyle;
 
-	public NumberPreparer(List<Numbers> numbers) {
+	public NumberPreparer(List<RoadAddrInfo> numbers) {
 		this.numbers = numbers;
 	}
 
@@ -90,15 +90,15 @@
 	private int setup() {
 		// Should we use the swapped default numbering style EVEN/ODD rather than
 		// ODD/EVEN and the initialValue.
-		for (Iterator<Numbers> iterator = numbers.listIterator(); iterator.hasNext(); ) {
-			Numbers n = iterator.next();
-			if (n.getLeftNumberStyle() == NONE && n.getRightNumberStyle() == NONE)
+		for (Iterator<RoadAddrInfo> iterator = numbers.listIterator(); iterator.hasNext(); ) {
+			RoadAddrInfo rai = iterator.next();
+			if (rai.hasNumbers() == false)
 				iterator.remove();
 		}
 		if (numbers.isEmpty())
 			throw new Abandon("no numbers");
 
-		Numbers first = numbers.get(0);
+		RoadAddrInfo first = numbers.get(0);
 		if (first.getLeftNumberStyle() == EVEN && first.getRightNumberStyle() == ODD)
 			swappedDefaultStyle = true;
 
@@ -135,16 +135,16 @@
 			state.swapDefaults();
 
 		int lastNode = -1;
-		for (Numbers n : numbers) {
-			if (!n.hasRnodNumber())
+		for (RoadAddrInfo rai : numbers) {
+			if (!rai.hasRnodNumber())
 				throw new Abandon("no r node set");
 
 			// See if we need to skip some nodes
-			if (n.getRnodNumber() != lastNode + 1)
-				state.writeSkip(bw, n.getRnodNumber() - lastNode - 2);
+			if (rai.getRnodNumber() != lastNode + 1)
+				state.writeSkip(bw, rai.getRnodNumber() - lastNode - 2);
 
 			// Normal case write out the next node.
-			state.setTarget(n);
+			state.setTarget(rai);
 
 			state.writeNumberingStyle(bw);
 			state.calcNumbers();
@@ -152,7 +152,7 @@
 			state.writeNumbers(bw);
 			state.restoreWriters();
 
-			lastNode = n.getRnodNumber();
+			lastNode = rai.getRnodNumber();
 		}
 	}
 
@@ -238,7 +238,7 @@
 		 * transform the current state into the target state.
 		 * @param numbers The target numbers.
 		 */
-		public void setTarget(Numbers numbers) {
+		public void setTarget(RoadAddrInfo numbers) {
 			left.setTargets(numbers.getLeftNumberStyle(), numbers.getLeftStart(), numbers.getLeftEnd());
 			right.setTargets(numbers.getRightNumberStyle(), numbers.getRightStart(), numbers.getRightEnd());
 		}
Index: src/uk/me/parabola/imgfmt/app/net/Numbers.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/Numbers.java	(revision 3540)
+++ src/uk/me/parabola/imgfmt/app/net/Numbers.java	(working copy)
@@ -12,148 +12,30 @@
  */
 package uk.me.parabola.imgfmt.app.net;
 
-import uk.me.parabola.log.Logger;
 
 /**
- * Describes the house numbering from a node in the road.
- * @author Steve Ratcliffe
+ * Describes the house numbering from a node on one 
+ * side of the road.
+ * @author Steve Ratcliffe 
  */
 public class Numbers {
-	private static final Logger log = Logger.getLogger(Numbers.class);
+	private final int start, end;
+	private final NumberStyle numberStyle;
 
-	// The node in the road where these numbers apply.  In the polish notation it is the
-	// node in the road, whereas in the NET file it is the number of the routing node.
-	private int nodeNumber; // node in road index
-	private Integer rnodNumber; // routing node index
-
-	// On the left hand side of the road.
-	private NumberStyle leftNumberStyle;
-	private int leftStart;
-	private int leftEnd;
-
-	// On the right hand side of the road.
-	private NumberStyle rightNumberStyle;
-	private int rightStart;
-	private int rightEnd;
-
-	public Numbers() {
+	public Numbers(NumberStyle style, int start, int end) {
+		this.numberStyle = style;
+		this.start = start;
+		this.end = end;
 	}
-
-	/**
-	 * This constructor takes a comma separated list as in the polish format. Also used in testing as
-	 * it is an easy way to set all the parameters at once.
-	 *
-	 * @param spec Node number, followed by left and then right parameters as in the polish format.
-	 */
-	public Numbers(String spec) {
-		String[] strings = spec.split(",");
-		nodeNumber = Integer.valueOf(strings[0]);
-		leftNumberStyle = NumberStyle.fromChar(strings[1]);
-		leftStart = Integer.valueOf(strings[2]);
-		leftEnd = Integer.valueOf(strings[3]);
-		rightNumberStyle = NumberStyle.fromChar(strings[4]);
-		rightStart = Integer.valueOf(strings[5]);
-		rightEnd = Integer.valueOf(strings[6]);
+	public int getStart() {
+		return start;
 	}
-
-	public int getNodeNumber() {
-		return nodeNumber;
+	public int getEnd() {
+		return end;
 	}
-
-	public void setNodeNumber(int nodeNumber) {
-		this.nodeNumber = nodeNumber;
+	public NumberStyle getNumberStyle() {
+		return numberStyle;
 	}
-
-	public int getRnodNumber() {
-		if (rnodNumber == null) {
-			log.error("WARNING: rnod not set!!");
-			return nodeNumber;
-		}
-		return rnodNumber;
-	}
-
-	public boolean hasRnodNumber() {
-		return rnodNumber != null;
-	}
-
-	public void setRnodNumber(int rnodNumber) {
-		this.rnodNumber = rnodNumber;
-	}
-
-	public NumberStyle getLeftNumberStyle() {
-		return leftNumberStyle;
-	}
-
-	public void setLeftNumberStyle(NumberStyle leftNumberStyle) {
-		this.leftNumberStyle = leftNumberStyle;
-	}
-
-	public int getLeftStart() {
-		return leftStart;
-	}
-
-	public void setLeftStart(int leftStart) {
-		this.leftStart = leftStart;
-	}
-
-	public int getLeftEnd() {
-		return leftEnd;
-	}
-
-	public void setLeftEnd(int leftEnd) {
-		this.leftEnd = leftEnd;
-	}
-
-	public NumberStyle getRightNumberStyle() {
-		return rightNumberStyle;
-	}
-
-	public void setRightNumberStyle(NumberStyle rightNumberStyle) {
-		this.rightNumberStyle = rightNumberStyle;
-	}
-
-	public int getRightStart() {
-		return rightStart;
-	}
-
-	public void setRightStart(int rightStart) {
-		this.rightStart = rightStart;
-	}
-
-	public int getRightEnd() {
-		return rightEnd;
-	}
-
-	public void setRightEnd(int rightEnd) {
-		this.rightEnd = rightEnd;
-	}
-
-	public String toString() {
-		String nodeStr = "0";
-		if (nodeNumber > 0)
-			nodeStr = String.valueOf(nodeNumber);
-		else if (getRnodNumber() > 0)
-			nodeStr = String.format("(n%d)", getRnodNumber());
-
-		return String.format("%s,%s,%d,%d,%s,%d,%d",
-				nodeStr,
-				leftNumberStyle,
-				leftStart,
-				leftEnd,
-				rightNumberStyle,
-				rightStart,
-				rightEnd);
-	}
-
-	public boolean equals(Object obj) {
-		if (!(obj instanceof Numbers))
-			return false;
-
-		Numbers other = (Numbers) obj;
-		return toString().equals(other.toString());
-	}
-
-	public int hashCode() {
-		return toString().hashCode();
-	}
+	
+	
 }
Index: src/uk/me/parabola/imgfmt/app/net/RoadAddrInfo.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/RoadAddrInfo.java	(revision 0)
+++ src/uk/me/parabola/imgfmt/app/net/RoadAddrInfo.java	(working copy)
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2008 Steve Ratcliffe
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 or
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+package uk.me.parabola.imgfmt.app.net;
+
+import uk.me.parabola.log.Logger;
+
+/**
+ * Describes the house numbering from a node in the road.
+ * and optionally changes of zip codes and city names.
+ * @author Steve Ratcliffe
+ */
+public class RoadAddrInfo {
+	private static final Logger log = Logger.getLogger(RoadAddrInfo.class);
+
+	// The node in the road where these numbers apply.  In the polish notation it is the
+	// node in the road, whereas in the NET file it is the number of the routing node.
+	private int nodeNumber; // node in road index
+	private Integer rnodNumber; // routing node index
+
+	// we have separate info for the left and right side of the road
+	AddrInfo left,right;
+	
+	public RoadAddrInfo() {
+	}
+
+	/**
+	 * This constructor takes a comma separated list as in the polish format. Also used in testing as
+	 * it is an easy way to set all the parameters at once.
+	 *
+	 * @param spec Node number, followed by left and then right parameters as in the polish format.
+	 */
+	public RoadAddrInfo(String spec) {
+		String[] strings = spec.split(",");
+		nodeNumber = Integer.valueOf(strings[0]);
+		NumberStyle numberStyle = NumberStyle.fromChar(strings[1]);
+		int start = Integer.valueOf(strings[2]);
+		int end = Integer.valueOf(strings[3]);
+		// we interpret a null pointer as N,-1,-1  
+		if (numberStyle != NumberStyle.NONE || start != -1 || end != -1){
+			left = new AddrInfo();
+			left.setNumbers(new Numbers(numberStyle, start, end));
+		}
+		numberStyle = NumberStyle.fromChar(strings[4]);
+		start = Integer.valueOf(strings[5]);
+		end = Integer.valueOf(strings[6]);
+		if (numberStyle != NumberStyle.NONE || start != -1 || end != -1){
+			right = new AddrInfo();
+			right.setNumbers(new Numbers(numberStyle, start, end));
+		}
+	}
+
+	public int getNodeNumber() {
+		return nodeNumber;
+	}
+
+	public void setNodeNumber(int nodeNumber) {
+		this.nodeNumber = nodeNumber;
+	}
+
+	public int getRnodNumber() {
+		if (rnodNumber == null) {
+			log.error("WARNING: rnod not set!!");
+			return nodeNumber;
+		}
+		return rnodNumber;
+	}
+
+	public boolean hasRnodNumber() {
+		return rnodNumber != null;
+	}
+
+	public void setRnodNumber(int rnodNumber) {
+		this.rnodNumber = rnodNumber;
+	}
+
+	public NumberStyle getNumberStyle(boolean leftSide){
+		return (leftSide) ? getLeftNumberStyle() : getRightNumberStyle();
+	}
+	
+	public int getStart(boolean leftSide){
+		return (leftSide) ? getLeftStart() : getRightStart();
+	}
+	
+	public int getEnd(boolean leftSide){
+		return (leftSide) ? getLeftEnd() : getRightEnd();
+	}
+	
+	public NumberStyle getLeftNumberStyle() {
+		if (left == null || left.getNumbers() == null)
+			return NumberStyle.NONE;
+		return left.getNumbers().getNumberStyle();
+	}
+
+	
+	public int getLeftStart() {
+		if (left == null || left.getNumbers() == null)
+			return -1;
+		return left.getNumbers().getStart();
+	}
+
+	public int getLeftEnd() {
+		if (left == null || left.getNumbers() == null)
+			return -1;
+		return left.getNumbers().getEnd();
+	}
+
+	public NumberStyle getRightNumberStyle() {
+		if (right == null || right.getNumbers() == null)
+			return NumberStyle.NONE;
+		return right.getNumbers().getNumberStyle();
+	}
+
+	public int getRightStart() {
+		if (right == null || right.getNumbers() == null)
+			return -1;
+		return right.getNumbers().getStart();
+	}
+
+	public int getRightEnd() {
+		if (right == null || right.getNumbers() == null)
+			return -1;
+		return right.getNumbers().getEnd();
+	}
+
+	public String toString() {
+		String nodeStr = "0";
+		if (nodeNumber > 0)
+			nodeStr = String.valueOf(nodeNumber);
+		else if (getRnodNumber() > 0)
+			nodeStr = String.format("(n%d)", getRnodNumber());
+
+		return String.format("%s,%s,%d,%d,%s,%d,%d",
+				nodeStr,
+				getLeftNumberStyle(),
+				getLeftStart(),
+				getLeftEnd(),
+				getRightNumberStyle(),
+				getRightStart(),
+				getRightEnd());
+	}
+
+	public boolean equals(Object obj) {
+		if (!(obj instanceof RoadAddrInfo))
+			return false;
+
+		RoadAddrInfo other = (RoadAddrInfo) obj;
+		return toString().equals(other.toString());
+	}
+
+	public int hashCode() {
+		return toString().hashCode();
+	}
+
+	public void setNumbers (boolean leftSide, NumberStyle style, int start, int end) {
+		if (style == NumberStyle.NONE && start == -1 && end == -1)
+			return;
+		allocSide(leftSide);
+		Numbers n = new Numbers(style, start, end);
+		if (leftSide)
+			left.setNumbers(n);
+		else 
+			right.setNumbers(n);
+	}
+	
+	private void allocSide(boolean leftSide) {
+		if (leftSide){
+			if (left == null)
+				left = new AddrInfo();
+		} else if (right == null)
+			right = new AddrInfo();
+	}
+
+	public boolean hasNumbers(){
+		return (getLeftNumberStyle() != NumberStyle.NONE) ||
+				(getRightNumberStyle() != NumberStyle.NONE);
+	}
+}
Index: src/uk/me/parabola/imgfmt/app/net/RoadDef.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/net/RoadDef.java	(revision 3540)
+++ src/uk/me/parabola/imgfmt/app/net/RoadDef.java	(working copy)
@@ -144,7 +144,7 @@
 	// for diagnostic purposes
 	private final long id;
 	private final String name;
-	private List<Numbers> numbersList;
+	private List<RoadAddrInfo> numbersList;
 	private int nodeCount;
 
 	public RoadDef(long id, String name) {
@@ -492,7 +492,7 @@
 		nnodes = n;
 	}
 
-	public void setNumbersList(List<Numbers> numbersList) {
+	public void setAddrInfos(List<RoadAddrInfo> numbersList) {
 		if (numbersList != null && !numbersList.isEmpty()) {
 			this.numbersList = numbersList;
 			netFlags |= NET_FLAG_ADDRINFO;
Index: src/uk/me/parabola/mkgmap/general/MapRoad.java
===================================================================
--- src/uk/me/parabola/mkgmap/general/MapRoad.java	(revision 3540)
+++ src/uk/me/parabola/mkgmap/general/MapRoad.java	(working copy)
@@ -20,7 +20,7 @@
 
 import uk.me.parabola.imgfmt.app.lbl.City;
 import uk.me.parabola.imgfmt.app.lbl.Zip;
-import uk.me.parabola.imgfmt.app.net.Numbers;
+import uk.me.parabola.imgfmt.app.net.RoadAddrInfo;
 import uk.me.parabola.imgfmt.app.net.RoadDef;
 
 /**
@@ -113,8 +113,8 @@
 		roadDef.setNumNodes(n);
 	}
 
-	public void setNumbers(List<Numbers> numbers) {
-		roadDef.setNumbersList(numbers);
+	public void setAddrInfos(List<RoadAddrInfo> addrInfos) {
+		roadDef.setAddrInfos(addrInfos);
 	}
 
 	public RoadDef getRoadDef() {
Index: src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java	(revision 3540)
+++ src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java	(working copy)
@@ -23,7 +23,7 @@
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.imgfmt.app.CoordNode;
 import uk.me.parabola.imgfmt.app.net.NumberStyle;
-import uk.me.parabola.imgfmt.app.net.Numbers;
+import uk.me.parabola.imgfmt.app.net.RoadAddrInfo;
 import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.general.LineAdder;
 import uk.me.parabola.mkgmap.general.MapRoad;
@@ -392,7 +392,7 @@
 			Collections.sort(leftNumbers, new HousenumberMatchComparator());
 			Collections.sort(rightNumbers, new HousenumberMatchComparator());
 			
-			List<Numbers> numbersListing = new ArrayList<Numbers>();
+			List<RoadAddrInfo> numbersListing = new ArrayList<>();
 			
 			log.info("Housenumbers for",r.getName(),r.getCity());
 			log.info("Numbers:",roadX.getValue());
@@ -419,7 +419,7 @@
 				}
 
 				// Now we have a CoordNode and it is not the first one.
-				Numbers numbers = new Numbers();
+				RoadAddrInfo numbers = new RoadAddrInfo();
 				numbers.setNodeNumber(0);
 				numbers.setRnodNumber(lastRoutableNodeIndex);
 			
@@ -438,18 +438,18 @@
 				n++;
 			}
 			
-			r.setNumbers(numbersListing);
+			r.setAddrInfos(numbersListing);
 		}
 	}
 	
 	/**
 	 * Apply the given house numbers to the numbers object.
-	 * @param numbers the numbers object to be configured
+	 * @param roadAddrInfo the numbers object to be configured
 	 * @param housenumbers a list of house numbers
 	 * @param maxSegment the highest segment number to use
 	 * @param left {@code true} the left side of the street; {@code false} the right side of the street
 	 */
-	private static void applyNumbers(Numbers numbers, List<HousenumberMatch> housenumbers, int maxSegment, boolean left) {
+	private static void applyNumbers(RoadAddrInfo roadAddrInfo, List<HousenumberMatch> housenumbers, int maxSegment, boolean left) {
 		NumberStyle style = NumberStyle.NONE;
 
 		if (housenumbers.isEmpty() == false) {
@@ -482,23 +482,11 @@
 				
 				int start = housenumbers.get(0).getHousenumber();
 				int end = housenumbers.get(maxN).getHousenumber();
-				if (left) { 
-					numbers.setLeftStart(start);
-					numbers.setLeftEnd(end);
-				} else {
-					numbers.setRightStart(start);
-					numbers.setRightEnd(end);
-				}
+				roadAddrInfo.setNumbers(left, style, start, end);
 				
 				housenumbers.subList(0, maxN+1).clear();
 			}
 		}
-		
-		if (left)
-			numbers.setLeftNumberStyle(style);
-		else
-			numbers.setRightNumberStyle(style);
-		
 	}
 	
 	/**
Index: src/uk/me/parabola/mkgmap/reader/polish/RoadHelper.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/polish/RoadHelper.java	(revision 3540)
+++ src/uk/me/parabola/mkgmap/reader/polish/RoadHelper.java	(working copy)
@@ -26,7 +26,7 @@
 import uk.me.parabola.imgfmt.app.CoordNode;
 import uk.me.parabola.imgfmt.app.net.AccessTagsAndBits;
 import uk.me.parabola.imgfmt.app.net.NumberStyle;
-import uk.me.parabola.imgfmt.app.net.Numbers;
+import uk.me.parabola.imgfmt.app.net.RoadAddrInfo;
 import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.general.MapLine;
 import uk.me.parabola.mkgmap.general.MapRoad;
@@ -58,7 +58,7 @@
 	private boolean toll;
 
 	private byte mkgmapAccess;
-	private List<Numbers> numbers;
+	private List<RoadAddrInfo> roadAddrInfos;
 
 	public RoadHelper() {
 		clear();
@@ -72,7 +72,7 @@
 		roadClass = 0;
 		oneway = false;
 		toll = false;
-		numbers = null;
+		roadAddrInfos = null;
 	}
 
 	public void setRoadId(int roadId) {
@@ -138,9 +138,9 @@
 			road.setToll();
 		road.setAccess(mkgmapAccess);
 
-		if (numbers != null && !numbers.isEmpty()) {
+		if (roadAddrInfos != null && !roadAddrInfos.isEmpty()) {
 			convertNodesForHouseNumbers();
-			road.setNumbers(numbers);
+			road.setAddrInfos(roadAddrInfos);
 		}
 
 		List<Coord> points = road.getPoints();
@@ -185,8 +185,8 @@
 	 * Only called if numbers is non-null and not empty.
 	 */
 	private void convertNodesForHouseNumbers() {
-		for (Numbers n : numbers) {
-			int node = n.getNodeNumber();
+		for (RoadAddrInfo rai : roadAddrInfos) {
+			int node = rai.getNodeNumber();
 
 			// This assumes that the nodes are sorted by index.
 			ListIterator<NodeIndex> iterator = nodes.listIterator();
@@ -194,7 +194,7 @@
 				NodeIndex ni = iterator.next();
 				if (ni.index == node) {
 					// It was already there (a common case)
-					n.setRnodNumber(iterator.previousIndex());
+					rai.setRnodNumber(iterator.previousIndex());
 					break;
 				} else if (ni.index > node) {
 					// there is no routing node for this node index, need to insert one.
@@ -203,7 +203,7 @@
 			}
 
 			// If we don't have a routing node number then we have to construct one.
-			if (!n.hasRnodNumber()) {
+			if (!rai.hasRnodNumber()) {
 				NodeIndex hnNode = new NodeIndex(new String[] {
 						String.valueOf(node),
 						String.valueOf(houseNumberNodeNumber++),
@@ -212,8 +212,8 @@
 
 				iterator.previous();
 				iterator.add(hnNode);
-				n.setRnodNumber(iterator.previousIndex());
-				//System.out.printf("ADDING RN on %d, hn=%s, rn=%d\n", roadId, hnNode, n.getRnodNumber());
+				rai.setRnodNumber(iterator.previousIndex());
+				//System.out.printf("ADDING RN on %d, hn=%s, rn=%d\n", roadId, hnNode, rai.getRnodNumber());
 			}
 		}
 
@@ -225,8 +225,8 @@
 		//
 		//}
 		//System.out.println("start");
-		//Numbers num = null;
-		//for (Numbers n1 : numbers) {
+		//RoadAddrInfo num = null;
+		//for (RoadAddrInfo n1 : numbers) {
 		//	int ncount = 0;
 		//	for (NodeIndex n : nodes) {
 		//		System.out.printf("n1.node=%d, ni=%s, ni.index=%d\n", n1.getNodeNumber(), n, n.index);
@@ -249,11 +249,11 @@
 	}
 
 	public void addNumbers(String value) {
-		if (numbers == null)
-			numbers = new ArrayList<>();
-		Numbers num = new Numbers(value);
+		if (roadAddrInfos == null)
+			roadAddrInfos = new ArrayList<>();
+		RoadAddrInfo num = new RoadAddrInfo(value);
 		if (num.getLeftNumberStyle() != NumberStyle.NONE || num.getRightNumberStyle() != NumberStyle.NONE)
-			numbers.add(num);
+			roadAddrInfos.add(num);
 	}
 
 	private static class NodeIndex {
Index: test/func/lib/NumberReader.java
===================================================================
--- test/func/lib/NumberReader.java	(revision 3540)
+++ test/func/lib/NumberReader.java	(working copy)
@@ -17,7 +17,7 @@
 
 import uk.me.parabola.imgfmt.app.BitReader;
 import uk.me.parabola.imgfmt.app.net.NumberStyle;
-import uk.me.parabola.imgfmt.app.net.Numbers;
+import uk.me.parabola.imgfmt.app.net.RoadAddrInfo;
 
 import static uk.me.parabola.imgfmt.app.net.NumberStyle.*;
 
@@ -81,11 +81,11 @@
 	}
 
 	/**
-	 * Read the numbers into a list of Numbers classes.
+	 * Read the numbers into a list of RoadAddrInfo classes.
 	 * @param swap If the default starting position of left=ODD right=EVEN should be swapped.
 	 * @return A list of the numbers that the input stream represents.
 	 */
-	public List<Numbers> readNumbers(boolean swap) {
+	public List<RoadAddrInfo> readNumbers(boolean swap) {
 		if (swap) {
 			leftStyle = EVEN;
 			rightStyle = ODD;
@@ -95,7 +95,7 @@
 
 		getInitialBase();
 
-		List<Numbers> numbers = new ArrayList<Numbers>();
+		List<RoadAddrInfo> numbers = new ArrayList<>();
 
 		// To do this properly we need to know the number of nodes I think, this is the
 		// best we can do: if there are more than 8 bits left, there must be another command
@@ -123,7 +123,7 @@
 	 * Decode the next command in the stream and run it.
 	 * @param numbers When numbers are read, they are saved here.
 	 */
-	private void runCommand(List<Numbers> numbers) throws NumberException {
+	private void runCommand(List<RoadAddrInfo> numbers) throws NumberException {
 		int cmd = readCommand(); // fetch 1, 3 skip, 2 reload, 0 style
 
 		switch (cmd) {
@@ -207,7 +207,7 @@
 	 * The differences to the last point are stored. It is also possible to
 	 * @param numbers When numbers are read, they are saved here.
 	 */
-	private void fetchNumbers(List<Numbers> numbers) {
+	private void fetchNumbers(List<RoadAddrInfo> numbers) {
 
 		// If one side has no numbers, then there is only one set of numbers to calculate, but
 		// changes to base are applied to both sides.
@@ -289,18 +289,12 @@
 
 		adjustValues();
 
-		Numbers n = new Numbers();
-		n.setRnodNumber(nodeCounter);
+		RoadAddrInfo rai = new RoadAddrInfo();
+		rai.setRnodNumber(nodeCounter);
+		rai.setNumbers(true,leftStyle,leftStart,leftEnd);
+		rai.setNumbers(false,rightStyle,rightStart,rightEnd);
 
-		n.setLeftNumberStyle(leftStyle);
-		n.setLeftStart(leftStart);
-		n.setLeftEnd(leftEnd);
-
-		n.setRightNumberStyle(rightStyle);
-		n.setRightStart(rightStart);
-		n.setRightEnd(rightEnd);
-
-		numbers.add(n);
+		numbers.add(rai);
 		nodeCounter++;
 
 		restoreReaders();
@@ -321,9 +315,9 @@
 	 * If the road has numbers on just one side, then there is a shortened reading routine.
 	 * The left variables are mostly used during reading regardless of which side of the
 	 * road has numbers. Make everything work here.
-	 * @param numbers The output list that the number record should be added to.
+	 * @param roadAddrInfos The output list that the number record should be added to.
 	 */
-	private void readSingleSide(List<Numbers> numbers) {
+	private void readSingleSide(List<RoadAddrInfo> roadAddrInfos) {
 		rightBase = leftBase;
 		rightStart = leftStart;
 		rightEnd = leftEnd;
@@ -330,28 +324,13 @@
 		rightLastEndDiff = leftLastEndDiff;
 		adjustValues();
 
-		Numbers n = new Numbers();
-		if (leftStyle == NONE) {
-			n.setRnodNumber(nodeCounter);
-			n.setRightNumberStyle(rightStyle);
-			n.setRightStart(rightStart);
-			n.setRightEnd(rightEnd);
-
-			n.setLeftNumberStyle(NONE);
-			n.setLeftStart(-1);
-			n.setLeftEnd(-1);
-		}
-		else {
-			n.setRnodNumber(nodeCounter);
-			n.setLeftNumberStyle(leftStyle);
-			n.setLeftStart(leftStart);
-			n.setLeftEnd(leftEnd);
-
-			n.setRightNumberStyle(NONE);
-			n.setRightStart(-1);
-			n.setRightEnd(-1);
-		}
-		numbers.add(n);
+		RoadAddrInfo rai = new RoadAddrInfo();
+		rai.setRnodNumber(nodeCounter);
+		if (leftStyle == NONE)
+			rai.setNumbers(false,rightStyle, rightStart, rightEnd);
+		else 
+			rai.setNumbers(true,leftStyle, leftStart, leftEnd);
+		roadAddrInfos.add(rai);
 		nodeCounter++;
 	}
 
Index: test/main/NumberRangeTest.java
===================================================================
--- test/main/NumberRangeTest.java	(revision 3540)
+++ test/main/NumberRangeTest.java	(working copy)
@@ -26,7 +26,7 @@
 import uk.me.parabola.imgfmt.app.BitReader;
 import uk.me.parabola.imgfmt.app.BitWriter;
 import uk.me.parabola.imgfmt.app.net.NumberPreparer;
-import uk.me.parabola.imgfmt.app.net.Numbers;
+import uk.me.parabola.imgfmt.app.net.RoadAddrInfo;
 import uk.me.parabola.log.Logger;
 
 import func.lib.NumberReader;
@@ -69,11 +69,11 @@
     }
 
 	private void run(String[] strings) {
-		List<Numbers> numbers = new ArrayList<Numbers>();
+		List<RoadAddrInfo> numbers = new ArrayList<>();
 		for (String s : strings) {
-			Numbers n = new Numbers(s);
-			n.setRnodNumber(n.getNodeNumber());
-			numbers.add(n);
+			RoadAddrInfo rai = new RoadAddrInfo(s);
+			rai.setRnodNumber(rai.getNodeNumber());
+			numbers.add(rai);
 		}
 
 		NumberPreparer np = new NumberPreparer(numbers);
@@ -86,11 +86,11 @@
 		NumberReader nr = new NumberReader(new BitReader(bytes));
 
 		nr.setNumberOfNodes(numbers.size());
-		List<Numbers> list = nr.readNumbers(np.getSwapped());
+		List<RoadAddrInfo> list = nr.readNumbers(np.getSwapped());
 
 		// Have to fix up the node numbers
-		for (Numbers n : list) {
-			n.setNodeNumber(n.getRnodNumber());
+		for (RoadAddrInfo rai : list) {
+			rai.setNodeNumber(rai.getRnodNumber());
 		}
 
 		// Test that they are the same.
Index: test/uk/me/parabola/imgfmt/app/net/NumberPreparerTest.java
===================================================================
--- test/uk/me/parabola/imgfmt/app/net/NumberPreparerTest.java	(revision 3540)
+++ test/uk/me/parabola/imgfmt/app/net/NumberPreparerTest.java	(working copy)
@@ -37,9 +37,9 @@
 	public void testNumberConstructor() {
 		// A simple test with all numbers increasing.
 		String spec = "0,O,1,7,E,2,12";
-		Numbers n = new Numbers(spec);
+		RoadAddrInfo rai = new RoadAddrInfo(spec);
 
-		assertEquals(spec, n.toString());
+		assertEquals(spec, rai.toString());
 	}
 
 	/**
@@ -52,7 +52,7 @@
 		BitReader br = new BitReader(buf);
 		NumberReader nr = new NumberReader(br);
 		nr.setNumberOfNodes(1);
-		List<Numbers> numbers = nr.readNumbers(true);
+		List<RoadAddrInfo> numbers = nr.readNumbers(true);
 
 		assertEquals(1, numbers.size());
 		assertEquals("0,E,24,8,O,23,13", numbers.get(0).toString());
@@ -68,8 +68,8 @@
 
 	@Test
 	public void testSwappedDefaultStyles() {
-		List<Numbers> numbers = createList(new String[]{"0,E,2,12,O,1,11"});
-		List<Numbers> output = writeAndRead(numbers);
+		List<RoadAddrInfo> numbers = createList(new String[]{"0,E,2,12,O,1,11"});
+		List<RoadAddrInfo> output = writeAndRead(numbers);
 		assertEquals(numbers, output);
 	}
 
@@ -83,8 +83,8 @@
 		};
 
 		for (String t : tests) {
-			List<Numbers> numbers = createList(new String[]{t});
-			List<Numbers> output = writeAndRead(numbers);
+			List<RoadAddrInfo> numbers = createList(new String[]{t});
+			List<RoadAddrInfo> output = writeAndRead(numbers);
 			assertEquals(numbers, output);
 		}
 	}
@@ -101,12 +101,12 @@
 
 	@Test
 	public void testMultipleNodes() {
-		List<Numbers> numbers = createList(new String[]{
+		List<RoadAddrInfo> numbers = createList(new String[]{
 				"0,O,1,9,E,2,12",
 				"1,O,11,17,E,14,20",
 				"2,O,21,31,E,26,36",
 		});
-		List<Numbers> output = writeAndRead(numbers);
+		List<RoadAddrInfo> output = writeAndRead(numbers);
 		assertEquals(numbers, output);
 	}
 
@@ -242,14 +242,14 @@
 	}
 
 	private void run(String ... numbers) {
-		List<Numbers> nList = createList(numbers);
-		List<Numbers> output = writeAndRead(nList);
+		List<RoadAddrInfo> nList = createList(numbers);
+		List<RoadAddrInfo> output = writeAndRead(nList);
 		assertEquals(nList, output);
 	}
 
 	private int bytesUsed;
 
-	private List<Numbers> writeAndRead(List<Numbers> numbers) {
+	private List<RoadAddrInfo> writeAndRead(List<RoadAddrInfo> numbers) {
 		NumberPreparer preparer = new NumberPreparer(numbers);
 		BitWriter bw = preparer.fetchBitStream();
 		bytesUsed += bw.getLength();
@@ -266,19 +266,19 @@
 		BitReader br = new BitReader(bytes);
 		NumberReader nr = new NumberReader(br);
 		nr.setNumberOfNodes(numbers.size());
-		List<Numbers> list = nr.readNumbers(swapped);
-		for (Numbers n : list)
-			n.setNodeNumber(n.getRnodNumber());
+		List<RoadAddrInfo> list = nr.readNumbers(swapped);
+		for (RoadAddrInfo rai : list)
+			rai.setNodeNumber(rai.getRnodNumber());
 
 		return list;
 	}
 
-	private List<Numbers> createList(String[] specs) {
-		List<Numbers> numbers = new ArrayList<Numbers>();
+	private List<RoadAddrInfo> createList(String[] specs) {
+		List<RoadAddrInfo> numbers = new ArrayList<RoadAddrInfo>();
 		for (String s : specs) {
-			Numbers n = new Numbers(s);
-			n.setRnodNumber(n.getNodeNumber());
-			numbers.add(n);
+			RoadAddrInfo rai = new RoadAddrInfo(s);
+			rai.setRnodNumber(rai.getNodeNumber());
+			numbers.add(rai);
 		}
 		return numbers;
 	}
