diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
index 84e55b61eacbca2b3539532c01eb19b361d1dd31..dc9c7948b60cf048f39c22a1c3b2605b435e4158 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
@@ -46,6 +46,7 @@
 package org.eclipse.jgit.transport;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -609,7 +610,11 @@ private void markCommon(final RevObject obj, final AckNackResult anr)
 	private void receivePack(final ProgressMonitor monitor) throws IOException {
 		final IndexPack ip;
 
-		ip = IndexPack.create(local, sideband ? pckIn.sideband(monitor) : in);
+		InputStream input = in;
+		if (sideband)
+			input = new SideBandInputStream(input, monitor);
+
+		ip = IndexPack.create(local, input);
 		ip.setFixThin(thinPack);
 		ip.setObjectChecking(transport.isCheckFetchedObjects());
 		ip.index(monitor);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
index db6abef1aca5e3ff3c9a11e6fad7d5f95a3f3640..1022eb2ee11a6a61bdc2e1bd046ad82a23d0d894 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
@@ -51,7 +51,6 @@
 import org.eclipse.jgit.errors.PackProtocolException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.MutableObjectId;
-import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.util.IO;
 import org.eclipse.jgit.util.RawParseUtils;
 
@@ -80,10 +79,6 @@ static enum AckNackResult {
 		lenbuffer = new byte[4];
 	}
 
-	InputStream sideband(final ProgressMonitor pm) {
-		return new SideBandInputStream(this, in, pm);
-	}
-
 	AckNackResult readACK(final MutableObjectId returnedId) throws IOException {
 		final String line = readString();
 		if (line.length() == 0)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
index 40a6808d25ddd6620be7bcf082a079238503d9d8..7b5422644a4135917b62e678dd9deac59385c834 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
@@ -44,6 +44,8 @@
 
 package org.eclipse.jgit.transport;
 
+import static org.eclipse.jgit.transport.SideBandOutputStream.HDR_SIZE;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.regex.Matcher;
@@ -69,7 +71,7 @@
  * Channel 3 results in an exception being thrown, as the remote side has issued
  * an unrecoverable error.
  *
- * @see PacketLineIn#sideband(ProgressMonitor)
+ * @see SideBandOutputStream
  */
 class SideBandInputStream extends InputStream {
 	static final int CH_DATA = 1;
@@ -84,9 +86,9 @@ class SideBandInputStream extends InputStream {
 	private static Pattern P_BOUNDED = Pattern.compile(
 			"^([\\w ]+):.*\\((\\d+)/(\\d+)\\).*", Pattern.DOTALL);
 
-	private final PacketLineIn pckIn;
+	private final InputStream rawIn;
 
-	private final InputStream in;
+	private final PacketLineIn pckIn;
 
 	private final ProgressMonitor monitor;
 
@@ -102,11 +104,10 @@ class SideBandInputStream extends InputStream {
 
 	private int available;
 
-	SideBandInputStream(final PacketLineIn aPckIn, final InputStream aIn,
-			final ProgressMonitor aProgress) {
-		pckIn = aPckIn;
-		in = aIn;
-		monitor = aProgress;
+	SideBandInputStream(final InputStream in, final ProgressMonitor progress) {
+		rawIn = in;
+		pckIn = new PacketLineIn(rawIn);
+		monitor = progress;
 		currentTask = "";
 	}
 
@@ -116,7 +117,7 @@ public int read() throws IOException {
 		if (eof)
 			return -1;
 		available--;
-		return in.read();
+		return rawIn.read();
 	}
 
 	@Override
@@ -126,7 +127,7 @@ public int read(final byte[] b, int off, int len) throws IOException {
 			needDataPacket();
 			if (eof)
 				break;
-			final int n = in.read(b, off, Math.min(len, available));
+			final int n = rawIn.read(b, off, Math.min(len, available));
 			if (n < 0)
 				break;
 			r += n;
@@ -147,8 +148,8 @@ private void needDataPacket() throws IOException {
 				return;
 			}
 
-			channel = in.read();
-			available -= 5; // length header plus channel indicator
+			channel = rawIn.read();
+			available -= HDR_SIZE; // length header plus channel indicator
 			if (available == 0)
 				continue;
 
@@ -157,7 +158,6 @@ private void needDataPacket() throws IOException {
 				return;
 			case CH_PROGRESS:
 				progress(readString(available));
-
 				continue;
 			case CH_ERROR:
 				eof = true;
@@ -229,7 +229,7 @@ private boolean doProgressLine(final String msg) {
 
 	private String readString(final int len) throws IOException {
 		final byte[] raw = new byte[len];
-		IO.readFully(in, raw, 0, len);
+		IO.readFully(rawIn, raw, 0, len);
 		return RawParseUtils.decode(Constants.CHARSET, raw, 0, len);
 	}
 }