Index: src/uk/me/parabola/imgfmt/app/BufferedImgFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/BufferedImgFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/BufferedImgFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/BufferedImgFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/BufferedImgFileReader.java	(working copy)
@@ -100,11 +100,10 @@
 	 *
 	 * @return The 2 byte integer that was read.
 	 */
-	public char getChar() throws ReadFailedException {
-		// Slow but sure implementation
+	public int get2() throws ReadFailedException {
 		byte b1 = get();
 		byte b2 = get();
-		return (char) (((b2 & 0xff) << 8) + (b1 & 0xff));
+		return (b2 << 8) + (b1 & 0xff);
 	}
 
 	/**
@@ -124,17 +123,12 @@
 				;
 	}
 
-	public int getu3() throws ReadFailedException {
-		return get3() & 0xffffff;
-	}
-
 	/**
-	 * Read in a 4 byte value.
+	 * Read in a 4 byte signed value.
 	 *
 	 * @return A 4 byte integer.
 	 */
-	public int getInt() throws ReadFailedException {
-		// Slow but sure implementation
+	public int get4() throws ReadFailedException {
 		byte b1 = get();
 		byte b2 = get();
 		byte b3 = get();
@@ -148,10 +142,10 @@
 
 	public int getUint(int n) throws ReadFailedException {
 		switch (n) {
-		case 1: return get() & 0xff;
-		case 2: return getChar();
-		case 3: return getu3();
-		case 4: return getInt();
+		case 1: return get1u();
+		case 2: return get2u();
+		case 3: return get3u();
+		case 4: return get4();
 		default: // this is a programming error so exit
 			throw new MapFailedException("bad integer size " + n);
 		}
Index: src/uk/me/parabola/imgfmt/app/CommonHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/CommonHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/CommonHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/CommonHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/CommonHeader.java	(working copy)
@@ -79,7 +79,7 @@
 	 */
 	public final void readHeader(ImgFileReader reader) throws ReadFailedException {
 		reader.position(0);
-		headerLength = reader.getChar();
+		headerLength = reader.get2u();
 		byte[] bytes = reader.get(TYPE_LEN);
 		try {
 			type = new String(bytes, "ascii");
Index: src/uk/me/parabola/imgfmt/app/ImgFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/ImgFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/ImgFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/ImgFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/ImgFileReader.java	(working copy)
@@ -48,11 +48,23 @@
 	 */
 	public byte get() throws ReadFailedException;
 
+	public default int get1() throws ReadFailedException {
+		return get();
+	}
+
+	public default int get1u() throws ReadFailedException {
+		return get() & 0xff;
+	}
+
+	public int get2() throws ReadFailedException;
+
 	/**
 	 * Read in two bytes.  Done in the correct byte order.
 	 * @return The 2 byte integer that was read.
 	 */
-	public char getChar() throws ReadFailedException;
+	public default int get2u() throws ReadFailedException {
+		return get2() & 0xffff;
+	}
 
 	/**
 	 * Get a 3byte signed quantity.
@@ -68,14 +80,20 @@
 	 * @return The value read.
 	 * @throws ReadFailedException When the file cannot be read.
 	 */
-	public int getu3() throws ReadFailedException;
+	public default int get3u() throws ReadFailedException {
+		return get3() & 0xffffff;
+	}
 
 	/**
-	 * Read in a 4 byte value.
+	 * Read in a 4 byte signed value.
 	 * @return A 4 byte integer.
 	 */
-	public int getInt() throws ReadFailedException;
+	public int get4() throws ReadFailedException;
 
+	public default long get4u() throws ReadFailedException {
+		return get4() & 0xffff_ffffL;
+	}
+
 	/**
 	 * Read a variable sized integer.  The size is given.
 	 * @param n The size of the integer to read. Must be 1 to 4.
Index: src/uk/me/parabola/imgfmt/app/Section.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/Section.java b/trunk/src/uk/me/parabola/imgfmt/app/Section.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/Section.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/Section.java	(working copy)
@@ -117,10 +117,10 @@
 	}
 
 	public void readSectionInfo(ImgFileReader reader, boolean withItemSize) {
-		setPosition(reader.getInt());
-		setSize(reader.getInt());
+		setPosition(reader.get4());
+		setSize(reader.get4());
 		if (withItemSize)
-			setItemSize(reader.getChar());
+			setItemSize((char) reader.get2u());
 	}
 
 	public SectionWriter makeSectionWriter(ImgFileWriter writer) {
Index: src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java	(working copy)
@@ -139,7 +139,7 @@
 		reader.position(start);
 		int index = 1;
 		while (reader.position() < end) {
-			int offset = reader.getu3();
+			int offset = reader.get3u();
 			Label label = fetchLabel(offset);
 
 			if (label != null) {
@@ -167,8 +167,8 @@
 		reader.position(start);
 		int index = 1;
 		while (reader.position() < end) {
-			int country = reader.getChar();
-			int offset = reader.getu3();
+			int country = reader.get2u();
+			int offset = reader.get3u();
 			Label label = fetchLabel(offset);
 			if (label != null) {
 				Region region = new Region(countries.get(country));
@@ -200,8 +200,8 @@
 		while (reader.position() < end) {
 			// First is either a label offset or a point/subdiv combo, we
 			// don't know until we have read further
-			int label = reader.getu3();
-			int info = reader.getChar();
+			int label = reader.get3u();
+			int info = reader.get2u();
 
 			City city;
 			if ((info & 0x4000) == 0) {
@@ -344,7 +344,7 @@
 
 		while (reader.position() < end) {
 			int poiOffset = position() - start;
-			int val = reader.getu3();
+			int val = reader.get3u();
 			int labelOffset = val & 0x3fffff;
 
 
@@ -390,7 +390,7 @@
 				byte b = reader.get();
 				if ((b & 0x80) == 0) {
 					int mpoffset = (b << 16) & 0xff0000;
-					mpoffset |= reader.getChar() & 0xffff;
+					mpoffset |= reader.get2u();
 
 					poi.setComplexStreetNumber(fetchLabel(mpoffset));
 				} else {
@@ -399,7 +399,7 @@
 			}
 
 			if (hasStreet) {
-				int streetNameOffset = reader.getu3();// label for street
+				int streetNameOffset = reader.get3u();// label for street
 				Label label = fetchLabel(streetNameOffset);
 				poi.setStreetName(label);
 			}
@@ -419,7 +419,7 @@
 				if ((b & 0x80) == 0) {
 					// Yes this is a bit strange it is a byte followed by a char
 					int mpoffset = (b << 16) & 0xff0000;
-					mpoffset |= reader.getChar() & 0xffff;
+					mpoffset |= reader.get2u();
 
 					poi.setComplexPhoneNumber(fetchLabel(mpoffset));
 				} else {
@@ -428,7 +428,7 @@
 			}
 
 			if (hasHighwayExit) {
-				int lblinfo = reader.getu3();
+				int lblinfo = reader.get3u();
 				int highwayLabelOffset = lblinfo & 0x3FFFF;
 				boolean indexed = (lblinfo & 0x800000) != 0;
 				boolean overnightParking = (lblinfo & 0x400000) != 0;
Index: src/uk/me/parabola/imgfmt/app/lbl/LBLHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/lbl/LBLHeader.java	(working copy)
@@ -68,8 +68,8 @@
 	 * @param reader The header is read from here.
 	 */
 	protected void readFileHeader(ImgFileReader reader) {
-		labelStart = reader.getInt();
-		labelSize = reader.getInt();
+		labelStart = reader.get4();
+		labelSize = reader.get4();
 		offsetMultiplier = 1 << reader.get();
 		encodingType = reader.get();
 
@@ -76,11 +76,11 @@
 		// Read the places part of the header.
 		placeHeader.readFileHeader(reader);
 
-		int codepage = reader.getChar();
-		int id1 = reader.getChar();
-		int id2 = reader.getChar();
-		int descOff = reader.getInt();
-		int descLen = reader.getInt();
+		int codepage = reader.get2u();
+		int id1 = reader.get2u();
+		int id2 = reader.get2u();
+		int descOff = reader.get4();
+		int descLen = reader.get4();
 
 		reader.position(descOff);
 		byte[] bytes = reader.get(descLen);
Index: src/uk/me/parabola/imgfmt/app/lbl/PlacesHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/lbl/PlacesHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/lbl/PlacesHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/lbl/PlacesHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/lbl/PlacesHeader.java	(working copy)
@@ -125,38 +125,38 @@
 		reader.position(0x1f);
 
 		country.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		region.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		city.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		poiIndex.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		poiProperties.readSectionInfo(reader, false);
 		reader.get(); // offset multiplier
 
 		POIGlobalFlags = reader.get();
-		reader.getChar();
+		reader.get2u();
 		reader.get();
 
 		poiTypeIndex.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		zip.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		highway.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		exitFacility.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		highwayData.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 	}
 
 	int getLastPos() {
Index: src/uk/me/parabola/imgfmt/app/net/NETFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java	(working copy)
@@ -91,13 +91,13 @@
 			RoadDef road = new RoadDef(++record, off, null);
 			readLabels(reader, road);
 			byte netFlags = reader.get();
-			/*int len =*/ reader.getu3();
+			/*int len =*/ reader.get3u();
 
 			int[] counts = new int[24];
 			int level = 0;
 			while (level < 24) {
 				int n = reader.get();
-				counts[level++] = (n & 0x7f);
+				counts[level++] = n & 0x7f;
 				if ((n & 0x80) != 0)
 					break;
 			}
@@ -106,12 +106,12 @@
 				int c = counts[i];
 				for (int j = 0; j < c; j++) {
 					/*byte b =*/ reader.get();
-					/*char sub =*/ reader.getChar();
+					/*char sub =*/ reader.get2u();
 				}
 			}
 
 			if ((netFlags & RoadDef.NET_FLAG_ADDRINFO) != 0) {
-				char flags2 = reader.getChar();
+				int flags2 = reader.get2u();
 
 				int zipFlag = (flags2 >> 10) & 0x3;
 				int cityFlag = (flags2 >> 12) & 0x3;
@@ -130,7 +130,7 @@
 			}
 
 			if ((netFlags & RoadDef.NET_FLAG_NODINFO) != 0) {
-				int nodFlags = reader.get();
+				int nodFlags = reader.get1u();
 				int nbytes = nodFlags & 0x3;
 				if (nbytes > 0) {
 					/*int nod = */reader.getUint(nbytes+1);
@@ -159,10 +159,10 @@
 		} else if (flag == 3) {
 			// there is no item
 		} else if (flag == 0) {
-			int n = reader.get() & 0xff;
+			int n = reader.get1u();
 			parseList(reader, n, size, indexes);
 		} else if (flag == 1) {
-			int n = reader.getChar();
+			int n = reader.get2u();
 			parseList(reader, n, size, indexes);
 		} else {
 			assert false : "flag is " + flag;
@@ -174,13 +174,13 @@
 		long endPos = reader.position() + n;
 		int node = 0; // not yet used
 		while (reader.position() < endPos) {
-			int initFlag = reader.get() & 0xff;
-			int skip = (initFlag & 0x1f);
+			int initFlag = reader.get1u();
+			int skip = initFlag & 0x1f;
 			initFlag >>= 5;
 			if (initFlag == 7) {
 				// Need to read another byte
-				initFlag = reader.get() & 0xff;
-				skip |= ((initFlag & 0x1f) << 5);
+				initFlag = reader.get1u();
+				skip |= (initFlag & 0x1f) << 5;
 				initFlag >>= 5;
 			}
 			node += skip + 1;
@@ -222,9 +222,9 @@
 	private void fetchNumber(ImgFileReader reader, int numberFlag) {
 		int n = 0;
 		if (numberFlag == 0) {
-			n = reader.get();
+			n = reader.get1u();
 		} else if (numberFlag == 1) {
-			n = reader.getChar();
+			n = reader.get2u();
 		} else if (numberFlag == 3) {
 			// There is no block
 			return;
@@ -238,7 +238,7 @@
 
 	private void readLabels(ImgFileReader reader, RoadDef road) {
 		for (int i = 0; i < 4; i++) {
-			int lab = reader.getu3();
+			int lab = reader.get3u();
 			Label label = labels.fetchLabel(lab & 0x7fffff);
 			road.addLabel(label);
 			if ((lab & 0x800000) != 0)
@@ -257,7 +257,7 @@
 		int start = netHeader.getRoadDefinitionsStart();
 		for (int off : offsets) {
 			reader.position(start + off);
-			int labelOffset = reader.getu3();
+			int labelOffset = reader.get3u();
 			// TODO what if top bit is not set?, there can be more than one name and we will miss them
 			offsetLabelMap.put(off, labelOffset & 0x7fffff);
 		}
@@ -277,7 +277,7 @@
 
 		Set<Integer> allOffsets = new HashSet<>();
 		while (reader.position() < end) {
-			int net1 = reader.getu3();
+			int net1 = reader.get3u();
 
 			// The offset is stored in the bottom 22 bits. The top 2 bits are an index into the list
 			// of lbl pointers in the net1 entry. 
Index: src/uk/me/parabola/imgfmt/app/net/NETHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/net/NETHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/net/NETHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/net/NETHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/net/NETHeader.java	(working copy)
@@ -60,7 +60,7 @@
 
 		sortedRoads.readSectionInfo(reader, true);
 
-		reader.getInt();
+		reader.get4();
 		reader.get();
 		reader.get();
 	}
Index: src/uk/me/parabola/imgfmt/app/net/NODHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/net/NODHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/net/NODHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/net/NODHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/net/NODHeader.java	(working copy)
@@ -63,23 +63,23 @@
 	 */
 	protected void readFileHeader(ImgFileReader reader) throws ReadFailedException {
         nodes.readSectionInfo(reader, false);
-        flags = reader.getChar();
-        reader.getChar();
-        align = reader.get();
-        mult1 = reader.get();
-        tableARecordLen = reader.getChar();
+        flags = reader.get2u();
+        reader.get2u();
+        align = reader.get1u();
+        mult1 = reader.get1u();
+        tableARecordLen = reader.get2u();
         roads.readSectionInfo(reader, false);
-        reader.getInt();
+        reader.get4();
         boundary.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 		if (getHeaderLength() > 0x3f) {
 			highClassBoundary.readSectionInfo(reader, false);
 
-			classBoundaries[0] = reader.getInt();
-			classBoundaries[1] = classBoundaries[0] + reader.getInt();
-			classBoundaries[2] = classBoundaries[1] + reader.getInt();
-			classBoundaries[3] = classBoundaries[2] + reader.getInt();
-			classBoundaries[4] = classBoundaries[3] + reader.getInt();
+			classBoundaries[0] = reader.get4();
+			classBoundaries[1] = classBoundaries[0] + reader.get4();
+			classBoundaries[2] = classBoundaries[1] + reader.get4();
+			classBoundaries[3] = classBoundaries[2] + reader.get4();
+			classBoundaries[4] = classBoundaries[3] + reader.get4();
 		}
 	}
 
Index: src/uk/me/parabola/imgfmt/app/srt/SRTHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/srt/SRTHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/srt/SRTHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/srt/SRTHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/srt/SRTHeader.java	(working copy)
@@ -60,9 +60,9 @@
 	}
 
 	protected void readFileHeader(ImgFileReader reader) throws ReadFailedException {
-		reader.getChar(); // expected: 1
-		header2.setPosition(reader.getInt());
-		header2.setSize(reader.getChar());
+		reader.get2u(); // expected: 1
+		header2.setPosition(reader.get4());
+		header2.setSize(reader.get2u());
 	}
 
 	/**
Index: src/uk/me/parabola/imgfmt/app/srt/SrtFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/srt/SrtFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/srt/SrtFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/srt/SrtFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/srt/SrtFileReader.java	(working copy)
@@ -71,14 +71,14 @@
 	private void readTableHeader() {
 		ImgFileReader reader = getReader();
 		reader.position(tableHeader.getPosition());
-		int len = reader.getChar();
+		int len = reader.get2u();
 		sort.setHeader3Len(len);
-		sort.setId1(reader.getChar());
-		sort.setId2(reader.getChar());
-		sort.setCodepage(reader.getChar());
+		sort.setId1(reader.get2u());
+		sort.setId2(reader.get2u());
+		sort.setCodepage(reader.get2u());
 		if (sort.getCodepage() == 65001)
 			sort.setMulti(true);
-		reader.getInt(); //?
+		reader.get4(); //?
 		characterTable.readSectionInfo(reader, true);
 		reader.position(reader.position() + 6); // padding?
 		srt5.readSectionInfo(reader, true);
@@ -87,8 +87,8 @@
 			srt6.readSectionInfo(reader, false);
 		}
 		if (len > 0x34) {
-			reader.getInt();
-			int maxCodeBlock = reader.getInt();
+			reader.get4();
+			int maxCodeBlock = reader.get4();
 			sort.setMaxPage(maxCodeBlock);
 			srt7.readSectionInfo(reader, true);
 			reader.position(reader.position() + 6); // padding?
@@ -110,7 +110,7 @@
 
 		int block = 1;
 		for (int i = 0; i < srt7.getNumItems(); i++) {
-			int val = reader.getInt();
+			int val = reader.get4();
 			if (val >= 0)
 				offsetToBlock.put(val/srt8.getItemSize(), block);
 			block++;
@@ -127,7 +127,7 @@
 			Integer nblock = offsetToBlock.get(i);
 			if (nblock != null) 
 				block = nblock;
-			int flags = reader.get() & 0xff;
+			int flags = reader.get1u();
 			CodePosition cp = readCharPosition(reclen-1);
 			int ch = block*256 + (i % 256);
 			
@@ -149,7 +149,7 @@
 		long start = tableHeader.getPosition() + characterTable.getPosition();
 		reader.position(start);
 		for (int ch = 1; ch <= characterTable.getNumItems(); ch++) {
-			int flags = reader.get() & 0xff;
+			int flags = reader.get1u();
 			CodePosition cp = readCharPosition(rs-1);
 			if ((flags & 0xf0) != 0) { 
 				sort.add(ch, countExp + 1, 0, 0, flags);
@@ -172,7 +172,7 @@
 		CodePosition cp = new CodePosition();
 		int rec;
 		if (posLength == 2) {
-			rec = reader.getChar();
+			rec = reader.get2u();
 			cp.setPrimary((char) (rec & 0xff));
 			cp.setSecondary((byte) ((rec >> 8) & 0xf));
 			cp.setTertiary((byte) ((rec >> 12) & 0xf));
@@ -183,7 +183,7 @@
 			cp.setSecondary((byte) ((rec >> 8) & 0xf));
 			cp.setTertiary((byte) ((rec >> 12) & 0xf));
 		} else if (posLength == 4) {
-			rec = reader.getInt();
+			rec = reader.get4();
 			cp.setPrimary((char) (rec & 0xffff));
 			cp.setSecondary((byte) ((rec >> 16) & 0xff));
 			cp.setTertiary((byte) ((rec >> 24) & 0xff));
Index: src/uk/me/parabola/imgfmt/app/trergn/RGNFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNFileReader.java	(working copy)
@@ -101,7 +101,7 @@
 			Point p = new Point(sd);
 
 			byte t = reader.get();
-			int val = reader.getu3();
+			int val = reader.get3u();
 			boolean hasSubtype = false;
 			if ((val & 0x800000) != 0)
 				hasSubtype = true;
@@ -124,8 +124,8 @@
 			}
 			p.setLabel(l);
 
-			p.setDeltaLong((short)reader.getChar());
-			p.setDeltaLat((short)reader.getChar());
+			p.setDeltaLong(reader.get2());
+			p.setDeltaLat(reader.get2());
 
 			if (hasSubtype) {
 				byte st = reader.get();
@@ -151,15 +151,15 @@
 		while (position() < end) {
 			Point p = new Point(sd);
 
-			int type = reader.get() << 8;
+			int type = reader.get1u() << 8;
 			byte b = reader.get();
 			type |= 0x10000  +  (b & 0x1f);
 			p.setType(type);
-			p.setDeltaLong((short)reader.getChar());
-			p.setDeltaLat((short)reader.getChar());
+			p.setDeltaLong(reader.get2());
+			p.setDeltaLat(reader.get2());
 			Label l;
 			if ((b & 0x20) != 0 ){
-				int labelOffset = reader.getu3();
+				int labelOffset = reader.get3u();
 				boolean hasPoi = (labelOffset & 0x400000) != 0;
 				if (hasPoi) {
 					POIRecord record = lblFile.fetchPoi(labelOffset);
@@ -269,7 +269,7 @@
 			line.setType(type & 0x3f);
 			line.setDirection((type & 0x40) != 0);
 		}
-		int labelOffset = reader.getu3();
+		int labelOffset = reader.get3u();
 		// Extra bit (for bit stream)
 		boolean extra = (labelOffset & 0x400000) != 0;
 		Label label;
@@ -285,13 +285,13 @@
 		line.setLabel(label);
 
 
-		line.setDeltaLong((short)reader.getChar());
-		line.setDeltaLat((short)reader.getChar());
+		line.setDeltaLong(reader.get2());
+		line.setDeltaLat(reader.get2());
 		int len;
 		if ((type & 0x80) == 0)
-			len = reader.get() & 0xff;
+			len = reader.get1u();
 		else
-			len = reader.getChar();
+			len = reader.get2u();
 
 		int base = reader.get();
 
@@ -309,15 +309,15 @@
 	 * @param line The line or shape that is to be populated.
 	 */
 	private void readLineCommonExtType(ImgFileReader reader, Subdivision div, Polyline line) {
-		int type = reader.get();
-		type = (type & 0xff) << 8;
-		byte b1 = reader.get();
+		int type = reader.get1u();
+		type <<= 8;
+		int b1 = reader.get1u();
 		boolean hasExtraBytes = (b1 & 0x80) != 0;
 		boolean hasLabel = (b1 & 0x20) != 0;
 		type |= 0x10000  + (b1 & 0x1f);
 		line.setType(type);
-		line.setDeltaLong((short)reader.getChar());
-		line.setDeltaLat((short)reader.getChar());
+		line.setDeltaLong(reader.get2());
+		line.setDeltaLat(reader.get2());
 		b1 = reader.get();
 		int len;
 		// one byte or two byte length field?
@@ -326,13 +326,13 @@
 			assert len < 0x7f;
 		}
 		else {
-			byte b2 = reader.get();
-			len = (((b2 & 0xff) << 8) + (b1 & 0xff)) >> 2;
+			int b2 = reader.get1u();
+			len = ((b2 << 8) + b1) >> 2;
 			assert len >= 0x7f;
 		}
 		--len; // the encoded value includes the base field 
 		assert len > 0;
-		int base = reader.get();
+		int base = reader.get1u();
 		byte[] bitstream = reader.get(len);
 		BitReader br = new BitReader(bitstream);
 	
@@ -340,7 +340,7 @@
 		readBitStream(br, div, line, false, len, base);
 	
 		if (hasLabel){
-			int labelOffset = reader.getu3();
+			int labelOffset = reader.get3u();
 			Label label;			
 			if ((labelOffset & 0x800000) == 0) {
 				label = lblFile.fetchLabel(labelOffset & 0x7fffff);
@@ -546,17 +546,17 @@
 			pointOffset = 0;
 
 			if (sd.needsIndPointPtr()) {
-				indPointOffset = reader.getChar();
+				indPointOffset = reader.get2u();
 				headerLen += 2;
 			}
 			
 			if (sd.needsPolylinePtr()) {
-				lineOffset = reader.getChar();
+				lineOffset = reader.get2u();
 				headerLen += 2;
 			}
 
 			if (sd.needsPolygonPtr()) {
-				polygonOffset = reader.getChar();
+				polygonOffset = reader.get2u();
 				headerLen += 2;
 			}
 
Index: src/uk/me/parabola/imgfmt/app/trergn/RGNHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/trergn/RGNHeader.java	(working copy)
@@ -57,27 +57,27 @@
 		data.readSectionInfo(reader, false);
 
 		if (getHeaderLength() > 29){
-			extTypeAreasOffset = reader.getInt();
-			extTypeAreasSize = reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			extTypeLinesOffset = reader.getInt();
-			extTypeLinesSize = reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			extTypePointsOffset = reader.getInt();
-			extTypePointsSize = reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
-			reader.getInt();
+			extTypeAreasOffset = reader.get4();
+			extTypeAreasSize = reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			extTypeLinesOffset = reader.get4();
+			extTypeLinesSize = reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			extTypePointsOffset = reader.get4();
+			extTypePointsSize = reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
+			reader.get4();
 		}
 	}
 
@@ -165,4 +165,4 @@
 	public int getExtTypePointsSize() {
 		return extTypePointsSize;
 	}
-}
\ No newline at end of file
+}
Index: src/uk/me/parabola/imgfmt/app/trergn/Subdivision.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/trergn/Subdivision.java b/trunk/src/uk/me/parabola/imgfmt/app/trergn/Subdivision.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/trergn/Subdivision.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/trergn/Subdivision.java	(working copy)
@@ -539,11 +539,11 @@
 	 */
 	public void readExtTypeOffsetsRecord(ImgFileReader reader,
 			Subdivision sdPrev, int size) {
-		extTypeAreasOffset = reader.getInt();
-		extTypeLinesOffset = reader.getInt();
-		extTypePointsOffset = reader.getInt();
+		extTypeAreasOffset = reader.get4();
+		extTypeLinesOffset = reader.get4();
+		extTypePointsOffset = reader.get4();
 		if (size > 12) {
-			int kinds = reader.get();
+			reader.get();  // kinds
 		}
 		if (size > 13)
 			reader.get(size-13);
@@ -564,9 +564,9 @@
 	 * Set the sizes for the extended type data. See {@link #writeLastExtTypeOffsetsRecord(ImgFileWriter)} 
 	 */
 	public void readLastExtTypeOffsetsRecord(ImgFileReader reader, int size) {
-		extTypeAreasSize = reader.getInt() - extTypeAreasOffset;
-		extTypeLinesSize = reader.getInt() - extTypeLinesOffset;
-		extTypePointsSize = reader.getInt() - extTypePointsOffset;
+		extTypeAreasSize = reader.get4() - extTypeAreasOffset;
+		extTypeLinesSize = reader.get4() - extTypeLinesOffset;
+		extTypePointsSize = reader.get4() - extTypePointsOffset;
 		assert extTypeAreasSize >= 0;
 		assert extTypeLinesSize >= 0;
 		assert extTypePointsSize >= 0;
Index: src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java b/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java	(working copy)
@@ -94,7 +94,7 @@
 		reader.position(start);
 
 		int subdivNum = 1;
-		int lastRgnOffset = reader.getu3();
+		int lastRgnOffset = reader.get3u();
 		for (int count = 0; count < levelDivs.length && reader.position() < end; count++) {
 
 			Subdivision[] divs = levelDivs[count];
@@ -103,16 +103,16 @@
 				break;
 
 			for (int i = 0; i < divs.length; i++) {
-				int flags = reader.get();
+				int flags = reader.get1u();
 				int lon = reader.get3();
 				int lat = reader.get3();
-				int width = reader.getChar() & 0x7fff;
-				int height = reader.getChar() & 0xffff;
+				int width = reader.get2u() & 0x7fff;
+				int height = reader.get2u();
 
 				if (count < levelDivs.length-1)
-					reader.getChar();
+					reader.get2u();
 
-				int endRgnOffset = reader.getu3();
+				int endRgnOffset = reader.get3u();
 
 				SubdivData subdivData = new SubdivData(flags,
 						lat, lon, 2*width, 2*height,
@@ -174,9 +174,9 @@
 		List<Zoom> mapLevels = new ArrayList<Zoom>();
 		int end = levelsPos + levelsSize;
 		while (reader.position() < end) {
-			int level = reader.get();
-			int nbits = reader.get();
-			int ndivs = reader.getChar();
+			int level = reader.get1u();
+			int nbits = reader.get1u();
+			int ndivs = reader.get2u();
 
 			Subdivision[] divs = new Subdivision[ndivs];
 			levelDivs.add(divs);
Index: src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java	(working copy)
@@ -116,26 +116,26 @@
 		log.info("read area is", getBounds());
 
 		// more to do...
-		mapLevelPos = reader.getInt();
-		mapLevelsSize = reader.getInt();
-		subdivPos = reader.getInt();
-		subdivSize = reader.getInt();
+		mapLevelPos = reader.get4();
+		mapLevelsSize = reader.get4();
+		subdivPos = reader.get4();
+		subdivSize = reader.get4();
 
 		copyright.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		poiDisplayFlags = reader.get();
 		displayPriority = reader.get3();
-		reader.getInt();
-		reader.getChar();
+		reader.get4();
+		reader.get2u();
 		reader.get();
 
 		polyline.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 		polygon.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 		points.readSectionInfo(reader, true);
-		reader.getInt();
+		reader.get4();
 
 		int mapInfoOff = mapLevelPos;
 		if (subdivPos < mapInfoOff)
@@ -146,10 +146,10 @@
 		mapInfoSize = mapInfoOff - getHeaderLength();
 		if (getHeaderLength() > 116) {
 			reader.position(116);
-			mapId = reader.getInt();
+			mapId = reader.get4();
 		}
 		if (getHeaderLength() > 120) {
-			reader.getInt();
+			reader.get4();
 			extTypeOffsets.readSectionInfo(reader, true);
 		}
 	}
Index: src/uk/me/parabola/imgfmt/app/typ/TYPHeader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/app/typ/TYPHeader.java b/trunk/src/uk/me/parabola/imgfmt/app/typ/TYPHeader.java
--- a/trunk/src/uk/me/parabola/imgfmt/app/typ/TYPHeader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/app/typ/TYPHeader.java	(working copy)
@@ -64,34 +64,34 @@
 	protected void readFileHeader(ImgFileReader reader) {
 		// Reset position for the real header reading code.
 		reader.position(COMMON_HEADER_LEN);
-		codePage = reader.getChar();	// 1252
-		pointData.setPosition(reader.getInt());
-		pointData.setSize(reader.getInt());
+		codePage = (char) reader.get2u();	// 1252
+		pointData.setPosition(reader.get4());
+		pointData.setSize(reader.get4());
 
-		lineData.setPosition(reader.getInt());
-		lineData.setSize(reader.getInt());
+		lineData.setPosition(reader.get4());
+		lineData.setSize(reader.get4());
 
-		polygonData.setPosition(reader.getInt());
-		polygonData.setSize(reader.getInt());
+		polygonData.setPosition(reader.get4());
+		polygonData.setSize(reader.get4());
 
-		familyId = reader.getChar();
-		productId = reader.getChar();
+		familyId = (char) reader.get2u();
+		productId = (char) reader.get2u();
 
-		pointIndex.setPosition(reader.getInt());
-		pointIndex.setItemSize(reader.getChar());
-		pointIndex.setSize(reader.getInt());
+		pointIndex.setPosition(reader.get4());
+		pointIndex.setItemSize((char) reader.get2u());
+		pointIndex.setSize(reader.get4());
 
-		lineIndex.setPosition(reader.getInt());
-		lineIndex.setItemSize(reader.getChar());
-		lineIndex.setSize(reader.getInt());
+		lineIndex.setPosition(reader.get4());
+		lineIndex.setItemSize((char) reader.get2u());
+		lineIndex.setSize(reader.get4());
 
-		polygonIndex.setPosition(reader.getInt());
-		polygonIndex.setItemSize(reader.getChar());
-		polygonIndex.setSize(reader.getInt());
+		polygonIndex.setPosition(reader.get4());
+		polygonIndex.setItemSize((char) reader.get2u());
+		polygonIndex.setSize(reader.get4());
 
-		shapeStacking.setPosition(reader.getInt());
-		shapeStacking.setItemSize(reader.getChar());
-		shapeStacking.setSize(reader.getInt());
+		shapeStacking.setPosition(reader.get4());
+		shapeStacking.setItemSize((char) reader.get2u());
+		shapeStacking.setSize(reader.get4());
 	}
 
 	/**
Index: src/uk/me/parabola/imgfmt/mdxfmt/MdxFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/mdxfmt/MdxFileReader.java b/trunk/src/uk/me/parabola/imgfmt/mdxfmt/MdxFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/mdxfmt/MdxFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/mdxfmt/MdxFileReader.java	(working copy)
@@ -41,19 +41,19 @@
 	private void readMaps() {
 		for (int i = 0; i < numberOfMaps; i++) {
 			MapInfo info = new MapInfo();
-			info.setHexMapname(reader.getInt());
-			info.setProductId(reader.getChar());
-			info.setFamilyId(reader.getChar());
-			info.setMapname(reader.getInt());
+			info.setHexMapname(reader.get4());
+			info.setProductId((char) reader.get2u());
+			info.setFamilyId((char) reader.get2u());
+			info.setMapname(reader.get4());
 			maps.add(info);
 		}
 	}
 
 	private void readHeader() {
-		reader.getInt();
-		reader.getChar();
-		reader.getInt();
-		numberOfMaps = reader.getInt();
+		reader.get4();
+		reader.get2u();
+		reader.get4();
+		numberOfMaps = reader.get4();
 	}
 
 	public List<MapInfo> getMaps() {
Index: src/uk/me/parabola/imgfmt/mps/MpsFileReader.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/imgfmt/mps/MpsFileReader.java b/trunk/src/uk/me/parabola/imgfmt/mps/MpsFileReader.java
--- a/trunk/src/uk/me/parabola/imgfmt/mps/MpsFileReader.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/imgfmt/mps/MpsFileReader.java	(working copy)
@@ -60,7 +60,7 @@
 	private void readBlocks() {
 		byte type;
 		while ((type = reader.get()) > 0) {
-			int len = reader.getChar();
+			int len = reader.get2u();
 
 			switch (type) {
 			case 0x4c:
@@ -79,23 +79,23 @@
 
 	private void readMapBlock() {
 		MapBlock block = new MapBlock(codePage);
-		int val = reader.getInt();
+		int val = reader.get4();
 		block.setIds(val >>> 16, val & 0xffff);
-		block.setMapNumber(reader.getInt());
+		block.setMapNumber(reader.get4());
 
 		byte[] zString = reader.getZString();
 		block.setSeriesName(decodeToString(zString));
 		block.setMapDescription(decodeToString(reader.getZString()));
 		block.setAreaName(decodeToString(reader.getZString()));
-		block.setHexNumber(reader.getInt());
-		reader.getInt();
+		block.setHexNumber(reader.get4());
+		reader.get4();
 		maps.add(block);
 	}
 
 	private void readProductBlock() {
 		ProductBlock block = new ProductBlock(codePage);
-		block.setProductId(reader.getChar());
-		block.setFamilyId(reader.getChar());
+		block.setProductId(reader.get2u());
+		block.setFamilyId(reader.get2u());
 		block.setDescription(decodeToString(reader.getZString()));
 		products.add(block);
 	}
Index: src/uk/me/parabola/mkgmap/combiners/FileInfo.java
===================================================================
diff --git a/trunk/src/uk/me/parabola/mkgmap/combiners/FileInfo.java b/trunk/src/uk/me/parabola/mkgmap/combiners/FileInfo.java
--- a/trunk/src/uk/me/parabola/mkgmap/combiners/FileInfo.java	(revision 4127)
+++ b/trunk/src/uk/me/parabola/mkgmap/combiners/FileInfo.java	(working copy)
@@ -195,7 +195,7 @@
 		try (ImgChannel chan = new FileImgChannel(filename, "r"); BufferedImgFileReader fr = new BufferedImgFileReader(chan))
 		{
 			fr.position(0x15);
-			info.setCodePage(fr.getChar());
+			info.setCodePage(fr.get2u());
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
