Merge branch 'master' into next

* master:
  Bazel: Add support for JDK 21
  Bazel: Replace deprecated --experimental_strict_action_env option
  Fix warning about using raw type
  [errorprone] Fix pattern ModifiedButNotUsed
  [errorprone] Fix pattern CatchAndPrintStackTrace
  [errorprone] Fix pattern FutureReturnValueIgnored
  [errorprone] Fix pattern BadImport
  [errorprone] Fix pattern UseCorrectAssertInTests
  [errorprone] Fix pattern ProtectedMembersInFinalClass
  [errorprone] Fix pattern CatchFail
  [errorprone] Fix pattern see UnusedVariable
  [errorprone] Fix pattern LongLiteralLowerCaseSuffix
  [errorprone] Fix error pattern JdkObsolete
  [errorprone] Fix UnnecessaryParentheses errors
  Bazel: Update RBE docker image to Ubuntu 22.04 and JDK 17
  Bump Bazel version to 7.1.1
  PackIndex: Make #getOffset protected to allow out-of-package subclasses

Change-Id: I4ecde5e6a3cb9f122990893fa97f6d2a9978bcc4
diff --git a/.bazelrc b/.bazelrc
index 5e1df62..7c71c4a 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -1,6 +1,10 @@
+# TODO(davido): Migrate all dependencies from WORKSPACE to MODULE.bazel
+# https://issues.gerritcodereview.com/issues/303819949
+common --noenable_bzlmod
+
 build --workspace_status_command="python ./tools/workspace_status.py"
 build --repository_cache=~/.gerritcodereview/bazel-cache/repository
-build --experimental_strict_action_env
+build --incompatible_strict_action_env
 build --action_env=PATH
 build --disk_cache=~/.gerritcodereview/bazel-cache/cas
 
@@ -17,7 +21,7 @@
 build:remote11 --tool_java_runtime_version=remotejdk_11
 build:remote11 --config=remote
 
-# Builds using remote_jdk17, executes using remote_jdk11 or local_jdk
+# Builds using remote_jdk17, executes using remote_jdk17 or local_jdk
 build:java17 --java_language_version=17
 build:java17 --java_runtime_version=remotejdk_17
 build:java17 --tool_java_language_version=17
@@ -30,6 +34,19 @@
 build:remote17 --tool_java_runtime_version=remotejdk_17
 build:remote17 --config=remote
 
+# Builds using remote_jdk21, executes using remote_jdk21 or local_jdk
+build:java21 --java_language_version=21
+build:java21 --java_runtime_version=remotejdk_21
+build:java21 --tool_java_language_version=21
+build:java21 --tool_java_runtime_version=remotejdk_21
+
+# Builds and executes on RBE using remotejdk_21
+build:remote21 --java_language_version=21
+build:remote21 --java_runtime_version=remotejdk_21
+build:remote21 --tool_java_language_version=21
+build:remote21 --tool_java_runtime_version=remotejdk_21
+build:remote21 --config=remote
+
 test --build_tests_only
 test --test_output=errors
 test --flaky_test_attempts=3
diff --git a/.bazelversion b/.bazelversion
index 91e4a9f..21c8c7b 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-6.3.2
+7.1.1
diff --git a/MODULE.bazel b/MODULE.bazel
new file mode 100644
index 0000000..0b932b8
--- /dev/null
+++ b/MODULE.bazel
@@ -0,0 +1,2 @@
+# TODO(davido): Migrate all dependencies from WORKSPACE to MODULE.bazel
+# https://issues.gerritcodereview.com/issues/303819949
diff --git a/WORKSPACE b/WORKSPACE
index 21ebc72..07d4d5c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,12 +11,24 @@
 )
 
 http_archive(
-    name = "rbe_jdk11",
-    sha256 = "dbcfd6f26589ef506b91fe03a12dc559ca9c84699e4cf6381150522287f0e6f6",
-    strip_prefix = "rbe_autoconfig-3.1.0",
+    name = "rules_java",
+    sha256 = "4da3761f6855ad916568e2bfe86213ba6d2637f56b8360538a7fb6125abf6518",
     urls = [
-        "https://gerrit-bazel.storage.googleapis.com/rbe_autoconfig/v3.1.0.tar.gz",
-        "https://github.com/davido/rbe_autoconfig/archive/v3.1.0.tar.gz",
+        "https://github.com/bazelbuild/rules_java/releases/download/7.5.0/rules_java-7.5.0.tar.gz",
+    ],
+)
+
+load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains")
+
+rules_java_dependencies()
+
+http_archive(
+    name = "ubuntu2204_jdk17",
+    sha256 = "8ea82b81c9707e535ff93ef5349d11e55b2a23c62bcc3b0faaec052144aed87d",
+    strip_prefix = "rbe_autoconfig-5.1.0",
+    urls = [
+        "https://gerrit-bazel.storage.googleapis.com/rbe_autoconfig/v5.1.0.tar.gz",
+        "https://github.com/davido/rbe_autoconfig/releases/download/v5.1.0/v5.1.0.tar.gz",
     ],
 )
 
@@ -24,6 +36,14 @@
 
 register_toolchains("//tools:error_prone_warnings_toolchain_java17_definition")
 
+register_toolchains("//tools:error_prone_warnings_toolchain_java21_definition")
+
+# Order of registering toolchains matters. rules_java toolchains take precedence
+# over the custom toolchains, so the default jdk21 toolchain gets picked
+# (one without custom package_config). That's why the `rules_java_toolchains()`
+# must be called after the `register_toolchain()` invocation.
+rules_java_toolchains()
+
 JMH_VERS = "1.37"
 
 maven_jar(
diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java
index 6d806de..0cb6fe1 100644
--- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java
+++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java
@@ -25,10 +25,10 @@
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -300,7 +300,7 @@
 		for (Header hdr : resp.getAllHeaders()) {
 			List<String> list = ret.get(hdr.getName());
 			if (list == null) {
-				list = new LinkedList<>();
+				list = new ArrayList<>();
 				ret.put(hdr.getName(), list);
 			}
 			for (HeaderElement hdrElem : hdr.getElements()) {
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 2f3eee4..703c0be 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
@@ -12,7 +12,7 @@
 
 import java.io.File;
 import java.text.MessageFormat;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.servlet.Filter;
@@ -65,9 +65,9 @@
 
 	private ReceivePackErrorHandler receivePackErrorHandler;
 
-	private final List<Filter> uploadPackFilters = new LinkedList<>();
+	private final List<Filter> uploadPackFilters = new ArrayList<>();
 
-	private final List<Filter> receivePackFilters = new LinkedList<>();
+	private final List<Filter> receivePackFilters = new ArrayList<>();
 
 	/**
 	 * New servlet that will load its base directory from {@code web.xml}.
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/FileResolverTest.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/FileResolverTest.java
index 8d25c2e..34c871a 100644
--- a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/FileResolverTest.java
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/FileResolverTest.java
@@ -88,7 +88,7 @@
 		try {
 			resolver.open(null, name).close();
 		} catch (ServiceNotEnabledException e) {
-			fail("did not honor export-all flag");
+			throw new AssertionError("did not honor export-all flag", e);
 		}
 
 		FileUtils.createNewFile(export);
@@ -99,7 +99,7 @@
 		try {
 			resolver.open(null, name).close();
 		} catch (ServiceNotEnabledException e) {
-			fail("did not honor git-daemon-export-ok");
+			throw new AssertionError("did not honor git-daemon-export-ok", e);
 		}
 	}
 
diff --git a/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java b/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java
index 1138be8..f5627e0 100644
--- a/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java
+++ b/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java
@@ -323,7 +323,7 @@
 		server.setFileSystemFactory(new VirtualFileSystemFactory(repository
 				.getDirectory().getParentFile().getAbsoluteFile().toPath()));
 		return Collections
-				.singletonList((new SftpSubsystemFactory.Builder()).build());
+				.singletonList(new SftpSubsystemFactory.Builder().build());
 	}
 
 	/**
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java
index d7d8d63..1a4e85d 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java
@@ -9,11 +9,11 @@
  */
 package org.eclipse.jgit.lfs.internal;
 
+import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME;
 import static org.eclipse.jgit.util.HttpSupport.ENCODING_GZIP;
 import static org.eclipse.jgit.util.HttpSupport.HDR_ACCEPT;
 import static org.eclipse.jgit.util.HttpSupport.HDR_ACCEPT_ENCODING;
 import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_TYPE;
-import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME;
 
 import java.io.IOException;
 import java.net.ProxySelector;
@@ -22,7 +22,7 @@
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -266,7 +266,7 @@
 		Protocol.Request req = new Protocol.Request();
 		req.operation = operation;
 		if (resources != null) {
-			req.objects = new LinkedList<>();
+			req.objects = new ArrayList<>();
 			for (LfsPointer res : resources) {
 				Protocol.ObjectSpec o = new Protocol.ObjectSpec();
 				o.oid = res.getOid().getName();
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java
index cbb5bbb..a1fb9fb 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CloneTest.java
@@ -183,7 +183,7 @@
 
 		File gitDir = db.getDirectory();
 		String sourcePath = gitDir.getAbsolutePath();
-		String targetPath = (new File(sourcePath)).getParentFile()
+		String targetPath = new File(sourcePath).getParentFile()
 				.getParentFile().getAbsolutePath()
 				+ File.separator + "target.git";
 		String cmd = "git clone --bare " + shellQuote(sourcePath) + " "
@@ -207,7 +207,7 @@
 
 		File gitDir = db.getDirectory();
 		String sourcePath = gitDir.getAbsolutePath();
-		String targetPath = (new File(sourcePath)).getParentFile()
+		String targetPath = new File(sourcePath).getParentFile()
 				.getParentFile().getAbsolutePath() + File.separator
 				+ "target.git";
 		String cmd = "git clone --mirror " + shellQuote(sourcePath) + " "
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ConfigTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ConfigTest.java
index 005215f..0af310c 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ConfigTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ConfigTest.java
@@ -45,10 +45,9 @@
 		Map<String, String> options = parseOptions(output);
 
 		assertEquals(!isWindows, Boolean.valueOf(options.get("core.filemode")));
-		assertTrue((Boolean.valueOf(options.get("core.logallrefupdates"))));
+		assertTrue(Boolean.valueOf(options.get("core.logallrefupdates")));
 		if (isMac) {
-			assertTrue(
-					(Boolean.valueOf(options.get("core.precomposeunicode"))));
+			assertTrue(Boolean.valueOf(options.get("core.precomposeunicode")));
 		}
 		assertEquals(Integer.valueOf(0),
 				Integer.valueOf(options.get("core.repositoryformatversion")));
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java
index 210e172..2a9f7ac 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java
@@ -19,10 +19,10 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Vector;
 
 /**
  * List of all commands known by jgit's command line tools.
@@ -104,7 +104,7 @@
 			final String pfx = "META-INF/services/"; //$NON-NLS-1$
 			return ldr.getResources(pfx + TextBuiltin.class.getName());
 		} catch (IOException err) {
-			return new Vector<URL>().elements();
+			return Collections.emptyEnumeration();
 		}
 	}
 
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/KnownHostEntryReader.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/KnownHostEntryReader.java
index a00e5d9..96829b7 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/KnownHostEntryReader.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/KnownHostEntryReader.java
@@ -18,9 +18,9 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -65,7 +65,7 @@
 	 */
 	public static List<KnownHostEntry> readFromFile(Path path)
 			throws IOException {
-		List<KnownHostEntry> result = new LinkedList<>();
+		List<KnownHostEntry> result = new ArrayList<>();
 		try (BufferedReader r = Files.newBufferedReader(path, UTF_8)) {
 			r.lines().forEachOrdered(l -> {
 				if (l == null) {
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/OpenSshServerKeyDatabase.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/OpenSshServerKeyDatabase.java
index 65ba5be..2b4f7e5 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/OpenSshServerKeyDatabase.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/OpenSshServerKeyDatabase.java
@@ -31,7 +31,6 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
@@ -587,7 +586,7 @@
 				if (rawEntries == null || rawEntries.isEmpty()) {
 					return Collections.emptyList();
 				}
-				List<HostEntryPair> newEntries = new LinkedList<>();
+				List<HostEntryPair> newEntries = new ArrayList<>();
 				for (KnownHostEntry entry : rawEntries) {
 					AuthorizedKeyEntry keyPart = entry.getKeyEntry();
 					if (keyPart == null) {
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java
index b94ccc6..96316ba 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java
@@ -23,7 +23,6 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -263,7 +262,7 @@
 	private List<URIish> parseProxyJump(String proxyJump)
 			throws URISyntaxException {
 		String[] hops = proxyJump.split(","); //$NON-NLS-1$
-		List<URIish> result = new LinkedList<>();
+		List<URIish> result = new ArrayList<>();
 		for (String hop : hops) {
 			// There shouldn't be any whitespace, but let's be lenient
 			hop = hop.trim();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
index db2d5d1..1c2e995 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
@@ -13,6 +13,8 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.util.FileUtils.RECURSIVE;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
@@ -607,14 +609,14 @@
 		try (Git git = new Git(db)) {
 			DirCache dc = git.add().addFilepattern("a.txt").call();
 
-			dc.getEntry(0).getObjectId();
+			ObjectId oid = dc.getEntry(0).getObjectId();
 
 			try (PrintWriter writer = new PrintWriter(file, UTF_8.name())) {
 				writer.print("other content");
 			}
 
 			dc = git.add().addFilepattern("a.txt").call();
-
+			assertNotEquals(oid, dc.getEntry(0).getObjectId());
 			assertEquals(
 					"[a.txt, mode:100644, content:other content]",
 					indexState(CONTENT));
@@ -632,7 +634,7 @@
 		try (Git git = new Git(db)) {
 			DirCache dc = git.add().addFilepattern("a.txt").call();
 
-			dc.getEntry(0).getObjectId();
+			ObjectId oid = dc.getEntry(0).getObjectId();
 
 			git.commit().setMessage("commit a.txt").call();
 
@@ -641,7 +643,7 @@
 			}
 
 			dc = git.add().addFilepattern("a.txt").call();
-
+			assertNotEquals(oid, dc.getEntry(0).getObjectId());
 			assertEquals(
 					"[a.txt, mode:100644, content:other content]",
 					indexState(CONTENT));
@@ -659,12 +661,12 @@
 		try (Git git = new Git(db)) {
 			DirCache dc = git.add().addFilepattern("a.txt").call();
 
-			dc.getEntry(0).getObjectId();
+			ObjectId oid = dc.getEntry(0).getObjectId();
 			FileUtils.delete(file);
 
 			// is supposed to do nothing
 			dc = git.add().addFilepattern("a.txt").call();
-
+			assertEquals(oid, dc.getEntry(0).getObjectId());
 			assertEquals(
 					"[a.txt, mode:100644, content:content]",
 					indexState(CONTENT));
@@ -684,12 +686,12 @@
 
 			git.commit().setMessage("commit a.txt").call();
 
-			dc.getEntry(0).getObjectId();
+			ObjectId oid = dc.getEntry(0).getObjectId();
 			FileUtils.delete(file);
 
 			// is supposed to do nothing
 			dc = git.add().addFilepattern("a.txt").call();
-
+			assertEquals(oid, dc.getEntry(0).getObjectId());
 			assertEquals(
 					"[a.txt, mode:100644, content:content]",
 					indexState(CONTENT));
@@ -878,7 +880,7 @@
 			}
 		}
 		// Help null pointer analysis.
-		assert lastFile != null;
+		assertNotNull(lastFile);
 		// Wait a bit. If entries are "racily clean", we'll recompute
 		// hashes from the disk files, and then the second add is also slow.
 		// We want to test the normal case.
@@ -1259,7 +1261,7 @@
 					"[git-link-dir, mode:160000]",
 					indexState(0));
 			Set<String> untrackedFiles = git.status().call().getUntracked();
-			assert (untrackedFiles.isEmpty());
+			assertTrue(untrackedFiles.isEmpty());
 		}
 
 	}
@@ -1274,7 +1276,8 @@
 				ConfigConstants.CONFIG_KEY_DIRNOGITLINKS, true);
 		config.save();
 
-		assert (db.getConfig().get(WorkingTreeOptions.KEY).isDirNoGitLinks());
+		assertTrue(
+				db.getConfig().get(WorkingTreeOptions.KEY).isDirNoGitLinks());
 
 		try (Git git = new Git(db)) {
 			git.add().addFilepattern("nested-repo").call();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java
index b7abba4..57e5d49 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTest.java
@@ -284,11 +284,10 @@
 			// template)
 			chars = commit.getFullMessage().getBytes(UTF_8);
 			int lineStart = 0;
-			int lineEnd = 0;
 			for (int i = 0; i < 4; i++) {
 				lineStart = RawParseUtils.nextLF(chars, lineStart);
 			}
-			lineEnd = RawParseUtils.nextLF(chars, lineStart);
+			int lineEnd = RawParseUtils.nextLF(chars, lineStart);
 
 			String line = RawParseUtils.decode(chars, lineStart, lineEnd);
 
@@ -303,13 +302,12 @@
 			// we should find the untouched template
 			chars = commit.getFullMessage().getBytes(UTF_8);
 			lineStart = 0;
-			lineEnd = 0;
 			for (int i = 0; i < 4; i++) {
 				lineStart = RawParseUtils.nextLF(chars, lineStart);
 			}
 			lineEnd = RawParseUtils.nextLF(chars, lineStart);
 
-			line = RawParseUtils.decode(chars, lineStart, lineEnd);
+			RawParseUtils.decode(chars, lineStart, lineEnd);
 
 			assertTrue(commit.getFullMessage()
 					.contains("Change-Id: I" + ObjectId.zeroId().getName()));
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PathCheckoutCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PathCheckoutCommandTest.java
index f52b715..cf952d2 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PathCheckoutCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PathCheckoutCommandTest.java
@@ -172,9 +172,9 @@
 	@Test
 	public void testUpdateWorkingDirectoryFromIndex() throws Exception {
 		CheckoutCommand co = git.checkout();
-		File written = writeTrashFile(FILE1, "3a");
+		writeTrashFile(FILE1, "3a");
 		git.add().addFilepattern(FILE1).call();
-		written = writeTrashFile(FILE1, "");
+		File written = writeTrashFile(FILE1, "");
 		assertEquals("", read(written));
 		co.addPath(FILE1).call();
 		assertEquals("3a", read(written));
@@ -185,9 +185,9 @@
 	public void testUpdateWorkingDirectoryFromHeadWithIndexChange()
 			throws Exception {
 		CheckoutCommand co = git.checkout();
-		File written = writeTrashFile(FILE1, "3a");
+		writeTrashFile(FILE1, "3a");
 		git.add().addFilepattern(FILE1).call();
-		written = writeTrashFile(FILE1, "");
+		File written = writeTrashFile(FILE1, "");
 		assertEquals("", read(written));
 		co.addPath(FILE1).setStartPoint("HEAD").call();
 		assertEquals("3", read(written));
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
index 987c98e..02e3a2e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
@@ -2650,7 +2650,9 @@
 			assertEquals("1111111", firstLine.getCommit().name());
 			assertEquals("pick", firstLine.getAction().toToken());
 		} catch (Exception e) {
-			fail("Valid parsable RebaseTodoLine that has been commented out should allow to change the action, but failed");
+			throw new AssertionError(
+					"Valid parsable RebaseTodoLine that has been commented out should allow to change the action, but failed",
+					e);
 		}
 
 		assertEquals("2222222", steps.get(1).getCommit().name());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java
index f9af968..c81731d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashDropCommandTest.java
@@ -69,8 +69,7 @@
 		RevCommit stashed = git.stashCreate().call();
 		assertNotNull(stashed);
 		stashRef = git.getRepository().exactRef(Constants.R_STASH);
-		assertEquals(stashed,
-				git.getRepository().exactRef(Constants.R_STASH).getObjectId());
+		assertEquals(stashed, stashRef.getObjectId());
 		try {
 			assertNull(git.stashDrop().setStashRef(100).call());
 			fail("Exception not thrown");
@@ -88,8 +87,7 @@
 		RevCommit stashed = git.stashCreate().call();
 		assertNotNull(stashed);
 		stashRef = git.getRepository().exactRef(Constants.R_STASH);
-		assertEquals(stashed,
-				git.getRepository().exactRef(Constants.R_STASH).getObjectId());
+		assertEquals(stashed, stashRef.getObjectId());
 		assertNull(git.stashDrop().call());
 		stashRef = git.getRepository().exactRef(Constants.R_STASH);
 		assertNull(stashRef);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/CGitAttributesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/CGitAttributesTest.java
index 5638c1f..562a515 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/CGitAttributesTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/CGitAttributesTest.java
@@ -104,10 +104,9 @@
 				UTF_8))) {
 			r.lines().forEach(line -> {
 				// Parse the line and add to result map
-				int start = 0;
 				int i = line.indexOf(':');
 				String path = line.substring(0, i).trim();
-				start = i + 1;
+				int start = i + 1;
 				i = line.indexOf(':', start);
 				String key = line.substring(start, i).trim();
 				String value = line.substring(i + 1).trim();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/TreeWalkAttributeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/TreeWalkAttributeTest.java
index 73abd2d..698fdb3 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/TreeWalkAttributeTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/TreeWalkAttributeTest.java
@@ -791,7 +791,7 @@
 		for (Attribute a : attributes) {
 			ret.add(a);
 		}
-		return (ret);
+		return ret;
 	}
 
 	private File writeAttributesFile(String name, String... rules)
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/merge/MergeGitAttributeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/merge/MergeGitAttributeTest.java
index 6b23de3..009ca8a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/merge/MergeGitAttributeTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/merge/MergeGitAttributeTest.java
@@ -19,6 +19,7 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.UncheckedIOException;
 import java.nio.file.Files;
 import java.util.function.Consumer;
 
@@ -97,19 +98,19 @@
 			try {
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "F\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "E\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		})) {
 			checkoutBranch(REFS_HEADS_LEFT);
@@ -139,19 +140,19 @@
 				writeTrashFile(".gitattributes", "*.cat -merge");
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "F\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "E\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		})) {
 			// Check that the merge attribute is unset
@@ -184,19 +185,19 @@
 				writeTrashFile(".gitattributes", "*.txt -merge");
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "F\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "E\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		})) {
 			// Check that the merge attribute is unset
@@ -228,19 +229,19 @@
 				writeTrashFile(".gitattributes", "*.cat merge=binary");
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "B\n" + "C\n" + "F\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		}, g -> {
 			try {
 				writeTrashFile("main.cat", "A\n" + "E\n" + "C\n" + "D\n");
 			} catch (IOException e) {
-				e.printStackTrace();
+				throw new UncheckedIOException(e);
 			}
 		})) {
 			// Check that the merge attribute is set to binary
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBuilderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBuilderTest.java
index 703d68b..6180110 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBuilderTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBuilderTest.java
@@ -218,7 +218,7 @@
 		try {
 			b.commit();
 		} catch (ReceivedEventMarkerException e) {
-			fail("unexpected IndexChangedEvent");
+			throw new AssertionError("unexpected IndexChangedEvent", e);
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackParserTest.java
index 845d5fc..130af27 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackParserTest.java
@@ -46,10 +46,10 @@
 				.fromString("2e65efe2a145dda7ee51d1741299f848e5bf752e");
 
 		pack.header(2);
-		pack.write((Constants.OBJ_BLOB) << 4 | 1);
+		pack.write(Constants.OBJ_BLOB << 4 | 1);
 		pack.deflate(new byte[] { 'a' });
 
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		pack.copyRaw(blobA);
 		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		pack.digest();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java
index 96a0649..8c1b4f7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java
@@ -10,7 +10,6 @@
 
 package org.eclipse.jgit.internal.storage.file;
 
-import static java.lang.Integer.valueOf;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
@@ -73,7 +72,7 @@
 				try {
 					gc.setProgressMonitor(this);
 					gc.repack();
-					return valueOf(0);
+					return Integer.valueOf(0);
 				} catch (IOException e) {
 					// leave the syncPoint in broken state so any awaiting
 					// threads and any threads that call await in the future get
@@ -84,7 +83,7 @@
 					} catch (InterruptedException ignored) {
 						//
 					}
-					return valueOf(1);
+					return Integer.valueOf(1);
 				}
 			}
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcKeepFilesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcKeepFilesTest.java
index 9a2935f1..e1b6778 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcKeepFilesTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcKeepFilesTest.java
@@ -162,7 +162,7 @@
 	private void testKeptObjectsAreIncluded() throws Exception {
 		BranchBuilder bb = tr.branch("refs/heads/master");
 		ObjectId commitObjectInLockedPack = bb.commit().create().toObjectId();
-		gc.gc();
+		gc.gc().get();
 		stats = gc.getStatistics();
 		assertEquals(COMMIT_AND_TREE_OBJECTS, stats.numberOfPackedObjects);
 		assertEquals(1, stats.numberOfPackFiles);
@@ -170,7 +170,7 @@
 				.createNewFile());
 
 		bb.commit().create();
-		gc.gc();
+		gc.gc().get();
 		stats = gc.getStatistics();
 		assertEquals(2 * COMMIT_AND_TREE_OBJECTS + 1,
 				stats.numberOfPackedObjects);
@@ -194,7 +194,7 @@
 	private void testKeptObjectsAreNotIncluded() throws Exception {
 		BranchBuilder bb = tr.branch("refs/heads/master");
 		ObjectId commitObjectInLockedPack = bb.commit().create().toObjectId();
-		gc.gc();
+		gc.gc().get();
 		stats = gc.getStatistics();
 		assertEquals(COMMIT_AND_TREE_OBJECTS, stats.numberOfPackedObjects);
 		assertEquals(1, stats.numberOfPackFiles);
@@ -202,7 +202,7 @@
 				.createNewFile());
 
 		bb.commit().create();
-		gc.gc();
+		gc.gc().get();
 		stats = gc.getStatistics();
 		assertEquals(COMMIT_AND_TREE_OBJECTS + 1, stats.numberOfPackedObjects);
 		assertEquals(2, stats.numberOfPackFiles);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/LockFileTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/LockFileTest.java
index 7eab1dc..953d624 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/LockFileTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/LockFileTest.java
@@ -209,7 +209,8 @@
 			lock.unlock();
 			lock.unlock();
 		} catch (Throwable e) {
-			fail("unlock should be noop if not locked at all.");
+			throw new AssertionError(
+					"unlock should be noop if not locked at all.", e);
 		}
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
index 28d5ca7..cb977bd 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
@@ -513,7 +513,6 @@
 	@Test
 	public void testRefsCacheAfterUpdate() throws Exception {
 		// Do not use the default repo for this case.
-		List<Ref> allRefs = db.getRefDatabase().getRefs();
 		ObjectId oldValue = db.resolve("HEAD");
 		ObjectId newValue = db.resolve("HEAD^");
 		// first make HEAD refer to loose ref
@@ -529,7 +528,7 @@
 		update = updateRef.update();
 		assertEquals(Result.FAST_FORWARD, update);
 
-		allRefs = db.getRefDatabase().getRefs();
+		List<Ref> allRefs = db.getRefDatabase().getRefs();
 		Ref master = getRef(allRefs, "refs/heads/master").get();
 		Ref head = getRef(allRefs, "HEAD").get();
 		assertEquals("refs/heads/master", master.getName());
@@ -550,7 +549,6 @@
 	@Test
 	public void testRefsCacheAfterUpdateLooseOnly() throws Exception {
 		// Do not use the default repo for this case.
-		List<Ref> allRefs = db.getRefDatabase().getRefs();
 		ObjectId oldValue = db.resolve("HEAD");
 		writeSymref(Constants.HEAD, "refs/heads/newref");
 		RefUpdate updateRef = db.updateRef(Constants.HEAD);
@@ -559,7 +557,7 @@
 		Result update = updateRef.update();
 		assertEquals(Result.NEW, update);
 
-		allRefs = db.getRefDatabase().getRefs();
+		List<Ref> allRefs = db.getRefDatabase().getRefs();
 		Ref head = getRef(allRefs, "HEAD").get();
 		Ref newref = getRef(allRefs, "refs/heads/newref").get();
 		assertEquals("refs/heads/newref", newref.getName());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/pack/GcCommitSelectionTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/pack/GcCommitSelectionTest.java
index 0c09ad1..ecf9a15 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/pack/GcCommitSelectionTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/pack/GcCommitSelectionTest.java
@@ -110,7 +110,7 @@
 		tr.branch(mainBranch).update(commit1);
 
 		gc.setExpireAgeMillis(0);
-		gc.gc();
+		gc.gc().get();
 
 		// Create only 2 bitmaps, for commit0 and commit1, excluding commit2
 		assertEquals(2, gc.getStatistics().numberOfBitmaps);
@@ -227,7 +227,7 @@
 		PackConfig packConfig = new PackConfig();
 		packConfig.setBitmapExcludedRefsPrefixes(new String[] { "refs/heads/other" });
 		gc.setPackConfig(packConfig);
-		gc.gc();
+		gc.gc().get();
 		assertEquals(1,
 			gc.getStatistics().numberOfBitmaps);
 	}
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 0c0257d..31940a1 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
@@ -42,7 +42,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -124,16 +123,16 @@
 	@Test
 	public void test005_PutGetStringList() {
 		Config c = new Config();
-		final LinkedList<String> values = new LinkedList<>();
+		List<String> values = new ArrayList<>();
 		values.add("value1");
 		values.add("value2");
 		c.setStringList("my", null, "somename", values);
 
-		final Object[] expArr = values.toArray();
-		final String[] actArr = c.getStringList("my", null, "somename");
+		Object[] expArr = values.toArray();
+		String[] actArr = c.getStringList("my", null, "somename");
 		assertArrayEquals(expArr, actArr);
 
-		final String expText = "[my]\n\tsomename = value1\n\tsomename = value2\n";
+		String expText = "[my]\n\tsomename = value1\n\tsomename = value2\n";
 		assertEquals(expText, c.toText());
 	}
 
@@ -1568,7 +1567,6 @@
 	@Test
 	public void testCommitTemplateEncoding()
 			throws ConfigInvalidException, IOException {
-		Config config = new Config(null);
 		File workTree = tmp.newFolder("dummy-worktree");
 		Repository repo = FileRepositoryBuilder
 				.create(new File(workTree, ".git"));
@@ -1577,7 +1575,7 @@
 		String templateContent = "content of the template";
 		JGitTestUtil.write(tempFile, templateContent);
 		String expectedTemplatePath = tempFile.getPath();
-		config = parse("[i18n]\n\tcommitEncoding = utf-8\n"
+		Config config = parse("[i18n]\n\tcommitEncoding = utf-8\n"
 				+ "[commit]\n\ttemplate = "
 				+ Config.escapeValue(expectedTemplatePath) + "\n");
 		assertEquals(templateContent,
@@ -1591,7 +1589,6 @@
 	@Test(expected = ConfigInvalidException.class)
 	public void testCommitTemplateWithInvalidEncoding()
 			throws ConfigInvalidException, IOException {
-		Config config = new Config(null);
 		File workTree = tmp.newFolder("dummy-worktree");
 		File tempFile = tmp.newFile("testCommitTemplate-");
 		Repository repo = FileRepositoryBuilder
@@ -1599,7 +1596,7 @@
 		repo.create();
 		String templateContent = "content of the template";
 		JGitTestUtil.write(tempFile, templateContent);
-		config = parse("[i18n]\n\tcommitEncoding = invalidEcoding\n"
+		Config config = parse("[i18n]\n\tcommitEncoding = invalidEcoding\n"
 				+ "[commit]\n\ttemplate = "
 				+ Config.escapeValue(tempFile.getPath()) + "\n");
 		config.get(CommitConfig.KEY).getCommitTemplateContent(repo);
@@ -1608,7 +1605,6 @@
 	@Test(expected = FileNotFoundException.class)
 	public void testCommitTemplateWithInvalidPath()
 			throws ConfigInvalidException, IOException {
-		Config config = new Config(null);
 		File workTree = tmp.newFolder("dummy-worktree");
 		File tempFile = tmp.newFile("testCommitTemplate-");
 		Repository repo = FileRepositoryBuilder
@@ -1618,7 +1614,8 @@
 		JGitTestUtil.write(tempFile, templateContent);
 		// commit message encoding
 		String expectedTemplatePath = "~/nonExistingTemplate";
-		config = parse("[commit]\n\ttemplate = " + expectedTemplatePath + "\n");
+		Config config = parse(
+				"[commit]\n\ttemplate = " + expectedTemplatePath + "\n");
 		String templatePath = config.get(CommitConfig.KEY)
 				.getCommitTemplatePath();
 		assertEquals(expectedTemplatePath, templatePath);
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 5c44c9c..3ec4b6a 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
@@ -11,7 +11,6 @@
 
 package org.eclipse.jgit.lib;
 
-import static java.lang.Integer.valueOf;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.junit.JGitTestUtil.concat;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
@@ -92,7 +91,7 @@
 	public void testInvalidType() {
 		String msg = MessageFormat.format(
 				JGitText.get().corruptObjectInvalidType2,
-				valueOf(OBJ_BAD));
+				Integer.valueOf(OBJ_BAD));
 		assertCorrupt(msg, OBJ_BAD, new byte[0]);
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ThreadSafeProgressMonitorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ThreadSafeProgressMonitorTest.java
index e21ff58..a5a6ce5 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ThreadSafeProgressMonitorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ThreadSafeProgressMonitorTest.java
@@ -125,7 +125,7 @@
 		try {
 			assertTrue("latch released", cdl.await(1000, TimeUnit.MILLISECONDS));
 		} catch (InterruptedException ie) {
-			fail("Did not expect to be interrupted");
+			throw new AssertionError("Did not expect to be interrupted", ie);
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
index 3f99fe2..3a036ac 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
@@ -1446,6 +1446,8 @@
 		git.checkout().setName("master").call();
 		mergeResult = git.merge().include(commitX).setStrategy(strategy)
 				.call();
+		assertEquals(MergeResult.MergeStatus.MERGED,
+				mergeResult.getMergeStatus());
 
 		// Now, merge commit A and B (i.e. "master" and "second-branch").
 		// None of them have the file "a", so there is no conflict, BUT while
@@ -1739,25 +1741,25 @@
 		git.add().addFilepattern("c").call();
 		RevCommit commitI = git.commit().setMessage("Initial commit").call();
 
-		File a = writeTrashFile("a", "content in Ancestor");
+		writeTrashFile("a", "content in Ancestor");
 		git.add().addFilepattern("a").call();
 		RevCommit commitA1 = git.commit().setMessage("Ancestor 1").call();
 
-		a = writeTrashFile("a", "content in Child 1 (commited on master)");
+		writeTrashFile("a", "content in Child 1 (commited on master)");
 		git.add().addFilepattern("a").call();
 		// commit C1M
 		git.commit().setMessage("Child 1 on master").call();
 
 		git.checkout().setCreateBranch(true).setStartPoint(commitI).setName("branch-to-merge").call();
 		// "a" becomes executable in A2
-		a = writeTrashFile("a", "content in Ancestor");
+		File a = writeTrashFile("a", "content in Ancestor");
 		a.setExecutable(true);
 		git.add().addFilepattern("a").call();
 		RevCommit commitA2 = git.commit().setMessage("Ancestor 2").call();
 
 		// second branch
 		git.checkout().setCreateBranch(true).setStartPoint(commitA1).setName("second-branch").call();
-		a = writeTrashFile("a", "content in Child 2 (commited on second-branch)");
+		writeTrashFile("a", "content in Child 2 (commited on second-branch)");
 		git.add().addFilepattern("a").call();
 		// commit C2S
 		git.commit().setMessage("Child 2 on second-branch").call();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchCcErrorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchCcErrorTest.java
index 71bda46..8335c07 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchCcErrorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchCcErrorTest.java
@@ -10,7 +10,6 @@
 
 package org.eclipse.jgit.patch;
 
-import static java.lang.Integer.valueOf;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
@@ -35,7 +34,7 @@
 			assertSame(FormatError.Severity.ERROR, e.getSeverity());
 			assertEquals(MessageFormat.format(
 					JGitText.get().truncatedHunkLinesMissingForAncestor,
-					valueOf(1), valueOf(1)), e.getMessage());
+					Integer.valueOf(1), Integer.valueOf(1)), e.getMessage());
 			assertEquals(346, e.getOffset());
 			assertTrue(e.getLineText().startsWith(
 					"@@@ -55,12 -163,13 +163,15 @@@ public "));
@@ -45,7 +44,7 @@
 			assertSame(FormatError.Severity.ERROR, e.getSeverity());
 			assertEquals(MessageFormat.format(
 					JGitText.get().truncatedHunkLinesMissingForAncestor,
-					valueOf(2), valueOf(2)), e.getMessage());
+					Integer.valueOf(2), Integer.valueOf(2)), e.getMessage());
 			assertEquals(346, e.getOffset());
 			assertTrue(e.getLineText().startsWith(
 					"@@@ -55,12 -163,13 +163,15 @@@ public "));
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/AbstractPlotRendererTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/AbstractPlotRendererTest.java
index 49f832a..e4bd850 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/AbstractPlotRendererTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/AbstractPlotRendererTest.java
@@ -11,7 +11,7 @@
 
 import static org.junit.Assert.assertEquals;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.jgit.api.Git;
@@ -70,7 +70,7 @@
 	private static class TestPlotRenderer extends
 			AbstractPlotRenderer<PlotLane, Object> {
 
-		List<Integer> indentations = new LinkedList<>();
+		List<Integer> indentations = new ArrayList<>();
 
 		@Override
 		protected int drawLabel(int x, int y, Ref ref) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
index 82af34d..6872289 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
@@ -153,9 +153,9 @@
 			c.parseCanonical(rw, b.toString().getBytes(UTF_8));
 		}
 		assertEquals(
-				new PersonIdent("", "a_u_thor@example.com", 1218123387000l, 7),
+				new PersonIdent("", "a_u_thor@example.com", 1218123387000L, 7),
 				c.getAuthorIdent());
-		assertEquals(new PersonIdent("", "", 1218123390000l, -5),
+		assertEquals(new PersonIdent("", "", 1218123390000L, -5),
 				c.getCommitterIdent());
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PackParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PackParserTest.java
index 2fd82e7..6148df9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PackParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PackParserTest.java
@@ -191,7 +191,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		pack.copyRaw(a);
 		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		pack.digest();
@@ -211,7 +211,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_BLOB) << 4 | 0x80 | 1);
+		pack.write(Constants.OBJ_BLOB << 4 | 0x80 | 1);
 		pack.write(1);
 		pack.deflate(data);
 		pack.digest();
@@ -231,9 +231,9 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(2);
-		pack.write((Constants.OBJ_BLOB) << 4 | 10); // offset 12
+		pack.write(Constants.OBJ_BLOB << 4 | 10); // offset 12
 		pack.deflate(data);
-		pack.write((Constants.OBJ_OFS_DELTA) << 4 | 4); // offset 31
+		pack.write(Constants.OBJ_OFS_DELTA << 4 | 4); // offset 31
 		pack.write(19);
 		pack.deflate(new byte[] { 0xA, 0xB, 0x1, 'b' });
 		pack.digest();
@@ -270,7 +270,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		pack.copyRaw(a);
 		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		pack.digest();
@@ -300,7 +300,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_BLOB) << 4 | 10);
+		pack.write(Constants.OBJ_BLOB << 4 | 10);
 		pack.deflate(data);
 		pack.digest();
 
@@ -333,7 +333,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 14);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 14);
 		pack.copyRaw(a);
 		pack.deflate(new byte[] { 1, 11, 11, 'a', '0', '1', '2', '3', '4',
 				'5', '6', '7', '8', '9' });
@@ -366,7 +366,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		pack.copyRaw(a);
 		pack.deflate(new byte[] { 10, 11, 1, 'a' });
 		pack.digest();
@@ -398,7 +398,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		pack.copyRaw(a);
 		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		pack.digest();
@@ -439,7 +439,7 @@
 
 		InMemoryPack pack = new InMemoryPack();
 		pack.header(1);
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		pack.copyRaw(a);
 		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		pack.digest();
@@ -470,7 +470,7 @@
 		pack.header(objects);
 
 		for (int i = 0; i < objects; i++) {
-			pack.write((Constants.OBJ_BLOB) << 4 | 10);
+			pack.write(Constants.OBJ_BLOB << 4 | 10);
 			pack.deflate(data);
 		}
 		pack.digest();
@@ -508,7 +508,7 @@
 		for (int i = 0; i < offset; i++)
 			sb.append(i);
 		offset = sb.toString().length();
-		int lenByte = (Constants.OBJ_BLOB) << 4 | (offset & 0x0F);
+		int lenByte = Constants.OBJ_BLOB << 4 | (offset & 0x0F);
 		offset >>= 4;
 		if (offset > 0)
 			lenByte |= 1 << 7;
@@ -525,7 +525,7 @@
 		for (int i = 0; i < objects; i++) {
 			// The last pack header written falls across the 8192 byte boundary
 			// between [8189:8210]
-			pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+			pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 			pack.copyRaw(b);
 			pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java
index f5658ab..cee023d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushCertificateIdentTest.java
@@ -73,7 +73,7 @@
 	@Test
 	public void fuzzyCasesMatchPersonIdent() throws Exception {
 		// See RawParseUtils_ParsePersonIdentTest#testParsePersonIdent_fuzzyCases()
-		Date when = new Date(1234567890000l);
+		Date when = new Date(1234567890000L);
 		TimeZone tz = TimeZone.getTimeZone("GMT-7");
 
 		assertMatchesPersonIdent(
@@ -89,7 +89,7 @@
 	@Test
 	public void incompleteCasesMatchPersonIdent() throws Exception {
 		// See RawParseUtils_ParsePersonIdentTest#testParsePersonIdent_incompleteCases()
-		Date when = new Date(1234567890000l);
+		Date when = new Date(1234567890000L);
 		TimeZone tz = TimeZone.getTimeZone("GMT-7");
 
 		assertMatchesPersonIdent(
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ReceivePackAdvertiseRefsHookTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ReceivePackAdvertiseRefsHookTest.java
index a91bc95..7dac27f 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ReceivePackAdvertiseRefsHookTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ReceivePackAdvertiseRefsHookTest.java
@@ -187,10 +187,10 @@
 		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
 
 		packHeader(pack, 2);
-		pack.write((Constants.OBJ_BLOB) << 4 | 1);
+		pack.write(Constants.OBJ_BLOB << 4 | 1);
 		deflate(pack, new byte[] { 'a' });
 
-		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 		a.copyRawTo(pack);
 		deflate(pack, new byte[] { 0x1, 0x1, 0x1, 'b' });
 
@@ -296,7 +296,7 @@
 			packHeader(pack, 3);
 			copy(pack, src.open(N));
 			copy(pack, src.open(s.parseBody(N).getTree()));
-			pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+			pack.write(Constants.OBJ_REF_DELTA << 4 | 4);
 			b.copyRawTo(pack);
 			deflate(pack, delta);
 			digest(pack);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandOutputStreamTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandOutputStreamTest.java
index 3516ed0..444e958 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandOutputStreamTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandOutputStreamTest.java
@@ -10,7 +10,6 @@
 
 package org.eclipse.jgit.transport;
 
-import static java.lang.Integer.valueOf;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.transport.SideBandOutputStream.CH_DATA;
 import static org.eclipse.jgit.transport.SideBandOutputStream.CH_ERROR;
@@ -224,7 +223,8 @@
 		} catch (IllegalArgumentException e) {
 			assertEquals(MessageFormat.format(
 					JGitText.get().packetSizeMustBeAtMost,
-					valueOf(Integer.MAX_VALUE), valueOf(65520)), e.getMessage());
+					Integer.valueOf(Integer.MAX_VALUE), Integer.valueOf(65520)),
+					e.getMessage());
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackHandleDeletedPackFileTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackHandleDeletedPackFileTest.java
index 417ce61..272c5ea 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackHandleDeletedPackFileTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackHandleDeletedPackFileTest.java
@@ -9,10 +9,9 @@
  */
 package org.eclipse.jgit.transport;
 
-import static org.junit.Assert.fail;
 import static org.eclipse.jgit.lib.Constants.HEAD;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -91,7 +90,7 @@
 	private void doRemovePackFileDuringUploadPack(PackExt packExt)
 			throws Exception {
 		Object ctx = new Object();
-		TestProtocol testProtocol = new TestProtocol<>(
+		TestProtocol<Object> testProtocol = new TestProtocol<>(
 				(Object req, Repository db) -> {
 					UploadPack up = new UploadPack(db);
 					up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT);
@@ -103,11 +102,12 @@
 					try {
 						addNewCommit();
 
-						new GC(remote.getRepository()).gc();
+						new GC(remote.getRepository()).gc().get();
 
 						pack.getPackFile().create(packExt).delete();
 					} catch (Exception e) {
-						fail("GC or pack file removal failed");
+						throw new AssertionError(
+								"GC or pack file removal failed", e);
 					}
 
 					return up;
@@ -136,7 +136,7 @@
 				.create();
 		remote.update("master", commit0);
 
-		new GC(remote.getRepository()).gc(); // create pack files
+		new GC(remote.getRepository()).gc().get(); // create pack files
 
 		head = remote.commit().message("1").parent(commit0)
 				.add("test1.txt", remote.blob("1"))
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 026492f..def73ac 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
@@ -1800,14 +1800,15 @@
 		RevBlob blobHighDepth = remote.blob("hi");
 
 		RevTree subtree = remote.tree(remote.file("1", blobHighDepth));
-		RevTree rootTree = (new TreeBuilder() {
+
+		RevTree rootTree = new TreeBuilder() {
 				@Override
 				void addElements(DirCacheBuilder dcBuilder) throws Exception {
 					dcBuilder.add(remote.file("1", blobLowDepth));
 					dcBuilder.addTree(new byte[] {'2'}, DirCacheEntry.STAGE_0,
 							remote.getRevWalk().getObjectReader(), subtree);
 				}
-			}).build();
+		}.build();
 		RevCommit commit = remote.commit(rootTree);
 
 		DeepTreePreparator() throws Exception {}
@@ -1904,21 +1905,23 @@
 	class RepeatedSubtreePreparator {
 		RevBlob foo = remote.blob("foo");
 		RevTree subtree3 = remote.tree(remote.file("foo", foo));
-		RevTree subtree2 = (new TreeBuilder() {
+		RevTree subtree2 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'b'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree3);
 			}
-		}).build();
-		RevTree subtree1 = (new TreeBuilder() {
+		}.build();
+
+		RevTree subtree1 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'x'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree2);
 			}
-		}).build();
-		RevTree rootTree = (new TreeBuilder() {
+		}.build();
+
+		RevTree rootTree = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'a'}, DirCacheEntry.STAGE_0,
@@ -1926,7 +1929,7 @@
 				dcBuilder.addTree(new byte[] {'x'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree2);
 			}
-		}).build();
+		}.build();
 		RevCommit commit = remote.commit(rootTree);
 
 		RepeatedSubtreePreparator() throws Exception {}
@@ -1970,22 +1973,22 @@
 		RevTree subtree1 = remote.tree(remote.file("foo", foo));
 
 		/** b/foo */
-		RevTree subtree2 = (new TreeBuilder() {
+		RevTree subtree2 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'b'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree1);
 			}
-		}).build();
+		}.build();
 
 		/** x/b/foo */
-		RevTree subtree3 = (new TreeBuilder() {
+		RevTree subtree3 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'x'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree2);
 			}
-		}).build();
+		}.build();
 
 		RevBlob baz = remote.blob("baz");
 
@@ -1993,33 +1996,33 @@
 		RevTree subtree4 = remote.tree(remote.file("baz", baz));
 
 		/** c/baz */
-		RevTree subtree5 = (new TreeBuilder() {
+		RevTree subtree5 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'c'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree4);
 			}
-		}).build();
+		}.build();
 
 		/** u/c/baz */
-		RevTree subtree6 = (new TreeBuilder() {
+		RevTree subtree6 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'u'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree5);
 			}
-		}).build();
+		}.build();
 
 		/** v/c/baz */
-		RevTree subtree7 = (new TreeBuilder() {
+		RevTree subtree7 = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'v'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree5);
 			}
-		}).build();
+		}.build();
 
-		RevTree rootTree = (new TreeBuilder() {
+		RevTree rootTree = new TreeBuilder() {
 			@Override
 			void addElements(DirCacheBuilder dcBuilder) throws Exception {
 				dcBuilder.addTree(new byte[] {'a'}, DirCacheEntry.STAGE_0,
@@ -2031,7 +2034,7 @@
 				dcBuilder.addTree(new byte[] {'z'}, DirCacheEntry.STAGE_0,
 						remote.getRevWalk().getObjectReader(), subtree7);
 			}
-		}).build();
+		}.build();
 		RevCommit commit = remote.commit(rootTree);
 
 		RepeatedSubtreeAtSameLevelPreparator() throws Exception {}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/http/JDKHttpConnectionTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/http/JDKHttpConnectionTest.java
index 37f9514..f71781d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/http/JDKHttpConnectionTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/http/JDKHttpConnectionTest.java
@@ -16,9 +16,9 @@
 import static org.mockito.Mockito.when;
 
 import java.net.HttpURLConnection;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -74,7 +74,7 @@
 	}
 
 	private void assertValues(String key, String... values) {
-		List<String> l = new LinkedList<>();
+		List<String> l = new ArrayList<>();
 		List<String> hf = c.getHeaderFields(key);
 		if (hf != null) {
 			l.addAll(hf);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/BlockListTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/BlockListTest.java
index a270ca8..b8b9cbe 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/BlockListTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/BlockListTest.java
@@ -296,6 +296,7 @@
 	public void testAddRejectsBadIndexes() {
 		BlockList<Integer> list = new BlockList<>(4);
 		list.add(Integer.valueOf(41));
+		assertEquals(Integer.valueOf(41), list.get(0));
 
 		try {
 			list.add(-1, Integer.valueOf(42));
@@ -316,6 +317,7 @@
 	public void testRemoveRejectsBadIndexes() {
 		BlockList<Integer> list = new BlockList<>(4);
 		list.add(Integer.valueOf(41));
+		assertEquals(Integer.valueOf(41), list.get(0));
 
 		try {
 			list.remove(-1);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilsTest.java
index 2b1fb2e..5106540 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilsTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilsTest.java
@@ -74,7 +74,9 @@
 		try {
 			FileUtils.delete(f, FileUtils.SKIP_MISSING);
 		} catch (IOException e) {
-			fail("deletion of non-existing file must not fail with option SKIP_MISSING");
+			throw new AssertionError(
+					"deletion of non-existing file must not fail with option SKIP_MISSING",
+					e);
 		}
 	}
 
@@ -108,7 +110,9 @@
 		try {
 			FileUtils.delete(d, FileUtils.RECURSIVE | FileUtils.SKIP_MISSING);
 		} catch (IOException e) {
-			fail("recursive deletion of non-existing directory must not fail with option SKIP_MISSING");
+			throw new AssertionError(
+					"recursive deletion of non-existing directory must not fail with option SKIP_MISSING",
+					e);
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateFormatterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateFormatterTest.java
index 0bd7e0b..6a531fe 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateFormatterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateFormatterTest.java
@@ -89,15 +89,19 @@
 	@Test
 	public void LOCALE() {
 		String date = new GitDateFormatter(Format.LOCALE).formatDate(ident);
+		System.out.println(date);
 		assertTrue("Sep 20, 2011 7:09:25 PM -0400".equals(date)
-				|| "Sep 20, 2011, 7:09:25 PM -0400".equals(date)); // JDK-8206961
+				|| "Sep 20, 2011, 7:09:25 PM -0400".equals(date) // JDK-8206961
+				|| "Sep 20, 2011, 7:09:25\u202FPM -0400".equals(date)); // JDK-8304925
 	}
 
 	@Test
 	public void LOCALELOCAL() {
 		String date = new GitDateFormatter(Format.LOCALELOCAL)
 				.formatDate(ident);
+		System.out.println(date);
 		assertTrue("Sep 20, 2011 7:39:25 PM".equals(date)
-				|| "Sep 20, 2011, 7:39:25 PM".equals(date)); // JDK-8206961
+				|| "Sep 20, 2011, 7:39:25 PM".equals(date) // JDK-8206961
+				|| "Sep 20, 2011, 7:39:25\u202FPM".equals(date)); // JDK-8304925
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HookTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HookTest.java
index 1231aef..b7490f0 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HookTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HookTest.java
@@ -157,7 +157,7 @@
 			git.commit().setMessage("commit")
 					.setHookOutputStream(new PrintStream(out)).call();
 		} catch (AbortedByHookException e) {
-			fail("unexpected hook failure");
+			throw new AssertionError("unexpected hook failure", e);
 		}
 		assertEquals("unexpected hook output",
 				"test pre-commit\ntest commit-msg .git/COMMIT_EDITMSG\ntest post-commit\n",
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HttpSupportTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HttpSupportTest.java
index cbe4eb2..a3a5697 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HttpSupportTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HttpSupportTest.java
@@ -47,18 +47,6 @@
 	}
 
 	@Test
-	public void testMalformedUri() throws Exception {
-		// Valid URL, but backslash is not allowed in a URI in the userinfo part
-		// per RFC 3986: https://tools.ietf.org/html/rfc3986#section-3.2.1 .
-		// Test that conversion to URI to call the ProxySelector does not throw
-		// an exception.
-		Proxy proxy = HttpSupport.proxyFor(new TestProxySelector(), new URL(
-				"http://infor\\c.jones@somehost/somewhere/someproject.git"));
-		assertNotNull(proxy);
-		assertEquals(Proxy.Type.HTTP, proxy.type());
-	}
-
-	@Test
 	public void testCorrectUri() throws Exception {
 		// Backslash escaped as %5C is correct.
 		Proxy proxy = HttpSupport.proxyFor(new TestProxySelector(), new URL(
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java
index ee3ce8d..355bbba 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_ParsePersonIdentTest.java
@@ -22,7 +22,7 @@
 
 	@Test
 	public void testParsePersonIdent_legalCases() {
-		final Date when = new Date(1234567890000l);
+		final Date when = new Date(1234567890000L);
 		final TimeZone tz = TimeZone.getTimeZone("GMT-7");
 
 		assertPersonIdent("Me <me@example.com> 1234567890 -0700",
@@ -50,7 +50,7 @@
 
 	@Test
 	public void testParsePersonIdent_fuzzyCases() {
-		final Date when = new Date(1234567890000l);
+		final Date when = new Date(1234567890000L);
 		final TimeZone tz = TimeZone.getTimeZone("GMT-7");
 
 		assertPersonIdent(
@@ -64,7 +64,7 @@
 
 	@Test
 	public void testParsePersonIdent_incompleteCases() {
-		final Date when = new Date(1234567890000l);
+		final Date when = new Date(1234567890000L);
 		final TimeZone tz = TimeZone.getTimeZone("GMT-7");
 
 		assertPersonIdent("Me <> 1234567890 -0700", new PersonIdent("Me", "",
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RefMapTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RefMapTest.java
index 627417d..a8077fd 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RefMapTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RefMapTest.java
@@ -268,6 +268,7 @@
 		assertFalse(itr.hasNext());
 	}
 
+	@SuppressWarnings("ModifiedButNotUsed")
 	@Test
 	public void testPut_KeyMustMatchName_NoPrefix() {
 		final Ref refA = newRef("refs/heads/A", ID_ONE);
@@ -280,6 +281,7 @@
 		}
 	}
 
+	@SuppressWarnings("ModifiedButNotUsed")
 	@Test
 	public void testPut_KeyMustMatchName_WithPrefix() {
 		final Ref refA = newRef("refs/heads/A", ID_ONE);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/http/HttpCookiesMatcher.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/http/HttpCookiesMatcher.java
index 5a2bd97..c1c7280 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/http/HttpCookiesMatcher.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/http/HttpCookiesMatcher.java
@@ -10,7 +10,7 @@
 package org.eclipse.jgit.util.http;
 
 import java.net.HttpCookie;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.hamcrest.Description;
@@ -26,7 +26,7 @@
 
 	public static Matcher<Iterable<? extends HttpCookie>> containsInOrder(
 			Iterable<HttpCookie> expectedCookies, int allowedMaxAgeDelta) {
-		final List<Matcher<? super HttpCookie>> cookieMatchers = new LinkedList<>();
+		final List<Matcher<? super HttpCookie>> cookieMatchers = new ArrayList<>();
 		for (HttpCookie cookie : expectedCookies) {
 			cookieMatchers
 					.add(new HttpCookieMatcher(cookie, allowedMaxAgeDelta));
@@ -92,7 +92,7 @@
 		}
 
 		@SuppressWarnings("boxing")
-		protected static void describeCookie(Description description,
+		private static void describeCookie(Description description,
 				HttpCookie cookie) {
 			description.appendText("HttpCookie[");
 			description.appendText("name: ").appendValue(cookie.getName())
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java
index 47acc11..9014526 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java
@@ -11,16 +11,17 @@
 package org.eclipse.jgit.awtui;
 
 import java.awt.Color;
-import java.util.LinkedList;
+import java.util.ArrayDeque;
+import java.util.Deque;
 
 import org.eclipse.jgit.revplot.PlotCommitList;
 import org.eclipse.jgit.revplot.PlotLane;
 
 class SwingCommitList extends PlotCommitList<SwingCommitList.SwingLane> {
-	final LinkedList<Color> colors;
+	final Deque<Color> colors;
 
 	SwingCommitList() {
-		colors = new LinkedList<>();
+		colors = new ArrayDeque<>();
 		repackColors();
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
index a03ea01..c133219 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
@@ -17,7 +17,6 @@
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -164,7 +163,7 @@
 	 */
 	protected CheckoutCommand(Repository repo) {
 		super(repo);
-		this.paths = new LinkedList<>();
+		this.paths = new ArrayList<>();
 	}
 
 	@Override
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
index a1c6478..a353d1a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
@@ -14,7 +14,7 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -63,7 +63,7 @@
 public class CherryPickCommand extends GitCommand<CherryPickResult> {
 	private String reflogPrefix = "cherry-pick:"; //$NON-NLS-1$
 
-	private List<Ref> commits = new LinkedList<>();
+	private List<Ref> commits = new ArrayList<>();
 
 	private String ourCommitName = null;
 
@@ -102,7 +102,7 @@
 			UnmergedPathsException, ConcurrentRefUpdateException,
 			WrongRepositoryStateException, NoHeadException {
 		RevCommit newHead = null;
-		List<Ref> cherryPickedRefs = new LinkedList<>();
+		List<Ref> cherryPickedRefs = new ArrayList<>();
 		checkCallable();
 
 		try (RevWalk revWalk = new RevWalk(repo)) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java
index 483b960..a1a2cc0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java
@@ -16,7 +16,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 
 import org.eclipse.jgit.annotations.NonNull;
@@ -109,7 +108,7 @@
 	 * parents this commit should have. The current HEAD will be in this list
 	 * and also all commits mentioned in .git/MERGE_HEAD
 	 */
-	private List<ObjectId> parents = new LinkedList<>();
+	private List<ObjectId> parents = new ArrayList<>();
 
 	private String reflogComment;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
index ed4a534..7064f5a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
@@ -13,9 +13,9 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -75,7 +75,7 @@
 
 	private ContentMergeStrategy contentStrategy;
 
-	private List<Ref> commits = new LinkedList<>();
+	private List<Ref> commits = new ArrayList<>();
 
 	private Boolean squash;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
index 757aff8..858bd96 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -23,7 +23,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -1120,8 +1119,8 @@
 	private void popSteps(int numSteps) throws IOException {
 		if (numSteps == 0)
 			return;
-		List<RebaseTodoLine> todoLines = new LinkedList<>();
-		List<RebaseTodoLine> poppedLines = new LinkedList<>();
+		List<RebaseTodoLine> todoLines = new ArrayList<>();
+		List<RebaseTodoLine> poppedLines = new ArrayList<>();
 
 		for (RebaseTodoLine line : repo.readRebaseTodo(
 				rebaseState.getPath(GIT_REBASE_TODO), true)) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
index 225c999..47145a0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
@@ -11,8 +11,8 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedList;
 
 import org.eclipse.jgit.api.errors.CheckoutConflictException;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -90,7 +90,7 @@
 
 	private ResetType mode;
 
-	private Collection<String> filepaths = new LinkedList<>();
+	private Collection<String> filepaths = new ArrayList<>();
 
 	private boolean isReflogDisabled;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
index 5231d4a..855c3b1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
@@ -13,7 +13,7 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -58,13 +58,13 @@
  *      >Git documentation about revert</a>
  */
 public class RevertCommand extends GitCommand<RevCommit> {
-	private List<Ref> commits = new LinkedList<>();
+	private List<Ref> commits = new ArrayList<>();
 
 	private String ourCommitName = null;
 
 	private boolean insertChangeId;
 
-	private List<Ref> revertedRefs = new LinkedList<>();
+	private List<Ref> revertedRefs = new ArrayList<>();
 
 	private MergeResult failingResult;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java
index 656f36a..7459e72 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java
@@ -13,7 +13,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -71,7 +70,7 @@
 	 */
 	public RmCommand(Repository repo) {
 		super(repo);
-		filepatterns = new LinkedList<>();
+		filepatterns = new ArrayList<>();
 	}
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java
index eab3894..cdd078e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java
@@ -10,7 +10,7 @@
 package org.eclipse.jgit.api;
 
 import java.io.IOException;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -83,7 +83,7 @@
 	 */
 	public StatusCommand addPath(String path) {
 		if (paths == null)
-			paths = new LinkedList<>();
+			paths = new ArrayList<>();
 		paths.add(path);
 		return this;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CheckoutConflictException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CheckoutConflictException.java
index 0224b3d..5538711 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CheckoutConflictException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CheckoutConflictException.java
@@ -37,7 +37,7 @@
  */
 package org.eclipse.jgit.api.errors;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -99,7 +99,7 @@
 	 */
 	CheckoutConflictException addConflictingPath(String conflictingPath) {
 		if (conflictingPaths == null)
-			conflictingPaths = new LinkedList<>();
+			conflictingPaths = new ArrayList<>();
 		conflictingPaths.add(conflictingPath);
 		return this;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java
index 1f1c35a..0d9815e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java
@@ -31,12 +31,12 @@
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
-import java.util.Stack;
 
 import org.eclipse.jgit.annotations.NonNull;
 import org.eclipse.jgit.annotations.Nullable;
@@ -336,10 +336,10 @@
 				continue;
 			}
 
-			Stack<RevCommit> commitStack = new Stack<>();
+			ArrayDeque<RevCommit> commitStack = new ArrayDeque<>();
 			commitStack.push(cmit);
 
-			while (!commitStack.empty()) {
+			while (!commitStack.isEmpty()) {
 				int maxGeneration = 0;
 				boolean allParentComputed = true;
 				RevCommit current = commitStack.peek();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java
index a342796..c939114 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java
@@ -21,7 +21,6 @@
 import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -308,7 +307,7 @@
 
 	private <T extends ObjectId> Iterable<FoundObject<T>> findAll(
 			Iterable<T> objectIds) throws IOException {
-		Collection<T> pending = new LinkedList<>();
+		Collection<T> pending = new ArrayList<>();
 		for (T id : objectIds) {
 			pending.add(id);
 		}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
index 4c99673..cf26f8d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
@@ -49,7 +49,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -866,7 +865,7 @@
 			}
 		}
 
-		List<ObjectIdSet> excluded = new LinkedList<>();
+		List<ObjectIdSet> excluded = new ArrayList<>();
 		for (Pack p : repo.getObjectDatabase().getPacks()) {
 			checkCancelled();
 			if (!shouldPackKeptObjects() && p.shouldBeKept()) {
@@ -1897,7 +1896,7 @@
 		}
 
 		private String getProcDesc() {
-			StringBuffer s = new StringBuffer(Long.toString(getPID()));
+			StringBuilder s = new StringBuilder(Long.toString(getPID()));
 			s.append(' ');
 			s.append(getHostName());
 			return s.toString();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexBuilder.java
index 1da8055..08d2b71 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexBuilder.java
@@ -11,9 +11,9 @@
 package org.eclipse.jgit.internal.storage.file;
 
 import java.text.MessageFormat;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 
 import org.eclipse.jgit.internal.JGitText;
@@ -41,8 +41,7 @@
 	private final EWAHCompressedBitmap tags;
 	private final BlockList<PositionEntry> byOffset;
 
-	private final LinkedList<StoredBitmap>
-			bitmapsToWriteXorBuffer = new LinkedList<>();
+	private final ArrayDeque<StoredBitmap> bitmapsToWriteXorBuffer = new ArrayDeque<>();
 
 	private List<StoredEntry> bitmapsToWrite = new ArrayList<>();
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java
index c42d1c8..c2c3775 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java
@@ -228,7 +228,7 @@
 	 *            etc. Positions past 2**31-1 are negative, but still valid.
 	 * @return the offset in a pack for the corresponding entry.
 	 */
-	abstract long getOffset(long nthPosition);
+	protected abstract long getOffset(long nthPosition);
 
 	/**
 	 * Locate the file offset position for the requested object.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java
index 4563c90..5180df4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java
@@ -118,7 +118,7 @@
 	}
 
 	@Override
-	long getOffset(long nthPosition) {
+	protected long getOffset(long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
 		final int levelTwo = getLevelTwo(nthPosition, levelOne);
 		final int p = (4 + Constants.OBJECT_ID_LENGTH) * levelTwo;
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 169dce1..8e57bf9 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
@@ -41,11 +41,11 @@
 import java.security.DigestInputStream;
 import java.security.MessageDigest;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -64,8 +64,8 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.CoreConfig.TrustPackedRefsStat;
 import org.eclipse.jgit.lib.CoreConfig.TrustLooseRefStat;
+import org.eclipse.jgit.lib.CoreConfig.TrustPackedRefsStat;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.Ref;
@@ -413,7 +413,7 @@
 
 	@Override
 	public List<Ref> getAdditionalRefs() throws IOException {
-		List<Ref> ret = new LinkedList<>();
+		List<Ref> ret = new ArrayList<>();
 		for (String name : additionalRefsNames) {
 			Ref r = exactRef(name);
 			if (r != null)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java
index acc1c83..72434db 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/memory/TernarySearchTree.java
@@ -9,9 +9,9 @@
  */
 package org.eclipse.jgit.internal.storage.memory;
 
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -340,7 +340,7 @@
 	 * @return all keys
 	 */
 	public Iterable<String> getKeys() {
-		Queue<String> queue = new LinkedList<>();
+		Queue<String> queue = new ArrayDeque<>();
 		lock.readLock().lock();
 		try {
 			findKeysWithPrefix(root, new StringBuilder(), queue);
@@ -358,7 +358,7 @@
 	 * @return keys starting with given prefix
 	 */
 	public Iterable<String> getKeysWithPrefix(String prefix) {
-		Queue<String> keys = new LinkedList<>();
+		Queue<String> keys = new ArrayDeque<>();
 		if (prefix == null) {
 			return keys;
 		}
@@ -486,7 +486,7 @@
 	 * @return keys matching given pattern.
 	 */
 	public Iterable<String> getKeysMatching(String pattern) {
-		Queue<String> keys = new LinkedList<>();
+		Queue<String> keys = new ArrayDeque<>();
 		lock.readLock().lock();
 		try {
 			findKeysWithPrefix(root, new StringBuilder(), 0, pattern, keys);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaTask.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaTask.java
index 9a3f4b0..03d6f16 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaTask.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaTask.java
@@ -11,10 +11,10 @@
 package org.eclipse.jgit.internal.storage.pack;
 
 import java.io.IOException;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
@@ -232,14 +232,15 @@
 	}
 
 	private final Block block;
-	final LinkedList<Slice> slices;
+
+	final ArrayDeque<Slice> slices;
 
 	private ObjectReader or;
 	private DeltaWindow dw;
 
 	DeltaTask(Block b) {
 		this.block = b;
-		this.slices = new LinkedList<>();
+		this.slices = new ArrayDeque<>();
 	}
 
 	void add(Slice s) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/transport/ssh/OpenSshConfigFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/transport/ssh/OpenSshConfigFile.java
index 29a2922..3e75a9d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/transport/ssh/OpenSshConfigFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/transport/ssh/OpenSshConfigFile.java
@@ -22,7 +22,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -100,7 +99,7 @@
 	 * fully resolved entries created from that.
 	 */
 	private static class State {
-		List<HostEntry> entries = new LinkedList<>();
+		List<HostEntry> entries = new ArrayList<>();
 
 		// Previous lookups, keyed by user@hostname:port
 		Map<String, HostEntry> hosts = new HashMap<>();
@@ -218,7 +217,7 @@
 
 	private List<HostEntry> parse(BufferedReader reader)
 			throws IOException {
-		final List<HostEntry> entries = new LinkedList<>();
+		final List<HostEntry> entries = new ArrayList<>();
 
 		// The man page doesn't say so, but the openssh parser (readconf.c)
 		// starts out in active mode and thus always applies any lines that
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
index c716f46..b036a0b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
@@ -17,7 +17,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.jgit.lib.RebaseTodoLine.Action;
@@ -62,7 +62,7 @@
 		byte[] buf = IO.readFully(new File(repo.getDirectory(), path));
 		int ptr = 0;
 		int tokenBegin = 0;
-		List<RebaseTodoLine> r = new LinkedList<>();
+		List<RebaseTodoLine> r = new ArrayList<>();
 		while (ptr < buf.length) {
 			tokenBegin = ptr;
 			ptr = RawParseUtils.nextLF(buf, ptr);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
index 825ef17..1ad41be 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
@@ -32,7 +32,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -106,9 +105,9 @@
 		 */
 		public static class Result {
 
-			private final List<String> modifiedFiles = new LinkedList<>();
+			private final List<String> modifiedFiles = new ArrayList<>();
 
-			private final List<String> failedToDelete = new LinkedList<>();
+			private final List<String> failedToDelete = new ArrayList<>();
 
 			private ObjectId treeId = null;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/MergeBaseGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/MergeBaseGenerator.java
index a213dd4..be29dc3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/MergeBaseGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/MergeBaseGenerator.java
@@ -12,7 +12,7 @@
 
 import java.io.IOException;
 import java.text.MessageFormat;
-import java.util.LinkedList;
+import java.util.ArrayDeque;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -47,7 +47,8 @@
 	private int recarryTest;
 	private int recarryMask;
 	private int mergeBaseAncestor = -1;
-	private LinkedList<RevCommit> ret = new LinkedList<>();
+
+	private ArrayDeque<RevCommit> ret = new ArrayDeque<>();
 
 	private CarryStack stack;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
index 4a02d6d..b335675 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
@@ -33,10 +33,8 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.LinkedHashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Vector;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.eclipse.jgit.annotations.NonNull;
@@ -109,7 +107,7 @@
 			String name = prefix + Transport.class.getName();
 			return ldr.getResources(name);
 		} catch (IOException err) {
-			return new Vector<URL>().elements();
+			return Collections.emptyEnumeration();
 		}
 	}
 
@@ -595,7 +593,7 @@
 			Collection<RefSpec> fetchSpecs) throws IOException {
 		if (fetchSpecs == null)
 			fetchSpecs = Collections.emptyList();
-		final List<RemoteRefUpdate> result = new LinkedList<>();
+		final List<RemoteRefUpdate> result = new ArrayList<>();
 		final Collection<RefSpec> procRefs = expandPushWildcardsFor(db, specs);
 
 		for (RefSpec spec : procRefs) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
index 3162b89..a65d0b7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
@@ -66,7 +66,6 @@
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -763,7 +762,7 @@
 
 	void processResponseCookies(HttpConnection conn) {
 		if (cookieFile != null && http.getSaveCookies()) {
-			List<HttpCookie> foundCookies = new LinkedList<>();
+			List<HttpCookie> foundCookies = new ArrayList<>();
 
 			List<String> cookieHeaderValues = conn
 					.getHeaderFields(HDR_SET_COOKIE);
@@ -795,7 +794,7 @@
 
 	private List<HttpCookie> extractCookies(String headerKey,
 			List<String> headerValues) {
-		List<HttpCookie> foundCookies = new LinkedList<>();
+		List<HttpCookie> foundCookies = new ArrayList<>();
 		for (String headerValue : headerValues) {
 			foundCookies
 					.addAll(HttpCookie.parse(headerKey + ':' + headerValue));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
index 8d89107..3da76f3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
@@ -16,12 +16,13 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Deque;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -112,16 +113,16 @@
 	private final DateRevQueue localCommitQueue;
 
 	/** Objects we need to copy from the remote repository. */
-	private LinkedList<ObjectId> workQueue;
+	private Deque<ObjectId> workQueue;
 
 	/** Databases we have not yet obtained the list of packs from. */
-	private final LinkedList<WalkRemoteObjectDatabase> noPacksYet;
+	private final Deque<WalkRemoteObjectDatabase> noPacksYet;
 
 	/** Databases we have not yet obtained the alternates from. */
-	private final LinkedList<WalkRemoteObjectDatabase> noAlternatesYet;
+	private final Deque<WalkRemoteObjectDatabase> noAlternatesYet;
 
 	/** Packs we have discovered, but have not yet fetched locally. */
-	private final LinkedList<RemotePack> unfetchedPacks;
+	private final Deque<RemotePack> unfetchedPacks;
 
 	/**
 	 * Packs whose indexes we have looked at in {@link #unfetchedPacks}.
@@ -163,13 +164,13 @@
 		remotes = new ArrayList<>();
 		remotes.add(w);
 
-		unfetchedPacks = new LinkedList<>();
+		unfetchedPacks = new ArrayDeque<>();
 		packsConsidered = new HashSet<>();
 
-		noPacksYet = new LinkedList<>();
+		noPacksYet = new ArrayDeque<>();
 		noPacksYet.add(w);
 
-		noAlternatesYet = new LinkedList<>();
+		noAlternatesYet = new ArrayDeque<>();
 		noAlternatesYet.add(w);
 
 		fetchErrors = new HashMap<>();
@@ -183,7 +184,7 @@
 		LOCALLY_SEEN = revWalk.newFlag("LOCALLY_SEEN"); //$NON-NLS-1$
 
 		localCommitQueue = new DateRevQueue();
-		workQueue = new LinkedList<>();
+		workQueue = new ArrayDeque<>();
 	}
 
 	@Override
@@ -567,7 +568,7 @@
 
 	private Iterator<ObjectId> swapFetchQueue() {
 		final Iterator<ObjectId> r = workQueue.iterator();
-		workQueue = new LinkedList<>();
+		workQueue = new ArrayDeque<>();
 		return r;
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnection.java
index 8e9be1d..e20acad 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnection.java
@@ -20,7 +20,7 @@
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -152,7 +152,7 @@
 
 	private static List<String> mapValuesToListIgnoreCase(String keyName,
 			Map<String, List<String>> m) {
-		List<String> fields = new LinkedList<>();
+		List<String> fields = new ArrayList<>();
 		m.entrySet().stream().filter(e -> keyName.equalsIgnoreCase(e.getKey()))
 				.filter(e -> e.getValue() != null)
 				.forEach(e -> fields.addAll(e.getValue()));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java
index 699ff6b..cfdc4dd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java
@@ -10,8 +10,9 @@
 package org.eclipse.jgit.treewalk.filter;
 
 import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -62,9 +63,9 @@
 
 	private final Set<String> ignoredPaths = new HashSet<>();
 
-	private final LinkedList<String> untrackedParentFolders = new LinkedList<>();
+	private final ArrayDeque<String> untrackedParentFolders = new ArrayDeque<>();
 
-	private final LinkedList<String> untrackedFolders = new LinkedList<>();
+	private final ArrayDeque<String> untrackedFolders = new ArrayDeque<>();
 
 	/**
 	 * Creates a new instance of this filter. Do not use an instance of this
@@ -272,12 +273,14 @@
 	 *         empty list will be returned.
 	 */
 	public List<String> getUntrackedFolders() {
-		LinkedList<String> ret = new LinkedList<>(untrackedFolders);
+		ArrayList<String> ret = new ArrayList<>(untrackedFolders);
 		if (!untrackedParentFolders.isEmpty()) {
 			String toBeAdded = untrackedParentFolders.getLast();
-			while (!ret.isEmpty() && ret.getLast().startsWith(toBeAdded))
-				ret.removeLast();
-			ret.addLast(toBeAdded);
+			while (!ret.isEmpty()
+					&& ret.get(ret.size() - 1).startsWith(toBeAdded)) {
+				ret.remove(ret.size() - 1);
+			}
+			ret.add(toBeAdded);
 		}
 		return ret;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/UnionInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/UnionInputStream.java
index b37f28b..c3a1c4e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/UnionInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/UnionInputStream.java
@@ -12,8 +12,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayDeque;
+import java.util.Deque;
 import java.util.Iterator;
-import java.util.LinkedList;
 
 /**
  * An InputStream which reads from one or more InputStreams.
@@ -34,7 +35,7 @@
 		}
 	};
 
-	private final LinkedList<InputStream> streams = new LinkedList<>();
+	private final Deque<InputStream> streams = new ArrayDeque<>();
 
 	/**
 	 * Create an empty InputStream that is currently at EOF state.
diff --git a/tools/BUILD b/tools/BUILD
index c2b2366..c7ec638 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -17,7 +17,7 @@
 default_java_toolchain(
     name = "error_prone_warnings_toolchain_java17",
     configuration = dict(),
-    java_runtime = "@bazel_tools//tools/jdk:remotejdk_17",
+    java_runtime = "@rules_java//toolchains:remotejdk_17",
     package_configuration = [
         ":error_prone",
     ],
@@ -26,6 +26,18 @@
     visibility = ["//visibility:public"],
 )
 
+default_java_toolchain(
+    name = "error_prone_warnings_toolchain_java21",
+    configuration = dict(),
+    java_runtime = "@rules_java//toolchains:remotejdk_21",
+    package_configuration = [
+        ":error_prone",
+    ],
+    source_version = "21",
+    target_version = "21",
+    visibility = ["//visibility:public"],
+)
+
 # Error Prone errors enabled by default; see ../.bazelrc for how this is
 # enabled. This warnings list is originally based on:
 # https://github.com/bazelbuild/BUILD_file_generator/blob/master/tools/bazel_defs/java.bzl
@@ -62,7 +74,7 @@
         "-Xep:AutoValueSubclassLeaked:WARN",
         "-Xep:BadAnnotationImplementation:ERROR",
         "-Xep:BadComparable:ERROR",
-        "-Xep:BadImport:WARN",
+        "-Xep:BadImport:ERROR",
         "-Xep:BadInstanceof:ERROR",
         "-Xep:BadShiftAmount:ERROR",
         "-Xep:BanSerializableRead:ERROR",
@@ -75,8 +87,8 @@
         "-Xep:CacheLoaderNull:ERROR",
         "-Xep:CannotMockFinalClass:ERROR",
         "-Xep:CanonicalDuration:ERROR",
-        "-Xep:CatchAndPrintStackTrace:WARN",
-        "-Xep:CatchFail:WARN",
+        "-Xep:CatchAndPrintStackTrace:ERROR",
+        "-Xep:CatchFail:ERROR",
         "-Xep:ChainedAssertionLosesContext:ERROR",
         "-Xep:ChainingConstructorIgnoresParameter:ERROR",
         "-Xep:CharacterGetNumericValue:ERROR",
@@ -158,7 +170,7 @@
         "-Xep:FromTemporalAccessor:ERROR",
         "-Xep:FunctionalInterfaceClash:ERROR",
         "-Xep:FunctionalInterfaceMethodChanged:ERROR",
-        "-Xep:FutureReturnValueIgnored:WARN",
+        "-Xep:FutureReturnValueIgnored:ERROR",
         "-Xep:FuturesGetCheckedIllegalExceptionType:ERROR",
         "-Xep:GetClassOnAnnotation:ERROR",
         "-Xep:GetClassOnClass:ERROR",
@@ -222,7 +234,7 @@
         "-Xep:JavaPeriodGetDays:ERROR",
         "-Xep:JavaTimeDefaultTimeZone:ERROR",
         "-Xep:JavaUtilDate:WARN",
-        "-Xep:JdkObsolete:WARN",
+        "-Xep:JdkObsolete:ERROR",
         "-Xep:JodaConstructors:ERROR",
         "-Xep:JodaDateTimeConstants:ERROR",
         "-Xep:JodaDurationWithMillis:ERROR",
@@ -251,7 +263,7 @@
         "-Xep:LockOnBoxedPrimitive:ERROR",
         "-Xep:LogicalAssignment:ERROR",
         "-Xep:LongFloatConversion:ERROR",
-        "-Xep:LongLiteralLowerCaseSuffix:WARN",
+        "-Xep:LongLiteralLowerCaseSuffix:ERROR",
         "-Xep:LoopConditionChecker:ERROR",
         "-Xep:LoopOverCharArray:ERROR",
         "-Xep:LossyPrimitiveCompare:ERROR",
@@ -270,7 +282,7 @@
         "-Xep:MixedDescriptors:ERROR",
         "-Xep:MixedMutabilityReturnType:WARN",
         "-Xep:MockitoUsage:ERROR",
-        "-Xep:ModifiedButNotUsed:WARN",
+        "-Xep:ModifiedButNotUsed:ERROR",
         "-Xep:ModifyCollectionInEnhancedForLoop:ERROR",
         "-Xep:ModifyingCollectionWithItself:ERROR",
         "-Xep:ModifySourceCollectionInStream:ERROR",
@@ -323,7 +335,7 @@
         "-Xep:PreferredInterfaceType:OFF",
         "-Xep:PrimitiveAtomicReference:ERROR",
         "-Xep:PrivateSecurityContractProtoAccess:ERROR",
-        "-Xep:ProtectedMembersInFinalClass:WARN",
+        "-Xep:ProtectedMembersInFinalClass:ERROR",
         "-Xep:ProtoBuilderReturnValueIgnored:ERROR",
         "-Xep:ProtocolBufferOrdinal:ERROR",
         "-Xep:ProtoDurationGetSecondsGetNano:ERROR",
@@ -396,7 +408,7 @@
         "-Xep:UnnecessaryLambda:ERROR",
         "-Xep:UnnecessaryMethodInvocationMatcher:ERROR",
         "-Xep:UnnecessaryMethodReference:ERROR",
-        "-Xep:UnnecessaryParentheses:WARN",
+        "-Xep:UnnecessaryParentheses:ERROR",
         "-Xep:UnnecessaryTypeArgument:ERROR",
         "-Xep:UnrecognisedJavadocTag:ERROR",
         "-Xep:UnsafeFinalization:ERROR",
@@ -407,10 +419,10 @@
         "-Xep:UnusedException:ERROR",
         "-Xep:UnusedMethod:WARN",
         "-Xep:UnusedNestedClass:ERROR",
-        "-Xep:UnusedVariable:WARN",
+        "-Xep:UnusedVariable:ERROR",
         "-Xep:URLEqualsHashCode:ERROR",
         "-Xep:UseBinds:ERROR",
-        "-Xep:UseCorrectAssertInTests:WARN",
+        "-Xep:UseCorrectAssertInTests:ERROR",
         "-Xep:VariableNameSameAsType:ERROR",
         "-Xep:VarTypeName:ERROR",
         "-Xep:WaitNotInLoop:ERROR",
diff --git a/tools/remote-bazelrc b/tools/remote-bazelrc
index 0c558f8..f8aabd2 100644
--- a/tools/remote-bazelrc
+++ b/tools/remote-bazelrc
@@ -30,12 +30,11 @@
 
 # Set several flags related to specifying the platform, toolchain and java
 # properties.
-build:remote --crosstool_top=@rbe_jdk11//cc:toolchain
-build:remote --extra_toolchains=@rbe_jdk11//config:cc-toolchain
-build:remote --extra_execution_platforms=@rbe_jdk11//config:platform
-build:remote --host_platform=@rbe_jdk11//config:platform
-build:remote --platforms=@rbe_jdk11//config:platform
-build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1
+build:remote --crosstool_top=@ubuntu2204_jdk17//cc:toolchain
+build:remote --extra_toolchains=@ubuntu2204_jdk17//config:cc-toolchain
+build:remote --extra_execution_platforms=@ubuntu2204_jdk17//config:platform
+build:remote --host_platform=@ubuntu2204_jdk17//config:platform
+build:remote --platforms=@ubuntu2204_jdk17//config:platform
 
 # Set various strategies so that all actions execute remotely. Mixing remote
 # and local execution will lead to errors unless the toolchain and remote