Merge branch 'master' into stable-5.7

* master:
  Use lambdas where possible
  Upgrade maven-pmd-plugin to 3.13.0
  Include org.apache.commons.codec 1.13 in the JGit http.apache.feature
  Update Maven plugins
  AmazonS3: Speed up fetch, try recent packs first
  Update orbit to S20200128200239 for 2020-03 M2
  FS: re-order fields and use all uppercase for true constants
  FS: Don't use innocuous threads for CompletableFuture
  ErrorProne: Enable and fix UnusedException check
  Update Orbit to I20200126235943 and org.junit to 4.13.0.v20200126-2018
  Fix SshSessionFactory#setInstance to use service loader
  Use ServiceLoader to define the default SSH session factory.
  Remove Error-Prone ExpectedExceptionChecker
  ReceivePack: enable overriding filterCommands and executeCommands
  Replace ExpectedException which was deprecated in junit 4.13
  Add org.assertj 3.14.0.v20200120-1926 to target platform
  Replace deprecated junit assertion methods with hamcrest
  Update to Orbit I20200120214610 and JUnit to 4.13
  Update to Tycho 1.6.0
  Extract method refactoring in class DirCacheCheckout
  Update Orbit to I20200115225246 and update dependencies
  Update bazlets and bazel version

Change-Id: Ib6cd6593484cd79def9d5298181411189575c9f7
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
diff --git a/WORKSPACE b/WORKSPACE
index 547c439..5fa28f9 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -77,20 +77,20 @@
 
 maven_jar(
     name = "javaewah",
-    artifact = "com.googlecode.javaewah:JavaEWAH:1.1.6",
-    sha1 = "94ad16d728b374d65bd897625f3fbb3da223a2b6",
+    artifact = "com.googlecode.javaewah:JavaEWAH:1.1.7",
+    sha1 = "570dde3cd706ae10c62fe19b150928cfdb415e87",
 )
 
 maven_jar(
     name = "httpclient",
-    artifact = "org.apache.httpcomponents:httpclient:4.5.6",
-    sha1 = "1afe5621985efe90a92d0fbc9be86271efbe796f",
+    artifact = "org.apache.httpcomponents:httpclient:4.5.10",
+    sha1 = "7ca2e4276f4ef95e4db725a8cd4a1d1e7585b9e5",
 )
 
 maven_jar(
     name = "httpcore",
-    artifact = "org.apache.httpcomponents:httpcore:4.4.10",
-    sha1 = "acc54d9b28bdffe4bbde89ed2e4a1e86b5285e2b",
+    artifact = "org.apache.httpcomponents:httpcore:4.4.12",
+    sha1 = "21ebaf6d532bc350ba95bd81938fa5f0e511c132",
 )
 
 maven_jar(
@@ -107,8 +107,8 @@
 
 maven_jar(
     name = "commons-codec",
-    artifact = "commons-codec:commons-codec:1.10",
-    sha1 = "4b95f4897fa13f2cd904aee711aeafc0c5295cd8",
+    artifact = "commons-codec:commons-codec:1.13",
+    sha1 = "3f18e1aa31031d89db6f01ba05d501258ce69d2c",
 )
 
 maven_jar(
@@ -137,8 +137,8 @@
 
 maven_jar(
     name = "commons-compress",
-    artifact = "org.apache.commons:commons-compress:1.18",
-    sha1 = "1191f9f2bc0c47a8cce69193feb1ff0a8bcb37d5",
+    artifact = "org.apache.commons:commons-compress:1.19",
+    sha1 = "7e65777fb451ddab6a9c054beb879e521b7eab78",
 )
 
 maven_jar(
@@ -155,8 +155,8 @@
 
 maven_jar(
     name = "junit",
-    artifact = "junit:junit:4.12",
-    sha1 = "2973d150c0dc1fefe998f834810d68f278ea58ec",
+    artifact = "junit:junit:4.13",
+    sha1 = "e49ccba652b735c93bd6e6f59760d8254cf597dd",
 )
 
 maven_jar(
@@ -177,6 +177,12 @@
     sha1 = "497ddb32fd5d01f9dbe99a2ec790aeb931dff1b1",
 )
 
+maven_jar(
+    name = "assertj-core",
+    artifact = "org.assertj:assertj-core:3.14.0",
+    sha1 = "3b7b0fcac821f3d167764e9926573cd64f78f9e9",
+)
+
 BYTE_BUDDY_VERSION = "1.9.0"
 
 maven_jar(
@@ -203,48 +209,48 @@
     sha1 = "3edcfe49d2c6053a70a2a47e4e1c2f94998a49cf",
 )
 
-JETTY_VER = "9.4.24.v20191120"
+JETTY_VER = "9.4.25.v20191220"
 
 maven_jar(
     name = "jetty-servlet",
     artifact = "org.eclipse.jetty:jetty-servlet:" + JETTY_VER,
-    sha1 = "ca1803fde51b795c0a8346ca8bc6277d9d04d01d",
-    src_sha1 = "8781c162df92d27456d4370df943f6a5234f32c4",
+    sha1 = "bee77d6a4f87dc90d5bc142cbd6cef470ec46aae",
+    src_sha1 = "e8b09b6431fc9cfbff588698ac0262a745fe00e4",
 )
 
 maven_jar(
     name = "jetty-security",
     artifact = "org.eclipse.jetty:jetty-security:" + JETTY_VER,
-    sha1 = "9fa640d36c088cf55843900043d28aef830ade4d",
-    src_sha1 = "40128e3547b43f09e176fb0738672f483c477119",
+    sha1 = "593ff5b5dfd5bf973184329f5d1209b9a411ec12",
+    src_sha1 = "369f869a13a33d25535db3176a84945e94a3718a",
 )
 
 maven_jar(
     name = "jetty-server",
     artifact = "org.eclipse.jetty:jetty-server:" + JETTY_VER,
-    sha1 = "7885cc3d5d7701a444acada7ab97f89846514875",
-    src_sha1 = "709650068c26029303ab3776d1e5ed6a66e0b065",
+    sha1 = "5b352c9f9135a1c20e4808e5cb1d84fbddfdc460",
+    src_sha1 = "0f3acc2abcdb86491a2c37074592860cb1100269",
 )
 
 maven_jar(
     name = "jetty-http",
     artifact = "org.eclipse.jetty:jetty-http:" + JETTY_VER,
-    sha1 = "d3f0b0fb016ef8d35ffb199d928ffbcbfa121c86",
-    src_sha1 = "b29d870576e3edff354af0dae86c60d5956cd643",
+    sha1 = "c3aa7da362f1a492667ce754ba16b2535b793668",
+    src_sha1 = "70ef1436dc895eafe2cc24cf59af6e2d2874d963",
 )
 
 maven_jar(
     name = "jetty-io",
     artifact = "org.eclipse.jetty:jetty-io:" + JETTY_VER,
-    sha1 = "dcb6d4d505ef74898e3a64a38c40195c01e97119",
-    src_sha1 = "863a6c575eadb626b50cda13a6484609a9449934",
+    sha1 = "3eb34b5481012701de0ea9dfaf2bdf1dbb947b16",
+    src_sha1 = "ad129617793088aaf69eab18a13c9bce02cb1195",
 )
 
 maven_jar(
     name = "jetty-util",
     artifact = "org.eclipse.jetty:jetty-util:" + JETTY_VER,
-    sha1 = "3095acb088f4ff9e3fd9aedf98db73e3c18ea849",
-    src_sha1 = "f503199317d9df74062d722db4a7af8cf5e59322",
+    sha1 = "fd8b642cc16728f1c36ca6a64653cb1b26ec0232",
+    src_sha1 = "c84dc3026cc4aea013dc97b18228756816167745",
 )
 
 BOUNCYCASTLE_VER = "1.64"
diff --git a/lib/BUILD b/lib/BUILD
index 058899f..6c97486 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -214,6 +214,15 @@
 )
 
 java_library(
+    name = "assertj-core",
+    testonly = 1,
+    visibility = ["//visibility:public"],
+    exports = [
+        "@assertj-core//jar",
+    ],
+)
+
+java_library(
     name = "servlet-api",
     visibility = [
         "//org.eclipse.jgit.http.apache:__pkg__",
diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
index a8e76b2..95a6da3 100644
--- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
@@ -14,4 +14,4 @@
  org.eclipse.jgit.lib;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.12,5.0.0)"
+ org.junit;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.benchmarks/pom.xml b/org.eclipse.jgit.benchmarks/pom.xml
index 426fb7f..5e70771 100644
--- a/org.eclipse.jgit.benchmarks/pom.xml
+++ b/org.eclipse.jgit.benchmarks/pom.xml
@@ -69,9 +69,6 @@
             <configuration>
               <compilerId>javac-with-errorprone</compilerId>
               <forceJavacCompilerUse>true</forceJavacCompilerUse>
-              <compilerArgs>
-                <arg>-Xep:ExpectedExceptionChecker:ERROR</arg>
-              </compilerArgs>
             </configuration>
           </execution>
         </executions>
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java
index 9b17132..1769832 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java
@@ -298,7 +298,8 @@
 		try {
 			return StringUtils.toBoolean(n);
 		} catch (IllegalArgumentException err) {
-			throw new ServletException(MessageFormat.format(HttpServerText.get().invalidBoolean, param, n));
+			throw new ServletException(MessageFormat.format(
+					HttpServerText.get().invalidBoolean, param, n), err);
 		}
 	}
 
diff --git a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
index d4ea158..ad9413f 100644
--- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
@@ -49,8 +49,8 @@
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.hamcrest;version="[1.1.0,2.0.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.rules;version="[4.12,5.0.0)",
- org.junit.runner;version="[4.12,5.0.0)",
- org.junit.runners;version="[4.12,5.0.0)"
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.rules;version="[4.13,5.0.0)",
+ org.junit.runner;version="[4.13,5.0.0)",
+ org.junit.runners;version="[4.13,5.0.0)"
 Require-Bundle: org.hamcrest.library;bundle-version="[1.1.0,2.0.0)"
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java
index 7b14288..9665776 100644
--- a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java
@@ -10,12 +10,12 @@
 
 package org.eclipse.jgit.http.test;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
index 9a7c077..51a7a8d 100644
--- a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
@@ -18,6 +18,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -88,18 +89,12 @@
 import org.eclipse.jgit.transport.http.HttpConnectionFactory;
 import org.eclipse.jgit.util.HttpSupport;
 import org.eclipse.jgit.util.SystemReader;
-import org.hamcrest.Matchers;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class SmartClientSmartServerTest extends AllFactoriesHttpTestCase {
 	private static final String HDR_TRANSFER_ENCODING = "Transfer-Encoding";
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	private AdvertiseRefsHook advertiseRefsHook;
 
 	private Repository remoteRepository;
@@ -462,11 +457,12 @@
 		try (Repository dst = createBareRepository();
 				Transport t = Transport.open(dst, remoteURI)) {
 			assertFalse(dst.getObjectDatabase().has(A_txt));
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
+			Exception e = assertThrows(TransportException.class,
+					() -> t.fetch(NullProgressMonitor.INSTANCE,
+							Collections.singletonList(
+									new RefSpec(unreachableCommit.name()))));
+			assertTrue(e.getMessage().contains(
 					"want " + unreachableCommit.name() + " not valid"));
-			t.fetch(NullProgressMonitor.INSTANCE, Collections
-					.singletonList(new RefSpec(unreachableCommit.name())));
 		}
 	}
 
@@ -484,11 +480,11 @@
 		try (Repository dst = createBareRepository();
 				Transport t = Transport.open(dst, remoteURI)) {
 			assertFalse(dst.getObjectDatabase().has(A_txt));
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + A.name() + " not valid"));
-			t.fetch(NullProgressMonitor.INSTANCE, Collections
-					.singletonList(new RefSpec(A.name())));
+			Exception e = assertThrows(TransportException.class,
+					() -> t.fetch(NullProgressMonitor.INSTANCE,
+							Collections.singletonList(new RefSpec(A.name()))));
+			assertTrue(
+					e.getMessage().contains("want " + A.name() + " not valid"));
 		}
 	}
 
diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
index 5c889f6..a622488 100644
--- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
@@ -30,7 +30,7 @@
  org.eclipse.jgit.revwalk;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.transport;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.transport.resolver;version="[5.7.0,5.8.0)",
- org.junit;version="[4.12,5.0.0)"
+ org.junit;version="[4.13,5.0.0)"
 Export-Package: org.eclipse.jgit.junit.http;version="5.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.junit,
diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
index 871e329..531f3be 100644
--- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
@@ -25,11 +25,11 @@
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util.io;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util.time;version="[5.7.0,5.8.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.rules;version="[4.12,5.0.0)",
- org.junit.runner;version="[4.12,5.0.0)",
- org.junit.runners;version="[4.12,5.0.0)",
- org.junit.runners.model;version="[4.12,5.0.0)",
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.rules;version="[4.13,5.0.0)",
+ org.junit.runner;version="[4.13,5.0.0)",
+ org.junit.runners;version="[4.13,5.0.0)",
+ org.junit.runners.model;version="[4.13,5.0.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
 Export-Package: org.eclipse.jgit.junit;version="5.7.0";
   uses:="org.eclipse.jgit.dircache,
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
index d68c5c8..a5b3b1f 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
@@ -973,7 +973,7 @@
 		try {
 			lck.write(bin);
 		} catch (IOException ioe) {
-			throw new ObjectWritingException("Can't write " + p);
+			throw new ObjectWritingException("Can't write " + p, ioe);
 		}
 		if (!lck.commit())
 			throw new ObjectWritingException("Can't write " + p);
diff --git a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
index c4d3c90..ac7ee5f 100644
--- a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
@@ -47,7 +47,7 @@
  org.eclipse.jgit.treewalk.filter;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.rules;version="[4.12,5.0.0)",
- org.junit.runner;version="[4.12,5.0.0)",
- org.junit.runners;version="[4.12,5.0.0)"
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.rules;version="[4.13,5.0.0)",
+ org.junit.runner;version="[4.13,5.0.0)",
+ org.junit.runners;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java b/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java
index d295414..8d32f9e 100644
--- a/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java
+++ b/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java
@@ -12,6 +12,7 @@
 import static org.apache.http.HttpStatus.SC_NOT_FOUND;
 import static org.apache.http.HttpStatus.SC_UNPROCESSABLE_ENTITY;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -22,15 +23,10 @@
 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
 import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
 import org.eclipse.jgit.util.FileUtils;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class DownloadTest extends LfsServerTest {
 
-	@Rule
-	public ExpectedException exception = ExpectedException.none();
-
 	@Test
 	public void testDownload() throws Exception {
 		String TEXT = "test";
@@ -49,10 +45,8 @@
 		Path f = Paths.get(getTempDirectory().toString(), "download");
 		String error = String.format(
 				"Invalid pathInfo: '/%s' does not match '/{SHA-256}'", id);
-		exception.expect(RuntimeException.class);
-		exception.expectMessage(
-				formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error));
-		getContent(id, f);
+		assertThrows(formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error),
+				RuntimeException.class, () -> getContent(id, f));
 	}
 
 	@Test
@@ -62,22 +56,18 @@
 		String id = putContent(TEXT).name().replace('f', 'z');
 		Path f = Paths.get(getTempDirectory().toString(), "download");
 		String error = String.format("Invalid id: %s", id);
-		exception.expect(RuntimeException.class);
-		exception.expectMessage(
-				formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error));
-		getContent(id, f);
+		assertThrows(formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error),
+				RuntimeException.class, () -> getContent(id, f));
 	}
 
 	@Test
-	public void testDownloadNotFound()
-			throws ClientProtocolException, IOException {
+	public void testDownloadNotFound() {
 		String TEXT = "test";
 		AnyLongObjectId id = LongObjectIdTestUtils.hash(TEXT);
 		Path f = Paths.get(getTempDirectory().toString(), "download");
 		String error = String.format("Object '%s' not found", id.getName());
-		exception.expect(RuntimeException.class);
-		exception.expectMessage(formatErrorMessage(SC_NOT_FOUND, error));
-		getContent(id, f);
+		assertThrows(formatErrorMessage(SC_NOT_FOUND, error),
+				RuntimeException.class, () -> getContent(id, f));
 	}
 
 	@SuppressWarnings("boxing")
diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
index e3fcf70..2682ba6 100644
--- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
@@ -18,7 +18,7 @@
  org.eclipse.jgit.treewalk.filter;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.runner;version="[4.12,5.0.0)",
- org.junit.runners;version="[4.12,5.0.0)"
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.runner;version="[4.13,5.0.0)",
+ org.junit.runners;version="[4.13,5.0.0)"
 Export-Package: org.eclipse.jgit.lfs.test;version="5.7.0";x-friends:="org.eclipse.jgit.lfs.server.test"
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java
index c4a51c7..55d2cfa 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java
@@ -18,7 +18,6 @@
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;
-import java.nio.charset.UnsupportedCharsetException;
 import java.util.Locale;
 
 import org.eclipse.jgit.annotations.Nullable;
@@ -110,7 +109,6 @@
 			ps.print(size + "\n"); //$NON-NLS-1$
 		} catch (UnsupportedEncodingException e) {
 			// should not happen, we are using a standard charset
-			throw new UnsupportedCharsetException(UTF_8.name());
 		}
 	}
 
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
index a2bcc35..9016e53 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
@@ -121,8 +121,11 @@
 			final long c = hexUInt64(bs, ptr + 32, end);
 			final long d = hexUInt64(bs, ptr + 48, end);
 			return new AbbreviatedLongObjectId(end - ptr, a, b, c, d);
-		} catch (ArrayIndexOutOfBoundsException e1) {
-			throw new InvalidLongObjectIdException(bs, ptr, end - ptr);
+		} catch (ArrayIndexOutOfBoundsException e) {
+			InvalidLongObjectIdException e1 = new InvalidLongObjectIdException(
+					bs, ptr, end - ptr);
+			e1.initCause(e);
+			throw e1;
 		}
 	}
 
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
index 000e9b2..15b3ca4 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
@@ -223,9 +223,11 @@
 			final long c = RawParseUtils.parseHexInt64(bs, p + 32);
 			final long d = RawParseUtils.parseHexInt64(bs, p + 48);
 			return new LongObjectId(a, b, c, d);
-		} catch (ArrayIndexOutOfBoundsException e1) {
-			throw new InvalidLongObjectIdException(bs, p,
-					Constants.LONG_OBJECT_ID_STRING_LENGTH);
+		} catch (ArrayIndexOutOfBoundsException e) {
+			InvalidLongObjectIdException e1 = new InvalidLongObjectIdException(
+					bs, p, Constants.LONG_OBJECT_ID_STRING_LENGTH);
+			e1.initCause(e);
+			throw e1;
 		}
 	}
 
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
index 368f6af..012e4ae 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
@@ -213,9 +213,11 @@
 			w2 = RawParseUtils.parseHexInt64(bs, p + 16);
 			w3 = RawParseUtils.parseHexInt64(bs, p + 32);
 			w4 = RawParseUtils.parseHexInt64(bs, p + 48);
-		} catch (ArrayIndexOutOfBoundsException e1) {
-			throw new InvalidLongObjectIdException(bs, p,
-					Constants.LONG_OBJECT_ID_STRING_LENGTH);
+		} catch (ArrayIndexOutOfBoundsException e) {
+			InvalidLongObjectIdException e1 = new InvalidLongObjectIdException(
+					bs, p, Constants.LONG_OBJECT_ID_STRING_LENGTH);
+			e1.initCause(e);
+			throw e1;
 		}
 	}
 
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
index 17a732b..8da6001 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
@@ -47,4 +47,11 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.apache.commons.codec"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target
index 3cfe1b3..f49adf9 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.10" sequenceNumber="1579097942">
+<target name="jgit-4.10" sequenceNumber="1580289401">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.tpd
index 19ebf13..fc18203 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.10" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/2018-12/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target
index b42ae57..e68ab63 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.11" sequenceNumber="1579098001">
+<target name="jgit-4.11" sequenceNumber="1580289407">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.tpd
index b54e177..dd1f624 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.11" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/2019-03/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target
index 3b27528..e83924c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.12" sequenceNumber="1579098008">
+<target name="jgit-4.12" sequenceNumber="1580289407">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.tpd
index fe5a8d6..bf32ed9 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.12" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/2019-06/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target
index c87f25d..c79f206 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.13" sequenceNumber="1579098020">
+<target name="jgit-4.13" sequenceNumber="1580289407">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.tpd
index caeae9c..e46a5df 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.13" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/2019-09/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target
index 92e6794..39f52ac 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.14-staging" sequenceNumber="1579098018">
+<target name="jgit-4.14-staging" sequenceNumber="1580289404">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.tpd
index 0b61b90..d1f0d49 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.14-staging" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/staging/2019-12/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target
index c77b6fc..4d862e2 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.6" sequenceNumber="1579098032">
+<target name="jgit-4.6" sequenceNumber="1580289424">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd
index 895f37c..eb3f96d 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.6" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/neon/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target
index 5fbe5e9..780b668a 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.7" sequenceNumber="1579098024">
+<target name="jgit-4.7" sequenceNumber="1580289413">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd
index 19a733b..cb98e4c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.7" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/oxygen/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target
index c4c5799..596cd69 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.8" sequenceNumber="1579098020">
+<target name="jgit-4.8" sequenceNumber="1580289407">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd
index 1aad52a..e0d886a 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.8" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/photon/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target
index de451fd..7da901f 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.9" sequenceNumber="1579098020">
+<target name="jgit-4.9" sequenceNumber="1580289407">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.jetty.client" version="9.4.25.v20191220"/>
@@ -29,8 +29,8 @@
       <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
       <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
       <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
-      <unit id="javaewah" version="1.1.6.v20160919-1400"/>
-      <unit id="javaewah.source" version="1.1.6.v20160919-1400"/>
+      <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+      <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
       <unit id="javax.servlet" version="3.1.0.v201410161800"/>
       <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
       <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
@@ -41,22 +41,24 @@
       <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
       <unit id="org.apache.ant" version="1.10.7.v20190926-0324"/>
       <unit id="org.apache.ant.source" version="1.10.7.v20190926-0324"/>
-      <unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
-      <unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
-      <unit id="org.apache.commons.compress.source" version="1.18.0.v20181121-2221"/>
+      <unit id="org.apache.commons.codec" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.codec.source" version="1.13.0.v20200108-0001"/>
+      <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+      <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
       <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
       <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.6.v20190503-0009"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.4.10.v20190123-2214"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200114-1512"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.apache.sshd.osgi" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
       <unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
+      <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+      <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
       <unit id="org.bouncycastle.bcpg" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpg.source" version="1.64.0.v20191109-0815"/>
       <unit id="org.bouncycastle.bcpkix" version="1.64.0.v20191109-0815"/>
@@ -68,8 +70,8 @@
       <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
       <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
-      <unit id="org.junit" version="4.12.0.v201504281640"/>
-      <unit id="org.junit.source" version="4.12.0.v201504281640"/>
+      <unit id="org.junit" version="4.13.0.v20200128-1312"/>
+      <unit id="org.junit.source" version="4.13.0.v20200128-1312"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
       <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
       <unit id="org.mockito" version="2.23.0.v20190527-1420"/>
@@ -82,7 +84,7 @@
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
       <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
       <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
-      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20191126223242/repository"/>
+      <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.tpd
index 9ab5a59..32321d8 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.9" with source configurePhase
 
 include "projects/jetty-9.4.x.tpd"
-include "orbit/R20191126223242-2019-12.tpd"
+include "orbit/staging-2020-03.tpd"
 
 location "http://download.eclipse.org/releases/2018-09/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd
new file mode 100644
index 0000000..9269a64
--- /dev/null
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd
@@ -0,0 +1,67 @@
+target "staging-2020-03" with source configurePhase
+// see http://download.eclipse.org/tools/orbit/downloads/
+
+location "https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository" {
+	com.google.gson [2.8.2.v20180104-1110,2.8.2.v20180104-1110]
+	com.google.gson.source [2.8.2.v20180104-1110,2.8.2.v20180104-1110]
+	com.jcraft.jsch [0.1.55.v20190404-1902,0.1.55.v20190404-1902]
+	com.jcraft.jsch.source [0.1.55.v20190404-1902,0.1.55.v20190404-1902]
+	com.jcraft.jzlib [1.1.1.v201205102305,1.1.1.v201205102305]
+	com.jcraft.jzlib.source [1.1.1.v201205102305,1.1.1.v201205102305]
+	javaewah [1.1.7.v20200107-0831,1.1.7.v20200107-0831]
+	javaewah.source [1.1.7.v20200107-0831,1.1.7.v20200107-0831]
+	javax.servlet [3.1.0.v201410161800,3.1.0.v201410161800]
+	javax.servlet.source [3.1.0.v201410161800,3.1.0.v201410161800]
+	net.bytebuddy.byte-buddy [1.9.0.v20181107-1410,1.9.0.v20181107-1410]
+	net.bytebuddy.byte-buddy-agent [1.9.0.v20181106-1534,1.9.0.v20181106-1534]
+	net.bytebuddy.byte-buddy-agent.source [1.9.0.v20181106-1534,1.9.0.v20181106-1534]
+	net.bytebuddy.byte-buddy.source [1.9.0.v20181107-1410,1.9.0.v20181107-1410]
+	net.i2p.crypto.eddsa [0.3.0.v20181102-1323,0.3.0.v20181102-1323]
+	net.i2p.crypto.eddsa.source [0.3.0.v20181102-1323,0.3.0.v20181102-1323]
+	org.apache.ant [1.10.7.v20190926-0324,1.10.7.v20190926-0324]
+	org.apache.ant.source [1.10.7.v20190926-0324,1.10.7.v20190926-0324]
+	org.apache.commons.codec [1.13.0.v20200108-0001,1.13.0.v20200108-0001]
+	org.apache.commons.codec.source [1.13.0.v20200108-0001,1.13.0.v20200108-0001]
+	org.apache.commons.compress [1.19.0.v20200106-2343,1.19.0.v20200106-2343]
+	org.apache.commons.compress.source [1.19.0.v20200106-2343,1.19.0.v20200106-2343]
+	org.apache.commons.logging [1.2.0.v20180409-1502,1.2.0.v20180409-1502]
+	org.apache.commons.logging.source [1.2.0.v20180409-1502,1.2.0.v20180409-1502]
+	org.apache.httpcomponents.httpclient [4.5.10.v20200114-1512,4.5.10.v20200114-1512]
+	org.apache.httpcomponents.httpclient.source [4.5.10.v20200114-1512,4.5.10.v20200114-1512]
+	org.apache.httpcomponents.httpcore [4.4.12.v20200108-1212,4.4.12.v20200108-1212]
+	org.apache.httpcomponents.httpcore.source [4.4.12.v20200108-1212,4.4.12.v20200108-1212]
+	org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
+	org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
+	org.apache.sshd.osgi [2.2.0.v20190425-2127,2.2.0.v20190425-2127]
+	org.apache.sshd.osgi.source [2.2.0.v20190425-2127,2.2.0.v20190425-2127]
+	org.apache.sshd.sftp [2.2.0.v20190425-2127,2.2.0.v20190425-2127]
+	org.apache.sshd.sftp.source [2.2.0.v20190425-2127,2.2.0.v20190425-2127]
+	org.assertj [3.14.0.v20200120-1926,3.14.0.v20200120-1926]
+	org.assertj.source [3.14.0.v20200120-1926,3.14.0.v20200120-1926]
+	org.bouncycastle.bcpg [1.64.0.v20191109-0815,1.64.0.v20191109-0815]
+	org.bouncycastle.bcpg.source [1.64.0.v20191109-0815,1.64.0.v20191109-0815]
+	org.bouncycastle.bcpkix [1.64.0.v20191109-0815,1.64.0.v20191109-0815]
+	org.bouncycastle.bcpkix.source [1.64.0.v20191109-0815,1.64.0.v20191109-0815]
+	org.bouncycastle.bcprov [1.64.0.v20191109-0815,1.64.0.v20191109-0815]
+	org.bouncycastle.bcprov.source [1.64.0.v20191109-0815,1.64.0.v20191109-0815]
+	org.hamcrest [1.1.0.v20090501071000,1.1.0.v20090501071000]
+	org.hamcrest.core [1.3.0.v20180420-1519,1.3.0.v20180420-1519]
+	org.hamcrest.core.source [1.3.0.v20180420-1519,1.3.0.v20180420-1519]
+	org.hamcrest.library [1.3.0.v20180524-2246,1.3.0.v20180524-2246]
+	org.hamcrest.library.source [1.3.0.v20180524-2246,1.3.0.v20180524-2246]
+	org.junit [4.13.0.v20200128-1312,4.13.0.v20200128-1312]
+	org.junit.source [4.13.0.v20200128-1312,4.13.0.v20200128-1312]
+	org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
+	org.kohsuke.args4j.source [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
+	org.mockito [2.23.0.v20190527-1420,2.23.0.v20190527-1420]
+	org.mockito.source [2.23.0.v20190527-1420,2.23.0.v20190527-1420]
+	org.objenesis [2.6.0.v20180420-1519,2.6.0.v20180420-1519]
+	org.objenesis.source [2.6.0.v20180420-1519,2.6.0.v20180420-1519]
+	org.slf4j.api [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
+	org.slf4j.api.source [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
+	org.slf4j.impl.log4j12 [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
+	org.slf4j.impl.log4j12.source [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
+	org.tukaani.xz [1.8.0.v20180207-1613,1.8.0.v20180207-1613]
+	org.tukaani.xz.source [1.8.0.v20180207-1613,1.8.0.v20180207-1613]
+}
+
diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml
index ae77778..35caa3e 100644
--- a/org.eclipse.jgit.packaging/pom.xml
+++ b/org.eclipse.jgit.packaging/pom.xml
@@ -22,7 +22,7 @@
   <name>JGit Tycho Parent</name>
 
   <properties>
-    <tycho-version>1.5.1</tycho-version>
+    <tycho-version>1.6.0</tycho-version>
     <tycho-extras-version>${tycho-version}</tycho-extras-version>
     <target-platform>jgit-4.6</target-platform>
   </properties>
diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
index b48c1e5..a7a11b4 100644
--- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
@@ -26,7 +26,7 @@
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util.io;version="[5.7.0,5.8.0)",
  org.hamcrest.core;bundle-version="[1.1.0,2.0.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.rules;version="[4.12,5.0.0)",
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.rules;version="[4.13,5.0.0)",
  org.kohsuke.args4j;version="[2.33.0,3.0.0)"
 Require-Bundle: org.tukaani.xz;bundle-version="[1.3.0,2.0.0)"
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/BlameTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/BlameTest.java
index 006039b..ea30433 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/BlameTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/BlameTest.java
@@ -9,6 +9,7 @@
  */
 package org.eclipse.jgit.pgm;
 
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import org.eclipse.jgit.api.Git;
@@ -17,24 +18,18 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class BlameTest extends CLIRepositoryTestCase {
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	@Test
 	public void testBlameNoHead() throws Exception {
 		try (Git git = new Git(db)) {
 			writeTrashFile("inIndex.txt", "index");
 			git.add().addFilepattern("inIndex.txt").call();
 		}
-		thrown.expect(Die.class);
-		thrown.expectMessage("no such ref: HEAD");
-		execute("git blame inIndex.txt");
+		assertThrows("no such ref: HEAD", Die.class,
+				() -> execute("git blame inIndex.txt"));
 	}
 
 	@Test
@@ -68,9 +63,8 @@
 			git.commit().setMessage("initial commit").call();
 		}
 		writeTrashFile("onlyInWorkingTree.txt", "not in repo");
-		thrown.expect(Die.class);
-		thrown.expectMessage("no such path 'onlyInWorkingTree.txt' in HEAD");
-		execute("git blame onlyInWorkingTree.txt");
+		assertThrows("no such path 'onlyInWorkingTree.txt' in HEAD", Die.class,
+				() -> execute("git blame onlyInWorkingTree.txt"));
 	}
 
 	@Test
@@ -78,9 +72,8 @@
 		try (Git git = new Git(db)) {
 			git.commit().setMessage("initial commit").call();
 		}
-		thrown.expect(Die.class);
-		thrown.expectMessage("no such path 'does_not_exist.txt' in HEAD");
-		execute("git blame does_not_exist.txt");
+		assertThrows("no such path 'does_not_exist.txt' in HEAD", Die.class,
+				() -> execute("git blame does_not_exist.txt"));
 	}
 
 	@Test
@@ -88,9 +81,8 @@
 		try (Git git = new Git(db)) {
 			git.commit().setMessage("initial commit").call();
 		}
-		thrown.expect(Die.class);
-		thrown.expectMessage("no such path 'sub/does_not_exist.txt' in HEAD");
-		execute("git blame sub/does_not_exist.txt");
+		assertThrows("no such path 'sub/does_not_exist.txt' in HEAD", Die.class,
+				() -> execute("git blame sub/does_not_exist.txt"));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java
index 455abcd..98724bf 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java
@@ -100,7 +100,7 @@
 						.format(CLIText.get().pathspecDidNotMatch, name), e);
 			} catch (RefAlreadyExistsException e) {
 				throw die(MessageFormat
-						.format(CLIText.get().branchAlreadyExists, name));
+						.format(CLIText.get().branchAlreadyExists, name), e);
 			} catch (CheckoutConflictException e) {
 				StringBuilder builder = new StringBuilder();
 				builder.append(CLIText.get().checkoutConflict);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
index 243e99f..8f80d6d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
@@ -110,7 +110,7 @@
 				outw.println(CLIText.get().clonedEmptyRepository);
 		} catch (InvalidRemoteException e) {
 			throw die(MessageFormat.format(CLIText.get().doesNotExist,
-					sourceUri));
+					sourceUri), e);
 		} finally {
 			if (db != null)
 				db.close();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
index cbb5d84..f570f7f 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
@@ -42,7 +42,7 @@
 			db = key.open(true /* must exist */);
 		} catch (RepositoryNotFoundException notFound) {
 			throw die(MessageFormat.format(CLIText.get().notAGitRepository,
-					dstGitdir.getPath()));
+					dstGitdir.getPath()), notFound);
 		} catch (IOException e) {
 			throw die(e.getMessage(), e);
 		}
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java
index 8c39886..b408b78 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java
@@ -74,7 +74,7 @@
 						command.call();
 					} catch (RefAlreadyExistsException e) {
 						throw die(MessageFormat.format(
-								CLIText.get().tagAlreadyExists, tagName));
+								CLIText.get().tagAlreadyExists, tagName), e);
 					}
 				}
 			} else {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java
index 69c8eb5..36103f2 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java
@@ -50,7 +50,7 @@
 			up.upload(ins, outs, errs);
 		} catch (RepositoryNotFoundException notFound) {
 			throw die(MessageFormat.format(CLIText.get().notAGitRepository,
-					srcGitdir.getPath()));
+					srcGitdir.getPath()), notFound);
 		} catch (IOException e) {
 			throw die(e.getMessage(), e);
 		}
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
index ddd48da..8d884c1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
@@ -235,7 +235,9 @@
 				try {
 					lck.write(content);
 				} catch (IOException ioe) {
-					throw new ObjectWritingException(MessageFormat.format(CLIText.get().cantWrite, file));
+					throw new ObjectWritingException(
+							MessageFormat.format(CLIText.get().cantWrite, file),
+							ioe);
 				}
 				if (!lck.commit())
 					throw new ObjectWritingException(MessageFormat.format(CLIText.get().cantWrite, file));
@@ -266,7 +268,9 @@
 						errw.println(MessageFormat.format(CLIText.get().skippingObject, type, name));
 						continue;
 					}
-					throw new MissingObjectException(id, type);
+					MissingObjectException mue1 = new MissingObjectException(id, type);
+					mue1.initCause(mue);
+					throw mue1;
 				}
 				refs.put(name, new ObjectIdRef.Unpeeled(Ref.Storage.PACKED,
 						name, id));
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java
index 6f0aba3..49f7ada 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java
@@ -57,7 +57,7 @@
 			if (BinaryDelta.getResultSize(delta) != size)
 				throw die("Object " + obj.name() + " is not a delta"); //$NON-NLS-1$ //$NON-NLS-2$
 		} catch (ArrayIndexOutOfBoundsException bad) {
-			throw die("Object " + obj.name() + " is not a delta"); //$NON-NLS-1$ //$NON-NLS-2$
+			throw die("Object " + obj.name() + " is not a delta", bad); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 
 		outw.println(BinaryDelta.format(delta));
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java
index 07a1bb8..d860472 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java
@@ -101,8 +101,10 @@
 		try (ObjectReader curs = clp.getRepository().newObjectReader()) {
 			p.reset(curs, clp.getRevWalk().parseTree(id));
 		} catch (MissingObjectException | IncorrectObjectTypeException e) {
-			throw new CmdLineException(clp,
+			CmdLineException cle = new CmdLineException(clp,
 					CLIText.format(CLIText.get().notATree), name);
+			cle.initCause(e);
+			throw cle;
 		} catch (IOException e) {
 			throw new CmdLineException(clp,
 					CLIText.format(CLIText.get().cannotReadBecause), name,
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java
index f521775..8b2bed36 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java
@@ -98,8 +98,10 @@
 		try {
 			c = clp.getRevWalk().parseCommit(id);
 		} catch (MissingObjectException | IncorrectObjectTypeException e) {
-			throw new CmdLineException(clp,
+			CmdLineException cle = new CmdLineException(clp,
 					CLIText.format(CLIText.get().notACommit), name);
+			cle.initCause(e);
+			throw cle;
 		} catch (IOException e) {
 			throw new CmdLineException(clp,
 					CLIText.format(CLIText.get().cannotReadBecause), name,
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java
index fa96361..357886d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java
@@ -70,8 +70,10 @@
 		try {
 			c = clp.getRevWalk().parseTree(id);
 		} catch (MissingObjectException | IncorrectObjectTypeException e) {
-			throw new CmdLineException(clp,
+			CmdLineException cle = new CmdLineException(clp,
 					CLIText.format(CLIText.get().notATree), name);
+			cle.initCause(e);
+			throw cle;
 		} catch (IOException e) {
 			throw new CmdLineException(clp,
 					CLIText.format(CLIText.get().cannotReadBecause), name,
diff --git a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
index 8fd1756..5bf2563 100644
--- a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
@@ -24,6 +24,6 @@
  org.eclipse.jgit.transport.ssh;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.transport.sshd;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.experimental.theories;version="[4.12,5.0.0)",
- org.junit.runner;version="[4.12,5.0.0)"
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.experimental.theories;version="[4.13,5.0.0)",
+ org.junit.runner;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.test/BUILD b/org.eclipse.jgit.test/BUILD
index 3d48796..b34ef2a 100644
--- a/org.eclipse.jgit.test/BUILD
+++ b/org.eclipse.jgit.test/BUILD
@@ -55,6 +55,7 @@
     srcs = HELPERS,
     resources = DATA,
     deps = [
+        "//lib:assertj-core",
         "//lib:jsch",
         "//lib:junit",
         "//lib:mockito",
diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
index d8f6bcf..18f16d9 100644
--- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
@@ -17,6 +17,7 @@
  org.apache.commons.compress.compressors.bzip2;version="[1.15.0,2.0)",
  org.apache.commons.compress.compressors.gzip;version="[1.15.0,2.0)",
  org.apache.commons.compress.compressors.xz;version="[1.15.0,2.0)",
+ org.assertj.core.api;version="[3.14.0,4.0.0)",
  org.bouncycastle.util.encoders;version="[1.61.0,2.0.0)",
  org.eclipse.jgit.annotations;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.api;version="[5.7.0,5.8.0)",
@@ -70,11 +71,12 @@
  org.eclipse.jgit.util;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util.io;version="[5.7.0,5.8.0)",
  org.eclipse.jgit.util.sha1;version="[5.7.0,5.8.0)",
- org.junit;version="[4.12,5.0.0)",
- org.junit.experimental.theories;version="[4.12,5.0.0)",
- org.junit.rules;version="[4.12,5.0.0)",
- org.junit.runner;version="[4.12,5.0.0)",
- org.junit.runners;version="[4.12,5.0.0)",
+ org.junit;version="[4.13,5.0.0)",
+ org.junit.experimental.theories;version="[4.13,5.0.0)",
+ org.junit.function;version="[4.13.0,5.0.0)",
+ org.junit.rules;version="[4.13,5.0.0)",
+ org.junit.runner;version="[4.13,5.0.0)",
+ org.junit.runners;version="[4.13,5.0.0)",
  org.mockito;version="[2.23.0,3.0.0)",
  org.mockito.invocation;version="[2.23.0,3.0.0)",
  org.mockito.junit;version="[2.23.0,3.0.0)",
diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml
index 60e6818..7ba19d4 100644
--- a/org.eclipse.jgit.test/pom.xml
+++ b/org.eclipse.jgit.test/pom.xml
@@ -66,6 +66,11 @@
     </dependency>
 
     <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>2.23.0</version>
diff --git a/org.eclipse.jgit.test/src/org/eclipse/jgit/lib/MoreAsserts.java b/org.eclipse.jgit.test/src/org/eclipse/jgit/lib/MoreAsserts.java
deleted file mode 100644
index cd0a6f1..0000000
--- a/org.eclipse.jgit.test/src/org/eclipse/jgit/lib/MoreAsserts.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2019, Google LLC and others
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-package org.eclipse.jgit.lib;
-
-/** Assertion methods. */
-public class MoreAsserts {
-	/**
-	 * Simple version of assertThrows that will be introduced in JUnit 4.13.
-	 *
-	 * @param expected
-	 *            Expected throwable class
-	 * @param r
-	 *            Runnable that is expected to throw an exception.
-	 * @return The thrown exception.
-	 */
-	public static <T extends Throwable> T assertThrows(Class<T> expected,
-			ThrowingRunnable r) {
-		try {
-			r.run();
-		} catch (Throwable actual) {
-			if (expected.isAssignableFrom(actual.getClass())) {
-				@SuppressWarnings("unchecked")
-				T toReturn = (T) actual;
-				return toReturn;
-			}
-			throw new AssertionError("Expected " + expected.getSimpleName()
-					+ ", but got " + actual.getClass().getSimpleName(), actual);
-		}
-		throw new AssertionError(
-				"Expected " + expected.getSimpleName() + " to be thrown");
-	}
-
-	public interface ThrowingRunnable {
-		void run() throws Throwable;
-	}
-
-	private MoreAsserts() {
-	}
-}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java
index 6f7ec9a..534ebd9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RenameBranchCommandTest.java
@@ -14,6 +14,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
@@ -25,9 +26,7 @@
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 /**
  * Unit tests of {@link RenameBranchCommand}
@@ -40,9 +39,6 @@
 
 	private Git git;
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	@Override
 	@Before
 	public void setUp() throws Exception {
@@ -57,8 +53,8 @@
 	@Test
 	public void renameToExisting() throws Exception {
 		assertNotNull(git.branchCreate().setName("foo").call());
-		thrown.expect(RefAlreadyExistsException.class);
-		git.branchRename().setOldName("master").setNewName("foo").call();
+		assertThrows(RefAlreadyExistsException.class, () -> git.branchRename()
+				.setOldName("master").setNewName("foo").call());
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/SecurityManagerMissingPermissionsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/SecurityManagerMissingPermissionsTest.java
new file mode 100644
index 0000000..a07f370
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/SecurityManagerMissingPermissionsTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2019 Alex Jitianu <alex_jitianu@sync.ro> and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.api;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.Policy;
+import java.util.Collections;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.WriterAppender;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.util.FileUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests that using a SecurityManager does not result in errors logged.
+ */
+public class SecurityManagerMissingPermissionsTest extends RepositoryTestCase {
+
+	/**
+	 * Collects all logging sent to the logging system.
+	 */
+	private final StringWriter errorOutputWriter = new StringWriter();
+
+	/**
+	 * Appender to intercept all logging sent to the logging system.
+	 */
+	private WriterAppender appender;
+
+	private SecurityManager originalSecurityManager;
+
+	@Override
+	@Before
+	public void setUp() throws Exception {
+		originalSecurityManager = System.getSecurityManager();
+
+		appender = new WriterAppender(
+				new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN),
+				errorOutputWriter);
+
+		Logger.getRootLogger().addAppender(appender);
+
+		refreshPolicyAllPermission(Policy.getPolicy());
+		System.setSecurityManager(new SecurityManager());
+		super.setUp();
+	}
+
+	/**
+	 * If a SecurityManager is active a lot of {@link java.io.FilePermission}
+	 * errors are thrown and logged while initializing a repository.
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void testCreateNewRepos_MissingPermissions() throws Exception {
+		File wcTree = new File(getTemporaryDirectory(),
+				"CreateNewRepositoryTest_testCreateNewRepos");
+
+		File marker = new File(getTemporaryDirectory(), "marker");
+		Files.write(marker.toPath(), Collections.singletonList("Can write"));
+		assertTrue("Can write in test directory", marker.isFile());
+		FileUtils.delete(marker);
+		assertFalse("Can delete in test direcory", marker.exists());
+
+		Git git = Git.init().setBare(false)
+				.setDirectory(new File(wcTree.getAbsolutePath())).call();
+
+		addRepoToClose(git.getRepository());
+
+		assertEquals("", errorOutputWriter.toString());
+	}
+
+	@Override
+	@After
+	public void tearDown() throws Exception {
+		System.setSecurityManager(originalSecurityManager);
+		Logger.getRootLogger().removeAppender(appender);
+		super.tearDown();
+	}
+
+	/**
+	 * Refresh the Java Security Policy.
+	 *
+	 * @param policy
+	 *            the policy object
+	 *
+	 * @throws IOException
+	 *             if the temporary file that contains the policy could not be
+	 *             created
+	 */
+	private static void refreshPolicyAllPermission(Policy policy)
+			throws IOException {
+		// Starting with an all permissions policy.
+		String policyString = "grant { permission java.security.AllPermission; };";
+
+		// Do not use TemporaryFilesFactory, it will create a dependency cycle
+		Path policyFile = Files.createTempFile("testpolicy", ".txt");
+
+		try {
+			Files.write(policyFile, Collections.singletonList(policyString));
+			System.setProperty("java.security.policy",
+					policyFile.toUri().toURL().toString());
+			policy.refresh();
+		} finally {
+			try {
+				Files.delete(policyFile);
+			} catch (IOException e) {
+				// Do not log; the test tests for no logging having occurred
+				e.printStackTrace();
+			}
+		}
+	}
+
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffEntryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffEntryTest.java
index 3886c15..f8c7dae 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffEntryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffEntryTest.java
@@ -13,9 +13,9 @@
 import static org.eclipse.jgit.util.FileUtils.delete;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
@@ -26,8 +26,8 @@
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheEditor;
 import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
 import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
 import org.eclipse.jgit.junit.JGitTestUtil;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.lib.FileMode;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfigTest.java
index e612061..2df0ba1 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfigTest.java
@@ -40,23 +40,18 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThrows;
 
 import org.eclipse.jgit.internal.JGitText;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class DfsBlockCacheConfigTest {
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	@Test
 	public void blockSizeNotPowerOfTwoExpectsException() {
-		thrown.expect(IllegalArgumentException.class);
-		thrown.expectMessage(is(JGitText.get().blockSizeNotPowerOf2));
-
-		new DfsBlockCacheConfig().setBlockSize(1000);
+		assertThrows(JGitText.get().blockSizeNotPowerOf2,
+				IllegalArgumentException.class,
+				() -> new DfsBlockCacheConfig().setBlockSize(1000));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableStackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableStackTest.java
index 770991e..72bff16 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableStackTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableStackTest.java
@@ -12,6 +12,7 @@
 
 import static org.eclipse.jgit.lib.Ref.Storage.PACKED;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
@@ -21,6 +22,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
+
 import org.eclipse.jgit.internal.storage.file.FileReftableStack.Segment;
 import org.eclipse.jgit.internal.storage.reftable.MergedReftable;
 import org.eclipse.jgit.internal.storage.reftable.RefCursor;
@@ -31,9 +33,7 @@
 import org.eclipse.jgit.util.FileUtils;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class FileReftableStackTest {
 
@@ -113,9 +113,6 @@
 		testCompaction(1024);
 	}
 
-	@Rule
-	public final ExpectedException thrown = ExpectedException.none();
-
 	@SuppressWarnings({ "resource", "unused" })
 	@Test
 	public void missingReftable() throws Exception {
@@ -143,9 +140,9 @@
 				}
 			}
 		}
-		thrown.expect(FileNotFoundException.class);
-		new FileReftableStack(new File(reftableDir, "refs"), reftableDir, null,
-				() -> new Config());
+		assertThrows(FileNotFoundException.class,
+				() -> new FileReftableStack(new File(reftableDir, "refs"),
+						reftableDir, null, () -> new Config()));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
index 74f1aea..8baa3cc 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
@@ -10,13 +10,13 @@
 
 package org.eclipse.jgit.internal.storage.file;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
index 97c5638..d269457 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
@@ -44,6 +44,7 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
@@ -67,15 +68,10 @@
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
 import org.junit.Assume;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class ObjectDirectoryTest extends RepositoryTestCase {
 
-	@Rule
-	public ExpectedException expectedEx = ExpectedException.none();
-
 	@Test
 	public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory()
 			throws Exception {
@@ -199,8 +195,7 @@
 	}
 
 	@Test
-	public void testShallowFileCorrupt()
-			throws Exception {
+	public void testShallowFileCorrupt() throws Exception {
 		FileRepository repository = createBareRepository();
 		ObjectDirectory dir = repository.getObjectDatabase();
 
@@ -210,11 +205,9 @@
 				UTF_8.name())) {
 			writer.println(commit);
 		}
-
-		expectedEx.expect(IOException.class);
-		expectedEx.expectMessage(MessageFormat
-				.format(JGitText.get().badShallowLine, commit));
-		dir.getShallowCommits();
+		assertThrows(
+				MessageFormat.format(JGitText.get().badShallowLine, commit),
+				IOException.class, () -> dir.getShallowCommits());
 	}
 
 	private Collection<Callable<ObjectId>> blobInsertersForTheSameFanOutDir(
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java
index 8e438bc..8c56480 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java
@@ -45,15 +45,14 @@
 
 import static java.util.Comparator.comparing;
 import static java.util.stream.Collectors.toList;
-
 import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
 import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.lessThan;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 import java.io.ByteArrayInputStream;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java
index a6a8a17..49e8a7b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -53,13 +54,9 @@
 import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.FileUtils;
 import org.eclipse.jgit.util.IO;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class T0003_BasicTest extends SampleDataRepositoryTestCase {
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
 
 	@Test
 	public void test001_Initalize() {
@@ -311,10 +308,10 @@
 		// We won't create a tree entry with an empty filename
 		//
 		final TreeFormatter formatter = new TreeFormatter();
-		expectedException.expect(IllegalArgumentException.class);
-		expectedException.expectMessage(JGitText.get().invalidTreeZeroLengthName);
-		formatter.append("", FileMode.TREE,
-				ObjectId.fromString("4b825dc642cb6eb9a060e54bf8d69288fbee4904"));
+		assertThrows(JGitText.get().invalidTreeZeroLengthName,
+				IllegalArgumentException.class,
+				() -> formatter.append("", FileMode.TREE, ObjectId.fromString(
+						"4b825dc642cb6eb9a060e54bf8d69288fbee4904")));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java
index f73dfed..009914b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableTest.java
@@ -13,16 +13,16 @@
 import static org.eclipse.jgit.lib.Constants.HEAD;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
 import static org.eclipse.jgit.lib.Constants.R_HEADS;
-import static org.eclipse.jgit.lib.MoreAsserts.assertThrows;
 import static org.eclipse.jgit.lib.Ref.Storage.NEW;
 import static org.eclipse.jgit.lib.Ref.Storage.PACKED;
 import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/transport/http/NetscapeCookieFileTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/transport/http/NetscapeCookieFileTest.java
index 5a7a034..6c8c3ba 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/transport/http/NetscapeCookieFileTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/transport/http/NetscapeCookieFileTest.java
@@ -9,6 +9,10 @@
  */
 package org.eclipse.jgit.internal.transport.http;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Writer;
@@ -27,10 +31,8 @@
 import java.util.regex.Pattern;
 
 import org.eclipse.jgit.internal.storage.file.LockFile;
-import org.eclipse.jgit.internal.transport.http.NetscapeCookieFile;
 import org.eclipse.jgit.util.http.HttpCookiesMatcher;
 import org.hamcrest.CoreMatchers;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -81,11 +83,10 @@
 		cookie = new HttpCookie("key3", "valueFromSet2");
 		cookiesExpectedMergedSet.add(cookie);
 
-		Assert.assertThat(
-				NetscapeCookieFile.mergeCookies(cookieSet1, cookieSet2),
+		assertThat(NetscapeCookieFile.mergeCookies(cookieSet1, cookieSet2),
 				HttpCookiesMatcher.containsInOrder(cookiesExpectedMergedSet));
 
-		Assert.assertThat(NetscapeCookieFile.mergeCookies(cookieSet1, null),
+		assertThat(NetscapeCookieFile.mergeCookies(cookieSet1, null),
 				HttpCookiesMatcher.containsInOrder(cookieSet1));
 	}
 
@@ -110,8 +111,7 @@
 		String expectedExpiration = String
 				.valueOf(creationDate.getTime() + (cookie.getMaxAge() * 1000));
 
-		Assert.assertThat(
-				Files.readAllLines(tmpFile, StandardCharsets.US_ASCII),
+		assertThat(Files.readAllLines(tmpFile, StandardCharsets.US_ASCII),
 				CoreMatchers
 						.equalTo(Arrays.asList("mydomain.com\tTRUE\t/\tTRUE\t"
 								+ expectedExpiration + "\tkey2\tvalue")));
@@ -136,8 +136,7 @@
 		String expectedExpiration = String
 				.valueOf(creationDate.getTime() + (cookie.getMaxAge() * 1000));
 
-		Assert.assertThat(
-				Files.readAllLines(tmpFile, StandardCharsets.US_ASCII),
+		assertThat(Files.readAllLines(tmpFile, StandardCharsets.US_ASCII),
 				CoreMatchers.equalTo(
 						Arrays.asList("domain.com\tTRUE\t/my/path\tFALSE\t"
 								+ expectedExpiration + "\tkey2\tvalue2")));
@@ -154,7 +153,7 @@
 		// now imitate another process/thread holding the lock file
 		LockFile lockFile = new LockFile(tmpFile.toFile());
 		try {
-			Assert.assertTrue("Could not acquire lock", lockFile.lock());
+			assertTrue("Could not acquire lock", lockFile.lock());
 			cookieFile.write(baseUrl);
 		} finally {
 			lockFile.unlock();
@@ -184,7 +183,7 @@
 		List<String> lines = Files.readAllLines(tmpFile,
 				StandardCharsets.US_ASCII);
 
-		Assert.assertEquals("Expected 3 lines", 3, lines.size());
+		assertEquals("Expected 3 lines", 3, lines.size());
 		assertStringMatchesPatternWithInexactNumber(lines.get(0),
 				"some-domain1\tTRUE\t/some/path1\tFALSE\t(\\d*)\tkey1\tvalueFromSimple2",
 				JAN_01_2030_NOON, 1000);
@@ -202,12 +201,12 @@
 			long delta) {
 		java.util.regex.Matcher matcher = Pattern.compile(pattern)
 				.matcher(string);
-		Assert.assertTrue("Given string '" + string + "' does not match '"
-				+ pattern + "'", matcher.matches());
+		assertTrue("Given string '" + string + "' does not match '" + pattern
+				+ "'", matcher.matches());
 		// extract numeric value
 		Long actualNumericValue = Long.decode(matcher.group(1));
 
-		Assert.assertTrue(
+		assertTrue(
 				"Value is supposed to be close to " + expectedNumericValue
 						+ " but is " + actualNumericValue + ".",
 				Math.abs(expectedNumericValue - actualNumericValue) <= delta);
@@ -238,8 +237,7 @@
 		}
 		Set<HttpCookie> actualCookies = new NetscapeCookieFile(tmpFile,
 				creationDate).getCookies(true);
-		Assert.assertThat(actualCookies,
-				HttpCookiesMatcher.containsInOrder(cookies));
+		assertThat(actualCookies, HttpCookiesMatcher.containsInOrder(cookies));
 	}
 
 	@Test
@@ -259,8 +257,7 @@
 			NetscapeCookieFile.write(writer, cookies, baseUrl, creationDate);
 		}
 		// compare original file with newly written one, they should not differ
-		Assert.assertEquals(Files.readAllLines(tmpFile),
-				Files.readAllLines(tmpFile2));
+		assertEquals(Files.readAllLines(tmpFile), Files.readAllLines(tmpFile2));
 	}
 
 	@Test
@@ -289,8 +286,7 @@
 
 		Set<HttpCookie> actualCookies = new NetscapeCookieFile(tmpFile, creationDate)
 				.getCookies(true);
-		Assert.assertThat(actualCookies,
-				HttpCookiesMatcher.containsInOrder(cookies));
+		assertThat(actualCookies, HttpCookiesMatcher.containsInOrder(cookies));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
index a80d8b3..9b56917 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
@@ -29,6 +29,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -58,7 +59,6 @@
 import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
 
 /**
@@ -76,9 +76,6 @@
 	private static final String REFS_BACKUP = "+refs/heads/*:refs/remotes/backup/*";
 
 	@Rule
-	public ExpectedException expectedEx = ExpectedException.none();
-
-	@Rule
 	public TemporaryFolder tmp = new TemporaryFolder();
 
 	@After
@@ -721,24 +718,22 @@
 	}
 
 	@Test
-	public void testIncludeInvalidName() throws ConfigInvalidException {
-		expectedEx.expect(ConfigInvalidException.class);
-		expectedEx.expectMessage(JGitText.get().invalidLineInConfigFile);
-		parse("[include]\nbar\n");
+	public void testIncludeInvalidName() {
+		assertThrows(JGitText.get().invalidLineInConfigFile,
+				ConfigInvalidException.class, () -> parse("[include]\nbar\n"));
 	}
 
 	@Test
-	public void testIncludeNoValue() throws ConfigInvalidException {
-		expectedEx.expect(ConfigInvalidException.class);
-		expectedEx.expectMessage(JGitText.get().invalidLineInConfigFile);
-		parse("[include]\npath\n");
+	public void testIncludeNoValue() {
+		assertThrows(JGitText.get().invalidLineInConfigFile,
+				ConfigInvalidException.class, () -> parse("[include]\npath\n"));
 	}
 
 	@Test
-	public void testIncludeEmptyValue() throws ConfigInvalidException {
-		expectedEx.expect(ConfigInvalidException.class);
-		expectedEx.expectMessage(JGitText.get().invalidLineInConfigFile);
-		parse("[include]\npath=\n");
+	public void testIncludeEmptyValue() {
+		assertThrows(JGitText.get().invalidLineInConfigFile,
+				ConfigInvalidException.class,
+				() -> parse("[include]\npath=\n"));
 	}
 
 	@Test
@@ -1269,25 +1264,24 @@
 	}
 
 	@Test
-	public void testTimeUnitInvalid() throws ConfigInvalidException {
-		expectedEx.expect(IllegalArgumentException.class);
-		expectedEx
-				.expectMessage("Invalid time unit value: a.a=1 monttthhh");
-		parseTime("1 monttthhh", DAYS);
+	public void testTimeUnitInvalid() {
+		assertThrows("Invalid time unit value: a.a=1 monttthhh",
+				IllegalArgumentException.class,
+				() -> parseTime("1 monttthhh", DAYS));
 	}
 
 	@Test
 	public void testTimeUnitInvalidWithSection() throws ConfigInvalidException {
 		Config c = parse("[a \"b\"]\na=1 monttthhh\n");
-		expectedEx.expect(IllegalArgumentException.class);
-		expectedEx.expectMessage("Invalid time unit value: a.b.a=1 monttthhh");
-		c.getTimeUnit("a", "b", "a", 0, DAYS);
+		assertThrows("Invalid time unit value: a.b.a=1 monttthhh",
+				IllegalArgumentException.class,
+				() -> c.getTimeUnit("a", "b", "a", 0, DAYS));
 	}
 
 	@Test
-	public void testTimeUnitNegative() throws ConfigInvalidException {
-		expectedEx.expect(IllegalArgumentException.class);
-		parseTime("-1", MILLISECONDS);
+	public void testTimeUnitNegative() {
+		assertThrows(IllegalArgumentException.class,
+				() -> parseTime("-1", MILLISECONDS));
 	}
 
 	@Test
@@ -1430,10 +1424,10 @@
 	}
 
 	@Test
-	public void testInvalidGroupHeader() throws ConfigInvalidException {
-		expectedEx.expect(ConfigInvalidException.class);
-		expectedEx.expectMessage(JGitText.get().badGroupHeader);
-		parse("[foo \"bar\" ]\nfoo=bar\n");
+	public void testInvalidGroupHeader() {
+		assertThrows(JGitText.get().badGroupHeader,
+				ConfigInvalidException.class,
+				() -> parse("[foo \"bar\" ]\nfoo=bar\n"));
 	}
 
 	@Test
@@ -1447,17 +1441,15 @@
 	}
 
 	@Test
-	public void testCrCharContinuation() throws ConfigInvalidException {
-		expectedEx.expect(ConfigInvalidException.class);
-		expectedEx.expectMessage("Bad escape: \\u000d");
-		parseEscapedValue("tr\\\rue");
+	public void testCrCharContinuation() {
+		assertThrows("Bad escape: \\u000d", ConfigInvalidException.class,
+				() -> parseEscapedValue("tr\\\rue"));
 	}
 
 	@Test
-	public void testCrEOFContinuation() throws ConfigInvalidException {
-		expectedEx.expect(ConfigInvalidException.class);
-		expectedEx.expectMessage("Bad escape: \\u000d");
-		parseEscapedValue("tr\\\r");
+	public void testCrEOFContinuation() {
+		assertThrows("Bad escape: \\u000d", ConfigInvalidException.class,
+				() -> parseEscapedValue("tr\\\r"));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
index 11ed8fd..5c44c9c 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
@@ -34,6 +34,7 @@
 import static org.eclipse.jgit.util.RawParseUtils.decode;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.fail;
 
 import java.text.MessageFormat;
@@ -41,9 +42,7 @@
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.internal.JGitText;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class ObjectCheckerTest {
 	private static final ObjectChecker SECRET_KEY_CHECKER = new ObjectChecker() {
@@ -84,9 +83,6 @@
 
 	private ObjectChecker checker;
 
-	@Rule
-	public final ExpectedException thrown = ExpectedException.none();
-
 	@Before
 	public void setUp() throws Exception {
 		checker = new ObjectChecker();
@@ -116,9 +112,9 @@
 	}
 
 	@Test
-	public void testCheckBlobCorrupt() throws CorruptObjectException {
-		thrown.expect(CorruptObjectException.class);
-		SECRET_KEY_CHECKER.check(OBJ_BLOB, encodeASCII("key = \"secret_key\""));
+	public void testCheckBlobCorrupt() {
+		assertThrows(CorruptObjectException.class, () -> SECRET_KEY_CHECKER
+				.check(OBJ_BLOB, encodeASCII("key = \"secret_key\"")));
 	}
 
 	@Test
@@ -129,11 +125,9 @@
 	}
 
 	@Test
-	public void testCheckBlobWithBlobObjectCheckerCorrupt()
-			throws CorruptObjectException {
-		thrown.expect(CorruptObjectException.class);
-		SECRET_KEY_BLOB_CHECKER.check(OBJ_BLOB,
-				encodeASCII("key = \"secret_key\""));
+	public void testCheckBlobWithBlobObjectCheckerCorrupt() {
+		assertThrows(CorruptObjectException.class, () -> SECRET_KEY_BLOB_CHECKER
+				.check(OBJ_BLOB, encodeASCII("key = \"secret_key\"")));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryCacheTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryCacheTest.java
index 32dc7eb..cec69c4 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryCacheTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryCacheTest.java
@@ -11,12 +11,12 @@
 package org.eclipse.jgit.lib;
 
 import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/BundleWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/BundleWriterTest.java
index b5ab9d2..054eb9c 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/BundleWriterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/BundleWriterTest.java
@@ -17,6 +17,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -44,36 +45,30 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class BundleWriterTest extends SampleDataRepositoryTestCase {
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	@Test
 	public void testEmptyBundleFails() throws Exception {
 		Repository newRepo = createBareRepository();
-		thrown.expect(TransportException.class);
-		fetchFromBundle(newRepo, new byte[0]);
+		assertThrows(TransportException.class,
+				() -> fetchFromBundle(newRepo, new byte[0]));
 	}
 
 	@Test
 	public void testNonBundleFails() throws Exception {
 		Repository newRepo = createBareRepository();
-		thrown.expect(TransportException.class);
-		fetchFromBundle(newRepo, "Not a bundle file".getBytes(UTF_8));
+		assertThrows(TransportException.class, () -> fetchFromBundle(newRepo,
+				"Not a bundle file".getBytes(UTF_8)));
 	}
 
 	@Test
 	public void testGarbageBundleFails() throws Exception {
 		Repository newRepo = createBareRepository();
-		thrown.expect(TransportException.class);
-		fetchFromBundle(newRepo,
+		assertThrows(TransportException.class, () -> fetchFromBundle(newRepo,
 				(TransportBundle.V2_BUNDLE_SIGNATURE + '\n' + "Garbage")
-						.getBytes(UTF_8));
+						.getBytes(UTF_8)));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java
index b55c91f..965a2fa 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java
@@ -10,8 +10,8 @@
 package org.eclipse.jgit.transport;
 
 import static org.eclipse.jgit.transport.ObjectIdMatcher.hasOnlyObjectIds;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java
index e16b84f..038ce71 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java
@@ -9,12 +9,13 @@
  */
 package org.eclipse.jgit.transport;
 
+import static org.eclipse.jgit.transport.ObjectIdMatcher.hasOnlyObjectIds;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasItems;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
-import static org.eclipse.jgit.transport.ObjectIdMatcher.hasOnlyObjectIds;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -27,15 +28,10 @@
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class ProtocolV2ParserTest {
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	private TestRepository<InMemoryRepository> testRepo;
 
 	@Before
@@ -236,8 +232,8 @@
 		ProtocolV2Parser parser = new ProtocolV2Parser(
 				ConfigBuilder.start().allowFilter().done());
 
-		thrown.expect(PackProtocolException.class);
-		parser.parseFetchRequest(pckIn);
+		assertThrows(PackProtocolException.class,
+				() -> parser.parseFetchRequest(pckIn));
 	}
 
 	@Test
@@ -247,8 +243,8 @@
 		ProtocolV2Parser parser = new ProtocolV2Parser(
 				ConfigBuilder.getDefault());
 
-		thrown.expect(PackProtocolException.class);
-		parser.parseFetchRequest(pckIn);
+		assertThrows(PackProtocolException.class,
+				() -> parser.parseFetchRequest(pckIn));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RequestValidatorTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RequestValidatorTestCase.java
index f15fa48..cc910b3 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RequestValidatorTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RequestValidatorTestCase.java
@@ -9,12 +9,15 @@
  */
 package org.eclipse.jgit.transport;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowableOfType;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.eclipse.jgit.errors.PackProtocolException;
+import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
 import org.eclipse.jgit.errors.TransportException;
 import org.eclipse.jgit.internal.storage.dfs.DfsGarbageCollector;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
@@ -25,17 +28,11 @@
 import org.eclipse.jgit.revwalk.RevBlob;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.transport.UploadPack.RequestValidator;
-import org.hamcrest.Matchers;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public abstract class RequestValidatorTestCase {
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	private RevCommit reachableCommit;
 
 	private RevCommit tipAdvertisedCommit;
@@ -111,156 +108,165 @@
 	protected abstract boolean isUnreachableBlobValid();
 
 	@Test
-	public void validateReachableCommitWithBitmaps()
-			throws PackProtocolException, IOException {
-		if (!isReachableCommitValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers
-					.containsString(
-							"want " + reachableCommit.name() + " not valid"));
-
-		}
-		createValidator().checkWants(getUploadPack(getRepoWithBitmaps()),
+	public void validateReachableCommitWithBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithBitmaps()),
 				Arrays.asList(reachableCommit));
-	}
-
-	@Test
-	public void validateReachableCommitWithoutBitmaps()
-			throws PackProtocolException, IOException {
 		if (!isReachableCommitValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + reachableCommit.name() + " not valid"));
-
+			assertTransportException(c,
+					"want " + reachableCommit.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithoutBitmaps()),
+		c.call();
+	}
+
+	@Test
+	public void validateReachableCommitWithoutBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithoutBitmaps()),
 				Arrays.asList(reachableCommit));
+		if (!isReachableCommitValid()) {
+			assertTransportException(c,
+					"want " + reachableCommit.name() + " not valid");
+			return;
+		}
+		c.call();
 	}
 
 	@Test
-	public void validateAdvertisedTipWithBitmaps()
-			throws PackProtocolException, IOException {
-		if (!isAdvertisedTipValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + tipAdvertisedCommit.name() + " not valid"));
-
-		}
-		createValidator().checkWants(getUploadPack(getRepoWithBitmaps()),
+	public void validateAdvertisedTipWithBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithBitmaps()),
 				Arrays.asList(tipAdvertisedCommit));
-	}
-
-	@Test
-	public void validateAdvertisedTipWithoutBitmaps()
-			throws PackProtocolException, IOException {
 		if (!isAdvertisedTipValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + tipAdvertisedCommit.name() + " not valid"));
-
+			assertTransportException(c,
+					"want " + tipAdvertisedCommit.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithoutBitmaps()),
+		c.call();
+	}
+
+	@Test
+	public void validateAdvertisedTipWithoutBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithoutBitmaps()),
 				Arrays.asList(tipAdvertisedCommit));
+		if (!isAdvertisedTipValid()) {
+			assertTransportException(c,
+					"want " + tipAdvertisedCommit.name() + " not valid");
+			return;
+		}
+		c.call();
 	}
 
 	@Test
-	public void validateUnadvertisedTipWithBitmaps()
-			throws PackProtocolException, IOException {
-		if (!isUnadvertisedTipCommitValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + tipUnadvertisedCommit.name() + " not valid"));
-
-		}
-		createValidator().checkWants(getUploadPack(getRepoWithBitmaps()),
+	public void validateUnadvertisedTipWithBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithBitmaps()),
 				Arrays.asList(tipUnadvertisedCommit));
-	}
-
-	@Test
-	public void validateUnadvertisedTipWithoutBitmaps()
-			throws PackProtocolException, IOException {
 		if (!isUnadvertisedTipCommitValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + tipUnadvertisedCommit.name() + " not valid"));
-
+			assertTransportException(c,
+					"want " + tipUnadvertisedCommit.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithoutBitmaps()),
+		c.call();
+	}
+
+	@Test
+	public void validateUnadvertisedTipWithoutBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithoutBitmaps()),
 				Arrays.asList(tipUnadvertisedCommit));
-	}
-
-	@Test
-	public void validateUnreachableCommitWithBitmaps()
-			throws PackProtocolException, IOException {
-		if (!isUnreachableCommitValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + unreachableCommit.name() + " not valid"));
-
+		if (!isUnadvertisedTipCommitValid()) {
+			assertTransportException(c,
+					"want " + tipUnadvertisedCommit.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithBitmaps()),
-				Arrays.asList(unreachableCommit));
+		c.call();
 	}
 
 	@Test
-	public void validateUnreachableCommitWithoutBitmaps()
-			throws PackProtocolException, IOException {
+	public void validateUnreachableCommitWithBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithBitmaps()),
+				Arrays.asList(unreachableCommit));
 		if (!isUnreachableCommitValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + unreachableCommit.name() + " not valid"));
-
+			assertTransportException(c,
+					"want " + unreachableCommit.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithoutBitmaps()),
-				Arrays.asList(unreachableCommit));
+		c.call();
 	}
 
 	@Test
-	public void validateReachableBlobWithBitmaps()
-			throws PackProtocolException, IOException {
+	public void validateUnreachableCommitWithoutBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithoutBitmaps()),
+				Arrays.asList(unreachableCommit));
+		if (!isUnreachableCommitValid()) {
+			assertTransportException(c,
+					"want " + unreachableCommit.name() + " not valid");
+			return;
+		}
+		c.call();
+	}
+
+	@Test
+	public void validateReachableBlobWithBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithBitmaps()),
+				Arrays.asList(reachableBlob));
 		if (!isReachableBlobValid_withBitmaps()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + reachableBlob.name() + " not valid"));
+			assertTransportException(c,
+					"want " + reachableBlob.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithBitmaps()),
-				Arrays.asList(reachableBlob));
+		c.call();
 	}
 
 	@Test
-	public void validateReachableBlobWithoutBitmaps()
-			throws PackProtocolException, IOException {
+	public void validateReachableBlobWithoutBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithoutBitmaps()),
+				Arrays.asList(reachableBlob));
 		if (!isReachableBlobValid_withoutBitmaps()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + reachableBlob.name() + " not valid"));
+			assertTransportException(c,
+					"want " + reachableBlob.name() + " not valid");
+			return;
 		}
-		createValidator().checkWants(getUploadPack(getRepoWithoutBitmaps()),
-				Arrays.asList(reachableBlob));
+		c.call();
 	}
 
 	@Test
-	public void validateUnreachableBlobWithBitmaps()
-			throws PackProtocolException, IOException {
-		if (!isUnreachableBlobValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + unreachableBlob.name() + " not valid"));
-		}
-		createValidator().checkWants(getUploadPack(getRepoWithBitmaps()),
+	public void validateUnreachableBlobWithBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithBitmaps()),
 				Arrays.asList(unreachableBlob));
+		if (!isUnreachableBlobValid()) {
+			assertTransportException(c,
+					"want " + unreachableBlob.name() + " not valid");
+			return;
+		}
+		c.call();
 	}
 
 	@Test
-	public void validateUnreachableBlobWithoutBitmaps()
-			throws PackProtocolException, IOException {
-		if (!isUnreachableBlobValid()) {
-			thrown.expect(TransportException.class);
-			thrown.expectMessage(Matchers.containsString(
-					"want " + unreachableBlob.name() + " not valid"));
-		}
-		createValidator().checkWants(getUploadPack(getRepoWithoutBitmaps()),
+	public void validateUnreachableBlobWithoutBitmaps() throws Throwable {
+		ThrowingCallable c = () -> createValidator().checkWants(
+				getUploadPack(getRepoWithoutBitmaps()),
 				Arrays.asList(unreachableBlob));
+		if (!isUnreachableBlobValid()) {
+			assertTransportException(c,
+					"want " + unreachableBlob.name() + " not valid");
+			return;
+		}
+		c.call();
+	}
+
+	private void assertTransportException(ThrowingCallable c,
+			String messageContent) throws AssertionError {
+		assertThat(catchThrowableOfType(c, TransportException.class))
+				.hasMessageContaining(messageContent);
 	}
 
 	private UploadPack getUploadPack(Repository repository) throws IOException {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java
index 7fe5b59..b84b6b2 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/TransportHttpTest.java
@@ -9,6 +9,8 @@
  */
 package org.eclipse.jgit.transport;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.HttpCookie;
@@ -120,7 +122,7 @@
 			cookie.setMaxAge(1234);
 			expectedCookies.add(cookie);
 
-			Assert.assertThat(
+			assertThat(
 					new NetscapeCookieFile(cookieFile.toPath())
 							.getCookies(true),
 					HttpCookiesMatcher.containsInOrder(expectedCookies, 5));
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackReachabilityTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackReachabilityTest.java
index 2c9712c..2711762 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackReachabilityTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackReachabilityTest.java
@@ -9,10 +9,10 @@
  */
 package org.eclipse.jgit.transport;
 
-import static org.eclipse.jgit.lib.MoreAsserts.assertThrows;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Collections;
@@ -32,9 +32,7 @@
 import org.eclipse.jgit.transport.resolver.UploadPackFactory;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 /**
  * Test combinations of:
@@ -46,9 +44,6 @@
  */
 public class UploadPackReachabilityTest {
 
-	@Rule
-	public ExpectedException thrown = ExpectedException.none();
-
 	private URIish uri;
 
 	private TestProtocol<Object> testProtocol;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackRefSortingForReachabilityTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackRefSortingForReachabilityTest.java
index 99fe214..37c8705 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackRefSortingForReachabilityTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackRefSortingForReachabilityTest.java
@@ -10,8 +10,8 @@
 
 package org.eclipse.jgit.transport;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
-import static org.junit.Assert.assertThat;
 
 import java.util.List;
 import java.util.stream.Collectors;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
index 108e5ed..ea86563 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
@@ -1,6 +1,6 @@
 package org.eclipse.jgit.transport;
 
-import static org.eclipse.jgit.lib.MoreAsserts.assertThrows;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.hasItems;
@@ -9,7 +9,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/LRUMapTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/LRUMapTest.java
index f6dd9ad..c9fd0c9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/LRUMapTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/LRUMapTest.java
@@ -9,11 +9,12 @@
  */
 package org.eclipse.jgit.util;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.hamcrest.collection.IsIterableContainingInOrder;
-import org.junit.Assert;
 import org.junit.Test;
 
 public class LRUMapTest {
@@ -38,8 +39,7 @@
 		expectedMap.put(0, 0);
 		expectedMap.put(3, 3);
 
-		Assert.assertThat(map.entrySet(),
-				IsIterableContainingInOrder
-						.contains(expectedMap.entrySet().toArray()));
+		assertThat(map.entrySet(), IsIterableContainingInOrder
+				.contains(expectedMap.entrySet().toArray()));
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java
index 7ea96dd..1c2d8d7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java
@@ -13,16 +13,12 @@
 import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
 
 import org.eclipse.jgit.errors.BinaryBlobException;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class RawParseUtils_LineMapTest {
-	@Rule
-	public ExpectedException exception = ExpectedException.none();
-
 
 	@Test
 	public void testEmpty() throws Exception {
@@ -62,8 +58,8 @@
 	@Test
 	public void testLineMapOrBinary() throws Exception {
 		final byte[] buf = "xxxfoo\nb\0ar".getBytes(ISO_8859_1);
-		exception.expect(BinaryBlobException.class);
-		RawParseUtils.lineMapOrBinary(buf, 3, buf.length);
+		assertThrows(BinaryBlobException.class,
+				() -> RawParseUtils.lineMapOrBinary(buf, 3, buf.length));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TimeoutOutputStreamTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TimeoutOutputStreamTest.java
index 024f0f3..567880f 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TimeoutOutputStreamTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TimeoutOutputStreamTest.java
@@ -149,7 +149,9 @@
 					try {
 						Thread.sleep(1000);
 					} catch (InterruptedException e) {
-						throw new InterruptedIOException();
+						InterruptedIOException e1 = new InterruptedIOException();
+						e1.initCause(e);
+						throw e1;
 					}
 				}
 			}
@@ -202,7 +204,9 @@
 					try {
 						Thread.sleep(1000);
 					} catch (InterruptedException e) {
-						throw new InterruptedIOException();
+						InterruptedIOException e1 = new InterruptedIOException();
+						e1.initCause(e);
+						throw e1;
 					}
 				}
 			}
diff --git a/org.eclipse.jgit/resources/META-INF/services/org.eclipse.jgit.transport.SshSessionFactory b/org.eclipse.jgit/resources/META-INF/services/org.eclipse.jgit.transport.SshSessionFactory
new file mode 100644
index 0000000..1f88284
--- /dev/null
+++ b/org.eclipse.jgit/resources/META-INF/services/org.eclipse.jgit.transport.SshSessionFactory
@@ -0,0 +1 @@
+org.eclipse.jgit.transport.DefaultSshSessionFactory
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
index 2525cbb..78afe18 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
@@ -164,7 +164,7 @@
 			verifyDirectories(u);
 		} catch (URISyntaxException e) {
 			throw new InvalidRemoteException(
-					MessageFormat.format(JGitText.get().invalidURL, uri));
+					MessageFormat.format(JGitText.get().invalidURL, uri), e);
 		}
 		setFetchType();
 		@SuppressWarnings("resource") // Closed by caller
@@ -185,8 +185,9 @@
 				repository.close();
 			}
 			cleanup();
-			throw new InvalidRemoteException(MessageFormat.format(
-					JGitText.get().invalidRemote, remote));
+			throw new InvalidRemoteException(
+					MessageFormat.format(JGitText.get().invalidRemote, remote),
+					e);
 		} catch (GitAPIException | RuntimeException e) {
 			if (repository != null) {
 				repository.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java
index a4b9bcf..033dd60 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java
@@ -223,7 +223,7 @@
 					e.getMessage(), e);
 		} catch (URISyntaxException e) {
 			throw new InvalidRemoteException(MessageFormat.format(
-					JGitText.get().invalidRemote, remote));
+					JGitText.get().invalidRemote, remote), e);
 		} catch (NotSupportedException e) {
 			throw new JGitInternalException(
 					JGitText.get().exceptionCaughtDuringExecutionOfFetchCommand,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java
index 12517df..a4ca309 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java
@@ -180,7 +180,7 @@
 			}
 		} catch (URISyntaxException e) {
 			throw new InvalidRemoteException(MessageFormat.format(
-					JGitText.get().invalidRemote, remote));
+					JGitText.get().invalidRemote, remote), e);
 		} catch (NotSupportedException e) {
 			throw new JGitInternalException(
 					JGitText.get().exceptionCaughtDuringExecutionOfLsRemoteCommand,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java
index b9b15eb..aa5a634 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java
@@ -152,8 +152,9 @@
 			}
 
 		} catch (URISyntaxException e) {
-			throw new InvalidRemoteException(MessageFormat.format(
-					JGitText.get().invalidRemote, remote));
+			throw new InvalidRemoteException(
+					MessageFormat.format(JGitText.get().invalidRemote, remote),
+					e);
 		} catch (TransportException e) {
 			throw new org.eclipse.jgit.api.errors.TransportException(
 					e.getMessage(), e);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java
index fcfae65..fb6e5df 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java
@@ -350,6 +350,7 @@
 		return (1 << idHashBits) * (idHashBits - 3) / idHashBits;
 	}
 
+	@SuppressWarnings("UnusedException")
 	private void grow() throws TableFullException {
 		if (idHashBits == 30)
 			throw new TableFullException();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
index bbaed37..fdc89cd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
@@ -3,41 +3,14 @@
  * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
  * Copyright (C) 2008, Roger C. Soares <rogersoares@intelinet.com.br>
  * Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org>
- * Copyright (C) 2010, Chrisian Halstrick <christian.halstrick@sap.com> and
- * other copyright owners as documented in the project's IP log.
+ * Copyright (C) 2010, Chrisian Halstrick <christian.halstrick@sap.com>
+ * Copyright (C) 2019-2020, Andre Bossert <andre.bossert@siemens.com>
  *
  * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v1.0 which accompanies this
- * distribution, is reproduced below, and is available at
- * http://www.eclipse.org/org/documents/edl-v10.php
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
  *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * - Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-3-Clause
  */
 
 package org.eclipse.jgit.dircache;
@@ -1504,29 +1477,9 @@
 		File tmpFile = File.createTempFile(
 				"._" + name, null, parentDir); //$NON-NLS-1$
 
-		EolStreamType nonNullEolStreamType;
-		if (checkoutMetadata.eolStreamType != null) {
-			nonNullEolStreamType = checkoutMetadata.eolStreamType;
-		} else if (opt.getAutoCRLF() == AutoCRLF.TRUE) {
-			nonNullEolStreamType = EolStreamType.AUTO_CRLF;
-		} else {
-			nonNullEolStreamType = EolStreamType.DIRECT;
-		}
-		try (OutputStream channel = EolStreamTypeUtil.wrapOutputStream(
-				new FileOutputStream(tmpFile), nonNullEolStreamType)) {
-			if (checkoutMetadata.smudgeFilterCommand != null) {
-				if (FilterCommandRegistry
-						.isRegistered(checkoutMetadata.smudgeFilterCommand)) {
-					runBuiltinFilterCommand(repo, checkoutMetadata, ol,
-							channel);
-				} else {
-					runExternalFilterCommand(repo, entry, checkoutMetadata, ol,
-							fs, channel);
-				}
-			} else {
-				ol.copyTo(channel);
-			}
-		}
+		getContent(repo, entry.getPathString(), checkoutMetadata, ol, opt,
+				new FileOutputStream(tmpFile));
+
 		// The entry needs to correspond to the on-disk filesize. If the content
 		// was filtered (either by autocrlf handling or smudge filters) ask the
 		// filesystem again for the length. Otherwise the objectloader knows the
@@ -1565,11 +1518,69 @@
 		entry.setLastModified(fs.lastModifiedInstant(f));
 	}
 
+	/**
+	 * Return filtered content for a specific object (blob). EOL handling and
+	 * smudge-filter handling are applied in the same way as it would be done
+	 * during a checkout.
+	 *
+	 * @param repo
+	 *            the repository
+	 * @param path
+	 *            the path used to determine the correct filters for the object
+	 * @param checkoutMetadata
+	 *            containing
+	 *            <ul>
+	 *            <li>smudgeFilterCommand to be run for smudging the object</li>
+	 *            <li>eolStreamType used for stream conversion (can be
+	 *            null)</li>
+	 *            </ul>
+	 * @param ol
+	 *            the object loader to read raw content of the object
+	 * @param opt
+	 *            the working tree options where only 'core.autocrlf' is used
+	 *            for EOL handling if 'checkoutMetadata.eolStreamType' is not
+	 *            valid
+	 * @param os
+	 *            the output stream the filtered content is written to. The
+	 *            caller is responsible to close the stream.
+	 * @throws IOException
+	 *
+	 * @since 5.7
+	 */
+	public static void getContent(Repository repo, String path,
+			CheckoutMetadata checkoutMetadata, ObjectLoader ol,
+			WorkingTreeOptions opt, OutputStream os)
+			throws IOException {
+		EolStreamType nonNullEolStreamType;
+		if (checkoutMetadata.eolStreamType != null) {
+			nonNullEolStreamType = checkoutMetadata.eolStreamType;
+		} else if (opt.getAutoCRLF() == AutoCRLF.TRUE) {
+			nonNullEolStreamType = EolStreamType.AUTO_CRLF;
+		} else {
+			nonNullEolStreamType = EolStreamType.DIRECT;
+		}
+		try (OutputStream channel = EolStreamTypeUtil.wrapOutputStream(
+				os, nonNullEolStreamType)) {
+			if (checkoutMetadata.smudgeFilterCommand != null) {
+				if (FilterCommandRegistry
+						.isRegistered(checkoutMetadata.smudgeFilterCommand)) {
+					runBuiltinFilterCommand(repo, checkoutMetadata, ol,
+							channel);
+				} else {
+					runExternalFilterCommand(repo, path, checkoutMetadata, ol,
+							channel);
+				}
+			} else {
+				ol.copyTo(channel);
+			}
+		}
+	}
+
 	// Run an external filter command
-	private static void runExternalFilterCommand(Repository repo,
-			DirCacheEntry entry,
-			CheckoutMetadata checkoutMetadata, ObjectLoader ol, FS fs,
+	private static void runExternalFilterCommand(Repository repo, String path,
+			CheckoutMetadata checkoutMetadata, ObjectLoader ol,
 			OutputStream channel) throws IOException {
+		FS fs = repo.getFS();
 		ProcessBuilder filterProcessBuilder = fs.runInShell(
 				checkoutMetadata.smudgeFilterCommand, new String[0]);
 		filterProcessBuilder.directory(repo.getWorkTree());
@@ -1588,12 +1599,12 @@
 		} catch (IOException | InterruptedException e) {
 			throw new IOException(new FilterFailedException(e,
 					checkoutMetadata.smudgeFilterCommand,
-					entry.getPathString()));
+					path));
 		}
 		if (rc != 0) {
 			throw new IOException(new FilterFailedException(rc,
 					checkoutMetadata.smudgeFilterCommand,
-					entry.getPathString(),
+					path,
 					result.getStdout().toByteArray(MAX_EXCEPTION_TEXT_SIZE),
 					RawParseUtils.decode(result.getStderr()
 							.toByteArray(MAX_EXCEPTION_TEXT_SIZE))));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
index 023efd8..6a2c389 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
@@ -139,7 +139,7 @@
 		try {
 			xr = XMLReaderFactory.createXMLReader();
 		} catch (SAXException e) {
-			throw new IOException(JGitText.get().noXMLParserAvailable);
+			throw new IOException(JGitText.get().noXMLParserAvailable, e);
 		}
 		xr.setContentHandler(this);
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
index 98f61d1..c039aaf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
@@ -541,7 +541,7 @@
 				inputStream = new FileInputStream(manifestPath);
 			} catch (IOException e) {
 				throw new IllegalArgumentException(
-						JGitText.get().pathNotConfigured);
+						JGitText.get().pathNotConfigured, e);
 			}
 		}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java
index ad7aebc..3b94984 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java
@@ -290,9 +290,12 @@
 							ErrorType.MISMATCH_CRC);
 				}
 			} catch (MissingObjectException e) {
-				throw new CorruptPackIndexException(MessageFormat
-						.format(JGitText.get().missingCRC, entry.getName()),
+				CorruptPackIndexException cpe = new CorruptPackIndexException(
+						MessageFormat.format(JGitText.get().missingCRC,
+								entry.getName()),
 						ErrorType.MISSING_CRC);
+				cpe.initCause(e);
+				throw cpe;
 			}
 		}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java
index bee2e01..6e7ad3e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java
@@ -236,7 +236,7 @@
 						JGitText.get().enumValueNotSupported3,
 						CONFIG_CORE_SECTION,
 						CONFIG_DFS_SECTION,
-						CONFIG_KEY_STREAM_RATIO, v));
+						CONFIG_KEY_STREAM_RATIO, v), e);
 			}
 		}
 		return this;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java
index 857c173..1695870 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java
@@ -769,7 +769,8 @@
 						shallowCommitsIds.add(ObjectId.fromString(line));
 					} catch (IllegalArgumentException ex) {
 						throw new IOException(MessageFormat
-								.format(JGitText.get().badShallowLine, line));
+								.format(JGitText.get().badShallowLine, line),
+								ex);
 					}
 				}
 			}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
index 0de818a..b997338 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
@@ -71,13 +71,12 @@
  */
 public class PackFile implements Iterable<PackIndex.MutableEntry> {
 	private final static Logger LOG = LoggerFactory.getLogger(PackFile.class);
-	/** Sorts PackFiles to be most recently created to least recently created. */
-	public static final Comparator<PackFile> SORT = new Comparator<PackFile>() {
-		@Override
-		public int compare(PackFile a, PackFile b) {
-			return b.packLastModified.compareTo(a.packLastModified);
-		}
-	};
+
+	/**
+	 * Sorts PackFiles to be most recently created to least recently created.
+	 */
+	public static final Comparator<PackFile> SORT = (a, b) -> b.packLastModified
+			.compareTo(a.packLastModified);
 
 	private final File packFile;
 
@@ -1071,7 +1070,7 @@
 		} catch (DataFormatException e) {
 			throw new CorruptObjectException(MessageFormat.format(
 					JGitText.get().objectAtHasBadZlibStream, Long.valueOf(pos),
-					getPackFile()));
+					getPackFile()), e);
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
index b636db6..fddd430 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
@@ -1035,7 +1035,10 @@
 					lck.waitForStatChange();
 				} catch (InterruptedException e) {
 					lck.unlock();
-					throw new ObjectWritingException(MessageFormat.format(JGitText.get().interruptedWriting, name));
+					throw new ObjectWritingException(
+							MessageFormat.format(
+									JGitText.get().interruptedWriting, name),
+							e);
 				}
 				if (!lck.commit())
 					throw new ObjectWritingException(MessageFormat.format(JGitText.get().unableToWrite, name));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java
index 743badb..bf47d2c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java
@@ -149,8 +149,10 @@
 			}
 			return new LargeObject(type, size, path, id, wc.db);
 		} catch (ZipException badStream) {
-			throw new CorruptObjectException(id,
+			CorruptObjectException coe = new CorruptObjectException(id,
 					JGitText.get().corruptObjectBadStream);
+			coe.initCause(badStream);
+			throw coe;
 		}
 	}
 
@@ -192,8 +194,10 @@
 			}
 			return size;
 		} catch (ZipException badStream) {
-			throw new CorruptObjectException(id,
+			CorruptObjectException coe = new CorruptObjectException(id,
 					JGitText.get().corruptObjectBadStream);
+			coe.initCause(badStream);
+			throw coe;
 		}
 	}
 
@@ -205,8 +209,10 @@
 			try {
 				r = inf.inflate(buf);
 			} catch (DataFormatException e) {
-				throw new CorruptObjectException(id,
+				CorruptObjectException coe = new CorruptObjectException(id,
 						JGitText.get().corruptObjectBadStream);
+				coe.initCause(e);
+				throw coe;
 			}
 			if (r != 0)
 				throw new CorruptObjectException(id,
@@ -277,8 +283,10 @@
 						remaining -= r;
 					return r;
 				} catch (ZipException badStream) {
-					throw new CorruptObjectException(id,
+					CorruptObjectException coe = new CorruptObjectException(id,
 							JGitText.get().corruptObjectBadStream);
+					coe.initCause(badStream);
+					throw coe;
 				}
 			}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
index 33ffe07..e8f0e1f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
@@ -142,43 +142,42 @@
 	private static final Map<WeakReference<PackWriter>, Boolean> instances =
 			new ConcurrentHashMap<>();
 
-	private static final Iterable<PackWriter> instancesIterable = new Iterable<PackWriter>() {
+	private static final Iterable<PackWriter> instancesIterable = () -> new Iterator<PackWriter>() {
+
+		private final Iterator<WeakReference<PackWriter>> it = instances
+				.keySet().iterator();
+
+		private PackWriter next;
+
 		@Override
-		public Iterator<PackWriter> iterator() {
-			return new Iterator<PackWriter>() {
-				private final Iterator<WeakReference<PackWriter>> it =
-						instances.keySet().iterator();
-				private PackWriter next;
-
-				@Override
-				public boolean hasNext() {
-					if (next != null)
-						return true;
-					while (it.hasNext()) {
-						WeakReference<PackWriter> ref = it.next();
-						next = ref.get();
-						if (next != null)
-							return true;
-						it.remove();
-					}
-					return false;
+		public boolean hasNext() {
+			if (next != null) {
+				return true;
+			}
+			while (it.hasNext()) {
+				WeakReference<PackWriter> ref = it.next();
+				next = ref.get();
+				if (next != null) {
+					return true;
 				}
+				it.remove();
+			}
+			return false;
+		}
 
-				@Override
-				public PackWriter next() {
-					if (hasNext()) {
-						PackWriter result = next;
-						next = null;
-						return result;
-					}
-					throw new NoSuchElementException();
-				}
+		@Override
+		public PackWriter next() {
+			if (hasNext()) {
+				PackWriter result = next;
+				next = null;
+				return result;
+			}
+			throw new NoSuchElementException();
+		}
 
-				@Override
-				public void remove() {
-					throw new UnsupportedOperationException();
-				}
-			};
+		@Override
+		public void remove() {
+			throw new UnsupportedOperationException();
 		}
 	};
 
@@ -1579,8 +1578,8 @@
 						if (pool.awaitTermination(60, TimeUnit.SECONDS))
 							break;
 					} catch (InterruptedException e) {
-						throw new IOException(
-								JGitText.get().packingCancelledDuringObjectsWriting);
+						throw new IOException(JGitText
+								.get().packingCancelledDuringObjectsWriting, e);
 					}
 				}
 			}
@@ -1604,7 +1603,8 @@
 				// Cross our fingers and just break out anyway.
 				//
 				throw new IOException(
-						JGitText.get().packingCancelledDuringObjectsWriting);
+						JGitText.get().packingCancelledDuringObjectsWriting,
+						ie);
 			}
 		}
 
@@ -1645,7 +1645,7 @@
 			for (Future<?> f : futures)
 				f.cancel(true);
 			throw new IOException(
-					JGitText.get().packingCancelledDuringObjectsWriting);
+					JGitText.get().packingCancelledDuringObjectsWriting, ie);
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java
index 20066be..d0e2441 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java
@@ -165,9 +165,10 @@
 				}
 			}
 		} catch (ConfigInvalidException e) {
-			throw new SubmoduleValidationException(
-					JGitText.get().invalidGitModules,
-					GITMODULES_PARSE);
+			SubmoduleValidationException sve = new SubmoduleValidationException(
+					JGitText.get().invalidGitModules, GITMODULES_PARSE);
+			sve.initCause(e);
+			throw sve;
 		}
 	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
index a5e4d78..dc5e5cc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
@@ -114,8 +114,11 @@
 			final int d = hexUInt32(bs, ptr + 24, end);
 			final int e = hexUInt32(bs, ptr + 32, end);
 			return new AbbreviatedObjectId(end - ptr, a, b, c, d, e);
-		} catch (ArrayIndexOutOfBoundsException e1) {
-			throw new InvalidObjectIdException(bs, ptr, end - ptr);
+		} catch (ArrayIndexOutOfBoundsException e) {
+			InvalidObjectIdException e1 = new InvalidObjectIdException(bs, ptr,
+					end - ptr);
+			e1.initCause(e);
+			throw e1;
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
index d502274..ffc742d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
@@ -601,7 +601,10 @@
 				throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
 			}
 		} catch (ArrayIndexOutOfBoundsException bad) {
-			throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
+			CorruptObjectException coe = new CorruptObjectException(id,
+					JGitText.get().corruptObjectInvalidType);
+			coe.initCause(bad);
+			throw coe;
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
index abc9b21..cc0b995 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
@@ -46,7 +46,7 @@
 			return StringUtils.toBoolean(n);
 		} catch (IllegalArgumentException err) {
 			throw new IllegalArgumentException(MessageFormat.format(
-					JGitText.get().invalidBooleanValue, section, name, n));
+					JGitText.get().invalidBooleanValue, section, name, n), err);
 		}
 	}
 
@@ -152,7 +152,8 @@
 			return mul * Long.parseLong(n);
 		} catch (NumberFormatException nfe) {
 			throw new IllegalArgumentException(MessageFormat.format(
-					JGitText.get().invalidIntegerValue, section, name, str));
+					JGitText.get().invalidIntegerValue, section, name, str),
+					nfe);
 		}
 	}
 
@@ -239,7 +240,10 @@
 			return wantUnit.convert(Long.parseLong(digits) * inputMul,
 					inputUnit);
 		} catch (NumberFormatException nfe) {
-			throw notTimeUnit(section, subsection, unitName, valueString);
+			IllegalArgumentException iae = notTimeUnit(section, subsection,
+					unitName, valueString);
+			iae.initCause(nfe);
+			throw iae;
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
index 86b306d..4a712ba 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
@@ -234,9 +234,11 @@
 			w3 = RawParseUtils.parseHexInt32(bs, p + 16);
 			w4 = RawParseUtils.parseHexInt32(bs, p + 24);
 			w5 = RawParseUtils.parseHexInt32(bs, p + 32);
-		} catch (ArrayIndexOutOfBoundsException e1) {
-			throw new InvalidObjectIdException(bs, p,
+		} catch (ArrayIndexOutOfBoundsException e) {
+			InvalidObjectIdException e1 = new InvalidObjectIdException(bs, p,
 					Constants.OBJECT_ID_STRING_LENGTH);
+			e1.initCause(e);
+			throw e1;
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
index 11c0aef..269049f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
@@ -213,9 +213,11 @@
 			final int d = RawParseUtils.parseHexInt32(bs, p + 24);
 			final int e = RawParseUtils.parseHexInt32(bs, p + 32);
 			return new ObjectId(a, b, c, d, e);
-		} catch (ArrayIndexOutOfBoundsException e1) {
-			throw new InvalidObjectIdException(bs, p,
+		} catch (ArrayIndexOutOfBoundsException e) {
+			InvalidObjectIdException e1 = new InvalidObjectIdException(bs, p,
 					Constants.OBJECT_ID_STRING_LENGTH);
+			e1.initCause(e);
+			throw e1;
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
index 503e218..a7a832c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -550,9 +550,11 @@
 						try {
 							pnum = Integer.parseInt(parentnum);
 						} catch (NumberFormatException e) {
-							throw new RevisionSyntaxException(
+							RevisionSyntaxException rse = new RevisionSyntaxException(
 									JGitText.get().invalidCommitParentNumber,
 									revstr);
+							rse.initCause(e);
+							throw rse;
 						}
 						if (pnum != 0) {
 							RevCommit commit = (RevCommit) rev;
@@ -647,8 +649,10 @@
 					try {
 						dist = Integer.parseInt(distnum);
 					} catch (NumberFormatException e) {
-						throw new RevisionSyntaxException(
+						RevisionSyntaxException rse = new RevisionSyntaxException(
 								JGitText.get().invalidAncestryLength, revstr);
+						rse.initCause(e);
+						throw rse;
 					}
 				} else
 					dist = 1;
@@ -707,7 +711,10 @@
 							remoteConfig = new RemoteConfig(getConfig(),
 									"origin"); //$NON-NLS-1$
 						} catch (URISyntaxException e) {
-							throw new RevisionSyntaxException(revstr);
+							RevisionSyntaxException rse = new RevisionSyntaxException(
+									revstr);
+							rse.initCause(e);
+							throw rse;
 						}
 						String remoteBranchName = getConfig()
 								.getString(
@@ -874,8 +881,11 @@
 		try {
 			number = Integer.parseInt(time);
 		} catch (NumberFormatException nfe) {
-			throw new RevisionSyntaxException(MessageFormat.format(
-					JGitText.get().invalidReflogRevision, time));
+			RevisionSyntaxException rse = new RevisionSyntaxException(
+					MessageFormat.format(JGitText.get().invalidReflogRevision,
+							time));
+			rse.initCause(nfe);
+			throw rse;
 		}
 		assert number >= 0;
 		ReflogReader reader = getReflogReader(ref.getName());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java
index a177c29..9210ec1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java
@@ -33,6 +33,7 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -44,6 +45,8 @@
 import java.util.SortedMap;
 import java.util.TimeZone;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
+import java.time.Instant;
 
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
@@ -288,6 +291,8 @@
 	 * <p>
 	 * This method is primarily meant for obtaining a "recursive directory
 	 * listing" rooted under the specified bucket and prefix location.
+	 * It returns the keys sorted in reverse order of LastModified time
+	 * (freshest keys first).
 	 *
 	 * @param bucket
 	 *            name of the bucket whose objects should be listed.
@@ -311,7 +316,10 @@
 		do {
 			lp.list();
 		} while (lp.truncated);
-		return lp.entries;
+
+		Comparator<KeyInfo> comparator = Comparator.comparingLong(KeyInfo::getLastModifiedSecs);
+		return lp.entries.stream().sorted(comparator.reversed())
+			.map(KeyInfo::getName).collect(Collectors.toList());
 	}
 
 	/**
@@ -620,8 +628,26 @@
 		return p;
 	}
 
+	/**
+	 * KeyInfo enables sorting of keys by lastModified time
+	 */
+	private static final class KeyInfo {
+		private final String name;
+		private final long lastModifiedSecs;
+		public KeyInfo(String aname, long lsecs) {
+			name = aname;
+			lastModifiedSecs = lsecs;
+		}
+		public String getName() {
+			return name;
+		}
+		public long getLastModifiedSecs() {
+			return lastModifiedSecs;
+		}
+	}
+
 	private final class ListParser extends DefaultHandler {
-		final List<String> entries = new ArrayList<>();
+		final List<KeyInfo> entries = new ArrayList<>();
 
 		private final String bucket;
 
@@ -630,6 +656,8 @@
 		boolean truncated;
 
 		private StringBuilder data;
+		private String keyName;
+		private Instant keyLastModified;
 
 		ListParser(String bn, String p) {
 			bucket = bn;
@@ -641,7 +669,7 @@
 			if (prefix.length() > 0)
 				args.put("prefix", prefix); //$NON-NLS-1$
 			if (!entries.isEmpty())
-				args.put("marker", prefix + entries.get(entries.size() - 1)); //$NON-NLS-1$
+				args.put("marker", prefix + entries.get(entries.size() - 1).getName()); //$NON-NLS-1$
 
 			for (int curAttempt = 0; curAttempt < maxAttempts; curAttempt++) {
 				final HttpURLConnection c = open("GET", bucket, "", args); //$NON-NLS-1$ //$NON-NLS-2$
@@ -650,12 +678,15 @@
 				case HttpURLConnection.HTTP_OK:
 					truncated = false;
 					data = null;
+					keyName = null;
+					keyLastModified = null;
 
 					final XMLReader xr;
 					try {
 						xr = XMLReaderFactory.createXMLReader();
 					} catch (SAXException e) {
-						throw new IOException(JGitText.get().noXMLParserAvailable);
+						throw new IOException(
+								JGitText.get().noXMLParserAvailable, e);
 					}
 					xr.setContentHandler(this);
 					try (InputStream in = c.getInputStream()) {
@@ -682,8 +713,13 @@
 		public void startElement(final String uri, final String name,
 				final String qName, final Attributes attributes)
 				throws SAXException {
-			if ("Key".equals(name) || "IsTruncated".equals(name)) //$NON-NLS-1$ //$NON-NLS-2$
+			if ("Key".equals(name) || "IsTruncated".equals(name) || "LastModified".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 				data = new StringBuilder();
+			}
+			if ("Contents".equals(name)) { //$NON-NLS-1$
+				keyName = null;
+				keyLastModified = null;
+			}
 		}
 
 		@Override
@@ -703,10 +739,16 @@
 		@Override
 		public void endElement(final String uri, final String name,
 				final String qName) throws SAXException {
-			if ("Key".equals(name)) //$NON-NLS-1$
-				entries.add(data.toString().substring(prefix.length()));
-			else if ("IsTruncated".equals(name)) //$NON-NLS-1$
+			if ("Key".equals(name))  { //$NON-NLS-1$
+				keyName = data.toString().substring(prefix.length());
+			} else if ("IsTruncated".equals(name)) { //$NON-NLS-1$
 				truncated = StringUtils.equalsIgnoreCase("true", data.toString()); //$NON-NLS-1$
+			} else if ("LastModified".equals(name)) { //$NON-NLS-1$
+				keyLastModified = Instant.parse(data.toString());
+			} else if ("Contents".equals(name)) { //$NON-NLS-1$
+				entries.add(new KeyInfo(keyName, keyLastModified.getEpochSecond()));
+			}
+
 			data = null;
 		}
 	}
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 8604244..1417fae 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
@@ -203,7 +203,9 @@
 			try {
 				id  = ObjectId.fromString(line.substring(0, 40));
 			} catch (InvalidObjectIdException e) {
-				throw invalidRefAdvertisementLine(line);
+				PackProtocolException ppe = invalidRefAdvertisementLine(line);
+				ppe.initCause(e);
+				throw ppe;
 			}
 			if (name.equals(".have")) { //$NON-NLS-1$
 				additionalHaves.add(id);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java
index 063fb6b..afa0a11 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java
@@ -24,8 +24,10 @@
  * <p>
  * If user interactivity is required by SSH (e.g. to obtain a password), the
  * connection will immediately fail.
+ *
+ * @since 5.7
  */
-class DefaultSshSessionFactory extends JschConfigSessionFactory {
+public class DefaultSshSessionFactory extends JschConfigSessionFactory {
 	/** {@inheritDoc} */
 	@Override
 	protected void configure(OpenSshConfig.Host hc, Session session) {
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 93800d5..c992bb1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
@@ -286,7 +286,7 @@
 		try {
 			len = RawParseUtils.parseHexInt16(lineBuffer, 0);
 		} catch (ArrayIndexOutOfBoundsException err) {
-			throw invalidHeader();
+			throw invalidHeader(err);
 		}
 
 		if (len == 0) {
@@ -320,6 +320,12 @@
 				+ (char) lineBuffer[2] + (char) lineBuffer[3]));
 	}
 
+	private IOException invalidHeader(Throwable cause) {
+		IOException ioe = invalidHeader();
+		ioe.initCause(cause);
+		return ioe;
+	}
+
 	/**
 	 * IOException thrown by read when the configured input limit is exceeded.
 	 *
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
index 8ca09f8..e505e17 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
@@ -1725,15 +1725,17 @@
 	 *            desired status to filter by.
 	 * @return a copy of the command list containing only those commands with
 	 *         the desired status.
+	 * @since 5.7
 	 */
-	private List<ReceiveCommand> filterCommands(Result want) {
+	protected List<ReceiveCommand> filterCommands(Result want) {
 		return ReceiveCommand.filter(commands, want);
 	}
 
 	/**
 	 * Execute commands to update references.
+	 * @since 5.7
 	 */
-	private void executeCommands() {
+	protected void executeCommands() {
 		List<ReceiveCommand> toApply = filterCommands(Result.NOT_ATTEMPTED);
 		if (toApply.isEmpty())
 			return;
@@ -2108,7 +2110,7 @@
 		} catch (InputOverLimitIOException e) {
 			String msg = JGitText.get().tooManyCommands;
 			fatalError(msg);
-			throw new PackProtocolException(msg);
+			throw new PackProtocolException(msg, e);
 		} finally {
 			try {
 				close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java
index 906c4ed..e6d2042 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java
@@ -13,6 +13,8 @@
 
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.Iterator;
+import java.util.ServiceLoader;
 
 import org.eclipse.jgit.errors.TransportException;
 import org.eclipse.jgit.lib.Constants;
@@ -31,8 +33,16 @@
  * SshSessionFactory for the duration of the period they are using the Session.
  */
 public abstract class SshSessionFactory {
-	private static SshSessionFactory INSTANCE = new DefaultSshSessionFactory();
+	private static SshSessionFactory INSTANCE = loadSshSessionFactory();
 
+	private static SshSessionFactory loadSshSessionFactory() {
+		ServiceLoader<SshSessionFactory> loader = ServiceLoader.load(SshSessionFactory.class);
+		Iterator<SshSessionFactory> iter = loader.iterator();
+		if(iter.hasNext()) {
+			return iter.next();
+		}
+		return null;
+	}
 	/**
 	 * Get the currently configured JVM-wide factory.
 	 * <p>
@@ -53,10 +63,11 @@
 	 *            default factory will be restored.s
 	 */
 	public static void setInstance(SshSessionFactory newFactory) {
-		if (newFactory != null)
+		if (newFactory != null) {
 			INSTANCE = newFactory;
-		else
-			INSTANCE = new DefaultSshSessionFactory();
+		} else {
+			INSTANCE = loadSshSessionFactory();
+		}
 	}
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
index 13b891f..c6ecb3a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
@@ -140,7 +140,7 @@
 			int n = handles.size();
 			uri = new URIish(SCHEME + "://test/conn" + n); //$NON-NLS-1$
 		} catch (URISyntaxException e) {
-			throw new IllegalStateException();
+			throw new IllegalStateException(e);
 		}
 		handles.put(uri, new Handle(req, remote));
 		return uri;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
index 94f36d2..784f566 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
@@ -23,6 +23,7 @@
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -241,11 +242,14 @@
 
 		@Override
 		Collection<String> getPackNames() throws IOException {
+			// s3.list returns most recently modified packs first.
+			// These are the packs most likely to contain missing refs.
+			final List<String> packList = s3.list(bucket, resolveKey("pack")); //$NON-NLS-1$
 			final HashSet<String> have = new HashSet<>();
-			have.addAll(s3.list(bucket, resolveKey("pack"))); //$NON-NLS-1$
+			have.addAll(packList);
 
 			final Collection<String> packs = new ArrayList<>();
-			for (String n : have) {
+			for (String n : packList) {
 				if (!n.startsWith("pack-") || !n.endsWith(".pack")) //$NON-NLS-1$ //$NON-NLS-2$
 					continue;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
index 155c115..04ebddb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
@@ -113,7 +113,10 @@
 		try {
 			src = new FileInputStream(bundle);
 		} catch (FileNotFoundException err) {
-			throw new TransportException(uri, JGitText.get().notFound);
+			TransportException te = new TransportException(uri,
+					JGitText.get().notFound);
+			te.initCause(err);
+			throw te;
 		}
 		return new BundleFetchConnection(this, src);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
index be17b44..403f98d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
@@ -143,7 +143,10 @@
 					.setFS(local != null ? local.getFS() : FS.DETECTED)
 					.setGitDir(remoteGitDir).build();
 		} catch (IOException err) {
-			throw new TransportException(uri, JGitText.get().notAGitDirectory);
+			TransportException te = new TransportException(uri,
+					JGitText.get().notAGitDirectory);
+			te.initCause(err);
+			throw te;
 		}
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
index 6ebb668..858d1f7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
@@ -266,7 +266,10 @@
 				try {
 					val = parseHexByte(c1, c2);
 				} catch (ArrayIndexOutOfBoundsException e) {
-					throw new URISyntaxException(s, JGitText.get().cannotParseGitURIish);
+					URISyntaxException use = new URISyntaxException(s,
+							JGitText.get().cannotParseGitURIish);
+					use.initCause(e);
+					throw use;
 				}
 				os[j++] = (byte) val;
 				i += 2;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
index 1880c8b..df9f11e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
@@ -282,9 +282,12 @@
 		String REGEX_TRANS = "(.+)/(.+)/(.+)"; //$NON-NLS-1$
 	}
 
-	static GeneralSecurityException securityError(String message) {
-		return new GeneralSecurityException(
+	static GeneralSecurityException securityError(String message,
+			Throwable cause) {
+		GeneralSecurityException e = new GeneralSecurityException(
 				MessageFormat.format(JGitText.get().encryptionError, message));
+		e.initCause(cause);
+		return e;
 	}
 
 	/**
@@ -332,21 +335,21 @@
 			try {
 				size = Integer.parseInt(keySize);
 			} catch (Exception e) {
-				throw securityError(X_KEY_SIZE + EMPTY + keySize);
+				throw securityError(X_KEY_SIZE + EMPTY + keySize, e);
 			}
 
 			final int iter;
 			try {
 				iter = Integer.parseInt(keyIter);
 			} catch (Exception e) {
-				throw securityError(X_KEY_ITER + EMPTY + keyIter);
+				throw securityError(X_KEY_ITER + EMPTY + keyIter, e);
 			}
 
 			final byte[] salt;
 			try {
 				salt = Hex.decode(keySalt.replaceAll(REGEX_WS, EMPTY));
 			} catch (Exception e) {
-				throw securityError(X_KEY_SALT + EMPTY + keySalt);
+				throw securityError(X_KEY_SALT + EMPTY + keySalt, e);
 			}
 
 			KeySpec keySpec = new PBEKeySpec(pass.toCharArray(), salt, iter, size);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
index 02ca86b..2c3f3e2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
@@ -1159,7 +1159,7 @@
 			} catch (CharacterCodingException e) {
 				// This should so never happen.
 				throw new RuntimeException(MessageFormat.format(
-						JGitText.get().unencodeableFile, getName()));
+						JGitText.get().unencodeableFile, getName()), e);
 			}
 
 			encodedNameLen = b.limit();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
index cd6647c..4156318 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
+ * Copyright (C) 2008, 2020 Shawn O. Pearce <spearce@spearce.org> and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -49,11 +49,15 @@
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -200,20 +204,7 @@
 		public static final FileStoreAttributes FALLBACK_FILESTORE_ATTRIBUTES = new FileStoreAttributes(
 				FALLBACK_TIMESTAMP_RESOLUTION);
 
-		private static final Map<FileStore, FileStoreAttributes> attributeCache = new ConcurrentHashMap<>();
-
-		private static final SimpleLruCache<Path, FileStoreAttributes> attrCacheByPath = new SimpleLruCache<>(
-				100, 0.2f);
-
-		private static AtomicBoolean background = new AtomicBoolean();
-
-		private static Map<FileStore, Lock> locks = new ConcurrentHashMap<>();
-
-		private static void setBackground(boolean async) {
-			background.set(async);
-		}
-
-		private static final String javaVersionPrefix = SystemReader
+		private static final String JAVA_VERSION_PREFIX = SystemReader
 				.getInstance().getHostname() + '|'
 				+ System.getProperty("java.vendor") + '|' //$NON-NLS-1$
 				+ System.getProperty("java.version") + '|'; //$NON-NLS-1$
@@ -221,6 +212,44 @@
 		private static final Duration FALLBACK_MIN_RACY_INTERVAL = Duration
 				.ofMillis(10);
 
+		private static final Map<FileStore, FileStoreAttributes> attributeCache = new ConcurrentHashMap<>();
+
+		private static final SimpleLruCache<Path, FileStoreAttributes> attrCacheByPath = new SimpleLruCache<>(
+				100, 0.2f);
+
+		private static final AtomicBoolean background = new AtomicBoolean();
+
+		private static final Map<FileStore, Lock> locks = new ConcurrentHashMap<>();
+
+		private static final AtomicInteger threadNumber = new AtomicInteger(1);
+
+		/**
+		 * Don't use the default thread factory of the ForkJoinPool for the
+		 * CompletableFuture; it runs without any privileges, which causes
+		 * trouble if a SecurityManager is present.
+		 * <p>
+		 * Instead use normal daemon threads. They'll belong to the
+		 * SecurityManager's thread group, or use the one of the calling thread,
+		 * as appropriate.
+		 * </p>
+		 *
+		 * @see java.util.concurrent.Executors#newCachedThreadPool()
+		 */
+		private static final Executor FUTURE_RUNNER = new ThreadPoolExecutor(0,
+				5, 30L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
+				runnable -> {
+					Thread t = new Thread(runnable, "FileStoreAttributeReader-" //$NON-NLS-1$
+							+ threadNumber.getAndIncrement());
+					// Make sure these threads don't prevent application/JVM
+					// shutdown.
+					t.setDaemon(true);
+					return t;
+				});
+
+		private static void setBackground(boolean async) {
+			background.set(async);
+		}
+
 		/**
 		 * Configures size and purge factor of the path-based cache for file
 		 * system attributes. Caching of file system attributes avoids recurring
@@ -304,8 +333,7 @@
 								// Some earlier future might have set the value
 								// and removed itself since we checked for the
 								// value above. Hence check cache again.
-								FileStoreAttributes c = attributeCache
-										.get(s);
+								FileStoreAttributes c = attributeCache.get(s);
 								if (c != null) {
 									return Optional.of(c);
 								}
@@ -339,7 +367,7 @@
 								locks.remove(s);
 							}
 							return attributes;
-						});
+						}, FUTURE_RUNNER);
 				f = f.exceptionally(e -> {
 					LOG.error(e.getLocalizedMessage(), e);
 					return Optional.empty();
@@ -450,6 +478,11 @@
 				LOG.debug("{}: end measure timestamp resolution {} in {}", //$NON-NLS-1$
 						Thread.currentThread(), s, dir);
 				return Optional.of(fsResolution);
+			} catch (SecurityException e) {
+				// Log it here; most likely deleteProbe() below will also run
+				// into a SecurityException, and then this one will be lost
+				// without trace.
+				LOG.warn(e.getLocalizedMessage(), e);
 			} catch (AccessDeniedException e) {
 				LOG.warn(e.getLocalizedMessage(), e); // see bug 548648
 			} catch (IOException e) {
@@ -595,7 +628,7 @@
 			} else {
 				storeKey = s.name();
 			}
-			return javaVersionPrefix + storeKey;
+			return JAVA_VERSION_PREFIX + storeKey;
 		}
 
 		private static TimeUnit getUnit(long nanos) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
index fa99087..4831fbb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
@@ -300,7 +300,8 @@
 			} catch (InterruptedException e) {
 				throw new IOException(
 						MessageFormat.format(JGitText.get().renameFileFailed,
-								src.getAbsolutePath(), dst.getAbsolutePath()));
+								src.getAbsolutePath(), dst.getAbsolutePath()),
+						e);
 			}
 		}
 		throw new IOException(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java
index 1356136..1947b3b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java
@@ -70,7 +70,7 @@
 			beginRead();
 			return super.read();
 		} catch (InterruptedIOException e) {
-			throw readTimedOut();
+			throw readTimedOut(e);
 		} finally {
 			endRead();
 		}
@@ -89,7 +89,7 @@
 			beginRead();
 			return super.read(buf, off, cnt);
 		} catch (InterruptedIOException e) {
-			throw readTimedOut();
+			throw readTimedOut(e);
 		} finally {
 			endRead();
 		}
@@ -102,7 +102,7 @@
 			beginRead();
 			return super.skip(cnt);
 		} catch (InterruptedIOException e) {
-			throw readTimedOut();
+			throw readTimedOut(e);
 		} finally {
 			endRead();
 		}
@@ -116,8 +116,11 @@
 		myTimer.end();
 	}
 
-	private InterruptedIOException readTimedOut() {
-		return new InterruptedIOException(MessageFormat.format(
-				JGitText.get().readTimedOut, Integer.valueOf(timeout)));
+	private InterruptedIOException readTimedOut(InterruptedIOException e) {
+		InterruptedIOException interrupted = new InterruptedIOException(
+				MessageFormat.format(JGitText.get().readTimedOut,
+						Integer.valueOf(timeout)));
+		interrupted.initCause(e);
+		return interrupted;
 	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java
index 7532c42..3fbf6ff 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java
@@ -72,7 +72,7 @@
 			beginWrite();
 			dst.write(b);
 		} catch (InterruptedIOException e) {
-			throw writeTimedOut();
+			throw writeTimedOut(e);
 		} finally {
 			endWrite();
 		}
@@ -91,7 +91,7 @@
 			beginWrite();
 			dst.write(buf, off, len);
 		} catch (InterruptedIOException e) {
-			throw writeTimedOut();
+			throw writeTimedOut(e);
 		} finally {
 			endWrite();
 		}
@@ -104,7 +104,7 @@
 			beginWrite();
 			dst.flush();
 		} catch (InterruptedIOException e) {
-			throw writeTimedOut();
+			throw writeTimedOut(e);
 		} finally {
 			endWrite();
 		}
@@ -117,7 +117,7 @@
 			beginWrite();
 			dst.close();
 		} catch (InterruptedIOException e) {
-			throw writeTimedOut();
+			throw writeTimedOut(e);
 		} finally {
 			endWrite();
 		}
@@ -131,8 +131,11 @@
 		myTimer.end();
 	}
 
-	private InterruptedIOException writeTimedOut() {
-		return new InterruptedIOException(MessageFormat.format(
-				JGitText.get().writeTimedOut, Integer.valueOf(timeout)));
+	private InterruptedIOException writeTimedOut(InterruptedIOException cause) {
+		InterruptedIOException e = new InterruptedIOException(
+				MessageFormat.format(JGitText.get().writeTimedOut,
+						Integer.valueOf(timeout)));
+		e.initCause(cause);
+		return e;
 	}
 }
diff --git a/pom.xml b/pom.xml
index 2eeda67..d0a5c83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,27 +155,27 @@
     <apache-sshd-version>2.2.0</apache-sshd-version>
     <jsch-version>0.1.55</jsch-version>
     <jzlib-version>1.1.1</jzlib-version>
-    <javaewah-version>1.1.6</javaewah-version>
-    <junit-version>4.12</junit-version>
+    <javaewah-version>1.1.7</javaewah-version>
+    <junit-version>4.13</junit-version>
     <test-fork-count>1C</test-fork-count>
     <args4j-version>2.33</args4j-version>
-    <commons-compress-version>1.18</commons-compress-version>
+    <commons-compress-version>1.19</commons-compress-version>
     <osgi-core-version>4.3.1</osgi-core-version>
     <servlet-api-version>3.1.0</servlet-api-version>
     <jetty-version>9.4.25.v20191220</jetty-version>
-    <japicmp-version>0.14.1</japicmp-version>
-    <httpclient-version>4.5.6</httpclient-version>
-    <httpcore-version>4.4.10</httpcore-version>
+    <japicmp-version>0.14.3</japicmp-version>
+    <httpclient-version>4.5.10</httpclient-version>
+    <httpcore-version>4.4.12</httpcore-version>
     <slf4j-version>1.7.2</slf4j-version>
     <log4j-version>1.2.15</log4j-version>
     <maven-javadoc-plugin-version>3.1.1</maven-javadoc-plugin-version>
-    <tycho-extras-version>1.5.1</tycho-extras-version>
+    <tycho-extras-version>1.6.0</tycho-extras-version>
     <gson-version>2.8.2</gson-version>
     <bouncycastle-version>1.64</bouncycastle-version>
     <spotbugs-maven-plugin-version>3.1.12.2</spotbugs-maven-plugin-version>
     <maven-project-info-reports-plugin-version>3.0.0</maven-project-info-reports-plugin-version>
     <maven-jxr-plugin-version>3.0.0</maven-jxr-plugin-version>
-    <maven-surefire-plugin-version>3.0.0-M3</maven-surefire-plugin-version>
+    <maven-surefire-plugin-version>3.0.0-M4</maven-surefire-plugin-version>
     <maven-surefire-report-plugin-version>${maven-surefire-plugin-version}</maven-surefire-report-plugin-version>
     <maven-compiler-plugin-version>3.8.1</maven-compiler-plugin-version>
 
@@ -298,7 +298,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-pmd-plugin</artifactId>
-          <version>3.12.0</version>
+          <version>3.13.0</version>
           <configuration>
             <sourceEncoding>utf-8</sourceEncoding>
             <minimumTokens>100</minimumTokens>
@@ -775,6 +775,11 @@
         <version>${bouncycastle-version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>org.assertj</groupId>
+        <artifactId>assertj-core</artifactId>
+        <version>3.14.0</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 
@@ -831,9 +836,6 @@
                 <configuration>
                   <compilerId>javac-with-errorprone</compilerId>
                   <forceJavacCompilerUse>true</forceJavacCompilerUse>
-                  <compilerArgs>
-                    <arg>-Xep:ExpectedExceptionChecker:ERROR</arg>
-                  </compilerArgs>
                   <excludes>
                     <exclude>org/eclipse/jgit/transport/InsecureCipherFactory.java</exclude>
                   </excludes>
diff --git a/tools/BUILD b/tools/BUILD
index e5931dc..2b20874 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -39,7 +39,6 @@
         "-Xep:ElementsCountedInLoop:ERROR",
         "-Xep:EqualsHashCode:ERROR",
         "-Xep:EqualsIncompatibleType:ERROR",
-        "-Xep:ExpectedExceptionChecker:ERROR",
         "-Xep:Finally:WARN",
         "-Xep:FloatingPointLiteralPrecision:ERROR",
         "-Xep:FragmentInjection:ERROR",
@@ -79,6 +78,7 @@
         "-Xep:TypeParameterShadowing:ERROR",
         "-Xep:TypeParameterUnusedInFormals:WARN",
         "-Xep:URLEqualsHashCode:ERROR",
+        "-Xep:UnusedException:ERROR",
         "-Xep:UnsynchronizedOverridesSynchronized:ERROR",
         "-Xep:WaitNotInLoop:ERROR",
     ],