diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0004_PackReader.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0004_PackReader.java
index b78b7b8554dacf7254bcd8e453dfdd6491622ef7..336bba22ce28b40ae85d3b70cf15659d65d6180e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0004_PackReader.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0004_PackReader.java
@@ -67,7 +67,7 @@ public void test003_lookupCompressedObject() throws IOException {
 		assertNotNull(or);
 		assertEquals(Constants.OBJ_TREE, or.getType());
 		assertEquals(35, or.getSize());
-		assertEquals(7738, or.getDataOffset());
+		assertEquals(7736, or.getObjectOffset());
 		pr.close();
 	}
 
@@ -81,6 +81,6 @@ public void test004_lookupDeltifiedObject() throws IOException {
 		assertTrue(or instanceof PackedObjectLoader);
 		assertEquals(Constants.OBJ_BLOB, or.getType());
 		assertEquals(18009, or.getSize());
-		assertEquals(537, ((PackedObjectLoader) or).getDataOffset());
+		assertEquals(516, ((PackedObjectLoader) or).getObjectOffset());
 	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java
index 9e1b3da1986bc7009bf4a406efd1d8d1b8e4017b..0b7c6c45f873f84a8b191ff415962c0273c27a1e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaOfsPackedObjectLoader.java
@@ -54,10 +54,9 @@
 class DeltaOfsPackedObjectLoader extends DeltaPackedObjectLoader {
 	private final long deltaBase;
 
-	DeltaOfsPackedObjectLoader(final PackFile pr,
-			final long dataOffset, final long objectOffset, final int deltaSz,
-			final long base) {
-		super(pr, dataOffset, objectOffset, deltaSz);
+	DeltaOfsPackedObjectLoader(final PackFile pr, final long objectOffset,
+			final int headerSz, final int deltaSz, final long base) {
+		super(pr, objectOffset, headerSz, deltaSz);
 		deltaBase = base;
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java
index 867aadfb295ba33f996d1cddcedcf871d1e5c0ab..b42549943ae4e47e893d874afc70dac3e238b874 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaPackedObjectLoader.java
@@ -57,9 +57,9 @@ abstract class DeltaPackedObjectLoader extends PackedObjectLoader {
 
 	private final int deltaSize;
 
-	DeltaPackedObjectLoader(final PackFile pr, final long dataOffset,
-			final long objectOffset, final int deltaSz) {
-		super(pr, dataOffset, objectOffset);
+	DeltaPackedObjectLoader(final PackFile pr, final long objectOffset,
+			final int headerSize, final int deltaSz) {
+		super(pr, objectOffset, headerSize);
 		objectType = -1;
 		deltaSize = deltaSz;
 	}
@@ -71,7 +71,7 @@ public void materialize(final WindowCursor curs) throws IOException {
 		}
 
 		if (objectType != OBJ_COMMIT) {
-			final UnpackedObjectCache.Entry cache = pack.readCache(dataOffset);
+			UnpackedObjectCache.Entry cache = pack.readCache(objectOffset);
 			if (cache != null) {
 				curs.release();
 				objectType = cache.type;
@@ -84,17 +84,17 @@ public void materialize(final WindowCursor curs) throws IOException {
 		try {
 			final PackedObjectLoader baseLoader = getBaseLoader(curs);
 			baseLoader.materialize(curs);
-			cachedBytes = BinaryDelta.apply(baseLoader.getCachedBytes(),
-					pack.decompress(dataOffset, deltaSize, curs));
+			cachedBytes = BinaryDelta.apply(baseLoader.getCachedBytes(), pack
+					.decompress(objectOffset + headerSize, deltaSize, curs));
 			curs.release();
 			objectType = baseLoader.getType();
 			objectSize = cachedBytes.length;
 			if (objectType != OBJ_COMMIT)
-				pack.saveCache(dataOffset, cachedBytes, objectType);
+				pack.saveCache(objectOffset, cachedBytes, objectType);
 		} catch (DataFormatException dfe) {
 			final CorruptObjectException coe;
-			coe = new CorruptObjectException("Object at " + dataOffset + " in "
-					+ pack.getPackFile() + " has bad zlib stream");
+			coe = new CorruptObjectException("Object at " + objectOffset
+					+ " in " + pack.getPackFile() + " has bad zlib stream");
 			coe.initCause(dfe);
 			throw coe;
 		}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java
index 3616c41072061b6bd18f0c46dc2a5d49b5a3f727..9f7589c291238df7f5601cc453250d72c82449a1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DeltaRefPackedObjectLoader.java
@@ -54,10 +54,9 @@
 class DeltaRefPackedObjectLoader extends DeltaPackedObjectLoader {
 	private final ObjectId deltaBase;
 
-	DeltaRefPackedObjectLoader(final PackFile pr,
-			final long dataOffset, final long objectOffset, final int deltaSz,
-			final ObjectId base) {
-		super(pr, dataOffset, objectOffset, deltaSz);
+	DeltaRefPackedObjectLoader(final PackFile pr, final long objectOffset,
+			final int headerSz, final int deltaSz, final ObjectId base) {
+		super(pr, objectOffset, headerSz, deltaSz);
 		deltaBase = base;
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java
index b1d3886671058cc13ee11612eb46f7748bea842d..28edf30cd336c700f21907e7739ae3c5f6a926e6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackFile.java
@@ -269,13 +269,13 @@ final void copyRawData(final PackedObjectLoader loader,
 			final OutputStream out, final byte buf[], final WindowCursor curs)
 			throws IOException {
 		final long objectOffset = loader.objectOffset;
-		final long dataOffset = loader.dataOffset;
+		final long dataOffset = objectOffset + loader.headerSize;
 		final int cnt = (int) (findEndOffset(objectOffset) - dataOffset);
 		final PackIndex idx = idx();
 
 		if (idx.hasCRC32Support()) {
 			final CRC32 crc = new CRC32();
-			int headerCnt = (int) (dataOffset - objectOffset);
+			int headerCnt = loader.headerSize;
 			while (headerCnt > 0) {
 				final int toRead = Math.min(headerCnt, buf.length);
 				readFully(objectOffset, buf, 0, toRead, curs);
@@ -289,14 +289,14 @@ final void copyRawData(final PackedObjectLoader loader,
 			final ObjectId id = findObjectForOffset(objectOffset);
 			final long expected = idx.findCRC32(id);
 			if (computed != expected)
-				throw new CorruptObjectException("Object at " + dataOffset
+				throw new CorruptObjectException("Object at " + objectOffset
 						+ " in " + getPackFile() + " has bad zlib stream");
 		} else {
 			try {
 				curs.inflateVerify(this, dataOffset);
 			} catch (DataFormatException dfe) {
 				final CorruptObjectException coe;
-				coe = new CorruptObjectException("Object at " + dataOffset
+				coe = new CorruptObjectException("Object at " + objectOffset
 						+ " in " + getPackFile() + " has bad zlib stream");
 				coe.initCause(dfe);
 				throw coe;
@@ -473,8 +473,8 @@ private PackedObjectLoader reader(final WindowCursor curs,
 		case Constants.OBJ_TREE:
 		case Constants.OBJ_BLOB:
 		case Constants.OBJ_TAG:
-			return new WholePackedObjectLoader(this, objOffset + p, objOffset,
-					typeCode, (int) dataSize);
+			return new WholePackedObjectLoader(this, objOffset, p, typeCode,
+					(int) dataSize);
 
 		case Constants.OBJ_OFS_DELTA: {
 			c = ib[p++] & 0xff;
@@ -485,13 +485,13 @@ private PackedObjectLoader reader(final WindowCursor curs,
 				ofs <<= 7;
 				ofs += (c & 127);
 			}
-			return new DeltaOfsPackedObjectLoader(this, objOffset + p,
-					objOffset, (int) dataSize, objOffset - ofs);
+			return new DeltaOfsPackedObjectLoader(this, objOffset, p,
+					(int) dataSize, objOffset - ofs);
 		}
 		case Constants.OBJ_REF_DELTA: {
 			readFully(objOffset + p, ib, 0, 20, curs);
-			return new DeltaRefPackedObjectLoader(this, objOffset + p + 20,
-					objOffset, (int) dataSize, ObjectId.fromRaw(ib));
+			return new DeltaRefPackedObjectLoader(this, objOffset, p + 20,
+					(int) dataSize, ObjectId.fromRaw(ib));
 		}
 		default:
 			throw new IOException("Unknown object type " + typeCode + ".");
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java
index 4125579b2214126386fd8b98e914a4d2e350df39..026b008f1a43a15caa18bf085ef2c72daf19afe4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackedObjectLoader.java
@@ -55,21 +55,23 @@
 abstract class PackedObjectLoader extends ObjectLoader {
 	protected final PackFile pack;
 
-	protected final long dataOffset;
-
+	/** Position of the first byte of the object's header. */
 	protected final long objectOffset;
 
+	/** Bytes used to express the object header, including delta reference. */
+	protected final int headerSize;
+
 	protected int objectType;
 
 	protected int objectSize;
 
 	protected byte[] cachedBytes;
 
-	PackedObjectLoader(final PackFile pr, final long dataOffset,
-			final long objectOffset) {
+	PackedObjectLoader(final PackFile pr, final long objectOffset,
+			final int headerSize) {
 		pack = pr;
-		this.dataOffset = dataOffset;
 		this.objectOffset = objectOffset;
+		this.headerSize = headerSize;
 	}
 
 	/**
@@ -113,13 +115,6 @@ public final long getObjectOffset() {
 		return objectOffset;
 	}
 
-	/**
-	 * @return offset of object data within pack file
-	 */
-	public final long getDataOffset() {
-		return dataOffset;
-	}
-
 	/**
 	 * Peg the pack file open to support data copying.
 	 * <p>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java
index 31439d4891356b1ab6121a8bef2348c3ea30f1b4..5005d37f18d3c66332842adcdd954abc603ddaaf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/WholePackedObjectLoader.java
@@ -54,9 +54,9 @@
 class WholePackedObjectLoader extends PackedObjectLoader {
 	private static final int OBJ_COMMIT = Constants.OBJ_COMMIT;
 
-	WholePackedObjectLoader(final PackFile pr, final long dataOffset,
-			final long objectOffset, final int type, final int size) {
-		super(pr, dataOffset, objectOffset);
+	WholePackedObjectLoader(final PackFile pr, final long objectOffset,
+			final int headerSize, final int type, final int size) {
+		super(pr, objectOffset, headerSize);
 		objectType = type;
 		objectSize = size;
 	}
@@ -68,7 +68,7 @@ public void materialize(final WindowCursor curs) throws IOException {
 		}
 
 		if (objectType != OBJ_COMMIT) {
-			final UnpackedObjectCache.Entry cache = pack.readCache(dataOffset);
+			UnpackedObjectCache.Entry cache = pack.readCache(objectOffset);
 			if (cache != null) {
 				curs.release();
 				cachedBytes = cache.data;
@@ -77,14 +77,15 @@ public void materialize(final WindowCursor curs) throws IOException {
 		}
 
 		try {
-			cachedBytes = pack.decompress(dataOffset, objectSize, curs);
+			cachedBytes = pack.decompress(objectOffset + headerSize,
+					objectSize, curs);
 			curs.release();
 			if (objectType != OBJ_COMMIT)
-				pack.saveCache(dataOffset, cachedBytes, objectType);
+				pack.saveCache(objectOffset, cachedBytes, objectType);
 		} catch (DataFormatException dfe) {
 			final CorruptObjectException coe;
-			coe = new CorruptObjectException("Object at " + dataOffset + " in "
-					+ pack.getPackFile() + " has bad zlib stream");
+			coe = new CorruptObjectException("Object at " + objectOffset
+					+ " in " + pack.getPackFile() + " has bad zlib stream");
 			coe.initCause(dfe);
 			throw coe;
 		}