diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
index f2715aca2b46fed453cb1d05626223ab6ef9453d..9129ece09770a388a95dd57754869eda8a2ed9e1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
@@ -47,7 +47,6 @@
 import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
-import java.util.concurrent.atomic.AtomicInteger;
 
 /** Thread to copy from an input stream to an output stream. */
 public class StreamCopyThread extends Thread {
@@ -57,8 +56,6 @@ public class StreamCopyThread extends Thread {
 
 	private final OutputStream dst;
 
-	private final AtomicInteger flushCounter = new AtomicInteger(0);
-
 	private volatile boolean done;
 
 	/**
@@ -85,7 +82,6 @@ public StreamCopyThread(final InputStream i, final OutputStream o) {
 	 * the request.
 	 */
 	public void flush() {
-		flushCounter.incrementAndGet();
 		interrupt();
 	}
 
@@ -113,10 +109,13 @@ public void halt() throws InterruptedException {
 	public void run() {
 		try {
 			final byte[] buf = new byte[BUFFER_SIZE];
+			int interruptCounter = 0;
 			for (;;) {
 				try {
-					if (needFlush())
+					if (interruptCounter > 0) {
 						dst.flush();
+						interruptCounter--;
+					}
 
 					if (done)
 						break;
@@ -125,17 +124,25 @@ public void run() {
 					try {
 						n = src.read(buf);
 					} catch (InterruptedIOException wakey) {
+						interruptCounter++;
 						continue;
 					}
 					if (n < 0)
 						break;
 
+					boolean writeInterrupted = false;
 					for (;;) {
 						try {
 							dst.write(buf, 0, n);
 						} catch (InterruptedIOException wakey) {
+							writeInterrupted = true;
 							continue;
 						}
+
+						// set interrupt status, which will be checked
+						// when we block in src.read
+						if (writeInterrupted)
+							interrupt();
 						break;
 					}
 				} catch (IOException e) {
@@ -155,13 +162,4 @@ public void run() {
 			}
 		}
 	}
-
-	private boolean needFlush() {
-		int i = flushCounter.get();
-		if (i > 0) {
-			flushCounter.decrementAndGet();
-			return true;
-		}
-		return false;
-	}
 }