diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
index a2c572c601fda3c151e104df986f6e1b69be63ae..7b6d3e121aad4e070440b31063d6b5841f4488a1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
@@ -282,8 +282,10 @@ private PackProtocolException duplicateAdvertisement(final String name) {
 	public void close() {
 		if (out != null) {
 			try {
-				if (outNeedsEnd)
+				if (outNeedsEnd) {
+					outNeedsEnd = false;
 					pckOut.end();
+				}
 				out.close();
 			} catch (IOException err) {
 				// Ignore any close errors.
@@ -314,4 +316,23 @@ public void close() {
 			}
 		}
 	}
+
+	/** Tell the peer we are disconnecting, if it cares to know. */
+	protected void endOut() {
+		if (outNeedsEnd && out != null) {
+			try {
+				outNeedsEnd = false;
+				pckOut.end();
+			} catch (IOException e) {
+				try {
+					out.close();
+				} catch (IOException err) {
+					// Ignore any close errors.
+				} finally {
+					out = null;
+					pckOut = null;
+				}
+			}
+		}
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
index d4d4f5412fc7894a863c139b6c73f0d1048880c1..fb2038b8629f8d66a9bf7c24accc13c12e08f15a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
@@ -264,6 +264,8 @@ class SshFetchConnection extends BasePackFetchConnection {
 
 		@Override
 		public void close() {
+			endOut();
+
 			if (errorThread != null) {
 				try {
 					errorThread.join();
@@ -331,6 +333,8 @@ class SshPushConnection extends BasePackPushConnection {
 
 		@Override
 		public void close() {
+			endOut();
+
 			if (errorThread != null) {
 				try {
 					errorThread.join();