Merge branch 'stable-6.6' into stable-6.7

* stable-6.6:
  Update to Tycho 4.0.1
  Add verification in GcKeepFilesTest that bitmaps are generated
  Express the explicit intention of creating bitmaps in GC
  GC: prune all packfiles after the loosen phase
  Prepare 5.13.3-SNAPSHOT builds
  JGit v5.13.2.202306221912-r

Change-Id: I7294c21748897eb3f94eeffbda944b62e3206c0d
diff --git a/WORKSPACE b/WORKSPACE
index ee4deef..5120ece 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -24,20 +24,20 @@
 
 register_toolchains("//tools:error_prone_warnings_toolchain_java17_definition")
 
-JMH_VERS = "1.35"
+JMH_VERS = "1.36"
 
 maven_jar(
     name = "jmh-core",
     artifact = "org.openjdk.jmh:jmh-core:" + JMH_VERS,
     attach_source = False,
-    sha1 = "c14d712be8e423969fcd344bc801cf5d3ea3b62a",
+    sha1 = "5a69117788322630fc5f228bc804771335d41b1b",
 )
 
 maven_jar(
     name = "jmh-annotations",
     artifact = "org.openjdk.jmh:jmh-generator-annprocess:" + JMH_VERS,
     attach_source = False,
-    sha1 = "50fba446d32d22f95f51a391f3450e03af006754",
+    sha1 = "41c92c483f92b3cce1c01edd849bfd3ffd920cf6",
 )
 
 maven_jar(
@@ -118,8 +118,8 @@
 
 maven_jar(
     name = "commons-codec",
-    artifact = "commons-codec:commons-codec:1.15",
-    sha1 = "49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d",
+    artifact = "commons-codec:commons-codec:1.16.0",
+    sha1 = "4e3eb3d79888d76b54e28b350915b5dc3919c9de",
 )
 
 maven_jar(
@@ -178,8 +178,8 @@
 
 maven_jar(
     name = "mockito",
-    artifact = "org.mockito:mockito-core:4.8.1",
-    sha1 = "d8eb9dec8747d08645347bb8c69088ac83197975",
+    artifact = "org.mockito:mockito-core:5.4.0",
+    sha1 = "30bcbe79f7bd51b53debfc4c6014d0bea4935e37",
 )
 
 maven_jar(
@@ -188,18 +188,18 @@
     sha1 = "ebbf338e33f893139459ce5df023115971c2786f",
 )
 
-BYTE_BUDDY_VERSION = "1.12.18"
+BYTE_BUDDY_VERSION = "1.14.5"
 
 maven_jar(
     name = "bytebuddy",
     artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VERSION,
-    sha1 = "875a9c3f29d2f6f499dfd60d76e97a343f9b1233",
+    sha1 = "28a424c0c4f362568e904d992c239c996cf7adc7",
 )
 
 maven_jar(
     name = "bytebuddy-agent",
     artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VERSION,
-    sha1 = "417a7310a7bf1c1aae5ca502d26515f9c2f94396",
+    sha1 = "20f4e9b9d0ffb953657bfa4b92c0cceb27907d58",
 )
 
 maven_jar(
@@ -265,32 +265,32 @@
     src_sha1 = "135448f8b3b3b06f7f3312d222992525ae4bdd25",
 )
 
-BOUNCYCASTLE_VER = "1.73"
+BOUNCYCASTLE_VER = "1.75"
 
 maven_jar(
     name = "bcpg",
     artifact = "org.bouncycastle:bcpg-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "2838f8c35e6e716349ce780c9c88271cab32065d",
-    src_sha1 = "3ea8d8e88569024cb37c303384d33f12e8be1ca3",
+    sha1 = "d37fddd467bc3351e4f9a66716f5f3231a3ba540",
+    src_sha1 = "41b22ae4e8455f837ac65cfc618a6900ba392747",
 )
 
 maven_jar(
     name = "bcprov",
     artifact = "org.bouncycastle:bcprov-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "4bd3de48e5153059fe3f80cbcf86ea221795ee55",
-    src_sha1 = "665f03dc0b10ef2fc90a11c28e48c84a3a9a7323",
+    sha1 = "fd9638f6468e934991c56242d0da2ae38890c2a4",
+    src_sha1 = "824c0265a84d1ec214c3513dc14fc7990bb4f70d",
 )
 
 maven_jar(
     name = "bcutil",
     artifact = "org.bouncycastle:bcutil-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "073a680acd04b249a6773f49200092cadb670bf0",
-    src_sha1 = "573ebc8e83bc846e815e68e4c624f2d0aef941b9",
+    sha1 = "0f58f4bbec8a40137bbb04f6174cd164fae0776b",
+    src_sha1 = "47713fc5d0766ab47b7dae237869ae102ed7f103",
 )
 
 maven_jar(
     name = "bcpkix",
     artifact = "org.bouncycastle:bcpkix-jdk18on:" + BOUNCYCASTLE_VER,
-    sha1 = "fd41dae0f564a93888ed5ade426281de94824717",
-    src_sha1 = "e11d418a87536d6f5a9537f7cb1f15a3e5c505e9",
+    sha1 = "5adfef8a71a0933454739264b56283cc73dd2383",
+    src_sha1 = "e50746007d8f1ccd9e49180af87811a1e9ce432d",
 )
diff --git a/lib/BUILD b/lib/BUILD
index 6be9e57..29669b5 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -21,6 +21,10 @@
 
 java_library(
     name = "commons-codec",
+    visibility = [
+        "//org.eclipse.jgit:__pkg__",
+        "//org.eclipse.jgit.test:__pkg__",
+    ],
     exports = ["@commons-codec//jar"],
 )
 
diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
index e6c0b6d..34b4244 100644
--- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
@@ -5,13 +5,13 @@
 Automatic-Module-Name: org.eclipse.jgit.ant.test
 Bundle-SymbolicName: org.eclipse.jgit.ant.test
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: org.apache.tools.ant,
- org.eclipse.jgit.ant.tasks;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.ant.tasks;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)"
diff --git a/org.eclipse.jgit.ant.test/pom.xml b/org.eclipse.jgit.ant.test/pom.xml
index 0975233..c87aa55 100644
--- a/org.eclipse.jgit.ant.test/pom.xml
+++ b/org.eclipse.jgit.ant.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ant.test</artifactId>
diff --git a/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs
index f79df5b..a08ba7b 100644
--- a/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
index b4cd0b8..a2e7bd0 100644
--- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
@@ -3,13 +3,13 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ant
 Bundle-SymbolicName: org.eclipse.jgit.ant
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: org.apache.tools.ant,
-  org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)"
+  org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)"
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.ant;version="6.6.1",
- org.eclipse.jgit.ant.tasks;version="6.6.1";
+Export-Package: org.eclipse.jgit.ant;version="6.7.0",
+ org.eclipse.jgit.ant.tasks;version="6.7.0";
   uses:="org.apache.tools.ant,
    org.apache.tools.ant.types"
diff --git a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
index 8637995..f617201 100644
--- a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ant - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ant.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ant;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ant;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml
index dccbcb9..8621b5e 100644
--- a/org.eclipse.jgit.ant/pom.xml
+++ b/org.eclipse.jgit.ant/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ant</artifactId>
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitAddTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitAddTask.java
index 0d409bb..07b60cf 100644
--- a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitAddTask.java
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitAddTask.java
@@ -75,7 +75,6 @@ private synchronized Union getPath() {
 		return path;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void execute() throws BuildException {
 		if (src == null) {
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java
index 1f10588..ecb5f9a 100644
--- a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java
@@ -77,7 +77,6 @@ public void setForce(boolean force) {
 		this.force = force;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void execute() throws BuildException {
 		CheckoutCommand checkout;
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java
index c143c9c..facf2ac 100644
--- a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java
@@ -76,7 +76,6 @@ public void setBranch(String branch) {
 		this.branch = branch;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void execute() throws BuildException {
 		log("Cloning repository " + uri);
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java
index 161168f..5c2a26b 100644
--- a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java
@@ -48,7 +48,6 @@ public void setBare(boolean bare) {
 		this.bare = bare;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void execute() throws BuildException {
 		if (bare) {
diff --git a/org.eclipse.jgit.archive/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.archive/.settings/org.eclipse.jdt.core.prefs
index 2abe952..b27b6c3 100644
--- a/org.eclipse.jgit.archive/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.archive/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
index 63b0958..8bd898c 100644
--- a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.archive
 Bundle-SymbolicName: org.eclipse.jgit.archive
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -13,17 +13,17 @@
  org.apache.commons.compress.compressors.bzip2;version="[1.4,2.0)",
  org.apache.commons.compress.compressors.gzip;version="[1.4,2.0)",
  org.apache.commons.compress.compressors.xz;version="[1.4,2.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.osgi.framework;version="[1.3.0,2.0.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-Activator: org.eclipse.jgit.archive.FormatActivator
-Export-Package: org.eclipse.jgit.archive;version="6.6.1";
+Export-Package: org.eclipse.jgit.archive;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.api,
    org.apache.commons.compress.archivers,
    org.osgi.framework",
- org.eclipse.jgit.archive.internal;version="6.6.1";x-internal:=true
+ org.eclipse.jgit.archive.internal;version="6.7.0";x-internal:=true
diff --git a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
index e5defc8..2f95928 100644
--- a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.archive - Sources
 Bundle-SymbolicName: org.eclipse.jgit.archive.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.archive;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.archive;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml
index 7b64948..c93e3ad 100644
--- a/org.eclipse.jgit.archive/pom.xml
+++ b/org.eclipse.jgit.archive/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.archive</artifactId>
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/BaseFormat.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/BaseFormat.java
index 0ebac77..25cd368 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/BaseFormat.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/BaseFormat.java
@@ -40,6 +40,7 @@ public class BaseFormat {
 	 *            options map
 	 * @return stream with option applied
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected ArchiveOutputStream applyFormatOptions(ArchiveOutputStream s,
 			Map<String, Object> o) throws IOException {
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TarFormat.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TarFormat.java
index 702bad6..dfa6032 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TarFormat.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TarFormat.java
@@ -39,7 +39,6 @@ public final class TarFormat extends BaseFormat implements
 	private static final List<String> SUFFIXES = Collections
 			.unmodifiableList(Arrays.asList(".tar")); //$NON-NLS-1$
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -47,7 +46,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 				Collections.<String, Object> emptyMap());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -58,7 +56,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 		return applyFormatOptions(out, o);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -108,19 +105,16 @@ public void putEntry(ArchiveOutputStream out,
 		out.closeArchiveEntry();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterable<String> suffixes() {
 		return SUFFIXES;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object other) {
 		return (other instanceof TarFormat);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getClass().hashCode();
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/Tbz2Format.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/Tbz2Format.java
index 940dafd..26da431 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/Tbz2Format.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/Tbz2Format.java
@@ -33,7 +33,6 @@ public final class Tbz2Format extends BaseFormat implements
 
 	private final ArchiveCommand.Format<ArchiveOutputStream> tarFormat = new TarFormat();
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -41,7 +40,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 				Collections.<String, Object> emptyMap());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -55,7 +53,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 		return tarFormat.createArchiveOutputStream(out, o);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -63,19 +60,16 @@ public void putEntry(ArchiveOutputStream out,
 		tarFormat.putEntry(out, tree, path, mode, loader);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterable<String> suffixes() {
 		return SUFFIXES;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object other) {
 		return (other instanceof Tbz2Format);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getClass().hashCode();
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TgzFormat.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TgzFormat.java
index 72e2439..d1ed035 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TgzFormat.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TgzFormat.java
@@ -34,7 +34,6 @@ public final class TgzFormat extends BaseFormat implements
 
 	private final ArchiveCommand.Format<ArchiveOutputStream> tarFormat = new TarFormat();
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -42,7 +41,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 				Collections.<String, Object> emptyMap());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -58,7 +56,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 		return tarFormat.createArchiveOutputStream(out, o);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -66,19 +63,16 @@ public void putEntry(ArchiveOutputStream out,
 		tarFormat.putEntry(out, tree, path, mode, loader);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterable<String> suffixes() {
 		return SUFFIXES;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object other) {
 		return (other instanceof TgzFormat);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getClass().hashCode();
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TxzFormat.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TxzFormat.java
index b16fb6d..42549de 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TxzFormat.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TxzFormat.java
@@ -33,7 +33,6 @@ public final class TxzFormat extends BaseFormat implements
 
 	private final ArchiveCommand.Format<ArchiveOutputStream> tarFormat = new TarFormat();
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -41,7 +40,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 				Collections.<String, Object> emptyMap());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -55,7 +53,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 		return tarFormat.createArchiveOutputStream(out, o);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -63,19 +60,16 @@ public void putEntry(ArchiveOutputStream out,
 		tarFormat.putEntry(out, tree, path, mode, loader);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterable<String> suffixes() {
 		return SUFFIXES;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object other) {
 		return (other instanceof TxzFormat);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getClass().hashCode();
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ZipFormat.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ZipFormat.java
index 97a24c7..6cb42ae 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ZipFormat.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ZipFormat.java
@@ -35,7 +35,6 @@ public final class ZipFormat extends BaseFormat implements
 	private static final List<String> SUFFIXES = Collections
 			.unmodifiableList(Arrays.asList(".zip")); //$NON-NLS-1$
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -43,7 +42,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 				Collections.<String, Object> emptyMap());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -55,7 +53,6 @@ public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 		return applyFormatOptions(out, o);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -97,19 +94,16 @@ public void putEntry(ArchiveOutputStream out,
 		out.closeArchiveEntry();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterable<String> suffixes() {
 		return SUFFIXES;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object other) {
 		return (other instanceof ZipFormat);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getClass().hashCode();
diff --git a/org.eclipse.jgit.benchmarks/BUILD b/org.eclipse.jgit.benchmarks/BUILD
index ecd268c..6198e4d 100644
--- a/org.eclipse.jgit.benchmarks/BUILD
+++ b/org.eclipse.jgit.benchmarks/BUILD
@@ -7,9 +7,11 @@
 jmh_java_benchmarks(
     name = "benchmarks",
     srcs = SRCS,
+    testonly = 1,
     deps = [
         "//lib:javaewah",
         "//lib:slf4j-api",
         "//org.eclipse.jgit:jgit",
+        "//org.eclipse.jgit.junit:junit",
     ],
 )
diff --git a/org.eclipse.jgit.benchmarks/pom.xml b/org.eclipse.jgit.benchmarks/pom.xml
index e743a2a..e2209c7 100644
--- a/org.eclipse.jgit.benchmarks/pom.xml
+++ b/org.eclipse.jgit.benchmarks/pom.xml
@@ -14,7 +14,7 @@
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.eclipse.jgit</groupId>
-  <version>6.6.1-SNAPSHOT</version>
+  <version>6.7.0-SNAPSHOT</version>
   <artifactId>org.eclipse.jgit.benchmarks</artifactId>
   <packaging>jar</packaging>
 
@@ -23,7 +23,7 @@
   <properties>
     <java.version>11</java.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <jmh.version>1.35</jmh.version>
+    <jmh.version>1.36</jmh.version>
     <uberjar.name>benchmarks</uberjar.name>
   </properties>
 
@@ -56,7 +56,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
-        <version>3.1.0</version>
+        <version>3.3.0</version>
         <executions>
           <execution>
             <id>enforce-maven</id>
@@ -76,7 +76,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.10.1</version>
+        <version>3.11.0</version>
         <configuration>
           <encoding>UTF-8</encoding>
           <release>${java.version}</release>
@@ -187,7 +187,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-report-plugin</artifactId>
-          <version>3.0.0-M8</version>
+          <version>3.0.0</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
@@ -197,7 +197,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-project-info-reports-plugin</artifactId>
-          <version>3.4.2</version>
+          <version>3.4.3</version>
         </plugin>
       </plugins>
     </pluginManagement>
diff --git a/org.eclipse.jgit.coverage/pom.xml b/org.eclipse.jgit.coverage/pom.xml
index 7a8f56c..afb8c32 100644
--- a/org.eclipse.jgit.coverage/pom.xml
+++ b/org.eclipse.jgit.coverage/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
@@ -27,88 +27,88 @@
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ant</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.archive</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.apache</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.server</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.server</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ui</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ssh.apache</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ant.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.http.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.ssh.apache.test</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
   </dependencies>
 
diff --git a/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
index 805b6fb..f8c801b 100644
--- a/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.gpg.bc.test
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -12,9 +12,9 @@
  org.bouncycastle.openpgp.operator;version="[1.65.0,2.0.0)",
  org.bouncycastle.openpgp.operator.jcajce;version="[1.65.0,2.0.0)",
  org.bouncycastle.util.encoders;version="[1.65.0,2.0.0)",
- org.eclipse.jgit.gpg.bc.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.gpg.bc.internal.keys;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.sha1;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.gpg.bc.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.gpg.bc.internal.keys;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.sha1;version="[6.7.0,6.8.0)",
  org.hamcrest;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.gpg.bc.test/pom.xml b/org.eclipse.jgit.gpg.bc.test/pom.xml
index c4d3818..2561c19 100644
--- a/org.eclipse.jgit.gpg.bc.test/pom.xml
+++ b/org.eclipse.jgit.gpg.bc.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.gpg.bc.test</artifactId>
diff --git a/org.eclipse.jgit.gpg.bc/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.gpg.bc/.settings/org.eclipse.jdt.core.prefs
index d1f54bb..d5c0e6c 100644
--- a/org.eclipse.jgit.gpg.bc/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.gpg.bc/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF b/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
index 94ca557..6e2f643 100644
--- a/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc/META-INF/MANIFEST.MF
@@ -3,10 +3,10 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.gpg.bc
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc;singleton:=true
-Fragment-Host: org.eclipse.jgit;bundle-version="[6.6.1,6.7.0)"
+Fragment-Host: org.eclipse.jgit;bundle-version="[6.7.0,6.8.0)"
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: org.bouncycastle.asn1;version="[1.69.0,2.0.0)",
  org.bouncycastle.asn1.cryptlib;version="[1.69.0,2.0.0)",
@@ -29,9 +29,9 @@
  org.bouncycastle.util;version="[1.69.0,2.0.0)",
  org.bouncycastle.util.encoders;version="[1.69.0,2.0.0)",
  org.bouncycastle.util.io;version="[1.69.0,2.0.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
-Export-Package: org.eclipse.jgit.gpg.bc;version="6.6.1",
- org.eclipse.jgit.gpg.bc.internal;version="6.6.1";x-friends:="org.eclipse.jgit.gpg.bc.test",
- org.eclipse.jgit.gpg.bc.internal.keys;version="6.6.1";x-friends:="org.eclipse.jgit.gpg.bc.test"
+Export-Package: org.eclipse.jgit.gpg.bc;version="6.7.0",
+ org.eclipse.jgit.gpg.bc.internal;version="6.7.0";x-friends:="org.eclipse.jgit.gpg.bc.test",
+ org.eclipse.jgit.gpg.bc.internal.keys;version="6.7.0";x-friends:="org.eclipse.jgit.gpg.bc.test"
diff --git a/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
index e6f3a4d..03b4d87 100644
--- a/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.gpg.bc/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.gpg.bc - Sources
 Bundle-SymbolicName: org.eclipse.jgit.gpg.bc.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.gpg.bc;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.gpg.bc;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.gpg.bc/pom.xml b/org.eclipse.jgit.gpg.bc/pom.xml
index f6339f8..e42d4e0 100644
--- a/org.eclipse.jgit.gpg.bc/pom.xml
+++ b/org.eclipse.jgit.gpg.bc/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.gpg.bc</artifactId>
diff --git a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyLocator.java b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyLocator.java
index 8cd03bd..d7bf34e 100644
--- a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyLocator.java
+++ b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyLocator.java
@@ -324,7 +324,9 @@ private static PGPPublicKey findPublicKeyByUserId(KeyBlob keyBlob,
 	 * @throws IOException
 	 *             in case of problems reading the file
 	 * @throws NoSuchAlgorithmException
+	 *             if an algorithm isn't available
 	 * @throws NoSuchProviderException
+	 *             if a provider isn't available
 	 * @throws NoOpenPgpKeyException
 	 *             if the file does not contain any OpenPGP key
 	 */
@@ -368,12 +370,17 @@ private static PGPPublicKey findPublicKeyInKeyBox(Path keyboxFile,
 	 * @throws IOException
 	 *             in case of issues reading key files
 	 * @throws NoSuchAlgorithmException
+	 *             algorithm is not available
 	 * @throws NoSuchProviderException
+	 *             provider is not available
 	 * @throws PGPException
 	 *             in case of issues finding a key, including no key found
 	 * @throws CanceledException
+	 *             operation was cancelled
 	 * @throws URISyntaxException
+	 *             URI is invalid
 	 * @throws UnsupportedCredentialItem
+	 *             credential item is not supported
 	 */
 	@NonNull
 	public BouncyCastleGpgKey findSecretKey() throws IOException,
@@ -543,10 +550,11 @@ private BouncyCastleGpgKey findSecretKeyForKeyBoxPublicKey(
 	/**
 	 * Return the first suitable key for signing in the key ring collection. For
 	 * this case we only expect there to be one key available for signing.
-	 * </p>
 	 *
 	 * @param signingkey
+	 *            the signing key
 	 * @param secringFile
+	 *            the secring file
 	 *
 	 * @return the first suitable PGP secret key found for signing
 	 * @throws IOException
diff --git a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyPassphrasePrompt.java b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyPassphrasePrompt.java
index 6144195..463b661 100644
--- a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyPassphrasePrompt.java
+++ b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/BouncyCastleGpgKeyPassphrasePrompt.java
@@ -69,10 +69,13 @@ private URIish createURI(Path keyLocation) throws URISyntaxException {
 	 *            the location the key was loaded from
 	 * @return the passphrase (maybe <code>null</code>)
 	 * @throws PGPException
+	 *             if a PGP problem occurred
 	 * @throws CanceledException
 	 *             in case passphrase was not entered by user
 	 * @throws URISyntaxException
+	 *             if the URI isn't parseable
 	 * @throws UnsupportedCredentialItem
+	 *             if a credential item isn't supported
 	 */
 	public char[] getPassphrase(byte[] keyFingerprint, Path keyLocation)
 			throws PGPException, CanceledException, UnsupportedCredentialItem,
diff --git a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/KeyGrip.java b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/KeyGrip.java
index c931724..3eee18a 100644
--- a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/KeyGrip.java
+++ b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/KeyGrip.java
@@ -36,8 +36,8 @@
  * Utilities to compute the <em>keygrip</em> of a key. A keygrip is a SHA1 hash
  * over the public key parameters and is used internally by the gpg-agent to
  * find the secret key belonging to a public key: the secret key is stored in a
- * file under ~/.gnupg/private-keys-v1.d/ with a name "&lt;keygrip>.key". While
- * this storage organization is an implementation detail of GPG, the way
+ * file under ~/.gnupg/private-keys-v1.d/ with a name "&lt;keygrip&gt;.key".
+ * While this storage organization is an implementation detail of GPG, the way
  * keygrips are computed is not; they are computed by libgcrypt and their
  * definition is stable.
  */
diff --git a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SExprParser.java b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SExprParser.java
index a9bb22c..c93c216 100644
--- a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SExprParser.java
+++ b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SExprParser.java
@@ -95,7 +95,9 @@ public SExprParser(PGPDigestCalculatorProvider digestProvider) {
 	 *
 	 * @return a secret key object.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws PGPException
+	 *             if some PGP error occurred
 	 */
 	public PGPSecretKey parseSecretKey(InputStream inputStream,
 			PBEProtectionRemoverFactory keyProtectionRemoverFactory,
@@ -252,7 +254,9 @@ public PGPSecretKey parseSecretKey(InputStream inputStream,
 	 *
 	 * @return a secret key object.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws PGPException
+	 *             if a PGP error occurred
 	 */
 	public PGPSecretKey parseSecretKey(InputStream inputStream,
 			PBEProtectionRemoverFactory keyProtectionRemoverFactory,
diff --git a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SecretKeys.java b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SecretKeys.java
index 269a1ba..a659d38 100644
--- a/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SecretKeys.java
+++ b/org.eclipse.jgit.gpg.bc/src/org/eclipse/jgit/gpg/bc/internal/keys/SecretKeys.java
@@ -373,6 +373,7 @@ && matches(humanForm, start, OCB_PROTECTED)) {
 	 *            index of the closing quote in {@code in}
 	 * @return the dequoted raw string value
 	 * @throws StreamCorruptedException
+	 *             if object stream is corrupt
 	 */
 	private static byte[] dequote(byte[] in, int from, int to)
 			throws StreamCorruptedException {
diff --git a/org.eclipse.jgit.http.apache/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.http.apache/.settings/org.eclipse.jdt.core.prefs
index f79df5b..a08ba7b 100644
--- a/org.eclipse.jgit.http.apache/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.http.apache/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
index 37028f8..54e5abf 100644
--- a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.apache
 Bundle-SymbolicName: org.eclipse.jgit.http.apache
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
@@ -25,11 +25,11 @@
  org.apache.http.impl.conn;version="[4.4.0,5.0.0)",
  org.apache.http.params;version="[4.3.0,5.0.0)",
  org.apache.http.ssl;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)"
-Export-Package: org.eclipse.jgit.transport.http.apache;version="6.6.1";
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)"
+Export-Package: org.eclipse.jgit.transport.http.apache;version="6.7.0";
   uses:="org.apache.http.client,
    org.eclipse.jgit.transport.http,
    org.apache.http.entity,
diff --git a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
index d2336b3..0c897b7 100644
--- a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.http.apache - Sources
 Bundle-SymbolicName: org.eclipse.jgit.http.apache.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml
index 2c96b01..1c1aa45 100644
--- a/org.eclipse.jgit.http.apache/pom.xml
+++ b/org.eclipse.jgit.http.apache/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.apache</artifactId>
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 90348f5..6d806de 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
@@ -203,6 +203,7 @@ private SSLContext getSSLContext() {
 	 * Sets the buffer from which to take the request body
 	 *
 	 * @param buffer
+	 *            the buffer
 	 */
 	public void setBuffer(TemporaryBuffer buffer) {
 		this.entity = new TemporaryBufferEntity(buffer);
@@ -212,7 +213,9 @@ public void setBuffer(TemporaryBuffer buffer) {
 	 * Constructor for HttpClientConnection.
 	 *
 	 * @param urlStr
+	 *            url string
 	 * @throws MalformedURLException
+	 *             if url is malformed
 	 */
 	public HttpClientConnection(String urlStr) throws MalformedURLException {
 		this(urlStr, null);
@@ -222,8 +225,11 @@ public HttpClientConnection(String urlStr) throws MalformedURLException {
 	 * Constructor for HttpClientConnection.
 	 *
 	 * @param urlStr
+	 *            url string
 	 * @param proxy
+	 *            proxy
 	 * @throws MalformedURLException
+	 *             if url is malformed
 	 */
 	public HttpClientConnection(String urlStr, Proxy proxy)
 			throws MalformedURLException {
@@ -234,9 +240,13 @@ public HttpClientConnection(String urlStr, Proxy proxy)
 	 * Constructor for HttpClientConnection.
 	 *
 	 * @param urlStr
+	 *            url string
 	 * @param proxy
+	 *            proxy
 	 * @param cl
+	 *            client
 	 * @throws MalformedURLException
+	 *             if url is malformed
 	 */
 	public HttpClientConnection(String urlStr, Proxy proxy, HttpClient cl)
 			throws MalformedURLException {
@@ -245,20 +255,17 @@ public HttpClientConnection(String urlStr, Proxy proxy, HttpClient cl)
 		this.proxy = proxy;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getResponseCode() throws IOException {
 		execute();
 		return resp.getStatusLine().getStatusCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public URL getURL() {
 		return url;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getResponseMessage() throws IOException {
 		execute();
@@ -287,7 +294,6 @@ private void execute() throws IOException, ClientProtocolException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, List<String>> getHeaderFields() {
 		Map<String, List<String>> ret = new HashMap<>();
@@ -304,13 +310,11 @@ public Map<String, List<String>> getHeaderFields() {
 		return ret;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setRequestProperty(String name, String value) {
 		req.addHeader(name, value);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setRequestMethod(String method) throws ProtocolException {
 		this.method = method;
@@ -328,25 +332,21 @@ public void setRequestMethod(String method) throws ProtocolException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setUseCaches(boolean usecaches) {
 		// not needed
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setConnectTimeout(int timeout) {
 		this.timeout = Integer.valueOf(timeout);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setReadTimeout(int readTimeout) {
 		this.readTimeout = Integer.valueOf(readTimeout);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getContentType() {
 		HttpEntity responseEntity = resp.getEntity();
@@ -358,7 +358,6 @@ public String getContentType() {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public InputStream getInputStream() throws IOException {
 		execute();
@@ -366,7 +365,6 @@ public InputStream getInputStream() throws IOException {
 	}
 
 	// will return only the first field
-	/** {@inheritDoc} */
 	@Override
 	public String getHeaderField(@NonNull String name) {
 		Header header = resp.getFirstHeader(name);
@@ -379,7 +377,6 @@ public List<String> getHeaderFields(@NonNull String name) {
 				.stream().map(Header::getValue).collect(Collectors.toList()));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getContentLength() {
 		Header contentLength = resp.getFirstHeader("content-length"); //$NON-NLS-1$
@@ -395,19 +392,16 @@ public int getContentLength() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setInstanceFollowRedirects(boolean followRedirects) {
 		this.followRedirects = Boolean.valueOf(followRedirects);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setDoOutput(boolean dooutput) {
 		// TODO: check whether we can really ignore this.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setFixedLengthStreamingMode(int contentLength) {
 		if (entity != null)
@@ -416,7 +410,6 @@ public void setFixedLengthStreamingMode(int contentLength) {
 		entity.setContentLength(contentLength);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public OutputStream getOutputStream() throws IOException {
 		if (entity == null)
@@ -424,7 +417,6 @@ public OutputStream getOutputStream() throws IOException {
 		return entity.getBuffer();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setChunkedStreamingMode(int chunklen) {
 		if (entity == null)
@@ -432,31 +424,26 @@ public void setChunkedStreamingMode(int chunklen) {
 		entity.setChunked(true);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getRequestMethod() {
 		return method;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean usingProxy() {
 		return isUsingProxy;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void connect() throws IOException {
 		execute();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setHostnameVerifier(HostnameVerifier hostnameverifier) {
 		this.hostnameverifier = hostnameverifier;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void configure(KeyManager[] km, TrustManager[] tm,
 			SecureRandom random) throws KeyManagementException {
diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java
index 101886c..40be074 100644
--- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java
+++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java
@@ -33,6 +33,7 @@ public class TemporaryBufferEntity extends AbstractHttpEntity
 	 * content stored in the specified buffer
 	 *
 	 * @param buffer
+	 *            the buffer
 	 */
 	public TemporaryBufferEntity(TemporaryBuffer buffer) {
 		this.buffer = buffer;
@@ -47,13 +48,11 @@ public TemporaryBuffer getBuffer() {
 		return buffer;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isRepeatable() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getContentLength() {
 		if (contentLength != null)
@@ -61,20 +60,17 @@ public long getContentLength() {
 		return buffer.length();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public InputStream getContent() throws IOException, IllegalStateException {
 		return buffer.openInputStream();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeTo(OutputStream outstream) throws IOException {
 		// TODO: dont we need a progressmonitor
 		buffer.writeTo(outstream, null);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isStreaming() {
 		return false;
@@ -84,6 +80,7 @@ public boolean isStreaming() {
 	 * Set the <code>contentLength</code>
 	 *
 	 * @param contentLength
+	 *            content length
 	 */
 	public void setContentLength(int contentLength) {
 		this.contentLength = Integer.valueOf(contentLength);
diff --git a/org.eclipse.jgit.http.server/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.http.server/.settings/org.eclipse.jdt.core.prefs
index f79df5b..a08ba7b 100644
--- a/org.eclipse.jgit.http.server/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.http.server/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
index 170e91f..f3f6fc3 100644
--- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
@@ -3,13 +3,13 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.server
 Bundle-SymbolicName: org.eclipse.jgit.http.server
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.http.server;version="6.6.1",
- org.eclipse.jgit.http.server.glue;version="6.6.1";
+Export-Package: org.eclipse.jgit.http.server;version="6.7.0",
+ org.eclipse.jgit.http.server.glue;version="6.7.0";
   uses:="javax.servlet,javax.servlet.http",
- org.eclipse.jgit.http.server.resolver;version="6.6.1";
+ org.eclipse.jgit.http.server.resolver;version="6.7.0";
   uses:="org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.transport,
@@ -18,14 +18,14 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: javax.servlet;version="[2.5.0,5.0.0)",
  javax.servlet.http;version="[2.5.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.parser;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.resolver;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)"
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.parser;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)"
diff --git a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
index ff4e234..a9e4e2a 100644
--- a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.http.server - Sources
 Bundle-SymbolicName: org.eclipse.jgit.http.server.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml
index 27127b1..85e9c14 100644
--- a/org.eclipse.jgit.http.server/pom.xml
+++ b/org.eclipse.jgit.http.server/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.server</artifactId>
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/AsIsFileFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/AsIsFileFilter.java
index 59dc309..fb74dc7 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/AsIsFileFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/AsIsFileFilter.java
@@ -37,19 +37,16 @@ class AsIsFileFilter implements Filter {
 		this.asIs = getAnyFile;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig config) throws ServletException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response,
 			FilterChain chain) throws IOException, ServletException {
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 0957cc8..2f3eee4 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
@@ -189,7 +189,6 @@ private void assertNotInitialized() {
 			throw new IllegalStateException(HttpServerText.get().alreadyInitializedByContainer);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig filterConfig) throws ServletException {
 		super.init(filterConfig);
@@ -305,7 +304,6 @@ private static boolean getBoolean(FilterConfig cfg, String param)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ServletBinder register(ServletBinder binder) {
 		if (resolver == null)
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitServlet.java
index 8e49b37..0157dff 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitServlet.java
@@ -170,7 +170,6 @@ public void addReceivePackFilter(Filter filter) {
 		gitFilter.addReceivePackFilter(filter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(ServletConfig config) throws ServletException {
 		gitFilter.init(new FilterConfig() {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoPacksServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoPacksServlet.java
index e90580b..d94cc41 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoPacksServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoPacksServlet.java
@@ -27,7 +27,6 @@
 class InfoPacksServlet extends HttpServlet {
 	private static final long serialVersionUID = 1L;
 
-	/** {@inheritDoc} */
 	@Override
 	public void doGet(final HttpServletRequest req,
 			final HttpServletResponse rsp) throws IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java
index f67313d..4d86be1 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java
@@ -29,7 +29,6 @@
 class InfoRefsServlet extends HttpServlet {
 	private static final long serialVersionUID = 1L;
 
-	/** {@inheritDoc} */
 	@Override
 	public void doGet(final HttpServletRequest req,
 			final HttpServletResponse rsp) throws IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/IsLocalFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/IsLocalFilter.java
index e0d9512..434cdb4 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/IsLocalFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/IsLocalFilter.java
@@ -33,19 +33,16 @@
  * downstream servlet can directly access its contents on disk.
  */
 class IsLocalFilter implements Filter {
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig config) throws ServletException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response,
 			FilterChain chain) throws IOException, ServletException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/NoCacheFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/NoCacheFilter.java
index 4f9e6f2..b1a2b30 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/NoCacheFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/NoCacheFilter.java
@@ -26,19 +26,16 @@
 
 /** Add HTTP response headers to prevent caching by proxies/browsers. */
 class NoCacheFilter implements Filter {
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig config) throws ServletException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response,
 			FilterChain chain) throws IOException, ServletException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java
index 625ab3e..e581707 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java
@@ -87,14 +87,12 @@ static class PackIdx extends PackData {
 
 	abstract String etag(FileSender sender) throws IOException;
 
-	/** {@inheritDoc} */
 	@Override
 	public void doGet(final HttpServletRequest req,
 			final HttpServletResponse rsp) throws IOException {
 		serve(req, rsp, true);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void doHead(final HttpServletRequest req,
 			final HttpServletResponse rsp) throws ServletException, IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackErrorHandler.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackErrorHandler.java
index a7ca4d0..c87bbe6 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackErrorHandler.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackErrorHandler.java
@@ -42,6 +42,7 @@ public interface ReceivePackErrorHandler {
 	 * @param r
 	 *            A continuation that handles a git-receive-pack request.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void receive(HttpServletRequest req, HttpServletResponse rsp,
 			ReceivePackRunnable r) throws IOException;
@@ -52,7 +53,9 @@ public interface ReceivePackRunnable {
 		 * See {@link ReceivePack#receiveWithExceptionPropagation}.
 		 *
 		 * @throws ServiceMayNotContinueException
+		 *             if transport service cannot continue
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		void receive() throws ServiceMayNotContinueException, IOException;
 	}
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
index f8c95f5..56b4c80 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
@@ -136,7 +136,6 @@ public void destroy() {
 		this.handler = handler;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doPost(final HttpServletRequest req,
 			final HttpServletResponse rsp) throws IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java
index 943e7f5..9ff922b 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java
@@ -71,19 +71,16 @@ public RepositoryFilter(RepositoryResolver<HttpServletRequest> resolver) {
 		this.resolver = resolver;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig config) throws ServletException {
 		context = config.getServletContext();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		context = null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(final ServletRequest request,
 			final ServletResponse response, final FilterChain chain)
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java
index 11123d0..fdac79d 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java
@@ -50,7 +50,6 @@ class SmartOutputStream extends TemporaryBuffer {
 		this.compressStream = compressStream;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected OutputStream overflow() throws IOException {
 		startedOutput = true;
@@ -63,7 +62,6 @@ protected OutputStream overflow() throws IOException {
 		return out;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		super.close();
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java
index 6110bff..aa04431 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java
@@ -47,19 +47,16 @@ abstract class SmartServiceInfoRefs implements Filter {
 		this.filters = filters.toArray(new Filter[0]);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig config) throws ServletException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response,
 			FilterChain chain) throws IOException, ServletException {
@@ -122,8 +119,12 @@ private void service(ServletRequest request, ServletResponse response)
 	 * @param db
 	 *            repository
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws ServiceNotEnabledException
+	 *             if a service is not available
 	 * @throws ServiceNotAuthorizedException
+	 *             if service requires authentication and the current user
+	 *             didn't provide credentials
 	 */
 	protected abstract void begin(HttpServletRequest req, Repository db)
 			throws IOException, ServiceNotEnabledException,
@@ -135,35 +136,43 @@ protected abstract void begin(HttpServletRequest req, Repository db)
 	 * @param req
 	 *            request
 	 * @param pck
+	 *            used to frame lines in PacketLineOut format
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws ServiceNotEnabledException
+	 *             if a service is not available
 	 * @throws ServiceNotAuthorizedException
+	 *             if service requires authentication and the current user
+	 *             didn't provide credentials
 	 */
 	protected abstract void advertise(HttpServletRequest req,
 			PacketLineOutRefAdvertiser pck) throws IOException,
 			ServiceNotEnabledException, ServiceNotAuthorizedException;
 
 	/**
-	 * Writes the appropriate response to an info/refs request received by
-	 * a smart service. In protocol v0, this starts with "#
-	 * service=serviceName" followed by a flush packet, but this is not
-	 * necessarily the case in other protocol versions.
+	 * Writes the appropriate response to an info/refs request received by a
+	 * smart service. In protocol v0, this starts with "# service=serviceName"
+	 * followed by a flush packet, but this is not necessarily the case in other
+	 * protocol versions.
 	 * <p>
-	 * The default implementation writes "# service=serviceName" and a
-	 * flush packet, then calls {@link #advertise}. Subclasses should
-	 * override this method if they support protocol versions other than
-	 * protocol v0.
+	 * The default implementation writes "# service=serviceName" and a flush
+	 * packet, then calls {@link #advertise}. Subclasses should override this
+	 * method if they support protocol versions other than protocol v0.
 	 *
 	 * @param req
 	 *            request
 	 * @param pckOut
 	 *            destination of response
 	 * @param serviceName
-	 *            service name to be written out in protocol v0; may or may
-	 *            not be used in other versions
+	 *            service name to be written out in protocol v0; may or may not
+	 *            be used in other versions
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws ServiceNotEnabledException
+	 *             if a service is not available
 	 * @throws ServiceNotAuthorizedException
+	 *             if service requires authentication and the current user
+	 *             didn't provide credentials
 	 */
 	protected void respond(HttpServletRequest req,
 			PacketLineOut pckOut, String serviceName)
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/TextFileServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/TextFileServlet.java
index df8eb77..0b225e7 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/TextFileServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/TextFileServlet.java
@@ -35,7 +35,6 @@ class TextFileServlet extends HttpServlet {
 		this.fileName = name;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doGet(final HttpServletRequest req,
 			final HttpServletResponse rsp) throws IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackErrorHandler.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackErrorHandler.java
index 2aadbbc..aaf537f 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackErrorHandler.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackErrorHandler.java
@@ -58,6 +58,7 @@ public static int statusCodeForThrowable(Throwable error) {
 		}
 		return SC_INTERNAL_SERVER_ERROR;
 	}
+
 	/**
 	 * @param req
 	 *            The HTTP request
@@ -66,6 +67,7 @@ public static int statusCodeForThrowable(Throwable error) {
 	 * @param r
 	 *            A continuation that handles a git-upload-pack request.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void upload(HttpServletRequest req, HttpServletResponse rsp,
 			UploadPackRunnable r) throws IOException;
@@ -76,7 +78,9 @@ public interface UploadPackRunnable {
 		 * See {@link UploadPack#uploadWithExceptionPropagation}.
 		 *
 		 * @throws ServiceMayNotContinueException
+		 *             transport service cannot continue
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		void upload() throws ServiceMayNotContinueException, IOException;
 	}
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java
index f16e56d..74419a5 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java
@@ -158,7 +158,6 @@ public void destroy() {
 				: this::defaultUploadPackHandler;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doPost(HttpServletRequest req, HttpServletResponse rsp)
 			throws IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ErrorServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ErrorServlet.java
index 7f4243a..822bb79 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ErrorServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ErrorServlet.java
@@ -35,7 +35,6 @@ public ErrorServlet(int status) {
 		this.status = status;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
 			throws ServletException, IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaFilter.java
index 772b996..e626bec 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaFilter.java
@@ -97,13 +97,11 @@ public ServletBinder serveRegex(Pattern pattern) {
 		return register(new RegexPipeline.Binder(pattern));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig filterConfig) throws ServletException {
 		servletContext = filterConfig.getServletContext();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		if (pipelines != null) {
@@ -140,7 +138,6 @@ public int size() {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response,
 			FilterChain chain) throws IOException, ServletException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaServlet.java
index a0fa5ea..9a1a249 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/MetaServlet.java
@@ -88,7 +88,6 @@ public ServletBinder serveRegex(String expression) {
 		return filter.serveRegex(expression);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(ServletConfig config) throws ServletException {
 		String name = filter.getClass().getName();
@@ -96,13 +95,11 @@ public void init(ServletConfig config) throws ServletException {
 		filter.init(new NoParameterFilterConfig(name, ctx));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		filter.destroy();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void service(HttpServletRequest req, HttpServletResponse res)
 			throws ServletException, IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/NoParameterFilterConfig.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/NoParameterFilterConfig.java
index ebe2728..3f7ee2a 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/NoParameterFilterConfig.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/NoParameterFilterConfig.java
@@ -26,13 +26,11 @@ final class NoParameterFilterConfig implements FilterConfig {
 		this.context = context;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getInitParameter(String name) {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Enumeration<String> getInitParameterNames() {
 		return new Enumeration<>() {
@@ -49,13 +47,11 @@ public String nextElement() {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ServletContext getServletContext() {
 		return context;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getFilterName() {
 		return filterName;
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexGroupFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexGroupFilter.java
index a321c96..c8ff6a3 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexGroupFilter.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexGroupFilter.java
@@ -49,19 +49,16 @@ public RegexGroupFilter(int groupIdx) {
 		this.groupIdx = groupIdx - 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig config) throws ServletException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void destroy() {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void doFilter(final ServletRequest request,
 			final ServletResponse rsp, final FilterChain chain)
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
index 431202b..5baa14a 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
@@ -131,7 +131,6 @@ void service(HttpServletRequest req, HttpServletResponse rsp)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "Pipeline[regex: " + pattern + " ]";
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinderImpl.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinderImpl.java
index 21f1800..cd49023 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinderImpl.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinderImpl.java
@@ -28,7 +28,6 @@ abstract class ServletBinderImpl implements ServletBinder {
 		this.filters = new ArrayList<>();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ServletBinder through(Filter filter) {
 		if (filter == null)
@@ -37,7 +36,6 @@ public ServletBinder through(Filter filter) {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void with(HttpServlet servlet) {
 		if (servlet == null)
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
index 86441b1..39d57b5 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
@@ -70,7 +70,6 @@ void service(HttpServletRequest req, HttpServletResponse rsp)
 		super.service(new WrappedRequest(req, newPath, newInfo), rsp);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "Pipeline[ *" + suffix + " ]";
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/WrappedRequest.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/WrappedRequest.java
index e6bc934..4bac040 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/WrappedRequest.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/WrappedRequest.java
@@ -38,20 +38,17 @@ public WrappedRequest(final HttpServletRequest originalRequest,
 		this.pathInfo = pathInfo;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getPathTranslated() {
 		final String p = getPathInfo();
 		return p != null ? getSession().getServletContext().getRealPath(p) : null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getPathInfo() {
 		return pathInfo;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getServletPath() {
 		return path;
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultReceivePackFactory.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultReceivePackFactory.java
index 16b27e8..0bf10cb 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultReceivePackFactory.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultReceivePackFactory.java
@@ -47,7 +47,6 @@ private static class ServiceConfig {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReceivePack create(HttpServletRequest req, Repository db)
 			throws ServiceNotEnabledException, ServiceNotAuthorizedException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultUploadPackFactory.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultUploadPackFactory.java
index d362a96..2931435 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultUploadPackFactory.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/DefaultUploadPackFactory.java
@@ -38,7 +38,6 @@ private static class ServiceConfig {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public UploadPack create(HttpServletRequest req, Repository db)
 			throws ServiceNotEnabledException, ServiceNotAuthorizedException {
diff --git a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
index 5fbbac0..8592617 100644
--- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.http.test
 Bundle-SymbolicName: org.eclipse.jgit.http.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -26,26 +26,26 @@
  org.eclipse.jetty.util.log;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.security;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.thread;version="[10.0.0,11.0.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.http.server;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.http.server.glue;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.http.server.resolver;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http.apache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.resolver;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.http.server;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.http.server.glue;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.http.server.resolver;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http.apache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.hamcrest;version="[1.1.0,3.0.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml
index 985acd2..2076bf5 100644
--- a/org.eclipse.jgit.http.test/pom.xml
+++ b/org.eclipse.jgit.http.test/pom.xml
@@ -18,7 +18,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.http.test</artifactId>
diff --git a/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/RefsUnreadableInMemoryRepository.java b/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/RefsUnreadableInMemoryRepository.java
index 4167b03..86da87f 100644
--- a/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/RefsUnreadableInMemoryRepository.java
+++ b/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/RefsUnreadableInMemoryRepository.java
@@ -36,7 +36,6 @@ class RefsUnreadableInMemoryRepository extends InMemoryRepository {
 		failing = false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefDatabase getRefDatabase() {
 		return refs;
@@ -54,7 +53,6 @@ void startFailing() {
 
 	private class RefsUnreadableRefDatabase extends MemRefDatabase {
 
-		/** {@inheritDoc} */
 		@Override
 		public Ref exactRef(String name) throws IOException {
 			if (failing) {
@@ -63,7 +61,6 @@ public Ref exactRef(String name) throws IOException {
 			return super.exactRef(name);
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public Map<String, Ref> getRefs(String prefix) throws IOException {
 			if (failing) {
@@ -73,7 +70,6 @@ public Map<String, Ref> getRefs(String prefix) throws IOException {
 			return super.getRefs(prefix);
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public List<Ref> getRefsByPrefix(String prefix) throws IOException {
 			if (failing) {
@@ -83,7 +79,6 @@ public List<Ref> getRefsByPrefix(String prefix) throws IOException {
 			return super.getRefsByPrefix(prefix);
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public List<Ref> getRefsByPrefixWithExclusions(String include, Set<String> excludes)
 				throws IOException {
@@ -94,7 +89,6 @@ public List<Ref> getRefsByPrefixWithExclusions(String include, Set<String> exclu
 			return super.getRefsByPrefixWithExclusions(include, excludes);
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public Set<Ref> getTipsWithSha1(ObjectId id) throws IOException {
 			if (failing) {
diff --git a/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/TestRepositoryResolver.java b/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/TestRepositoryResolver.java
index 6478b94..82168d1 100644
--- a/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/TestRepositoryResolver.java
+++ b/org.eclipse.jgit.http.test/src/org/eclipse/jgit/http/test/TestRepositoryResolver.java
@@ -41,7 +41,6 @@ public TestRepositoryResolver(TestRepository<Repository> repo, String repoName)
 		this.repoName = repoName;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Repository open(HttpServletRequest req, String name)
 			throws RepositoryNotFoundException, ServiceNotEnabledException {
diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
index ffb35ae..682057b 100644
--- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit.http
 Bundle-SymbolicName: org.eclipse.jgit.junit.http
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -21,17 +21,17 @@
  org.eclipse.jetty.util.log;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.security;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.ssl;version="[10.0.0,11.0.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.http.server;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.resolver;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.http.server;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[6.7.0,6.8.0)",
  org.junit;version="[4.13,5.0.0)",
  org.slf4j.helpers;version="[1.7.0,2.0.0)"
-Export-Package: org.eclipse.jgit.junit.http;version="6.6.1";
+Export-Package: org.eclipse.jgit.junit.http;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.junit,
    javax.servlet.http,
diff --git a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
index 825f4ba..298534c 100644
--- a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.junit.http - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.http.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml
index 839669b..f4f4d76 100644
--- a/org.eclipse.jgit.junit.http/pom.xml
+++ b/org.eclipse.jgit.junit.http/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit.http</artifactId>
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AccessEvent.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AccessEvent.java
index 873d430..3d4f379 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AccessEvent.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AccessEvent.java
@@ -146,7 +146,6 @@ public String getResponseHeader(String name) {
 		return responseHeaders != null ? responseHeaders.get(name) : null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder b = new StringBuilder();
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AppServer.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AppServer.java
index 36f2f2b..de4535a 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AppServer.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AppServer.java
@@ -260,7 +260,9 @@ public ServletContextHandler addContext(String path) {
 	 * Configure basic authentication.
 	 *
 	 * @param ctx
+	 *            servlet context handler
 	 * @param methods
+	 *            the methods
 	 * @return servlet context handler
 	 */
 	public ServletContextHandler authBasic(ServletContextHandler ctx,
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/HttpTestCase.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/HttpTestCase.java
index 877b918..8a4d363 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/HttpTestCase.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/HttpTestCase.java
@@ -45,14 +45,12 @@ public abstract class HttpTestCase extends LocalDiskRepositoryTestCase {
 	/** In-memory application server; subclass must start. */
 	protected AppServer server;
 
-	/** {@inheritDoc} */
 	@Override
 	public void setUp() throws Exception {
 		super.setUp();
 		server = createServer();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void tearDown() throws Exception {
 		server.tearDown();
@@ -78,6 +76,7 @@ protected AppServer createServer() {
 	 *
 	 * @return the TestRepository
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected TestRepository<Repository> createTestRepository()
 			throws IOException {
@@ -90,8 +89,10 @@ protected TestRepository<Repository> createTestRepository()
 	 * Convert path to URIish
 	 *
 	 * @param path
+	 *            the path
 	 * @return the URIish
 	 * @throws URISyntaxException
+	 *             if URI is invalid
 	 */
 	protected URIish toURIish(String path) throws URISyntaxException {
 		URI u = server.getURI().resolve(path);
@@ -102,9 +103,12 @@ protected URIish toURIish(String path) throws URISyntaxException {
 	 * Convert a path relative to the app's context path to a URIish
 	 *
 	 * @param app
+	 *            app name
 	 * @param name
+	 *            context path name
 	 * @return the warnings (if any) from the last execution
 	 * @throws URISyntaxException
+	 *             if URI is invalid
 	 */
 	protected URIish toURIish(ServletContextHandler app, String name)
 			throws URISyntaxException {
@@ -128,7 +132,9 @@ protected List<AccessEvent> getRequests() {
 	 * Get requests.
 	 *
 	 * @param base
+	 *            base URI
 	 * @param path
+	 *            the request path relative to {@code base}
 	 *
 	 * @return list of events
 	 */
@@ -140,6 +146,7 @@ protected List<AccessEvent> getRequests(URIish base, String path) {
 	 * Get requests.
 	 *
 	 * @param path
+	 *            request path
 	 *
 	 * @return list of events
 	 */
@@ -151,8 +158,11 @@ protected List<AccessEvent> getRequests(String path) {
 	 * Run fsck
 	 *
 	 * @param db
+	 *            the repository
 	 * @param tips
+	 *            tips to start checking from
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	protected static void fsck(Repository db, RevObject... tips)
 			throws Exception {
@@ -166,6 +176,7 @@ protected static void fsck(Repository db, RevObject... tips)
 	 * Mirror refs
 	 *
 	 * @param refs
+	 *            the refs
 	 * @return set of RefSpecs
 	 */
 	protected static Set<RefSpec> mirror(String... refs) {
@@ -183,9 +194,12 @@ protected static Set<RefSpec> mirror(String... refs) {
 	 * Push a commit
 	 *
 	 * @param from
+	 *            repository from which to push
 	 * @param q
+	 *            commit to push
 	 * @return collection of RefUpdates
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected static Collection<RemoteRefUpdate> push(TestRepository from,
 			RevCommit q) throws IOException {
@@ -205,7 +219,9 @@ protected static Collection<RemoteRefUpdate> push(TestRepository from,
 	 * Create loose object path
 	 *
 	 * @param base
+	 *            base URI
 	 * @param id
+	 *            objectId
 	 * @return path of the loose object
 	 */
 	public static String loose(URIish base, AnyObjectId id) {
@@ -219,6 +235,7 @@ public static String loose(URIish base, AnyObjectId id) {
 	 * Join a base URIish and a path
 	 *
 	 * @param base
+	 *            base URI
 	 * @param path
 	 *            a relative path
 	 * @return the joined path
@@ -237,8 +254,11 @@ public static String join(URIish base, String path) {
 	 * Rewrite a url
 	 *
 	 * @param url
+	 *            the URL
 	 * @param newProtocol
+	 *            new protocol
 	 * @param newPort
+	 *            new port
 	 * @return the rewritten url
 	 */
 	protected static String rewriteUrl(String url, String newProtocol,
@@ -263,9 +283,12 @@ protected static String rewriteUrl(String url, String newProtocol,
 	 * Extend a path
 	 *
 	 * @param uri
+	 *            the URI
 	 * @param pathComponents
+	 *            path components
 	 * @return the extended URIish
 	 * @throws URISyntaxException
+	 *             if URI is invalid
 	 */
 	protected static URIish extendPath(URIish uri, String pathComponents)
 			throws URISyntaxException {
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/MockServletConfig.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/MockServletConfig.java
index 715fd19..cd1eba4 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/MockServletConfig.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/MockServletConfig.java
@@ -28,19 +28,19 @@ public class MockServletConfig implements ServletConfig {
 	 * Set init parameter.
 	 *
 	 * @param name
+	 *            parameter name
 	 * @param value
+	 *            parameter value
 	 */
 	public void setInitParameter(String name, String value) {
 		parameters.put(name, value);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getInitParameter(String name) {
 		return parameters.get(name);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Enumeration<String> getInitParameterNames() {
 		final Iterator<String> i = parameters.keySet().iterator();
@@ -58,13 +58,11 @@ public String nextElement() {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getServletName() {
 		return "MOCK_SERVLET";
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ServletContext getServletContext() {
 		return null;
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java
index af63084..f56e1fa 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java
@@ -70,6 +70,7 @@ public RecordingLogger() {
 	 * Constructor for <code>RecordingLogger</code>.
 	 *
 	 * @param name
+	 *            logger name
 	 */
 	public RecordingLogger(String name) {
 		this.name = name;
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/SimpleHttpServer.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/SimpleHttpServer.java
index 2493f99..01f18da 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/SimpleHttpServer.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/SimpleHttpServer.java
@@ -40,6 +40,7 @@ public class SimpleHttpServer {
 	 * Constructor for <code>SimpleHttpServer</code>.
 	 *
 	 * @param repository
+	 *            the repository
 	 */
 	public SimpleHttpServer(Repository repository) {
 		this(repository, false);
@@ -49,7 +50,9 @@ public SimpleHttpServer(Repository repository) {
 	 * Constructor for <code>SimpleHttpServer</code>.
 	 *
 	 * @param repository
+	 *            the repository
 	 * @param withSsl
+	 *            whether to encrypt the communication
 	 */
 	public SimpleHttpServer(Repository repository, boolean withSsl) {
 		this.db = repository;
@@ -60,6 +63,7 @@ public SimpleHttpServer(Repository repository, boolean withSsl) {
 	 * Start the server
 	 *
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public void start() throws Exception {
 		ServletContextHandler sBasic = server.authBasic(smart("/sbasic"));
@@ -76,6 +80,7 @@ public void start() throws Exception {
 	 * Stop the server.
 	 *
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public void stop() throws Exception {
 		server.tearDown();
diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/TestRequestLog.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/TestRequestLog.java
index 04cb242..afa8c35 100644
--- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/TestRequestLog.java
+++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/TestRequestLog.java
@@ -72,7 +72,6 @@ List<AccessEvent> getEvents() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void handle(String target, Request baseRequest,
 			HttpServletRequest request, HttpServletResponse response)
diff --git a/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF
index b5567a6..3cc5dbe 100644
--- a/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit.ssh
 Bundle-SymbolicName: org.eclipse.jgit.junit.ssh
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
@@ -33,16 +33,16 @@
  org.apache.sshd.server.subsystem;version="[2.10.0,2.11.0)",
  org.apache.sshd.sftp;version="[2.10.0,2.11.0)",
  org.apache.sshd.sftp.server;version="[2.10.0,2.11.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
-Export-Package: org.eclipse.jgit.junit.ssh;version="6.6.1"
+Export-Package: org.eclipse.jgit.junit.ssh;version="6.7.0"
diff --git a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
index 336fa5a..572ce01 100644
--- a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.junit.ssh - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.ssh.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit.ssh/pom.xml b/org.eclipse.jgit.junit.ssh/pom.xml
index 9b03d3d..801ad73 100644
--- a/org.eclipse.jgit.junit.ssh/pom.xml
+++ b/org.eclipse.jgit.junit.ssh/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit.ssh</artifactId>
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 5d043ff..1138be8 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
@@ -116,7 +116,9 @@ public class SshTestGitServer {
 	 * @param hostKey
 	 *            the unencrypted private key to use as host key
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws GeneralSecurityException
+	 *             if something went wrong
 	 */
 	public SshTestGitServer(@NonNull String testUser, @NonNull Path testKey,
 			@NonNull Repository repository, @NonNull byte[] hostKey)
@@ -138,7 +140,9 @@ public SshTestGitServer(@NonNull String testUser, @NonNull Path testKey,
 	 * @param hostKey
 	 *            the unencrypted private key to use as host key
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws GeneralSecurityException
+	 *             if something went wrong
 	 * @since 5.9
 	 */
 	public SshTestGitServer(@NonNull String testUser, @NonNull Path testKey,
@@ -413,6 +417,7 @@ public PropertyResolver getPropertyResolver() {
 	 * @return the port the server listens on; test clients should connect to
 	 *         that port
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public int start() throws IOException {
 		server.start();
@@ -423,6 +428,7 @@ public int start() throws IOException {
 	 * Stops the test server.
 	 *
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public void stop() throws IOException {
 		executorService.shutdownNow();
diff --git a/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestHarness.java b/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestHarness.java
index a28d5eb..b183b22 100644
--- a/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestHarness.java
+++ b/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestHarness.java
@@ -89,8 +89,6 @@ public abstract class SshTestHarness extends RepositoryTestCase {
 
 	protected File knownHosts;
 
-	private File homeDir;
-
 	@Override
 	public void setUp() throws Exception {
 		super.setUp();
@@ -99,13 +97,8 @@ public void setUp() throws Exception {
 			git.add().addFilepattern("file.txt").call();
 			git.commit().setMessage("Initial commit").call();
 		}
-		mockSystemReader.setProperty("user.home",
-				getTemporaryDirectory().getAbsolutePath());
-		mockSystemReader.setProperty("HOME",
-				getTemporaryDirectory().getAbsolutePath());
-		homeDir = FS.DETECTED.userHome();
-		FS.DETECTED.setUserHome(getTemporaryDirectory().getAbsoluteFile());
-		sshDir = new File(getTemporaryDirectory(), ".ssh");
+		// The home directory is mocked here
+		sshDir = new File(FS.DETECTED.userHome(), ".ssh");
 		assertTrue(sshDir.mkdir());
 		File serverDir = new File(getTemporaryDirectory(), "srv");
 		assertTrue(serverDir.mkdir());
@@ -191,6 +184,7 @@ private static void write(BufferedWriter out, byte[] bytes, int lineLength)
 	 *            to use
 	 * @return the public-key part of the line
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected static String createKnownHostsFile(File file, String host,
 			int port, File publicKey) throws IOException {
@@ -235,7 +229,6 @@ public void shutdownServer() throws Exception {
 			server.stop();
 			server = null;
 		}
-		FS.DETECTED.setUserHome(homeDir);
 		SshSessionFactory.setInstance(null);
 		factory = null;
 	}
diff --git a/org.eclipse.jgit.junit/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.junit/.settings/org.eclipse.jdt.core.prefs
index bdfba71..bb15648 100644
--- a/org.eclipse.jgit.junit/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.junit/.settings/org.eclipse.jdt.core.prefs
@@ -56,7 +56,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
index 8a22334..6280b25 100644
--- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
@@ -3,35 +3,35 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.junit
 Bundle-SymbolicName: org.eclipse.jgit.junit
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Import-Package: org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.dircache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.pack;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.merge;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="6.6.1",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.io;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.time;version="[6.6.1,6.7.0)",
+Import-Package: org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.dircache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.merge;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="6.7.0",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.io;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.time;version="[6.7.0,6.8.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
  org.junit.runners;version="[4.13,5.0.0)",
  org.junit.runners.model;version="[4.13,5.0.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
-Export-Package: org.eclipse.jgit.junit;version="6.6.1";
+Export-Package: org.eclipse.jgit.junit;version="6.7.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -44,4 +44,4 @@
    org.junit.runners.model,
    org.junit.runner,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.junit.time;version="6.6.1";uses:="org.eclipse.jgit.util.time"
+ org.eclipse.jgit.junit.time;version="6.7.0";uses:="org.eclipse.jgit.util.time"
diff --git a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
index 7ba902c..90b90ce 100644
--- a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.junit - Sources
 Bundle-SymbolicName: org.eclipse.jgit.junit.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.junit;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.junit;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml
index 3237f3a..044db84 100644
--- a/org.eclipse.jgit.junit/pom.xml
+++ b/org.eclipse.jgit.junit/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit</artifactId>
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java
index 61d3b86..177d873 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java
@@ -107,6 +107,7 @@ private static String s(byte[] raw) {
 	 * Get test resource file.
 	 *
 	 * @param fileName
+	 *            file name
 	 * @return the test resource file
 	 */
 	public static File getTestResourceFile(String fileName) {
@@ -141,8 +142,11 @@ public static File getTestResourceFile(String fileName) {
 	 * Copy test resource.
 	 *
 	 * @param name
+	 *            resource name
 	 * @param dest
+	 *            destination file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static void copyTestResource(String name, File dest)
 			throws IOException {
@@ -165,10 +169,14 @@ private static ClassLoader cl() {
 	 * Write a trash file.
 	 *
 	 * @param db
+	 *            the repository
 	 * @param name
+	 *            file name
 	 * @param data
+	 *            file content
 	 * @return the trash file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static File writeTrashFile(final Repository db,
 			final String name, final String data) throws IOException {
@@ -181,11 +189,16 @@ public static File writeTrashFile(final Repository db,
 	 * Write a trash file.
 	 *
 	 * @param db
+	 *            the repository
 	 * @param subdir
+	 *            under working tree
 	 * @param name
+	 *            file name
 	 * @param data
+	 *            file content
 	 * @return the trash file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static File writeTrashFile(final Repository db,
 			final String subdir,
@@ -237,9 +250,12 @@ public static String read(File file) throws IOException {
 	 * Read a file's content
 	 *
 	 * @param db
+	 *            the repository
 	 * @param name
+	 *            file name
 	 * @return the content of the file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static String read(Repository db, String name)
 			throws IOException {
@@ -251,6 +267,7 @@ public static String read(Repository db, String name)
 	 * Check if file exists
 	 *
 	 * @param db
+	 *            the repository
 	 * @param name
 	 *            name of the file
 	 * @return {@code true} if the file exists
@@ -264,8 +281,11 @@ public static boolean check(Repository db, String name) {
 	 * Delete a trash file.
 	 *
 	 * @param db
+	 *            the repository
 	 * @param name
+	 *            file name
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static void deleteTrashFile(final Repository db,
 			final String name) throws IOException {
@@ -284,6 +304,7 @@ public static void deleteTrashFile(final Repository db,
 	 *            the target of the symbolic link
 	 * @return the path to the symbolic link
 	 * @throws Exception
+	 *             if an error occurred
 	 * @since 4.2
 	 */
 	public static Path writeLink(Repository db, String link,
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
index 59662ce..f816158 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
@@ -85,6 +85,8 @@ public abstract class LocalDiskRepositoryTestCase {
 	private final Set<Repository> toClose = new HashSet<>();
 	private File tmp;
 
+	private File homeDir;
+
 	/**
 	 * The current test name.
 	 *
@@ -107,6 +109,7 @@ private String getTestName() {
 	 * Setup test
 	 *
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	@Before
 	public void setUp() throws Exception {
@@ -118,6 +121,14 @@ public void setUp() throws Exception {
 		mockSystemReader = new MockSystemReader();
 		SystemReader.setInstance(mockSystemReader);
 
+		// Mock the home directory. We don't want to pick up the real user's git
+		// config, or global git ignore.
+		// XDG_CONFIG_HOME isn't set in the MockSystemReader.
+		mockSystemReader.setProperty("user.home", tmp.getAbsolutePath());
+		mockSystemReader.setProperty("HOME", tmp.getAbsolutePath());
+		homeDir = FS.DETECTED.userHome();
+		FS.DETECTED.setUserHome(tmp.getAbsoluteFile());
+
 		// Measure timer resolution before the test to avoid time critical tests
 		// are affected by time needed for measurement.
 		// The MockSystemReader must be configured first since we need to use
@@ -189,25 +200,30 @@ private static String makePath(List<?> objects) {
 	 * Tear down the test
 	 *
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	@After
 	public void tearDown() throws Exception {
 		RepositoryCache.clear();
-		for (Repository r : toClose)
+		for (Repository r : toClose) {
 			r.close();
+		}
 		toClose.clear();
 
 		// Since memory mapping is controlled by the GC we need to
 		// tell it this is a good time to clean up and unlock
 		// memory mapped files.
 		//
-		if (useMMAP)
+		if (useMMAP) {
 			System.gc();
-		if (tmp != null)
+		}
+		FS.DETECTED.setUserHome(homeDir);
+		if (tmp != null) {
 			recursiveDelete(tmp, false, true);
-		if (tmp != null && !tmp.exists())
+		}
+		if (tmp != null && !tmp.exists()) {
 			CleanupThread.removed(tmp);
-
+		}
 		SystemReader.setInstance(null);
 	}
 
@@ -314,11 +330,11 @@ private static void reportDeleteFailure(boolean failOnError, File f,
 	 *            {@link #CONTENT} controlling which info is present in the
 	 *            resulting string.
 	 * @return a string encoding the index state
-	 * @throws IllegalStateException
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static String indexState(Repository repo, int includedOptions)
-			throws IllegalStateException, IOException {
+			throws IOException {
 		DirCache dc = repo.readDirCache();
 		StringBuilder sb = new StringBuilder();
 		TreeSet<Instant> timeStamps = new TreeSet<>();
@@ -452,6 +468,7 @@ public void addRepoToClose(Repository r) {
 	 *            a subdirectory
 	 * @return a unique directory for a test
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected File createTempDirectory(String name) throws IOException {
 		File directory = new File(createTempFile(), name);
@@ -467,6 +484,7 @@ protected File createTempDirectory(String name) throws IOException {
 	 *            working directory
 	 * @return a unique directory for a test repository
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected File createUniqueTestGitDir(boolean bare) throws IOException {
 		String gitdirName = createTempFile().getPath();
@@ -487,6 +505,7 @@ protected File createUniqueTestGitDir(boolean bare) throws IOException {
 	 *
 	 * @return a unique path that does not exist.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected File createTempFile() throws IOException {
 		File p = File.createTempFile("tmp_", "", tmp);
@@ -586,6 +605,7 @@ protected void write(File f, String body) throws IOException {
 	 *            the file
 	 * @return the content of the file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected String read(File f) throws IOException {
 		return JGitTestUtil.read(f);
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java
index 6bfe706..4dbfc59 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java
@@ -144,32 +144,30 @@ public void clearProperties() {
 	 * Set a property
 	 *
 	 * @param key
+	 *            the key
 	 * @param value
+	 *            the value
 	 */
 	public void setProperty(String key, String value) {
 		values.put(key, value);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getenv(String variable) {
 		return values.get(variable);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getProperty(String key) {
 		return values.get(key);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FileBasedConfig openUserConfig(Config parent, FS fs) {
 		assert parent == null || parent == systemGitConfig;
 		return userGitConfig;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FileBasedConfig openSystemConfig(Config parent, FS fs) {
 		assert parent == null;
@@ -193,19 +191,16 @@ public StoredConfig getSystemConfig()
 		return systemGitConfig;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getHostname() {
 		return "fake.host.example.com";
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getCurrentTime() {
 		return now;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public MonotonicClock getClock() {
 		return () -> {
@@ -236,31 +231,26 @@ public void tick(int secDelta) {
 		now += secDelta * 1000L;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getTimezone(long when) {
 		return getTimeZone().getOffset(when) / (60 * 1000);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TimeZone getTimeZone() {
 		return TimeZone.getTimeZone("GMT-03:30");
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Locale getLocale() {
 		return Locale.US;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public SimpleDateFormat getSimpleDateFormat(String pattern) {
 		return new SimpleDateFormat(pattern, getLocale());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public DateFormat getDateTimeInstance(int dateStyle, int timeStyle) {
 		return DateFormat
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Repeat.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Repeat.java
index 343aa92..4bf2eb5 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Repeat.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Repeat.java
@@ -21,6 +21,8 @@
 public @interface Repeat {
 	/**
 	 * Number of repetitions
+	 *
+	 * @return number of repetitions
 	 */
 	public abstract int n();
 
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepeatRule.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepeatRule.java
index adcc10c..30fffe9 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepeatRule.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepeatRule.java
@@ -125,7 +125,6 @@ public void evaluate() throws Throwable {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Statement apply(Statement statement, Description description) {
 		Statement result = statement;
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java
index 04988f6..3a283ce 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java
@@ -62,8 +62,11 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
 	 * Copy a file
 	 *
 	 * @param src
+	 *            file to copy
 	 * @param dst
+	 *            destination of the copy
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected static void copyFile(File src, File dst)
 			throws IOException {
@@ -81,9 +84,12 @@ protected static void copyFile(File src, File dst)
 	 * Write a trash file
 	 *
 	 * @param name
+	 *            file name
 	 * @param data
+	 *            file content
 	 * @return the trash file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected File writeTrashFile(String name, String data)
 			throws IOException {
@@ -99,6 +105,7 @@ protected File writeTrashFile(String name, String data)
 	 *            the target of the symbolic link
 	 * @return the path to the symbolic link
 	 * @throws Exception
+	 *             if an error occurred
 	 * @since 4.2
 	 */
 	protected Path writeLink(String link, String target)
@@ -110,10 +117,14 @@ protected Path writeLink(String link, String target)
 	 * Write a trash file
 	 *
 	 * @param subdir
+	 *            in working tree
 	 * @param name
+	 *            file name
 	 * @param data
+	 *            file content
 	 * @return the trash file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected File writeTrashFile(final String subdir, final String name,
 			final String data)
@@ -125,8 +136,10 @@ protected File writeTrashFile(final String subdir, final String name,
 	 * Read content of a file
 	 *
 	 * @param name
+	 *            file name
 	 * @return the file's content
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected String read(String name) throws IOException {
 		return JGitTestUtil.read(db, name);
@@ -149,6 +162,7 @@ protected boolean check(String name) {
 	 * @param name
 	 *            file name
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected void deleteTrashFile(String name) throws IOException {
 		JGitTestUtil.deleteTrashFile(db, name);
@@ -158,9 +172,11 @@ protected void deleteTrashFile(String name) throws IOException {
 	 * Check content of a file.
 	 *
 	 * @param f
+	 *            file
 	 * @param checkData
 	 *            expected content
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected static void checkFile(File f, String checkData)
 			throws IOException {
@@ -181,7 +197,6 @@ protected static void checkFile(File f, String checkData)
 	/** Working directory of {@link #db}. */
 	protected File trash;
 
-	/** {@inheritDoc} */
 	@Override
 	@Before
 	public void setUp() throws Exception {
@@ -229,11 +244,11 @@ public void tearDown() throws Exception {
 	 *            {@link #CONTENT} controlling which info is present in the
 	 *            resulting string.
 	 * @return a string encoding the index state
-	 * @throws IllegalStateException
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public String indexState(int includedOptions)
-			throws IllegalStateException, IOException {
+			throws IOException {
 		return indexState(db, includedOptions);
 	}
 
@@ -251,7 +266,9 @@ public String indexState(int includedOptions)
 	 *            a {@link org.eclipse.jgit.treewalk.FileTreeIterator} which
 	 *            determines which files should go into the new index
 	 * @throws FileNotFoundException
+	 *             file was not found
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected void resetIndex(FileTreeIterator treeItr)
 			throws FileNotFoundException, IOException {
@@ -339,7 +356,9 @@ public static String slashify(String str) {
 	 * @return return the last measured value of the filesystem timer which is
 	 *         greater than then the lastmodification time of lastfile.
 	 * @throws InterruptedException
+	 *             if thread was interrupted
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 5.1.9
 	 */
 	public static Instant fsTick(File lastFile)
@@ -378,8 +397,11 @@ public static Instant fsTick(File lastFile)
 	 * Create a branch
 	 *
 	 * @param objectId
+	 *            new value to create the branch on
 	 * @param branchName
+	 *            branch name
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected void createBranch(ObjectId objectId, String branchName)
 			throws IOException {
@@ -393,6 +415,7 @@ protected void createBranch(ObjectId objectId, String branchName)
 	 *
 	 * @return list of refs
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public List<Ref> getRefs() throws IOException {
 		return db.getRefDatabase().getRefs();
@@ -402,11 +425,12 @@ public List<Ref> getRefs() throws IOException {
 	 * Checkout a branch
 	 *
 	 * @param branchName
-	 * @throws IllegalStateException
+	 *            branch name
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected void checkoutBranch(String branchName)
-			throws IllegalStateException, IOException {
+			throws IOException {
 		try (RevWalk walk = new RevWalk(db)) {
 			RevCommit head = walk.parseCommit(db.resolve(Constants.HEAD));
 			RevCommit branch = walk.parseCommit(db.resolve(branchName));
@@ -436,7 +460,9 @@ protected void checkoutBranch(String branchName)
 	 *            the contents which should be written into the files
 	 * @return the File object associated to the last written file.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws InterruptedException
+	 *             if thread was interrupted
 	 */
 	protected File writeTrashFiles(boolean ensureDistinctTimestamps,
 			String... contents)
@@ -459,8 +485,11 @@ protected File writeTrashFiles(boolean ensureDistinctTimestamps,
 	 * one.
 	 *
 	 * @param filename
+	 *            file name
 	 * @param contents
+	 *            file content
 	 * @param branch
+	 *            branch name
 	 * @return the created commit
 	 */
 	protected RevCommit commitFile(String filename, String contents, String branch) {
@@ -494,7 +523,9 @@ else if (empty)
 	 * Create <code>DirCacheEntry</code>
 	 *
 	 * @param path
+	 *            file path
 	 * @param mode
+	 *            file mode
 	 * @return the DirCacheEntry
 	 */
 	protected DirCacheEntry createEntry(String path, FileMode mode) {
@@ -505,8 +536,11 @@ protected DirCacheEntry createEntry(String path, FileMode mode) {
 	 * Create <code>DirCacheEntry</code>
 	 *
 	 * @param path
+	 *            file path
 	 * @param mode
+	 *            file mode
 	 * @param content
+	 *            file content
 	 * @return the DirCacheEntry
 	 */
 	protected DirCacheEntry createEntry(final String path, final FileMode mode,
@@ -518,9 +552,13 @@ protected DirCacheEntry createEntry(final String path, final FileMode mode,
 	 * Create <code>DirCacheEntry</code>
 	 *
 	 * @param path
+	 *            file path
 	 * @param mode
+	 *            file mode
 	 * @param stage
+	 *            stage index of the new entry
 	 * @param content
+	 *            file content
 	 * @return the DirCacheEntry
 	 */
 	protected DirCacheEntry createEntry(final String path, final FileMode mode,
@@ -538,7 +576,9 @@ protected DirCacheEntry createEntry(final String path, final FileMode mode,
 	 * Create <code>DirCacheEntry</code>
 	 *
 	 * @param path
+	 *            file path
 	 * @param objectId
+	 *            of the entry
 	 * @return the DirCacheEntry
 	 */
 	protected DirCacheEntry createGitLink(String path, AnyObjectId objectId) {
@@ -553,8 +593,11 @@ protected DirCacheEntry createGitLink(String path, AnyObjectId objectId) {
 	 * Assert files are equal
 	 *
 	 * @param expected
+	 *            expected file
 	 * @param actual
+	 *            actual file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static void assertEqualsFile(File expected, File actual)
 			throws IOException {
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/StrictWorkMonitor.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/StrictWorkMonitor.java
index c77bca9..0168ece 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/StrictWorkMonitor.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/StrictWorkMonitor.java
@@ -20,32 +20,27 @@
 public final class StrictWorkMonitor implements ProgressMonitor {
 	private int lastWork, totalWork;
 
-	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		// empty
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int total) {
 		this.totalWork = total;
 		lastWork = 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void update(int completed) {
 		lastWork += completed;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endTask() {
 		assertEquals("Units of work recorded", totalWork, lastWork);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		return false;
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
index 483b9a7..4b45535 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java
@@ -115,6 +115,7 @@ public class TestRepository<R extends Repository> implements AutoCloseable {
 	 * @param db
 	 *            the test repository to write into.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public TestRepository(R db) throws IOException {
 		this(db, new RevWalk(db), new MockSystemReader());
@@ -128,6 +129,7 @@ public TestRepository(R db) throws IOException {
 	 * @param rw
 	 *            the RevObject pool to use for object lookup.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public TestRepository(R db, RevWalk rw) throws IOException {
 		this(db, rw, new MockSystemReader());
@@ -144,6 +146,7 @@ public TestRepository(R db, RevWalk rw) throws IOException {
 	 *            the MockSystemReader to use for clock and other system
 	 *            operations.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	public TestRepository(R db, RevWalk rw, MockSystemReader reader)
@@ -235,6 +238,7 @@ public void setAuthorAndCommitter(org.eclipse.jgit.lib.CommitBuilder c) {
 	 *            file content, will be UTF-8 encoded.
 	 * @return reference to the blob.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevBlob blob(String content) throws Exception {
 		return blob(content.getBytes(UTF_8));
@@ -247,6 +251,7 @@ public RevBlob blob(String content) throws Exception {
 	 *            binary file content.
 	 * @return the new, fully parsed blob.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevBlob blob(byte[] content) throws Exception {
 		ObjectId id;
@@ -266,6 +271,7 @@ public RevBlob blob(byte[] content) throws Exception {
 	 *            a blob, previously constructed in the repository.
 	 * @return the entry.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public DirCacheEntry file(String path, RevBlob blob)
 			throws Exception {
@@ -284,6 +290,7 @@ public DirCacheEntry file(String path, RevBlob blob)
 	 *            a blob, previously constructed in the repository.
 	 * @return the entry.
 	 * @throws Exception
+	 *             if an error occurred
 	 * @since 6.3
 	 */
 	public DirCacheEntry link(String path, RevBlob blob) throws Exception {
@@ -301,6 +308,7 @@ public DirCacheEntry link(String path, RevBlob blob) throws Exception {
 	 *            to be sorted properly and may be empty.
 	 * @return the new, fully parsed tree specified by the entry list.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevTree tree(DirCacheEntry... entries) throws Exception {
 		final DirCache dc = DirCache.newInCore();
@@ -326,6 +334,7 @@ public RevTree tree(DirCacheEntry... entries) throws Exception {
 	 *            the path to find the entry of.
 	 * @return the parsed object entry at this path, never null.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevObject get(RevTree tree, String path)
 			throws Exception {
@@ -357,6 +366,7 @@ public RevObject get(RevTree tree, String path)
 	 *            zero or more IDs of the commit's parents.
 	 * @return the ID of the new commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 * @since 5.5
 	 */
 	public ObjectId unparsedCommit(ObjectId... parents) throws Exception {
@@ -373,6 +383,7 @@ public ObjectId unparsedCommit(ObjectId... parents) throws Exception {
 	 *            zero or more parents of the commit.
 	 * @return the new commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevCommit commit(RevCommit... parents) throws Exception {
 		return commit(1, tree(), parents);
@@ -389,6 +400,7 @@ public RevCommit commit(RevCommit... parents) throws Exception {
 	 *            zero or more parents of the commit.
 	 * @return the new commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevCommit commit(RevTree tree, RevCommit... parents)
 			throws Exception {
@@ -407,6 +419,7 @@ public RevCommit commit(RevTree tree, RevCommit... parents)
 	 *            zero or more parents of the commit.
 	 * @return the new commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevCommit commit(int secDelta, RevCommit... parents)
 			throws Exception {
@@ -428,6 +441,7 @@ public RevCommit commit(int secDelta, RevCommit... parents)
 	 *            zero or more parents of the commit.
 	 * @return the new, fully parsed commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevCommit commit(final int secDelta, final RevTree tree,
 			final RevCommit... parents) throws Exception {
@@ -450,6 +464,7 @@ public RevCommit commit(final int secDelta, final RevTree tree,
 	 *            zero or more IDs of the commit's parents.
 	 * @return the ID of the new commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 * @since 5.5
 	 */
 	public ObjectId unparsedCommit(final int secDelta, final RevTree tree,
@@ -496,6 +511,7 @@ public CommitBuilder commit() {
 	 *            object the tag should be pointed at.
 	 * @return the new, fully parsed annotated tag object.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevTag tag(String name, RevObject dst) throws Exception {
 		final TagBuilder t = new TagBuilder();
@@ -524,6 +540,7 @@ public RevTag tag(String name, RevObject dst) throws Exception {
 	 *            the target object.
 	 * @return the target object.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevCommit update(String ref, CommitBuilder to) throws Exception {
 		return update(ref, to.create());
@@ -534,12 +551,13 @@ public RevCommit update(String ref, CommitBuilder to) throws Exception {
 	 *
 	 * @param ref
 	 *            the name of the reference to amend, which must already exist.
-	 *            If {@code ref} does not start with {@code refs/} and is not the
-	 *            magic names {@code HEAD} {@code FETCH_HEAD} or {@code
-	 *            MERGE_HEAD}, then {@code refs/heads/} will be prefixed in front
-	 *            of the given name, thereby assuming it is a branch.
+	 *            If {@code ref} does not start with {@code refs/} and is not
+	 *            the magic names {@code HEAD} {@code FETCH_HEAD} or {@code
+	 *            MERGE_HEAD}, then {@code refs/heads/} will be prefixed in
+	 *            front of the given name, thereby assuming it is a branch.
 	 * @return commit builder that amends the branch on commit.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public CommitBuilder amendRef(String ref) throws Exception {
 		String name = normalizeRef(ref);
@@ -556,6 +574,7 @@ public CommitBuilder amendRef(String ref) throws Exception {
 	 *            the id of the commit to amend.
 	 * @return commit builder.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public CommitBuilder amend(AnyObjectId id) throws Exception {
 		return amend(pool.parseCommit(id), commit());
@@ -610,6 +629,7 @@ public void apply(DirCacheEntry ent) {
 	 *            the target object.
 	 * @return the target object.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public <T extends AnyObjectId> T update(String ref, T obj) throws Exception {
 		ref = normalizeRef(ref);
@@ -632,9 +652,10 @@ public <T extends AnyObjectId> T update(String ref, T obj) throws Exception {
 	 * Delete a reference.
 	 *
 	 * @param ref
-	 *	      the name of the reference to delete. This is normalized
-	 *	      in the same way as {@link #update(String, AnyObjectId)}.
+	 *            the name of the reference to delete. This is normalized in the
+	 *            same way as {@link #update(String, AnyObjectId)}.
 	 * @throws Exception
+	 *             if an error occurred
 	 * @since 4.4
 	 */
 	public void delete(String ref) throws Exception {
@@ -674,6 +695,7 @@ private static String normalizeRef(String ref) {
 	 * @param id
 	 *            ID of detached head.
 	 * @throws Exception
+	 *             if an error occurred
 	 * @see #reset(String)
 	 */
 	public void reset(AnyObjectId id) throws Exception {
@@ -695,13 +717,14 @@ public void reset(AnyObjectId id) throws Exception {
 	/**
 	 * Soft-reset HEAD to a different commit.
 	 * <p>
-	 * This is equivalent to {@code git reset --soft} in that it modifies HEAD but
-	 * not the index or the working tree of a non-bare repository.
+	 * This is equivalent to {@code git reset --soft} in that it modifies HEAD
+	 * but not the index or the working tree of a non-bare repository.
 	 *
 	 * @param name
-	 *            revision string; either an existing ref name, or something that
-	 *            can be parsed to an object ID.
+	 *            revision string; either an existing ref name, or something
+	 *            that can be parsed to an object ID.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public void reset(String name) throws Exception {
 		RefUpdate.Result result;
@@ -735,6 +758,7 @@ public void reset(String name) throws Exception {
 	 * @return the new, fully parsed commit, or null if no work was done due to
 	 *         the resulting tree being identical.
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public RevCommit cherryPick(AnyObjectId id) throws Exception {
 		RevCommit commit = pool.parseCommit(id);
@@ -779,6 +803,7 @@ public RevCommit cherryPick(AnyObjectId id) throws Exception {
 	 * Update the dumb client server info files.
 	 *
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public void updateServerInfo() throws Exception {
 		if (db instanceof FileRepository) {
@@ -816,6 +841,7 @@ protected void writeFile(String name, byte[] bin)
 	 *            parsing of.
 	 * @return {@code object}
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public <T extends RevObject> T parseBody(T object) throws Exception {
 		pool.parseBody(object);
@@ -851,6 +877,7 @@ public BranchBuilder branch(String ref) {
 	 *            the object to tag
 	 * @return the tagged object
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public ObjectId lightweightTag(String name, ObjectId obj) throws Exception {
 		if (!name.startsWith(Constants.R_TAGS))
@@ -868,8 +895,11 @@ public ObjectId lightweightTag(String name, ObjectId obj) throws Exception {
 	 *            the tips to start checking from; if not supplied the refs of
 	 *            the repository are used instead.
 	 * @throws MissingObjectException
+	 *             if object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if object has unexpected type
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public void fsck(RevObject... tips) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -922,6 +952,7 @@ private static void assertHash(RevObject id, byte[] bin) {
 	 * not removed.
 	 *
 	 * @throws Exception
+	 *             if an error occurred
 	 */
 	public void packAndPrune() throws Exception {
 		if (db.getObjectDatabase() instanceof ObjectDirectory) {
@@ -1022,6 +1053,7 @@ public CommitBuilder commit() throws Exception {
 		 *            the commit to update to.
 		 * @return {@code to}.
 		 * @throws Exception
+		 *             if an error occurred
 		 */
 		public RevCommit update(CommitBuilder to) throws Exception {
 			return update(to.create());
@@ -1034,6 +1066,7 @@ public RevCommit update(CommitBuilder to) throws Exception {
 		 *            the commit to update to.
 		 * @return {@code to}.
 		 * @throws Exception
+		 *             if an error occurred
 		 */
 		public RevCommit update(RevCommit to) throws Exception {
 			return TestRepository.this.update(ref, to);
@@ -1041,7 +1074,9 @@ public RevCommit update(RevCommit to) throws Exception {
 
 		/**
 		 * Delete this branch.
+		 *
 		 * @throws Exception
+		 *             if an error occurred
 		 * @since 4.4
 		 */
 		public void delete() throws Exception {
@@ -1102,6 +1137,7 @@ public class CommitBuilder {
 		 *            parent commit
 		 * @return this commit builder
 		 * @throws Exception
+		 *             if an error occurred
 		 */
 		public CommitBuilder parent(RevCommit p) throws Exception {
 			if (parents.isEmpty()) {
@@ -1165,6 +1201,7 @@ public CommitBuilder setTopLevelTree(ObjectId treeId) {
 		 *            the file content
 		 * @return this commit builder
 		 * @throws Exception
+		 *             if an error occurred
 		 */
 		public CommitBuilder add(String path, String content) throws Exception {
 			return add(path, blob(content));
@@ -1179,6 +1216,7 @@ public CommitBuilder add(String path, String content) throws Exception {
 		 *            blob for this file
 		 * @return this commit builder
 		 * @throws Exception
+		 *             if an error occurred
 		 */
 		public CommitBuilder add(String path, RevBlob id)
 				throws Exception {
@@ -1404,6 +1442,7 @@ private void insertChangeId(org.eclipse.jgit.lib.CommitBuilder c) {
 		 *
 		 * @return child commit builder
 		 * @throws Exception
+		 *             if an error occurred
 		 */
 		public CommitBuilder child() throws Exception {
 			return new CommitBuilder(this);
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/time/MonotonicFakeClock.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/time/MonotonicFakeClock.java
index e5338d3..31db6a2 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/time/MonotonicFakeClock.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/time/MonotonicFakeClock.java
@@ -40,7 +40,6 @@ public void tick(long add, TimeUnit unit) {
 		now += unit.toMillis(add);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ProposedTimestamp propose() {
 		long t = now++;
diff --git a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
index 8e9f3b8..112a291 100644
--- a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.server.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -26,24 +26,24 @@
  org.eclipse.jetty.util.log;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.security;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.thread;version="[10.0.0,11.0.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.server;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.server.fs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.test;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.server;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.test;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.lfs.server.test/pom.xml b/org.eclipse.jgit.lfs.server.test/pom.xml
index 51b3bce..46aa809 100644
--- a/org.eclipse.jgit.lfs.server.test/pom.xml
+++ b/org.eclipse.jgit.lfs.server.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
diff --git a/org.eclipse.jgit.lfs.server/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.lfs.server/.settings/org.eclipse.jdt.core.prefs
index 0857bc1..3a92f0c 100644
--- a/org.eclipse.jgit.lfs.server/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.lfs.server/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
index dc64511..d444aa1 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
@@ -3,19 +3,19 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.server
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.lfs.server;version="6.6.1";
+Export-Package: org.eclipse.jgit.lfs.server;version="6.7.0";
   uses:="javax.servlet.http,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.fs;version="6.6.1";
+ org.eclipse.jgit.lfs.server.fs;version="6.7.0";
   uses:="javax.servlet,
    javax.servlet.http,
    org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.internal;version="6.6.1";x-internal:=true,
- org.eclipse.jgit.lfs.server.s3;version="6.6.1";
+ org.eclipse.jgit.lfs.server.internal;version="6.7.0";x-internal:=true,
+ org.eclipse.jgit.lfs.server.s3;version="6.7.0";
   uses:="org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib"
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -24,15 +24,15 @@
  javax.servlet.annotation;version="[3.1.0,5.0.0)",
  javax.servlet.http;version="[3.1.0,5.0.0)",
  org.apache.http;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http.apache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http.apache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
diff --git a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
index 3293f10..381e4b3 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.lfs.server - Sources
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.lfs.server/pom.xml b/org.eclipse.jgit.lfs.server/pom.xml
index 3937ffd..162b203 100644
--- a/org.eclipse.jgit.lfs.server/pom.xml
+++ b/org.eclipse.jgit.lfs.server/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.server</artifactId>
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LargeFileRepository.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LargeFileRepository.java
index 5e37664..4c81baf 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LargeFileRepository.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LargeFileRepository.java
@@ -60,6 +60,7 @@ public interface LargeFileRepository {
 	 * @return length of the object content in bytes, -1 if the object doesn't
 	 *         exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	long getSize(AnyLongObjectId id) throws IOException;
 }
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java
index 3ec08ec..6747b01 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java
@@ -164,7 +164,6 @@ public boolean isVerify() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void doPost(HttpServletRequest req, HttpServletResponse res)
 			throws ServletException, IOException {
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsRepository.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsRepository.java
index 31d5b2f..ff648aa 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsRepository.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsRepository.java
@@ -38,13 +38,16 @@ public class FileLfsRepository implements LargeFileRepository {
 	private final Path dir;
 
 	/**
-	 * <p>Constructor for FileLfsRepository.</p>
+	 * <p>
+	 * Constructor for FileLfsRepository.
+	 * </p>
 	 *
 	 * @param url
 	 *            external URL of this repository
 	 * @param dir
 	 *            storage directory
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public FileLfsRepository(String url, Path dir) throws IOException {
 		this.url = url;
@@ -52,26 +55,22 @@ public FileLfsRepository(String url, Path dir) throws IOException {
 		Files.createDirectories(dir);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Response.Action getDownloadAction(AnyLongObjectId id) {
 		return getAction(id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Action getUploadAction(AnyLongObjectId id, long size) {
 		return getAction(id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public Action getVerifyAction(AnyLongObjectId id) {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getSize(AnyLongObjectId id) throws IOException {
 		Path p = getPath(id);
@@ -148,6 +147,8 @@ private static void formatHexChar(char[] dst, int p, int b) {
 	}
 
 	/**
+	 * Get URL of content server
+	 *
 	 * @return the url of the content server
 	 * @since 4.11
 	 */
@@ -156,6 +157,8 @@ public String getUrl() {
 	}
 
 	/**
+	 * Set the URL of the content server
+	 *
 	 * @param url
 	 *            the url of the content server
 	 * @since 4.11
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java
index d427011..2ea92da 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java
@@ -50,7 +50,9 @@ public class ObjectDownloadListener implements WriteListener {
 	private ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
 
 	/**
-	 * <p>Constructor for ObjectDownloadListener.</p>
+	 * <p>
+	 * Constructor for ObjectDownloadListener.
+	 * </p>
 	 *
 	 * @param repository
 	 *            the repository storing large objects
@@ -61,6 +63,7 @@ public class ObjectDownloadListener implements WriteListener {
 	 * @param id
 	 *            id of the object to be downloaded
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public ObjectDownloadListener(FileLfsRepository repository,
 			AsyncContext context, HttpServletResponse response,
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java
index f5212fe..1ac2b20 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java
@@ -92,7 +92,9 @@ public interface Callback {
 	 * @param id
 	 *            a {@link org.eclipse.jgit.lfs.lib.AnyLongObjectId} object.
 	 * @throws java.io.FileNotFoundException
+	 *             if file wasn't found
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public ObjectUploadListener(FileLfsRepository repository,
 			AsyncContext context, HttpServletRequest request,
@@ -146,7 +148,6 @@ public void onDataAvailable() throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onAllDataRead() throws IOException {
 		close();
@@ -156,6 +157,7 @@ public void onAllDataRead() throws IOException {
 	 * Close resources held by this listener
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected void close() throws IOException {
 		try {
@@ -174,7 +176,6 @@ protected void close() throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onError(Throwable e) {
 		try {
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Repository.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Repository.java
index c7c7a71..5ebce5d 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Repository.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Repository.java
@@ -58,7 +58,6 @@ public S3Repository(S3Config config) {
 		this.s3Config = config;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Response.Action getDownloadAction(AnyLongObjectId oid) {
 		URL endpointUrl = getObjectUrl(oid);
@@ -75,7 +74,6 @@ public Response.Action getDownloadAction(AnyLongObjectId oid) {
 		return a;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Response.Action getUploadAction(AnyLongObjectId oid, long size) {
 		cacheObjectMetaData(oid, size);
@@ -95,13 +93,11 @@ public Response.Action getUploadAction(AnyLongObjectId oid, long size) {
 		return a;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Action getVerifyAction(AnyLongObjectId id) {
 		return null; // TODO(ms) implement this
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getSize(AnyLongObjectId oid) throws IOException {
 		URL endpointUrl = getObjectUrl(oid);
@@ -130,7 +126,7 @@ public long getSize(AnyLongObjectId oid) throws IOException {
 			String contentLengthHeader = conn
 					.getHeaderField(HDR_CONTENT_LENGTH);
 			if (contentLengthHeader != null) {
-				return Integer.parseInt(contentLengthHeader);
+				return Long.parseLong(contentLengthHeader);
 			}
 		}
 		return -1;
diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
index 27b919a..1366bcf 100644
--- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
@@ -3,27 +3,27 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Import-Package: org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.attributes;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+Import-Package: org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.attributes;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.hamcrest.core;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
  org.junit.runners;version="[4.13,5.0.0)"
-Export-Package: org.eclipse.jgit.lfs.test;version="6.6.1";x-friends:="org.eclipse.jgit.lfs.server.test"
+Export-Package: org.eclipse.jgit.lfs.test;version="6.7.0";x-friends:="org.eclipse.jgit.lfs.server.test"
diff --git a/org.eclipse.jgit.lfs.test/pom.xml b/org.eclipse.jgit.lfs.test/pom.xml
index 73e12c2..6cb0dbe 100644
--- a/org.eclipse.jgit.lfs.test/pom.xml
+++ b/org.eclipse.jgit.lfs.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.test</artifactId>
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs
index 0857bc1..3a92f0c 100644
--- a/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
index 855235e..cd570f5 100644
--- a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
@@ -3,32 +3,32 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.lfs
 Bundle-SymbolicName: org.eclipse.jgit.lfs
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
-Export-Package: org.eclipse.jgit.lfs;version="6.6.1",
- org.eclipse.jgit.lfs.errors;version="6.6.1",
- org.eclipse.jgit.lfs.internal;version="6.6.1";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server",
- org.eclipse.jgit.lfs.lib;version="6.6.1"
+Export-Package: org.eclipse.jgit.lfs;version="6.7.0",
+ org.eclipse.jgit.lfs.errors;version="6.7.0",
+ org.eclipse.jgit.lfs.internal;version="6.7.0";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server",
+ org.eclipse.jgit.lfs.lib;version="6.7.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: com.google.gson;version="[2.8.2,3.0.0)",
  com.google.gson.stream;version="[2.8.2,3.0.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)";resolution:=optional,
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.attributes;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.diff;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.dircache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.hooks;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.pack;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.io;version="[6.6.1,6.7.0)"
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)";resolution:=optional,
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.attributes;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.diff;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.dircache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.hooks;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.pack;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.io;version="[6.7.0,6.8.0)"
diff --git a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
index 54ca76a..e1ea51e 100644
--- a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.lfs - Sources
 Bundle-SymbolicName: org.eclipse.jgit.lfs.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.lfs/pom.xml b/org.eclipse.jgit.lfs/pom.xml
index 880f024..9932c64 100644
--- a/org.eclipse.jgit.lfs/pom.xml
+++ b/org.eclipse.jgit.lfs/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs</artifactId>
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java
index f0526ff..13b74df 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java
@@ -95,7 +95,6 @@ public CleanFilter(Repository db, InputStream in, OutputStream out)
 		this.aOut = new AtomicObjectOutputStream(tmpFile.toAbsolutePath());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int run() throws IOException {
 		try {
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java
index 0a8a3fa..afe9636 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPointer.java
@@ -136,6 +136,7 @@ public void encode(OutputStream out) {
 	 * @return an {@link org.eclipse.jgit.lfs.LfsPointer} or {@code null} if the
 	 *         stream was not parseable as LfsPointer
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	public static LfsPointer parseLfsPointer(InputStream in)
@@ -264,7 +265,6 @@ private static boolean checkVersionLine(String s) {
 		return VERSION.equals(rest) || VERSION_LEGACY.equals(rest);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "LfsPointer: oid=" + oid.name() + ", size=" //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java
index c26a1bf..b6515b9 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java
@@ -127,6 +127,7 @@ private SmudgeFilter(InputStream in, OutputStream out, Repository db)
 	 *            the objects to download
 	 * @return the paths of all mediafiles which have been downloaded
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 4.11
 	 */
 	public static Collection<Path> downloadLfsResource(Lfs lfs, Repository db,
@@ -217,7 +218,6 @@ public static Collection<Path> downloadLfsResource(Lfs lfs, Repository db,
 		return downloadedPaths;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int run() throws IOException {
 		try {
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/AtomicObjectOutputStream.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/AtomicObjectOutputStream.java
index 3f1f0ac..0092502 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/AtomicObjectOutputStream.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/AtomicObjectOutputStream.java
@@ -45,6 +45,7 @@ public class AtomicObjectOutputStream extends OutputStream {
 	 * @param id
 	 *            a {@link org.eclipse.jgit.lfs.lib.AnyLongObjectId} object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public AtomicObjectOutputStream(Path path, AnyLongObjectId id)
 			throws IOException {
@@ -61,6 +62,7 @@ public AtomicObjectOutputStream(Path path, AnyLongObjectId id)
 	 * @param path
 	 *            a {@link java.nio.file.Path} object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public AtomicObjectOutputStream(Path path) throws IOException {
 		this(path, null);
@@ -78,25 +80,21 @@ public AnyLongObjectId getId() {
 		return id;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		out.write(b);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b) throws IOException {
 		out.write(b);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, int off, int len) throws IOException {
 		out.write(b, off, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		out.close();
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConfig.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConfig.java
index 857ccbe..0469337 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConfig.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConfig.java
@@ -70,6 +70,7 @@ public LfsConfig(Repository db) {
 	 *
 	 * @return the delegate {@link Config}
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private Config getDelegate() throws IOException {
 		if (delegate == null) {
@@ -86,6 +87,7 @@ private Config getDelegate() throws IOException {
 	 * @return The loaded lfs config
 	 *
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private Config load() throws IOException {
 		Config result = null;
@@ -114,6 +116,7 @@ private Config load() throws IOException {
 	 *
 	 * @return the config, or <code>null</code>
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	private Config loadFromWorkingTree()
@@ -139,6 +142,7 @@ private Config loadFromWorkingTree()
 	 *
 	 * @return the config, or <code>null</code> if the entry does not exist
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	private Config loadFromIndex()
@@ -162,6 +166,7 @@ private Config loadFromIndex()
 	 *
 	 * @return the config, or <code>null</code> if the file does not exist
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	private Config loadFromHead() throws IOException {
@@ -207,6 +212,7 @@ private Config emptyConfig() {
 	 *            the key name
 	 * @return a String value from the config, <code>null</code> if not found
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	public String getString(final String section, final String subsection,
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 12b688d..f9c623d 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
@@ -67,6 +67,7 @@ public class LfsConnectionFactory {
 	 * @return the connection for the lfs server. e.g.
 	 *         "https://github.com/github/git-lfs.git/info/lfs"
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static HttpConnection getLfsConnection(Repository db, String method,
 			String purpose) throws IOException {
@@ -287,6 +288,7 @@ private static final class AuthCache {
 		 * no timeout can be determined, the token will be used only once.
 		 *
 		 * @param action
+		 *            action with an additional expiration timestamp
 		 */
 		public AuthCache(Protocol.ExpiringAction action) {
 			this.cachedAction = action;
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
index 9016e53..7ae805c 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
@@ -314,13 +314,11 @@ private long mask(long word, long v) {
 		return mask(nibbles, word, v);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return (int) (w1 >> 32);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof AbbreviatedLongObjectId) {
@@ -355,7 +353,6 @@ public final String name() {
 		return new String(b, 0, nibbles);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java
index d866db4..75d500e 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java
@@ -249,7 +249,6 @@ public boolean startsWith(AbbreviatedLongObjectId abbr) {
 		return abbr.prefixCompare(this) == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int hashCode() {
 		return (int) (w1 >> 32);
@@ -267,7 +266,6 @@ public final boolean equals(AnyLongObjectId other) {
 		return other != null ? equals(this, other) : false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean equals(Object o) {
 		if (o instanceof AnyLongObjectId) {
@@ -475,7 +473,6 @@ static void formatHexChar(char[] dst, int p, long w) {
 			dst[o--] = '0';
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LfsPointerFilter.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LfsPointerFilter.java
index 99bae49..75798ca 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LfsPointerFilter.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LfsPointerFilter.java
@@ -41,7 +41,6 @@ public LfsPointer getPointer() {
 		return pointer;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walk) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -63,13 +62,11 @@ public boolean include(TreeWalk walk) throws MissingObjectException,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return new LfsPointerFilter();
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
index 15b3ca4..3959115 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
@@ -256,7 +256,6 @@ protected LongObjectId(AnyLongObjectId src) {
 		w4 = src.w4;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LongObjectId toObjectId() {
 		return this;
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
index 012e4ae..5397d81 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
@@ -221,7 +221,6 @@ private void fromHexString(byte[] bs, int p) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LongObjectId toObjectId() {
 		return new LongObjectId(this);
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml
index e313665..f58404c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
index 4377855..8167820 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml
index 89eacfd..ba3cb9f 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.gpg.bc"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import plugin="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml
index a8c8305..3a5958d 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.gpg.bc.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
index d8d80c7..126b2ee 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.http.apache"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import plugin="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml
index 055fefa..8c84922 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml
index ee6d342..d515a66 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.junit"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -24,7 +24,7 @@
 
    <requires>
       <import plugin="com.jcraft.jsch"/>
-      <import plugin="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml
index e45b95d..fc62814 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
index 2bc5559..0dc6258 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.lfs"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
index ba09965..5e5d976 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml
index d95fb9d..48e8593 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.pgm"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -35,9 +35,9 @@
          version="0.0.0"/>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
-      <import feature="org.eclipse.jgit.lfs" version="6.6.1" match="equivalent"/>
-      <import feature="org.eclipse.jgit.ssh.apache" version="6.6.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit.lfs" version="6.7.0" match="equivalent"/>
+      <import feature="org.eclipse.jgit.ssh.apache" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml
index 2ac0a4a..705d1e6 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
index 76d666f..47feeba 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.repository</artifactId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml
index 8199d5e..8bb6243 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.source"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml
index 3ebdc25..a74784e 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
@@ -30,7 +30,7 @@
     <dependency>
       <groupId>org.eclipse.jgit.feature</groupId>
       <artifactId>org.eclipse.jgit</artifactId>
-      <version>6.6.1-SNAPSHOT</version>
+      <version>6.7.0-SNAPSHOT</version>
     </dependency>
   </dependencies>
 
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml
index c7435ff..204c0a5 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.ssh.apache"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml
index b0754a4..fcb2eda 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml
index fce5f1e..c18b4f3 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.ssh.jsch"
       label="%featureName"
-      version="6.6.1.qualifier"
+      version="6.7.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -23,7 +23,7 @@
    </url>
 
    <requires>
-      <import plugin="org.eclipse.jgit" version="6.6.1" match="equivalent"/>
+      <import plugin="org.eclipse.jgit" version="6.7.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml
index 0dd15a4..eca10cd 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.jsch.feature/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF
index 9ff1b16..15446dd 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF
@@ -2,4 +2,4 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: JGit Target Platform Bundle
 Bundle-SymbolicName: org.eclipse.jgit.target
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.17.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.17.target
index 04ff3f5..bf0aa3d 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.17.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.17.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.17" sequenceNumber="1686300730">
+<target name="jgit-4.17" sequenceNumber="1690316787">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.18.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.18.target
index 156cfd6..e168762 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.18.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.18.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.18" sequenceNumber="1686300731">
+<target name="jgit-4.18" sequenceNumber="1690316787">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.19.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.19.target
index 14b15fa..df9670f 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.19.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.19.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.19-staging" sequenceNumber="1686300730">
+<target name="jgit-4.19-staging" sequenceNumber="1690316787">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.20.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.20.target
index 0d7b240..ae12536 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.20.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.20.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.20" sequenceNumber="1686300731">
+<target name="jgit-4.20" sequenceNumber="1690316787">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.21.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.21.target
index 94f671d..ebd551d 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.21.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.21.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.21" sequenceNumber="1686300731">
+<target name="jgit-4.21" sequenceNumber="1690316787">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.22.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.22.target
index e14dd30..542afa5 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.22.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.22.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.22" sequenceNumber="1686300729">
+<target name="jgit-4.22" sequenceNumber="1690316786">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.23.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.23.target
index 5455f07..4442d42 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.23.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.23.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.23" sequenceNumber="1686300730">
+<target name="jgit-4.23" sequenceNumber="1690316786">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.24.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.24.target
index c383bce..70c541b 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.24.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.24.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.24" sequenceNumber="1686300729">
+<target name="jgit-4.24" sequenceNumber="1690316786">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.25.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.25.target
index 185b543..311ac44 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.25.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.25.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.25" sequenceNumber="1686300730">
+<target name="jgit-4.25" sequenceNumber="1690316786">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.26.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.26.target
index 811eb84..3a8ee95 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.26.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.26.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.26" sequenceNumber="1686300730">
+<target name="jgit-4.26" sequenceNumber="1690316786">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.27.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.27.target
index a1e02e7..7953712 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.27.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.27.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.27" sequenceNumber="1686300730">
+<target name="jgit-4.27" sequenceNumber="1690316786">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.28.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.28.target
index cd8f781..268a3a6 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.28.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.28.target
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="jgit-4.28" sequenceNumber="1686300646">
+<target name="jgit-4.28" sequenceNumber="1690316785">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="com.jcraft.jsch" version="0.1.55.v20221112-0806"/>
@@ -22,8 +22,6 @@
       <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
       <unit id="org.junit" version="4.13.2.v20211018-1956"/>
       <unit id="org.junit.source" version="4.13.2.v20211018-1956"/>
-      <unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
-      <unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
       <unit id="org.objenesis" version="3.3.0.v20221103-2317"/>
       <unit id="org.objenesis.source" version="3.3.0.v20221103-2317"/>
       <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20230531010532/repository"/>
@@ -74,6 +72,16 @@
     	</dependency>
     </dependencies>
     </location>
+    <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="mockito">
+    <dependencies>
+    	<dependency>
+    		<groupId>org.mockito</groupId>
+    		<artifactId>mockito-core</artifactId>
+    		<version>5.4.0</version>
+    		<type>jar</type>
+    	</dependency>
+    </dependencies>
+    </location>
     <location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="jna">
     <dependencies>
     	<dependency>
@@ -177,13 +185,13 @@
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>net.bytebuddy</groupId>
     		<artifactId>byte-buddy-agent</artifactId>
-    		<version>1.12.18</version>
+    		<version>1.14.5</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -193,25 +201,25 @@
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpg-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcprov-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcpkix-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
     		<groupId>org.bouncycastle</groupId>
     		<artifactId>bcutil-jdk18on</artifactId>
-    		<version>1.73</version>
+    		<version>1.75</version>
     		<type>jar</type>
     	</dependency>
     </dependencies>
@@ -241,7 +249,7 @@
     	<dependency>
     		<groupId>commons-codec</groupId>
     		<artifactId>commons-codec</artifactId>
-    		<version>1.15</version>
+    		<version>1.16.0</version>
     		<type>jar</type>
     	</dependency>
     	<dependency>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd
index cbb7d1e..c9fdb6e 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/maven/dependencies.tpd
@@ -10,7 +10,7 @@
 	dependency {
 		groupId = "commons-codec"
 		artifactId = "commons-codec"
-		version = "1.15"
+		version = "1.16.0"
 	}
 	dependency {
 		groupId = "org.apache.commons"
@@ -59,22 +59,22 @@
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcpg-jdk18on"
-		version = "1.73"
+		version = "1.75"
 	}
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcprov-jdk18on"
-		version = "1.73"
+		version = "1.75"
 	}
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcpkix-jdk18on"
-		version = "1.73"
+		version = "1.75"
 	}
 	dependency {
 		groupId = "org.bouncycastle"
 		artifactId = "bcutil-jdk18on"
-		version = "1.73"
+		version = "1.75"
 	}
 }
 
@@ -87,12 +87,12 @@
 	dependency {
 		groupId = "net.bytebuddy"
 		artifactId = "byte-buddy"
-		version = "1.12.18"
+		version = "1.14.5"
 	}
 	dependency {
 		groupId = "net.bytebuddy"
 		artifactId = "byte-buddy-agent"
-		version = "1.12.18"
+		version = "1.14.5"
 	}
 }
 
@@ -201,6 +201,19 @@
 	}
 }
 
+maven mockito
+	scope = compile
+	dependencyDepth = none
+	missingManifest = error
+	includeSources
+{
+	dependency {
+		groupId = "org.mockito"
+		artifactId = "mockito-core"
+		version = "5.4.0"
+	}
+}
+
 maven sshd
 	scope = compile
 	dependencyDepth = none
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20230531010532-2023-06.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20230531010532-2023-06.tpd
index 089981c..46055d3 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20230531010532-2023-06.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20230531010532-2023-06.tpd
@@ -20,8 +20,6 @@
 	org.hamcrest.library.source [1.3.0.v20180524-2246,1.3.0.v20180524-2246]
 	org.junit [4.13.2.v20211018-1956,4.13.2.v20211018-1956]
 	org.junit.source [4.13.2.v20211018-1956,4.13.2.v20211018-1956]
-	org.mockito.mockito-core [4.8.1.v20221103-2317,4.8.1.v20221103-2317]
-	org.mockito.mockito-core.source [4.8.1.v20221103-2317,4.8.1.v20221103-2317]
 	org.objenesis [3.3.0.v20221103-2317,3.3.0.v20221103-2317]
 	org.objenesis.source [3.3.0.v20221103-2317,3.3.0.v20221103-2317]
 }
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml
index b2260d2..75e64a1 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.target</artifactId>
diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml
index f310711..7105fb4 100644
--- a/org.eclipse.jgit.packaging/pom.xml
+++ b/org.eclipse.jgit.packaging/pom.xml
@@ -16,7 +16,7 @@
 
   <groupId>org.eclipse.jgit</groupId>
   <artifactId>jgit.tycho.parent</artifactId>
-  <version>6.6.1-SNAPSHOT</version>
+  <version>6.7.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>JGit Tycho Parent</name>
@@ -36,10 +36,6 @@
       <id>repo.eclipse.org.cbi-snapshots</id>
       <url>https://repo.eclipse.org/content/repositories/cbi-snapshots/</url>
     </pluginRepository>
-    <pluginRepository>
-      <id>tycho-snapshots</id>
-      <url>https://repo.eclipse.org/content/repositories/tycho-snapshots/</url>
-    </pluginRepository>
   </pluginRepositories>
 
   <modules>
@@ -298,7 +294,7 @@
         <plugin>
           <groupId>org.eclipse.cbi.maven.plugins</groupId>
           <artifactId>eclipse-jarsigner-plugin</artifactId>
-          <version>1.3.5</version>
+          <version>1.4.2</version>
         </plugin>
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
index 84268a2..d2db246 100644
--- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
@@ -3,30 +3,30 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.pgm.test
 Bundle-SymbolicName: org.eclipse.jgit.pgm.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Import-Package: org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.diff;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.dircache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.diffmergetool;version="6.6.1",
- org.eclipse.jgit.internal.storage.file;version="6.6.1",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.merge;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.pgm;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.pgm.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.pgm.opt;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.io;version="[6.6.1,6.7.0)",
+Import-Package: org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.diff;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.dircache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="6.7.0",
+ org.eclipse.jgit.internal.storage.file;version="6.7.0",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.merge;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.pgm;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.pgm.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.pgm.opt;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.io;version="[6.7.0,6.8.0)",
  org.hamcrest.core;bundle-version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.rules;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml
index 1cc82ae..bc0ccf6 100644
--- a/org.eclipse.jgit.pgm.test/pom.xml
+++ b/org.eclipse.jgit.pgm.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm.test</artifactId>
diff --git a/org.eclipse.jgit.pgm/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.pgm/.settings/org.eclipse.jdt.core.prefs
index 2abe952..b27b6c3 100644
--- a/org.eclipse.jgit.pgm/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.pgm/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
index bcb3b4a..9be1a39 100644
--- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.pgm
 Bundle-SymbolicName: org.eclipse.jgit.pgm
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -14,49 +14,49 @@
  org.eclipse.jetty.servlet;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util;version="[10.0.0,11.0.0)",
  org.eclipse.jetty.util.component;version="[10.0.0,11.0.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.archive;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.awtui;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.blame;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.diff;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.dircache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.gitrepo;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.io;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.pack;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.server;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.server.fs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs.server.s3;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.merge;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.notes;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revplot;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.pack;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http.apache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.resolver;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.ssh.jsch;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.sshd;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.io;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.archive;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.awtui;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.blame;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.diff;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.dircache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.gitrepo;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.io;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.server;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs.server.s3;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.merge;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.notes;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revplot;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.pack;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http.apache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.ssh.jsch;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.sshd;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.io;version="[6.7.0,6.8.0)",
  org.kohsuke.args4j;version="[2.33.0,3.0.0)",
  org.kohsuke.args4j.spi;version="[2.33.0,3.0.0)"
-Export-Package: org.eclipse.jgit.console;version="6.6.1";
+Export-Package: org.eclipse.jgit.console;version="6.7.0";
  uses:="org.eclipse.jgit.transport,
   org.eclipse.jgit.util",
- org.eclipse.jgit.pgm;version="6.6.1";
+ org.eclipse.jgit.pgm;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util.io,
    org.eclipse.jgit.awtui,
@@ -68,14 +68,14 @@
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.api,
    javax.swing",
- org.eclipse.jgit.pgm.debug;version="6.6.1";
+ org.eclipse.jgit.pgm.debug;version="6.7.0";
   uses:="org.eclipse.jgit.util.io,
    org.eclipse.jgit.pgm,
    org.eclipse.jetty.servlet",
- org.eclipse.jgit.pgm.internal;version="6.6.1";
+ org.eclipse.jgit.pgm.internal;version="6.7.0";
   x-friends:="org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.test",
- org.eclipse.jgit.pgm.opt;version="6.6.1";
+ org.eclipse.jgit.pgm.opt;version="6.7.0";
   uses:="org.kohsuke.args4j,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
diff --git a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
index 6c292dd..ad00aef 100644
--- a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.pgm - Sources
 Bundle-SymbolicName: org.eclipse.jgit.pgm.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.pgm/META-INF/services/org.eclipse.jgit.pgm.TextBuiltin b/org.eclipse.jgit.pgm/META-INF/services/org.eclipse.jgit.pgm.TextBuiltin
index ea1d1e3..08d3727 100644
--- a/org.eclipse.jgit.pgm/META-INF/services/org.eclipse.jgit.pgm.TextBuiltin
+++ b/org.eclipse.jgit.pgm/META-INF/services/org.eclipse.jgit.pgm.TextBuiltin
@@ -46,6 +46,7 @@
 org.eclipse.jgit.pgm.debug.DiffAlgorithms
 org.eclipse.jgit.pgm.debug.LfsStore
 org.eclipse.jgit.pgm.debug.MakeCacheTree
+org.eclipse.jgit.pgm.debug.ReadChangedPathFilter
 org.eclipse.jgit.pgm.debug.ReadDirCache
 org.eclipse.jgit.pgm.debug.ReadReftable
 org.eclipse.jgit.pgm.debug.RebuildCommitGraph
diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml
index 368fc68..0cde584 100644
--- a/org.eclipse.jgit.pgm/pom.xml
+++ b/org.eclipse.jgit.pgm/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm</artifactId>
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java
index 681cf5d..201fa3d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java
@@ -38,7 +38,6 @@ public static void install() {
 
 	private final Console cons = System.console();
 
-	/** {@inheritDoc} */
 	@Override
 	protected PasswordAuthentication promptPasswordAuthentication() {
 		final String realm = formatRealm();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java
index 63ce838..5bdfc7b 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java
@@ -43,13 +43,11 @@ public static void install() {
 
 	private final Console cons = System.console();
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -71,7 +69,6 @@ else if (i instanceof CredentialItem.InformationalMessage)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean get(URIish uri, CredentialItem... items)
 			throws UnsupportedCredentialItem {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Add.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Add.java
index ff0b55d..2ebab5e 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Add.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Add.java
@@ -31,7 +31,6 @@ class Add extends TextBuiltin {
 	@Argument(required = true, metaVar = "metaVar_filepattern", usage = "usage_filesToAddContentFrom")
 	private List<String> filepatterns = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AmazonS3Client.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AmazonS3Client.java
index 0acad86..9c0915c 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AmazonS3Client.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AmazonS3Client.java
@@ -42,13 +42,11 @@ class AmazonS3Client extends TextBuiltin {
 	@Argument(index = 3, metaVar = "metaVar_KEY", required = true)
 	private String key;
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final AmazonS3 s3 = new AmazonS3(properties());
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Archive.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Archive.java
index 4028105..f98f8cb 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Archive.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Archive.java
@@ -41,7 +41,6 @@ class Archive extends TextBuiltin {
 	@Option(name = "--output", aliases = { "-o" }, metaVar = "metaVar_file", usage = "usage_archiveOutput")
 	private String output;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (tree == null)
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java
index 1a3a2f6..93d02c1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java
@@ -104,7 +104,6 @@ void ignoreAllSpace(@SuppressWarnings("unused") boolean on) {
 	/** Used to get a current time stamp for lines without commit. */
 	private final PersonIdent dummyDate = new PersonIdent("", ""); //$NON-NLS-1$ //$NON-NLS-2$
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		if (file == null) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Branch.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Branch.java
index 27668b5..e680394 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Branch.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Branch.java
@@ -148,7 +148,6 @@ public void moveRename(List<String> currentAndNew) {
 
 	private int maxNameLength;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java
index 98724bf..229d54d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java
@@ -51,7 +51,6 @@ class Checkout extends TextBuiltin {
 	@Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
 	private List<String> paths = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (createBranch) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clean.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clean.java
index 6db73e6..348f2e7 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clean.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clean.java
@@ -32,7 +32,6 @@ class Clean extends TextBuiltin {
 	@Option(name = "--dryRun", aliases = { "-n" })
 	private boolean dryRun = false;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
index 9f9fa8f..1efba55 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
@@ -72,13 +72,11 @@ class Clone extends AbstractFetchCommand implements CloneCommand.Callback {
 	@Argument(index = 1, metaVar = "metaVar_directory")
 	private String localName;
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (localName != null && gitdir != null)
@@ -148,7 +146,6 @@ protected void run() throws Exception {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void initializedSubmodules(Collection<String> submodules) {
 		try {
@@ -162,7 +159,6 @@ public void initializedSubmodules(Collection<String> submodules) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void cloningSubmodule(String path) {
 		try {
@@ -174,7 +170,6 @@ public void cloningSubmodule(String path) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void checkingOut(AnyObjectId commit, String path) {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandRef.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandRef.java
index 7a197a7..fb5a8ff 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandRef.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandRef.java
@@ -141,7 +141,6 @@ public TextBuiltin create() {
 		return r;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Commit.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Commit.java
index b0713f7..8df028d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Commit.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Commit.java
@@ -84,7 +84,6 @@ class Commit extends TextBuiltin {
 	@Argument(metaVar = "metaVar_commitPaths", usage = "usage_CommitPaths")
 	private List<String> paths = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Config.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Config.java
index 979c6fa..52f40c2 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Config.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Config.java
@@ -68,7 +68,6 @@ class Config extends TextBuiltin {
 	@Option(name = "--file", aliases = { "-f" }, metaVar = "metaVar_file", usage = "usage_configFile")
 	private File configFile;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		if (!list) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ConvertRefStorage.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ConvertRefStorage.java
index 47e4b6b..06e37da 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ConvertRefStorage.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ConvertRefStorage.java
@@ -28,7 +28,6 @@ class ConvertRefStorage extends TextBuiltin {
 			"-r" }, usage = "usage_convertRefStorageRefLogs")
 	private boolean writeLogs = true;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		((FileRepository) db).convertRefStorage(format, writeLogs, backup);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Daemon.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Daemon.java
index f987f2c..ec201a5 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Daemon.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Daemon.java
@@ -64,13 +64,11 @@ class Daemon extends TextBuiltin {
 	@Argument(required = true, metaVar = "metaVar_directory", usage = "usage_directoriesToExport")
 	List<File> directory = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		PackConfig packConfig = new PackConfig();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java
index 116db03..913d7c7 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java
@@ -47,7 +47,6 @@ class Describe extends TextBuiltin {
 	@Option(name = "--abbrev", usage = "usage_Abbrev")
 	private Integer abbrev;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Diff.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Diff.java
index 3152c44..61979d1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Diff.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Diff.java
@@ -155,14 +155,12 @@ void noPrefix(@SuppressWarnings("unused") boolean on) {
 
 	// END -- Options shared with Log
 
-	/** {@inheritDoc} */
 	@Override
 	protected void init(Repository repository, String gitDir) {
 		super.init(repository, gitDir);
 		diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		diffFmt.setRepository(db);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/DiffTree.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/DiffTree.java
index 9aaf3f5..352ffde 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/DiffTree.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/DiffTree.java
@@ -40,7 +40,6 @@ void tree_0(final AbstractTreeIterator c) {
 	@Option(name = "--", metaVar = "metaVar_path", handler = PathTreeFilterHandler.class)
 	private TreeFilter pathFilter = TreeFilter.ALL;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (TreeWalk walk = new TreeWalk(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Fetch.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Fetch.java
index 2e0c36b..7a007e3 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Fetch.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Fetch.java
@@ -113,7 +113,6 @@ void noRecurseSubmodules(@SuppressWarnings("unused")
 	@Argument(index = 1, metaVar = "metaVar_refspec")
 	private List<RefSpec> toget;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
@@ -167,7 +166,6 @@ protected void run() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void fetchingSubmodule(String name) {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Gc.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Gc.java
index c87f0b6..2796b91 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Gc.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Gc.java
@@ -27,7 +27,6 @@ class Gc extends TextBuiltin {
 	@Option(name = "--prune-preserved", usage = "usage_PrunePreserved")
 	private Boolean prunePreserved;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		Git git = Git.wrap(db);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Glog.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Glog.java
index 5318018..ce687c4 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Glog.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Glog.java
@@ -65,7 +65,6 @@ public void windowClosing(WindowEvent e) {
 		frame.getContentPane().add(world);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int walkLoop() throws Exception {
 		graphPane.getCommitList().source(walk);
@@ -77,13 +76,11 @@ protected int walkLoop() throws Exception {
 		return graphPane.getCommitList().size();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void show(RevCommit c) throws Exception {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected RevWalk createWalk() {
 		if (objects)
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/IndexPack.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/IndexPack.java
index 9732335..b3808d6 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/IndexPack.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/IndexPack.java
@@ -28,7 +28,6 @@ class IndexPack extends TextBuiltin {
 	@Option(name = "--index-version", usage = "usage_indexFileFormatToCreate")
 	private int indexVersion = -1;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		BufferedInputStream in = new BufferedInputStream(ins);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Init.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Init.java
index 7a0d96d..9c4af81 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Init.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Init.java
@@ -40,13 +40,11 @@ class Init extends TextBuiltin {
 	@Argument(index = 0, metaVar = "metaVar_directory")
 	private String directory;
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		InitCommand command = Git.init();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java
index d693051..852a4b3 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java
@@ -182,14 +182,12 @@ void noPrefix(@SuppressWarnings("unused") boolean on) {
 		dateFormatter = new GitDateFormatter(Format.DEFAULT);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void init(Repository repository, String gitDir) {
 		super.init(repository, gitDir);
 		diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		config = new GpgConfig(db.getConfig());
@@ -244,7 +242,6 @@ private void addNoteMap(String notesRef) throws IOException {
 				NoteMap.read(argWalk.getObjectReader(), notesCommit));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void show(RevCommit c) throws Exception {
 		outw.print(CLIText.get().commitLabel);
@@ -314,10 +311,14 @@ private void showSignature(RevCommit c) throws IOException {
 	}
 
 	/**
+	 * Show notes for given commit
+	 *
 	 * @param c
+	 *            given commit
 	 * @return <code>true</code> if at least one note was printed,
 	 *         <code>false</code> otherwise
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private boolean showNotes(RevCommit c) throws IOException {
 		if (noteMaps == null)
@@ -344,12 +345,17 @@ private boolean showNotes(RevCommit c) throws IOException {
 
 	/**
 	 * @param c
+	 *            given commit
 	 * @param map
+	 *            note map
 	 * @param label
+	 *            label
 	 * @param emptyLine
+	 *            whether to start with an empty line
 	 * @return <code>true</code> if note was printed, <code>false</code>
 	 *         otherwise
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private boolean showNotes(RevCommit c, NoteMap map, String label,
 			boolean emptyLine)
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsRemote.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsRemote.java
index 83446cc..89ceed2 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsRemote.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsRemote.java
@@ -40,7 +40,6 @@ class LsRemote extends TextBuiltin {
 	@Argument(index = 0, metaVar = "metaVar_uriish", required = true)
 	private String remote;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		LsRemoteCommand command = Git.lsRemoteRepository().setRemote(remote)
@@ -63,7 +62,6 @@ protected void run() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean requiresRepository() {
 		return false;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsTree.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsTree.java
index bb14001..34b48c1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsTree.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsTree.java
@@ -38,7 +38,6 @@ class LsTree extends TextBuiltin {
 	@Option(name = "--", metaVar = "metaVar_paths", handler = StopOptionHandler.class)
 	private List<String> paths = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (TreeWalk walk = new TreeWalk(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java
index 613fc5f..d059eff 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java
@@ -97,6 +97,7 @@ public Thread newThread(Runnable taskBody) {
 	 * @param argv
 	 *            arguments.
 	 * @throws java.lang.Exception
+	 *             if an error occurred
 	 */
 	public static void main(String[] argv) throws Exception {
 		// make sure built-in filters are registered
@@ -121,6 +122,7 @@ public static void main(String[] argv) throws Exception {
 	 * @param argv
 	 *            arguments.
 	 * @throws java.lang.Exception
+	 *             if an error occurred
 	 */
 	protected void run(String[] argv) throws Exception {
 		writer = createErrorWriter();
@@ -263,9 +265,11 @@ void init(TextBuiltin cmd) throws IOException {
 
 	/**
 	 * @param status
+	 *            exit status code, nonzero value indicates an error
 	 * @param t
 	 *            can be {@code null}
 	 * @throws Exception
+	 *             if an IO error occurred
 	 */
 	void exit(int status, Exception t) throws Exception {
 		writer.flush();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Merge.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Merge.java
index 27a3d90..b78998d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Merge.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Merge.java
@@ -86,7 +86,6 @@ void extraArg(String name) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		if (squash && ff == FastForwardMode.NO_FF) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MergeBase.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MergeBase.java
index 68eeff7..aacde2f 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MergeBase.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MergeBase.java
@@ -33,7 +33,6 @@ void commit_0(final RevCommit c) {
 	@Argument(index = 1, metaVar = "metaVar_commitish", required = true)
 	private List<RevCommit> commits = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java
index f2e3a16..6535d95 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java
@@ -81,7 +81,6 @@ void nothin(@SuppressWarnings("unused") final boolean ignored) {
 
 	private boolean shownURI;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
index f570f7f..f89a4d1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
@@ -26,13 +26,11 @@ class ReceivePack extends TextBuiltin {
 	@Argument(index = 0, required = true, metaVar = "metaVar_directory", usage = "usage_RepositoryToReceiveInto")
 	File dstGitdir;
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		final org.eclipse.jgit.transport.ReceivePack rp;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reflog.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reflog.java
index c63532d..46485cc 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reflog.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reflog.java
@@ -28,7 +28,6 @@ class Reflog extends TextBuiltin {
 	@Argument(metaVar = "metaVar_ref")
 	private String ref;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Remote.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Remote.java
index 6d6feed..a3100ac 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Remote.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Remote.java
@@ -52,7 +52,6 @@ class Remote extends TextBuiltin {
 	@Argument(index = 2, metaVar = "metaVar_uriish")
 	private String uri;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
@@ -114,7 +113,6 @@ protected void run() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void printUsage(String message, CmdLineParser clp)
 			throws IOException {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Repo.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Repo.java
index 0588a7c..da622e1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Repo.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Repo.java
@@ -26,7 +26,6 @@ class Repo extends TextBuiltin {
 	@Argument(required = true, metaVar = "metaVar_path", usage = "usage_pathToXml")
 	private String path;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reset.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reset.java
index 3454cf2..f33cb6be 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reset.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reset.java
@@ -41,7 +41,6 @@ class Reset extends TextBuiltin {
 	@Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
 	private List<String> paths = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevList.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevList.java
index e86ad01..59fc5f2 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevList.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevList.java
@@ -18,7 +18,6 @@
 
 @Command(usage = "usage_RevList")
 class RevList extends RevWalkTextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void show(RevCommit c) throws Exception {
 		if (c.has(RevFlag.UNINTERESTING))
@@ -32,7 +31,6 @@ protected void show(RevCommit c) throws Exception {
 		outw.println();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void show(ObjectWalk ow, RevObject obj)
 			throws Exception {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevParse.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevParse.java
index 9e4d1c9..b1fb07b 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevParse.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevParse.java
@@ -35,7 +35,6 @@ class RevParse extends TextBuiltin {
 	@Argument(index = 0, metaVar = "metaVar_commitish")
 	private List<ObjectId> commits = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java
index 696a924..51e597c 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java
@@ -114,7 +114,6 @@ void addCMessageRevFilter(String msg) {
 	@Option(name = "--max-count", aliases = "-n", metaVar = "metaVar_n")
 	private int maxCount = -1;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		walk = createWalk();
@@ -228,7 +227,8 @@ protected int walkLoop() throws Exception {
 	 *
 	 * @param c
 	 *            The current {@link org.eclipse.jgit.revwalk.RevCommit}
-	 * @throws java.lang.Exception
+	 * @throws Exception
+	 *             if an error occurred
 	 */
 	protected abstract void show(RevCommit c) throws Exception;
 
@@ -243,7 +243,8 @@ protected int walkLoop() throws Exception {
 	 *            {@link #walkLoop()}
 	 * @param currentObject
 	 *            The current {@link org.eclipse.jgit.revwalk.RevObject}
-	 * @throws java.lang.Exception
+	 * @throws Exception
+	 *             if an error occurred
 	 */
 	protected void show(final ObjectWalk objectWalk,
 			final RevObject currentObject) throws Exception {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Rm.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Rm.java
index 4a33798..234da1a 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Rm.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Rm.java
@@ -27,7 +27,6 @@ class Rm extends TextBuiltin {
 	@Option(name = "--", handler = StopOptionHandler.class)
 	private List<String> paths = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
index c18d35a..4feb090 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
@@ -161,14 +161,12 @@ void noPrefix(@SuppressWarnings("unused") boolean on) {
 		fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy ZZZZZ", Locale.US); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void init(Repository repository, String gitDir) {
 		super.init(repository, gitDir);
 		diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("boxing")
 	@Override
 	protected void run() {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ShowRef.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ShowRef.java
index a58785f..64b182e 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ShowRef.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ShowRef.java
@@ -21,7 +21,6 @@
 
 @Command(usage = "usage_ShowRef")
 class ShowRef extends TextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java
index 141de0c..1ef39a1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java
@@ -55,7 +55,6 @@ class Status extends TextBuiltin {
 	@Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
 	protected List<String> filterPaths;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
@@ -239,10 +238,11 @@ private void printLongStatus(org.eclipse.jgit.api.Status status)
 	 * Print section header
 	 *
 	 * @param pattern
-	 *            a {@link java.lang.String} object.
+	 *            a {@link String} object.
 	 * @param arguments
-	 *            a {@link java.lang.Object} object.
-	 * @throws java.io.IOException
+	 *            a {@link Object} object.
+	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected void printSectionHeader(String pattern, Object... arguments)
 			throws IOException {
@@ -259,9 +259,10 @@ protected void printSectionHeader(String pattern, Object... arguments)
 	 * Print String list
 	 *
 	 * @param list
-	 *            a {@link java.util.Collection} object.
-	 * @return a int.
-	 * @throws java.io.IOException
+	 *            a {@link Collection} object.
+	 * @return size of the list
+	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected int printList(Collection<String> list) throws IOException {
 		if (!list.isEmpty()) {
@@ -281,21 +282,22 @@ protected int printList(Collection<String> list) throws IOException {
 	 * Print String list
 	 *
 	 * @param status1
-	 *            a {@link java.lang.String} object.
+	 *            a {@link String} object.
 	 * @param status2
-	 *            a {@link java.lang.String} object.
+	 *            a {@link String} object.
 	 * @param status3
-	 *            a {@link java.lang.String} object.
+	 *            a {@link String} object.
 	 * @param list
-	 *            a {@link java.util.Collection} object.
+	 *            a {@link Collection} object.
 	 * @param set1
-	 *            a {@link java.util.Collection} object.
+	 *            a {@link Collection} object.
 	 * @param set2
-	 *            a {@link java.util.Collection} object.
+	 *            a {@link Collection} object.
 	 * @param set3
-	 *            a {@link java.util.Collection} object.
+	 *            a {@link Collection} object.
 	 * @return a int.
-	 * @throws java.io.IOException
+	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	protected int printList(String status1, String status2, String status3,
 			Collection<String> list, Collection<String> set1,
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java
index 0603de1..4ea67ab 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java
@@ -88,7 +88,6 @@ class Tag extends TextBuiltin {
 	@Argument(index = 1, metaVar = "metaVar_object")
 	private ObjectId object;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try (Git git = new Git(db)) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
index 6cfe93d..c572e3b 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
@@ -249,6 +249,7 @@ public final void execute(String[] args) throws Exception {
 	 * @param args
 	 *            the arguments supplied on the command line, if any.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected void parseArguments(String[] args) throws IOException {
 		final CmdLineParser clp = new CmdLineParser(this);
@@ -277,6 +278,7 @@ protected void parseArguments(String[] args) throws IOException {
 	 * @param clp
 	 *            a {@link org.eclipse.jgit.pgm.opt.CmdLineParser} object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void printUsageAndExit(CmdLineParser clp) throws IOException {
 		printUsageAndExit("", clp); //$NON-NLS-1$
@@ -290,6 +292,7 @@ public void printUsageAndExit(CmdLineParser clp) throws IOException {
 	 * @param clp
 	 *            a {@link org.eclipse.jgit.pgm.opt.CmdLineParser} object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void printUsageAndExit(String message, CmdLineParser clp) throws IOException {
 		printUsage(message, clp);
@@ -304,6 +307,7 @@ public void printUsageAndExit(String message, CmdLineParser clp) throws IOExcept
 	 * @param clp
 	 *            parser used to print options
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	protected void printUsage(String message, CmdLineParser clp)
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java
index ac51643..db2c393 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/UploadPack.java
@@ -30,13 +30,11 @@ class UploadPack extends TextBuiltin {
 	@Argument(index = 0, required = true, metaVar = "metaVar_directory", usage = "usage_RepositoryToReadFrom")
 	File srcGitdir;
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java
index d06f1e2..8546094 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java
@@ -22,7 +22,6 @@
 
 @Command(common = true, usage = "usage_DisplayTheVersionOfJgit")
 class Version extends TextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void run() {
 		// read the Implementation-Version from Manifest
@@ -48,7 +47,6 @@ protected void run() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/BenchmarkReftable.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/BenchmarkReftable.java
index f23f4cf..f156b8c 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/BenchmarkReftable.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/BenchmarkReftable.java
@@ -70,7 +70,6 @@ enum Test {
 	@Argument(index = 1)
 	private String reftablePath;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		switch (test) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java
index a63387c..67300dc 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java
@@ -96,13 +96,11 @@ DiffAlgorithm create() {
 
 	private ThreadMXBean mxBean;
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		mxBean = ManagementFactory.getThreadMXBean();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java
index 9c0ced5..653530d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java
@@ -181,13 +181,11 @@ private enum StorageClass {
 
 	String secretKey;
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		AppServer server = new AppServer(port);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/MakeCacheTree.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/MakeCacheTree.java
index 63897a3..5188336 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/MakeCacheTree.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/MakeCacheTree.java
@@ -24,7 +24,6 @@
 
 @Command(usage = "usage_MakeCacheTree")
 class MakeCacheTree extends TextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final DirCache cache = db.readDirCache();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadChangedPathFilter.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadChangedPathFilter.java
new file mode 100644
index 0000000..6927de8
--- /dev/null
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadChangedPathFilter.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2023, Google LLC
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.pgm.debug;
+
+import java.io.FileInputStream;
+import java.util.HashSet;
+
+import org.eclipse.jgit.pgm.Command;
+import org.eclipse.jgit.pgm.TextBuiltin;
+import org.eclipse.jgit.util.NB;
+import org.kohsuke.args4j.Argument;
+
+/**
+ * Prints the contents of the BDAT chunk from commit-graph file.
+ * <p>
+ * This is a debugging tool for changed path filter development.
+ */
+@Command
+class ReadChangedPathFilter extends TextBuiltin {
+
+	static final int CHUNK_ID_OID_FANOUT = 0x4f494446; /* "OIDF" */
+
+	static final int CHUNK_ID_BLOOM_FILTER_INDEX = 0x42494458; /* "BIDX" */
+
+	static final int CHUNK_ID_BLOOM_FILTER_DATA = 0x42444154; /* "BDAT" */
+
+	@Argument(index = 0)
+	private String input;
+
+	static HashSet<String> changedPathStrings(byte[] data) {
+		int oidf_offset = -1;
+		int bidx_offset = -1;
+		int bdat_offset = -1;
+		for (int i = 8; i < data.length - 4; i += 12) {
+			switch (NB.decodeInt32(data, i)) {
+			case CHUNK_ID_OID_FANOUT:
+				oidf_offset = (int) NB.decodeInt64(data, i + 4);
+				break;
+			case CHUNK_ID_BLOOM_FILTER_INDEX:
+				bidx_offset = (int) NB.decodeInt64(data, i + 4);
+				break;
+			case CHUNK_ID_BLOOM_FILTER_DATA:
+				bdat_offset = (int) NB.decodeInt64(data, i + 4);
+				break;
+			}
+		}
+		bdat_offset += 12; // skip version, hash count, bits per entry
+		int commit_count = NB.decodeInt32(data, oidf_offset + 255 * 4);
+		int[] changed_path_length_cumuls = new int[commit_count];
+		for (int i = 0; i < commit_count; i++) {
+			changed_path_length_cumuls[i] = NB.decodeInt32(data,
+					bidx_offset + i * 4);
+		}
+		HashSet<String> changed_paths = new HashSet<>();
+		for (int i = 0; i < commit_count; i++) {
+			int prior_cumul = i == 0 ? 0 : changed_path_length_cumuls[i - 1];
+			String changed_path = "";
+			for (int j = prior_cumul; j < changed_path_length_cumuls[i]; j++) {
+				changed_path += data[bdat_offset + j] + ",";
+			}
+			changed_paths.add(changed_path);
+		}
+		return changed_paths;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void run() throws Exception {
+		try (FileInputStream in = new FileInputStream(input)
+				) {
+				byte[] data = in.readAllBytes();
+				outw.println(changedPathStrings(data).toString());
+		}
+	}
+}
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadDirCache.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadDirCache.java
index 33d1059..6e0f915 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadDirCache.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadDirCache.java
@@ -21,7 +21,6 @@
 
 @Command(usage = "usage_ReadDirCache")
 class ReadDirCache extends TextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final int cnt = 100;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadReftable.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadReftable.java
index 6dace84..a2443d3 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadReftable.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadReftable.java
@@ -30,7 +30,6 @@ class ReadReftable extends TextBuiltin {
 	@Argument(index = 1, required = false)
 	private String ref;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (FileInputStream in = new FileInputStream(input);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
index 8d884c1..2f96ef7 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java
@@ -81,7 +81,6 @@ class RebuildCommitGraph extends TextBuiltin {
 
 	private Map<ObjectId, ObjectId> rewrites = new HashMap<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (!really && db.getRefDatabase().hasRefs()) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCacheTree.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCacheTree.java
index 28a8d86..057d20b 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCacheTree.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCacheTree.java
@@ -24,7 +24,6 @@
 
 @Command(usage = "usage_ShowCacheTree")
 class ShowCacheTree extends TextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final DirCache cache = db.readDirCache();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java
index 9e61357..daea1fb 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java
@@ -26,7 +26,6 @@ class ShowCommands extends TextBuiltin {
 	@Option(name = "--pretty", metaVar = "metaVar_commandDetail", usage = "usage_alterTheDetailShown")
 	private Format pretty = Format.USAGE;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final CommandRef[] list = CommandCatalog.all();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowDirCache.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowDirCache.java
index 1f4733f..3633d88 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowDirCache.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowDirCache.java
@@ -33,7 +33,6 @@ class ShowDirCache extends TextBuiltin {
 	@Option(name = "--millis", aliases = { "-m" }, usage = "usage_showTimeInMilliseconds")
 	private boolean millis = false;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final DateTimeFormatter fmt = DateTimeFormatter
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java
index 49f7ada..c95f138 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowPackDelta.java
@@ -39,7 +39,6 @@ class ShowPackDelta extends TextBuiltin {
 	@Argument(index = 0)
 	private ObjectId objectId;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		ObjectReader reader = db.newObjectReader();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java
index 1ca3034..d7d31bd 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java
@@ -228,13 +228,11 @@ public int fold(int hash, int bits) {
 	@Option(name = "--repository", aliases = { "-r" }, metaVar = "GIT_DIR", usage = "Repository to scan")
 	List<File> gitDirs = new ArrayList<>();
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean requiresRepository() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (gitDirs.isEmpty()) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/VerifyReftable.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/VerifyReftable.java
index 16a4c9f..aa1b81f 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/VerifyReftable.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/VerifyReftable.java
@@ -42,7 +42,6 @@ class VerifyReftable extends TextBuiltin {
 	@Argument(index = 1)
 	private String reftablePath;
 
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		List<Ref> refs = WriteReftable.readRefs(lsRemotePath);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteDirCache.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteDirCache.java
index 44836ec..d367f02 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteDirCache.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteDirCache.java
@@ -18,7 +18,6 @@
 
 @Command(usage = "usage_WriteDirCache")
 class WriteDirCache extends TextBuiltin {
-	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final DirCache cache = db.readDirCache();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java
index 80d2f76..faa2bce 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/WriteReftable.java
@@ -71,7 +71,6 @@ class WriteReftable extends TextBuiltin {
 	@Argument(index = 1)
 	private String out;
 
-	/** {@inheritDoc} */
 	@SuppressWarnings({ "nls", "boxing" })
 	@Override
 	protected void run() throws Exception {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java
index d860472..cea2309 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java
@@ -63,7 +63,6 @@ public AbstractTreeIteratorHandler(final CmdLineParser parser,
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -115,7 +114,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 		return 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_treeish;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/CmdLineParser.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/CmdLineParser.java
index df0b39b..463213d 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/CmdLineParser.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/CmdLineParser.java
@@ -110,7 +110,6 @@ public CmdLineParser(Object bean, Repository repo) {
 		this.db = repo;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void parseArgument(String... args) throws CmdLineException {
 		final ArrayList<String> tmp = new ArrayList<>(args.length);
@@ -265,7 +264,6 @@ public boolean required() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected OptionHandler createOptionHandler(OptionDef o, Setter setter) {
 		if (o instanceof NamedOptionDef) {
@@ -275,7 +273,6 @@ protected OptionHandler createOptionHandler(OptionDef o, Setter setter) {
 
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void printSingleLineUsage(Writer w, ResourceBundle rb) {
 		List<OptionHandler> options = getOptions();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/GpgSignHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/GpgSignHandler.java
index af90b83..56423ad 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/GpgSignHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/GpgSignHandler.java
@@ -53,7 +53,6 @@ public GpgSignHandler(CmdLineParser parser, OptionDef option,
 		super(parser, option, setter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		String alias = params.getParameter(-1);
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/InstantHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/InstantHandler.java
index feee78e..9c54169 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/InstantHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/InstantHandler.java
@@ -44,7 +44,6 @@ public InstantHandler(CmdLineParser parser, OptionDef option,
 		super(parser, option, setter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		Instant instant = Instant.parse(params.getParameter(0));
@@ -52,7 +51,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 		return 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_instant;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/ObjectIdHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/ObjectIdHandler.java
index 6cd36c3..b50df90 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/ObjectIdHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/ObjectIdHandler.java
@@ -49,7 +49,6 @@ public ObjectIdHandler(final CmdLineParser parser, final OptionDef option,
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -68,7 +67,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 				CLIText.format(CLIText.get().notAnObject), name);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_object;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/OptionWithValuesListHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/OptionWithValuesListHandler.java
index 7d7c806..7bb2766 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/OptionWithValuesListHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/OptionWithValuesListHandler.java
@@ -33,7 +33,6 @@ public OptionWithValuesListHandler(CmdLineParser parser,
 		super(parser, option, setter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final List<String> list = new ArrayList<>();
@@ -50,7 +49,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 		return list.size();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_values;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/PathTreeFilterHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/PathTreeFilterHandler.java
index 6535119..f215040 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/PathTreeFilterHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/PathTreeFilterHandler.java
@@ -49,7 +49,6 @@ public PathTreeFilterHandler(final CmdLineParser parser,
 		super(parser, option, setter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final List<PathFilter> filters = new ArrayList<>();
@@ -73,7 +72,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 		return filters.size();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_paths;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RefSpecHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RefSpecHandler.java
index effa22a..0491445 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RefSpecHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RefSpecHandler.java
@@ -43,14 +43,12 @@ public RefSpecHandler(final CmdLineParser parser, final OptionDef option,
 		super(parser, option, setter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		setter.addValue(new RefSpec(params.getParameter(0)));
 		return 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_refspec;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java
index 8b2bed36..a095a28 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevCommitHandler.java
@@ -53,7 +53,6 @@ public RevCommitHandler(final CmdLineParser parser, final OptionDef option,
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		String name = params.getParameter(0);
@@ -116,7 +115,6 @@ private void addOne(String name, boolean interesting)
 		setter.addValue(c);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_commitish;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java
index 357886d..08f1d28 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/RevTreeHandler.java
@@ -52,7 +52,6 @@ public RevTreeHandler(final CmdLineParser parser, final OptionDef option,
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -83,7 +82,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 		return 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_treeish;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/SubcommandHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/SubcommandHandler.java
index e096203..e71ba90 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/SubcommandHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/SubcommandHandler.java
@@ -49,7 +49,6 @@ public SubcommandHandler(final CmdLineParser parser,
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -67,7 +66,6 @@ public int parseArguments(Parameters params) throws CmdLineException {
 		return 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getDefaultMetaVariable() {
 		return CLIText.get().metaVar_command;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java
index 3562754..2f99cff 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java
@@ -52,7 +52,6 @@ public UntrackedFilesHandler(CmdLineParser parser, OptionDef option,
 		super(parser, option, setter);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		String alias = params.getParameter(-1);
diff --git a/org.eclipse.jgit.ssh.apache.agent/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.ssh.apache.agent/.settings/org.eclipse.jdt.core.prefs
index d1f54bb..d5c0e6c 100644
--- a/org.eclipse.jgit.ssh.apache.agent/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.ssh.apache.agent/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
index e617ab7..75172a7 100644
--- a/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.agent/META-INF/MANIFEST.MF
@@ -2,16 +2,16 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.agent;singleton:=true
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
-Fragment-Host: org.eclipse.jgit.ssh.apache;bundle-version="[6.6.1,6.7.0)"
+Fragment-Host: org.eclipse.jgit.ssh.apache;bundle-version="[6.7.0,6.8.0)"
 Bundle-ActivationPolicy: lazy
 Automatic-Module-Name: org.eclipse.jgit.ssh.apache.agent
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Import-Package: org.eclipse.jgit.transport.sshd;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)"
+Import-Package: org.eclipse.jgit.transport.sshd;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)"
 Require-Bundle: com.sun.jna;bundle-version="[5.8.0,6.0.0)",
  com.sun.jna.platform;bundle-version="[5.8.0,6.0.0)"
-Export-Package: org.eclipse.jgit.internal.transport.sshd.agent.connector;version="6.6.1";x-internal:=true
+Export-Package: org.eclipse.jgit.internal.transport.sshd.agent.connector;version="6.7.0";x-internal:=true
diff --git a/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF
index 1074914..55a60b2 100644
--- a/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.agent/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ssh.apache.agent - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.agent.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache.agent;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache.agent;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.apache.agent/pom.xml b/org.eclipse.jgit.ssh.apache.agent/pom.xml
index 46cd612..1d4e009 100644
--- a/org.eclipse.jgit.ssh.apache.agent/pom.xml
+++ b/org.eclipse.jgit.ssh.apache.agent/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache.agent</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java b/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java
index 6f8153d..54e4e2a 100644
--- a/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java
+++ b/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java
@@ -67,6 +67,7 @@ interface UnixSockets extends LibCAPI, Library {
 	 *            set it
 	 * @return -1 on error, otherwise a value >= 0
 	 * @throws LastErrorException
+	 *             represents non-zero error code for the last error
 	 */
 	int fcntl(int fd, int command, int flag) throws LastErrorException;
 
diff --git a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
index bc871d2..b347004 100644
--- a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ssh.apache.test
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
@@ -21,16 +21,16 @@
  org.apache.sshd.core;version="[2.10.0,2.11.0)",
  org.apache.sshd.server;version="[2.10.0,2.11.0)",
  org.apache.sshd.server.forward;version="[2.10.0,2.11.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.sshd.proxy;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit.ssh;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.sshd;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.sshd.agent;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.sshd.proxy;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit.ssh;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.sshd;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.sshd.agent;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.hamcrest;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.ssh.apache.test/pom.xml b/org.eclipse.jgit.ssh.apache.test/pom.xml
index 31ad1cc..90e3cb6 100644
--- a/org.eclipse.jgit.ssh.apache.test/pom.xml
+++ b/org.eclipse.jgit.ssh.apache.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache.test</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.ssh.apache/.settings/org.eclipse.jdt.core.prefs
index d1f54bb..d5c0e6c 100644
--- a/org.eclipse.jgit.ssh.apache/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.ssh.apache/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
index 4575c97..6bcbf4b 100644
--- a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF
@@ -6,9 +6,9 @@
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Export-Package: org.eclipse.jgit.internal.transport.sshd;version="6.6.1";x-internal:=true;
+Export-Package: org.eclipse.jgit.internal.transport.sshd;version="6.7.0";x-internal:=true;
   uses:="org.apache.sshd.client,
    org.apache.sshd.client.auth,
    org.apache.sshd.client.auth.keyboard,
@@ -23,17 +23,18 @@
    org.apache.sshd.common.signature,
    org.apache.sshd.common.util.buffer,
    org.eclipse.jgit.transport",
- org.eclipse.jgit.internal.transport.sshd.agent;version="6.6.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.auth;version="6.6.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.sshd.proxy;version="6.6.1";x-friends:="org.eclipse.jgit.ssh.apache.test",
- org.eclipse.jgit.transport.sshd;version="6.6.1";
+ org.eclipse.jgit.internal.transport.sshd.agent;version="6.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.auth;version="6.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.pkcs11;version="6.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.sshd.proxy;version="6.7.0";x-friends:="org.eclipse.jgit.ssh.apache.test",
+ org.eclipse.jgit.transport.sshd;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.apache.sshd.client.config.hosts,
    org.apache.sshd.common.keyprovider,
    org.eclipse.jgit.util,
    org.apache.sshd.client.session,
    org.apache.sshd.client.keyverifier",
- org.eclipse.jgit.transport.sshd.agent;version="6.6.1"
+ org.eclipse.jgit.transport.sshd.agent;version="6.7.0"
 Import-Package: net.i2p.crypto.eddsa;version="[0.3.0,0.4.0)",
  org.apache.sshd.agent;version="[2.10.0,2.11.0)",
  org.apache.sshd.client;version="[2.10.0,2.11.0)",
@@ -86,12 +87,12 @@
  org.apache.sshd.sftp;version="[2.10.0,2.11.0)",
  org.apache.sshd.sftp.client;version="[2.10.0,2.11.0)",
  org.apache.sshd.sftp.common;version="[2.10.0,2.11.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.fnmatch;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.fnmatch;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
diff --git a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
index b4eaa8c..5af0e06 100644
--- a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ssh.apache - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.apache/README.md b/org.eclipse.jgit.ssh.apache/README.md
index f06b2f6..b2911c6 100644
--- a/org.eclipse.jgit.ssh.apache/README.md
+++ b/org.eclipse.jgit.ssh.apache/README.md
@@ -73,7 +73,8 @@
 * **IdentityAgent** can be set to choose which SSH agent to use, if there are several running.
   It can also be set to `none` to explicitly switch off using an SSH agent at all.
 * **IdentitiesOnly** if set to `yes` and an SSH agent is used, only keys from the agent that are
-  also listed in an `IdentityFile` property will be considered. (It'll also switch off trying
+  also listed in an `IdentityFile` property and for which the public key is available in a
+  corresponding `*.pub` file will be considered. (It'll also switch off trying
   default key names, such as `~/.ssh/id_rsa` or `~/.ssh/id_ed25519`; only keys listed explicitly
   will be used.)
 
@@ -90,6 +91,57 @@
 not supported in JGit if its built-in SSH implementation is used. ed448 or other unsupported keys
 provided by an SSH agent are ignored.
 
+## PKCS#11 support
+
+JGit supports using PKCS#11 HSMs (Hardware Security Modules) such as YubiKey PIV for SSH
+authentication.
+
+Using such a PKCS#11 token for SSH authentication can be configured in `~/.ssh/config` with a
+configuration
+
+```
+  PCKS11Provider /absolute/path/to/vendor/library.so
+```
+
+instead of or in addition to `IdentityFile` or `IdentityAgent`. PKCS#11 keys are considered before
+keys from an SSH agent. If `IdentitiesOnly` is also set, only keys listed in `IdentityFile` for which
+the public key is available in a corresponding `*.pub` file are considered.
+
+If `PKCS11Provider` is not set, or is set to the value `none`, no PKCS#11 library is used.
+
+This is all as in OpenSSH.
+
+Keys from PKCS#11 tokens are never added to an SSH agent; the `AddKeysToAgent` configuration has
+no effect for PKCS#11 keys in JGit. It makes only sense if someone is using agent forwarding and
+it requires the SSH agent to understand the `SSH_AGENTC_ADD_SMARTCARD_KEY` command. It is unknown
+which SSH agents support this (OpenSSH does), the SSH library used by JGit has no API for it,
+and JGit doesn't do agent forwarding anyway. (To hop through servers to a git repository use
+`ProxyJump` instead.)
+
+JGit by default uses the first token (the default `slotListIndex` zero). The Java KeyStore or
+[Provider configuration](https://docs.oracle.com/en/java/javase/11/security/pkcs11-reference-guide1.html)
+does not seem to have any support for [RFC7512](https://www.rfc-editor.org/rfc/rfc7512) URIs
+to select the token. JGit provides a custom SSH configuration `PKCS11SlotListIndex` that can be
+set to the slot index of the token wanted. The value should be a non-negative integer. If not
+set or if negative, the first token (slot list index zero) is used. (Note that the value is the
+slot *index*, not the slot ID. Slot IDs are not necessarily stable.)
+
+If you *do* set `PKCS11SlotListIndex` anywhere in your configuration file, then you should also
+set at the very top of the `~/.ssh/config` file:
+
+```
+IgnoreUnknown PKCS11SlotListIndex
+```
+
+The `IgnoreUnknown` configuration tells OpenSSH to ignore configurations it doesn't know about.
+Without this option, OpenSSH will issue an error and exit if the config file contains
+`PKCS11SlotListIndex`. The `IgnoreUnknown` option is available in OpenSSH since version 6.3
+from 2013-09-13. See the [OpenSSH documentation](https://man.openbsd.org/ssh_config.5#IgnoreUnknown)
+for details.
+
+If a token has multiple certificates and keys, a specific one can be selected by exporting
+the public key to a file and then using `IdentitiesOnly` and an `IdentityFile` configuration.
+
 ## Using a different SSH implementation
 
 To use a different SSH implementation:
diff --git a/org.eclipse.jgit.ssh.apache/manual_tests.txt b/org.eclipse.jgit.ssh.apache/manual_tests.txt
new file mode 100644
index 0000000..ea3e59c
--- /dev/null
+++ b/org.eclipse.jgit.ssh.apache/manual_tests.txt
@@ -0,0 +1,45 @@
+Testing PKCS11 support
+----------------------
+
+# Install SoftHSM and OpenSC
+
+I got SoftHSM via MacPorts, and OpenSC from https://github.com/OpenSC/OpenSC#downloads
+
+You need both; softhsm2-util cannot import certificates.
+
+# Initialize SoftHSM
+
+$ softhsm2-util --init-token --slot 0 --label "TestToken" --pin 1234 --so-pin 4567
+The token has been initialized and is reassigned to slot 2006661923
+
+# Create a new RSA key and certificate
+
+$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -subj "/CN=MyCertTEST" -nodes
+
+# Import the RSA key pair into the SoftHSM token
+
+$ softhsm2-util --import key.pem --slot 2006661923 --label "testkey" --id 1212 --pin 1234
+
+# Convert the certificate to DER and import it into SoftHSM token
+
+$ openssl x509 -in cert.pem -out cert.der -outform DER
+$ pkcs11-tool --module /opt/local/lib/softhsm/libsofthsm2.so -l --id 1212 --label "testcert" -y cert -w cert.der --pin 1234
+
+# Export the RSA public key convert to PEM, and show in SSH format
+# (I'm sure this could be done simpler from the original key.pem, but what the heck.)
+
+pkcs11-tool --module /opt/local/lib/softhsm/libsofthsm2.so --slot 2006661923 --read-object --type pubkey --id 1212 -o key.der
+openssl rsa -pubin -inform DER -in key.der -outform PEM -out key.pub.pem
+ssh-keygen -f key.pub.pem -m pkcs8 -i
+
+# Install that public key at Gerrit (or your git server of choice)
+
+# Have an ~/.ssh/config with a host entry for your git server using the SoftHSM library as PKCS11 provider:
+
+Host gitserver
+Hostname git.eclipse.org
+Port 29418
+User ...
+PKCS11Provider /opt/local/lib/softhsm/libsofthsm2.so
+
+# Fetch from your git server! When asked for the PIN, enter 1234.
diff --git a/org.eclipse.jgit.ssh.apache/pom.xml b/org.eclipse.jgit.ssh.apache/pom.xml
index 2963449..e283e7b 100644
--- a/org.eclipse.jgit.ssh.apache/pom.xml
+++ b/org.eclipse.jgit.ssh.apache/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.apache</artifactId>
diff --git a/org.eclipse.jgit.ssh.apache/resources/org/eclipse/jgit/internal/transport/sshd/SshdText.properties b/org.eclipse.jgit.ssh.apache/resources/org/eclipse/jgit/internal/transport/sshd/SshdText.properties
index c676221..7da7181 100644
--- a/org.eclipse.jgit.ssh.apache/resources/org/eclipse/jgit/internal/transport/sshd/SshdText.properties
+++ b/org.eclipse.jgit.ssh.apache/resources/org/eclipse/jgit/internal/transport/sshd/SshdText.properties
@@ -32,17 +32,17 @@
 gssapiInitFailure=GSS-API initialization failure for mechanism {0}
 gssapiUnexpectedMechanism=Server {0} replied with unknown mechanism name ''{1}'' in {2} authentication
 gssapiUnexpectedMessage=Received unexpected ssh message {1} in {0} authentication
-identityFileCannotDecrypt=Given passphrase cannot decrypt identity {0}
+identityFileCannotDecrypt=Given passphrase cannot read identity {0}
 identityFileNoKey=No keys found in identity {0}
 identityFileMultipleKeys=Multiple key pairs found in identity {0}
 identityFileNotFound=Skipping identity ''{0}'': file not found
 identityFileUnsupportedFormat=Unsupported format in identity {0}
 invalidSignatureAlgorithm=Signature algorithm ''{0}'' is not valid for a key of type ''{1}''
 kexServerKeyInvalid=Server key did not validate
-keyEncryptedMsg=Key ''{0}'' is encrypted. Enter the passphrase to decrypt it.
+keyEncryptedMsg=''{0}'' needs a passphrase to be read.
 keyEncryptedPrompt=Passphrase
-keyEncryptedRetry=Encrypted key ''{0}'' could not be decrypted. Enter the passphrase again.
-keyLoadFailed=Could not load key ''{0}''
+keyEncryptedRetry=''{0}'' could not be read. Enter the passphrase again.
+keyLoadFailed=Could not load ''{0}''
 knownHostsCouldNotUpdate=Could not update known hosts file {0}
 knownHostsFileLockedUpdate=Could not update known hosts file (locked) {0}
 knownHostsFileReadFailed=Failed to read known hosts file {0}
@@ -69,6 +69,14 @@
 knownHostsUserAskCreationPrompt=Create file {0} ?
 loginDenied=Cannot log in at {0}:{1}
 passwordPrompt=Password
+pkcs11Error=ERROR: {0}
+pkcs11FailedInstantiation=HostConfig for host {0} (hostname {1}): could not instantiate {2} {3}
+pkcs11GeneralMessage=Java reported for PKCS#11 token {0}: {1}
+pkcs11NoKeys=HostConfig for host {0} (hostname {1}) {2} {3} did not provide any keys
+pkcs11NonExisting=HostConfig for host {0} (hostname {1}) {2} {3} does not exist or is not a file
+pkcs11NotAbsolute=HostConfig for host {0} (hostname {1}) {2} {3} is not an absolute path
+pkcs11Unsupported=HostConfig for host {0} (hostname {1}) {2} {3}: PKCS#11 is not supported
+pkcs11Warning=WARNING: {0}
 proxyCannotAuthenticate=Cannot authenticate to proxy {0}
 proxyHttpFailure=HTTP Proxy connection to {0} failed with code {1}: {2}
 proxyHttpInvalidUserName=HTTP proxy connection {0} with invalid user name; must not contain colons: {1}
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitClientSession.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitClientSession.java
index 5100bc9..c19a04d 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitClientSession.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitClientSession.java
@@ -27,6 +27,7 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.sshd.client.ClientBuilder;
 import org.apache.sshd.client.ClientFactoryManager;
@@ -55,6 +56,7 @@
 import org.eclipse.jgit.internal.transport.sshd.proxy.StatefulProxyConnector;
 import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.SshConstants;
+import org.eclipse.jgit.transport.sshd.KeyPasswordProvider;
 import org.eclipse.jgit.util.StringUtils;
 
 /**
@@ -69,6 +71,12 @@
 public class JGitClientSession extends ClientSessionImpl {
 
 	/**
+	 * Attribute set by {@link JGitSshClient} to make the
+	 * {@link KeyPasswordProvider} factory accessible via the session.
+	 */
+	public static final AttributeKey<Supplier<KeyPasswordProvider>> KEY_PASSWORD_PROVIDER_FACTORY = new AttributeKey<>();
+
+	/**
 	 * Default setting for the maximum number of bytes to read in the initial
 	 * protocol version exchange. 64kb is what OpenSSH &lt; 8.0 read; OpenSSH
 	 * 8.0 changed it to 8Mb, but that seems excessive for the purpose stated in
@@ -88,8 +96,11 @@ public class JGitClientSession extends ClientSessionImpl {
 
 	/**
 	 * @param manager
+	 *            client factory manager
 	 * @param session
+	 *            the session
 	 * @throws Exception
+	 *             an error occurred
 	 */
 	public JGitClientSession(ClientFactoryManager manager, IoSession session)
 			throws Exception {
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitPublicKeyAuthentication.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitPublicKeyAuthentication.java
index e2da799..eb55ec0 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitPublicKeyAuthentication.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitPublicKeyAuthentication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018, 2022 Thomas Wolf <thomas.wolf@paranor.ch> and others
+ * Copyright (C) 2018, 2023 Thomas Wolf <twolf@apache.org> and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -10,8 +10,12 @@
 package org.eclipse.jgit.internal.transport.sshd;
 
 import static java.text.MessageFormat.format;
+import static org.eclipse.jgit.transport.SshConstants.NONE;
+import static org.eclipse.jgit.transport.SshConstants.PKCS11_PROVIDER;
+import static org.eclipse.jgit.transport.SshConstants.PKCS11_SLOT_LIST_INDEX;
 import static org.eclipse.jgit.transport.SshConstants.PUBKEY_ACCEPTED_ALGORITHMS;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
@@ -25,6 +29,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -49,19 +54,25 @@
 import org.apache.sshd.common.config.keys.u2f.SecurityKeyPublicKey;
 import org.apache.sshd.common.signature.Signature;
 import org.apache.sshd.common.signature.SignatureFactoriesManager;
+import org.apache.sshd.common.util.GenericUtils;
 import org.eclipse.jgit.internal.transport.ssh.OpenSshConfigFile;
+import org.eclipse.jgit.internal.transport.sshd.pkcs11.Pkcs11Provider;
 import org.eclipse.jgit.transport.CredentialItem;
 import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.SshConstants;
 import org.eclipse.jgit.transport.URIish;
+import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.StringUtils;
 
 /**
  * Custom {@link UserAuthPublicKey} implementation for handling SSH config
- * PubkeyAcceptedAlgorithms and interaction with the SSH agent.
+ * PubkeyAcceptedAlgorithms and interaction with the SSH agent and PKCS11
+ * providers.
  */
 public class JGitPublicKeyAuthentication extends UserAuthPublicKey {
 
+	private static final String LOG_FORMAT = "{}"; //$NON-NLS-1$
+
 	private SshAgent agent;
 
 	private HostConfigEntry hostConfig;
@@ -102,7 +113,7 @@ public void init(ClientSession rawSession, String service)
 				super.init(session, service);
 				return;
 			}
-			log.warn(format(SshdText.get().configNoKnownAlgorithms,
+			log.warn(LOG_FORMAT, format(SshdText.get().configNoKnownAlgorithms,
 					PUBKEY_ACCEPTED_ALGORITHMS, pubkeyAlgos));
 		}
 		// TODO: remove this once we're on an sshd version that has SSHD-1272
@@ -181,7 +192,7 @@ protected PublicKeyIdentity resolveAttemptedPublicKeyIdentity(
 				} catch (IOException e) {
 					// Do not re-throw: we don't want authentication to fail if
 					// we cannot add the key to the agent.
-					log.error(
+					log.error(LOG_FORMAT,
 							format(SshdText.get().pubkeyAuthAddKeyToAgentError,
 									keyType, fingerprint),
 							e);
@@ -303,13 +314,6 @@ protected void releaseKeys() throws IOException {
 
 	private class KeyIterator extends UserAuthPublicKeyIterator {
 
-		private Iterable<? extends Map.Entry<PublicKey, String>> agentKeys;
-
-		// If non-null, all the public keys from explicitly given key files. Any
-		// agent key not matching one of these public keys will be ignored in
-		// getIdentities().
-		private Collection<PublicKey> identityFiles;
-
 		public KeyIterator(ClientSession session,
 				SignatureFactoriesManager manager)
 				throws Exception {
@@ -331,7 +335,8 @@ private List<PublicKey> getExplicitKeys(
 					}
 				} catch (InvalidPathException | IOException
 						| GeneralSecurityException e) {
-					log.warn(format(SshdText.get().cannotReadPublicKey, s), e);
+					log.warn("{}", //$NON-NLS-1$
+							format(SshdText.get().cannotReadPublicKey, s), e);
 				}
 				return null;
 			}).filter(Objects::nonNull).collect(Collectors.toList());
@@ -340,36 +345,40 @@ private List<PublicKey> getExplicitKeys(
 		@Override
 		protected Iterable<KeyAgentIdentity> initializeAgentIdentities(
 				ClientSession session) throws IOException {
-			if (agent == null) {
+			Iterable<KeyAgentIdentity> allAgentKeys = getAgentIdentities();
+			if (allAgentKeys == null) {
 				return null;
 			}
-			agentKeys = agent.getIdentities();
-			if (hostConfig != null && hostConfig.isIdentitiesOnly()) {
-				identityFiles = getExplicitKeys(hostConfig.getIdentities());
+			Collection<PublicKey> identityFiles = identitiesOnly();
+			if (GenericUtils.isEmpty(identityFiles)) {
+				return allAgentKeys;
 			}
+
+			// Only consider agent or PKCS11 keys that match a known public key
+			// file.
 			return () -> new Iterator<>() {
 
-				private final Iterator<? extends Map.Entry<PublicKey, String>> iter = agentKeys
+				private final Iterator<KeyAgentIdentity> identities = allAgentKeys
 						.iterator();
 
-				private Map.Entry<PublicKey, String> next;
+				private KeyAgentIdentity next;
 
 				@Override
 				public boolean hasNext() {
-					while (next == null && iter.hasNext()) {
-						Map.Entry<PublicKey, String> val = iter.next();
-						PublicKey pk = val.getKey();
+					while (next == null && identities.hasNext()) {
+						KeyAgentIdentity val = identities.next();
+						PublicKey pk = val.getKeyIdentity().getPublic();
 						// This checks against all explicit keys for any agent
 						// key, but since identityFiles.size() is typically 1,
 						// it should be fine.
-						if (identityFiles == null || identityFiles.stream()
+						if (identityFiles.stream()
 								.anyMatch(k -> KeyUtils.compareKeys(k, pk))) {
 							next = val;
 							return true;
 						}
 						if (log.isTraceEnabled()) {
 							log.trace(
-									"Ignoring SSH agent {} key not in explicit IdentityFile in SSH config: {}", //$NON-NLS-1$
+									"Ignoring SSH agent or PKCS11 {} key not in explicit IdentityFile in SSH config: {}", //$NON-NLS-1$
 									KeyUtils.getKeyType(pk),
 									KeyUtils.getFingerPrint(pk));
 						}
@@ -382,12 +391,157 @@ public KeyAgentIdentity next() {
 					if (!hasNext()) {
 						throw new NoSuchElementException();
 					}
-					KeyAgentIdentity result = new KeyAgentIdentity(agent,
-							next.getKey(), next.getValue());
+					KeyAgentIdentity result = next;
 					next = null;
 					return result;
 				}
 			};
 		}
+
+		private Collection<PublicKey> identitiesOnly() {
+			if (hostConfig != null && hostConfig.isIdentitiesOnly()) {
+				return getExplicitKeys(hostConfig.getIdentities());
+			}
+			return Collections.emptyList();
+		}
+
+		private Iterable<KeyAgentIdentity> getAgentIdentities()
+				throws IOException {
+			Iterable<KeyAgentIdentity> pkcs11Keys = getPkcs11Keys();
+			if (agent == null) {
+				return pkcs11Keys;
+			}
+			Iterable<? extends Map.Entry<PublicKey, String>> agentKeys = agent
+					.getIdentities();
+			if (GenericUtils.isEmpty(agentKeys)) {
+				return pkcs11Keys;
+			}
+			Iterable<KeyAgentIdentity> fromAgent = () -> new Iterator<>() {
+
+				private final Iterator<? extends Map.Entry<PublicKey, String>> iter = agentKeys
+						.iterator();
+
+				@Override
+				public boolean hasNext() {
+					return iter.hasNext();
+				}
+
+				@Override
+				public KeyAgentIdentity next() {
+					Map.Entry<PublicKey, String> next = iter.next();
+					return new KeyAgentIdentity(agent, next.getKey(),
+							next.getValue());
+				}
+			};
+			if (GenericUtils.isEmpty(pkcs11Keys)) {
+				return fromAgent;
+			}
+			return () -> new Iterator<>() {
+
+				private final Iterator<Iterator<KeyAgentIdentity>> keyIter = List
+						.of(pkcs11Keys.iterator(), fromAgent.iterator())
+						.iterator();
+
+				private Iterator<KeyAgentIdentity> currentKeys;
+
+				private Boolean hasElement;
+
+				@Override
+				public boolean hasNext() {
+					if (hasElement != null) {
+						return hasElement.booleanValue();
+					}
+					while (currentKeys == null || !currentKeys.hasNext()) {
+						if (keyIter.hasNext()) {
+							currentKeys = keyIter.next();
+						} else {
+							currentKeys = null;
+							hasElement = Boolean.FALSE;
+							return false;
+						}
+					}
+					hasElement = Boolean.TRUE;
+					return true;
+				}
+
+				@Override
+				public KeyAgentIdentity next() {
+					if ((hasElement == null && !hasNext())
+							|| !hasElement.booleanValue()) {
+						throw new NoSuchElementException();
+					}
+					hasElement = null;
+					KeyAgentIdentity result;
+					try {
+						result = currentKeys.next();
+					} catch (NoSuchElementException e) {
+						result = null;
+					}
+					return result;
+				}
+			};
+		}
+
+		private Iterable<KeyAgentIdentity> getPkcs11Keys() throws IOException {
+			String value = hostConfig.getProperty(PKCS11_PROVIDER);
+			if (StringUtils.isEmptyOrNull(value) || NONE.equals(value)) {
+				return null;
+			}
+			if (value.startsWith("~/") //$NON-NLS-1$
+					|| value.startsWith('~' + File.separator)) {
+				value = new File(FS.DETECTED.userHome(), value.substring(2))
+						.toString();
+			}
+			Path library = Paths.get(value);
+			if (!library.isAbsolute()) {
+				throw new IOException(format(SshdText.get().pkcs11NotAbsolute,
+						hostConfig.getHost(), hostConfig.getHostName(),
+						PKCS11_PROVIDER, value));
+			}
+			if (!Files.isRegularFile(library)) {
+				throw new IOException(format(SshdText.get().pkcs11NonExisting,
+						hostConfig.getHost(), hostConfig.getHostName(),
+						PKCS11_PROVIDER, value));
+			}
+			try {
+				int slotListIndex = OpenSshConfigFile.positive(
+						hostConfig.getProperty(PKCS11_SLOT_LIST_INDEX));
+				Pkcs11Provider provider = Pkcs11Provider.getProvider(library,
+						slotListIndex);
+				if (provider == null) {
+					throw new UnsupportedOperationException();
+				}
+				Iterable<KeyAgentIdentity> pkcs11Identities = provider
+						.getKeys(getSession());
+				if (GenericUtils.isEmpty(pkcs11Identities)) {
+					log.warn(LOG_FORMAT, format(SshdText.get().pkcs11NoKeys,
+							hostConfig.getHost(), hostConfig.getHostName(),
+							PKCS11_PROVIDER, value));
+					return null;
+				}
+				return pkcs11Identities;
+			} catch (UnsupportedOperationException e) {
+				throw new UnsupportedOperationException(format(
+						SshdText.get().pkcs11Unsupported, hostConfig.getHost(),
+						hostConfig.getHostName(), PKCS11_PROVIDER, value), e);
+			} catch (Exception e) {
+				checkCancellation(e);
+				throw new IOException(
+						format(SshdText.get().pkcs11FailedInstantiation,
+								hostConfig.getHost(), hostConfig.getHostName(),
+								PKCS11_PROVIDER, value),
+						e);
+			}
+		}
+
+		private void checkCancellation(Throwable e) {
+			Throwable t = e;
+			while (t != null) {
+				if (t instanceof AuthenticationCanceledException) {
+					throw (AuthenticationCanceledException) t;
+				}
+				t = t.getCause();
+			}
+		}
 	}
 }
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitSshClient.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitSshClient.java
index 311cf19..6e9bd62 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitSshClient.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitSshClient.java
@@ -32,6 +32,7 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import org.apache.sshd.client.SshClient;
@@ -58,6 +59,7 @@
 import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.SshConstants;
 import org.eclipse.jgit.transport.sshd.KeyCache;
+import org.eclipse.jgit.transport.sshd.KeyPasswordProvider;
 import org.eclipse.jgit.transport.sshd.ProxyData;
 import org.eclipse.jgit.transport.sshd.ProxyDataFactory;
 import org.eclipse.jgit.util.StringUtils;
@@ -103,6 +105,8 @@ public class JGitSshClient extends SshClient {
 
 	private CredentialsProvider credentialsProvider;
 
+	private Supplier<KeyPasswordProvider> keyPasswordProviderFactory;
+
 	private ProxyDataFactory proxyDatabase;
 
 	@Override
@@ -277,6 +281,8 @@ private JGitClientSession createSession(IoSession ioSession,
 		}
 		int numberOfPasswordPrompts = getNumberOfPasswordPrompts(hostConfig);
 		PASSWORD_PROMPTS.set(session, Integer.valueOf(numberOfPasswordPrompts));
+		session.setAttribute(JGitClientSession.KEY_PASSWORD_PROVIDER_FACTORY,
+				getKeyPasswordProviderFactory());
 		List<Path> identities = hostConfig.getIdentities().stream()
 				.map(s -> {
 					try {
@@ -374,6 +380,26 @@ public CredentialsProvider getCredentialsProvider() {
 	}
 
 	/**
+	 * Sets a supplier for a {@link KeyPasswordProvider} for this client.
+	 *
+	 * @param factory
+	 *            to set
+	 */
+	public void setKeyPasswordProviderFactory(
+			Supplier<KeyPasswordProvider> factory) {
+		keyPasswordProviderFactory = factory;
+	}
+
+	/**
+	 * Retrieves the {@link KeyPasswordProvider} factory of this client.
+	 *
+	 * @return a factory to create {@link KeyPasswordProvider}s
+	 */
+	public Supplier<KeyPasswordProvider> getKeyPasswordProviderFactory() {
+		return keyPasswordProviderFactory;
+	}
+
+	/**
 	 * A {@link SessionFactory} to create our own specialized
 	 * {@link JGitClientSession}s.
 	 */
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 7931c76..a00e5d9 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
@@ -34,9 +34,9 @@
 
 /**
  * Apache MINA sshd 2.0.0 KnownHostEntry cannot read a host entry line like
- * "host:port ssh-rsa <key>"; it complains about an illegal character in the
- * host name (correct would be "[host]:port"). The default known_hosts reader
- * also aborts reading on the first error.
+ * "host:port ssh-rsa &lt;key&gt;"; it complains about an illegal character in
+ * the host name (correct would be "[host]:port"). The default known_hosts
+ * reader also aborts reading on the first error.
  * <p>
  * This reader is a bit more robust and tries to handle this case if there is
  * only one colon (otherwise it might be an IPv6 address (without port)), and it
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 d8bf449..65ba5be 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
@@ -74,7 +74,6 @@
  * ignored.
  * <p>
  * {@code StrictHostKeyChecking} accepts the following values:
- * </p>
  * <dl>
  * <dt>ask</dt>
  * <dd>Ask the user whether new or changed keys shall be accepted and be added
@@ -91,7 +90,6 @@
  * <p>
  * If {@code StrictHostKeyChecking} is not set, or set to any other value, the
  * default value <b>ask</b> is active.
- * </p>
  * <p>
  * This implementation relies on the {@link ClientSession} being a
  * {@link JGitClientSession}. By default Apache MINA sshd does not forward the
@@ -100,23 +98,19 @@
  * used. If used with some other session type, the implementation assumes
  * "<b>ask</b>".
  * <p>
- * <p>
  * Asking the user is done via a {@link CredentialsProvider} obtained from the
  * session. If none is set, the implementation falls back to strict host key
  * checking ("<b>yes</b>").
- * </p>
  * <p>
  * Note that adding a key to the known hosts file may create the file. You can
  * specify in the constructor whether the user shall be asked about that, too.
  * If the user declines updating the file, but the key was otherwise
  * accepted (user confirmed for "<b>ask</b>", or "no" or "accept-new" are
  * active), the key is accepted for this session only.
- * </p>
  * <p>
  * If several known hosts files are specified, a new key is always added to the
  * first file (even if it doesn't exist yet; see the note about file creation
  * above).
- * </p>
  *
  * @see <a href="http://man.openbsd.org/OpenBSD-current/man5/ssh_config.5">man
  *      ssh-config</a>
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/SshdText.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/SshdText.java
index 39332d9..34c73fc 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/SshdText.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/SshdText.java
@@ -90,6 +90,14 @@ public static SshdText get() {
 	/***/ public String knownHostsUserAskCreationPrompt;
 	/***/ public String loginDenied;
 	/***/ public String passwordPrompt;
+	/***/ public String pkcs11Error;
+	/***/ public String pkcs11FailedInstantiation;
+	/***/ public String pkcs11GeneralMessage;
+	/***/ public String pkcs11NoKeys;
+	/***/ public String pkcs11NonExisting;
+	/***/ public String pkcs11NotAbsolute;
+	/***/ public String pkcs11Unsupported;
+	/***/ public String pkcs11Warning;
 	/***/ public String proxyCannotAuthenticate;
 	/***/ public String proxyHttpFailure;
 	/***/ public String proxyHttpInvalidUserName;
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/pkcs11/Pkcs11Provider.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/pkcs11/Pkcs11Provider.java
new file mode 100644
index 0000000..eefa3aa
--- /dev/null
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/pkcs11/Pkcs11Provider.java
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2023 Thomas Wolf <twolf@apache.org> and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.transport.sshd.pkcs11;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.security.GeneralSecurityException;
+import java.security.KeyPair;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Security;
+import java.security.Signature;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateExpiredException;
+import java.security.cert.CertificateNotYetValidException;
+import java.security.cert.X509Certificate;
+import java.util.AbstractMap.SimpleImmutableEntry;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.security.auth.login.FailedLoginException;
+
+import org.apache.sshd.agent.SshAgent;
+import org.apache.sshd.agent.SshAgentKeyConstraint;
+import org.apache.sshd.client.auth.pubkey.KeyAgentIdentity;
+import org.apache.sshd.common.session.SessionContext;
+import org.apache.sshd.common.signature.BuiltinSignatures;
+import org.eclipse.jgit.annotations.NonNull;
+import org.eclipse.jgit.transport.URIish;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Bridge for using a PKCS11 HSM (Hardware Security Module) for public-key
+ * authentication.
+ */
+public class Pkcs11Provider {
+
+	private static final Logger LOG = LoggerFactory
+			.getLogger(Pkcs11Provider.class);
+
+	/**
+	 * A dummy agent; exists only because
+	 * {@link KeyAgentIdentity#KeyAgentIdentity(SshAgent, PublicKey, String)} requires
+	 * a non-{@code null} {@link SshAgent}.
+	 */
+	private static final SshAgent NULL_AGENT = new SshAgent() {
+
+		@Override
+		public boolean isOpen() {
+			return true;
+		}
+
+		@Override
+		public void close() throws IOException {
+			// Nothing to do
+		}
+
+		@Override
+		public Iterable<? extends Entry<PublicKey, String>> getIdentities()
+				throws IOException {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override
+		public Entry<String, byte[]> sign(SessionContext session, PublicKey key,
+				String algo, byte[] data) throws IOException {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override
+		public void addIdentity(KeyPair key, String comment,
+				SshAgentKeyConstraint... constraints) throws IOException {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override
+		public void removeIdentity(PublicKey key) throws IOException {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override
+		public void removeAllIdentities() throws IOException {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	private static final Map<String, Pkcs11Provider> PROVIDERS = new ConcurrentHashMap<>();
+
+	private static final AtomicInteger COUNT = new AtomicInteger();
+
+	/**
+	 * Creates a new {@link Pkcs11Provider}.
+	 *
+	 * @param library
+	 *            {@link Path} to the library the SunPKCS11 provider shall use
+	 * @param slotListIndex
+	 *            index identifying the token; if &lt; 0, ignored and 0 is used
+	 * @return a new {@link Pkcs11Provider}, or {@code null} if SunPKCS11 is not
+	 *         available
+	 * @throws IOException
+	 *             if the configuration file cannot be created
+	 * @throws java.security.ProviderException
+	 *             if the Java {@link Provider} encounters a problem
+	 * @throws UnsupportedOperationException
+	 *             if PKCS#11 is unsupported
+	 */
+	public static Pkcs11Provider getProvider(@NonNull Path library,
+			int slotListIndex) throws IOException {
+		int slotIndex = slotListIndex < 0 ? 0 : slotListIndex;
+		Path libPath = library.toAbsolutePath();
+		String key = libPath.toString() + '/' + slotIndex;
+		return PROVIDERS.computeIfAbsent(key, sharedLib -> {
+			Provider pkcs11 = Security.getProvider("SunPKCS11"); //$NON-NLS-1$
+			if (pkcs11 == null) {
+				throw new UnsupportedOperationException();
+			}
+			// There must not be any spaces in the name.
+			String name = libPath.getFileName().toString().replaceAll("\\s", //$NON-NLS-1$
+					""); //$NON-NLS-1$
+			name = "JGit-" + slotIndex + '-' + name; //$NON-NLS-1$
+			// SunPKCS11 has a problem with paths containing multiple successive
+			// spaces; it collapses them to a single space.
+			//
+			// However, it also performs property expansion on these paths.
+			// (Seems to be an undocumented feature, though.) A reference like
+			// ${xyz} is replaced by system property "xyz". Use that to work
+			// around the rudimentary config parsing in SunPKCS11.
+			String property = "pkcs11-" + COUNT.incrementAndGet() + '-' + name; //$NON-NLS-1$
+			System.setProperty(property, libPath.toString());
+			// Undocumented feature of the SunPKCS11 provider: if the parameter
+			// to configure() starts with two dashes, it's not a file name but
+			// the configuration directly.
+			String config = "--" //$NON-NLS-1$
+					+ "name = " + name + '\n' //$NON-NLS-1$
+					+ "library = ${" + property + "}\n" //$NON-NLS-1$ //$NON-NLS-2$
+					+ "slotListIndex = " + slotIndex + '\n'; //$NON-NLS-1$
+			if (LOG.isDebugEnabled()) {
+				LOG.debug(
+						"{}: configuring provider with system property {}={} and config:{}{}", //$NON-NLS-1$
+						name, property, libPath, System.lineSeparator(),
+						config);
+			}
+			pkcs11 = pkcs11.configure(config);
+			// Produce an RFC7512 URI. Empty path, module-path must be in
+			// the query.
+			String path = "pkcs11:?module-path=" + libPath; //$NON-NLS-1$
+			if (slotListIndex > 0) {
+				// RFC7512 has nothing for the slot list index; pretend it
+				// was a vendor-specific query attribute.
+				path += "&slot-list-index=" + slotListIndex; //$NON-NLS-1$
+			}
+			SecurityCallback callback = new SecurityCallback(
+					new URIish().setPath(path));
+			return new Pkcs11Provider(pkcs11, callback);
+		});
+	}
+
+	private final Provider provider;
+
+	private final SecurityCallback prompter;
+
+	private final KeyStore.Builder builder;
+
+	private KeyStore keys;
+
+	private Pkcs11Provider(Provider pkcs11, SecurityCallback prompter) {
+		this.provider = pkcs11;
+		this.prompter = prompter;
+		this.builder = KeyStore.Builder.newInstance("PKCS11", provider, //$NON-NLS-1$
+				new KeyStore.CallbackHandlerProtection(prompter));
+	}
+
+	// Implementation note: With SoftHSM Java 11 asks for the PIN when the
+	// KeyStore is loaded, i.e., when the token is accessed. softhsm2-util,
+	// however, can list certificates and public keys without PIN entry, but
+	// needs a PIN to also list private keys. So it appears that different
+	// module libraries or possibly different KeyStore implementations may
+	// prompt either when accessing the token, or only when we try to actually
+	// sign something (i.e., when accessing a private key). It may also depend
+	// on the token itself; some tokens require early log-in.
+	//
+	// Therefore we initialize the prompter in both cases, even if it may be
+	// unused in one or the other operation.
+	//
+	// The price to pay is that sign() has to be synchronized, too, to avoid
+	// that different sessions step on each other's toes in the prompter.
+
+	private synchronized void load(SessionContext session)
+			throws GeneralSecurityException, IOException {
+		if (keys == null) {
+			int numberOfPrompts = prompter.init(session);
+			int attempt = 0;
+			while (attempt < numberOfPrompts) {
+				attempt++;
+				try {
+					if (LOG.isDebugEnabled()) {
+						LOG.debug(
+								"{}: Loading PKCS#11 KeyStore (attempt {})", //$NON-NLS-1$
+								getName(), Integer.toString(attempt));
+					}
+					keys = builder.getKeyStore();
+					prompter.passwordTried(null);
+					return;
+				} catch (GeneralSecurityException e) {
+					if (!prompter.passwordTried(e) || attempt >= numberOfPrompts
+							|| !isWrongPin(e)) {
+						throw e;
+					}
+				}
+			}
+		}
+	}
+
+	synchronized byte[] sign(SessionContext session, String algorithm,
+			String alias, byte[] data)
+			throws GeneralSecurityException, IOException {
+		int numberOfPrompts = prompter.init(session);
+		int attempt = 0;
+		while (attempt < numberOfPrompts) {
+			attempt++;
+			try {
+				if (LOG.isDebugEnabled()) {
+					LOG.debug(
+							"{}: Signing with PKCS#11 key {}, algorithm {} (attempt {})", //$NON-NLS-1$
+							getName(), alias, algorithm,
+							Integer.toString(attempt));
+				}
+				Signature signer = Signature.getInstance(algorithm, provider);
+				PrivateKey privKey = (PrivateKey) keys.getKey(alias, null);
+				signer.initSign(privKey);
+				signer.update(data);
+				byte[] signature = signer.sign();
+				prompter.passwordTried(null);
+				return signature;
+			} catch (GeneralSecurityException e) {
+				if (!prompter.passwordTried(e) || attempt >= numberOfPrompts
+						|| !isWrongPin(e)) {
+					throw e;
+				}
+			}
+		}
+		return null;
+	}
+
+	private boolean isWrongPin(Throwable e) {
+		Throwable t = e;
+		while (t != null) {
+			if (t instanceof FailedLoginException) {
+				return true;
+			}
+			t = t.getCause();
+		}
+		return false;
+	}
+
+	/**
+	 * Retrieves an identifying name of this {@link Pkcs11Provider}.
+	 *
+	 * @return the name
+	 */
+	public String getName() {
+		return provider.getName();
+	}
+
+	/**
+	 * Obtains the identities provided by the PKCS11 library.
+	 *
+	 * @param session
+	 *            in which we to load the identities
+	 * @return all the available identities
+	 * @throws IOException
+	 *             if keys cannot be accessed
+	 * @throws GeneralSecurityException
+	 *             if keys cannot be accessed
+	 */
+	public Iterable<KeyAgentIdentity> getKeys(SessionContext session)
+			throws IOException, GeneralSecurityException {
+		// Get all public keys from the KeyStore.
+		load(session);
+		List<KeyAgentIdentity> result = new ArrayList<>(2);
+		Enumeration<String> aliases = keys.aliases();
+		while (aliases.hasMoreElements()) {
+			String alias = aliases.nextElement();
+			Certificate certificate = keys.getCertificate(alias);
+			if (certificate == null) {
+				continue;
+			}
+			PublicKey pubKey = certificate.getPublicKey();
+			if (pubKey == null) {
+				// This should never happen
+				if (LOG.isDebugEnabled()) {
+					LOG.debug("{}: certificate {} has no public key??", //$NON-NLS-1$
+							getName(), alias);
+				}
+				continue;
+			}
+			if (LOG.isDebugEnabled()) {
+				if (certificate instanceof X509Certificate) {
+					X509Certificate x509 = (X509Certificate) certificate;
+					// OpenSSH does not seem to check certificate validity?
+					String msg;
+					try {
+						x509.checkValidity();
+						msg = "Certificate is valid"; //$NON-NLS-1$
+					} catch (CertificateExpiredException
+							| CertificateNotYetValidException e) {
+						msg = "Certificate is INVALID"; //$NON-NLS-1$
+					}
+					// OpenSSh explicitly also considers private keys not
+					// intended for signing, see
+					// https://bugzilla.mindrot.org/show_bug.cgi?id=1736 .
+					boolean[] usage = x509.getKeyUsage();
+					if (usage != null) {
+						// We have no access to the PKCS#11 flags on the key, so
+						// report the certificate flag, if present.
+						msg += ", signing " //$NON-NLS-1$
+								+ (usage[0] ? "allowed" : "NOT allowed"); //$NON-NLS-1$ //$NON-NLS-2$
+					}
+					LOG.debug(
+							"{}: Loaded X.509 certificate {}, key type {}. {}.", //$NON-NLS-1$
+							getName(), alias, pubKey.getAlgorithm(), msg);
+				} else {
+					LOG.debug("{}: Loaded certificate {}, key type {}.", //$NON-NLS-1$
+							getName(), alias, pubKey.getAlgorithm());
+				}
+			}
+			result.add(new Pkcs11Identity(pubKey, alias));
+		}
+		return result;
+	}
+
+	// We use a KeyAgentIdentity because we want to hide the private key.
+	//
+	// JGit doesn't do Agent forwarding, so there will never be any reason to
+	// add a PKCS11 key/token to an agent.
+	private class Pkcs11Identity extends KeyAgentIdentity {
+
+		Pkcs11Identity(PublicKey key, String alias) {
+			super(NULL_AGENT, key, alias);
+		}
+
+		@Override
+		public Entry<String, byte[]> sign(SessionContext session, String algo,
+				byte[] data) throws Exception {
+			// Find the built-in signature factory for the algorithm
+			BuiltinSignatures factory = BuiltinSignatures.fromFactoryName(algo);
+			// Get its Java signature algorithm name from that
+			String javaSignatureName = factory.create().getAlgorithm();
+			// We cannot use the Signature created by the factory -- we need a
+			// provider-specific Signature instance.
+			return new SimpleImmutableEntry<>(algo,
+					Pkcs11Provider.this.sign(session, javaSignatureName,
+							getComment(), data));
+		}
+	}
+}
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/pkcs11/SecurityCallback.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/pkcs11/SecurityCallback.java
new file mode 100644
index 0000000..334a8ca
--- /dev/null
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/pkcs11/SecurityCallback.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2023 Thomas Wolf <twolf@apache.org> and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.transport.sshd.pkcs11;
+
+import static java.text.MessageFormat.format;
+import static org.apache.sshd.core.CoreModuleProperties.PASSWORD_PROMPTS;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.function.Supplier;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.ChoiceCallback;
+import javax.security.auth.callback.ConfirmationCallback;
+import javax.security.auth.callback.LanguageCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.TextInputCallback;
+import javax.security.auth.callback.TextOutputCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+import org.apache.sshd.common.session.SessionContext;
+import org.eclipse.jgit.internal.transport.sshd.AuthenticationCanceledException;
+import org.eclipse.jgit.internal.transport.sshd.JGitClientSession;
+import org.eclipse.jgit.internal.transport.sshd.SshdText;
+import org.eclipse.jgit.transport.CredentialItem;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.transport.URIish;
+import org.eclipse.jgit.transport.sshd.KeyPasswordProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A bridge to the JGit {@link CredentialsProvider}.
+ */
+public class SecurityCallback implements CallbackHandler {
+
+	private static final Logger LOG = LoggerFactory
+			.getLogger(SecurityCallback.class);
+
+	private final URIish uri;
+
+	private KeyPasswordProvider passwordProvider;
+
+	private CredentialsProvider credentialsProvider;
+
+	private int attempts = 0;
+
+	/**
+	 * Creates a new {@link SecurityCallback}.
+	 *
+	 * @param uri
+	 *            {@link URIish} identifying the item the interaction is about
+	 */
+	public SecurityCallback(URIish uri) {
+		this.uri = uri;
+	}
+
+	/**
+	 * Initializes this {@link SecurityCallback} for the given session.
+	 *
+	 * @param session
+	 *            {@link SessionContext} of the keystore access
+	 * @return the number of PIN prompts to try to log-in to the token
+	 */
+	public int init(SessionContext session) {
+		int numberOfAttempts = PASSWORD_PROMPTS.getRequired(session).intValue();
+		Supplier<KeyPasswordProvider> factory = session
+				.getAttribute(JGitClientSession.KEY_PASSWORD_PROVIDER_FACTORY);
+		if (factory == null) {
+			passwordProvider = null;
+		} else {
+			passwordProvider = factory.get();
+			passwordProvider.setAttempts(numberOfAttempts);
+		}
+		attempts = 0;
+		if (session instanceof JGitClientSession) {
+			credentialsProvider = ((JGitClientSession) session)
+					.getCredentialsProvider();
+		} else {
+			credentialsProvider = null;
+		}
+		return numberOfAttempts;
+	}
+
+	/**
+	 * Tells this {@link SecurityCallback} that an attempt to load something
+	 * from the key store has been made.
+	 *
+	 * @param error
+	 *            an {@link Exception} that may have occurred, or {@code null}
+	 *            on success
+	 * @return whether to try once more
+	 * @throws IOException
+	 *             on errors
+	 * @throws GeneralSecurityException
+	 *             on errors
+	 */
+	public boolean passwordTried(Exception error)
+			throws IOException, GeneralSecurityException {
+		if (attempts > 0 && passwordProvider != null) {
+			return passwordProvider.keyLoaded(uri, attempts, error);
+		}
+		return true;
+	}
+
+	@Override
+	public void handle(Callback[] callbacks)
+			throws IOException, UnsupportedCallbackException {
+		if (callbacks.length == 1 && callbacks[0] instanceof PasswordCallback
+				&& passwordProvider != null) {
+			PasswordCallback p = (PasswordCallback) callbacks[0];
+			char[] password = passwordProvider.getPassphrase(uri, attempts++);
+			if (password == null || password.length == 0) {
+				throw new AuthenticationCanceledException();
+			}
+			p.setPassword(password);
+			Arrays.fill(password, '\0');
+		} else {
+			handleGeneral(callbacks);
+		}
+	}
+
+	private void handleGeneral(Callback[] callbacks)
+			throws UnsupportedCallbackException {
+		List<CredentialItem> items = new ArrayList<>();
+		List<Runnable> updaters = new ArrayList<>();
+		for (int i = 0; i < callbacks.length; i++) {
+			Callback c = callbacks[i];
+			if (c instanceof TextOutputCallback) {
+				TextOutputCallback t = (TextOutputCallback) c;
+				String msg = getText(t.getMessageType(), t.getMessage());
+				if (credentialsProvider == null) {
+					LOG.warn("{}", format(SshdText.get().pkcs11GeneralMessage, //$NON-NLS-1$
+							uri, msg));
+				} else {
+					CredentialItem.InformationalMessage item =
+							new CredentialItem.InformationalMessage(msg);
+					items.add(item);
+				}
+			} else if (c instanceof TextInputCallback) {
+				if (credentialsProvider == null) {
+					throw new UnsupportedOperationException(
+							"No CredentialsProvider " + uri); //$NON-NLS-1$
+				}
+				TextInputCallback t = (TextInputCallback) c;
+				CredentialItem.StringType item = new CredentialItem.StringType(
+						t.getPrompt(), false);
+				String defaultValue = t.getDefaultText();
+				if (defaultValue != null) {
+					item.setValue(defaultValue);
+				}
+				items.add(item);
+				updaters.add(() -> t.setText(item.getValue()));
+			} else if (c instanceof PasswordCallback) {
+				if (credentialsProvider == null) {
+					throw new UnsupportedOperationException(
+							"No CredentialsProvider " + uri); //$NON-NLS-1$
+				}
+				// It appears that this is actually the only callback item we
+				// get from the KeyStore when it asks for the PIN.
+				PasswordCallback p = (PasswordCallback) c;
+				CredentialItem.Password item = new CredentialItem.Password(
+						p.getPrompt());
+				items.add(item);
+				updaters.add(() -> {
+					char[] password = item.getValue();
+					if (password == null || password.length == 0) {
+						throw new AuthenticationCanceledException();
+					}
+					p.setPassword(password);
+					item.clear();
+				});
+			} else if (c instanceof ConfirmationCallback) {
+				if (credentialsProvider == null) {
+					throw new UnsupportedOperationException(
+							"No CredentialsProvider " + uri); //$NON-NLS-1$
+				}
+				// JGit has only limited support for this
+				ConfirmationCallback conf = (ConfirmationCallback) c;
+				int options = conf.getOptionType();
+				int defaultOption = conf.getDefaultOption();
+				CredentialItem.YesNoType item = new CredentialItem.YesNoType(
+						getText(conf.getMessageType(), conf.getPrompt()));
+				switch (options) {
+				case ConfirmationCallback.YES_NO_OPTION:
+					if (defaultOption == ConfirmationCallback.YES) {
+						item.setValue(true);
+					}
+					updaters.add(() -> conf.setSelectedIndex(
+							item.getValue() ? ConfirmationCallback.YES
+									: ConfirmationCallback.NO));
+					break;
+				case ConfirmationCallback.OK_CANCEL_OPTION:
+					if (defaultOption == ConfirmationCallback.OK) {
+						item.setValue(true);
+					}
+					updaters.add(() -> conf.setSelectedIndex(
+							item.getValue() ? ConfirmationCallback.OK
+									: ConfirmationCallback.CANCEL));
+					break;
+				default:
+					throw new UnsupportedCallbackException(c);
+				}
+				items.add(item);
+			} else if (c instanceof ChoiceCallback) {
+				// TODO: implement? Information for the prompt, and individual
+				// YesNoItems for the choices? Might be better to hoist JGit
+				// onto the CallbackHandler interface directly, or add support
+				// for choices.
+				throw new UnsupportedCallbackException(c);
+			} else if (c instanceof LanguageCallback) {
+				((LanguageCallback) c).setLocale(Locale.getDefault());
+			} else {
+				throw new UnsupportedCallbackException(c);
+			}
+		}
+		if (!items.isEmpty()) {
+			if (credentialsProvider.get(uri, items)) {
+				updaters.forEach(Runnable::run);
+			} else {
+				throw new AuthenticationCanceledException();
+			}
+		}
+	}
+
+	private String getText(int messageType, String text) {
+		if (messageType == TextOutputCallback.WARNING) {
+			return format(SshdText.get().pkcs11Warning, text);
+		} else if (messageType == TextOutputCallback.ERROR) {
+			return format(SshdText.get().pkcs11Error, text);
+		}
+		return text;
+	}
+}
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/IdentityPasswordProvider.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/IdentityPasswordProvider.java
index 807bda8..23f46d8 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/IdentityPasswordProvider.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/IdentityPasswordProvider.java
@@ -247,7 +247,9 @@ protected void cancelAuthentication() {
 	 *            the attempt result - {@code null} for success
 	 * @return how to proceed in case of error
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws GeneralSecurityException
+	 *             something went wrong
 	 */
 	protected boolean keyLoaded(URIish uri,
 			State state, char[] password, Exception err)
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/KeyPasswordProvider.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/KeyPasswordProvider.java
index ed9fe37..a80a5d1 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/KeyPasswordProvider.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/KeyPasswordProvider.java
@@ -77,7 +77,9 @@ default int getAttempts() {
 	 *         {@code error} exception; Ignored if the key was loaded
 	 *         successfully, i.e., if {@code error == null}.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws GeneralSecurityException
+	 *             something went wrong
 	 */
 	boolean keyLoaded(URIish uri, int attempt, Exception error)
 			throws IOException, GeneralSecurityException;
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSessionFactory.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSessionFactory.java
index 7798b80..35c9be0 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSessionFactory.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSessionFactory.java
@@ -210,11 +210,12 @@ public SshdSession getSession(URIish uri,
 						home, sshDir);
 				KeyIdentityProvider defaultKeysProvider = toKeyIdentityProvider(
 						getDefaultKeys(sshDir));
+				Supplier<KeyPasswordProvider> keyPasswordProvider = () -> createKeyPasswordProvider(
+						credentialsProvider);
 				SshClient client = ClientBuilder.builder()
 						.factory(JGitSshClient::new)
 						.filePasswordProvider(createFilePasswordProvider(
-								() -> createKeyPasswordProvider(
-										credentialsProvider)))
+								keyPasswordProvider))
 						.hostConfigEntryResolver(configFile)
 						.serverKeyVerifier(new JGitServerKeyVerifier(
 								getServerKeyDatabase(home, sshDir)))
@@ -236,6 +237,7 @@ public SshdSession getSession(URIish uri,
 				jgitClient.setKeyCache(getKeyCache());
 				jgitClient.setCredentialsProvider(credentialsProvider);
 				jgitClient.setProxyDatabase(proxies);
+				jgitClient.setKeyPasswordProviderFactory(keyPasswordProvider);
 				String defaultAuths = getDefaultPreferredAuthentications();
 				if (defaultAuths != null) {
 					jgitClient.setAttribute(
@@ -386,7 +388,7 @@ protected File getSshConfig(@NonNull File sshDir) {
 	}
 
 	/**
-	 * Obtains a {@link SshConfigStore}, or {@code null} if not SSH config is to
+	 * Obtains a {@link SshConfigStore}, or {@code null} if no SSH config is to
 	 * be used. The default implementation returns {@code null} if
 	 * {@code configFile == null} and otherwise an OpenSSH-compatible store
 	 * reading host entries from the given file.
@@ -471,6 +473,7 @@ protected ConnectorFactory getConnectorFactory() {
 	 * {@code UserKnownHostsFile} overrides this default.
 	 *
 	 * @param sshDir
+	 *            directory containing ssh configurations
 	 * @return the possibly empty list of default known host file paths.
 	 */
 	@NonNull
diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/agent/Connector.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/agent/Connector.java
index d8dfbfc..b391cf4 100644
--- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/agent/Connector.java
+++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/agent/Connector.java
@@ -26,7 +26,7 @@ public interface Connector extends Closeable {
 	 * connected just returns {@code true}.
 	 *
 	 * @return {@code true} if an SSH agent is available and connected,
-	 *         {@false} if no SSH agent is available
+	 *         {@code false} if no SSH agent is available
 	 * @throws IOException
 	 *             if connecting to the SSH agent failed
 	 */
diff --git a/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
index e3a88fd..2bd03f0 100644
--- a/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
@@ -3,18 +3,18 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ssh.jsch.test
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: com.jcraft.jsch;version="[0.1.54,0.2.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit.ssh;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.ssh.jsch;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit.ssh;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.ssh.jsch;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
  org.hamcrest;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
  org.junit.experimental.theories;version="[4.13,5.0.0)",
diff --git a/org.eclipse.jgit.ssh.jsch.test/pom.xml b/org.eclipse.jgit.ssh.jsch.test/pom.xml
index b246b2b..ed12327 100644
--- a/org.eclipse.jgit.ssh.jsch.test/pom.xml
+++ b/org.eclipse.jgit.ssh.jsch.test/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.jsch.test</artifactId>
diff --git a/org.eclipse.jgit.ssh.jsch/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.ssh.jsch/.settings/org.eclipse.jdt.core.prefs
index d1f54bb..d5c0e6c 100644
--- a/org.eclipse.jgit.ssh.jsch/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.ssh.jsch/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
index 537d42c..d015d77 100644
--- a/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch/META-INF/MANIFEST.MF
@@ -3,19 +3,19 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ssh.jsch
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch;singleton:=true
-Fragment-Host: org.eclipse.jgit;bundle-version="[6.6.1,6.7.0)"
+Fragment-Host: org.eclipse.jgit;bundle-version="[6.7.0,6.8.0)"
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Export-Package: org.eclipse.jgit.transport.ssh.jsch;version="6.6.1"
+Export-Package: org.eclipse.jgit.transport.ssh.jsch;version="6.7.0"
 Import-Package: com.jcraft.jsch;version="[0.1.37,0.2.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.io;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.io;version="[6.7.0,6.8.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
diff --git a/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
index d313a03..7c962b1 100644
--- a/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ssh.jsch - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ssh.jsch.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ssh.jsch;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ssh.jsch;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ssh.jsch/pom.xml b/org.eclipse.jgit.ssh.jsch/pom.xml
index 75e95ba..2525f10 100644
--- a/org.eclipse.jgit.ssh.jsch/pom.xml
+++ b/org.eclipse.jgit.ssh.jsch/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ssh.jsch</artifactId>
diff --git a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/internal/transport/ssh/jsch/CredentialsProviderUserInfo.java b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/internal/transport/ssh/jsch/CredentialsProviderUserInfo.java
index 5053493..b40ff5a 100644
--- a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/internal/transport/ssh/jsch/CredentialsProviderUserInfo.java
+++ b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/internal/transport/ssh/jsch/CredentialsProviderUserInfo.java
@@ -59,19 +59,16 @@ private static URIish createURI(Session session) {
 		return uri;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getPassword() {
 		return password;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getPassphrase() {
 		return passphrase;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean promptPassphrase(String msg) {
 		CredentialItem.StringType v = newPrompt(msg);
@@ -83,7 +80,6 @@ public boolean promptPassphrase(String msg) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean promptPassword(String msg) {
 		CredentialItem.Password p = new CredentialItem.Password(msg);
@@ -99,20 +95,17 @@ private CredentialItem.StringType newPrompt(String msg) {
 		return new CredentialItem.StringType(msg, true);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean promptYesNo(String msg) {
 		CredentialItem.YesNoType v = new CredentialItem.YesNoType(msg);
 		return provider.get(uri, v) && v.getValue();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void showMessage(String msg) {
 		provider.get(uri, new CredentialItem.InformationalMessage(msg));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String[] promptKeyboardInteractive(String destination, String name,
 			String instruction, String[] prompt, boolean[] echo) {
diff --git a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschConfigSessionFactory.java b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschConfigSessionFactory.java
index 77b68bb..325d054 100644
--- a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschConfigSessionFactory.java
+++ b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschConfigSessionFactory.java
@@ -92,7 +92,6 @@ public class JschConfigSessionFactory extends SshSessionFactory {
 
 	private OpenSshConfig config;
 
-	/** {@inheritDoc} */
 	@Override
 	public synchronized RemoteSession getSession(URIish uri,
 			CredentialsProvider credentialsProvider, FS fs, int tms)
@@ -189,14 +188,22 @@ private static boolean isAuthenticationCanceled(JSchException e) {
 	 * Use for tests only
 	 *
 	 * @param credentialsProvider
+	 *            credentials provide
 	 * @param fs
+	 *            FS object to use
 	 * @param user
+	 *            user
 	 * @param pass
+	 *            password
 	 * @param host
+	 *            host name
 	 * @param port
+	 *            port number
 	 * @param hc
-	 * @return session
+	 *            host config
+	 * @return session the session
 	 * @throws JSchException
+	 *             jsch failed
 	 */
 	public Session createSession(CredentialsProvider credentialsProvider,
 			FS fs, String user, final String pass, String host, int port,
diff --git a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschSession.java b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschSession.java
index 02cdf70..5f36dad 100644
--- a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschSession.java
+++ b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/JschSession.java
@@ -68,20 +68,17 @@ public JschSession(Session session, URIish uri) {
 		this.uri = uri;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Process exec(String command, int timeout) throws IOException {
 		return exec(command, Collections.emptyMap(), timeout);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Process exec(String command, Map<String, String> environment,
 			int timeout) throws IOException {
 		return new JschProcess(command, environment, timeout);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void disconnect() {
 		if (sock.isConnected())
diff --git a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/OpenSshConfig.java b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/OpenSshConfig.java
index 2873307..087e546 100644
--- a/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/OpenSshConfig.java
+++ b/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/ssh/jsch/OpenSshConfig.java
@@ -353,7 +353,6 @@ public Config getConfig(String hostName) {
 		return host.getConfig();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "OpenSshConfig [configFile=" + configFile + ']'; //$NON-NLS-1$
diff --git a/org.eclipse.jgit.test/BUILD b/org.eclipse.jgit.test/BUILD
index 5066808..bb15de0 100644
--- a/org.eclipse.jgit.test/BUILD
+++ b/org.eclipse.jgit.test/BUILD
@@ -29,6 +29,7 @@
     "transport/ObjectIdMatcher.java",
     "transport/RequestValidatorTestCase.java",
     "transport/SpiTransport.java",
+    "transport/InMemoryPack.java",
     "treewalk/filter/AlwaysCloneTreeFilter.java",
     "test/resources/SampleDataRepositoryTestCase.java",
     "util/CPUTimeStopWatch.java",
@@ -76,6 +77,7 @@
     resources = DATA,
     deps = [
         "//lib:assertj-core",
+        "//lib:commons-codec",
         "//lib:junit",
         "//lib:mockito",
         "//lib:slf4j-simple",
diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
index 9a807ae..d4d84bc 100644
--- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
@@ -3,11 +3,12 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.test
 Bundle-SymbolicName: org.eclipse.jgit.test
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
+ net.bytebuddy.agent;version="[1.9.0,2.0.0)",
  net.bytebuddy.dynamic.loading;version="[1.9.0,2.0.0)",
  org.apache.commons.compress.archivers;version="[1.15.0,2.0)",
  org.apache.commons.compress.archivers.tar;version="[1.15.0,2.0)",
@@ -16,64 +17,64 @@
  org.apache.commons.compress.compressors.gzip;version="[1.15.0,2.0)",
  org.apache.commons.compress.compressors.xz;version="[1.15.0,2.0)",
  org.assertj.core.api;version="[3.14.0,4.0.0)",
- org.eclipse.jgit.annotations;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.api.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.archive;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.attributes;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.awtui;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.blame;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.diff;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.dircache;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.events;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.fnmatch;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.gitrepo;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.hooks;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.ignore;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.ignore.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.diff;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.diffmergetool;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.fsck;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.commitgraph;version="6.6.1",
- org.eclipse.jgit.internal.storage.dfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.io;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.memory;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.pack;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.connectivity;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.parser;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.internal.transport.ssh;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.junit.time;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lfs;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.logging;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.merge;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.notes;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.patch;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.pgm;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.pgm.internal;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revplot;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.file;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.storage.pack;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.submodule;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.http;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport.resolver;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.treewalk.filter;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.io;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util.sha1;version="[6.6.1,6.7.0)",
+ org.eclipse.jgit.annotations;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.api.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.archive;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.attributes;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.awtui;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.blame;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.diff;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.dircache;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.events;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.fnmatch;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.gitrepo;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.hooks;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.ignore;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.ignore.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.diff;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.diffmergetool;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.fsck;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.commitgraph;version="6.7.0",
+ org.eclipse.jgit.internal.storage.dfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.io;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.memory;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.connectivity;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.parser;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.internal.transport.ssh;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.junit.time;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lfs;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.logging;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.merge;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.notes;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.patch;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.pgm;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.pgm.internal;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revplot;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.file;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.storage.pack;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.submodule;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.http;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport.resolver;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.treewalk.filter;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.io;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util.sha1;version="[6.7.0,6.8.0)",
  org.hamcrest;version="[1.1.0,3.0.0)",
  org.hamcrest.collection;version="[1.1.0,3.0.0)",
  org.junit;version="[4.13,5.0.0)",
@@ -82,10 +83,10 @@
  org.junit.rules;version="[4.13,5.0.0)",
  org.junit.runner;version="[4.13,5.0.0)",
  org.junit.runners;version="[4.13,5.0.0)",
- org.mockito;version="[4.8.0,5.0.0)",
- org.mockito.invocation;version="[4.8.0,5.0.0)",
- org.mockito.junit;version="[4.8.0,5.0.0)",
- org.mockito.stubbing;version="[4.8.0,5.0.0)",
+ org.mockito;version="[5.4.0,6.0.0)",
+ org.mockito.invocation;version="[5.4.0,6.0.0)",
+ org.mockito.junit;version="[5.4.0,6.0.0)",
+ org.mockito.stubbing;version="[5.4.0,6.0.0)",
  org.objenesis;version="[3.3.0,4.0.0)",
  org.slf4j;version="[1.7.0,2.0.0)",
  org.tukaani.xz
diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml
index d4f339d..f732259 100644
--- a/org.eclipse.jgit.test/pom.xml
+++ b/org.eclipse.jgit.test/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.test</artifactId>
@@ -73,7 +73,7 @@
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
-      <version>4.8.1</version>
+      <version>5.4.0</version>
     </dependency>
 
     <dependency>
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.corrupt.rev b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.corrupt.rev
new file mode 100644
index 0000000..74283a2
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.corrupt.rev
Binary files differ
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.rev b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.rev
new file mode 100644
index 0000000..6ac7d65
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.rev
Binary files differ
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
index 411eab3..3a4ea8e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
@@ -254,7 +254,7 @@ private void archiveHeadAllFiles(String fmt) throws Exception {
 		}
 	}
 
-	@SuppressWarnings({ "serial", "boxing" })
+	@SuppressWarnings({ "boxing" })
 	private void archiveHeadAllFilesWithCompression(String fmt) throws Exception {
 		try (Git git = new Git(db)) {
 			createLargeTestContent(git);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java
index ff5f8b7..70e990d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PushCommandTest.java
@@ -941,7 +941,7 @@ public void testPushDefaultFromConfigDefault() throws Exception {
 	}
 
 	/**
-	 * Check that branch.<name>.pushRemote overrides anything else.
+	 * Check that branch.&lt;name&gt;.pushRemote overrides anything else.
 	 *
 	 * @throws Exception
 	 */
@@ -980,7 +980,7 @@ public void testBranchPushRemote() throws Exception {
 	}
 
 	/**
-	 * Check that remote.pushDefault overrides branch.<name>.remote
+	 * Check that remote.pushDefault overrides branch.&lt;name&gt;.remote
 	 *
 	 * @throws Exception
 	 */
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java
index 05a953e..ab08c99 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java
@@ -20,14 +20,18 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 
+import org.eclipse.jgit.junit.MockSystemReader;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.treewalk.FileTreeIterator;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.WorkingTreeIterator;
+import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.FileUtils;
 import org.eclipse.jgit.util.SystemReader;
 import org.junit.After;
@@ -698,6 +702,110 @@ public void testTrailingSpaces() throws IOException {
 	}
 
 	@Test
+	public void testUserGitIgnoreFound() throws IOException {
+		File homeDir = FS.DETECTED.userHome();
+		Path userIgnore = homeDir.toPath().resolve(".config").resolve("git")
+				.resolve("ignore");
+		Files.createDirectories(userIgnore.getParent());
+		Files.writeString(userIgnore, "x");
+		try {
+			writeTrashFile(".foo", "");
+			writeTrashFile("a/x/file", "");
+			writeTrashFile("b/x", "");
+			writeTrashFile("x/file", "");
+
+			beginWalk();
+			assertEntry(F, tracked, ".foo");
+			assertEntry(D, tracked, "a");
+			assertEntry(D, ignored, "a/x");
+			assertEntry(F, ignored, "a/x/file");
+			assertEntry(D, tracked, "b");
+			assertEntry(F, ignored, "b/x");
+			assertEntry(D, ignored, "x");
+			assertEntry(F, ignored, "x/file");
+			endWalk();
+		} finally {
+			Files.deleteIfExists(userIgnore);
+		}
+	}
+
+	@Test
+	public void testXdgIgnoreFound() throws IOException {
+		File tmp = getTemporaryDirectory();
+		Path xdg = tmp.toPath().resolve("xdg");
+		Path userIgnore = xdg.resolve("git").resolve("ignore");
+		Files.createDirectories(userIgnore.getParent());
+		Files.writeString(userIgnore, "x");
+		SystemReader system = SystemReader.getInstance();
+		assertTrue(system instanceof MockSystemReader);
+		((MockSystemReader) system).setProperty("XDG_CONFIG_HOME",
+				xdg.toAbsolutePath().toString());
+		// Also create the one in the home directory -- it should not be active
+		File homeDir = FS.DETECTED.userHome();
+		Path userIgnore2 = homeDir.toPath().resolve(".config").resolve("git")
+				.resolve("ignore");
+		Files.createDirectories(userIgnore2.getParent());
+		Files.writeString(userIgnore2, "a");
+		try {
+			writeTrashFile(".foo", "");
+			writeTrashFile("a/x/file", "");
+			writeTrashFile("b/x", "");
+			writeTrashFile("x/file", "");
+
+			beginWalk();
+			assertEntry(F, tracked, ".foo");
+			assertEntry(D, tracked, "a");
+			assertEntry(D, ignored, "a/x");
+			assertEntry(F, ignored, "a/x/file");
+			assertEntry(D, tracked, "b");
+			assertEntry(F, ignored, "b/x");
+			assertEntry(D, ignored, "x");
+			assertEntry(F, ignored, "x/file");
+			endWalk();
+		} finally {
+			((MockSystemReader) system).setProperty("XDG_CONFIG_HOME", null);
+			Files.deleteIfExists(userIgnore2);
+		}
+	}
+
+	@Test
+	public void testXdgWrong() throws IOException {
+		File tmp = getTemporaryDirectory();
+		Path xdg = tmp.toPath().resolve("xdg");
+		SystemReader system = SystemReader.getInstance();
+		assertTrue(system instanceof MockSystemReader);
+		// Valid value, but the directory doesn't exist
+		((MockSystemReader) system).setProperty("XDG_CONFIG_HOME",
+				xdg.toAbsolutePath().toString());
+		// Also create the one in the home directory -- it should not be active
+		File homeDir = FS.DETECTED.userHome();
+		Path userIgnore2 = homeDir.toPath().resolve(".config").resolve("git")
+				.resolve("ignore");
+		Files.createDirectories(userIgnore2.getParent());
+		Files.writeString(userIgnore2, "x");
+		try {
+			writeTrashFile(".foo", "");
+			writeTrashFile("a/x/file", "");
+			writeTrashFile("b/x", "");
+			writeTrashFile("x/file", "");
+
+			beginWalk();
+			assertEntry(F, tracked, ".foo");
+			assertEntry(D, tracked, "a");
+			assertEntry(D, tracked, "a/x");
+			assertEntry(F, tracked, "a/x/file");
+			assertEntry(D, tracked, "b");
+			assertEntry(F, tracked, "b/x");
+			assertEntry(D, tracked, "x");
+			assertEntry(F, tracked, "x/file");
+			endWalk();
+		} finally {
+			((MockSystemReader) system).setProperty("XDG_CONFIG_HOME", null);
+			Files.deleteIfExists(userIgnore2);
+		}
+	}
+
+	@Test
 	public void testToString() throws Exception {
 		assertEquals(Arrays.asList("").toString(), new IgnoreNode().toString());
 		assertEquals(Arrays.asList("hello").toString(),
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ObjectReachabilityTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ObjectReachabilityTestCase.java
index 37ff40b..0e73588 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ObjectReachabilityTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ObjectReachabilityTestCase.java
@@ -51,7 +51,6 @@ protected static class AddressableRevCommit {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Before
 	public void setUp() throws Exception {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ReachabilityCheckerTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ReachabilityCheckerTestCase.java
index 7679c11..eeb13cc 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ReachabilityCheckerTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/revwalk/ReachabilityCheckerTestCase.java
@@ -32,7 +32,6 @@ protected abstract ReachabilityChecker getChecker(
 
 	TestRepository<FileRepository> repo;
 
-	/** {@inheritDoc} */
 	@Override
 	@Before
 	public void setUp() throws Exception {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphTest.java
index 9797656..4d05360 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphTest.java
@@ -10,24 +10,31 @@
 
 package org.eclipse.jgit.internal.storage.commitgraph;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.lib.Constants.COMMIT_GENERATION_UNKNOWN;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -45,6 +52,7 @@ public class CommitGraphTest extends RepositoryTestCase {
 	public void setUp() throws Exception {
 		super.setUp();
 		tr = new TestRepository<>(db, new RevWalk(db), mockSystemReader);
+		mockSystemReader.setJGitConfig(new MockConfig());
 	}
 
 	@Test
@@ -196,11 +204,32 @@ public void testGraphWithMerges() throws Exception {
 		assertEquals(getGenerationNumber(c8), 5);
 	}
 
+	@Test
+	public void testGraphComputeChangedPaths() throws Exception {
+		RevCommit a = tr.commit(tr.tree(tr.file("d/f", tr.blob("a"))));
+		RevCommit b = tr.commit(tr.tree(tr.file("d/f", tr.blob("a"))), a);
+		RevCommit c = tr.commit(tr.tree(tr.file("d/f", tr.blob("b"))), b);
+
+		writeAndReadCommitGraph(Collections.singleton(c));
+		ChangedPathFilter acpf = commitGraph
+				.getChangedPathFilter(commitGraph.findGraphPosition(a));
+		assertTrue(acpf.maybeContains("d".getBytes(UTF_8)));
+		assertTrue(acpf.maybeContains("d/f".getBytes(UTF_8)));
+		ChangedPathFilter bcpf = commitGraph
+				.getChangedPathFilter(commitGraph.findGraphPosition(b));
+		assertFalse(bcpf.maybeContains("d".getBytes(UTF_8)));
+		assertFalse(bcpf.maybeContains("d/f".getBytes(UTF_8)));
+		ChangedPathFilter ccpf = commitGraph
+				.getChangedPathFilter(commitGraph.findGraphPosition(c));
+		assertTrue(ccpf.maybeContains("d".getBytes(UTF_8)));
+		assertTrue(ccpf.maybeContains("d/f".getBytes(UTF_8)));
+	}
+
 	void writeAndReadCommitGraph(Set<ObjectId> wants) throws Exception {
 		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
 		try (RevWalk walk = new RevWalk(db)) {
 			CommitGraphWriter writer = new CommitGraphWriter(
-					GraphCommits.fromWalk(m, wants, walk));
+					GraphCommits.fromWalk(m, wants, walk), true);
 			ByteArrayOutputStream os = new ByteArrayOutputStream();
 			writer.write(m, os);
 			InputStream inputStream = new ByteArrayInputStream(
@@ -252,4 +281,41 @@ int getGenerationNumber(ObjectId id) {
 	RevCommit commit(RevCommit... parents) throws Exception {
 		return tr.commit(parents);
 	}
+
+	private static final class MockConfig extends FileBasedConfig {
+		private MockConfig() {
+			super(null, null);
+		}
+
+		@Override
+		public void load() throws IOException, ConfigInvalidException {
+			// Do nothing
+		}
+
+		@Override
+		public void save() throws IOException {
+			// Do nothing
+		}
+
+		@Override
+		public boolean isOutdated() {
+			return false;
+		}
+
+		@Override
+		public String toString() {
+			return "MockConfig";
+		}
+
+		@Override
+		public boolean getBoolean(final String section, final String name,
+				final boolean defaultValue) {
+			if (section.equals(ConfigConstants.CONFIG_COMMIT_GRAPH_SECTION)
+					&& name.equals(
+							ConfigConstants.CONFIG_KEY_READ_CHANGED_PATHS)) {
+				return true;
+			}
+			return defaultValue;
+		}
+	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriterTest.java
index 6c5e5e5..5040a3b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriterTest.java
@@ -10,21 +10,31 @@
 
 package org.eclipse.jgit.internal.storage.commitgraph;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.internal.storage.file.GC;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevBlob;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.NB;
 import org.junit.Before;
 import org.junit.Test;
@@ -46,6 +56,7 @@ public void setUp() throws Exception {
 		os = new ByteArrayOutputStream();
 		tr = new TestRepository<>(db, new RevWalk(db), mockSystemReader);
 		walk = new RevWalk(db);
+		mockSystemReader.setJGitConfig(new MockConfig());
 	}
 
 	@Test
@@ -68,7 +79,7 @@ public void testWriterWithExtraEdgeList() throws Exception {
 		Set<ObjectId> wants = Collections.singleton(tip);
 		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
 		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
-		writer = new CommitGraphWriter(graphCommits);
+		writer = new CommitGraphWriter(graphCommits, true);
 		writer.write(m, os);
 
 		assertEquals(5, graphCommits.size());
@@ -76,11 +87,20 @@ public void testWriterWithExtraEdgeList() throws Exception {
 		assertTrue(data.length > 0);
 		byte[] headers = new byte[8];
 		System.arraycopy(data, 0, headers, 0, 8);
-		assertArrayEquals(new byte[] {'C', 'G', 'P', 'H', 1, 1, 4, 0}, headers);
-		assertEquals(CommitGraphConstants.CHUNK_ID_OID_FANOUT, NB.decodeInt32(data, 8));
-		assertEquals(CommitGraphConstants.CHUNK_ID_OID_LOOKUP, NB.decodeInt32(data, 20));
-		assertEquals(CommitGraphConstants.CHUNK_ID_COMMIT_DATA, NB.decodeInt32(data, 32));
-		assertEquals(CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST, NB.decodeInt32(data, 44));
+		assertArrayEquals(new byte[] { 'C', 'G', 'P', 'H', 1, 1, 6, 0 },
+				headers);
+		assertEquals(CommitGraphConstants.CHUNK_ID_OID_FANOUT,
+				NB.decodeInt32(data, 8));
+		assertEquals(CommitGraphConstants.CHUNK_ID_OID_LOOKUP,
+				NB.decodeInt32(data, 20));
+		assertEquals(CommitGraphConstants.CHUNK_ID_COMMIT_DATA,
+				NB.decodeInt32(data, 32));
+		assertEquals(CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST,
+				NB.decodeInt32(data, 44));
+		assertEquals(CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX,
+				NB.decodeInt32(data, 56));
+		assertEquals(CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA,
+				NB.decodeInt32(data, 68));
 	}
 
 	@Test
@@ -93,7 +113,7 @@ public void testWriterWithoutExtraEdgeList() throws Exception {
 		Set<ObjectId> wants = Collections.singleton(tip);
 		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
 		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
-		writer = new CommitGraphWriter(graphCommits);
+		writer = new CommitGraphWriter(graphCommits, true);
 		writer.write(m, os);
 
 		assertEquals(4, graphCommits.size());
@@ -101,13 +121,281 @@ public void testWriterWithoutExtraEdgeList() throws Exception {
 		assertTrue(data.length > 0);
 		byte[] headers = new byte[8];
 		System.arraycopy(data, 0, headers, 0, 8);
-		assertArrayEquals(new byte[] {'C', 'G', 'P', 'H', 1, 1, 3, 0}, headers);
-		assertEquals(CommitGraphConstants.CHUNK_ID_OID_FANOUT, NB.decodeInt32(data, 8));
-		assertEquals(CommitGraphConstants.CHUNK_ID_OID_LOOKUP, NB.decodeInt32(data, 20));
-		assertEquals(CommitGraphConstants.CHUNK_ID_COMMIT_DATA, NB.decodeInt32(data, 32));
+		assertArrayEquals(new byte[] { 'C', 'G', 'P', 'H', 1, 1, 5, 0 },
+				headers);
+		assertEquals(CommitGraphConstants.CHUNK_ID_OID_FANOUT,
+				NB.decodeInt32(data, 8));
+		assertEquals(CommitGraphConstants.CHUNK_ID_OID_LOOKUP,
+				NB.decodeInt32(data, 20));
+		assertEquals(CommitGraphConstants.CHUNK_ID_COMMIT_DATA,
+				NB.decodeInt32(data, 32));
+		assertEquals(CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX,
+				NB.decodeInt32(data, 44));
+		assertEquals(CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA,
+				NB.decodeInt32(data, 56));
+	}
+
+	static HashSet<String> changedPathStrings(byte[] data) {
+		int oidf_offset = -1;
+		int bidx_offset = -1;
+		int bdat_offset = -1;
+		for (int i = 8; i < data.length - 4; i += 12) {
+			switch (NB.decodeInt32(data, i)) {
+			case CommitGraphConstants.CHUNK_ID_OID_FANOUT:
+				oidf_offset = (int) NB.decodeInt64(data, i + 4);
+				break;
+			case CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX:
+				bidx_offset = (int) NB.decodeInt64(data, i + 4);
+				break;
+			case CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA:
+				bdat_offset = (int) NB.decodeInt64(data, i + 4);
+				break;
+			}
+		}
+		assertTrue(oidf_offset > 0);
+		assertTrue(bidx_offset > 0);
+		assertTrue(bdat_offset > 0);
+		bdat_offset += 12; // skip version, hash count, bits per entry
+		int commit_count = NB.decodeInt32(data, oidf_offset + 255 * 4);
+		int[] changed_path_length_cumuls = new int[commit_count];
+		for (int i = 0; i < commit_count; i++) {
+			changed_path_length_cumuls[i] = NB.decodeInt32(data,
+					bidx_offset + i * 4);
+		}
+		HashSet<String> changed_paths = new HashSet<>();
+		for (int i = 0; i < commit_count; i++) {
+			int prior_cumul = i == 0 ? 0 : changed_path_length_cumuls[i - 1];
+			String changed_path = "";
+			for (int j = prior_cumul; j < changed_path_length_cumuls[i]; j++) {
+				changed_path += data[bdat_offset + j] + ",";
+			}
+			changed_paths.add(changed_path);
+		}
+		return changed_paths;
+	}
+
+	/**
+	 * Expected value generated using the following:
+	 *
+	 * <pre>
+	 * # apply into git-repo: https://lore.kernel.org/git/cover.1684790529.git.jonathantanmy@google.com/
+	 * (cd git-repo; make)
+	 * git-repo/bin-wrappers/git init tested
+	 * (cd tested; touch foo.txt; mkdir -p onedir/twodir; touch onedir/twodir/bar.txt)
+	 * git-repo/bin-wrappers/git -C tested add foo.txt onedir
+	 * git-repo/bin-wrappers/git -C tested commit -m first_commit
+	 * (cd tested; mv foo.txt foo-new.txt; mv onedir/twodir/bar.txt onedir/twodir/bar-new.txt)
+	 * git-repo/bin-wrappers/git -C tested add foo-new.txt onedir
+	 * git-repo/bin-wrappers/git -C tested commit -a -m second_commit
+	 * git-repo/bin-wrappers/git -C tested maintenance run
+	 * git-repo/bin-wrappers/git -C tested commit-graph write --changed-paths
+	 * (cd tested; $JGIT debug-read-changed-path-filter .git/objects/info/commit-graph)
+	 * </pre>
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void testChangedPathFilterRootAndNested() throws Exception {
+		RevBlob emptyBlob = tr.blob(new byte[] {});
+		RevCommit root = tr.commit(tr.tree(tr.file("foo.txt", emptyBlob),
+				tr.file("onedir/twodir/bar.txt", emptyBlob)));
+		RevCommit tip = tr.commit(tr.tree(tr.file("foo-new.txt", emptyBlob),
+				tr.file("onedir/twodir/bar-new.txt", emptyBlob)), root);
+
+		Set<ObjectId> wants = Collections.singleton(tip);
+		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
+		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
+		writer = new CommitGraphWriter(graphCommits, true);
+		writer.write(m, os);
+
+		HashSet<String> changedPaths = changedPathStrings(os.toByteArray());
+		assertThat(changedPaths, containsInAnyOrder(
+				"109,-33,2,60,20,79,-11,116,",
+				"119,69,63,-8,0,"));
+	}
+
+	/**
+	 * Expected value generated using the following:
+	 *
+	 * <pre>
+	 * git -C git-repo checkout todo get version number when it is merged
+	 * (cd git-repo; make)
+	 * git-repo/bin-wrappers/git init tested
+	 * (cd tested; mkdir -p onedir/twodir; touch onedir/twodir/a.txt; touch onedir/twodir/b.txt)
+	 * git-repo/bin-wrappers/git -C tested add onedir
+	 * git-repo/bin-wrappers/git -C tested commit -m first_commit
+	 * (cd tested; mv onedir/twodir/a.txt onedir/twodir/c.txt; mv onedir/twodir/b.txt onedir/twodir/d.txt)
+	 * git-repo/bin-wrappers/git -C tested add onedir
+	 * git-repo/bin-wrappers/git -C tested commit -a -m second_commit
+	 * git-repo/bin-wrappers/git -C tested maintenance run
+	 * git-repo/bin-wrappers/git -C tested commit-graph write --changed-paths
+	 * (cd tested; $JGIT debug-read-changed-path-filter .git/objects/info/commit-graph)
+	 * </pre>
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void testChangedPathFilterOverlappingNested() throws Exception {
+		RevBlob emptyBlob = tr.blob(new byte[] {});
+		RevCommit root = tr
+				.commit(tr.tree(tr.file("onedir/twodir/a.txt", emptyBlob),
+						tr.file("onedir/twodir/b.txt", emptyBlob)));
+		RevCommit tip = tr
+				.commit(tr.tree(tr.file("onedir/twodir/c.txt", emptyBlob),
+						tr.file("onedir/twodir/d.txt", emptyBlob)), root);
+
+		Set<ObjectId> wants = Collections.singleton(tip);
+		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
+		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
+		writer = new CommitGraphWriter(graphCommits, true);
+		writer.write(m, os);
+
+		HashSet<String> changedPaths = changedPathStrings(os.toByteArray());
+		assertThat(changedPaths, containsInAnyOrder("61,30,23,-24,1,",
+				"-58,-51,-46,60,29,-121,113,90,"));
+	}
+
+	/**
+	 * Expected value generated using the following:
+	 *
+	 * <pre>
+	 * git -C git-repo checkout todo get version number when it is merged
+	 * (cd git-repo; make)
+	 * git-repo/bin-wrappers/git init tested
+	 * (cd tested; touch 你好)
+	 * git-repo/bin-wrappers/git -C tested add 你好
+	 * git-repo/bin-wrappers/git -C tested commit -m first_commit
+	 * git-repo/bin-wrappers/git -C tested maintenance run
+	 * git-repo/bin-wrappers/git -C tested commit-graph write --changed-paths
+	 * (cd tested; $JGIT debug-read-changed-path-filter .git/objects/info/commit-graph)
+	 * </pre>
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void testChangedPathFilterHighBit() throws Exception {
+		RevBlob emptyBlob = tr.blob(new byte[] {});
+		// tr.file encodes using UTF-8
+		RevCommit root = tr.commit(tr.tree(tr.file("你好", emptyBlob)));
+
+		Set<ObjectId> wants = Collections.singleton(root);
+		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
+		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
+		writer = new CommitGraphWriter(graphCommits, true);
+		writer.write(m, os);
+
+		HashSet<String> changedPaths = changedPathStrings(os.toByteArray());
+		assertThat(changedPaths, containsInAnyOrder("16,16,"));
+	}
+
+	@Test
+	public void testChangedPathFilterEmptyChange() throws Exception {
+		RevCommit root = commit();
+
+		Set<ObjectId> wants = Collections.singleton(root);
+		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
+		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
+		writer = new CommitGraphWriter(graphCommits, true);
+		writer.write(m, os);
+
+		HashSet<String> changedPaths = changedPathStrings(os.toByteArray());
+		assertThat(changedPaths, containsInAnyOrder("0,"));
+	}
+
+	@Test
+	public void testChangedPathFilterManyChanges() throws Exception {
+		RevBlob emptyBlob = tr.blob(new byte[] {});
+		DirCacheEntry[] entries = new DirCacheEntry[513];
+		for (int i = 0; i < entries.length; i++) {
+			entries[i] = tr.file(i + ".txt", emptyBlob);
+		}
+
+		RevCommit root = tr.commit(tr.tree(entries));
+
+		Set<ObjectId> wants = Collections.singleton(root);
+		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
+		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
+		writer = new CommitGraphWriter(graphCommits, true);
+		writer.write(m, os);
+
+		HashSet<String> changedPaths = changedPathStrings(os.toByteArray());
+		assertThat(changedPaths, containsInAnyOrder("-1,"));
+	}
+
+	@Test
+	public void testReuseBloomFilters() throws Exception {
+		RevBlob emptyBlob = tr.blob(new byte[] {});
+		RevCommit root = tr.commit(tr.tree(tr.file("foo.txt", emptyBlob),
+				tr.file("onedir/twodir/bar.txt", emptyBlob)));
+		tr.branch("master").update(root);
+
+		db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null,
+				ConfigConstants.CONFIG_COMMIT_GRAPH, true);
+		db.getConfig().setBoolean(ConfigConstants.CONFIG_GC_SECTION, null,
+				ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true);
+		db.getConfig().setBoolean(ConfigConstants.CONFIG_GC_SECTION, null,
+				ConfigConstants.CONFIG_KEY_WRITE_CHANGED_PATHS, true);
+		GC gc = new GC(db);
+		gc.gc().get();
+
+		RevCommit tip = tr.commit(tr.tree(tr.file("foo-new.txt", emptyBlob),
+				tr.file("onedir/twodir/bar-new.txt", emptyBlob)), root);
+
+		Set<ObjectId> wants = Collections.singleton(tip);
+		NullProgressMonitor m = NullProgressMonitor.INSTANCE;
+		GraphCommits graphCommits = GraphCommits.fromWalk(m, wants, walk);
+		writer = new CommitGraphWriter(graphCommits, true);
+		CommitGraphWriter.Stats stats = writer.write(m, os);
+
+		assertEquals(1, stats.getChangedPathFiltersReused());
+		assertEquals(1, stats.getChangedPathFiltersComputed());
+
+		// Expected strings are the same as in
+		// #testChangedPathFilterRootAndNested
+		HashSet<String> changedPaths = changedPathStrings(os.toByteArray());
+		assertThat(changedPaths, containsInAnyOrder(
+				"109,-33,2,60,20,79,-11,116,",
+				"119,69,63,-8,0,"));
 	}
 
 	RevCommit commit(RevCommit... parents) throws Exception {
 		return tr.commit(parents);
 	}
-}
+
+	private static final class MockConfig extends FileBasedConfig {
+		private MockConfig() {
+			super(null, null);
+		}
+
+		@Override
+		public void load() throws IOException, ConfigInvalidException {
+			// Do nothing
+		}
+
+		@Override
+		public void save() throws IOException {
+			// Do nothing
+		}
+
+		@Override
+		public boolean isOutdated() {
+			return false;
+		}
+
+		@Override
+		public String toString() {
+			return "MockConfig";
+		}
+
+		@Override
+		public boolean getBoolean(final String section, final String name,
+				final boolean defaultValue) {
+			if (section.equals(ConfigConstants.CONFIG_COMMIT_GRAPH_SECTION)
+					&& name.equals(
+							ConfigConstants.CONFIG_KEY_READ_CHANGED_PATHS)) {
+				return true;
+			}
+			return defaultValue;
+		}
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java
index ab99895..405e126 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java
@@ -15,6 +15,7 @@
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 
@@ -1100,6 +1101,70 @@ public void commitGraphWithoutGCrestPack() throws Exception {
 		}
 	}
 
+	@Test
+	public void objectSizeIdx_reachableBlob_bigEnough_indexed() throws Exception {
+		String master = "refs/heads/master";
+		RevCommit root = git.branch(master).commit().message("root").noParents()
+				.create();
+		RevBlob headsBlob = git.blob("twelve bytes");
+		git.branch(master).commit()
+				.message("commit on head")
+				.add("file.txt", headsBlob)
+				.parent(root)
+				.create();
+
+		gcWithObjectSizeIndex(10);
+
+		DfsReader reader = odb.newReader();
+		DfsPackFile gcPack = findFirstBySource(odb.getPacks(), GC);
+		assertTrue(gcPack.hasObjectSizeIndex(reader));
+		assertEquals(12, gcPack.getIndexedObjectSize(reader, headsBlob));
+	}
+
+	@Test
+	public void objectSizeIdx_reachableBlob_tooSmall_notIndexed() throws Exception {
+		String master = "refs/heads/master";
+		RevCommit root = git.branch(master).commit().message("root").noParents()
+				.create();
+		RevBlob tooSmallBlob = git.blob("small");
+		git.branch(master).commit()
+				.message("commit on head")
+				.add("small.txt", tooSmallBlob)
+				.parent(root)
+				.create();
+
+		gcWithObjectSizeIndex(10);
+
+		DfsReader reader = odb.newReader();
+		DfsPackFile gcPack = findFirstBySource(odb.getPacks(), GC);
+		assertTrue(gcPack.hasObjectSizeIndex(reader));
+		assertEquals(-1, gcPack.getIndexedObjectSize(reader, tooSmallBlob));
+	}
+
+	@Test
+	public void objectSizeIndex_unreachableGarbage_noIdx() throws Exception {
+		String master = "refs/heads/master";
+		RevCommit root = git.branch(master).commit().message("root").noParents()
+				.create();
+		git.branch(master).commit()
+				.message("commit on head")
+				.add("file.txt", git.blob("a blob"))
+				.parent(root)
+				.create();
+		git.update(master, root); // blob is unreachable
+		gcWithObjectSizeIndex(0);
+
+		DfsReader reader = odb.newReader();
+		DfsPackFile gcRestPack = findFirstBySource(odb.getPacks(), UNREACHABLE_GARBAGE);
+		assertFalse(gcRestPack.hasObjectSizeIndex(reader));
+	}
+
+	private static DfsPackFile findFirstBySource(DfsPackFile[] packs, PackSource source) {
+		return Arrays.stream(packs)
+				.filter(p -> p.getPackDescription().getPackSource() == source)
+				.findFirst().get();
+	}
+
 	private TestRepository<InMemoryRepository>.CommitBuilder commit() {
 		return git.commit();
 	}
@@ -1110,6 +1175,12 @@ private void gcWithCommitGraph() throws IOException {
 		run(gc);
 	}
 
+	private void gcWithObjectSizeIndex(int threshold) throws IOException {
+		DfsGarbageCollector gc = new DfsGarbageCollector(repo);
+		gc.getPackConfig().setMinBytesForObjSizeIndex(threshold);
+		run(gc);
+	}
+
 	private void gcNoTtl() throws IOException {
 		DfsGarbageCollector gc = new DfsGarbageCollector(repo);
 		gc.setGarbageTtl(0, TimeUnit.MILLISECONDS); // disable TTL
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java
index adf577b..b84a0b0 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java
@@ -10,6 +10,8 @@
 
 package org.eclipse.jgit.internal.storage.dfs;
 
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
@@ -29,11 +31,16 @@
 import org.eclipse.jgit.junit.JGitTestUtil;
 import org.eclipse.jgit.junit.TestRng;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import org.eclipse.jgit.lib.CommitBuilder;
 import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.TagBuilder;
+import org.eclipse.jgit.lib.TreeFormatter;
 import org.eclipse.jgit.util.IO;
 import org.eclipse.jgit.util.RawParseUtils;
 import org.junit.Before;
@@ -240,6 +247,71 @@ public void testNoCheckExisting() throws IOException {
 		}
 	}
 
+	@Test
+	public void testObjectSizePopulated() throws IOException {
+		// Blob
+		byte[] contents = Constants.encode("foo");
+
+		// Commit
+		PersonIdent person = new PersonIdent("Committer a", "jgit@eclipse.org");
+		CommitBuilder c = new CommitBuilder();
+		c.setAuthor(person);
+		c.setCommitter(person);
+		c.setTreeId(ObjectId
+				.fromString("45c4c6767a3945815371a7016532751dd558be40"));
+		c.setMessage("commit message");
+
+		// Tree
+		TreeFormatter treeBuilder = new TreeFormatter(2);
+		treeBuilder.append("filea", FileMode.REGULAR_FILE, ObjectId
+				.fromString("45c4c6767a3945815371a7016532751dd558be40"));
+		treeBuilder.append("fileb", FileMode.GITLINK, ObjectId
+				.fromString("1c458e25ca624bb8d4735bec1379a4a29ba786d0"));
+
+		// Tag
+		TagBuilder tagBuilder = new TagBuilder();
+		tagBuilder.setObjectId(
+				ObjectId.fromString("c97fe131649e80de55bd153e9a8d8629f7ca6932"),
+				Constants.OBJ_COMMIT);
+		tagBuilder.setTag("short name");
+
+		try (DfsInserter ins = (DfsInserter) db.newObjectInserter()) {
+			ObjectId aBlob = ins.insert(Constants.OBJ_BLOB, contents);
+			assertEquals(contents.length,
+					ins.objectMap.get(aBlob).getFullSize());
+
+			ObjectId aCommit = ins.insert(c);
+			assertEquals(174, ins.objectMap.get(aCommit).getFullSize());
+
+			ObjectId tree = ins.insert(treeBuilder);
+			assertEquals(66, ins.objectMap.get(tree).getFullSize());
+
+			ObjectId tag = ins.insert(tagBuilder);
+			assertEquals(76, ins.objectMap.get(tag).getFullSize());
+		}
+	}
+
+	@Test
+	public void testObjectSizeIndexOnInsert() throws IOException {
+		db.getConfig().setInt(CONFIG_PACK_SECTION, null,
+				CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX, 0);
+
+		byte[] contents = Constants.encode("foo");
+		ObjectId fooId;
+		try (ObjectInserter ins = db.newObjectInserter()) {
+			fooId = ins.insert(Constants.OBJ_BLOB, contents);
+			ins.flush();
+		}
+
+		DfsReader reader = db.getObjectDatabase().newReader();
+		assertEquals(1, db.getObjectDatabase().listPacks().size());
+		DfsPackFile insertPack = db.getObjectDatabase().getPacks()[0];
+		assertEquals(PackSource.INSERT,
+				insertPack.getPackDescription().getPackSource());
+		assertTrue(insertPack.hasObjectSizeIndex(reader));
+		assertEquals(contents.length, insertPack.getIndexedObjectSize(reader, fooId));
+	}
+
 	private static String readString(ObjectLoader loader) throws IOException {
 		return RawParseUtils.decode(readStream(loader));
 	}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackFileTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackFileTest.java
index ea57873..298812d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackFileTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackFileTest.java
@@ -10,7 +10,11 @@
 
 package org.eclipse.jgit.internal.storage.dfs;
 
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -23,6 +27,7 @@
 import org.eclipse.jgit.junit.TestRng;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -100,7 +105,32 @@ public void testCopyPackThroughCacheLargeNoCache() throws IOException {
 		assertPackSize();
 	}
 
-	private void setupPack(int bs, int ps) throws IOException {
+	@Test
+	public void testLoadObjectSizeIndex() throws IOException {
+		bypassCache = false;
+		clearCache = true;
+		setObjectSizeIndexMinBytes(0);
+		ObjectId blobId = setupPack(512, 800);
+
+		DfsReader reader = db.getObjectDatabase().newReader();
+		DfsPackFile pack = db.getObjectDatabase().getPacks()[0];
+		assertTrue(pack.hasObjectSizeIndex(reader));
+		assertEquals(800, pack.getIndexedObjectSize(reader, blobId));
+	}
+
+	@Test
+	public void testLoadObjectSizeIndex_noIndex() throws IOException {
+		bypassCache = false;
+		clearCache = true;
+		setObjectSizeIndexMinBytes(-1);
+		setupPack(512, 800);
+
+		DfsReader reader = db.getObjectDatabase().newReader();
+		DfsPackFile pack = db.getObjectDatabase().getPacks()[0];
+		assertFalse(pack.hasObjectSizeIndex(reader));
+	}
+
+	private ObjectId setupPack(int bs, int ps) throws IOException {
 		DfsBlockCacheConfig cfg = new DfsBlockCacheConfig().setBlockSize(bs)
 				.setBlockLimit(bs * 100).setStreamRatio(bypassCache ? 0F : 1F);
 		DfsBlockCache.reconfigure(cfg);
@@ -108,13 +138,14 @@ private void setupPack(int bs, int ps) throws IOException {
 		byte[] data = new TestRng(JGitTestUtil.getName()).nextBytes(ps);
 		DfsInserter ins = (DfsInserter) db.newObjectInserter();
 		ins.setCompressionLevel(Deflater.NO_COMPRESSION);
-		ins.insert(Constants.OBJ_BLOB, data);
+		ObjectId blobId = ins.insert(Constants.OBJ_BLOB, data);
 		ins.flush();
 
 		if (clearCache) {
 			DfsBlockCache.reconfigure(cfg);
 			db.getObjectDatabase().clearCache();
 		}
+		return blobId;
 	}
 
 	private void assertPackSize() throws IOException {
@@ -129,4 +160,9 @@ private void assertPackSize() throws IOException {
 			assertEquals(packSize - (12 + 20), os.size());
 		}
 	}
+
+	private void setObjectSizeIndexMinBytes(int threshold) {
+		db.getConfig().setInt(CONFIG_PACK_SECTION, null,
+				CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX, threshold);
+	}
 }
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
new file mode 100644
index 0000000..845d5fc
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsPackParserTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2023, Google LLC and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.storage.dfs;
+
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackList;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.transport.InMemoryPack;
+import org.eclipse.jgit.transport.PackParser;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DfsPackParserTest {
+  private InMemoryRepository repo;
+
+
+	@Before
+	public void setUp() throws Exception {
+		DfsRepositoryDescription desc = new DfsRepositoryDescription("test");
+		repo = new InMemoryRepository(desc);
+		repo.getConfig().setInt(CONFIG_PACK_SECTION, null,
+				CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX, 0);
+	}
+
+	@Test
+	public void parse_writeObjSizeIdx() throws IOException {
+		InMemoryPack pack = new InMemoryPack();
+
+		// Sha1 of the blob "a"
+		ObjectId blobA = ObjectId
+				.fromString("2e65efe2a145dda7ee51d1741299f848e5bf752e");
+
+		pack.header(2);
+		pack.write((Constants.OBJ_BLOB) << 4 | 1);
+		pack.deflate(new byte[] { 'a' });
+
+		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
+		pack.copyRaw(blobA);
+		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
+		pack.digest();
+
+		try (ObjectInserter ins = repo.newObjectInserter()) {
+			PackParser parser = ins.newPackParser(pack.toInputStream());
+			parser.parse(NullProgressMonitor.INSTANCE,
+					NullProgressMonitor.INSTANCE);
+			ins.flush();
+		}
+
+		DfsReader reader = repo.getObjectDatabase().newReader();
+		PackList packList = repo.getObjectDatabase().getPackList();
+		assertEquals(1, packList.packs.length);
+		assertEquals(1, packList.packs[0].getIndexedObjectSize(reader, blobA));
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsReaderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsReaderTest.java
new file mode 100644
index 0000000..4dd7ba4
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsReaderTest.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2023, Google LLC. and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.storage.dfs;
+
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.junit.TestRng;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DfsReaderTest {
+	InMemoryRepository db;
+
+	@Before
+	public void setUp() {
+		db = new InMemoryRepository(new DfsRepositoryDescription("test"));
+	}
+
+	@Test
+	public void isNotLargerThan_objAboveThreshold()
+			throws IOException {
+		setObjectSizeIndexMinBytes(100);
+		ObjectId obj = insertBlobWithSize(200);
+		try (DfsReader ctx = db.getObjectDatabase().newReader()) {
+			assertFalse("limit < threshold < obj",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 50));
+			assertEquals(1, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(1, ctx.stats.objectSizeIndexHit);
+			assertEquals(0, ctx.stats.objectSizeIndexMiss);
+
+			assertFalse("limit = threshold < obj",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 100));
+			assertEquals(2, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(2, ctx.stats.objectSizeIndexHit);
+			assertEquals(0, ctx.stats.objectSizeIndexMiss);
+
+			assertFalse("threshold < limit < obj",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 150));
+			assertEquals(3, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(3, ctx.stats.objectSizeIndexHit);
+			assertEquals(0, ctx.stats.objectSizeIndexMiss);
+
+			assertTrue("threshold < limit = obj",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 200));
+			assertEquals(4, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(4, ctx.stats.objectSizeIndexHit);
+			assertEquals(0, ctx.stats.objectSizeIndexMiss);
+
+			assertTrue("threshold < obj < limit",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 250));
+			assertEquals(5, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(5, ctx.stats.objectSizeIndexHit);
+			assertEquals(0, ctx.stats.objectSizeIndexMiss);
+		}
+	}
+
+
+	@Test
+	public void isNotLargerThan_objBelowThreshold()
+			throws IOException {
+		setObjectSizeIndexMinBytes(100);
+		insertBlobWithSize(1000); // index not empty
+		ObjectId obj = insertBlobWithSize(50);
+		try (DfsReader ctx = db.getObjectDatabase().newReader()) {
+			assertFalse("limit < obj < threshold",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 10));
+			assertEquals(1, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+			assertEquals(1, ctx.stats.objectSizeIndexMiss);
+
+			assertTrue("limit = obj < threshold",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 50));
+			assertEquals(2, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+			assertEquals(2, ctx.stats.objectSizeIndexMiss);
+
+			assertTrue("obj < limit < threshold",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 80));
+			assertEquals(3, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+			assertEquals(3, ctx.stats.objectSizeIndexMiss);
+
+			assertTrue("obj < limit = threshold",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 100));
+			assertEquals(4, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+			assertEquals(4, ctx.stats.objectSizeIndexMiss);
+
+			assertTrue("obj < threshold < limit",
+					ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 120));
+			assertEquals(5, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+			assertEquals(5, ctx.stats.objectSizeIndexMiss);
+		}
+	}
+
+	@Test
+	public void isNotLargerThan_emptyIdx() throws IOException {
+		setObjectSizeIndexMinBytes(100);
+		ObjectId obj = insertBlobWithSize(10);
+		try (DfsReader ctx = db.getObjectDatabase().newReader()) {
+			assertFalse(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 0));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 10));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 40));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 50));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 100));
+
+			assertEquals(5, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(5, ctx.stats.objectSizeIndexMiss);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+		}
+	}
+
+	@Test
+	public void isNotLargerThan_noObjectSizeIndex() throws IOException {
+		setObjectSizeIndexMinBytes(-1);
+		ObjectId obj = insertBlobWithSize(10);
+		try (DfsReader ctx = db.getObjectDatabase().newReader()) {
+			assertFalse(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 0));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 10));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 40));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 50));
+			assertTrue(ctx.isNotLargerThan(obj, Constants.OBJ_BLOB, 100));
+
+			assertEquals(5, ctx.stats.isNotLargerThanCallCount);
+			assertEquals(0, ctx.stats.objectSizeIndexMiss);
+			assertEquals(0, ctx.stats.objectSizeIndexHit);
+		}
+	}
+
+	private ObjectId insertBlobWithSize(int size)
+			throws IOException {
+		TestRng testRng = new TestRng(JGitTestUtil.getName());
+		ObjectId oid;
+		try (ObjectInserter ins = db.newObjectInserter()) {
+				oid = ins.insert(Constants.OBJ_BLOB,
+						testRng.nextBytes(size));
+			ins.flush();
+		}
+		return oid;
+	}
+
+	private void setObjectSizeIndexMinBytes(int threshold) {
+		db.getConfig().setInt(CONFIG_PACK_SECTION, null,
+				CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX, threshold);
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileRepositoryBuilderAfterOpenConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileRepositoryBuilderAfterOpenConfigTest.java
index 100bd32..ed5a699 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileRepositoryBuilderAfterOpenConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileRepositoryBuilderAfterOpenConfigTest.java
@@ -18,7 +18,6 @@
 import org.junit.Before;
 
 public class FileRepositoryBuilderAfterOpenConfigTest extends FileRepositoryBuilderTest {
-	/** {@inheritDoc} */
 	@Before
 	@Override
 	public void setUp() throws Exception {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcReverseIndexTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcReverseIndexTest.java
new file mode 100644
index 0000000..cbb0943
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcReverseIndexTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2023, Google LLC and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.internal.storage.file;
+
+import static org.eclipse.jgit.internal.storage.pack.PackExt.REVERSE_INDEX;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Collections;
+
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.storage.pack.PackConfig;
+import org.eclipse.jgit.util.IO;
+import org.junit.Test;
+
+public class GcReverseIndexTest extends GcTestCase {
+
+	@Test
+	public void testWriteDefault() throws Exception {
+		PackConfig config = new PackConfig(repo);
+		gc.setPackConfig(config);
+
+		RevCommit tip = commitChain(10);
+		TestRepository.BranchBuilder bb = tr.branch("refs/heads/main");
+		bb.update(tip);
+
+		gc.gc().get();
+		assertRidxDoesNotExist(repo);
+	}
+
+	@Test
+	public void testWriteDisabled() throws Exception {
+		PackConfig config = new PackConfig(repo);
+		config.setWriteReverseIndex(false);
+		gc.setPackConfig(config);
+
+		RevCommit tip = commitChain(10);
+		TestRepository.BranchBuilder bb = tr.branch("refs/heads/main");
+		bb.update(tip);
+
+		gc.gc().get();
+		assertRidxDoesNotExist(repo);
+	}
+
+	@Test
+	public void testWriteEmptyRepo() throws Exception {
+		PackConfig config = new PackConfig(repo);
+		config.setWriteReverseIndex(true);
+		gc.setPackConfig(config);
+
+		gc.gc().get();
+		assertRidxDoesNotExist(repo);
+	}
+
+	@Test
+	public void testWriteShallowRepo() throws Exception {
+		PackConfig config = new PackConfig(repo);
+		config.setWriteReverseIndex(true);
+		gc.setPackConfig(config);
+
+		RevCommit tip = commitChain(2);
+		TestRepository.BranchBuilder bb = tr.branch("refs/heads/main");
+		bb.update(tip);
+		repo.getObjectDatabase().setShallowCommits(Collections.singleton(tip));
+
+		gc.gc().get();
+		assertValidRidxExists(repo);
+	}
+
+	@Test
+	public void testWriteEnabled() throws Exception {
+		PackConfig config = new PackConfig(repo);
+		config.setWriteReverseIndex(true);
+		gc.setPackConfig(config);
+
+		RevCommit tip = commitChain(10);
+		TestRepository.BranchBuilder bb = tr.branch("refs/heads/main");
+		bb.update(tip);
+
+		gc.gc().get();
+		assertValidRidxExists(repo);
+	}
+
+	private static void assertValidRidxExists(FileRepository repo)
+			throws Exception {
+		PackFile packFile = repo.getObjectDatabase().getPacks().iterator()
+				.next().getPackFile();
+		File file = packFile.create(REVERSE_INDEX);
+		assertTrue(file.exists());
+		try (InputStream os = new FileInputStream(file)) {
+			byte[] magic = new byte[4];
+			IO.readFully(os, magic, 0, 4);
+			assertArrayEquals(new byte[] { 'R', 'I', 'D', 'X' }, magic);
+		}
+	}
+
+	private static void assertRidxDoesNotExist(FileRepository repo) {
+		File packDir = repo.getObjectDatabase().getPackDirectory();
+		String[] reverseIndexFilenames = packDir.list(
+				(dir, name) -> name.endsWith(REVERSE_INDEX.getExtension()));
+		assertEquals(0, reverseIndexFilenames.length);
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexComputedTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexComputedTest.java
new file mode 100644
index 0000000..ea5aaf5
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexComputedTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2008, Imran M Yousuf <imyousuf@smartitengineering.com>
+ * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com> and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.internal.storage.file;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.PackMismatchException;
+import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
+import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PackReverseIndexComputedTest extends RepositoryTestCase {
+
+	private PackIndex idx;
+
+	private PackReverseIndex reverseIdx;
+
+	/**
+	 * Set up tested class instance, test constructor by the way.
+	 */
+	@Override
+	@Before
+	public void setUp() throws Exception {
+		super.setUp();
+		// index with both small (< 2^31) and big offsets
+		idx = PackIndex.open(JGitTestUtil.getTestResourceFile("pack-huge.idx"));
+		reverseIdx = PackReverseIndexFactory.computeFromIndex(idx);
+	}
+
+	/**
+	 * Test findObject() for all index entries.
+	 */
+	@Test
+	public void testFindObject() {
+		for (MutableEntry me : idx)
+			assertEquals(me.toObjectId(), reverseIdx.findObject(me.getOffset()));
+	}
+
+	/**
+	 * Test findObject() with illegal argument.
+	 */
+	@Test
+	public void testFindObjectWrongOffset() {
+		assertNull(reverseIdx.findObject(0));
+	}
+
+	/**
+	 * Test findNextOffset() for all index entries.
+	 *
+	 * @throws CorruptObjectException
+	 */
+	@Test
+	public void testFindNextOffset() throws CorruptObjectException {
+		long offset = findFirstOffset();
+		assertTrue(offset > 0);
+		for (int i = 0; i < idx.getObjectCount(); i++) {
+			long newOffset = reverseIdx.findNextOffset(offset, Long.MAX_VALUE);
+			assertTrue(newOffset > offset);
+			if (i == idx.getObjectCount() - 1)
+				assertEquals(newOffset, Long.MAX_VALUE);
+			else
+				assertEquals(newOffset, idx.findOffset(reverseIdx
+						.findObject(newOffset)));
+			offset = newOffset;
+		}
+	}
+
+	/**
+	 * Test findNextOffset() with wrong illegal argument as offset.
+	 */
+	@Test
+	public void testFindNextOffsetWrongOffset() {
+		try {
+			reverseIdx.findNextOffset(0, Long.MAX_VALUE);
+			fail("findNextOffset() should throw exception");
+		} catch (CorruptObjectException x) {
+			// expected
+		}
+	}
+
+	@Test
+	public void testVerifyChecksum() throws PackMismatchException {
+		// ComputedReverseIndex doesn't have a file containing a checksum.
+		reverseIdx.verifyPackChecksum(null);
+	}
+
+	private long findFirstOffset() {
+		long min = Long.MAX_VALUE;
+		for (MutableEntry me : idx)
+			min = Math.min(min, me.getOffset());
+		return min;
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexTest.java
index 292e3e7..f8fb4c1 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexTest.java
@@ -1,6 +1,5 @@
 /*
- * Copyright (C) 2008, Imran M Yousuf <imyousuf@smartitengineering.com>
- * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com> and others
+ * Copyright (C) 2022, Google LLC and others
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0 which is available at
@@ -8,95 +7,94 @@
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
-
 package org.eclipse.jgit.internal.storage.file;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
-import org.eclipse.jgit.errors.CorruptObjectException;
-import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.jgit.internal.storage.pack.PackExt;
 import org.eclipse.jgit.junit.JGitTestUtil;
-import org.eclipse.jgit.junit.RepositoryTestCase;
-import org.junit.Before;
 import org.junit.Test;
 
-public class PackReverseIndexTest extends RepositoryTestCase {
+public class PackReverseIndexTest {
 
-	private PackIndex idx;
-
-	private PackReverseIndex reverseIdx;
-
-	/**
-	 * Set up tested class instance, test constructor by the way.
-	 */
-	@Override
-	@Before
-	public void setUp() throws Exception {
-		super.setUp();
-		// index with both small (< 2^31) and big offsets
-		idx = PackIndex.open(JGitTestUtil.getTestResourceFile(
-				"pack-huge.idx"));
-		reverseIdx = new PackReverseIndex(idx);
-	}
-
-	/**
-	 * Test findObject() for all index entries.
-	 */
 	@Test
-	public void testFindObject() {
-		for (MutableEntry me : idx)
-			assertEquals(me.toObjectId(), reverseIdx.findObject(me.getOffset()));
+	public void open_fallbackToComputed() throws IOException {
+		String noRevFilePrefix = "pack-3280af9c07ee18a87705ef50b0cc4cd20266cf12.";
+		PackReverseIndex computed = PackReverseIndexFactory.openOrCompute(
+				getResourceFileFor(noRevFilePrefix, PackExt.REVERSE_INDEX), 7,
+				() -> PackIndex.open(
+						getResourceFileFor(noRevFilePrefix, PackExt.INDEX)));
+
+		assertTrue(computed instanceof PackReverseIndexComputed);
 	}
 
-	/**
-	 * Test findObject() with illegal argument.
-	 */
 	@Test
-	public void testFindObjectWrongOffset() {
-		assertNull(reverseIdx.findObject(0));
+	public void open_readGoodFile() throws IOException {
+		String hasRevFilePrefix = "pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.";
+		PackReverseIndex version1 = PackReverseIndexFactory.openOrCompute(
+				getResourceFileFor(hasRevFilePrefix, PackExt.REVERSE_INDEX), 6,
+				() -> PackIndex.open(
+						getResourceFileFor(hasRevFilePrefix, PackExt.INDEX)));
+
+		assertTrue(version1 instanceof PackReverseIndexV1);
 	}
 
-	/**
-	 * Test findNextOffset() for all index entries.
-	 *
-	 * @throws CorruptObjectException
-	 */
 	@Test
-	public void testFindNextOffset() throws CorruptObjectException {
-		long offset = findFirstOffset();
-		assertTrue(offset > 0);
-		for (int i = 0; i < idx.getObjectCount(); i++) {
-			long newOffset = reverseIdx.findNextOffset(offset, Long.MAX_VALUE);
-			assertTrue(newOffset > offset);
-			if (i == idx.getObjectCount() - 1)
-				assertEquals(newOffset, Long.MAX_VALUE);
-			else
-				assertEquals(newOffset, idx.findOffset(reverseIdx
-						.findObject(newOffset)));
-			offset = newOffset;
-		}
+	public void open_readCorruptFile() {
+		String hasRevFilePrefix = "pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.";
+
+		assertThrows(IOException.class,
+				() -> PackReverseIndexFactory.openOrCompute(
+						getResourceFileFor(hasRevFilePrefix + "corrupt.",
+								PackExt.REVERSE_INDEX),
+						6, () -> PackIndex.open(getResourceFileFor(
+								hasRevFilePrefix, PackExt.INDEX))));
 	}
 
-	/**
-	 * Test findNextOffset() with wrong illegal argument as offset.
-	 */
 	@Test
-	public void testFindNextOffsetWrongOffset() {
-		try {
-			reverseIdx.findNextOffset(0, Long.MAX_VALUE);
-			fail("findNextOffset() should throw exception");
-		} catch (CorruptObjectException x) {
-			// expected
-		}
+	public void read_badMagic() {
+		byte[] badMagic = new byte[] { 'R', 'B', 'A', 'D', // magic
+				0x00, 0x00, 0x00, 0x01, // file version
+				0x00, 0x00, 0x00, 0x01, // oid version
+				// pack checksum
+				'P', 'A', 'C', 'K', 'C', 'H', 'E', 'C', 'K', 'S', 'U', 'M', '3',
+				'4', '5', '6', '7', '8', '9', '0',
+				// checksum
+				0x66, 0x01, (byte) 0xbc, (byte) 0xe8, 0x51, 0x4b, 0x2f,
+				(byte) 0xa1, (byte) 0xa9, (byte) 0xcd, (byte) 0xbe, (byte) 0xd6,
+				0x4f, (byte) 0xa8, 0x7d, (byte) 0xab, 0x50, (byte) 0xa3,
+				(byte) 0xf7, (byte) 0xcc, };
+		ByteArrayInputStream in = new ByteArrayInputStream(badMagic);
+
+		assertThrows(IOException.class,
+				() -> PackReverseIndexFactory.readFromFile(in, 0, () -> null));
 	}
 
-	private long findFirstOffset() {
-		long min = Long.MAX_VALUE;
-		for (MutableEntry me : idx)
-			min = Math.min(min, me.getOffset());
-		return min;
+	@Test
+	public void read_unsupportedVersion2() {
+		byte[] version2 = new byte[] { 'R', 'I', 'D', 'X', // magic
+				0x00, 0x00, 0x00, 0x02, // file version
+				0x00, 0x00, 0x00, 0x01, // oid version
+				// pack checksum
+				'P', 'A', 'C', 'K', 'C', 'H', 'E', 'C', 'K', 'S', 'U', 'M', '3',
+				'4', '5', '6', '7', '8', '9', '0',
+				// checksum
+				0x70, 0x17, 0x10, 0x51, (byte) 0xfe, (byte) 0xab, (byte) 0x9b,
+				0x68, (byte) 0xed, 0x3a, 0x3f, 0x27, 0x1d, (byte) 0xce,
+				(byte) 0xff, 0x38, 0x09, (byte) 0x9b, 0x29, 0x58, };
+		ByteArrayInputStream in = new ByteArrayInputStream(version2);
+
+		assertThrows(IOException.class,
+				() -> PackReverseIndexFactory.readFromFile(in, 0, () -> null));
+	}
+
+	private File getResourceFileFor(String packFilePrefix, PackExt ext) {
+		return JGitTestUtil
+				.getTestResourceFile(packFilePrefix + ext.getExtension());
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1Test.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1Test.java
new file mode 100644
index 0000000..38b28b5
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1Test.java
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2022, Google LLC and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.storage.file;
+
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
+import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.PackMismatchException;
+import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.transport.PackedObjectInfo;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PackReverseIndexV1Test {
+	private static final byte[] FAKE_PACK_CHECKSUM = new byte[] { 'P', 'A', 'C',
+			'K', 'C', 'H', 'E', 'C', 'K', 'S', 'U', 'M', '3', '4', '5', '6',
+			'7', '8', '9', '0', };
+
+	private static final byte[] NO_OBJECTS = new byte[] { 'R', 'I', 'D', 'X', // magic
+			0x00, 0x00, 0x00, 0x01, // file version
+			0x00, 0x00, 0x00, 0x01, // oid version
+			// pack checksum to copy into at byte 12
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+			// checksum
+			(byte) 0xd1, 0x1d, 0x17, (byte) 0xd5, (byte) 0xa1, 0x5c,
+			(byte) 0x8f, 0x45, 0x7e, 0x06, (byte) 0x91, (byte) 0xf2, 0x7e, 0x20,
+			0x35, 0x2c, (byte) 0xdc, 0x4c, 0x46, (byte) 0xe4, };
+
+	private static final byte[] SMALL_PACK_CHECKSUM = new byte[] { (byte) 0xbb,
+			0x1d, 0x25, 0x3d, (byte) 0xd3, (byte) 0xf0, 0x08, 0x75, (byte) 0xc8,
+			0x04, (byte) 0xd0, 0x6f, 0x73, (byte) 0xe9, 0x00, (byte) 0x82,
+			(byte) 0xdb, 0x09, (byte) 0xc8, 0x13, };
+
+	private static final byte[] SMALL_CONTENTS = new byte[] { 'R', 'I', 'D',
+			'X', // magic
+			0x00, 0x00, 0x00, 0x01, // file version
+			0x00, 0x00, 0x00, 0x01, // oid version
+			0x00, 0x00, 0x00, 0x04, // offset 12: "68" -> index @ 4
+			0x00, 0x00, 0x00, 0x02, // offset 165: "5c" -> index @ 2
+			0x00, 0x00, 0x00, 0x03, // offset 257: "62" -> index @ 3
+			0x00, 0x00, 0x00, 0x01, // offset 450: "58" -> index @ 1
+			0x00, 0x00, 0x00, 0x05, // offset 556: "c5" -> index @ 5
+			0x00, 0x00, 0x00, 0x00, // offset 614: "2d" -> index @ 0
+			// pack checksum to copy into at byte 36
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+			// checksum
+			(byte) 0xf0, 0x6d, 0x03, (byte) 0xd7, 0x6f, (byte) 0x9f,
+			(byte) 0xc1, 0x36, 0x26, (byte) 0xbc, (byte) 0xcb, 0x75, 0x36,
+			(byte) 0xa1, 0x26, 0x6a, 0x2b, (byte) 0x84, 0x16, (byte) 0x83, };
+
+	private PackReverseIndex emptyReverseIndex;
+
+	/**
+	 * Reverse index for the pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.idx
+	 * with contents `SHA-1 type size size-in-packfile offset-in-packfile` as
+	 * shown by `verify-pack`:
+	 * 2d04ee74dba30078c2dcdb713ddb8be4bc084d76 blob   8 17 614
+	 * 58728c938a9a8b9970cc09236caf94ada4689923 blob   140 106 450
+	 * 5ce00008cf3fb8f194f52742020bd40d78f3f1b3 commit 81 92 165 1 68cb1f232964f3cd698afc1dafe583937203c587
+	 * 62299a7ae290d685196e948a2fcb7d8c07f95c7d tree   198 193 257
+	 * 68cb1f232964f3cd698afc1dafe583937203c587 commit 220 153 12
+	 * c5ab27309491cf641eb11bb4b7a78641f280b482 tree   46 58 556 1 62299a7ae290d685196e948a2fcb7d8c07f95c7d
+	 */
+	private PackReverseIndex smallReverseIndex;
+
+	private final PackedObjectInfo object614 = objectInfo(
+			"2d04ee74dba30078c2dcdb713ddb8be4bc084d76", OBJ_BLOB, 614);
+
+	private final PackedObjectInfo object450 = objectInfo(
+			"58728c938a9a8b9970cc09236caf94ada4689923", OBJ_BLOB, 450);
+
+	private final PackedObjectInfo object165 = objectInfo(
+			"5ce00008cf3fb8f194f52742020bd40d78f3f1b3", OBJ_COMMIT, 165);
+
+	private final PackedObjectInfo object257 = objectInfo(
+			"62299a7ae290d685196e948a2fcb7d8c07f95c7d", OBJ_TREE, 257);
+
+	private final PackedObjectInfo object12 = objectInfo(
+			"68cb1f232964f3cd698afc1dafe583937203c587", OBJ_COMMIT, 12);
+
+	private final PackedObjectInfo object556 = objectInfo(
+			"c5ab27309491cf641eb11bb4b7a78641f280b482", OBJ_TREE, 556);
+
+	// last object's offset + last object's length
+	private final long smallMaxOffset = 631;
+
+	@Before
+	public void setUp() throws Exception {
+		System.arraycopy(SMALL_PACK_CHECKSUM, 0, SMALL_CONTENTS, 36,
+				SMALL_PACK_CHECKSUM.length);
+		ByteArrayInputStream smallIn = new ByteArrayInputStream(SMALL_CONTENTS);
+		smallReverseIndex = PackReverseIndexFactory.readFromFile(smallIn, 6,
+				() -> PackIndex.open(JGitTestUtil.getTestResourceFile(
+						"pack-cbdeda40019ae0e6e789088ea0f51f164f489d14.idx")));
+
+		System.arraycopy(FAKE_PACK_CHECKSUM, 0, NO_OBJECTS, 12,
+				FAKE_PACK_CHECKSUM.length);
+		ByteArrayInputStream emptyIn = new ByteArrayInputStream(NO_OBJECTS);
+		emptyReverseIndex = PackReverseIndexFactory.readFromFile(emptyIn, 0,
+				() -> null);
+	}
+
+	@Test
+	public void read_unsupportedOidSHA256() {
+		byte[] version2 = new byte[] { 'R', 'I', 'D', 'X', // magic
+				0x00, 0x00, 0x00, 0x01, // file version
+				0x00, 0x00, 0x00, 0x02, // oid version
+				// pack checksum to copy into at byte 12
+				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+				// checksum
+				0x6e, 0x78, 0x75, 0x67, (byte) 0x84, (byte) 0x89, (byte) 0xde,
+				(byte) 0xe3, (byte) 0x86, 0x6a, 0x3b, (byte) 0x98, 0x51,
+				(byte) 0xd8, (byte) 0x8c, (byte) 0xec, 0x50, (byte) 0xe7,
+				(byte) 0xfb, 0x22, };
+		System.arraycopy(FAKE_PACK_CHECKSUM, 0, version2, 12,
+				FAKE_PACK_CHECKSUM.length);
+		ByteArrayInputStream in = new ByteArrayInputStream(version2);
+
+		assertThrows(IOException.class,
+				() -> PackReverseIndexFactory.readFromFile(in, 0, () -> null));
+	}
+
+	@Test
+	public void read_objectCountTooLarge() {
+		ByteArrayInputStream dummyInput = new ByteArrayInputStream(NO_OBJECTS);
+		long biggerThanInt = ((long) Integer.MAX_VALUE) + 1;
+
+		assertThrows(IllegalArgumentException.class,
+				() -> PackReverseIndexFactory.readFromFile(dummyInput,
+						biggerThanInt,
+						() -> null));
+	}
+
+	@Test
+	public void read_incorrectChecksum() {
+		byte[] badChecksum = new byte[] { 'R', 'I', 'D', 'X', // magic
+				0x00, 0x00, 0x00, 0x01, // file version
+				0x00, 0x00, 0x00, 0x01, // oid version
+				// pack checksum to copy into at byte 12
+				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+				// checksum
+				(byte) 0xf2, 0x1a, 0x1a, (byte) 0xaa, 0x32, 0x2d, (byte) 0xb9,
+				(byte) 0xfd, 0x0f, (byte) 0xa5, 0x4c, (byte) 0xea, (byte) 0xcf,
+				(byte) 0xbb, (byte) 0x99, (byte) 0xde, (byte) 0xd3, 0x4e,
+				(byte) 0xb1, (byte) 0xee, // would be 0x74 if correct
+		};
+		System.arraycopy(FAKE_PACK_CHECKSUM, 0, badChecksum, 12,
+				FAKE_PACK_CHECKSUM.length);
+		ByteArrayInputStream in = new ByteArrayInputStream(badChecksum);
+		assertThrows(CorruptObjectException.class,
+				() -> PackReverseIndexFactory.readFromFile(in, 0, () -> null));
+	}
+
+	@Test
+	public void findObject_noObjects() {
+		assertNull(emptyReverseIndex.findObject(0));
+	}
+
+	@Test
+	public void findObject_multipleObjects() {
+		assertEquals(object614, smallReverseIndex.findObject(614));
+		assertEquals(object450, smallReverseIndex.findObject(450));
+		assertEquals(object165, smallReverseIndex.findObject(165));
+		assertEquals(object257, smallReverseIndex.findObject(257));
+		assertEquals(object12, smallReverseIndex.findObject(12));
+		assertEquals(object556, smallReverseIndex.findObject(556));
+	}
+
+	@Test
+	public void findObject_badOffset() {
+		assertNull(smallReverseIndex.findObject(0));
+	}
+
+	@Test
+	public void findNextOffset_noObjects() {
+		assertThrows(IOException.class,
+				() -> emptyReverseIndex.findNextOffset(0, Long.MAX_VALUE));
+	}
+
+	@Test
+	public void findNextOffset_multipleObjects() throws CorruptObjectException {
+		assertEquals(smallMaxOffset,
+				smallReverseIndex.findNextOffset(614, smallMaxOffset));
+		assertEquals(614,
+				smallReverseIndex.findNextOffset(556, smallMaxOffset));
+		assertEquals(556,
+				smallReverseIndex.findNextOffset(450, smallMaxOffset));
+		assertEquals(450,
+				smallReverseIndex.findNextOffset(257, smallMaxOffset));
+		assertEquals(257,
+				smallReverseIndex.findNextOffset(165, smallMaxOffset));
+		assertEquals(165, smallReverseIndex.findNextOffset(12, smallMaxOffset));
+	}
+
+	@Test
+	public void findNextOffset_badOffset() {
+		assertThrows(IOException.class,
+				() -> smallReverseIndex.findNextOffset(0, Long.MAX_VALUE));
+	}
+
+	@Test
+	public void findPosition_noObjects() {
+		assertEquals(-1, emptyReverseIndex.findPosition(0));
+	}
+
+	@Test
+	public void findPosition_multipleObjects() {
+		assertEquals(0, smallReverseIndex.findPosition(12));
+		assertEquals(1, smallReverseIndex.findPosition(165));
+		assertEquals(2, smallReverseIndex.findPosition(257));
+		assertEquals(3, smallReverseIndex.findPosition(450));
+		assertEquals(4, smallReverseIndex.findPosition(556));
+		assertEquals(5, smallReverseIndex.findPosition(614));
+	}
+
+	@Test
+	public void findPosition_badOffset() {
+		assertEquals(-1, smallReverseIndex.findPosition(10));
+	}
+
+	@Test
+	public void findObjectByPosition_noObjects() {
+		assertThrows(AssertionError.class,
+				() -> emptyReverseIndex.findObjectByPosition(0));
+	}
+
+	@Test
+	public void findObjectByPosition_multipleObjects() {
+		assertEquals(object12, smallReverseIndex.findObjectByPosition(0));
+		assertEquals(object165, smallReverseIndex.findObjectByPosition(1));
+		assertEquals(object257, smallReverseIndex.findObjectByPosition(2));
+		assertEquals(object450, smallReverseIndex.findObjectByPosition(3));
+		assertEquals(object556, smallReverseIndex.findObjectByPosition(4));
+		assertEquals(object614, smallReverseIndex.findObjectByPosition(5));
+	}
+
+	@Test
+	public void findObjectByPosition_badOffset() {
+		assertThrows(AssertionError.class,
+				() -> smallReverseIndex.findObjectByPosition(10));
+	}
+
+	@Test
+	public void verifyChecksum_match() throws IOException {
+		smallReverseIndex.verifyPackChecksum("smallPackFilePath");
+	}
+
+	@Test
+	public void verifyChecksum_mismatch() throws IOException {
+		ByteArrayInputStream in = new ByteArrayInputStream(NO_OBJECTS);
+		PackIndex mockForwardIndex = mock(PackIndex.class);
+		when(mockForwardIndex.getChecksum()).thenReturn(
+				new byte[] { 'D', 'I', 'F', 'F', 'P', 'A', 'C', 'K', 'C', 'H',
+						'E', 'C', 'K', 'S', 'U', 'M', '7', '8', '9', '0', });
+		PackReverseIndex reverseIndex = PackReverseIndexFactory.readFromFile(in,
+				0,
+				() -> mockForwardIndex);
+
+		assertThrows(PackMismatchException.class,
+				() -> reverseIndex.verifyPackChecksum("packFilePath"));
+	}
+
+	private static PackedObjectInfo objectInfo(String objectId, int type,
+			long offset) {
+		PackedObjectInfo objectInfo = new PackedObjectInfo(
+				ObjectId.fromString(objectId));
+		objectInfo.setType(type);
+		objectInfo.setOffset(offset);
+		return objectInfo;
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1WriteReadTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1WriteReadTest.java
new file mode 100644
index 0000000..372a4c7
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1WriteReadTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2022, Google LLC and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.storage.file;
+
+import static org.eclipse.jgit.lib.Constants.OBJECT_ID_STRING_LENGTH;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
+import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.transport.PackedObjectInfo;
+import org.junit.Test;
+
+public class PackReverseIndexV1WriteReadTest {
+
+	private static byte[] PACK_CHECKSUM = new byte[] { 'P', 'A', 'C', 'K', 'C',
+			'H', 'E', 'C', 'K', 'S', 'U', 'M', '3', '4', '5', '6', '7', '8',
+			'9', '0', };
+
+	@Test
+	public void writeThenRead_noObjects() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		PackReverseIndexWriter writer = PackReverseIndexWriter.createWriter(out,
+				1);
+		List<PackedObjectInfo> objectsSortedByName = new ArrayList<>();
+
+		// write
+		writer.write(objectsSortedByName, PACK_CHECKSUM);
+
+		ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+
+		// read
+		PackReverseIndex noObjectsReverseIndex = PackReverseIndexFactory
+				.readFromFile(in, 0, () -> null);
+
+		// use
+		assertThrows(AssertionError.class,
+				() -> noObjectsReverseIndex.findObjectByPosition(0));
+	}
+
+	@Test
+	public void writeThenRead_oneObject() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		PackReverseIndexWriter writer = PackReverseIndexWriter.createWriter(out,
+				1);
+		PackedObjectInfo a = objectInfo("a", OBJ_COMMIT, 0);
+		List<PackedObjectInfo> objectsSortedByName = List.of(a);
+
+		// write
+		writer.write(objectsSortedByName, PACK_CHECKSUM);
+
+		ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+		PackIndex mockForwardIndex = mock(PackIndex.class);
+		when(mockForwardIndex.getObjectId(0)).thenReturn(a);
+
+		// read
+		PackReverseIndex oneObjectReverseIndex = PackReverseIndexFactory
+				.readFromFile(in, 1, () -> mockForwardIndex);
+
+		// use
+		assertEquals(a, oneObjectReverseIndex.findObjectByPosition(0));
+	}
+
+	@Test
+	public void writeThenRead_multipleObjectsLargeOffsets() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		PackReverseIndexWriter writer = PackReverseIndexWriter.createWriter(out,
+				1);
+		PackedObjectInfo a = objectInfo("a", OBJ_BLOB, 200000000);
+		PackedObjectInfo b = objectInfo("b", OBJ_COMMIT, 0);
+		PackedObjectInfo c = objectInfo("c", OBJ_COMMIT, 52000000000L);
+		PackedObjectInfo d = objectInfo("d", OBJ_TREE, 7);
+		PackedObjectInfo e = objectInfo("e", OBJ_COMMIT, 38000000000L);
+		List<PackedObjectInfo> objectsSortedByName = List.of(a, b, c, d, e);
+
+		writer.write(objectsSortedByName, PACK_CHECKSUM);
+
+		// write
+		writer.write(objectsSortedByName, PACK_CHECKSUM);
+
+		ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+		PackIndex mockForwardIndex = mock(PackIndex.class);
+		when(mockForwardIndex.getObjectId(4)).thenReturn(e);
+
+		// read
+		PackReverseIndex multipleObjectsReverseIndex = PackReverseIndexFactory
+				.readFromFile(in, 5, () -> mockForwardIndex);
+
+		// use with minimal mocked forward index use
+		assertEquals(e, multipleObjectsReverseIndex.findObjectByPosition(3));
+	}
+
+	private static PackedObjectInfo objectInfo(String objectId, int type,
+			long offset) {
+		assert (objectId.length() == 1);
+		PackedObjectInfo objectInfo = new PackedObjectInfo(
+				ObjectId.fromString(objectId.repeat(OBJECT_ID_STRING_LENGTH)));
+		objectInfo.setType(type);
+		objectInfo.setOffset(offset);
+		return objectInfo;
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryAfterOpenConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryAfterOpenConfigTest.java
index 42304e2..3ea4a16 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryAfterOpenConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryAfterOpenConfigTest.java
@@ -17,7 +17,6 @@
 import org.eclipse.jgit.util.SystemReader;
 
 public class RefDirectoryAfterOpenConfigTest extends RefDirectoryTest {
-	/** {@inheritDoc} */
 	@Override
 	public void refDirectorySetup() throws Exception {
 		StoredConfig userConfig = SystemReader.getInstance().getUserConfig();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectoryTest.java
index c3dafe4..90a2aa6 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectoryTest.java
@@ -23,7 +23,6 @@
 public class SnapshottingRefDirectoryTest extends RefDirectoryTest {
 	private RefDirectory originalRefDirectory;
 
-	/** {@inheritDoc} */
 	@Before
 	@Override
 	public void setUp() throws Exception {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/CommitTemplateConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/CommitTemplateConfigTest.java
index 42bafb6..3ccd0ef 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/CommitTemplateConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/CommitTemplateConfigTest.java
@@ -17,7 +17,9 @@
 
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
 import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+import org.eclipse.jgit.util.FS;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -27,7 +29,7 @@
  * test using bazel which doesn't allow tests to create files in the home
  * directory
  */
-public class CommitTemplateConfigTest {
+public class CommitTemplateConfigTest extends LocalDiskRepositoryTestCase {
 
 	@Rule
 	public TemporaryFolder tmp = new TemporaryFolder();
@@ -42,9 +44,11 @@ public void testCommitTemplatePathInHomeDirecory()
 		String templateContent = "content of the template";
 		JGitTestUtil.write(tempFile, templateContent);
 		// proper evaluation of the ~/ directory
-		String homeDir = System.getProperty("user.home");
+		File homeDir = FS.DETECTED.userHome();
 		File tempFileInHomeDirectory = File.createTempFile("fileInHomeFolder",
-				".tmp", new File(homeDir));
+				".tmp", homeDir);
+		// The home directory should be a mocked temporary directory, but
+		// still...
 		tempFileInHomeDirectory.deleteOnExit();
 		JGitTestUtil.write(tempFileInHomeDirectory, templateContent);
 		String expectedTemplatePath = "~/" + tempFileInHomeDirectory.getName();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java
index 5f4331b..680a2d5 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java
@@ -47,7 +47,10 @@ public MergeAlgorithmTest(boolean newlineAtEnd) {
 	@Test
 	public void testTwoConflictingModifications() throws IOException {
 		assertEquals(t("a<b=Z>Zdefghij"),
-				merge("abcdefghij", "abZdefghij", "aZZdefghij"));
+				merge("abcdefghij", "abZdefghij", "aZZdefghij", false));
+
+		assertEquals(t("a<b|b=Z>Zdefghij"),
+				merge("abcdefghij", "abZdefghij", "aZZdefghij", true));
 	}
 
 	/**
@@ -60,7 +63,10 @@ public void testTwoConflictingModifications() throws IOException {
 	@Test
 	public void testOneAgainstTwoConflictingModifications() throws IOException {
 		assertEquals(t("aZ<Z=c>Zefghij"),
-				merge("abcdefghij", "aZZZefghij", "aZcZefghij"));
+				merge("abcdefghij", "aZZZefghij", "aZcZefghij", false));
+
+		assertEquals(t("aZ<Z|c=c>Zefghij"),
+				merge("abcdefghij", "aZZZefghij", "aZcZefghij", true));
 	}
 
 	/**
@@ -72,7 +78,10 @@ public void testOneAgainstTwoConflictingModifications() throws IOException {
 	@Test
 	public void testNoAgainstOneModification() throws IOException {
 		assertEquals(t("aZcZefghij"),
-				merge("abcdefghij", "abcdefghij", "aZcZefghij"));
+				merge("abcdefghij", "abcdefghij", "aZcZefghij", false));
+
+		assertEquals(t("aZcZefghij"),
+				merge("abcdefghij", "abcdefghij", "aZcZefghij", true));
 	}
 
 	/**
@@ -84,7 +93,10 @@ public void testNoAgainstOneModification() throws IOException {
 	@Test
 	public void testTwoNonConflictingModifications() throws IOException {
 		assertEquals(t("YbZdefghij"),
-				merge("abcdefghij", "abZdefghij", "Ybcdefghij"));
+				merge("abcdefghij", "abZdefghij", "Ybcdefghij", false));
+
+		assertEquals(t("YbZdefghij"),
+				merge("abcdefghij", "abZdefghij", "Ybcdefghij", true));
 	}
 
 	/**
@@ -96,7 +108,10 @@ public void testTwoNonConflictingModifications() throws IOException {
 	@Test
 	public void testTwoComplicatedModifications() throws IOException {
 		assertEquals(t("a<ZZZZfZhZj=bYdYYYYiY>"),
-				merge("abcdefghij", "aZZZZfZhZj", "abYdYYYYiY"));
+				merge("abcdefghij", "aZZZZfZhZj", "abYdYYYYiY", false));
+
+		assertEquals(t("a<ZZZZfZhZj|bcdefghij=bYdYYYYiY>"),
+				merge("abcdefghij", "aZZZZfZhZj", "abYdYYYYiY", true));
 	}
 
 	/**
@@ -109,7 +124,9 @@ public void testTwoComplicatedModifications() throws IOException {
 	@Test
 	public void testTwoModificationsWithSharedDelete() throws IOException {
 		assertEquals(t("Cb}n}"),
-				merge("ab}n}n}", "ab}n}", "Cb}n}"));
+				merge("ab}n}n}", "ab}n}", "Cb}n}", false));
+
+		assertEquals(t("Cb}n}"), merge("ab}n}n}", "ab}n}", "Cb}n}", true));
 	}
 
 	/**
@@ -122,7 +139,11 @@ public void testTwoModificationsWithSharedDelete() throws IOException {
 	@Test
 	public void testModificationsWithMiddleInsert() throws IOException {
 		assertEquals(t("aBcd123123uvwxPq"),
-				merge("abcd123uvwxpq", "aBcd123123uvwxPq", "abcd123123uvwxpq"));
+				merge("abcd123uvwxpq", "aBcd123123uvwxPq", "abcd123123uvwxpq",
+						false));
+
+		assertEquals(t("aBcd123123uvwxPq"), merge("abcd123uvwxpq",
+				"aBcd123123uvwxPq", "abcd123123uvwxpq", true));
 	}
 
 	/**
@@ -135,7 +156,10 @@ public void testModificationsWithMiddleInsert() throws IOException {
 	@Test
 	public void testModificationsWithMiddleDelete() throws IOException {
 		assertEquals(t("Abz}z123Q"),
-				merge("abz}z}z123q", "Abz}z123Q", "abz}z123q"));
+				merge("abz}z}z123q", "Abz}z123Q", "abz}z123q", false));
+
+		assertEquals(t("Abz}z123Q"),
+				merge("abz}z}z123q", "Abz}z123Q", "abz}z123q", true));
 	}
 
 	/**
@@ -146,7 +170,10 @@ public void testModificationsWithMiddleDelete() throws IOException {
 	@Test
 	public void testConflictAtStart() throws IOException {
 		assertEquals(t("<Z=Y>bcdefghij"),
-				merge("abcdefghij", "Zbcdefghij", "Ybcdefghij"));
+				merge("abcdefghij", "Zbcdefghij", "Ybcdefghij", false));
+
+		assertEquals(t("<Z|a=Y>bcdefghij"),
+				merge("abcdefghij", "Zbcdefghij", "Ybcdefghij", true));
 	}
 
 	/**
@@ -157,7 +184,10 @@ public void testConflictAtStart() throws IOException {
 	@Test
 	public void testConflictAtEnd() throws IOException {
 		assertEquals(t("abcdefghi<Z=Y>"),
-				merge("abcdefghij", "abcdefghiZ", "abcdefghiY"));
+				merge("abcdefghij", "abcdefghiZ", "abcdefghiY", false));
+
+		assertEquals(t("abcdefghi<Z|j=Y>"),
+				merge("abcdefghij", "abcdefghiZ", "abcdefghiY", true));
 	}
 
 	/**
@@ -169,7 +199,10 @@ public void testConflictAtEnd() throws IOException {
 	@Test
 	public void testSameModification() throws IOException {
 		assertEquals(t("abZdefghij"),
-				merge("abcdefghij", "abZdefghij", "abZdefghij"));
+				merge("abcdefghij", "abZdefghij", "abZdefghij", false));
+
+		assertEquals(t("abZdefghij"),
+				merge("abcdefghij", "abZdefghij", "abZdefghij", true));
 	}
 
 	/**
@@ -181,27 +214,36 @@ public void testSameModification() throws IOException {
 	@Test
 	public void testDeleteVsModify() throws IOException {
 		assertEquals(t("ab<=Z>defghij"),
-				merge("abcdefghij", "abdefghij", "abZdefghij"));
+				merge("abcdefghij", "abdefghij", "abZdefghij", false));
+
+		assertEquals(t("ab<|c=Z>defghij"),
+				merge("abcdefghij", "abdefghij", "abZdefghij", true));
 	}
 
 	@Test
 	public void testInsertVsModify() throws IOException {
-		assertEquals(t("a<bZ=XY>"), merge("ab", "abZ", "aXY"));
+		assertEquals(t("a<bZ=XY>"), merge("ab", "abZ", "aXY", false));
+		assertEquals(t("a<bZ|b=XY>"), merge("ab", "abZ", "aXY", true));
 	}
 
 	@Test
 	public void testAdjacentModifications() throws IOException {
-		assertEquals(t("a<Zc=bY>d"), merge("abcd", "aZcd", "abYd"));
+		assertEquals(t("a<Zc=bY>d"), merge("abcd", "aZcd", "abYd", false));
+		assertEquals(t("a<Zc|bc=bY>d"), merge("abcd", "aZcd", "abYd", true));
 	}
 
 	@Test
 	public void testSeparateModifications() throws IOException {
-		assertEquals(t("aZcYe"), merge("abcde", "aZcde", "abcYe"));
+		assertEquals(t("aZcYe"), merge("abcde", "aZcde", "abcYe", false));
+		assertEquals(t("aZcYe"), merge("abcde", "aZcde", "abcYe", true));
 	}
 
 	@Test
 	public void testBlankLines() throws IOException {
-		assertEquals(t("aZc\nYe"), merge("abc\nde", "aZc\nde", "abc\nYe"));
+		assertEquals(t("aZc\nYe"),
+				merge("abc\nde", "aZc\nde", "abc\nYe", false));
+		assertEquals(t("aZc\nYe"),
+				merge("abc\nde", "aZc\nde", "abc\nYe", true));
 	}
 
 	/**
@@ -214,11 +256,22 @@ public void testBlankLines() throws IOException {
 	 */
 	@Test
 	public void testTwoSimilarModsAndOneInsert() throws IOException {
-		assertEquals(t("aBcDde"), merge("abcde", "aBcde", "aBcDde"));
-		assertEquals(t("IAAAJCAB"), merge("iACAB", "IACAB", "IAAAJCAB"));
-		assertEquals(t("HIAAAJCAB"), merge("HiACAB", "HIACAB", "HIAAAJCAB"));
+		assertEquals(t("aBcDde"), merge("abcde", "aBcde", "aBcDde", false));
+		assertEquals(t("aBcDde"), merge("abcde", "aBcde", "aBcDde", true));
+
+		assertEquals(t("IAAAJCAB"), merge("iACAB", "IACAB", "IAAAJCAB", false));
+		assertEquals(t("IAAAJCAB"), merge("iACAB", "IACAB", "IAAAJCAB", true));
+
+		assertEquals(t("HIAAAJCAB"),
+				merge("HiACAB", "HIACAB", "HIAAAJCAB", false));
+		assertEquals(t("HIAAAJCAB"),
+				merge("HiACAB", "HIACAB", "HIAAAJCAB", true));
+
 		assertEquals(t("AGADEFHIAAAJCAB"),
-				merge("AGADEFHiACAB", "AGADEFHIACAB", "AGADEFHIAAAJCAB"));
+				merge("AGADEFHiACAB", "AGADEFHIACAB", "AGADEFHIAAAJCAB",
+						false));
+		assertEquals(t("AGADEFHIAAAJCAB"),
+				merge("AGADEFHiACAB", "AGADEFHIACAB", "AGADEFHIAAAJCAB", true));
 	}
 
 	/**
@@ -232,18 +285,28 @@ public void testTwoSimilarModsAndOneInsert() throws IOException {
 	@Test
 	public void testTwoSimilarModsAndOneInsertAtEnd() throws IOException {
 		Assume.assumeTrue(newlineAtEnd);
-		assertEquals(t("IAAJ"), merge("iA", "IA", "IAAJ"));
-		assertEquals(t("IAJ"), merge("iA", "IA", "IAJ"));
-		assertEquals(t("IAAAJ"), merge("iA", "IA", "IAAAJ"));
+		assertEquals(t("IAAJ"), merge("iA", "IA", "IAAJ", false));
+		assertEquals(t("IAAJ"), merge("iA", "IA", "IAAJ", true));
+
+		assertEquals(t("IAJ"), merge("iA", "IA", "IAJ", false));
+		assertEquals(t("IAJ"), merge("iA", "IA", "IAJ", true));
+
+		assertEquals(t("IAAAJ"), merge("iA", "IA", "IAAAJ", false));
+		assertEquals(t("IAAAJ"), merge("iA", "IA", "IAAAJ", true));
 	}
 
 	@Test
 	public void testTwoSimilarModsAndOneInsertAtEndNoNewlineAtEnd()
 			throws IOException {
 		Assume.assumeFalse(newlineAtEnd);
-		assertEquals(t("I<A=AAJ>"), merge("iA", "IA", "IAAJ"));
-		assertEquals(t("I<A=AJ>"), merge("iA", "IA", "IAJ"));
-		assertEquals(t("I<A=AAAJ>"), merge("iA", "IA", "IAAAJ"));
+		assertEquals(t("I<A=AAJ>"), merge("iA", "IA", "IAAJ", false));
+		assertEquals(t("I<A|A=AAJ>"), merge("iA", "IA", "IAAJ", true));
+
+		assertEquals(t("I<A=AJ>"), merge("iA", "IA", "IAJ", false));
+		assertEquals(t("I<A|A=AJ>"), merge("iA", "IA", "IAJ", true));
+
+		assertEquals(t("I<A=AAAJ>"), merge("iA", "IA", "IAAAJ", false));
+		assertEquals(t("I<A|A=AAAJ>"), merge("iA", "IA", "IAAAJ", true));
 	}
 
 	/**
@@ -254,22 +317,34 @@ public void testTwoSimilarModsAndOneInsertAtEndNoNewlineAtEnd()
 	@Test
 	public void testEmptyTexts() throws IOException {
 		// test modification against deletion
-		assertEquals(t("<AB=>"), merge("A", "AB", ""));
-		assertEquals(t("<=AB>"), merge("A", "", "AB"));
+		assertEquals(t("<AB=>"), merge("A", "AB", "", false));
+		assertEquals(t("<AB|A=>"), merge("A", "AB", "", true));
+
+		assertEquals(t("<=AB>"), merge("A", "", "AB", false));
+		assertEquals(t("<|A=AB>"), merge("A", "", "AB", true));
 
 		// test unmodified against deletion
-		assertEquals(t(""), merge("AB", "AB", ""));
-		assertEquals(t(""), merge("AB", "", "AB"));
+		assertEquals(t(""), merge("AB", "AB", "", false));
+		assertEquals(t(""), merge("AB", "AB", "", true));
+
+		assertEquals(t(""), merge("AB", "", "AB", false));
+		assertEquals(t(""), merge("AB", "", "AB", true));
 
 		// test deletion against deletion
-		assertEquals(t(""), merge("AB", "", ""));
+		assertEquals(t(""), merge("AB", "", "", false));
+		assertEquals(t(""), merge("AB", "", "", true));
 	}
 
-	private String merge(String commonBase, String ours, String theirs) throws IOException {
+	private String merge(String commonBase, String ours, String theirs,
+			boolean diff3) throws IOException {
 		MergeResult r = new MergeAlgorithm().merge(RawTextComparator.DEFAULT,
 				T(commonBase), T(ours), T(theirs));
 		ByteArrayOutputStream bo=new ByteArrayOutputStream(50);
-		fmt.formatMerge(bo, r, "B", "O", "T", UTF_8);
+		if (diff3) {
+			fmt.formatMergeDiff3(bo, r, "B", "O", "T", UTF_8);
+		} else {
+			fmt.formatMerge(bo, r, "B", "O", "T", UTF_8);
+		}
 		return new String(bo.toByteArray(), UTF_8);
 	}
 
@@ -284,6 +359,9 @@ public String t(String text) {
 			case '=':
 				r.append("=======\n");
 				break;
+			case '|':
+				r.append("||||||| B\n");
+				break;
 			case '>':
 				r.append(">>>>>>> T\n");
 				break;
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java
index 113f3be..01f6a3a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java
@@ -16,76 +16,74 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.io.IOException;
 import java.util.List;
 
 import org.eclipse.jgit.junit.RepositoryTestCase;
-import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.junit.Test;
 
 public class FooterLineTest extends RepositoryTestCase {
 	@Test
-	public void testNoFooters_EmptyBody() throws IOException {
-		final RevCommit commit = parse("");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_EmptyBody() {
+		String msg = buildMessage("");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testNoFooters_NewlineOnlyBody1() throws IOException {
-		final RevCommit commit = parse("\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_NewlineOnlyBody1() {
+		String msg = buildMessage("\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testNoFooters_NewlineOnlyBody5() throws IOException {
-		final RevCommit commit = parse("\n\n\n\n\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_NewlineOnlyBody5() {
+		String msg = buildMessage("\n\n\n\n\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testNoFooters_OneLineBodyNoLF() throws IOException {
-		final RevCommit commit = parse("this is a commit");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_OneLineBodyNoLF() {
+		String msg = buildMessage("this is a commit");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testNoFooters_OneLineBodyWithLF() throws IOException {
-		final RevCommit commit = parse("this is a commit\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_OneLineBodyWithLF() {
+		String msg = buildMessage("this is a commit\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testNoFooters_ShortBodyNoLF() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_ShortBodyNoLF() {
+		String msg = buildMessage("subject\n\nbody of commit");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testNoFooters_ShortBodyWithLF() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNoFooters_ShortBodyWithLF() {
+		String msg = buildMessage("subject\n\nbody of commit\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		assertNotNull(footers);
 		assertEquals(0, footers.size());
 	}
 
 	@Test
-	public void testSignedOffBy_OneUserNoLF() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Signed-off-by: A. U. Thor <a@example.com>");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testSignedOffBy_OneUserNoLF() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Signed-off-by: A. U. Thor <a@example.com>");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -98,10 +96,10 @@ public void testSignedOffBy_OneUserNoLF() throws IOException {
 	}
 
 	@Test
-	public void testSignedOffBy_OneUserWithLF() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Signed-off-by: A. U. Thor <a@example.com>\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testSignedOffBy_OneUserWithLF() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Signed-off-by: A. U. Thor <a@example.com>\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -114,14 +112,13 @@ public void testSignedOffBy_OneUserWithLF() throws IOException {
 	}
 
 	@Test
-	public void testSignedOffBy_IgnoreWhitespace() throws IOException {
+	public void testSignedOffBy_IgnoreWhitespace() {
 		// We only ignore leading whitespace on the value, trailing
 		// is assumed part of the value.
 		//
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Signed-off-by:   A. U. Thor <a@example.com>  \n");
-		final List<FooterLine> footers = commit.getFooterLines();
-		FooterLine f;
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Signed-off-by:   A. U. Thor <a@example.com>  \n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);		FooterLine f;
 
 		assertNotNull(footers);
 		assertEquals(1, footers.size());
@@ -133,10 +130,10 @@ public void testSignedOffBy_IgnoreWhitespace() throws IOException {
 	}
 
 	@Test
-	public void testEmptyValueNoLF() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Signed-off-by:");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testEmptyValueNoLF() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Signed-off-by:");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -149,10 +146,10 @@ public void testEmptyValueNoLF() throws IOException {
 	}
 
 	@Test
-	public void testEmptyValueWithLF() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Signed-off-by:\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testEmptyValueWithLF() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Signed-off-by:\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -165,10 +162,10 @@ public void testEmptyValueWithLF() throws IOException {
 	}
 
 	@Test
-	public void testShortKey() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "K:V\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testShortKey() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "K:V\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -181,10 +178,10 @@ public void testShortKey() throws IOException {
 	}
 
 	@Test
-	public void testNonDelimtedEmail() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Acked-by: re@example.com\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNonDelimtedEmail() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Acked-by: re@example.com\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -197,10 +194,10 @@ public void testNonDelimtedEmail() throws IOException {
 	}
 
 	@Test
-	public void testNotEmail() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n" + "\n"
-				+ "Acked-by: Main Tain Er\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testNotEmail() {
+		String msg = buildMessage("subject\n\nbody of commit\n" + "\n"
+			+ "Acked-by: Main Tain Er\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -213,15 +210,15 @@ public void testNotEmail() throws IOException {
 	}
 
 	@Test
-	public void testSignedOffBy_ManyUsers() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n"
-				+ "Not-A-Footer-Line: this line must not be read as a footer\n"
-				+ "\n" // paragraph break, now footers appear in final block
-				+ "Signed-off-by: A. U. Thor <a@example.com>\n"
-				+ "CC:            <some.mailing.list@example.com>\n"
-				+ "Acked-by: Some Reviewer <sr@example.com>\n"
-				+ "Signed-off-by: Main Tain Er <mte@example.com>\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testSignedOffBy_ManyUsers() {
+		String msg = buildMessage("subject\n\nbody of commit\n"
+			+ "Not-A-Footer-Line: this line must not be read as a footer\n"
+			+ "\n" // paragraph break, now footers appear in final block
+			+ "Signed-off-by: A. U. Thor <a@example.com>\n"
+			+ "CC:            <some.mailing.list@example.com>\n"
+			+ "Acked-by: Some Reviewer <sr@example.com>\n"
+			+ "Signed-off-by: Main Tain Er <mte@example.com>\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -249,16 +246,16 @@ public void testSignedOffBy_ManyUsers() throws IOException {
 	}
 
 	@Test
-	public void testSignedOffBy_SkipNonFooter() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n"
-				+ "Not-A-Footer-Line: this line must not be read as a footer\n"
-				+ "\n" // paragraph break, now footers appear in final block
-				+ "Signed-off-by: A. U. Thor <a@example.com>\n"
-				+ "CC:            <some.mailing.list@example.com>\n"
-				+ "not really a footer line but we'll skip it anyway\n"
-				+ "Acked-by: Some Reviewer <sr@example.com>\n"
-				+ "Signed-off-by: Main Tain Er <mte@example.com>\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testSignedOffBy_SkipNonFooter() {
+		String msg = buildMessage("subject\n\nbody of commit\n"
+			+ "Not-A-Footer-Line: this line must not be read as a footer\n"
+			+ "\n" // paragraph break, now footers appear in final block
+			+ "Signed-off-by: A. U. Thor <a@example.com>\n"
+			+ "CC:            <some.mailing.list@example.com>\n"
+			+ "not really a footer line but we'll skip it anyway\n"
+			+ "Acked-by: Some Reviewer <sr@example.com>\n"
+			+ "Signed-off-by: Main Tain Er <mte@example.com>\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 		FooterLine f;
 
 		assertNotNull(footers);
@@ -282,15 +279,16 @@ public void testSignedOffBy_SkipNonFooter() throws IOException {
 	}
 
 	@Test
-	public void testFilterFootersIgnoreCase() throws IOException {
-		final RevCommit commit = parse("subject\n\nbody of commit\n"
-				+ "Not-A-Footer-Line: this line must not be read as a footer\n"
-				+ "\n" // paragraph break, now footers appear in final block
-				+ "Signed-Off-By: A. U. Thor <a@example.com>\n"
-				+ "CC:            <some.mailing.list@example.com>\n"
-				+ "Acked-by: Some Reviewer <sr@example.com>\n"
-				+ "signed-off-by: Main Tain Er <mte@example.com>\n");
-		final List<String> footers = commit.getFooterLines("signed-off-by");
+	public void testFilterFootersIgnoreCase() {
+		String msg = buildMessage("subject\n\nbody of commit\n"
+			+ "Not-A-Footer-Line: this line must not be read as a footer\n"
+			+ "\n" // paragraph break, now footers appear in final block
+			+ "Signed-Off-By: A. U. Thor <a@example.com>\n"
+			+ "CC:            <some.mailing.list@example.com>\n"
+			+ "Acked-by: Some Reviewer <sr@example.com>\n"
+			+ "signed-off-by: Main Tain Er <mte@example.com>\n");
+		List<String> footers = FooterLine.getValues(
+			FooterLine.fromMessage(msg), "signed-off-by");
 
 		assertNotNull(footers);
 		assertEquals(2, footers.size());
@@ -300,38 +298,33 @@ public void testFilterFootersIgnoreCase() throws IOException {
 	}
 
 	@Test
-	public void testMatchesBugId() throws IOException {
-		final RevCommit commit = parse("this is a commit subject for test\n"
-				+ "\n" // paragraph break, now footers appear in final block
-				+ "Simple-Bug-Id: 42\n");
-		final List<FooterLine> footers = commit.getFooterLines();
+	public void testMatchesBugId() {
+		String msg = buildMessage("this is a commit subject for test\n"
+			+ "\n" // paragraph break, now footers appear in final block
+			+ "Simple-Bug-Id: 42\n");
+		List<FooterLine> footers = FooterLine.fromMessage(msg);
 
 		assertNotNull(footers);
 		assertEquals(1, footers.size());
 
-		final FooterLine line = footers.get(0);
+		FooterLine line = footers.get(0);
 		assertNotNull(line);
 		assertEquals("Simple-Bug-Id", line.getKey());
 		assertEquals("42", line.getValue());
 
-		final FooterKey bugid = new FooterKey("Simple-Bug-Id");
+		FooterKey bugid = new FooterKey("Simple-Bug-Id");
 		assertTrue("matches Simple-Bug-Id", line.matches(bugid));
 		assertFalse("not Signed-off-by", line.matches(FooterKey.SIGNED_OFF_BY));
 		assertFalse("not CC", line.matches(FooterKey.CC));
 	}
 
-	private RevCommit parse(String msg) throws IOException {
-		final StringBuilder buf = new StringBuilder();
+	private String buildMessage(String msg) {
+		StringBuilder buf = new StringBuilder();
 		buf.append("tree " + ObjectId.zeroId().name() + "\n");
 		buf.append("author A. U. Thor <a@example.com> 1 +0000\n");
 		buf.append("committer A. U. Thor <a@example.com> 1 +0000\n");
 		buf.append("\n");
 		buf.append(msg);
-
-		try (RevWalk walk = new RevWalk(db)) {
-			RevCommit c = new RevCommit(ObjectId.zeroId());
-			c.parseCanonical(walk, Constants.encode(buf.toString()));
-			return c;
-		}
+		return buf.toString();
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java
index 3cc0368..8215a79 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java
@@ -26,6 +26,8 @@
 import java.util.List;
 
 import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.diff.DiffConfig;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.storage.file.GC;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ConfigConstants;
@@ -33,6 +35,7 @@
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.revwalk.filter.MessageRevFilter;
 import org.eclipse.jgit.revwalk.filter.RevFilter;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
@@ -46,6 +49,7 @@ public class RevWalkCommitGraphTest extends RevWalkTestCase {
 	public void setUp() throws Exception {
 		super.setUp();
 		rw = new RevWalk(db);
+		mockSystemReader.setJGitConfig(new MockConfig());
 	}
 
 	@Test
@@ -167,6 +171,72 @@ public void testTreeFilter() throws Exception {
 	}
 
 	@Test
+	public void testChangedPathFilter() throws Exception {
+		RevCommit c1 = commitFile("file1", "1", "master");
+		commitFile("file2", "2", "master");
+		RevCommit c3 = commitFile("file1", "3", "master");
+		RevCommit c4 = commitFile("file2", "4", "master");
+
+		enableAndWriteCommitGraph();
+
+		TreeRevFilter trf = new TreeRevFilter(rw, PathFilter.create("file1"));
+		rw.markStart(rw.lookupCommit(c4));
+		rw.setRevFilter(trf);
+		assertEquals(c3, rw.next());
+		assertEquals(c1, rw.next());
+		assertNull(rw.next());
+
+		// 1 commit that has exactly one parent and matches path
+		assertEquals(1, trf.getChangedPathFilterTruePositive());
+
+		// No false positives
+		assertEquals(0, trf.getChangedPathFilterFalsePositive());
+
+		// 2 commits that have exactly one parent and don't match path
+		assertEquals(2, trf.getChangedPathFilterNegative());
+	}
+
+	@Test
+	public void testChangedPathFilterWithFollowFilter() throws Exception {
+		RevCommit c0 = commit(tree());
+		RevCommit c1 = commit(tree(file("file", blob("contents"))), c0);
+		RevCommit c2 = commit(tree(file("file", blob("contents")),
+				file("unrelated", blob("unrelated change"))), c1);
+		RevCommit c3 = commit(tree(file("renamed-file", blob("contents")),
+				file("unrelated", blob("unrelated change"))), c2);
+		RevCommit c4 = commit(
+				tree(file("renamed-file", blob("contents")),
+						file("unrelated", blob("another unrelated change"))),
+				c3);
+		branch(c4, "master");
+
+		enableAndWriteCommitGraph();
+
+		db.getConfig().setString(ConfigConstants.CONFIG_DIFF_SECTION, null,
+				ConfigConstants.CONFIG_KEY_RENAMES, "true");
+
+		TreeRevFilter trf = new TreeRevFilter(rw,
+				new FollowFilter(PathFilter.create("renamed-file"),
+						db.getConfig().get(DiffConfig.KEY)));
+		rw.markStart(rw.lookupCommit(c4));
+		rw.setRevFilter(trf);
+		assertEquals(c3, rw.next());
+		assertEquals(c1, rw.next());
+		assertNull(rw.next());
+
+		// Path "renamed-file" is in c3's bloom filter, and another path "file"
+		// is in c1's bloom filter (we know of "file" because the rev walk
+		// detected that "renamed-file" is a renaming of "file")
+		assertEquals(2, trf.getChangedPathFilterTruePositive());
+
+		// No false positives
+		assertEquals(0, trf.getChangedPathFilterFalsePositive());
+
+		// 2 commits that have exactly one parent and don't match path
+		assertEquals(2, trf.getChangedPathFilterNegative());
+	}
+
+	@Test
 	public void testWalkWithCommitMessageFilter() throws Exception {
 		RevCommit a = commit();
 		RevCommit b = commitBuilder().parent(a)
@@ -437,6 +507,8 @@ void enableAndWriteCommitGraph() throws Exception {
 				ConfigConstants.CONFIG_COMMIT_GRAPH, true);
 		db.getConfig().setBoolean(ConfigConstants.CONFIG_GC_SECTION, null,
 				ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true);
+		db.getConfig().setBoolean(ConfigConstants.CONFIG_GC_SECTION, null,
+				ConfigConstants.CONFIG_KEY_WRITE_CHANGED_PATHS, true);
 		GC gc = new GC(db);
 		gc.gc().get();
 	}
@@ -445,4 +517,41 @@ private void reinitializeRevWalk() {
 		rw.close();
 		rw = new RevWalk(db);
 	}
+
+	private static final class MockConfig extends FileBasedConfig {
+		private MockConfig() {
+			super(null, null);
+		}
+
+		@Override
+		public void load() throws IOException, ConfigInvalidException {
+			// Do nothing
+		}
+
+		@Override
+		public void save() throws IOException {
+			// Do nothing
+		}
+
+		@Override
+		public boolean isOutdated() {
+			return false;
+		}
+
+		@Override
+		public String toString() {
+			return "MockConfig";
+		}
+
+		@Override
+		public boolean getBoolean(final String section, final String name,
+				final boolean defaultValue) {
+			if (section.equals(ConfigConstants.CONFIG_COMMIT_GRAPH_SECTION)
+					&& name.equals(
+							ConfigConstants.CONFIG_KEY_READ_CHANGED_PATHS)) {
+				return true;
+			}
+			return defaultValue;
+		}
+	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFollowFilterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFollowFilterTest.java
index c62136e..5203e3f 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFollowFilterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkFollowFilterTest.java
@@ -27,9 +27,17 @@ public class RevWalkFollowFilterTest extends RevWalkTestCase {
 	private static class DiffCollector extends RenameCallback {
 		List<DiffEntry> diffs = new ArrayList<>();
 
+		List<RevCommit> commits = new ArrayList<>();
+
 		@Override
 		public void renamed(DiffEntry diff) {
+			throw new UnsupportedOperationException("unimplemented");
+		}
+
+		@Override
+		public void renamed(DiffEntry diff, RevCommit commit) {
 			diffs.add(diff);
+			commits.add(commit);
 		}
 	}
 
@@ -77,6 +85,7 @@ public void testSingleRename() throws Exception {
 		assertNull(rw.next());
 
 		assertRenames("a->b");
+		assertRenameCommits(renameCommit);
 	}
 
 	@Test
@@ -108,6 +117,7 @@ public void testMultiRename() throws Exception {
 		assertNull(rw.next());
 
 		assertRenames("c->a", "b->c", "a->b");
+		assertRenameCommits(renameCommit3, renameCommit2, renameCommit1);
 	}
 
 	/**
@@ -136,6 +146,20 @@ protected void assertRenames(String... expectedRenames) {
 		}
 	}
 
+	protected void assertRenameCommits(RevCommit... expectedCommits) {
+		Assert.assertEquals(
+				"Unexpected number of rename commits. Expected: "
+						+ expectedCommits.length + ", actual: "
+						+ diffCollector.diffs.size(),
+				expectedCommits.length, diffCollector.diffs.size());
+
+		for (int i = 0; i < expectedCommits.length; i++) {
+			RevCommit renameCommit = diffCollector.commits.get(i);
+			Assert.assertNotNull(renameCommit);
+			Assert.assertEquals(expectedCommits[i], renameCommit);
+		}
+	}
+
 	protected void assertNoRenames() {
 		Assert.assertEquals("Found unexpected rename/copy diff", 0,
 				diffCollector.diffs.size());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/HttpAuthTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/HttpAuthTest.java
index 947ca97..c1ab43e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/HttpAuthTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/HttpAuthTest.java
@@ -160,7 +160,7 @@ private void parseHeaders(String[] headers) {
 				String value = header.substring(i + 1).trim();
 
 				if (!headerFields.containsKey(key))
-					headerFields.put(key, new ArrayList<String>());
+					headerFields.put(key, new ArrayList<>());
 
 				List<String> values = headerFields.get(key);
 				values.add(value);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/InMemoryPack.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/InMemoryPack.java
new file mode 100644
index 0000000..cad80ef
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/InMemoryPack.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2023, Google LLC. and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.transport;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.util.zip.Deflater;
+
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.util.NB;
+import org.eclipse.jgit.util.TemporaryBuffer;
+import org.eclipse.jgit.util.TemporaryBuffer.Heap;
+
+/**
+ * Helper class to create packs for tests.
+ */
+public class InMemoryPack {
+
+  private final Heap tinyPack;
+
+  public InMemoryPack() {
+    this(1024);
+  }
+
+  public InMemoryPack(int size) {
+    this.tinyPack = new TemporaryBuffer.Heap(size);
+  }
+
+  public InMemoryPack header(int cnt)
+      throws IOException {
+    final byte[] hdr = new byte[8];
+    NB.encodeInt32(hdr, 0, 2);
+    NB.encodeInt32(hdr, 4, cnt);
+
+    tinyPack.write(Constants.PACK_SIGNATURE);
+    tinyPack.write(hdr, 0, 8);
+    return this;
+  }
+
+  public InMemoryPack write(int i) throws IOException {
+    tinyPack.write(i);
+    return this;
+  }
+
+  public InMemoryPack deflate(byte[] content)
+      throws IOException {
+    Deflater deflater = new Deflater();
+    byte[] buf = new byte[128];
+    deflater.setInput(content, 0, content.length);
+    deflater.finish();
+    do {
+      final int n = deflater.deflate(buf, 0, buf.length);
+      if (n > 0)
+        tinyPack.write(buf, 0, n);
+    } while (!deflater.finished());
+    return this;
+  }
+
+  public InMemoryPack copyRaw(AnyObjectId o) throws IOException {
+    o.copyRawTo(tinyPack);
+    return this;
+  }
+
+  public InMemoryPack digest() throws IOException {
+    MessageDigest md = Constants.newMessageDigest();
+    md.update(tinyPack.toByteArray());
+    tinyPack.write(md.digest());
+    return this;
+  }
+
+  public InputStream toInputStream() throws IOException {
+    return new ByteArrayInputStream(tinyPack.toByteArray());
+  }
+
+  public byte[] toByteArray() throws IOException {
+    return tinyPack.toByteArray();
+  }
+}
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 f02428e..2fd82e7 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
@@ -22,12 +22,10 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.security.MessageDigest;
 import java.text.MessageFormat;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.zip.Deflater;
 
 import org.eclipse.jgit.errors.TooLargeObjectInPackException;
 import org.eclipse.jgit.internal.JGitText;
@@ -42,8 +40,6 @@
 import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevBlob;
-import org.eclipse.jgit.util.NB;
-import org.eclipse.jgit.util.TemporaryBuffer;
 import org.eclipse.jgit.util.io.UnionInputStream;
 import org.junit.After;
 import org.junit.Test;
@@ -193,17 +189,14 @@ public void testTinyThinPack() throws Exception {
 			a = d.blob("a");
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-
-		packHeader(pack, 1);
-
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
-		a.copyRawTo(pack);
-		deflate(pack, new byte[] { 0x1, 0x1, 0x1, 'b' });
+		pack.copyRaw(a);
+		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
+		pack.digest();
 
-		digest(pack);
-
-		PackParser p = index(new ByteArrayInputStream(pack.toByteArray()));
+		PackParser p = index(pack.toInputStream());
 		p.setAllowThin(true);
 		p.parse(NullProgressMonitor.INSTANCE);
 	}
@@ -216,14 +209,14 @@ public void testPackWithDuplicateBlob() throws Exception {
 			assertTrue(db.getObjectDatabase().has(d.blob(data)));
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_BLOB) << 4 | 0x80 | 1);
 		pack.write(1);
-		deflate(pack, data);
-		digest(pack);
+		pack.deflate(data);
+		pack.digest();
 
-		PackParser p = index(new ByteArrayInputStream(pack.toByteArray()));
+		PackParser p = index(pack.toInputStream());
 		p.setAllowThin(false);
 		p.parse(NullProgressMonitor.INSTANCE);
 	}
@@ -236,16 +229,16 @@ public void testParseOfsDeltaFullSize() throws Exception {
 			assertTrue(db.getObjectDatabase().has(d.blob(data)));
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-		packHeader(pack, 2);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(2);
 		pack.write((Constants.OBJ_BLOB) << 4 | 10); // offset 12
-		deflate(pack, data);
+		pack.deflate(data);
 		pack.write((Constants.OBJ_OFS_DELTA) << 4 | 4); // offset 31
 		pack.write(19);
-		deflate(pack, new byte[] { 0xA, 0xB, 0x1, 'b' });
-		digest(pack);
+		pack.deflate(new byte[] { 0xA, 0xB, 0x1, 'b' });
+		pack.digest();
 
-		PackParser p = index(new ByteArrayInputStream(pack.toByteArray()));
+		PackParser p = index(pack.toInputStream());
 		p.parse(NullProgressMonitor.INSTANCE);
 
 		List<PackedObjectInfo> sortedObjectList = p.getSortedObjectList(null);
@@ -275,15 +268,15 @@ public void testPackWithTrailingGarbage() throws Exception {
 			a = d.blob("a");
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
-		a.copyRawTo(pack);
-		deflate(pack, new byte[] { 0x1, 0x1, 0x1, 'b' });
-		digest(pack);
+		pack.copyRaw(a);
+		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
+		pack.digest();
 
 		PackParser p = index(new UnionInputStream(
-				new ByteArrayInputStream(pack.toByteArray()),
+				pack.toInputStream(),
 				new ByteArrayInputStream(new byte[] { 0x7e })));
 		p.setAllowThin(true);
 		p.setCheckEofAfterPackFooter(true);
@@ -305,22 +298,21 @@ public void testMaxObjectSizeFullBlob() throws Exception {
 			d.blob(data);
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_BLOB) << 4 | 10);
-		deflate(pack, data);
-		digest(pack);
+		pack.deflate(data);
+		pack.digest();
 
-		PackParser p = index(new ByteArrayInputStream(pack.toByteArray()));
+		PackParser p = index(pack.toInputStream());
 		p.setMaxObjectSizeLimit(11);
 		p.parse(NullProgressMonitor.INSTANCE);
 
-		p = index(new ByteArrayInputStream(pack.toByteArray()));
+		p = index(pack.toInputStream());
 		p.setMaxObjectSizeLimit(10);
 		p.parse(NullProgressMonitor.INSTANCE);
 
-		p = index(new ByteArrayInputStream(pack.toByteArray()));
+		p = index(pack.toInputStream());
 		p.setMaxObjectSizeLimit(9);
 		try {
 			p.parse(NullProgressMonitor.INSTANCE);
@@ -339,21 +331,20 @@ public void testMaxObjectSizeDeltaBlock() throws Exception {
 			a = d.blob("a");
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_REF_DELTA) << 4 | 14);
-		a.copyRawTo(pack);
-		deflate(pack, new byte[] { 1, 11, 11, 'a', '0', '1', '2', '3', '4',
+		pack.copyRaw(a);
+		pack.deflate(new byte[] { 1, 11, 11, 'a', '0', '1', '2', '3', '4',
 				'5', '6', '7', '8', '9' });
-		digest(pack);
+		pack.digest();
 
-		PackParser p = index(new ByteArrayInputStream(pack.toByteArray()));
+		PackParser p = index(pack.toInputStream());
 		p.setAllowThin(true);
 		p.setMaxObjectSizeLimit(14);
 		p.parse(NullProgressMonitor.INSTANCE);
 
-		p = index(new ByteArrayInputStream(pack.toByteArray()));
+		p = index(pack.toInputStream());
 		p.setAllowThin(true);
 		p.setMaxObjectSizeLimit(13);
 		try {
@@ -373,20 +364,19 @@ public void testMaxObjectSizeDeltaResultSize() throws Exception {
 			a = d.blob("0123456789");
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
-		a.copyRawTo(pack);
-		deflate(pack, new byte[] { 10, 11, 1, 'a' });
-		digest(pack);
+		pack.copyRaw(a);
+		pack.deflate(new byte[] { 10, 11, 1, 'a' });
+		pack.digest();
 
-		PackParser p = index(new ByteArrayInputStream(pack.toByteArray()));
+		PackParser p = index(pack.toInputStream());
 		p.setAllowThin(true);
 		p.setMaxObjectSizeLimit(11);
 		p.parse(NullProgressMonitor.INSTANCE);
 
-		p = index(new ByteArrayInputStream(pack.toByteArray()));
+		p = index(pack.toInputStream());
 		p.setAllowThin(true);
 		p.setMaxObjectSizeLimit(10);
 		try {
@@ -406,12 +396,12 @@ public void testNonMarkingInputStream() throws Exception {
 			a = d.blob("a");
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
-		a.copyRawTo(pack);
-		deflate(pack, new byte[] { 0x1, 0x1, 0x1, 'b' });
-		digest(pack);
+		pack.copyRaw(a);
+		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
+		pack.digest();
 
 		InputStream in = new ByteArrayInputStream(pack.toByteArray()) {
 			@Override
@@ -447,12 +437,12 @@ public void testDataAfterPackFooterSingleRead() throws Exception {
 			a = d.blob("a");
 		}
 
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(32*1024);
-		packHeader(pack, 1);
+		InMemoryPack pack = new InMemoryPack();
+		pack.header(1);
 		pack.write((Constants.OBJ_REF_DELTA) << 4 | 4);
-		a.copyRawTo(pack);
-		deflate(pack, new byte[] { 0x1, 0x1, 0x1, 'b' });
-		digest(pack);
+		pack.copyRaw(a);
+		pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
+		pack.digest();
 
 		byte packData[] = pack.toByteArray();
 		byte streamData[] = new byte[packData.length + 1];
@@ -476,14 +466,14 @@ public void testDataAfterPackFooterSplitObjectRead() throws Exception {
 
 		// Build a pack ~17k
 		int objects = 900;
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(32 * 1024);
-		packHeader(pack, objects);
+		InMemoryPack pack = new InMemoryPack(32 * 1024);
+		pack.header(objects);
 
 		for (int i = 0; i < objects; i++) {
 			pack.write((Constants.OBJ_BLOB) << 4 | 10);
-			deflate(pack, data);
+			pack.deflate(data);
 		}
-		digest(pack);
+		pack.digest();
 
 		byte packData[] = pack.toByteArray();
 		byte streamData[] = new byte[packData.length + 1];
@@ -510,8 +500,9 @@ public void testDataAfterPackFooterSplitHeaderRead() throws Exception {
 		}
 
 		int objects = 248;
-		TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(32 * 1024);
-		packHeader(pack, objects + 1);
+		InMemoryPack pack = new InMemoryPack(32 * 1024);
+		pack.header(objects + 1);
+
 		int offset = 13;
 		StringBuilder sb = new StringBuilder();
 		for (int i = 0; i < offset; i++)
@@ -529,16 +520,16 @@ public void testDataAfterPackFooterSplitHeaderRead() throws Exception {
 				lenByte |= 1 << 7;
 			pack.write(lenByte);
 		}
-		deflate(pack, Constants.encode(sb.toString()));
+		pack.deflate(Constants.encode(sb.toString()));
 
 		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);
-			b.copyRawTo(pack);
-			deflate(pack, new byte[] { 0x1, 0x1, 0x1, 'b' });
+			pack.copyRaw(b);
+			pack.deflate(new byte[] { 0x1, 0x1, 0x1, 'b' });
 		}
-		digest(pack);
+		pack.digest();
 
 		byte packData[] = pack.toByteArray();
 		byte streamData[] = new byte[packData.length + 1];
@@ -555,36 +546,6 @@ public void testDataAfterPackFooterSplitHeaderRead() throws Exception {
 		assertEquals(0x7e, in.read());
 	}
 
-	private static void packHeader(TemporaryBuffer.Heap tinyPack, int cnt)
-			throws IOException {
-		final byte[] hdr = new byte[8];
-		NB.encodeInt32(hdr, 0, 2);
-		NB.encodeInt32(hdr, 4, cnt);
-
-		tinyPack.write(Constants.PACK_SIGNATURE);
-		tinyPack.write(hdr, 0, 8);
-	}
-
-	private static void deflate(TemporaryBuffer.Heap tinyPack,
-			final byte[] content)
-			throws IOException {
-		final Deflater deflater = new Deflater();
-		final byte[] buf = new byte[128];
-		deflater.setInput(content, 0, content.length);
-		deflater.finish();
-		do {
-			final int n = deflater.deflate(buf, 0, buf.length);
-			if (n > 0)
-				tinyPack.write(buf, 0, n);
-		} while (!deflater.finished());
-	}
-
-	private static void digest(TemporaryBuffer.Heap buf) throws IOException {
-		MessageDigest md = Constants.newMessageDigest();
-		md.update(buf.toByteArray());
-		buf.write(md.digest());
-	}
-
 	private ObjectInserter inserter;
 
 	@After
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 9755ed1..f9687f9 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
@@ -2168,12 +2168,12 @@ public void testV2FetchWantRef() throws Exception {
 	/**
 	 * <pre>
 	 * remote:
-	 *    foo <- foofoo <-- branchFoo
-	 *    bar <- barbar <-- branchBar
+	 *    foo &lt;- foofoo &lt;-- branchFoo
+	 *    bar &lt;- barbar &lt;-- branchBar
 	 *
 	 * client:
-	 *    foo <-- branchFoo
-	 *    bar <-- branchBar
+	 *    foo &lt;-- branchFoo
+	 *    bar &lt;-- branchBar
 	 *
 	 * fetch(branchFoo) should send exactly 1 have (i.e. foo) from branchFoo
 	 * </pre>
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTest.java
index 0b5a735..d6f4f18 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTest.java
@@ -53,8 +53,8 @@ public void testRecursiveFiltering() throws IOException {
 	@Test
 	public void testEdgeCases() throws IOException {
 		ObjectId treeId = createTree("abc", "abcd", "bcd", "c");
-		assertEquals(new ArrayList<String>(), getMatchingPaths("xbcd", treeId));
-		assertEquals(new ArrayList<String>(), getMatchingPaths("abcx", treeId));
+		assertEquals(new ArrayList<>(), getMatchingPaths("xbcd", treeId));
+		assertEquals(new ArrayList<>(), getMatchingPaths("abcx", treeId));
 		assertEquals(Arrays.asList("abcd"), getMatchingPaths("abcd", treeId));
 		assertEquals(Arrays.asList("abcd", "bcd"), getMatchingPaths("bcd", treeId));
 		assertEquals(Arrays.asList("abc", "c"), getMatchingPaths("c", treeId));
diff --git a/org.eclipse.jgit.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.ui/.settings/org.eclipse.jdt.core.prefs
index 0857bc1..3a92f0c 100644
--- a/org.eclipse.jgit.ui/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit.ui/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
index a96211a..c0dc99e 100644
--- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
@@ -4,14 +4,14 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit.ui
 Bundle-SymbolicName: org.eclipse.jgit.ui
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-11
-Export-Package: org.eclipse.jgit.awtui;version="6.6.1"
-Import-Package: org.eclipse.jgit.errors;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.lib;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.nls;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revplot;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.revwalk;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.transport;version="[6.6.1,6.7.0)",
- org.eclipse.jgit.util;version="[6.6.1,6.7.0)"
+Export-Package: org.eclipse.jgit.awtui;version="6.7.0"
+Import-Package: org.eclipse.jgit.errors;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.lib;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.nls;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revplot;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.revwalk;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.transport;version="[6.7.0,6.8.0)",
+ org.eclipse.jgit.util;version="[6.7.0,6.8.0)"
diff --git a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
index f597380..9439deb 100644
--- a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit.ui - Sources
 Bundle-SymbolicName: org.eclipse.jgit.ui.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.ui;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.ui;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml
index a909751..0170c7d 100644
--- a/org.eclipse.jgit.ui/pom.xml
+++ b/org.eclipse.jgit.ui/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ui</artifactId>
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtAuthenticator.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtAuthenticator.java
index 56655b3..2b078c1 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtAuthenticator.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtAuthenticator.java
@@ -36,7 +36,6 @@ public static void install() {
 		setDefault(new AwtAuthenticator());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected PasswordAuthentication promptPasswordAuthentication() {
 		final GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1,
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java
index 0403957..729f4cb 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java
@@ -43,13 +43,11 @@ public static void install() {
 		CredentialsProvider.setDefault(cp);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -71,7 +69,6 @@ else if (i instanceof CredentialItem.InformationalMessage)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean get(URIish uri, CredentialItem... items)
 			throws UnsupportedCredentialItem {
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/CommitGraphPane.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/CommitGraphPane.java
index dcf3c1d..a266a2f 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/CommitGraphPane.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/CommitGraphPane.java
@@ -80,7 +80,6 @@ public PlotCommitList getCommitList() {
 		return allCommits;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setModel(TableModel dataModel) {
 		if (dataModel != null && !(dataModel instanceof CommitTableModel))
@@ -88,7 +87,6 @@ public void setModel(TableModel dataModel) {
 		super.setModel(dataModel);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected TableModel createDefaultDataModel() {
 		return new CommitTableModel();
diff --git a/org.eclipse.jgit/.settings/.api_filters b/org.eclipse.jgit/.settings/.api_filters
index 75697fd..253ef37 100644
--- a/org.eclipse.jgit/.settings/.api_filters
+++ b/org.eclipse.jgit/.settings/.api_filters
@@ -1,40 +1,16 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <component id="org.eclipse.jgit" version="2">
-    <resource path="src/org/eclipse/jgit/errors/PackMismatchException.java" type="org.eclipse.jgit.errors.PackMismatchException">
-        <filter id="1142947843">
+    <resource path="src/org/eclipse/jgit/lib/Constants.java" type="org.eclipse.jgit.lib.Constants">
+        <filter id="388100214">
             <message_arguments>
-                <message_argument value="5.9.1"/>
-                <message_argument value="isPermanent()"/>
+                <message_argument value="org.eclipse.jgit.lib.Constants"/>
+                <message_argument value="COMMIT_GENERATION_NOT_COMPUTED"/>
             </message_arguments>
         </filter>
-        <filter id="1142947843">
+        <filter id="388100214">
             <message_arguments>
-                <message_argument value="5.9.1"/>
-                <message_argument value="setPermanent(boolean)"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/lib/ConfigConstants.java" type="org.eclipse.jgit.lib.ConfigConstants">
-        <filter id="1142947843">
-            <message_arguments>
-                <message_argument value="5.13.2"/>
-                <message_argument value="CONFIG_KEY_SKIPHASH"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/revwalk/RevCommit.java" type="org.eclipse.jgit.revwalk.RevCommit">
-        <filter id="1193279491">
-            <message_arguments>
-                <message_argument value="6.5.1"/>
-                <message_argument value="buffer"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/storage/pack/PackConfig.java" type="org.eclipse.jgit.storage.pack.PackConfig">
-        <filter id="336658481">
-            <message_arguments>
-                <message_argument value="org.eclipse.jgit.storage.pack.PackConfig"/>
-                <message_argument value="DEFAULT_WRITE_REVERSE_INDEX"/>
+                <message_argument value="org.eclipse.jgit.lib.Constants"/>
+                <message_argument value="COMMIT_GENERATION_UNKNOWN"/>
             </message_arguments>
         </filter>
     </resource>
diff --git a/org.eclipse.jgit/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit/.settings/org.eclipse.jdt.core.prefs
index 2abe952..b27b6c3 100644
--- a/org.eclipse.jgit/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.jgit/.settings/org.eclipse.jdt.core.prefs
@@ -52,7 +52,7 @@
 org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
 org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
 org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
diff --git a/org.eclipse.jgit/BUILD b/org.eclipse.jgit/BUILD
index e806e7d..1e9b770 100644
--- a/org.eclipse.jgit/BUILD
+++ b/org.eclipse.jgit/BUILD
@@ -20,6 +20,7 @@
     resources = RESOURCES,
     deps = [
         ":insecure_cipher_factory",
+        "//lib:commons-codec",
         "//lib:javaewah",
         "//lib:slf4j-api",
     ],
diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF
index cd3b59a..84b2987 100644
--- a/org.eclipse.jgit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/MANIFEST.MF
@@ -3,12 +3,12 @@
 Bundle-Name: %Bundle-Name
 Automatic-Module-Name: org.eclipse.jgit
 Bundle-SymbolicName: org.eclipse.jgit
-Bundle-Version: 6.6.1.qualifier
+Bundle-Version: 6.7.0.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %Bundle-Vendor
 Eclipse-ExtensibleAPI: true
-Export-Package: org.eclipse.jgit.annotations;version="6.6.1",
- org.eclipse.jgit.api;version="6.6.1";
+Export-Package: org.eclipse.jgit.annotations;version="6.7.0",
+ org.eclipse.jgit.api;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.notes,
    org.eclipse.jgit.dircache,
@@ -23,18 +23,18 @@
    org.eclipse.jgit.revwalk.filter,
    org.eclipse.jgit.blame,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.api.errors;version="6.6.1";
+ org.eclipse.jgit.api.errors;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.errors",
- org.eclipse.jgit.attributes;version="6.6.1";
+ org.eclipse.jgit.attributes;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.blame;version="6.6.1";
+ org.eclipse.jgit.blame;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.diff",
- org.eclipse.jgit.diff;version="6.6.1";
+ org.eclipse.jgit.diff;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.revwalk,
@@ -42,53 +42,53 @@
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.dircache;version="6.6.1";
+ org.eclipse.jgit.dircache;version="6.7.0";
   uses:="org.eclipse.jgit.events,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.errors;version="6.6.1";
+ org.eclipse.jgit.errors;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.internal.storage.pack",
- org.eclipse.jgit.events;version="6.6.1";
+ org.eclipse.jgit.events;version="6.7.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.fnmatch;version="6.6.1",
- org.eclipse.jgit.gitrepo;version="6.6.1";
+ org.eclipse.jgit.fnmatch;version="6.7.0",
+ org.eclipse.jgit.gitrepo;version="6.7.0";
   uses:="org.xml.sax.helpers,
    org.eclipse.jgit.api,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.xml.sax",
- org.eclipse.jgit.gitrepo.internal;version="6.6.1";x-internal:=true,
- org.eclipse.jgit.hooks;version="6.6.1";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.ignore;version="6.6.1",
- org.eclipse.jgit.ignore.internal;version="6.6.1";
+ org.eclipse.jgit.gitrepo.internal;version="6.7.0";x-internal:=true,
+ org.eclipse.jgit.hooks;version="6.7.0";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.ignore;version="6.7.0",
+ org.eclipse.jgit.ignore.internal;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal;version="6.6.1";
+ org.eclipse.jgit.internal;version="6.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.http.test",
- org.eclipse.jgit.internal.diff;version="6.6.1";
+ org.eclipse.jgit.internal.diff;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.diffmergetool;version="6.6.1";
+ org.eclipse.jgit.internal.diffmergetool;version="6.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.pgm,
    org.eclipse.egit.ui",
- org.eclipse.jgit.internal.fsck;version="6.6.1";
+ org.eclipse.jgit.internal.fsck;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.revwalk;version="6.6.1";
+ org.eclipse.jgit.internal.revwalk;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.commitgraph;version="6.6.1";
+ org.eclipse.jgit.internal.storage.commitgraph;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.dfs;version="6.6.1";
+ org.eclipse.jgit.internal.storage.dfs;version="6.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.http.server,
    org.eclipse.jgit.http.test,
    org.eclipse.jgit.lfs.test",
- org.eclipse.jgit.internal.storage.file;version="6.6.1";
+ org.eclipse.jgit.internal.storage.file;version="6.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.junit,
    org.eclipse.jgit.junit.http,
@@ -97,34 +97,34 @@
    org.eclipse.jgit.pgm,
    org.eclipse.jgit.pgm.test,
    org.eclipse.jgit.ssh.apache",
- org.eclipse.jgit.internal.storage.io;version="6.6.1";
+ org.eclipse.jgit.internal.storage.io;version="6.7.0";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.memory;version="6.6.1";
+ org.eclipse.jgit.internal.storage.memory;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.storage.pack;version="6.6.1";
+ org.eclipse.jgit.internal.storage.pack;version="6.7.0";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.reftable;version="6.6.1";
+ org.eclipse.jgit.internal.storage.reftable;version="6.7.0";
   x-friends:="org.eclipse.jgit.http.test,
    org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.submodule;version="6.6.1";x-internal:=true,
- org.eclipse.jgit.internal.transport.connectivity;version="6.6.1";
+ org.eclipse.jgit.internal.submodule;version="6.7.0";x-internal:=true,
+ org.eclipse.jgit.internal.transport.connectivity;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.http;version="6.6.1";
+ org.eclipse.jgit.internal.transport.http;version="6.7.0";
   x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.parser;version="6.6.1";
+ org.eclipse.jgit.internal.transport.parser;version="6.7.0";
   x-friends:="org.eclipse.jgit.http.server,
    org.eclipse.jgit.test",
- org.eclipse.jgit.internal.transport.ssh;version="6.6.1";
+ org.eclipse.jgit.internal.transport.ssh;version="6.7.0";
   x-friends:="org.eclipse.jgit.ssh.apache,
    org.eclipse.jgit.ssh.jsch,
    org.eclipse.jgit.test",
- org.eclipse.jgit.lib;version="6.6.1";
+ org.eclipse.jgit.lib;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util.sha1,
    org.eclipse.jgit.dircache,
@@ -138,12 +138,12 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.submodule,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.lib.internal;version="6.6.1";
+ org.eclipse.jgit.lib.internal;version="6.7.0";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.pgm,
    org.eclipse.egit.ui",
- org.eclipse.jgit.logging;version="6.6.1",
- org.eclipse.jgit.merge;version="6.6.1";
+ org.eclipse.jgit.logging;version="6.7.0",
+ org.eclipse.jgit.merge;version="6.7.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -152,40 +152,40 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.api,
    org.eclipse.jgit.attributes",
- org.eclipse.jgit.nls;version="6.6.1",
- org.eclipse.jgit.notes;version="6.6.1";
+ org.eclipse.jgit.nls;version="6.7.0",
+ org.eclipse.jgit.notes;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.patch;version="6.6.1";
+ org.eclipse.jgit.patch;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.diff",
- org.eclipse.jgit.revplot;version="6.6.1";
+ org.eclipse.jgit.revplot;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk",
- org.eclipse.jgit.revwalk;version="6.6.1";
+ org.eclipse.jgit.revwalk;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.revwalk.filter,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.revwalk.filter;version="6.6.1";
+ org.eclipse.jgit.revwalk.filter;version="6.7.0";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.storage.file;version="6.6.1";
+ org.eclipse.jgit.storage.file;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.util",
- org.eclipse.jgit.storage.pack;version="6.6.1";
+ org.eclipse.jgit.storage.pack;version="6.7.0";
   uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.submodule;version="6.6.1";
+ org.eclipse.jgit.submodule;version="6.7.0";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util",
- org.eclipse.jgit.transport;version="6.6.1";
+ org.eclipse.jgit.transport;version="6.7.0";
   uses:="javax.crypto,
    org.eclipse.jgit.util.io,
    org.eclipse.jgit.lib,
@@ -198,21 +198,21 @@
    org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.storage.pack,
    org.eclipse.jgit.errors",
- org.eclipse.jgit.transport.http;version="6.6.1";
+ org.eclipse.jgit.transport.http;version="6.7.0";
   uses:="javax.net.ssl",
- org.eclipse.jgit.transport.resolver;version="6.6.1";
+ org.eclipse.jgit.transport.resolver;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.lib",
- org.eclipse.jgit.treewalk;version="6.6.1";
+ org.eclipse.jgit.treewalk;version="6.7.0";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.util",
- org.eclipse.jgit.treewalk.filter;version="6.6.1";
+ org.eclipse.jgit.treewalk.filter;version="6.7.0";
   uses:="org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util;version="6.6.1";
+ org.eclipse.jgit.util;version="6.7.0";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.hooks,
    org.eclipse.jgit.revwalk,
@@ -225,17 +225,18 @@
    org.eclipse.jgit.treewalk,
    javax.net.ssl,
    org.eclipse.jgit.util.time",
- org.eclipse.jgit.util.io;version="6.6.1";
+ org.eclipse.jgit.util.io;version="6.7.0";
   uses:="org.eclipse.jgit.attributes,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util.sha1;version="6.6.1",
- org.eclipse.jgit.util.time;version="6.6.1"
+ org.eclipse.jgit.util.sha1;version="6.7.0",
+ org.eclipse.jgit.util.time;version="6.7.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
  javax.crypto,
  javax.management,
  javax.net.ssl,
+ org.apache.commons.codec.digest;version="1.15.0",
  org.slf4j;version="[1.7.0,2.0.0)",
  org.xml.sax,
  org.xml.sax.helpers
diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
index ac3df72..70b3520 100644
--- a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
@@ -3,5 +3,5 @@
 Bundle-Name: org.eclipse.jgit - Sources
 Bundle-SymbolicName: org.eclipse.jgit.source
 Bundle-Vendor: Eclipse.org - JGit
-Bundle-Version: 6.6.1.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit;version="6.6.1.qualifier";roots="."
+Bundle-Version: 6.7.0.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit;version="6.7.0.qualifier";roots="."
diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml
index 93d2a9a..366d370 100644
--- a/org.eclipse.jgit/pom.xml
+++ b/org.eclipse.jgit/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>6.6.1-SNAPSHOT</version>
+    <version>6.7.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit</artifactId>
@@ -46,6 +46,12 @@
       <artifactId>slf4j-api</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.16.0</version>
+    </dependency>
+
   </dependencies>
 
   <build>
diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
index bc8144f..c73d85f 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
@@ -223,6 +223,7 @@
 corruptObjectTruncatedInName=truncated in name
 corruptObjectTruncatedInObjectId=truncated in object id
 corruptObjectZeroId=entry points to null SHA-1
+corruptReverseIndexChecksumIncorrect=Reverse index checksum incorrect: written as {0} but digest was {1}
 corruptUseCnt=close() called when useCnt is already zero for {0}
 couldNotGetAdvertisedRef=Remote {0} did not advertise Ref for branch {1}. This Ref may not exist in the remote or may be hidden by permission settings.
 couldNotGetRepoStatistics=Could not get repository statistics
@@ -566,7 +567,7 @@
 operationCanceled=Operation {0} was canceled
 outputHasAlreadyBeenStarted=Output has already been started.
 overflowedReftableBlock=Overflowed reftable block
-packChecksumMismatch=Pack checksum mismatch detected for pack file {0}: .pack has {1} whilst .idx has {2}
+packChecksumMismatch=Pack checksum mismatch detected for pack file {0}: {1} has {2} whilst {3} has {4}
 packCorruptedWhileWritingToFilesystem=Pack corrupted while writing to filesystem
 packedRefsHandleIsStale=packed-refs handle is stale, {0}. retry
 packetSizeMustBeAtLeast=packet size {0} must be >= {1}
@@ -689,6 +690,7 @@
 saveFileStoreAttributesFailed=Saving measured FileStore attributes to user config failed
 searchForReuse=Finding sources
 searchForReuseTimeout=Search for reuse timed out after {0} seconds
+unsupportedObjectIdVersion=Object id version {0} is not supported
 searchForSizes=Getting sizes
 secondsAgo={0} seconds ago
 selectingCommits=Selecting commits
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java
index ceb17fb..8805ea2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java
@@ -51,7 +51,6 @@ protected AddNoteCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Note call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
index e612924..df0f616 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
@@ -37,11 +37,12 @@ public class ApplyCommand extends GitCommand<ApplyResult> {
 	/**
 	 * Constructs the command.
 	 *
-	 * @param local
+	 * @param repo
+	 *            the repository this command will be used on
 	 */
-	ApplyCommand(Repository local) {
-		super(local);
-		if (local == null) {
+	ApplyCommand(Repository repo) {
+		super(repo);
+		if (repo == null) {
 			throw new NullPointerException(JGitText.get().repositoryIsRequired);
 		}
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java
index fdf8b80..4efc6a7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java
@@ -389,7 +389,6 @@ private <T extends Closeable> OutputStream writeArchive(Format<T> fmt) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public OutputStream call() throws GitAPIException {
 		checkCallable();
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 7319ff4..7e06a56 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
@@ -167,7 +167,6 @@ protected CheckoutCommand(Repository repo) {
 		this.paths = new LinkedList<>();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref call() throws GitAPIException, RefAlreadyExistsException,
 			RefNotFoundException, InvalidRefNameException,
@@ -407,7 +406,9 @@ public CheckoutCommand setAllPaths(boolean all) {
 	 *
 	 * @return this instance
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.api.errors.RefNotFoundException
+	 *             if {@code Ref} couldn't be resolved
 	 */
 	protected CheckoutCommand checkoutPaths() throws IOException,
 			RefNotFoundException {
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 5f8c2b7..38e795b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
@@ -399,7 +399,6 @@ private String calculateOurName(Ref headRef) {
 		return headName;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java
index 36ca97d..a4a0c49 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java
@@ -113,24 +113,25 @@ public Set<String> call() throws NoWorkTreeException, GitAPIException {
 	}
 
 	/**
-	 * When dryRun is false, deletes the specified path from disk. If dryRun
-	 * is true, no paths are actually deleted. In both cases, the paths that
-	 * would have been deleted are added to inFiles and returned.
+	 * When dryRun is false, deletes the specified path from disk. If dryRun is
+	 * true, no paths are actually deleted. In both cases, the paths that would
+	 * have been deleted are added to inFiles and returned.
 	 *
 	 * Paths that are directories are recursively deleted when
-	 * {@link #directories} is true.
-	 * Paths that are git repositories are recursively deleted when
-	 * {@link #directories} and {@link #force} are both true.
+	 * {@link #directories} is true. Paths that are git repositories are
+	 * recursively deleted when {@link #directories} and {@link #force} are both
+	 * true.
 	 *
 	 * @param path
-	 * 			The path to be cleaned
+	 *            The path to be cleaned
 	 * @param inFiles
-	 * 			A set of strings representing the files that have been cleaned
-	 * 			already, the path to be cleaned will be added to this set
-	 * 			before being returned.
+	 *            A set of strings representing the files that have been cleaned
+	 *            already, the path to be cleaned will be added to this set
+	 *            before being returned.
 	 *
 	 * @return a set of strings with the cleaned path added to it
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private Set<String> cleanPath(String path, Set<String> inFiles)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
index 9e77dd7..e1efb86 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
@@ -82,7 +82,6 @@ protected CreateBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref call() throws GitAPIException, RefAlreadyExistsException,
 			RefNotFoundException, InvalidRefNameException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteBranchCommand.java
index 3d3ee63..f1b5d62 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteBranchCommand.java
@@ -61,7 +61,6 @@ protected DeleteBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<String> call() throws GitAPIException,
 			NotMergedException, CannotDeleteCurrentBranchException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
index 64d0d94..92d88aa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
@@ -48,7 +48,6 @@ protected DeleteTagCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<String> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
index 584d2bc..1196359 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
@@ -163,7 +163,6 @@ public GarbageCollectCommand setPrunePreserved(boolean prunePreserved) {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Properties call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
index 3b3e10e..3dc53ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
@@ -68,6 +68,7 @@ public class Git implements AutoCloseable {
 	 * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
 	 *         repository
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static Git open(File dir) throws IOException {
 		return open(dir, FS.DETECTED);
@@ -84,6 +85,7 @@ public static Git open(File dir) throws IOException {
 	 * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
 	 *         repository. Closing this instance will close the repo.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static Git open(File dir, FS fs) throws IOException {
 		RepositoryCache.FileKey key;
@@ -792,7 +794,6 @@ public Repository getRepository() {
 		return repo;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "Git[" + repo + "]"; //$NON-NLS-1$//$NON-NLS-2$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListBranchCommand.java
index 4b7445f..e3c3c89 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListBranchCommand.java
@@ -73,7 +73,6 @@ protected ListBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListNotesCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListNotesCommand.java
index 34955e8..9eb5286 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListNotesCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListNotesCommand.java
@@ -44,7 +44,6 @@ protected ListNotesCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Note> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListTagCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListTagCommand.java
index 27a5288..9a4a822 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListTagCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListTagCommand.java
@@ -54,8 +54,11 @@ protected ListTagCommand(Repository repo) {
 	 *            the specified commit
 	 * @return this command
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws IncorrectObjectTypeException
+	 *             if commit has an incorrect object type
 	 * @throws MissingObjectException
+	 *             if the commit is missing
 	 *
 	 * @since 6.6
 	 */
@@ -67,7 +70,6 @@ public ListTagCommand setContains(AnyObjectId commit)
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
index fa40d93..555e351 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
@@ -53,13 +53,11 @@
  * </pre>
  * <p>
  *
- * <p>
  * Get commits only for a specific file:
  *
  * <pre>
  * git.log().add(head).addPath(&quot;dir/filename.txt&quot;).call();
  * </pre>
- * <p>
  *
  * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-log.html"
  *      >Git documentation about Log</a>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
index 7347f63..ecc3b40 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
@@ -364,7 +364,6 @@ public ObjectId getBase() {
 		return base;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
index e6ab1e6..cd7c4e9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
@@ -102,7 +102,6 @@ public NameRevCommit createCommit(AnyObjectId id) {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<ObjectId, String> call() throws GitAPIException {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullResult.java
index cbb9cc2..fdc7f3f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullResult.java
@@ -89,7 +89,6 @@ else if (rebaseResult != null)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
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 19fd3bb..859bf93 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -86,7 +86,6 @@
  * supported options and arguments of this command and a {@link #call()} method
  * to finally execute the command. Each instance of this class should only be
  * used for one invocation of the command (means: one call to {@link #call()})
- * <p>
  *
  * @see <a
  *      href="http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html"
@@ -1000,7 +999,9 @@ private RevCommit checkoutCurrentHead() throws IOException, NoHeadException {
 	/**
 	 * @return the commit if we had to do a commit, otherwise null
 	 * @throws GitAPIException
+	 *             if JGit API failed
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private RevCommit continueRebase() throws GitAPIException, IOException {
 		// if there are still conflicts, we throw a specific Exception
@@ -1102,7 +1103,9 @@ String toAuthorScript(PersonIdent author) {
 	 * that can not be parsed as steps
 	 *
 	 * @param numSteps
+	 *            number of steps to remove
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void popSteps(int numSteps) throws IOException {
 		if (numSteps == 0)
@@ -1297,7 +1300,9 @@ private boolean isInteractive() {
 	 *            if we can fast-forward to.
 	 * @return the new head, or null
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.api.errors.GitAPIException
+	 *             if a JGit API exception occurred
 	 */
 	public RevCommit tryFastForward(RevCommit newCommit) throws IOException,
 			GitAPIException {
@@ -1548,6 +1553,7 @@ public RebaseCommand setUpstream(AnyObjectId upstream) {
 	 *            the name of the upstream branch
 	 * @return {@code this}
 	 * @throws org.eclipse.jgit.api.errors.RefNotFoundException
+	 *             if {@code upstream} Ref couldn't be resolved
 	 */
 	public RebaseCommand setUpstream(String upstream)
 			throws RefNotFoundException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java
index 826ea51..83c0dc2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java
@@ -194,6 +194,7 @@ private RebaseResult(Status status, RevCommit commit) {
 	 * Create <code>RebaseResult</code>
 	 *
 	 * @param status
+	 *            the overall rebase status
 	 * @param commit
 	 *            current commit
 	 * @return the RebaseResult
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoveNoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoveNoteCommand.java
index f4b60ad..c65cbf160 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoveNoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoveNoteCommand.java
@@ -47,7 +47,6 @@ protected RemoveNoteCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Note call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RenameBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RenameBranchCommand.java
index 922cb53..029f9d0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RenameBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RenameBranchCommand.java
@@ -55,7 +55,6 @@ protected RenameBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref call() throws GitAPIException, RefNotFoundException, InvalidRefNameException,
 			RefAlreadyExistsException, DetachedHeadException {
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 87b4acb..225c999 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
@@ -436,7 +436,6 @@ private void resetRevert() throws IOException {
 		repo.writeMergeCommitMsg(null);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ShowNoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ShowNoteCommand.java
index f64cb6b..7bb9de0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ShowNoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ShowNoteCommand.java
@@ -44,7 +44,6 @@ protected ShowNoteCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Note call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java
index 8171c4c..828a302 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java
@@ -43,7 +43,6 @@ public StashListCommand(Repository repo) {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<RevCommit> call() throws GitAPIException,
 			InvalidRefNameException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
index 606d567..8fb5d60 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
@@ -66,6 +66,7 @@ public SubmoduleAddCommand(Repository repo) {
 	 * Set the submodule name
 	 *
 	 * @param name
+	 *            name of the submodule
 	 * @return this command
 	 * @since 5.1
 	 */
@@ -117,6 +118,7 @@ public SubmoduleAddCommand setProgressMonitor(ProgressMonitor monitor) {
 	 *
 	 * @return true if submodule exists in index, false otherwise
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected boolean submoduleExists() throws IOException {
 		TreeFilter filter = PathFilter.create(path);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java
index f4b8ac2..0aa1515 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java
@@ -61,6 +61,7 @@ public class SubmoduleDeinitCommand
 	 * Constructor of SubmoduleDeinitCommand
 	 *
 	 * @param repo
+	 *            repository this command works on
 	 */
 	public SubmoduleDeinitCommand(Repository repo) {
 		super(repo);
@@ -69,7 +70,6 @@ public SubmoduleDeinitCommand(Repository repo) {
 
 	/**
 	 * {@inheritDoc}
-	 * <p>
 	 *
 	 * @return the set of repositories successfully deinitialized.
 	 * @throws NoSuchSubmoduleException
@@ -135,6 +135,7 @@ public Collection<SubmoduleDeinitResult> call() throws GitAPIException {
 	 * @param path
 	 *            the path to clean
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void deinit(String path) throws IOException {
 		File dir = new File(repo.getWorkTree(), path);
@@ -157,10 +158,14 @@ private void deinit(String path) throws IOException {
 	 * the parent repo's index or HEAD.
 	 *
 	 * @param revWalk
+	 *            used to walk commit graph
 	 * @param path
+	 *            path of the submodule
 	 * @return status of the command
 	 * @throws GitAPIException
+	 *             if JGit API failed
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private SubmoduleDeinitStatus checkDirty(RevWalk revWalk, String path)
 			throws GitAPIException, IOException {
@@ -216,6 +221,7 @@ private SubmoduleDeinitStatus checkDirty(RevWalk revWalk, String path)
 	 * @return {@code true} if path exists and is a submodule in index,
 	 *         {@code false} otherwise
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private boolean submoduleExists(String path) throws IOException {
 		TreeFilter filter = PathFilter.create(path);
@@ -241,6 +247,7 @@ public SubmoduleDeinitCommand addPath(String path) {
 	 * else it will refuse to do so.
 	 *
 	 * @param force
+	 *            execute the command forcefully if there are local modifications
 	 * @return {@code this}
 	 */
 	public SubmoduleDeinitCommand setForce(boolean force) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java
index 8129be4..b7d7b66 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java
@@ -25,6 +25,7 @@ public class SubmoduleDeinitResult {
 	 * @param path
 	 *            path of the submodule
 	 * @param status
+	 *            effect of a SubmoduleDeinitCommand's execution
 	 */
 	public SubmoduleDeinitResult(String path,
 			SubmoduleDeinitCommand.SubmoduleDeinitStatus status) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleInitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleInitCommand.java
index bdceaba..03b4a00 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleInitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleInitCommand.java
@@ -61,7 +61,6 @@ public SubmoduleInitCommand addPath(String path) {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<String> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleStatusCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleStatusCommand.java
index 196ef7b..d5bc0dd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleStatusCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleStatusCommand.java
@@ -61,7 +61,6 @@ public SubmoduleStatusCommand addPath(String path) {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, SubmoduleStatus> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleSyncCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleSyncCommand.java
index b319a1b..4f3e851 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleSyncCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleSyncCommand.java
@@ -70,6 +70,7 @@ public SubmoduleSyncCommand addPath(String path) {
 	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @return shortened branch name, null on failures
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected String getHeadBranch(Repository subRepo) throws IOException {
 		Ref head = subRepo.exactRef(Constants.HEAD);
@@ -79,7 +80,6 @@ protected String getHeadBranch(Repository subRepo) throws IOException {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, String> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/TagCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/TagCommand.java
index 58c18b3..dd4ba10 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/TagCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/TagCommand.java
@@ -51,13 +51,11 @@
  * </pre>
  * <p>
  *
- * <p>
  * Create a new unannotated tag for the current commit:
  *
  * <pre>
  * git.tag().setName(&quot;v1.0&quot;).setAnnotated(false).call();
  * </pre>
- * <p>
  *
  * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-tag.html"
  *      >Git documentation about Tag</a>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportCommand.java
index 1af880d..30f1bc9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportCommand.java
@@ -22,7 +22,9 @@
  * {@link org.eclipse.jgit.api.TransportConfigCallback}.
  *
  * @param <C>
+ *            concrete type of this {@code GitCommand}
  * @param <T>
+ *            the return type of the {@code GitCommand}'s {@code call()} method
  */
 public abstract class TransportCommand<C extends GitCommand, T> extends
 		GitCommand<T> {
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 3b71373..0224b3d 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
@@ -94,6 +94,7 @@ public List<String> getConflictingPaths() {
 	 * Adds a new conflicting path
 	 *
 	 * @param conflictingPath
+	 *            the new conflicting path
 	 * @return {@code this}
 	 */
 	CheckoutConflictException addConflictingPath(String conflictingPath) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java
index 470a92e..fe3e22a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java
@@ -97,7 +97,6 @@ public Attribute(String key, String value) {
 		this(key, State.CUSTOM, value);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj)
@@ -144,7 +143,6 @@ public String getValue() {
 		return value;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		final int prime = 31;
@@ -155,7 +153,6 @@ public int hashCode() {
 		return result;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		switch (state) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attributes.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attributes.java
index 125ee59..08bc1da 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attributes.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attributes.java
@@ -231,7 +231,6 @@ && getValue(Constants.ATTR_MERGE)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder buf = new StringBuilder();
@@ -246,13 +245,11 @@ public String toString() {
 		return buf.toString();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return map.hashCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesHandler.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesHandler.java
index 7ec7859..d8857f5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesHandler.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesHandler.java
@@ -69,6 +69,7 @@ public class AttributesHandler {
 	 * @param treeWalk
 	 *            a {@link org.eclipse.jgit.treewalk.TreeWalk}
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @deprecated since 6.1, use {@link #AttributesHandler(TreeWalk, Supplier)}
 	 *             instead
 	 */
@@ -87,6 +88,7 @@ public AttributesHandler(TreeWalk treeWalk) throws IOException {
 	 * @param attributesTree
 	 *            the tree to read .gitattributes from
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 6.1
 	 */
 	public AttributesHandler(TreeWalk treeWalk,
@@ -128,6 +130,7 @@ public AttributesHandler(TreeWalk treeWalk,
 	 *         current path represented by the
 	 *         {@link org.eclipse.jgit.treewalk.TreeWalk}
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public Attributes getAttributes() throws IOException {
 		String entryPath = treeWalk.getPathString();
@@ -206,12 +209,16 @@ private void mergeInfoAttributes(String entryPath, boolean isDirectory,
 	 * @param isDirectory
 	 *            true if the target item is a directory.
 	 * @param workingTreeIterator
+	 *            the working tree iterator
 	 * @param dirCacheIterator
+	 *            the dircache iterator
 	 * @param otherTree
+	 *            another tree
 	 * @param result
 	 *            that will hold the attributes matching this entry path. This
 	 *            method will NOT override any existing entry in attributes.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void mergePerDirectoryEntryAttributes(String entryPath,
 			int nameRoot, boolean isDirectory,
@@ -357,9 +364,13 @@ protected void expandMacro(Attribute attr, Attributes result) {
 	 * </p>
 	 *
 	 * @param treeWalk
+	 *            used to walk trees
 	 * @param workingTreeIterator
+	 *            used to walk the working tree
 	 * @param dirCacheIterator
+	 *            used to walk the dircache
 	 * @param otherTree
+	 *            another tree
 	 * @return a {@link AttributesNode} of the current entry,
 	 *         {@link NullPointerException} otherwise.
 	 * @throws IOException
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java
index 73fd587..2039191 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java
@@ -187,7 +187,6 @@ public boolean isMatch(String relativeTarget, boolean isDirectory) {
 		return match;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
index 1c9e9d7..bbbb437 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
@@ -41,8 +41,8 @@ public class FilterCommandRegistry {
 	 *            the factory responsible for creating
 	 *            {@link org.eclipse.jgit.attributes.FilterCommand}s for the
 	 *            specified name
-	 * @return the previous factory associated with <tt>commandName</tt>, or
-	 *         <tt>null</tt> if there was no mapping for <tt>commandName</tt>
+	 * @return the previous factory associated with {@code commandName}, or
+	 *         {@code null} if there was no mapping for {@code commandName}
 	 */
 	public static FilterCommandFactory register(String filterCommandName,
 			FilterCommandFactory factory) {
@@ -55,8 +55,8 @@ public static FilterCommandFactory register(String filterCommandName,
 	 *
 	 * @param filterCommandName
 	 *            the FilterCommandFactory's filter command name
-	 * @return the previous factory associated with <tt>filterCommandName</tt>,
-	 *         or <tt>null</tt> if there was no mapping for <tt>commandName</tt>
+	 * @return the previous factory associated with {@code filterCommandName},
+	 *         or {@code null} if there was no mapping for {@code commandName}
 	 */
 	public static FilterCommandFactory unregister(String filterCommandName) {
 		return filterCommandRegistry.remove(filterCommandName);
@@ -69,7 +69,7 @@ public static FilterCommandFactory unregister(String filterCommandName) {
 	 *
 	 * @param filterCommandName
 	 *            the name for which the registry should be checked
-	 * @return <code>true</code> if any factory was registered for the name
+	 * @return {@code true} if any factory was registered for the name
 	 */
 	public static boolean isRegistered(String filterCommandName) {
 		return filterCommandRegistry.containsKey(filterCommandName);
@@ -107,6 +107,7 @@ public static Set<String> getRegisteredFilterCommands() {
 	 * @return the command if a command could be created or <code>null</code> if
 	 *         there was no factory registered for that name
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static FilterCommand createFilterCommand(String filterCommandName,
 			Repository db, InputStream in, OutputStream out)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java
index c854b37..5e2746c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java
@@ -303,7 +303,6 @@ public void computeRange(int start, int end) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java
index ccf99ff..8e2aaec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java
@@ -305,7 +305,6 @@ void mergeRegions(Candidate other) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java
index 2236eec..c481eb1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java
@@ -83,7 +83,6 @@ Region deepCopy() {
 		return head;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder buf = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java
index e8f3f38..fafc4fb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java
@@ -24,7 +24,6 @@ final class ReverseWalk extends RevWalk {
 		super(repo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReverseCommit next() throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -36,7 +35,6 @@ public ReverseCommit next() throws MissingObjectException,
 		return c;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected RevCommit createCommit(AnyObjectId id) {
 		return new ReverseCommit(id);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffAlgorithm.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffAlgorithm.java
index 2526cbf..7821efd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffAlgorithm.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffAlgorithm.java
@@ -58,6 +58,8 @@ public static DiffAlgorithm getAlgorithm(SupportedAlgorithm alg) {
 	/**
 	 * Compare two sequences and identify a list of edits between them.
 	 *
+	 * @param <S>
+	 *            type of sequence being compared.
 	 * @param cmp
 	 *            the comparator supplying the element equivalence function.
 	 * @param a
@@ -217,6 +219,8 @@ private static <S extends Sequence> EditList normalize(
 	 * method, which invokes this method using
 	 * {@link org.eclipse.jgit.diff.Subsequence}s.
 	 *
+	 * @param <S>
+	 *            type of sequence being compared.
 	 * @param cmp
 	 *            the comparator supplying the element equivalence function.
 	 * @param a
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
index f0ce121..717d898 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
@@ -457,7 +457,6 @@ public AbbreviatedObjectId getNewId() {
 	/**
 	 * Whether the mark tree filter with the specified index matched during scan
 	 * or not, see {@link #scan(TreeWalk, boolean, TreeFilter...)}. Example:
-	 * <p>
 	 *
 	 * <pre>
 	 * TreeFilter filterA = ...;
@@ -506,7 +505,6 @@ public AbbreviatedObjectId getId(Side side) {
 		return side == Side.OLD ? getOldId() : getNewId();
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
index 1a5f74f..2f472b5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
@@ -777,6 +777,7 @@ public void format(FileHeader head, RawText a, RawText b)
 	 * @param b
 	 *            the text B which was compared
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void format(EditList edits, RawText a, RawText b)
 			throws IOException {
@@ -825,6 +826,7 @@ public void format(EditList edits, RawText a, RawText b)
 	 * @param line
 	 *            the line number within text
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected void writeContextLine(RawText text, int line)
 			throws IOException {
@@ -843,6 +845,7 @@ private static boolean isEndOfLineMissing(RawText text, int line) {
 	 * @param line
 	 *            the line number within text
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected void writeAddedLine(RawText text, int line)
 			throws IOException {
@@ -857,6 +860,7 @@ protected void writeAddedLine(RawText text, int line)
 	 * @param line
 	 *            the line number within text
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected void writeRemovedLine(RawText text, int line)
 			throws IOException {
@@ -875,6 +879,7 @@ protected void writeRemovedLine(RawText text, int line)
 	 * @param bEndLine
 	 *            within second source
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected void writeHunkHeader(int aStartLine, int aEndLine,
 			int bStartLine, int bEndLine) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
index 219a187..2968dba 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
@@ -238,13 +238,11 @@ public void swap() {
 		endB = sEnd;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return beginA ^ endA;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof Edit) {
@@ -255,7 +253,6 @@ public boolean equals(Object o) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/EditList.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/EditList.java
index d40a640..85e23e9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/EditList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/EditList.java
@@ -49,7 +49,6 @@ public EditList(int capacity) {
 		super(capacity);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "EditList" + super.toString(); //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
index 9cb8e73..82ab21c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
@@ -34,7 +34,6 @@ public final class HashedSequence<S extends Sequence> extends Sequence {
 		this.hashes = hashes;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		return base.size();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequenceComparator.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequenceComparator.java
index 0380208..c7dfd9a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequenceComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequenceComparator.java
@@ -33,7 +33,6 @@ public final class HashedSequenceComparator<S extends Sequence> extends
 		this.cmp = cmp;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(HashedSequence<S> a, int ai, //
 			HashedSequence<S> b, int bi) {
@@ -41,7 +40,6 @@ public boolean equals(HashedSequence<S> a, int ai, //
 				&& cmp.equals(a.base, ai, b.base, bi);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hash(HashedSequence<S> seq, int ptr) {
 		return seq.hashes[ptr];
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java
index 4035a1e..bb72e1f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java
@@ -98,7 +98,6 @@ public void setMaxChainLength(int maxLen) {
 		maxChainLength = maxLen;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public <S extends Sequence> void diffNonCommon(EditList edits,
 			HashedSequenceComparator<S> cmp, HashedSequence<S> a,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/LowLevelDiffAlgorithm.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/LowLevelDiffAlgorithm.java
index 7f3c251..39be43d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/LowLevelDiffAlgorithm.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/LowLevelDiffAlgorithm.java
@@ -14,7 +14,6 @@
  * Compares two sequences primarily based upon hash codes.
  */
 public abstract class LowLevelDiffAlgorithm extends DiffAlgorithm {
-	/** {@inheritDoc} */
 	@Override
 	public <S extends Sequence> EditList diffNonCommon(
 			SequenceComparator<? super S> cmp, S a, S b) {
@@ -40,6 +39,8 @@ public <S extends Sequence> EditList diffNonCommon(
 	 * method, which invokes this method using
 	 * {@link org.eclipse.jgit.diff.Subsequence}s.
 	 *
+	 * @param <S>
+	 *            type of Sequence compared
 	 * @param edits
 	 *            result list to append the region's edits onto.
 	 * @param cmp
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/PatchIdDiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/PatchIdDiffFormatter.java
index 53cd2ea..4343642 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/PatchIdDiffFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/PatchIdDiffFormatter.java
@@ -43,14 +43,12 @@ public ObjectId getCalulatedPatchId() {
 		return ObjectId.fromRaw(digest.digest());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void writeHunkHeader(int aStartLine, int aEndLine,
 			int bStartLine, int bEndLine) throws IOException {
 		// The hunk header is not taken into account for patch id calculation
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void formatIndexLine(OutputStream o, DiffEntry ent)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
index b528035..7835582 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
@@ -114,7 +114,6 @@ public RawText(File file) throws IOException {
 	}
 
 	/** @return total number of items in the sequence. */
-	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		// The line map is always 2 entries larger than the number of lines in
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawTextComparator.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawTextComparator.java
index 0c41b85..e06e2f8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawTextComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawTextComparator.java
@@ -227,7 +227,6 @@ public int hash(RawText seq, int lno) {
 		return hashRegion(seq.content, begin, end);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Edit reduceCommonStartEnd(RawText a, RawText b, Edit e) {
 		// This is a faster exact match based form that tries to improve
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
index c33f53a..fd84bc6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
@@ -713,15 +713,16 @@ private void findExactRenames(ProgressMonitor pm)
 
 	/**
 	 * Find the best match by file path for a given DiffEntry from a list of
-	 * DiffEntrys. The returned DiffEntry will be of the same type as <src>. If
-	 * no DiffEntry can be found that has the same type, this method will return
-	 * null.
+	 * DiffEntrys. The returned DiffEntry will be of the same type as
+	 * &lt;src&gt;. If no DiffEntry can be found that has the same type, this
+	 * method will return null.
 	 *
 	 * @param src
 	 *            the DiffEntry to try to find a match for
 	 * @param list
 	 *            a list of DiffEntrys to search through
-	 * @return the DiffEntry from <list> who's file path best matches <src>
+	 * @return the DiffEntry from &lt;list&gt; who's file path best matches
+	 *         &lt;src&gt;
 	 */
 	private static DiffEntry bestPathMatch(DiffEntry src, List<DiffEntry> list) {
 		DiffEntry best = null;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java
index 61f133c..878c66b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java
@@ -25,6 +25,8 @@ public final class Subsequence<S extends Sequence> extends Sequence {
 	/**
 	 * Construct a subsequence around the A region/base sequence.
 	 *
+	 * @param <S>
+	 *            type of returned Sequence
 	 * @param a
 	 *            the A sequence.
 	 * @param region
@@ -38,6 +40,8 @@ public static <S extends Sequence> Subsequence<S> a(S a, Edit region) {
 	/**
 	 * Construct a subsequence around the B region/base sequence.
 	 *
+	 * @param <S>
+	 *            type of returned Sequence
 	 * @param b
 	 *            the B sequence.
 	 * @param region
@@ -51,6 +55,8 @@ public static <S extends Sequence> Subsequence<S> b(S b, Edit region) {
 	/**
 	 * Adjust the Edit to reflect positions in the base sequence.
 	 *
+	 * @param <S>
+	 *            type of returned Sequence
 	 * @param e
 	 *            edit to adjust in-place. Prior to invocation the indexes are
 	 *            in terms of the two subsequences; after invocation the indexes
@@ -72,6 +78,8 @@ public static <S extends Sequence> void toBase(Edit e, Subsequence<S> a,
 	/**
 	 * Adjust the Edits to reflect positions in the base sequence.
 	 *
+	 * @param <S>
+	 *            type of returned Sequence
 	 * @param edits
 	 *            edits to adjust in-place. Prior to invocation the indexes are
 	 *            in terms of the two subsequences; after invocation the indexes
@@ -116,7 +124,6 @@ public Subsequence(S base, int begin, int end) {
 		this.size = end - begin;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		return size;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java
index c609453..707df59 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java
@@ -36,13 +36,11 @@ public SubsequenceComparator(SequenceComparator<? super S> cmp) {
 		this.cmp = cmp;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Subsequence<S> a, int ai, Subsequence<S> b, int bi) {
 		return cmp.equals(a.base, ai + a.begin, b.base, bi + b.begin);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hash(Subsequence<S> seq, int ptr) {
 		return cmp.hash(seq.base, ptr + seq.begin);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/BaseDirCacheEditor.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/BaseDirCacheEditor.java
index 86e60e5..68296ef 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/BaseDirCacheEditor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/BaseDirCacheEditor.java
@@ -25,9 +25,11 @@
  * services to applications.
  */
 abstract class BaseDirCacheEditor {
+	@SuppressWarnings("doclint:missing")
 	/** The cache instance this editor updates during {@link #finish()}. */
 	protected DirCache cache;
 
+	@SuppressWarnings("doclint:missing")
 	/**
 	 * Entry table this builder will eventually replace into {@link #cache}.
 	 * <p>
@@ -40,7 +42,7 @@ abstract class BaseDirCacheEditor {
 	 */
 	protected DirCacheEntry[] entries;
 
-	/** Total number of valid entries in {@link #entries}. */
+	/** Total number of valid entries in {@link BaseDirCacheEditor#entries}. */
 	protected int entryCnt;
 
 	/**
@@ -137,7 +139,8 @@ protected void fastKeep(int pos, int cnt) {
 	public abstract void finish();
 
 	/**
-	 * Update the DirCache with the contents of {@link #entries}.
+	 * Update the DirCache with the contents of
+	 * {@link BaseDirCacheEditor#entries}.
 	 * <p>
 	 * This method should be invoked only during an implementation of
 	 * {@link #finish()}, and only after {@link #entries} is sorted.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
index e560612..34dba0b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
@@ -429,6 +429,7 @@ else if (snapshot == null || snapshot.isModified(liveFile)) {
 	 *
 	 * @return {@code true} if the memory state differs from the index file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public boolean isOutdated() throws IOException {
 		if (liveFile == null || !liveFile.exists())
@@ -1001,6 +1002,7 @@ private void registerIndexChangedListener(IndexChangedListener listener) {
 	 * Update any smudged entries with information from the working tree.
 	 *
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void updateSmudgedEntries() throws IOException {
 		List<String> paths = new ArrayList<>(128);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuildIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuildIterator.java
index f6e4d36..befd806 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuildIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuildIterator.java
@@ -74,7 +74,6 @@ public DirCacheBuildIterator(DirCacheBuilder dcb) {
 		builder = p.builder;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
@@ -84,7 +83,6 @@ public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
 		return new DirCacheBuildIterator(this, currentSubtree);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void skip() throws CorruptObjectException {
 		if (currentSubtree != null)
@@ -94,7 +92,6 @@ public void skip() throws CorruptObjectException {
 		next(1);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void stopWalk() {
 		final int cur = ptr;
@@ -103,7 +100,6 @@ public void stopWalk() {
 			builder.keep(cur, cnt - cur);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean needsStopWalk() {
 		return ptr < cache.getEntryCount();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java
index 9fe77f3..28d2502 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java
@@ -186,7 +186,6 @@ private static DirCacheEntry toEntry(int stage, CanonicalTreeParser i) {
 		return e;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void finish() {
 		if (!sorted)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
index 1fb81b7..20b2737 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
@@ -100,7 +100,9 @@ public static class CheckoutMetadata {
 
 		/**
 		 * @param eolStreamType
+		 *            how to convert EOL characters during stream conversion
 		 * @param smudgeFilterCommand
+		 *            command used as smudge filter during checkout
 		 */
 		public CheckoutMetadata(EolStreamType eolStreamType,
 				String smudgeFilterCommand) {
@@ -206,6 +208,7 @@ public List<String> getRemoved() {
 	 * @param workingTree
 	 *            an iterator over the repositories Working Tree
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public DirCacheCheckout(Repository repo, ObjectId headCommitTree, DirCache dc,
 			ObjectId mergeCommitTree, WorkingTreeIterator workingTree)
@@ -233,6 +236,7 @@ public DirCacheCheckout(Repository repo, ObjectId headCommitTree, DirCache dc,
 	 * @param mergeCommitTree
 	 *            the id of the tree we want to fast-forward to
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public DirCacheCheckout(Repository repo, ObjectId headCommitTree,
 			DirCache dc, ObjectId mergeCommitTree) throws IOException {
@@ -252,6 +256,7 @@ public DirCacheCheckout(Repository repo, ObjectId headCommitTree,
 	 * @param workingTree
 	 *            an iterator over the repositories Working Tree
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public DirCacheCheckout(Repository repo, DirCache dc,
 			ObjectId mergeCommitTree, WorkingTreeIterator workingTree)
@@ -271,6 +276,7 @@ public DirCacheCheckout(Repository repo, DirCache dc,
 	 * @param mergeCommitTree
 	 *            the id of the tree of the
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public DirCacheCheckout(Repository repo, DirCache dc,
 			ObjectId mergeCommitTree) throws IOException {
@@ -294,7 +300,9 @@ public void setProgressMonitor(ProgressMonitor monitor) {
 	 * operations.
 	 *
 	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             if a corrupt object was found
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void preScanTwoTrees() throws CorruptObjectException, IOException {
 		removed.clear();
@@ -324,9 +332,13 @@ public void preScanTwoTrees() throws CorruptObjectException, IOException {
 	 * there is no head yet.
 	 *
 	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             if an object was found missing
 	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             if an object didn't have the expected type
 	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             if an object is corrupt
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void prescanOneTree()
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -372,6 +384,7 @@ private int addTree(TreeWalk tw, ObjectId id) throws MissingObjectException,
 	 * @param f
 	 *            the working tree
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void processEntry(CanonicalTreeParser m, DirCacheBuildIterator i,
 			WorkingTreeIterator f) throws IOException {
@@ -465,6 +478,7 @@ void processEntry(CanonicalTreeParser m, DirCacheBuildIterator i,
 	 *         successful and the working tree was updated for all other files.
 	 *         <code>true</code> is returned when no such problem occurred
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public boolean checkout() throws IOException {
 		try {
@@ -684,9 +698,13 @@ private void removeEmptyParents(File f) {
 	 * Compares whether two pairs of ObjectId and FileMode are equal.
 	 *
 	 * @param id1
+	 *            id of first object
 	 * @param mode1
+	 *            mode of first object
 	 * @param id2
+	 *            id of second object
 	 * @param mode2
+	 *            mode of second object
 	 * @return <code>true</code> if FileModes and ObjectIds are equal.
 	 *         <code>false</code> otherwise
 	 */
@@ -712,6 +730,7 @@ private boolean equalIdAndMode(ObjectId id1, FileMode mode1, ObjectId id2,
 	 * @param f
 	 *            the file in the working tree
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 
 	void processEntry(CanonicalTreeParser h, CanonicalTreeParser m,
@@ -1295,6 +1314,7 @@ public void setForce(boolean force) {
 	 * {@link #failOnConflict} is false
 	 *
 	 * @throws CheckoutConflictException
+	 *             if a conflict occurred during merge checkout
 	 */
 	private void cleanUpConflicts() throws CheckoutConflictException {
 		// TODO: couldn't we delete unsaved worktree content here?
@@ -1308,13 +1328,16 @@ private void cleanUpConflicts() throws CheckoutConflictException {
 	}
 
 	/**
-	 * Checks whether the subtree starting at a given path differs between Index and
-	 * workingtree.
+	 * Checks whether the subtree starting at a given path differs between Index
+	 * and workingtree.
 	 *
 	 * @param path
+	 *            given subtree path
 	 * @return true if the subtrees differ
 	 * @throws CorruptObjectException
+	 *             if a corrupt object was found
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private boolean isModifiedSubtree_IndexWorkingtree(String path)
 			throws CorruptObjectException, IOException {
@@ -1355,15 +1378,18 @@ private boolean isModified_IndexTree(String path, ObjectId iId,
 	}
 
 	/**
-	 * Checks whether the subtree starting at a given path differs between Index and
-	 * some tree.
+	 * Checks whether the subtree starting at a given path differs between Index
+	 * and some tree.
 	 *
 	 * @param path
+	 *            given path
 	 * @param tree
 	 *            the tree to compare
 	 * @return true if the subtrees differ
 	 * @throws CorruptObjectException
+	 *             if a corrupt object was found
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private boolean isModifiedSubtree_IndexTree(String path, ObjectId tree)
 			throws CorruptObjectException, IOException {
@@ -1408,6 +1434,7 @@ private boolean isModifiedSubtree_IndexTree(String path, ObjectId tree)
 	 * @param or
 	 *            object reader to use for checkout
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.6
 	 * @deprecated since 5.1, use
 	 *             {@link #checkoutEntry(Repository, DirCacheEntry, ObjectReader, boolean, CheckoutMetadata, WorkingTreeOptions)}
@@ -1449,6 +1476,7 @@ public static void checkoutEntry(Repository repo, DirCacheEntry entry,
 	 *            <li>eolStreamType used for stream conversion</li>
 	 *            </ul>
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 * @deprecated since 6.3, use
 	 *             {@link #checkoutEntry(Repository, DirCacheEntry, ObjectReader, boolean, CheckoutMetadata, WorkingTreeOptions)}
@@ -1493,6 +1521,7 @@ public static void checkoutEntry(Repository repo, DirCacheEntry entry,
 	 *            {@link WorkingTreeOptions} that are effective; if {@code null}
 	 *            they are loaded from the repository config
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 6.3
 	 */
 	public static void checkoutEntry(Repository repo, DirCacheEntry entry,
@@ -1599,6 +1628,7 @@ public static void checkoutEntry(Repository repo, DirCacheEntry entry,
 	 *            the output stream the filtered content is written to. The
 	 *            caller is responsible to close the stream.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 *
 	 * @since 5.7
 	 */
@@ -1654,6 +1684,7 @@ public interface StreamSupplier {
 	 *            the output stream the filtered content is written to. The
 	 *            caller is responsible to close the stream.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 6.3
 	 */
 	public static void getContent(Repository repo, String path,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java
index 8c342e2..b1f4e7d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java
@@ -37,7 +37,6 @@
  * have the editor compute the proper entry indexes necessary to perform an
  * efficient in-order update of the index records. This can be easier to use
  * than {@link org.eclipse.jgit.dircache.DirCacheBuilder}.
- * <p>
  *
  * @see DirCacheBuilder
  */
@@ -80,7 +79,6 @@ public void add(PathEdit edit) {
 		edits.add(edit);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean commit() throws IOException {
 		if (edits.isEmpty()) {
@@ -92,7 +90,6 @@ public boolean commit() throws IOException {
 		return super.commit();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void finish() {
 		if (!edits.isEmpty()) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheIterator.java
index aed1c34..9cc34a0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheIterator.java
@@ -104,7 +104,6 @@ public DirCacheIterator(DirCache dc) {
 		parseEntry();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
@@ -114,7 +113,6 @@ public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
 		return new DirCacheIterator(this, currentSubtree);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public EmptyTreeIterator createEmptyTreeIterator() {
 		final byte[] n = new byte[Math.max(pathLen + 1, DEFAULT_PATH_SIZE)];
@@ -123,7 +121,6 @@ public EmptyTreeIterator createEmptyTreeIterator() {
 		return new EmptyTreeIterator(this, n, pathLen + 1);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasId() {
 		if (currentSubtree != null)
@@ -131,7 +128,6 @@ public boolean hasId() {
 		return currentEntry != null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte[] idBuffer() {
 		if (currentSubtree != null)
@@ -141,7 +137,6 @@ public boolean hasId() {
 		return zeroid;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int idOffset() {
 		if (currentSubtree != null)
@@ -151,7 +146,6 @@ public int idOffset() {
 		return 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		if (!first()) {
@@ -164,19 +158,16 @@ public void reset() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean first() {
 		return ptr == treeStart;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean eof() {
 		return ptr == treeEnd;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void next(int delta) {
 		while (--delta >= 0) {
@@ -190,7 +181,6 @@ public void next(int delta) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void back(int delta) {
 		while (--delta >= 0) {
@@ -271,6 +261,7 @@ public DirCacheEntry getDirCacheEntry() {
 	 * @return {@link org.eclipse.jgit.attributes.AttributesNode} for the
 	 *         current entry.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.7
 	 */
 	public AttributesNode getEntryAttributesNode(ObjectReader reader)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java
index e0c1e93..2561ae9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java
@@ -534,7 +534,6 @@ private static int slash(byte[] a, int aPos) {
 		return -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return getNameString();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/LargeObjectException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/LargeObjectException.java
index 4a53561..40aa1c3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/LargeObjectException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/LargeObjectException.java
@@ -84,7 +84,6 @@ public void setObjectId(AnyObjectId id) {
 			objectId = id.copy();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getMessage() {
 		return MessageFormat.format(JGitText.get().largeObjectException,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java
index 084d67c..83876ef 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java
@@ -44,7 +44,6 @@ public RevisionSyntaxException(String message, String revstr) {
 		this.revstr = revstr;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return super.toString() + ":" + revstr; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedEvent.java
index e634254..0c2aa46 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedEvent.java
@@ -14,13 +14,11 @@
  * Describes a change to one or more keys in the configuration.
  */
 public class ConfigChangedEvent extends RepositoryEvent<ConfigChangedListener> {
-	/** {@inheritDoc} */
 	@Override
 	public Class<ConfigChangedListener> getListenerType() {
 		return ConfigChangedListener.class;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispatch(ConfigChangedListener listener) {
 		listener.onConfigChanged(this);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedEvent.java
index f5a6d64..64d285a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedEvent.java
@@ -36,13 +36,11 @@ public boolean isInternal() {
 		return internal;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Class<IndexChangedListener> getListenerType() {
 		return IndexChangedListener.class;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispatch(IndexChangedListener listener) {
 		listener.onIndexChanged(this);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerHandle.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerHandle.java
index 4489760..94d49fd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerHandle.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerHandle.java
@@ -35,7 +35,6 @@ public void remove() {
 		parent.remove(this);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java
index 476c37c..92a2277 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java
@@ -71,6 +71,8 @@ public ListenerHandle addConfigChangedListener(
 	/**
 	 * Add a listener to the list.
 	 *
+	 * @param <T>
+	 *            type of {@code RepositoryListener}
 	 * @param type
 	 *            type of listener being registered.
 	 * @param listener
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedEvent.java
index 6f1e8d5..9bd1ef0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedEvent.java
@@ -14,13 +14,11 @@
  * Describes a change to one or more references of a repository.
  */
 public class RefsChangedEvent extends RepositoryEvent<RefsChangedListener> {
-	/** {@inheritDoc} */
 	@Override
 	public Class<RefsChangedListener> getListenerType() {
 		return RefsChangedListener.class;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispatch(RefsChangedListener listener) {
 		listener.onRefsChanged(this);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryEvent.java
index 81f2e73..288074e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryEvent.java
@@ -61,7 +61,6 @@ public Repository getRepository() {
 	 */
 	public abstract void dispatch(T listener);
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedEvent.java
index f9888ea..c327515 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedEvent.java
@@ -87,13 +87,11 @@ public Collection<String> getDeleted() {
 		return result;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Class<WorkingTreeModifiedListener> getListenerType() {
 		return WorkingTreeModifiedListener.class;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispatch(WorkingTreeModifiedListener listener) {
 		listener.onWorkingTreeModified(this);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/AbstractHead.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/AbstractHead.java
index d54bf65..8668ea9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/AbstractHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/AbstractHead.java
@@ -45,7 +45,6 @@ public final void setNewHeads(List<Head> newHeads) {
 		this.newHeads = newHeads;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Head> getNextHeads(char c) {
 		if (matches(c)) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/CharacterHead.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/CharacterHead.java
index faf4ee6..92fee62 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/CharacterHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/CharacterHead.java
@@ -24,13 +24,11 @@ final class CharacterHead extends AbstractHead {
 		this.expectedCharacter = expectedCharacter;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(char c) {
 		return c == expectedCharacter;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return String.valueOf(expectedCharacter);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/GroupHead.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/GroupHead.java
index 5ffcafc..3b240c3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/GroupHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/GroupHead.java
@@ -96,7 +96,6 @@ final class GroupHead extends AbstractHead {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(char c) {
 		for (CharacterPattern pattern : characterClasses) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/LastHead.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/LastHead.java
index 6aac3fa..d4cc850 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/LastHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/LastHead.java
@@ -22,7 +22,6 @@ private LastHead() {
 		// defined because of javadoc and visibility modifier.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Head> getNextHeads(char c) {
 		return FileNameMatcher.EMPTY_HEAD_LIST;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/RestrictedWildCardHead.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/RestrictedWildCardHead.java
index 14b6038..6b4526f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/RestrictedWildCardHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/RestrictedWildCardHead.java
@@ -18,13 +18,11 @@ final class RestrictedWildCardHead extends AbstractHead {
 		this.excludedCharacter = excludedCharacter;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(char c) {
 		return c != excludedCharacter;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return isStar() ? "*" : "?"; //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/WildCardHead.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/WildCardHead.java
index 3665a70..62b6f42 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/WildCardHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/WildCardHead.java
@@ -15,7 +15,6 @@ final class WildCardHead extends AbstractHead {
 		super(star);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(char c) {
 		return true;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
index aa69a05..957b386 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
@@ -75,7 +75,9 @@ public interface IncludedFileReader {
 		 *            The relative path to the file to read
 		 * @return the {@code InputStream} of the file.
 		 * @throws GitAPIException
+		 *             a JGit API exception
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		public InputStream readIncludeFile(String path)
 				throws GitAPIException, IOException;
@@ -134,6 +136,7 @@ public ManifestParser(IncludedFileReader includedReader, String filename,
 	 * @param inputStream
 	 *            a {@link java.io.InputStream} object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void read(InputStream inputStream) throws IOException {
 		xmlInRead++;
@@ -151,7 +154,6 @@ public void read(InputStream inputStream) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public void startElement(
@@ -239,7 +241,6 @@ public void startElement(
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endElement(
 			String uri,
@@ -251,7 +252,6 @@ public void endElement(
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endDocument() throws SAXException {
 		xmlInRead--;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
index 6e943e5..1ca3ce4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
@@ -105,6 +105,7 @@ public interface RemoteReader {
 		 * @return the sha1 of the remote repository, or null if the ref does
 		 *         not exist.
 		 * @throws GitAPIException
+		 *             a JGit API exception
 		 */
 		@Nullable
 		public ObjectId sha1(String uri, String ref) throws GitAPIException;
@@ -120,7 +121,10 @@ public interface RemoteReader {
 		 *            The relative path (inside the repo) to the file to read
 		 * @return the file content.
 		 * @throws GitAPIException
+		 *             If the ref have an invalid or ambiguous name, or it does
+		 *             not exist in the repository,
 		 * @throws IOException
+		 *             If the object does not exist or is too large
 		 * @since 3.5
 		 *
 		 * @deprecated Use {@link #readFileWithMode(String, String, String)}
@@ -528,7 +532,6 @@ public RepoCommand addToDestination(String path, String contents) {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevCommit call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
index c5ead09..8deb738 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
@@ -93,6 +93,7 @@ public CopyFile(Repository repo, String path, String src, String dest) {
 		 * Do the copy file action.
 		 *
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		public void copy() throws IOException {
 			File srcFile = new File(repo.getWorkTree(),
@@ -180,7 +181,7 @@ public RepoProject(String name, String path, String revision,
 	 */
 	public RepoProject(String name, String path, String revision,
 			String remote, String groupsParam) {
-		this(name, path, revision, remote, new HashSet<String>(), null);
+		this(name, path, revision, remote, new HashSet<>(), null);
 		if (groupsParam != null && groupsParam.length() > 0)
 			this.setGroups(groupsParam);
 	}
@@ -418,7 +419,6 @@ public boolean isAncestorOf(String thatPath) {
 		return thatPath.startsWith(getPathWithSlash());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof RepoProject) {
@@ -428,13 +428,11 @@ public boolean equals(Object o) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return this.getPathWithSlash().hashCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int compareTo(RepoProject that) {
 		return this.getPathWithSlash().compareTo(that.getPathWithSlash());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/CommitMsgHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/CommitMsgHook.java
index 023aef1..17fdd7e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/CommitMsgHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/CommitMsgHook.java
@@ -71,7 +71,6 @@ protected CommitMsgHook(Repository repo, PrintStream outputStream,
 		super(repo, outputStream, errorStream);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String call() throws IOException, AbortedByHookException {
 		if (commitMessage == null) {
@@ -94,7 +93,6 @@ private boolean canRun() {
 		return getCommitEditMessageFilePath() != null && commitMessage != null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getHookName() {
 		return NAME;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PostCommitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PostCommitHook.java
index b9dafcc..3988ee0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PostCommitHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PostCommitHook.java
@@ -61,14 +61,12 @@ protected PostCommitHook(Repository repo, PrintStream outputStream,
 		super(repo, outputStream, errorStream);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Void call() throws IOException, AbortedByHookException {
 		doRun();
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getHookName() {
 		return NAME;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
index 321f476..b12ea83 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
@@ -60,14 +60,12 @@ protected PreCommitHook(Repository repo, PrintStream outputStream,
 		super(repo, outputStream, errorStream);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Void call() throws IOException, AbortedByHookException {
 		doRun();
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getHookName() {
 		return NAME;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java
index 43dbc37..e36312b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java
@@ -74,13 +74,11 @@ protected PrePushHook(Repository repo, PrintStream outputStream,
 		super(repo, outputStream, errorStream);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected String getStdinArgs() {
 		return refs;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String call() throws IOException, AbortedByHookException {
 		if (canRun()) {
@@ -96,7 +94,6 @@ private boolean canRun() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getHookName() {
 		return NAME;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java
index 9dd565f..b041729 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java
@@ -208,7 +208,6 @@ public boolean isEmpty() {
 		return matcher == NO_MATCH;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
@@ -221,7 +220,6 @@ public String toString() {
 
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		final int prime = 31;
@@ -232,7 +230,6 @@ public int hashCode() {
 		return result;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java
index 4e7f126..33dceb0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java
@@ -190,7 +190,6 @@ public MatchResult isIgnored(String entryPath, boolean isDirectory) {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return rules.toString();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java
index 0737ed8..a3f365e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java
@@ -33,19 +33,16 @@ public abstract class AbstractMatcher implements IMatcher {
 		this.dirOnly = dirOnly;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return pattern;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return pattern.hashCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/LeadingAsteriskMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/LeadingAsteriskMatcher.java
index 73e2ad3..84376be 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/LeadingAsteriskMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/LeadingAsteriskMatcher.java
@@ -22,7 +22,6 @@ public class LeadingAsteriskMatcher extends NameMatcher {
 					"Pattern must have leading asterisk: " + pattern); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl) {
 		// faster local access, same as in string.indexOf()
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/NameMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/NameMatcher.java
index 39fa74f..4f8e149 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/NameMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/NameMatcher.java
@@ -38,7 +38,6 @@ public class NameMatcher extends AbstractMatcher {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String path, boolean assumeDirectory,
 			boolean pathMatch) {
@@ -88,7 +87,6 @@ public boolean matches(String path, boolean assumeDirectory,
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl) {
 		// faster local access, same as in string.indexOf()
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java
index ba77b3d..a40568d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java
@@ -91,6 +91,7 @@ private static List<IMatcher> createMatchers(List<String> segments,
 	 *            a boolean.
 	 * @return never null
 	 * @throws org.eclipse.jgit.errors.InvalidPatternException
+	 *             if pattern is invalid
 	 */
 	public static IMatcher createPathMatcher(String pattern,
 			Character pathSeparator, boolean dirOnly)
@@ -149,7 +150,6 @@ private static IMatcher createNameMatcher0(String segment,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String path, boolean assumeDirectory,
 			boolean pathMatch) {
@@ -192,7 +192,6 @@ private boolean simpleMatch(String path, boolean assumeDirectory,
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl) {
 		throw new UnsupportedOperationException(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java
index fbce08a..3305a74 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java
@@ -232,16 +232,19 @@ enum PatternState {
 			.compile("\\[\\[[.=]\\w+[.=]\\]\\]"); //$NON-NLS-1$
 
 	/**
-	 * Conversion from glob to Java regex following two sources: <li>
-	 * http://man7.org/linux/man-pages/man7/glob.7.html <li>
-	 * org.eclipse.jgit.fnmatch.FileNameMatcher.java Seems that there are
+	 * Conversion from glob to Java regex following two sources:
+	 * <ul>
+	 * <li>http://man7.org/linux/man-pages/man7/glob.7.html
+	 * <li>org.eclipse.jgit.fnmatch.FileNameMatcher.java Seems that there are
 	 * various ways to define what "glob" can be.
+	 * </ul>
 	 *
 	 * @param pattern
 	 *            non null pattern
 	 *
 	 * @return Java regex pattern corresponding to given glob pattern
 	 * @throws InvalidPatternException
+	 *             if pattern is invalid
 	 */
 	static Pattern convertGlob(String pattern) throws InvalidPatternException {
 		if (UNSUPPORTED.matcher(pattern).find())
@@ -419,6 +422,7 @@ && isLetter(lookAhead(pattern, i)))
 
 	/**
 	 * @param buffer
+	 *            buffer
 	 * @return zero of the buffer is empty, otherwise the last character from
 	 *         buffer
 	 */
@@ -427,10 +431,13 @@ private static char lookBehind(StringBuilder buffer) {
 	}
 
 	/**
+	 * Lookahead next character after given index in pattern
+	 *
 	 * @param pattern
+	 *            the pattern
 	 * @param i
 	 *            current pointer in the pattern
-	 * @return zero of the index is out of range, otherwise the next character
+	 * @return zero if the index is out of range, otherwise the next character
 	 *         from given position
 	 */
 	private static char lookAhead(String pattern, int i) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/TrailingAsteriskMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/TrailingAsteriskMatcher.java
index 7fa076b..1f1c223 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/TrailingAsteriskMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/TrailingAsteriskMatcher.java
@@ -22,7 +22,6 @@ public class TrailingAsteriskMatcher extends NameMatcher {
 					"Pattern must have trailing asterisk: " + pattern); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl) {
 		// faster local access, same as in string.indexOf()
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildCardMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildCardMatcher.java
index 76a8864..d976f6e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildCardMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildCardMatcher.java
@@ -31,7 +31,6 @@ public class WildCardMatcher extends NameMatcher {
 		p = convertGlob(subPattern);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl) {
 		return p.matcher(segment.substring(startIncl, endExcl)).matches();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java
index 1baa9ab..606b585 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java
@@ -26,7 +26,6 @@ public final class WildMatcher extends AbstractMatcher {
 		super(WILDMATCH, dirOnly);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean matches(String path, boolean assumeDirectory,
 			boolean pathMatch) {
@@ -34,7 +33,6 @@ public final boolean matches(String path, boolean assumeDirectory,
 				|| (!pathMatch && isSubdirectory(path));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean matches(String segment, int startIncl, int endExcl) {
 		return true;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
index 518e0b7..91d5322 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -252,6 +252,7 @@ public static JGitText get() {
 	/***/ public String corruptObjectTruncatedInName;
 	/***/ public String corruptObjectTruncatedInObjectId;
 	/***/ public String corruptObjectZeroId;
+	/***/ public String corruptReverseIndexChecksumIncorrect;
 	/***/ public String corruptPack;
 	/***/ public String corruptUseCnt;
 	/***/ public String couldNotFindTabInLine;
@@ -866,6 +867,7 @@ public static JGitText get() {
 	/***/ public String unsupportedEncryptionVersion;
 	/***/ public String unsupportedGC;
 	/***/ public String unsupportedMark;
+	/***/ public String unsupportedObjectIdVersion;
 	/***/ public String unsupportedOperationNotAddAtEnd;
 	/***/ public String unsupportedPackIndexVersion;
 	/***/ public String unsupportedPackReverseIndexVersion;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diff/FilteredRenameDetector.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diff/FilteredRenameDetector.java
index d65624f..ec4049a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diff/FilteredRenameDetector.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diff/FilteredRenameDetector.java
@@ -54,6 +54,7 @@ public FilteredRenameDetector(RenameDetector renameDetector) {
 	 *            Filter out changes that didn't affect this path.
 	 * @return The subset of changes that affect only the filtered path.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public List<DiffEntry> compute(List<DiffEntry> diffs,
 			PathFilter pathFilter) throws IOException {
@@ -73,6 +74,7 @@ public List<DiffEntry> compute(List<DiffEntry> diffs,
 	 *            Filter out changes that didn't affect these paths.
 	 * @return The subset of changes that affect only the filtered paths.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @see RenameDetector#compute()
 	 */
 	public List<DiffEntry> compute(List<DiffEntry> changes,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/CommandExecutor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/CommandExecutor.java
index ebef524..3a729fb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/CommandExecutor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/CommandExecutor.java
@@ -62,8 +62,11 @@ public CommandExecutor(FS fs, boolean checkExitCode) {
 	 *            the environment
 	 * @return the execution result
 	 * @throws ToolException
+	 *             if a tool raised an error
 	 * @throws InterruptedException
+	 *             if thread was interrupted
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public ExecutionResult run(String command, File workingDir,
 			Map<String, String> env)
@@ -109,8 +112,11 @@ public ExecutionResult run(String command, File workingDir,
 	 *            the environment
 	 * @return the execution result
 	 * @throws ToolException
+	 *             if a tool raised an error
 	 * @throws InterruptedException
+	 *             if thread was interrupted
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public boolean checkExecutable(String path, File workingDir,
 			Map<String, String> env)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/DiffTools.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/DiffTools.java
index d0034df..6a67bf3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/DiffTools.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/DiffTools.java
@@ -172,6 +172,7 @@ public Optional<ExecutionResult> compare(FileElement localFile,
 	 *            the "trust exit code" option
 	 * @return the execution result from tool
 	 * @throws ToolException
+	 *             when the tool fails
 	 */
 	public ExecutionResult compare(FileElement localFile,
 			FileElement remoteFile, ExternalDiffTool tool,
@@ -244,6 +245,7 @@ public Set<String> getAllToolNames() {
 	 *            path to the node in repository to parse git attributes for
 	 * @return name of the difftool if set
 	 * @throws ToolException
+	 *             when the tool failed
 	 */
 	public Optional<String> getExternalToolFromAttributes(final String path)
 			throws ToolException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/ExternalToolUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/ExternalToolUtils.java
index b2dd846..367107d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/ExternalToolUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/ExternalToolUtils.java
@@ -57,6 +57,7 @@ public class ExternalToolUtils {
 	 *            the base file (can be null)
 	 * @return the prepared (with replaced variables) command string
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static String prepareCommand(String command, FileElement localFile,
 			FileElement remoteFile, FileElement mergedFile,
@@ -91,6 +92,7 @@ public static String prepareCommand(String command, FileElement localFile,
 	 *            the base file (can be null)
 	 * @return the environment map with variables and values (file paths)
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public static Map<String, String> prepareEnvironment(File gitDir,
 			FileElement localFile, FileElement remoteFile,
@@ -209,6 +211,7 @@ public static Set<String> createSortedToolSet(String defaultName,
 	 *            config key name for the tool
 	 * @return attribute value for the given tool key if set
 	 * @throws ToolException
+	 *             if the tool failed
 	 */
 	public static Optional<String> getExternalToolFromAttributes(
 			final Repository repository, final String path,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/FileElement.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/FileElement.java
index ba8ca54..0061e3f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/FileElement.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/FileElement.java
@@ -138,6 +138,7 @@ public Type getType() {
 	 *
 	 * @return the object stream
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public File getFile() throws IOException {
 		// if we have already temp file and no stream
@@ -179,6 +180,7 @@ public boolean isNullPath() {
 	 *            temporary directory is used
 	 * @return temporary file in directory or in the system temporary directory
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public File createTempFile(File directory) throws IOException {
 		if (tempFile == null) {
@@ -204,6 +206,7 @@ public void cleanTemporaries() {
 	 *            the input string
 	 * @return the replaced input string
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public String replaceVariable(String input) throws IOException {
 		return input.replace("$" + type.name(), getFile().getPath()); //$NON-NLS-1$
@@ -215,6 +218,7 @@ public String replaceVariable(String input) throws IOException {
 	 * @param env
 	 *            the environment where this element should be added
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public void addToEnv(Map<String, String> env) throws IOException {
 		env.put(type.name(), getFile().getPath());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/MergeTools.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/MergeTools.java
index b903201..0da58e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/MergeTools.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/MergeTools.java
@@ -184,6 +184,7 @@ public Optional<ExecutionResult> merge(FileElement localFile,
 	 *            the selected tool
 	 * @return the execution result from tool
 	 * @throws ToolException
+	 *             if the tool failed
 	 */
 	public ExecutionResult merge(FileElement localFile, FileElement remoteFile,
 			FileElement mergedFile, FileElement baseFile, File tempDir,
@@ -254,6 +255,7 @@ private FileElement createBackupFile(FileElement from, File toParentDir)
 	 * @return the created temporary directory if (mergetol.writeToTemp == true)
 	 *         or null if not configured or false.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public File createTempDirectory() throws IOException {
 		return config.isWriteToTemp()
@@ -305,6 +307,7 @@ public Set<String> getAllToolNames() {
 	 *            path to the node in repository to parse git attributes for
 	 * @return name of the difftool if set
 	 * @throws ToolException
+	 *             if the tool failed
 	 */
 	public Optional<String> getExternalToolFromAttributes(final String path)
 			throws ToolException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/PreDefinedDiffTool.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/PreDefinedDiffTool.java
index e1169a2..c1d69b4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/PreDefinedDiffTool.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/PreDefinedDiffTool.java
@@ -43,6 +43,7 @@ public PreDefinedDiffTool(CommandLineDiffTool tool) {
 
 	/**
 	 * @param path
+	 *            path string
 	 */
 	@Override
 	public void setPath(String path) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/UserDefinedMergeTool.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/UserDefinedMergeTool.java
index 1dd2f0d..17d5b0b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/UserDefinedMergeTool.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/diffmergetool/UserDefinedMergeTool.java
@@ -59,7 +59,7 @@ protected void setTrustExitCode(BooleanTriState trustExitCode) {
 	/**
 	 * @param withBase
 	 *            not used, because user-defined merge tool can only define one
-	 *            cmd -> it must handle with and without base present (empty)
+	 *            cmd -&gt; it must handle with and without base present (empty)
 	 * @return the tool command
 	 */
 	@Override
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java
index 3b94984..795f440 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckPackParser.java
@@ -66,7 +66,6 @@ public FsckPackParser(ObjectDatabase db, ReadableChannel channel) {
 		this.blockSize = channel.blockSize() > 0 ? channel.blockSize() : 65536;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onPackHeader(long objCnt) throws IOException {
 		if (expectedObjectCount >= 0) {
@@ -78,48 +77,41 @@ protected void onPackHeader(long objCnt) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginWholeObject(long streamPosition, int type,
 			long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onObjectHeader(Source src, byte[] raw, int pos, int len)
 			throws IOException {
 		crc.update(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onObjectData(Source src, byte[] raw, int pos, int len)
 			throws IOException {
 		crc.update(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndWholeObject(PackedObjectInfo info) throws IOException {
 		info.setCRC((int) crc.getValue());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginOfsDelta(long deltaStreamPosition,
 			long baseStreamPosition, long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginRefDelta(long deltaStreamPosition, AnyObjectId baseId,
 			long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected UnresolvedDelta onEndDelta() throws IOException {
 		UnresolvedDelta delta = new UnresolvedDelta();
@@ -127,14 +119,12 @@ protected UnresolvedDelta onEndDelta() throws IOException {
 		return delta;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onInflatedObjectData(PackedObjectInfo obj, int typeCode,
 			byte[] data) throws IOException {
 		// FsckPackParser ignores this event.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void verifySafeObject(final AnyObjectId id, final int type,
 			final byte[] data) {
@@ -146,13 +136,11 @@ protected void verifySafeObject(final AnyObjectId id, final int type,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onPackFooter(byte[] hash) throws IOException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean onAppendBase(int typeCode, byte[] data,
 			PackedObjectInfo info) throws IOException {
@@ -160,13 +148,11 @@ protected boolean onAppendBase(int typeCode, byte[] data,
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndThinPack() throws IOException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 			ObjectTypeAndSize info) throws IOException {
@@ -175,7 +161,6 @@ protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 		return readObjectHeader(info);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 			ObjectTypeAndSize info) throws IOException {
@@ -184,7 +169,6 @@ protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 		return readObjectHeader(info);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int readDatabase(byte[] dst, int pos, int cnt)
 			throws IOException {
@@ -229,13 +213,11 @@ int read(long channelPosition, byte[] dst, int pos, int cnt)
 		return buf.array();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean checkCRC(int oldCRC) {
 		return oldCRC == (int) crc.getValue();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onStoreStream(byte[] raw, int pos, int len)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapFilter.java
index 86d4722..84f1cb9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapFilter.java
@@ -40,7 +40,6 @@ public AddToBitmapFilter(BitmapBuilder bitmap) {
 		this.bitmap = bitmap;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean include(RevWalk walker, RevCommit cmit) {
 		Bitmap visitedBitmap;
@@ -61,13 +60,11 @@ public final boolean include(RevWalk walker, RevCommit cmit) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final RevFilter clone() {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean requiresCommitBody() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapWithCacheFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapWithCacheFilter.java
index d7ccadf..a95432c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapWithCacheFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapWithCacheFilter.java
@@ -53,7 +53,6 @@ public AddToBitmapWithCacheFilter(AnyObjectId cachedCommit,
 		this.bitmap = bitmap;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean include(RevWalk rw, RevCommit c) {
 		Bitmap visitedBitmap;
@@ -76,13 +75,11 @@ public final boolean include(RevWalk rw, RevCommit c) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final RevFilter clone() {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean requiresCommitBody() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddUnseenToBitmapFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddUnseenToBitmapFilter.java
index da9f9d0..5ac267e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddUnseenToBitmapFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddUnseenToBitmapFilter.java
@@ -48,7 +48,6 @@ public AddUnseenToBitmapFilter(BitmapBuilder seen, BitmapBuilder bitmap) {
 		this.bitmap = bitmap;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean include(RevWalk walker, RevCommit cmit) {
 		Bitmap visitedBitmap;
@@ -69,13 +68,11 @@ public final boolean include(RevWalk walker, RevCommit cmit) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final RevFilter clone() {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean requiresCommitBody() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/BitmappedReachabilityChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/BitmappedReachabilityChecker.java
index 37721ad..f5f51e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/BitmappedReachabilityChecker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/BitmappedReachabilityChecker.java
@@ -119,7 +119,6 @@ public ReachedFilter(BitmapIndex repoBitmaps) {
 			this.reached = repoBitmaps.newBitmapBuilder();
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public final boolean include(RevWalk walker, RevCommit cmit) {
 			Bitmap commitBitmap;
@@ -149,13 +148,11 @@ private static final void dontFollow(RevCommit cmit) {
 			}
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public final RevFilter clone() {
 			throw new UnsupportedOperationException();
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public final boolean requiresCommitBody() {
 			return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/ChangedPathFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/ChangedPathFilter.java
new file mode 100644
index 0000000..53d921e
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/ChangedPathFilter.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2023, Google LLC
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.internal.storage.commitgraph;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+import java.util.Set;
+
+import org.apache.commons.codec.digest.MurmurHash3;
+
+/**
+ * A changed path filter for a commit.
+ *
+ * @since 6.7
+ */
+public class ChangedPathFilter {
+	/**
+	 * The number of times a path is hashed, as described in man
+	 * gitformat-commit-graph(5). The value of this constant is the only value
+	 * JGit currently supports.
+	 */
+	public static final int PATH_HASH_COUNT = 7;
+
+	/**
+	 * The minimum bits per entry, as described in man
+	 * gitformat-commit-graph(5). The value of this constant is the only value
+	 * JGit currently supports.
+	 */
+	public static final int BITS_PER_ENTRY = 10;
+
+	/**
+	 * Seed value as described in man gitformat-commit-graph(5).
+	 */
+	private static final int SEED1 = 0x293ae76f;
+
+	/**
+	 * Seed value as described in man gitformat-commit-graph(5).
+	 */
+	private static final int SEED2 = 0x7e646e2c;
+
+	/**
+	 * A filter that matches every path.
+	 */
+	public static final ChangedPathFilter FULL = new ChangedPathFilter(
+			new byte[] { (byte) 0xff }, 0, 1);
+
+	private static final ChangedPathFilter EMPTY = new ChangedPathFilter(
+			new byte[] { (byte) 0 }, 0, 1);
+
+	private final byte[] data;
+
+	private final int offset;
+
+	private final int length;
+
+	/**
+	 * Constructs a changed path filter.
+	 *
+	 * @param data
+	 *            data (possibly read from a commit graph file)
+	 * @param offset
+	 *            offset into data
+	 * @param length
+	 *            length of data
+	 */
+	private ChangedPathFilter(byte[] data, int offset, int length) {
+		this.data = data;
+		this.offset = offset;
+		this.length = length;
+	}
+
+	/**
+	 * Returns a filter that matches all given paths.
+	 * <p>
+	 * Because of the nature of Bloom filters, this filter may also match paths
+	 * not in the given set.
+	 *
+	 * @param paths
+	 *            the paths that the filter must match
+	 * @return the corresponding filter
+	 */
+	public static ChangedPathFilter fromPaths(Set<ByteBuffer> paths) {
+		if (paths.isEmpty()) {
+			return EMPTY;
+		}
+		byte[] bloom = new byte[-Math
+				.floorDiv(-paths.size() * ChangedPathFilter.BITS_PER_ENTRY, 8)];
+		for (ByteBuffer path : paths) {
+			add(bloom, path.array(), path.position(),
+					path.limit() - path.position());
+		}
+		return new ChangedPathFilter(bloom, 0, bloom.length);
+	}
+
+	/**
+	 * Returns a filter read from a file.
+	 *
+	 * @param data
+	 *            data (read from a commit graph file)
+	 * @param offset
+	 *            offset into data
+	 * @param length
+	 *            length of data
+	 *
+	 * @return the corresponding filter
+	 */
+	public static ChangedPathFilter fromFile(byte[] data, int offset,
+			int length) {
+		return new ChangedPathFilter(data, offset, length);
+	}
+
+	private static void add(byte[] changedPathFilterData, byte[] path,
+			int offset, int length) {
+
+		int hash0 = MurmurHash3.hash32x86(path, offset, length, SEED1);
+		int hash1 = MurmurHash3.hash32x86(path, offset, length, SEED2);
+		for (int i = 0; i < PATH_HASH_COUNT; i++) {
+			int pos = Integer.remainderUnsigned(hash0 + i * hash1,
+					changedPathFilterData.length * 8);
+			changedPathFilterData[pos / 8] |= (byte) (1 << (pos % 8));
+		}
+	}
+
+	/**
+	 * Checks if this changed path filter could contain path.
+	 *
+	 * @param path
+	 *            path to check existence of
+	 * @return true if the filter could contain path, false if the filter
+	 *         definitely does not contain path
+	 */
+	public boolean maybeContains(byte[] path) {
+		int hash0 = MurmurHash3.hash32x86(path, 0, path.length, SEED1);
+		int hash1 = MurmurHash3.hash32x86(path, 0, path.length, SEED2);
+		int bloomFilterBits = length * 8;
+		for (int i = 0; i < PATH_HASH_COUNT; i++) {
+			int pos = Integer.remainderUnsigned(hash0 + i * hash1,
+					bloomFilterBits);
+			if ((data[offset + (pos / 8)] & (byte) (1 << (pos % 8))) == 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Writes this filter to the given stream.
+	 *
+	 * @param s
+	 *            stream to write to
+	 */
+	public void writeTo(ByteArrayOutputStream s) {
+		s.write(data, offset, length);
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraph.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraph.java
index 0796293..d1178c2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraph.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraph.java
@@ -32,25 +32,26 @@ public interface CommitGraph {
 
 	/** Empty {@link CommitGraph} with no results. */
 	CommitGraph EMPTY = new CommitGraph() {
-		/** {@inheritDoc} */
 		@Override
 		public int findGraphPosition(AnyObjectId commit) {
 			return -1;
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public CommitData getCommitData(int graphPos) {
 			return null;
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public ObjectId getObjectId(int graphPos) {
 			return null;
 		}
 
-		/** {@inheritDoc} */
+		@Override
+		public ChangedPathFilter getChangedPathFilter(int graphPos) {
+			return null;
+		}
+
 		@Override
 		public long getCommitCnt() {
 			return 0;
@@ -97,6 +98,15 @@ public long getCommitCnt() {
 	ObjectId getObjectId(int graphPos);
 
 	/**
+	 * Get the changed path filter of the object at the commit-graph position.
+	 *
+	 * @param graphPos
+	 *            the position in the commit-graph of the object.
+	 * @return the bloom filter or null if it's not found.
+	 */
+	ChangedPathFilter getChangedPathFilter(int graphPos);
+
+	/**
 	 * Obtain the total number of commits described by this commit-graph.
 	 *
 	 * @return number of commits in this commit-graph.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphBuilder.java
index a6af3bc..8f02770 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphBuilder.java
@@ -10,6 +10,8 @@
 
 package org.eclipse.jgit.internal.storage.commitgraph;
 
+import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA;
+import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_COMMIT_DATA;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_FANOUT;
@@ -35,6 +37,10 @@ class CommitGraphBuilder {
 
 	private byte[] extraList;
 
+	private byte[] bloomFilterIndex;
+
+	private byte[] bloomFilterData;
+
 	/** @return A builder of {@link CommitGraph}. */
 	static CommitGraphBuilder builder() {
 		return new CommitGraphBuilder(OBJECT_ID_LENGTH);
@@ -72,6 +78,20 @@ CommitGraphBuilder addExtraList(byte[] buffer)
 		return this;
 	}
 
+	CommitGraphBuilder addBloomFilterIndex(byte[] buffer)
+			throws CommitGraphFormatException {
+		assertChunkNotSeenYet(bloomFilterIndex, CHUNK_ID_BLOOM_FILTER_INDEX);
+		bloomFilterIndex = buffer;
+		return this;
+	}
+
+	CommitGraphBuilder addBloomFilterData(byte[] buffer)
+			throws CommitGraphFormatException {
+		assertChunkNotSeenYet(bloomFilterData, CHUNK_ID_BLOOM_FILTER_DATA);
+		bloomFilterData = buffer;
+		return this;
+	}
+
 	CommitGraph build() throws CommitGraphFormatException {
 		assertChunkNotNull(oidFanout, CHUNK_ID_OID_FANOUT);
 		assertChunkNotNull(oidLookup, CHUNK_ID_OID_LOOKUP);
@@ -81,7 +101,9 @@ CommitGraph build() throws CommitGraphFormatException {
 				oidLookup);
 		GraphCommitData commitDataChunk = new GraphCommitData(hashLength,
 				commitData, extraList);
-		return new CommitGraphV1(index, commitDataChunk);
+		GraphChangedPathFilterData cpfData = new GraphChangedPathFilterData(
+				bloomFilterIndex, bloomFilterData);
+		return new CommitGraphV1(index, commitDataChunk, cpfData);
 	}
 
 	private void assertChunkNotNull(Object object, int chunkId)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphConstants.java
index a074833..8d2789c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphConstants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphConstants.java
@@ -25,6 +25,10 @@ class CommitGraphConstants {
 
 	static final int CHUNK_ID_EXTRA_EDGE_LIST = 0x45444745; /* "EDGE" */
 
+	static final int CHUNK_ID_BLOOM_FILTER_INDEX = 0x42494458; /* "BIDX" */
+
+	static final int CHUNK_ID_BLOOM_FILTER_DATA = 0x42444154; /* "BDAT" */
+
 	/**
 	 * First 4 bytes describe the chunk id. Value 0 is a terminating label.
 	 * Other 8 bytes provide the byte-offset in current file for chunk to start.
@@ -41,15 +45,15 @@ class CommitGraphConstants {
 	/** Mask to make the last edgeValue into position */
 	static final int GRAPH_EDGE_LAST_MASK = 0x7fffffff;
 
-	/** EdgeValue & GRAPH_LAST_EDGE != 0 means it is the last edgeValue */
+	/** EdgeValue &amp; GRAPH_LAST_EDGE != 0 means it is the last edgeValue */
 	static final int GRAPH_LAST_EDGE = 0x80000000;
 
 	/** EdgeValue == GRAPH_NO_PARENT means it has no parents */
 	static final int GRAPH_NO_PARENT = 0x70000000;
 
 	/**
-	 * EdgeValue & GRAPH_EXTRA_EDGES_NEEDED != 0 means its other parents are in
-	 * Chunk Extra Edge List
+	 * EdgeValue &amp; GRAPH_EXTRA_EDGES_NEEDED != 0 means its other parents are
+	 * in Chunk Extra Edge List
 	 */
 	static final int GRAPH_EXTRA_EDGES_NEEDED = 0x80000000;
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphLoader.java
index 571f5f4..867d522 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphLoader.java
@@ -10,6 +10,8 @@
 
 package org.eclipse.jgit.internal.storage.commitgraph;
 
+import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA;
+import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_COMMIT_DATA;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_FANOUT;
@@ -25,9 +27,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.util.IO;
 import org.eclipse.jgit.util.NB;
+import org.eclipse.jgit.util.SystemReader;
 import org.eclipse.jgit.util.io.SilentFileInputStream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -137,6 +142,17 @@ public static CommitGraph read(InputStream fd)
 			chunks.add(new ChunkSegment(id, offset));
 		}
 
+		boolean readChangedPathFilters;
+		try {
+			readChangedPathFilters = SystemReader.getInstance()
+					.getJGitConfig()
+					.getBoolean(ConfigConstants.CONFIG_COMMIT_GRAPH_SECTION,
+						ConfigConstants.CONFIG_KEY_READ_CHANGED_PATHS, false);
+		} catch (ConfigInvalidException e) {
+			// Use the default value if, for some reason, the config couldn't be read.
+			readChangedPathFilters = false;
+		}
+
 		CommitGraphBuilder builder = CommitGraphBuilder.builder();
 		for (int i = 0; i < numberOfChunks; i++) {
 			long chunkOffset = chunks.get(i).offset;
@@ -164,6 +180,16 @@ public static CommitGraph read(InputStream fd)
 			case CHUNK_ID_EXTRA_EDGE_LIST:
 				builder.addExtraList(buffer);
 				break;
+			case CHUNK_ID_BLOOM_FILTER_INDEX:
+				if (readChangedPathFilters) {
+					builder.addBloomFilterIndex(buffer);
+				}
+				break;
+			case CHUNK_ID_BLOOM_FILTER_DATA:
+				if (readChangedPathFilters) {
+					builder.addBloomFilterData(buffer);
+				}
+				break;
 			default:
 				LOG.warn(MessageFormat.format(
 						JGitText.get().commitGraphChunkUnknown,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphV1.java
index da17219..b0a9c83 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphV1.java
@@ -24,18 +24,20 @@ class CommitGraphV1 implements CommitGraph {
 
 	private final GraphCommitData commitData;
 
-	CommitGraphV1(GraphObjectIndex index, GraphCommitData commitData) {
+	private final GraphChangedPathFilterData cpfData;
+
+	CommitGraphV1(GraphObjectIndex index, GraphCommitData commitData,
+			GraphChangedPathFilterData cpfData) {
 		this.idx = index;
 		this.commitData = commitData;
+		this.cpfData = cpfData;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int findGraphPosition(AnyObjectId commit) {
 		return idx.findGraphPosition(commit);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CommitData getCommitData(int graphPos) {
 		if (graphPos < 0 || graphPos >= getCommitCnt()) {
@@ -44,13 +46,16 @@ public CommitData getCommitData(int graphPos) {
 		return commitData.getCommitData(graphPos);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObjectId(int graphPos) {
 		return idx.getObjectId(graphPos);
 	}
 
-	/** {@inheritDoc} */
+	@Override
+	public ChangedPathFilter getChangedPathFilter(int graphPos) {
+		return cpfData.getChangedPathFilter(graphPos);
+	}
+
 	@Override
 	public long getCommitCnt() {
 		return idx.getCommitCnt();
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 a58a9eb..c5cfe95 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
@@ -10,6 +10,8 @@
 
 package org.eclipse.jgit.internal.storage.commitgraph;
 
+import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA;
+import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_COMMIT_DATA;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST;
 import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_FANOUT;
@@ -24,21 +26,31 @@
 import static org.eclipse.jgit.lib.Constants.COMMIT_GENERATION_UNKNOWN;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
+import java.nio.ByteBuffer;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+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.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.storage.io.CancellableDigestOutputStream;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.EmptyTreeIterator;
+import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.util.NB;
 
 /**
@@ -56,10 +68,14 @@ public class CommitGraphWriter {
 
 	private static final int GENERATION_NUMBER_MAX = 0x3FFFFFFF;
 
+	private static final int MAX_CHANGED_PATHS = 512;
+
 	private final int hashsz;
 
 	private final GraphCommits graphCommits;
 
+	private final boolean generateChangedPathFilters;
+
 	/**
 	 * Create commit-graph writer for these commits.
 	 *
@@ -67,8 +83,22 @@ public class CommitGraphWriter {
 	 *            the commits which will be writen to the commit-graph.
 	 */
 	public CommitGraphWriter(@NonNull GraphCommits graphCommits) {
+		this(graphCommits, false);
+	}
+
+	/**
+	 * Create commit-graph writer for these commits.
+	 *
+	 * @param graphCommits
+	 *            the commits which will be writen to the commit-graph.
+	 * @param generateChangedPathFilters
+	 *            whether changed path filters are generated
+	 */
+	public CommitGraphWriter(@NonNull GraphCommits graphCommits,
+			boolean generateChangedPathFilters) {
 		this.graphCommits = graphCommits;
 		this.hashsz = OBJECT_ID_LENGTH;
+		this.generateChangedPathFilters = generateChangedPathFilters;
 	}
 
 	/**
@@ -80,15 +110,18 @@ public CommitGraphWriter(@NonNull GraphCommits graphCommits) {
 	 *            output stream of commit-graph data. The stream should be
 	 *            buffered by the caller. The caller is responsible for closing
 	 *            the stream.
+	 * @return statistics gathered during the run
 	 * @throws IOException
+	 *             if an error occurred
 	 */
-	public void write(@NonNull ProgressMonitor monitor,
+	public Stats write(@NonNull ProgressMonitor monitor,
 			@NonNull OutputStream commitGraphStream) throws IOException {
+		Stats stats = new Stats();
 		if (graphCommits.size() == 0) {
-			return;
+			return stats;
 		}
 
-		List<ChunkHeader> chunks = createChunks();
+		List<ChunkHeader> chunks = createChunks(stats);
 		long writeCount = 256 + 2 * graphCommits.size()
 				+ graphCommits.getExtraEdgeCnt();
 		monitor.beginTask(
@@ -108,9 +141,12 @@ public void write(@NonNull ProgressMonitor monitor,
 		} finally {
 			monitor.endTask();
 		}
+		return stats;
 	}
 
-	private List<ChunkHeader> createChunks() {
+	private List<ChunkHeader> createChunks(Stats stats)
+			throws MissingObjectException,
+			IncorrectObjectTypeException, CorruptObjectException, IOException {
 		List<ChunkHeader> chunks = new ArrayList<>();
 		chunks.add(new ChunkHeader(CHUNK_ID_OID_FANOUT, GRAPH_FANOUT_SIZE));
 		chunks.add(new ChunkHeader(CHUNK_ID_OID_LOOKUP,
@@ -121,6 +157,14 @@ private List<ChunkHeader> createChunks() {
 			chunks.add(new ChunkHeader(CHUNK_ID_EXTRA_EDGE_LIST,
 					graphCommits.getExtraEdgeCnt() * 4));
 		}
+		if (generateChangedPathFilters) {
+			BloomFilterChunks bloomFilterChunks = computeBloomFilterChunks(
+					stats);
+			chunks.add(new ChunkHeader(CHUNK_ID_BLOOM_FILTER_INDEX,
+					bloomFilterChunks.index));
+			chunks.add(new ChunkHeader(CHUNK_ID_BLOOM_FILTER_DATA,
+					bloomFilterChunks.data));
+		}
 		return chunks;
 	}
 
@@ -170,6 +214,14 @@ private void writeChunks(ProgressMonitor monitor,
 			case CHUNK_ID_EXTRA_EDGE_LIST:
 				writeExtraEdges(out);
 				break;
+			case CHUNK_ID_BLOOM_FILTER_INDEX:
+			case CHUNK_ID_BLOOM_FILTER_DATA:
+				if (!chunk.data.isPresent()) {
+					throw new IllegalStateException(
+							"data for this chunk must be precomputed"); //$NON-NLS-1$
+				}
+				chunk.data.get().writeTo(out);
+				break;
 			}
 		}
 	}
@@ -304,6 +356,79 @@ private void writeCommitData(ProgressMonitor monitor,
 		return generations;
 	}
 
+	private static Optional<HashSet<ByteBuffer>> computeBloomFilterPaths(
+			ObjectReader or, RevCommit cmit) throws MissingObjectException,
+			IncorrectObjectTypeException, CorruptObjectException, IOException {
+		HashSet<ByteBuffer> paths = new HashSet<>();
+		try (TreeWalk walk = new TreeWalk(null, or)) {
+			walk.setRecursive(true);
+			if (cmit.getParentCount() == 0) {
+				walk.addTree(new EmptyTreeIterator());
+			} else {
+				walk.addTree(cmit.getParent(0).getTree());
+			}
+			walk.addTree(cmit.getTree());
+			while (walk.next()) {
+				if (walk.idEqual(0, 1)) {
+					continue;
+				}
+				byte[] rawPath = walk.getRawPath();
+				paths.add(ByteBuffer.wrap(rawPath));
+				for (int i = 0; i < rawPath.length; i++) {
+					if (rawPath[i] == '/') {
+						paths.add(ByteBuffer.wrap(rawPath, 0, i));
+					}
+					if (paths.size() > MAX_CHANGED_PATHS) {
+						return Optional.empty();
+					}
+				}
+			}
+		}
+		return Optional.of(paths);
+	}
+
+	private BloomFilterChunks computeBloomFilterChunks(Stats stats)
+			throws MissingObjectException, IncorrectObjectTypeException,
+			CorruptObjectException, IOException {
+
+		ByteArrayOutputStream index = new ByteArrayOutputStream();
+		ByteArrayOutputStream data = new ByteArrayOutputStream();
+
+		// Allocate scratch buffer for converting integers into
+		// big-endian bytes.
+		byte[] scratch = new byte[4];
+
+		NB.encodeInt32(scratch, 0, 1); // version 1
+		data.write(scratch);
+		NB.encodeInt32(scratch, 0, ChangedPathFilter.PATH_HASH_COUNT);
+		data.write(scratch);
+		NB.encodeInt32(scratch, 0, ChangedPathFilter.BITS_PER_ENTRY);
+		data.write(scratch);
+		int dataHeaderSize = data.size();
+
+		try (RevWalk rw = new RevWalk(graphCommits.getObjectReader())) {
+			for (RevCommit cmit : graphCommits) {
+				ChangedPathFilter cpf = cmit.getChangedPathFilter(rw);
+				if (cpf != null) {
+					stats.changedPathFiltersReused++;
+				} else {
+					stats.changedPathFiltersComputed++;
+					Optional<HashSet<ByteBuffer>> paths = computeBloomFilterPaths(
+							graphCommits.getObjectReader(), cmit);
+					if (paths.isEmpty()) {
+						cpf = ChangedPathFilter.FULL;
+					} else {
+						cpf = ChangedPathFilter.fromPaths(paths.get());
+					}
+				}
+				cpf.writeTo(data);
+				NB.encodeInt32(scratch, 0, data.size() - dataHeaderSize);
+				index.write(scratch);
+			}
+			return new BloomFilterChunks(index, data);
+		}
+	}
+
 	private void writeExtraEdges(CancellableDigestOutputStream out)
 			throws IOException {
 		byte[] tmp = new byte[4];
@@ -330,9 +455,60 @@ private static class ChunkHeader {
 
 		final long size;
 
+		final Optional<ByteArrayOutputStream> data;
+
 		public ChunkHeader(int id, long size) {
 			this.id = id;
 			this.size = size;
+			this.data = Optional.empty();
+		}
+
+		ChunkHeader(int id, ByteArrayOutputStream data) {
+			this.id = id;
+			this.size = data.size();
+			this.data = Optional.of(data);
+		}
+	}
+
+	private static class BloomFilterChunks {
+		final ByteArrayOutputStream index;
+
+		final ByteArrayOutputStream data;
+
+		BloomFilterChunks(ByteArrayOutputStream index,
+				ByteArrayOutputStream data) {
+			this.index = index;
+			this.data = data;
+		}
+	}
+
+	/**
+	 * Statistics collected during a single commit graph write.
+	 */
+	public static class Stats {
+
+		private long changedPathFiltersReused = 0;
+
+		private long changedPathFiltersComputed = 0;
+
+		/**
+		 * Returns the number of existing changed path filters that were reused
+		 * when writing, for statistical purposes.
+		 *
+		 * @return count of changed path filters
+		 */
+		public long getChangedPathFiltersReused() {
+			return changedPathFiltersReused;
+		}
+
+		/**
+		 * Returns the number of changed path filters that were computed from
+		 * scratch, for statistical purposes.
+		 *
+		 * @return count of changed path filters
+		 */
+		public long getChangedPathFiltersComputed() {
+			return changedPathFiltersComputed;
 		}
 	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphChangedPathFilterData.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphChangedPathFilterData.java
new file mode 100644
index 0000000..738a42a
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphChangedPathFilterData.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2023, Google LLC.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.internal.storage.commitgraph;
+
+import org.eclipse.jgit.util.NB;
+
+/**
+ * Represents the BIDX and BDAT data found in a commit graph file.
+ */
+class GraphChangedPathFilterData {
+
+	private static final int BIDX_BYTES_PER_ENTRY = 4;
+
+	private static final int BDAT_HEADER_BYTES = 12;
+
+	private final byte[] bloomFilterIndex;
+
+	private final byte[] bloomFilterData;
+
+	/**
+	 * Initialize the GraphChangedPathFilterData.
+	 *
+	 * @param bloomFilterIndex
+	 *            content of BIDX chunk, if it exists
+	 * @param bloomFilterData
+	 *            content of BDAT chunk, if it exists
+	 */
+	GraphChangedPathFilterData(byte[] bloomFilterIndex,
+			byte[] bloomFilterData) {
+
+		if ((bloomFilterIndex == null) != (bloomFilterData == null)) {
+			bloomFilterIndex = null;
+			bloomFilterData = null;
+		}
+		if (bloomFilterData != null
+				&& (NB.decodeUInt32(bloomFilterData,
+						4) != ChangedPathFilter.PATH_HASH_COUNT
+						|| NB.decodeUInt32(bloomFilterData,
+								8) != ChangedPathFilter.BITS_PER_ENTRY)) {
+			bloomFilterIndex = null;
+			bloomFilterData = null;
+		}
+
+		this.bloomFilterIndex = bloomFilterIndex;
+		this.bloomFilterData = bloomFilterData;
+	}
+
+	ChangedPathFilter getChangedPathFilter(int graphPos) {
+		if (bloomFilterIndex == null) {
+			return null;
+		}
+		int priorCumul = graphPos == 0 ? 0
+				: NB.decodeInt32(bloomFilterIndex,
+						graphPos * BIDX_BYTES_PER_ENTRY - BIDX_BYTES_PER_ENTRY);
+		int cumul = NB.decodeInt32(bloomFilterIndex, graphPos * BIDX_BYTES_PER_ENTRY);
+		return ChangedPathFilter.fromFile(bloomFilterData,
+				priorCumul + BDAT_HEADER_BYTES,
+				cumul - priorCumul);
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphCommits.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphCommits.java
index ccf6d0e..c77d950 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphCommits.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/GraphCommits.java
@@ -23,6 +23,7 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdOwnerMap;
+import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -56,6 +57,7 @@ public class GraphCommits implements Iterable<RevCommit> {
 	 * @return the commits' collection which are used by the commit-graph
 	 *         writer. Never null.
 	 * @throws IOException
+	 *             if an error occurred
 	 */
 	public static GraphCommits fromWalk(ProgressMonitor pm,
 			@NonNull Set<? extends ObjectId> wants, @NonNull RevWalk walk)
@@ -78,7 +80,7 @@ public static GraphCommits fromWalk(ProgressMonitor pm,
 			commits.add(c);
 		}
 		pm.endTask();
-		return new GraphCommits(commits);
+		return new GraphCommits(commits, walk.getObjectReader());
 	}
 
 	private final List<RevCommit> sortedCommits;
@@ -87,13 +89,17 @@ public static GraphCommits fromWalk(ProgressMonitor pm,
 
 	private final int extraEdgeCnt;
 
+	private final ObjectReader objectReader;
+
 	/**
 	 * Initialize the GraphCommits.
 	 *
 	 * @param commits
 	 *            list of commits with their headers already parsed.
+	 * @param objectReader
+	 *            object reader
 	 */
-	private GraphCommits(List<RevCommit> commits) {
+	private GraphCommits(List<RevCommit> commits, ObjectReader objectReader) {
 		Collections.sort(commits); // sorted by name
 		sortedCommits = commits;
 		commitPosMap = new ObjectIdOwnerMap<>();
@@ -106,6 +112,7 @@ private GraphCommits(List<RevCommit> commits) {
 			commitPosMap.add(new CommitWithPosition(c, i));
 		}
 		this.extraEdgeCnt = cnt;
+		this.objectReader = objectReader;
 	}
 
 	int getOidPosition(RevCommit c) throws MissingObjectException {
@@ -124,7 +131,10 @@ int size() {
 		return sortedCommits.size();
 	}
 
-	/** {@inheritDoc} */
+	ObjectReader getObjectReader() {
+		return objectReader;
+	}
+
 	@Override
 	public Iterator<RevCommit> iterator() {
 		return sortedCommits.iterator();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedEvent.java
index cdfd3e9..68fc296 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedEvent.java
@@ -41,13 +41,11 @@ public DfsPackFile getPackFile() {
 		return pack;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Class<BeforeDfsPackIndexLoadedListener> getListenerType() {
 		return BeforeDfsPackIndexLoadedListener.class;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispatch(BeforeDfsPackIndexLoadedListener listener) {
 		listener.onBeforeDfsPackIndexLoaded(this);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java
index 0a02180..99b9d55 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java
@@ -847,6 +847,7 @@ interface ReadableChannelSupplier {
 		/**
 		 * @return ReadableChannel
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		ReadableChannel get() throws IOException;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java
index 22959e9..d6d3fbf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java
@@ -43,19 +43,16 @@ public DfsPackDescription getPackDescription() {
 		return pack.getPackDescription();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() throws IOException {
 		return getPackDescription().getObjectCount();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getDeltaCount() throws IOException {
 		return getPackDescription().getDeltaCount();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) {
 		return ((DfsObjectRepresentation) rep).pack == pack;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsConfig.java
index 2ee23f8..4f0e4a5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsConfig.java
@@ -22,13 +22,11 @@
  * simply clears the config, and saving does nothing.
  */
 public final class DfsConfig extends StoredConfig {
-	/** {@inheritDoc} */
 	@Override
 	public void load() throws IOException, ConfigInvalidException {
 		clear();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void save() throws IOException {
 		// TODO actually store this configuration.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java
index 92e23b8..8cb94dc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java
@@ -20,6 +20,7 @@
 import static org.eclipse.jgit.internal.storage.pack.PackExt.BITMAP_INDEX;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.COMMIT_GRAPH;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
+import static org.eclipse.jgit.internal.storage.pack.PackExt.OBJECT_SIZE_INDEX;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.REFTABLE;
 import static org.eclipse.jgit.internal.storage.pack.PackWriter.NONE;
@@ -80,6 +81,8 @@ public class DfsGarbageCollector {
 	private ReftableConfig reftableConfig;
 	private boolean convertToReftable = true;
 	private boolean writeCommitGraph;
+
+	private boolean writeBloomFilter;
 	private boolean includeDeletes;
 	private long reftableInitialMinUpdateIndex = 1;
 	private long reftableInitialMaxUpdateIndex = 1;
@@ -298,6 +301,20 @@ public DfsGarbageCollector setWriteCommitGraph(boolean enable) {
 	}
 
 	/**
+	 * Toggle bloom filter generation.
+	 * <p>
+	 * False by default.
+	 *
+	 * @param enable
+	 *            Whether bloom filter generation is enabled
+	 * @return {@code this}
+	 */
+	public DfsGarbageCollector setWriteBloomFilter(boolean enable) {
+		writeBloomFilter = enable;
+		return this;
+	}
+
+	/**
 	 * Create a single new pack file containing all of the live objects.
 	 * <p>
 	 * This method safely decides which packs can be expired after the new pack
@@ -681,6 +698,17 @@ private DfsPackDescription writePack(PackSource source, PackWriter pw,
 			pack.setIndexVersion(pw.getIndexVersion());
 		}
 
+		if (source != UNREACHABLE_GARBAGE && packConfig.getMinBytesForObjSizeIndex() >= 0) {
+			try (DfsOutputStream out = objdb.writeFile(pack,
+					OBJECT_SIZE_INDEX)) {
+				CountingOutputStream cnt = new CountingOutputStream(out);
+				pw.writeObjectSizeIndex(cnt);
+				pack.addFileExt(OBJECT_SIZE_INDEX);
+				pack.setFileSize(OBJECT_SIZE_INDEX, cnt.getCount());
+				pack.setBlockSize(OBJECT_SIZE_INDEX, out.blockSize());
+			}
+		}
+
 		if (pw.prepareBitmapIndex(pm)) {
 			try (DfsOutputStream out = objdb.writeFile(pack, BITMAP_INDEX)) {
 				CountingOutputStream cnt = new CountingOutputStream(out);
@@ -762,7 +790,8 @@ private void writeCommitGraph(DfsPackDescription pack, ProgressMonitor pm)
 				RevWalk pool = new RevWalk(ctx)) {
 			GraphCommits gcs = GraphCommits.fromWalk(pm, allTips, pool);
 			CountingOutputStream cnt = new CountingOutputStream(out);
-			CommitGraphWriter writer = new CommitGraphWriter(gcs);
+			CommitGraphWriter writer = new CommitGraphWriter(gcs,
+					writeBloomFilter);
 			writer.write(pm, cnt);
 			pack.addFileExt(COMMIT_GRAPH);
 			pack.setFileSize(COMMIT_GRAPH, cnt.getCount());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java
index a2fb67f..2f8d964 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java
@@ -11,6 +11,7 @@
 package org.eclipse.jgit.internal.storage.dfs;
 
 import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
+import static org.eclipse.jgit.internal.storage.pack.PackExt.OBJECT_SIZE_INDEX;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK;
 import static org.eclipse.jgit.lib.Constants.OBJ_OFS_DELTA;
 import static org.eclipse.jgit.lib.Constants.OBJ_REF_DELTA;
@@ -42,6 +43,7 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.file.PackIndexWriter;
+import org.eclipse.jgit.internal.storage.file.PackObjectSizeIndexWriter;
 import org.eclipse.jgit.internal.storage.pack.PackExt;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.AnyObjectId;
@@ -52,6 +54,7 @@
 import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ObjectStream;
+import org.eclipse.jgit.storage.pack.PackConfig;
 import org.eclipse.jgit.transport.PackedObjectInfo;
 import org.eclipse.jgit.util.BlockList;
 import org.eclipse.jgit.util.IO;
@@ -106,19 +109,16 @@ void setCompressionLevel(int compression) {
 		this.compression = compression;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public DfsPackParser newPackParser(InputStream in) throws IOException {
 		return new DfsPackParser(db, this, in);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return new Reader();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, byte[] data, int off, int len)
 			throws IOException {
@@ -132,10 +132,9 @@ public ObjectId insert(int type, byte[] data, int off, int len)
 		long offset = beginObject(type, len);
 		packOut.compress.write(data, off, len);
 		packOut.compress.finish();
-		return endObject(id, offset);
+		return endObject(id, offset, len, type);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, long len, InputStream in)
 			throws IOException {
@@ -152,16 +151,17 @@ public ObjectId insert(int type, long len, InputStream in)
 		md.update(Constants.encodeASCII(len));
 		md.update((byte) 0);
 
-		while (0 < len) {
-			int n = in.read(buf, 0, (int) Math.min(buf.length, len));
+		long inLength = len;
+		while (0 < inLength) {
+			int n = in.read(buf, 0, (int) Math.min(buf.length, inLength));
 			if (n <= 0)
 				throw new EOFException();
 			md.update(buf, 0, n);
 			packOut.compress.write(buf, 0, n);
-			len -= n;
+			inLength -= n;
 		}
 		packOut.compress.finish();
-		return endObject(md.toObjectId(), offset);
+		return endObject(md.toObjectId(), offset, len, type);
 	}
 
 	private byte[] insertBuffer(long len) {
@@ -178,7 +178,6 @@ public ObjectId insert(int type, long len, InputStream in)
 		return buf;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (packDsc == null)
@@ -196,6 +195,11 @@ public void flush() throws IOException {
 		sortObjectsById();
 
 		PackIndex index = writePackIndex(packDsc, packHash, objectList);
+		PackConfig pConfig = new PackConfig(db.getRepository().getConfig());
+		if (pConfig.isWriteObjSizeIndex()) {
+			writeObjectSizeIndex(packDsc, objectList,
+					pConfig.getMinBytesForObjSizeIndex());
+		}
 		db.commitPack(Collections.singletonList(packDsc), null);
 		rollback = false;
 
@@ -206,7 +210,6 @@ public void flush() throws IOException {
 		clear();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (packOut != null) {
@@ -244,10 +247,12 @@ private long beginObject(int type, long len) throws IOException {
 		return offset;
 	}
 
-	private ObjectId endObject(ObjectId id, long offset) {
+	private ObjectId endObject(ObjectId id, long offset, long inflatedSize, int type) {
 		PackedObjectInfo obj = new PackedObjectInfo(id);
+		obj.setType(type);
 		obj.setOffset(offset);
 		obj.setCRC((int) packOut.crc32.getValue());
+		obj.setFullSize(inflatedSize);
 		objectList.add(obj);
 		objectMap.addIfAbsent(obj);
 		return id;
@@ -317,6 +322,18 @@ private static void index(OutputStream out, byte[] packHash,
 		PackIndexWriter.createVersion(out, INDEX_VERSION).write(list, packHash);
 	}
 
+	void writeObjectSizeIndex(DfsPackDescription pack,
+			List<PackedObjectInfo> packedObjs, int minSize) throws IOException {
+		try (DfsOutputStream os = db.writeFile(pack, PackExt.OBJECT_SIZE_INDEX);
+				CountingOutputStream cnt = new CountingOutputStream(os)) {
+			PackObjectSizeIndexWriter.createWriter(os, minSize)
+					.write(packedObjs);
+			pack.addFileExt(OBJECT_SIZE_INDEX);
+			pack.setBlockSize(OBJECT_SIZE_INDEX, os.blockSize());
+			pack.setFileSize(OBJECT_SIZE_INDEX, cnt.getCount());
+		}
+	}
+
 	private class PackStream extends OutputStream {
 		private final DfsOutputStream out;
 		private final MessageDigest md;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java
index 46ec87d..faeafce 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java
@@ -241,13 +241,11 @@ public void setPackComparator(Comparator<DfsPackDescription> packComparator) {
 		this.packComparator = packComparator;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public DfsReader newReader() {
 		return new DfsReader(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectInserter newInserter() {
 		return new DfsInserter(this);
@@ -657,7 +655,6 @@ protected void clearCache() {
 		packList.set(NO_PACKS);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		packList.set(NO_PACKS);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectRepresentation.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectRepresentation.java
index 8e124e3..885582f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectRepresentation.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectRepresentation.java
@@ -24,25 +24,21 @@ class DfsObjectRepresentation extends StoredObjectRepresentation {
 		this.pack = pack;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getFormat() {
 		return format;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getWeight() {
 		return (int) Math.min(length, Integer.MAX_VALUE);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getDeltaBase() {
 		return baseId;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean wasDeltaAttempted() {
 		switch (pack.getPackDescription().getPackSource()) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectToPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectToPack.java
index 10fa236..c2feab8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectToPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjectToPack.java
@@ -39,14 +39,12 @@ final void setFound() {
 		setExtendedFlag(FLAG_FOUND);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void clearReuseAsIs() {
 		super.clearReuseAsIs();
 		pack = null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void select(StoredObjectRepresentation ref) {
 		DfsObjectRepresentation ptr = (DfsObjectRepresentation) ref;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsOutputStream.java
index 7cf91a4..c74a1e1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsOutputStream.java
@@ -39,13 +39,11 @@ public int blockSize() {
 		return 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		write(new byte[] { (byte) b });
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract void write(byte[] buf, int off, int len) throws IOException;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java
index 4f418ab..f012b8b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java
@@ -512,13 +512,11 @@ public DfsPackDescription setIndexVersion(int version) {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return packName.hashCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object b) {
 		if (b instanceof DfsPackDescription) {
@@ -539,7 +537,6 @@ static boolean isGC(PackSource s) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return getFileName(PackExt.PACK);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
index c745b8e..1f54795 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
@@ -16,6 +16,7 @@
 import static org.eclipse.jgit.internal.storage.pack.PackExt.BITMAP_INDEX;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.COMMIT_GRAPH;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
+import static org.eclipse.jgit.internal.storage.pack.PackExt.OBJECT_SIZE_INDEX;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.REVERSE_INDEX;
 
@@ -42,7 +43,10 @@
 import org.eclipse.jgit.internal.storage.commitgraph.CommitGraphLoader;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndex;
 import org.eclipse.jgit.internal.storage.file.PackIndex;
+import org.eclipse.jgit.internal.storage.file.PackObjectSizeIndex;
+import org.eclipse.jgit.internal.storage.file.PackObjectSizeIndexLoader;
 import org.eclipse.jgit.internal.storage.file.PackReverseIndex;
+import org.eclipse.jgit.internal.storage.file.PackReverseIndexFactory;
 import org.eclipse.jgit.internal.storage.pack.BinaryDelta;
 import org.eclipse.jgit.internal.storage.pack.PackOutputStream;
 import org.eclipse.jgit.internal.storage.pack.StoredObjectRepresentation;
@@ -75,6 +79,11 @@ public final class DfsPackFile extends BlockBasedFile {
 	/** Index of compressed commit graph mapping entire object graph. */
 	private volatile CommitGraph commitGraph;
 
+	/** Index by size */
+	private boolean objectSizeIndexLoadAttempted;
+
+	private volatile PackObjectSizeIndex objectSizeIndex;
+
 	/**
 	 * Objects we have tried to read, and discovered to be corrupt.
 	 * <p>
@@ -258,7 +267,17 @@ public CommitGraph getCommitGraph(DfsReader ctx) throws IOException {
 		return commitGraph;
 	}
 
-	PackReverseIndex getReverseIdx(DfsReader ctx) throws IOException {
+	/**
+	 * Get the PackReverseIndex for this PackFile.
+	 *
+	 * @param ctx
+	 *            reader context to support reading from the backing store if
+	 *            the index is not already loaded in memory
+	 * @return the PackReverseIndex
+	 * @throws java.io.IOException
+	 *             the pack index is not available, or is corrupt
+	 */
+	public PackReverseIndex getReverseIdx(DfsReader ctx) throws IOException {
 		if (reverseIndex != null) {
 			return reverseIndex;
 		}
@@ -281,6 +300,39 @@ PackReverseIndex getReverseIdx(DfsReader ctx) throws IOException {
 		return reverseIndex;
 	}
 
+	private PackObjectSizeIndex getObjectSizeIndex(DfsReader ctx)
+			throws IOException {
+		if (objectSizeIndex != null) {
+			return objectSizeIndex;
+		}
+
+		if (objectSizeIndexLoadAttempted) {
+			// Pack doesn't have object size index
+			return null;
+		}
+
+		DfsStreamKey objSizeKey = desc.getStreamKey(OBJECT_SIZE_INDEX);
+		AtomicBoolean cacheHit = new AtomicBoolean(true);
+		try {
+			DfsBlockCache.Ref<PackObjectSizeIndex> sizeIdxRef = cache
+					.getOrLoadRef(objSizeKey, REF_POSITION, () -> {
+						cacheHit.set(false);
+						return loadObjectSizeIndex(ctx, objSizeKey);
+					});
+			if (cacheHit.get()) {
+				ctx.stats.objectSizeIndexCacheHit++;
+			}
+			PackObjectSizeIndex sizeIdx = sizeIdxRef.get();
+			if (sizeIdx != null) {
+				objectSizeIndex = sizeIdx;
+			}
+		} finally {
+			objectSizeIndexLoadAttempted = true;
+		}
+
+		return objectSizeIndex;
+	}
+
 	/**
 	 * Check if an object is stored within this pack.
 	 *
@@ -957,6 +1009,81 @@ long getObjectSize(DfsReader ctx, long pos)
 		}
 	}
 
+	/**
+	 * Return if this packfile has an object size index attached.
+	 *
+	 * This loads the index if it is not already in memory.
+	 *
+	 * @param ctx
+	 *            reader context to support reading from the backing store if
+	 *            the object size index is not already loaded in memory.
+	 * @return true if the packfile has an object size index.
+	 * @throws IOException
+	 *             a problem accessing storage while looking for the index
+	 */
+	boolean hasObjectSizeIndex(DfsReader ctx) throws IOException {
+			return getObjectSizeIndex(ctx) != null;
+	}
+
+	/**
+	 * Return minimum size for an object to be included in the object size
+	 * index.
+	 *
+	 * Caller must make sure the pack has an object size index with
+	 * {@link #hasObjectSizeIndex} before calling this method.
+	 *
+	 * @param ctx
+	 *            reader context to support reading from the backing store if
+	 *            the object size index is not already loaded in memory.
+	 * @return minimum size for indexing in bytes
+	 * @throws IOException
+	 *             no object size index or a problem loading it.
+	 */
+	int getObjectSizeIndexThreshold(DfsReader ctx) throws IOException {
+		PackObjectSizeIndex index = getObjectSizeIndex(ctx);
+		if (index == null) {
+			throw new IOException("Asking threshold of non-existing obj-size"); //$NON-NLS-1$
+		}
+		return index.getThreshold();
+	}
+
+	/**
+	 * Return the size of the object from the object-size index. The object
+	 * should be a blob. Any other type is not indexed and returns -1.
+	 *
+	 * Caller MUST be sure that the object is in the pack (e.g. with
+	 * {@link #hasObject(DfsReader, AnyObjectId)}) and the pack has object size
+	 * index (e.g. with {@link #hasObjectSizeIndex(DfsReader)}) before asking
+	 * the indexed size.
+	 *
+	 * @param ctx
+	 *            reader context to support reading from the backing store if
+	 *            the object size index is not already loaded in memory.
+	 * @param id
+	 *            object id of an object in the pack
+	 * @return size of the object from the index. Negative if object is not in
+	 *         the index (below threshold or not a blob)
+	 * @throws IOException
+	 *             could not read the object size index. IO problem or the pack
+	 *             doesn't have it.
+	 */
+	long getIndexedObjectSize(DfsReader ctx, AnyObjectId id)
+			throws IOException {
+		int idxPosition = idx(ctx).findPosition(id);
+		if (idxPosition < 0) {
+			throw new IllegalArgumentException(
+					"Cannot get size from index since object is not in pack"); //$NON-NLS-1$
+		}
+
+		PackObjectSizeIndex sizeIdx = getObjectSizeIndex(ctx);
+		if (sizeIdx == null) {
+			throw new IllegalStateException(
+					"Asking indexed size from a pack without object size index"); //$NON-NLS-1$
+		}
+
+		return sizeIdx.getSize(idxPosition);
+	}
+
 	void representation(DfsObjectRepresentation r, final long pos,
 			DfsReader ctx, PackReverseIndex rev)
 			throws IOException {
@@ -1068,7 +1195,7 @@ private DfsBlockCache.Ref<PackReverseIndex> loadReverseIdx(
 			DfsReader ctx, DfsStreamKey revKey, PackIndex idx) {
 		ctx.stats.readReverseIdx++;
 		long start = System.nanoTime();
-		PackReverseIndex revidx = new PackReverseIndex(idx);
+		PackReverseIndex revidx = PackReverseIndexFactory.computeFromIndex(idx);
 		reverseIndex = revidx;
 		ctx.stats.readReverseIdxMicros += elapsedMicros(start);
 		return new DfsBlockCache.Ref<>(
@@ -1078,6 +1205,39 @@ private DfsBlockCache.Ref<PackReverseIndex> loadReverseIdx(
 				revidx);
 	}
 
+	private DfsBlockCache.Ref<PackObjectSizeIndex> loadObjectSizeIndex(
+			DfsReader ctx, DfsStreamKey objectSizeIndexKey) throws IOException {
+		ctx.stats.readObjectSizeIndex++;
+		long start = System.nanoTime();
+		long size = 0;
+		Exception parsingError = null;
+		try (ReadableChannel rc = ctx.db.openFile(desc, OBJECT_SIZE_INDEX)) {
+			try {
+				objectSizeIndex = PackObjectSizeIndexLoader
+						.load(Channels.newInputStream(rc));
+				size = rc.position();
+			} catch (IOException e) {
+				parsingError = e;
+			}
+		} catch (IOException e) {
+			// No object size index in this pack
+			return new DfsBlockCache.Ref<>(objectSizeIndexKey, REF_POSITION, 0,
+					null);
+		}
+
+		if (parsingError != null) {
+			throw new IOException(
+					MessageFormat.format(DfsText.get().shortReadOfIndex,
+							desc.getFileName(OBJECT_SIZE_INDEX)),
+					parsingError);
+		}
+
+		ctx.stats.readObjectSizeIndexBytes += size;
+		ctx.stats.readObjectSizeIndexMicros += elapsedMicros(start);
+		return new DfsBlockCache.Ref<>(objectSizeIndexKey, REF_POSITION, size,
+				objectSizeIndex);
+	}
+
 	private DfsBlockCache.Ref<PackBitmapIndex> loadBitmapIndex(DfsReader ctx,
 			DfsStreamKey bitmapKey) throws IOException {
 		ctx.stats.readBitmap++;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java
index d8e191c..8c7b0ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java
@@ -26,6 +26,7 @@
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.storage.pack.PackConfig;
 import org.eclipse.jgit.transport.PackLock;
 import org.eclipse.jgit.transport.PackParser;
 import org.eclipse.jgit.transport.PackedObjectInfo;
@@ -101,7 +102,6 @@ protected DfsPackParser(DfsObjDatabase db, DfsInserter ins, InputStream in) {
 		this.packDigest = Constants.newMessageDigest();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
 			throws IOException {
@@ -123,6 +123,11 @@ public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
 			packDsc.setBlockSize(PACK, blockSize);
 
 			writePackIndex();
+			PackConfig pConfig = new PackConfig(objdb.getRepository().getConfig());
+			if (pConfig.isWriteObjSizeIndex()) {
+				objins.writeObjectSizeIndex(packDsc, getSortedObjectList(null),
+						pConfig.getMinBytesForObjSizeIndex());
+			}
 			objdb.commitPack(Collections.singletonList(packDsc), null);
 			rollback = false;
 
@@ -172,7 +177,6 @@ public DfsPackDescription getPackDescription() {
 		return packDsc;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onPackHeader(long objectCount) throws IOException {
 		if (objectCount == 0) {
@@ -194,34 +198,29 @@ else if (size < blockCache.getBlockSize())
 		currBuf = new byte[blockSize];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginWholeObject(long streamPosition, int type,
 			long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndWholeObject(PackedObjectInfo info) throws IOException {
 		info.setCRC((int) crc.getValue());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginOfsDelta(long streamPosition,
 			long baseStreamPosition, long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginRefDelta(long streamPosition, AnyObjectId baseId,
 			long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected UnresolvedDelta onEndDelta() throws IOException {
 		UnresolvedDelta delta = new UnresolvedDelta();
@@ -229,28 +228,24 @@ protected UnresolvedDelta onEndDelta() throws IOException {
 		return delta;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onInflatedObjectData(PackedObjectInfo obj, int typeCode,
 			byte[] data) throws IOException {
 		// DfsPackParser ignores this event.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onObjectHeader(Source src, byte[] raw, int pos, int len)
 			throws IOException {
 		crc.update(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onObjectData(Source src, byte[] raw, int pos, int len)
 			throws IOException {
 		crc.update(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onStoreStream(byte[] raw, int pos, int len)
 			throws IOException {
@@ -297,7 +292,6 @@ private DfsBlock flushBlock() throws IOException {
 		return v;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onPackFooter(byte[] hash) throws IOException {
 		// The base class will validate the original hash matches
@@ -307,7 +301,6 @@ protected void onPackFooter(byte[] hash) throws IOException {
 		packHash = hash;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 			ObjectTypeAndSize info) throws IOException {
@@ -316,7 +309,6 @@ protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 		return readObjectHeader(info);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 			ObjectTypeAndSize info) throws IOException {
@@ -325,7 +317,6 @@ protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 		return readObjectHeader(info);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int readDatabase(byte[] dst, int pos, int cnt) throws IOException {
 		if (cnt == 0)
@@ -381,13 +372,11 @@ private long toBlockStart(long pos) {
 		return (pos / blockSize) * blockSize;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean checkCRC(int oldCRC) {
 		return oldCRC == (int) crc.getValue();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean onAppendBase(final int typeCode, final byte[] data,
 			final PackedObjectInfo info) throws IOException {
@@ -427,7 +416,6 @@ protected boolean onAppendBase(final int typeCode, final byte[] data,
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndThinPack() throws IOException {
 		// Normally when a thin pack is closed the pack header gets
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedEvent.java
index 750c118..f4e863d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedEvent.java
@@ -18,13 +18,11 @@
  */
 public class DfsPacksChangedEvent
 		extends RepositoryEvent<DfsPacksChangedListener> {
-	/** {@inheritDoc} */
 	@Override
 	public Class<DfsPacksChangedListener> getListenerType() {
 		return DfsPacksChangedListener.class;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispatch(DfsPacksChangedListener listener) {
 		listener.onPacksChanged(this);
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 8d8a766..d98ec58 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
@@ -49,6 +49,7 @@
 import org.eclipse.jgit.lib.AsyncObjectSizeQueue;
 import org.eclipse.jgit.lib.BitmapIndex;
 import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
+import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.InflaterCache;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
@@ -100,19 +101,16 @@ DeltaBaseCache getDeltaBaseCache() {
 		return baseCache;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return db.newReader();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setAvoidUnreachableObjects(boolean avoid) {
 		avoidUnreachable = avoid;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public BitmapIndex getBitmapIndex() throws IOException {
 		for (DfsPackFile pack : db.getPacks()) {
@@ -123,7 +121,6 @@ public BitmapIndex getBitmapIndex() throws IOException {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Optional<CommitGraph> getCommitGraph() throws IOException {
 		for (DfsPackFile pack : db.getPacks()) {
@@ -135,7 +132,6 @@ public Optional<CommitGraph> getCommitGraph() throws IOException {
 		return Optional.empty();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<CachedPack> getCachedPacksAndUpdate(
 		BitmapBuilder needBitmap) throws IOException {
@@ -148,7 +144,6 @@ public Collection<CachedPack> getCachedPacksAndUpdate(
 		return Collections.emptyList();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<ObjectId> resolve(AbbreviatedObjectId id)
 			throws IOException {
@@ -177,7 +172,6 @@ private void resolveImpl(PackList packList, AbbreviatedObjectId id,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean has(AnyObjectId objectId) throws IOException {
 		if (last != null
@@ -207,7 +201,6 @@ private boolean hasImpl(PackList packList, AnyObjectId objectId)
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectLoader open(AnyObjectId objectId, int typeHint)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -262,7 +255,6 @@ private ObjectLoader openImpl(PackList packList, AnyObjectId objectId)
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<ObjectId> getShallowCommits() {
 		return Collections.emptySet();
@@ -370,7 +362,6 @@ private boolean skipGarbagePack(DfsPackFile pack) {
 		return avoidUnreachable && pack.isGarbage();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public <T extends ObjectId> AsyncObjectLoaderQueue<T> open(
 			Iterable<T> objectIds, final boolean reportMissing) {
@@ -430,7 +421,6 @@ public void release() {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public <T extends ObjectId> AsyncObjectSizeQueue<T> getObjectSize(
 			Iterable<T> objectIds, final boolean reportMissing) {
@@ -492,7 +482,6 @@ public void release() {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getObjectSize(AnyObjectId objectId, int typeHint)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -523,6 +512,59 @@ public long getObjectSize(AnyObjectId objectId, int typeHint)
 		throw new MissingObjectException(objectId.copy(), typeHint);
 	}
 
+
+	@Override
+	public boolean isNotLargerThan(AnyObjectId objectId, int typeHint,
+			long limit) throws MissingObjectException,
+			IncorrectObjectTypeException, IOException {
+		DfsPackFile pack = findPackWithObject(objectId);
+		if (pack == null) {
+			if (typeHint == OBJ_ANY) {
+				throw new MissingObjectException(objectId.copy(),
+						JGitText.get().unknownObjectType2);
+			}
+			throw new MissingObjectException(objectId.copy(), typeHint);
+		}
+
+		stats.isNotLargerThanCallCount += 1;
+		if (typeHint != Constants.OBJ_BLOB || !pack.hasObjectSizeIndex(this)) {
+			return pack.getObjectSize(this, objectId) <= limit;
+		}
+
+		long sz = pack.getIndexedObjectSize(this, objectId);
+		if (sz < 0) {
+			stats.objectSizeIndexMiss += 1;
+		} else {
+			stats.objectSizeIndexHit += 1;
+		}
+
+		// Got size from index or we didn't but we are sure it should be there.
+		if (sz >= 0 || pack.getObjectSizeIndexThreshold(this) <= limit) {
+			return sz <= limit;
+		}
+
+		return pack.getObjectSize(this, objectId) <= limit;
+	}
+
+	private DfsPackFile findPackWithObject(AnyObjectId objectId)
+			throws IOException {
+		if (last != null && !skipGarbagePack(last)
+				&& last.hasObject(this, objectId)) {
+			return last;
+		}
+		PackList packList = db.getPackList();
+		// hasImpl doesn't check "last", but leaves "last" pointing to the pack
+		// with the object
+		if (hasImpl(packList, objectId)) {
+			return last;
+		} else if (packList.dirty()) {
+			if (hasImpl(db.getPackList(), objectId)) {
+				return last;
+			}
+		}
+		return null;
+	}
+
 	private long getObjectSizeImpl(PackList packList, AnyObjectId objectId)
 			throws IOException {
 		for (DfsPackFile pack : packList.packs) {
@@ -538,7 +580,6 @@ private long getObjectSizeImpl(PackList packList, AnyObjectId objectId)
 		return -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public DfsObjectToPack newObjectToPack(AnyObjectId objectId, int type) {
 		return new DfsObjectToPack(objectId, type);
@@ -642,7 +683,6 @@ private List<DfsObjectToPack> findAllFromPack(DfsPackFile pack,
 		return tmp;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
 			boolean validate) throws IOException,
@@ -651,7 +691,6 @@ public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
 		src.pack.copyAsIs(out, src, validate, this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeObjects(PackOutputStream out, List<ObjectToPack> list)
 			throws IOException {
@@ -659,7 +698,6 @@ public void writeObjects(PackOutputStream out, List<ObjectToPack> list)
 			out.writeObject(otp);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void copyPackAsIs(PackOutputStream out, CachedPack pack)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderIoStats.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderIoStats.java
index 5ac7985..adb4673 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderIoStats.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderIoStats.java
@@ -10,12 +10,15 @@
 
 package org.eclipse.jgit.internal.storage.dfs;
 
+import org.eclipse.jgit.lib.AnyObjectId;
+
 /**
  * IO statistics for a {@link org.eclipse.jgit.internal.storage.dfs.DfsReader}.
  */
 public class DfsReaderIoStats {
 	/** POJO to accumulate IO statistics. */
 	public static class Accumulator {
+
 		/** Number of times the reader explicitly called scanPacks. */
 		long scanPacks;
 
@@ -31,6 +34,9 @@ public static class Accumulator {
 		/** Total number of cache hits for commit graphs. */
 		long commitGraphCacheHit;
 
+		/** Total number of cache hits for object size indexes. */
+		long objectSizeIndexCacheHit;
+
 		/** Total number of complete pack indexes read into memory. */
 		long readIdx;
 
@@ -43,12 +49,18 @@ public static class Accumulator {
 		/** Total number of complete commit graphs read into memory. */
 		long readCommitGraph;
 
+		/** Total number of object size indexes added into memory. */
+		long readObjectSizeIndex;
+
 		/** Total number of bytes read from pack indexes. */
 		long readIdxBytes;
 
 		/** Total number of bytes read from commit graphs. */
 		long readCommitGraphBytes;
 
+		/** Total numer of bytes read from object size index */
+		long readObjectSizeIndexBytes;
+
 		/** Total microseconds spent reading pack indexes. */
 		long readIdxMicros;
 
@@ -58,6 +70,9 @@ public static class Accumulator {
 		/** Total microseconds spent creating commit graphs. */
 		long readCommitGraphMicros;
 
+		/** Total microseconds spent creating object size indexes */
+		long readObjectSizeIndexMicros;
+
 		/** Total number of bytes read from bitmap indexes. */
 		long readBitmapIdxBytes;
 
@@ -88,6 +103,15 @@ public static class Accumulator {
 		/** Total microseconds spent inflating compressed bytes. */
 		long inflationMicros;
 
+		/** Count of queries for the size of an object via #isNotLargerThan */
+		long isNotLargerThanCallCount;
+
+		/** Object was below threshold in the object size index */
+		long objectSizeIndexMiss;
+
+		/** Object size found in the object size index */
+		long objectSizeIndexHit;
+
 		Accumulator() {
 		}
 	}
@@ -144,6 +168,15 @@ public long getCommitGraphCacheHits() {
 	}
 
 	/**
+	 * Get total number of object size index cache hits.
+	 *
+	 * @return total number of object size index cache hits.
+	 */
+	public long getObjectSizeIndexCacheHits() {
+		return stats.objectSizeIndexCacheHit;
+	}
+
+	/**
 	 * Get total number of complete pack indexes read into memory.
 	 *
 	 * @return total number of complete pack indexes read into memory.
@@ -180,6 +213,15 @@ public long getReadBitmapIndexCount() {
 	}
 
 	/**
+	 * Get total number of complete object size indexes read into memory.
+	 *
+	 * @return total number of complete object size indexes read into memory.
+	 */
+	public long getReadObjectSizeIndexCount() {
+		return stats.readObjectSizeIndex;
+	}
+
+	/**
 	 * Get total number of bytes read from pack indexes.
 	 *
 	 * @return total number of bytes read from pack indexes.
@@ -297,4 +339,41 @@ public long getInflatedBytes() {
 	public long getInflationMicros() {
 		return stats.inflationMicros;
 	}
+
+	/**
+	 * Get count of invocations to
+	 * {@link DfsReader#isNotLargerThan(AnyObjectId, int, long)}
+	 * <p>
+	 * Each call could use the object-size index or not.
+	 *
+	 * @return how many times the size of an object was checked with
+	 *         {@link DfsReader#isNotLargerThan(AnyObjectId, int, long)}
+	 */
+	public long getIsNotLargerThanCallCount() {
+		return stats.isNotLargerThanCallCount;
+	}
+
+	/**
+	 * Get number of times the size of a blob was found in the object size
+	 * index.
+	 * <p>
+	 * This counts only queries for blobs on packs with object size index.
+	 *
+	 * @return count of object size index hits
+	 */
+	public long getObjectSizeIndexHits() {
+		return stats.objectSizeIndexHit;
+	}
+
+	/**
+	 * Get number of times the size of an object was not found in the object
+	 * size index. This usually means it was below the threshold.
+	 * <p>
+	 * This counts only queries for blobs on packs with object size index.
+	 *
+	 * @return count of object size index misses.
+	 */
+	public long getObjectSizeIndexMisses() {
+		return stats.objectSizeIndexMiss;
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefDatabase.java
index ae65670..b524562 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefDatabase.java
@@ -65,7 +65,6 @@ boolean exists() throws IOException {
 		return 0 < read().size();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		RefCache curr = read();
@@ -73,13 +72,11 @@ public Ref exactRef(String name) throws IOException {
 		return ref != null ? resolve(ref, 0, curr.ids) : null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getAdditionalRefs() {
 		return Collections.emptyList();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		RefCache curr = read();
@@ -126,7 +123,6 @@ private Ref resolve(Ref ref, int depth, RefList<Ref> loose)
 		return new SymbolicRef(ref.getName(), dst);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref peel(Ref ref) throws IOException {
 		final Ref oldLeaf = ref.getLeaf();
@@ -176,7 +172,6 @@ static Ref recreate(Ref old, Ref leaf, boolean hasVersioning) {
 		return leaf;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefUpdate newUpdate(String refName, boolean detach)
 			throws IOException {
@@ -193,7 +188,6 @@ public RefUpdate newUpdate(String refName, boolean detach)
 		return update;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefRename newRename(String fromName, String toName)
 			throws IOException {
@@ -202,7 +196,6 @@ public RefRename newRename(String fromName, String toName)
 		return new DfsRefRename(src, dst);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isNameConflicting(String refName) throws IOException {
 		RefList<Ref> all = read().ids;
@@ -224,19 +217,16 @@ public boolean isNameConflicting(String refName) throws IOException {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void create() {
 		// Nothing to do.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void refresh() {
 		clearCache();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		clearCache();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefRename.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefRename.java
index 5698035..e76b0bc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefRename.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefRename.java
@@ -22,7 +22,6 @@ final class DfsRefRename extends RefRename {
 		super(src, dst);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doRename() throws IOException {
 		// TODO Correctly handle renaming foo/bar to foo.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefUpdate.java
index 28331a0..f327034 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRefUpdate.java
@@ -33,19 +33,16 @@ final class DfsRefUpdate extends RefUpdate {
 		this.refdb = refdb;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected DfsRefDatabase getRefDatabase() {
 		return refdb;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected DfsRepository getRepository() {
 		return refdb.getRepository();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean tryLock(boolean deref) throws IOException {
 		dstRef = getRef();
@@ -60,13 +57,11 @@ protected boolean tryLock(boolean deref) throws IOException {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void unlock() {
 		// No state is held while "locked".
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Result update(RevWalk walk) throws IOException {
 		try {
@@ -77,7 +72,6 @@ public Result update(RevWalk walk) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doUpdate(Result desiredResult) throws IOException {
 		ObjectIdRef newRef;
@@ -102,7 +96,6 @@ protected Result doUpdate(Result desiredResult) throws IOException {
 		return Result.LOCK_FAILURE;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doDelete(Result desiredResult) throws IOException {
 		if (getRefDatabase().compareAndRemove(dstRef)) {
@@ -112,7 +105,6 @@ protected Result doDelete(Result desiredResult) throws IOException {
 		return Result.LOCK_FAILURE;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doLink(String target) throws IOException {
 		final SymbolicRef newRef = new SymbolicRef(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
index 6c3b056..3ba74b2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
@@ -75,19 +75,16 @@ public MergedReftable openMergedReftable() throws IOException {
 		stack = null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasVersioning() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean performsAtomicTransactions() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public BatchRefUpdate newBatchUpdate() {
 		DfsObjDatabase odb = getRepository().getObjectDatabase();
@@ -151,13 +148,11 @@ public boolean isNameConflicting(String refName) throws IOException {
 		return reftableDatabase.isNameConflicting(refName, new TreeSet<>(), new HashSet<>());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		return reftableDatabase.exactRef(name);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		List<Ref> refs = reftableDatabase.getRefsByPrefix(prefix);
@@ -169,21 +164,18 @@ public Map<String, Ref> getRefs(String prefix) throws IOException {
 			RefList.emptyList());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getRefsByPrefix(String prefix) throws IOException {
 
 		return reftableDatabase.getRefsByPrefix(prefix);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getRefsByPrefixWithExclusions(String include, Set<String> excludes)
 			throws IOException {
 		return reftableDatabase.getRefsByPrefixWithExclusions(include, excludes);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<Ref> getTipsWithSha1(ObjectId id) throws IOException {
 		if (!getReftableConfig().isIndexObjects()) {
@@ -192,13 +184,11 @@ public Set<Ref> getTipsWithSha1(ObjectId id) throws IOException {
 		return reftableDatabase.getTipsWithSha1(id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasFastTipsWithSha1() throws IOException {
 		return reftableDatabase.hasFastTipsWithSha1();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref peel(Ref ref) throws IOException {
 		Ref oldLeaf = ref.getLeaf();
@@ -233,7 +223,6 @@ void clearCache() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean compareAndPut(Ref oldRef, @Nullable Ref newRef)
 			throws IOException {
@@ -254,13 +243,11 @@ protected boolean compareAndPut(Ref oldRef, @Nullable Ref newRef)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean compareAndRemove(Ref oldRef) throws IOException {
 		return compareAndPut(oldRef, null);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected RefCache scanAllRefs() throws IOException {
 		throw new UnsupportedOperationException();
@@ -276,7 +263,6 @@ void removed(String refName) {
 		// Unnecessary; DfsReftableBatchRefUpdate calls clearCache().
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void cachePeeledState(Ref oldLeaf, Ref newLeaf) {
 		// Do not cache peeled state in reftable.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableStack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableStack.java
index 27b0329..97ba4d5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableStack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableStack.java
@@ -80,7 +80,6 @@ public List<ReftableReader> readers() {
 		return Collections.unmodifiableList(tables);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		for (ReftableReader t : tables) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepository.java
index 32c0ccd..218f1e9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepository.java
@@ -45,7 +45,6 @@ protected DfsRepository(DfsRepositoryBuilder builder) {
 		this.description = builder.getRepositoryDescription();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract DfsObjDatabase getObjectDatabase();
 
@@ -72,7 +71,6 @@ public boolean exists() throws IOException {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void create(boolean bare) throws IOException {
 		if (exists())
@@ -85,39 +83,33 @@ public void create(boolean bare) throws IOException {
 			throw new IOException(result.name());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public StoredConfig getConfig() {
 		return config;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getIdentifier() {
 		return getDescription().getRepositoryName();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void scanForRepoChanges() throws IOException {
 		getRefDatabase().refresh();
 		getObjectDatabase().clearCache();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void notifyIndexChanged(boolean internal) {
 		// Do not send notifications.
 		// There is no index, as there is no working tree.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReflogReader getReflogReader(String refName) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public AttributesNodeProvider createAttributesNodeProvider() {
 		// TODO Check if the implementation used in FileRepository can be used
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryBuilder.java
index 943d926..ab5f7fe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryBuilder.java
@@ -72,7 +72,6 @@ public B setRepositoryDescription(DfsRepositoryDescription desc) {
 		return self();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public B setup() throws IllegalArgumentException, IOException {
 		super.setup();
@@ -97,7 +96,6 @@ public B setup() throws IllegalArgumentException, IOException {
 
 	// We don't support local file IO and thus shouldn't permit these to set.
 
-	/** {@inheritDoc} */
 	@Override
 	public B setGitDir(File gitDir) {
 		if (gitDir != null)
@@ -105,7 +103,6 @@ public B setGitDir(File gitDir) {
 		return self();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public B setObjectDirectory(File objectDirectory) {
 		if (objectDirectory != null)
@@ -113,14 +110,12 @@ public B setObjectDirectory(File objectDirectory) {
 		return self();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public B addAlternateObjectDirectory(File other) {
 		throw new UnsupportedOperationException(
 				JGitText.get().unsupportedAlternates);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public B setWorkTree(File workTree) {
 		if (workTree != null)
@@ -128,7 +123,6 @@ public B setWorkTree(File workTree) {
 		return self();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public B setIndexFile(File indexFile) {
 		if (indexFile != null)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryDescription.java
index 069956b..e949085 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryDescription.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepositoryDescription.java
@@ -42,7 +42,6 @@ public String getRepositoryName() {
 		return repositoryName;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		if (getRepositoryName() != null)
@@ -50,7 +49,6 @@ public int hashCode() {
 		return System.identityHashCode(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object b) {
 		if (b instanceof DfsRepositoryDescription){
@@ -61,7 +59,6 @@ public boolean equals(Object b) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java
index f3f3091..8983c2d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java
@@ -56,17 +56,14 @@ protected DfsStreamKey(int hash, @Nullable PackExt ext) {
 		this.packExtPos = ext == null ? 0 : ext.getPosition();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return hash;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract boolean equals(Object o);
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("boxing")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java
index 583b8b3..734a5fc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java
@@ -78,13 +78,11 @@ protected MemRefDatabase createRefDatabase() {
 		return new MemRefDatabase();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public MemObjDatabase getObjectDatabase() {
 		return objdb;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefDatabase getRefDatabase() {
 		return refdb;
@@ -102,14 +100,12 @@ public void setPerformsAtomicTransactions(boolean atomic) {
 		refdb.performsAtomicTransactions = atomic;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public String getGitwebDescription() {
 		return gitwebDescription;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setGitwebDescription(@Nullable String d) {
 		gitwebDescription = d;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/LargePackedWholeObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/LargePackedWholeObject.java
index cd4f168..89a3afb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/LargePackedWholeObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/LargePackedWholeObject.java
@@ -44,31 +44,26 @@ final class LargePackedWholeObject extends ObjectLoader {
 		this.db = db;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getType() {
 		return type;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getSize() {
 		return size;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isLarge() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte[] getCachedBytes() throws LargeObjectException {
 		throw new LargeObjectException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectStream openStream() throws MissingObjectException, IOException {
 		PackInputStream packIn;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/PackInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/PackInputStream.java
index 6ff8164..3d07660 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/PackInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/PackInputStream.java
@@ -31,7 +31,6 @@ final class PackInputStream extends InputStream {
 		ctx.pin(pack, pos);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		int n = ctx.copy(pack, pos, b, off, len);
@@ -39,7 +38,6 @@ public int read(byte[] b, int off, int len) throws IOException {
 		return n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		byte[] buf = new byte[1];
@@ -47,7 +45,6 @@ public int read() throws IOException {
 		return n == 1 ? buf[0] & 0xff : -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		ctx.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
index ec53818..53e3695 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BasePackBitmapIndex.java
@@ -25,7 +25,6 @@ abstract class BasePackBitmapIndex extends PackBitmapIndex {
 		this.bitmaps = bitmaps;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap getBitmap(AnyObjectId objectId) {
 		StoredBitmap sb = bitmaps.get(objectId);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BitmapIndexImpl.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BitmapIndexImpl.java
index 9aa1417..55c05ef 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BitmapIndexImpl.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BitmapIndexImpl.java
@@ -54,7 +54,6 @@ PackBitmapIndex getPackBitmapIndex() {
 		return packIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CompressedBitmap getBitmap(AnyObjectId objectId) {
 		EWAHCompressedBitmap compressed = packIndex.getBitmap(objectId);
@@ -63,7 +62,6 @@ public CompressedBitmap getBitmap(AnyObjectId objectId) {
 		return new CompressedBitmap(compressed, this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CompressedBitmapBuilder newBitmapBuilder() {
 		return new CompressedBitmapBuilder(this);
@@ -291,7 +289,9 @@ public static final class CompressedBitmap implements Bitmap {
 		 * Construct compressed bitmap for given bitmap and bitmap index
 		 *
 		 * @param bitmap
+		 *            the bitmap
 		 * @param bitmapIndex
+		 *            the bitmap index
 		 */
 		public CompressedBitmap(EWAHCompressedBitmap bitmap, BitmapIndexImpl bitmapIndex) {
 			this.bitmap = bitmap;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java
index 1036535..ef1392e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java
@@ -30,7 +30,6 @@ final class ByteArrayWindow extends ByteWindow {
 		array = b;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int copy(int p, byte[] b, int o, int n) {
 		n = Math.min(array.length - p, n);
@@ -38,7 +37,6 @@ protected int copy(int p, byte[] b, int o, int n) {
 		return n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int setInput(int pos, Inflater inf)
 			throws DataFormatException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java
index b687757..4094f13 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java
@@ -32,7 +32,6 @@ final class ByteBufferWindow extends ByteWindow {
 		buffer = b;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int copy(int p, byte[] b, int o, int n) {
 		final ByteBuffer s = buffer.slice();
@@ -57,7 +56,6 @@ void write(PackOutputStream out, long pos, int cnt)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int setInput(int pos, Inflater inf)
 			throws DataFormatException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CachedObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CachedObjectDirectory.java
index 2e19580..129d2e0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CachedObjectDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CachedObjectDirectory.java
@@ -86,13 +86,11 @@ private ObjectIdOwnerMap<UnpackedObjectId> scanLoose() {
 		return m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Don't close anything.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectDatabase newCachedDatabase() {
 		return this;
@@ -153,7 +151,6 @@ void resolve(Set<ObjectId> matches, AbbreviatedObjectId id)
 		wrapped.resolve(matches, id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean has(AnyObjectId objectId) throws IOException {
 		return has(objectId, null);
@@ -261,7 +258,6 @@ Collection<Pack> getPacks() {
 		return wrapped.getPacks();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Optional<CommitGraph> getCommitGraph() {
 		return wrapped.getCommitGraph();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CheckoutEntryImpl.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CheckoutEntryImpl.java
index 2b8779f..d641da5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CheckoutEntryImpl.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/CheckoutEntryImpl.java
@@ -32,13 +32,11 @@ public class CheckoutEntryImpl implements CheckoutEntry {
 		to = comment.substring(p2 + " to ".length(), p3); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getFromBranch() {
 		return from;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getToBranch() {
 		return to;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileCommitGraph.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileCommitGraph.java
index 44429a7..5172963 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileCommitGraph.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileCommitGraph.java
@@ -108,7 +108,8 @@ GraphSnapshot refresh() {
 				// commit-graph file was not modified
 				return this;
 			}
-			return new GraphSnapshot(file, FileSnapshot.save(file), open(file));
+			return new GraphSnapshot(file, FileSnapshot.save(file),
+					open(file));
 		}
 
 		private static CommitGraph open(File file) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java
index aa578d3..e8f532f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java
@@ -33,13 +33,11 @@ enum InsertLooseObjectResult {
 		INSERTED, EXISTS_PACKED, EXISTS_LOOSE, FAILURE;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return new WindowCursor(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectDirectoryInserter newInserter() {
 		return new ObjectDirectoryInserter(this, getConfig());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java
index e9e17c0..3abd71a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java
@@ -93,13 +93,13 @@ ReflogReader getReflogReader(String refname) throws IOException {
 
 	/**
 	 * @param repoDir
+	 *            the repository's metadata directory
 	 * @return whether the given repo uses reftable for refdb storage.
 	 */
 	public static boolean isReftable(File repoDir) {
 		return new File(repoDir, Constants.REFTABLE).isDirectory();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasFastTipsWithSha1() throws IOException {
 		return reftableDatabase.hasFastTipsWithSha1();
@@ -124,20 +124,17 @@ private ReentrantLock getLock() {
 		return reftableDatabase.getLock();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean performsAtomicTransactions() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@NonNull
 	@Override
 	public BatchRefUpdate newBatchUpdate() {
 		return new FileReftableBatchRefUpdate(this, fileRepository);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefUpdate newUpdate(String refName, boolean detach)
 			throws IOException {
@@ -157,19 +154,16 @@ public RefUpdate newUpdate(String refName, boolean detach)
 		return update;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		return reftableDatabase.exactRef(name);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getRefs() throws IOException {
 		return super.getRefs();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		List<Ref> refs = reftableDatabase.getRefsByPrefix(prefix);
@@ -181,20 +175,17 @@ public Map<String, Ref> getRefs(String prefix) throws IOException {
 				RefList.emptyList());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getRefsByPrefixWithExclusions(String include, Set<String> excludes)
 			throws IOException {
 		return reftableDatabase.getRefsByPrefixWithExclusions(include, excludes);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getAdditionalRefs() throws IOException {
 		return Collections.emptyList();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref peel(Ref ref) throws IOException {
 		Ref oldLeaf = ref.getLeaf();
@@ -303,7 +294,6 @@ protected RefUpdate.Result doRename() throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefRename newRename(String fromName, String toName)
 			throws IOException {
@@ -312,20 +302,17 @@ public RefRename newRename(String fromName, String toName)
 		return new FileRefRename(src, dst);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isNameConflicting(String name) throws IOException {
 		return reftableDatabase.isNameConflicting(name, new TreeSet<>(),
 				new HashSet<>());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		reftableStack.close();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void create() throws IOException {
 		FileUtils.mkdir(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java
index 5152367..c74a298 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableStack.java
@@ -264,6 +264,7 @@ public interface Writer {
 		 * @param w
 		 *            writer to use
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		void call(ReftableWriter w) throws IOException;
 	}
@@ -559,6 +560,7 @@ boolean compactRange(int first, int last) throws IOException {
 	 * Calculate an approximate log2.
 	 *
 	 * @param sz
+	 *            the number to compute an approximate log2 for
 	 * @return log2
 	 */
 	static int log(long sz) {
@@ -688,6 +690,7 @@ private static Optional<Segment> autoCompactCandidate(long[] sizes) {
 	 * shape.
 	 *
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void autoCompact() throws IOException {
 		Optional<Segment> cand = autoCompactCandidate(tableSizes());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
index 3e92cdd..e5a00d3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
@@ -321,19 +321,16 @@ public File getObjectsDirectory() {
 		return objectDatabase.getDirectory();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectDirectory getObjectDatabase() {
 		return objectDatabase;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefDatabase getRefDatabase() {
 		return refs;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getIdentifier() {
 		File directory = getDirectory();
@@ -343,7 +340,6 @@ public String getIdentifier() {
 		throw new IllegalStateException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FileBasedConfig getConfig() {
 		try {
@@ -357,7 +353,6 @@ public FileBasedConfig getConfig() {
 		return repoConfig;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public String getGitwebDescription() throws IOException {
@@ -376,7 +371,6 @@ public String getGitwebDescription() throws IOException {
 		return d;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setGitwebDescription(@Nullable String description)
 			throws IOException {
@@ -423,6 +417,7 @@ private File descriptionFile() {
 	 * client trying to push changes avoid pushing more than it needs to.
 	 *
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@Override
 	public Set<ObjectId> getAdditionalHaves() throws IOException {
@@ -478,7 +473,6 @@ public void openPack(File pack) throws IOException {
 		objectDatabase.openPack(pack);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void scanForRepoChanges() throws IOException {
 		getRefDatabase().getRefs(); // This will look for changes to refs
@@ -504,7 +498,6 @@ private void detectIndexChanges() {
 		notifyIndexChanged(false);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void notifyIndexChanged(boolean internal) {
 		synchronized (snapshotLock) {
@@ -513,7 +506,6 @@ public void notifyIndexChanged(boolean internal) {
 		fireEvent(new IndexChangedEvent(internal));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReflogReader getReflogReader(String refName) throws IOException {
 		if (refs instanceof FileReftableDatabase) {
@@ -537,7 +529,6 @@ public ReflogReader getReflogReader(String refName) throws IOException {
 		return new ReflogReaderImpl(this, ref.getName());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public AttributesNodeProvider createAttributesNodeProvider() {
 		return new AttributesNodeProviderImpl(this);
@@ -600,7 +591,6 @@ private boolean shouldAutoDetach() {
 				ConfigConstants.CONFIG_KEY_AUTODETACH, true);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("FutureReturnValueIgnored")
 	@Override
 	public void autoGC(ProgressMonitor monitor) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java
index 6088c15..9a85752 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java
@@ -404,7 +404,6 @@ public boolean equals(FileSnapshot other) {
 				&& Objects.equals(fileKey, other.fileKey);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj) {
@@ -420,7 +419,6 @@ public boolean equals(Object obj) {
 		return equals(other);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return Objects.hash(lastModified, Long.valueOf(size), fileKey);
@@ -474,7 +472,6 @@ public long lastRacyThreshold() {
 		return racyThreshold;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings({ "nls", "ReferenceEquality" })
 	@Override
 	public String toString() {
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 9a4ae71..df18d05 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
@@ -135,6 +135,8 @@ public class GC {
 
 	private static final int DEFAULT_AUTOLIMIT = 6700;
 
+	private static final boolean DEFAULT_WRITE_BLOOM_FILTER = false;
+
 	private static final boolean DEFAULT_WRITE_COMMIT_GRAPH = false;
 
 	private static volatile ExecutorService executor;
@@ -222,9 +224,10 @@ public GC(FileRepository repo) {
 	 * gc.log.
 	 *
 	 * @return the collection of
-	 *         {@link org.eclipse.jgit.internal.storage.file.Pack}'s which
-	 *         are newly created
+	 *         {@link org.eclipse.jgit.internal.storage.file.Pack}'s which are
+	 *         newly created
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws java.text.ParseException
 	 *             If the configuration parameter "gc.pruneexpire" couldn't be
 	 *             parsed
@@ -298,10 +301,15 @@ private Collection<Pack> doGc() throws IOException, ParseException {
 	 * pack files.
 	 *
 	 * @param inserter
+	 *            used to insert objects
 	 * @param reader
+	 *            used to read objects
 	 * @param pack
+	 *            the pack file to loosen objects for
 	 * @param existing
+	 *            existing objects
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void loosen(ObjectDirectoryInserter inserter, ObjectReader reader, Pack pack, HashSet<ObjectId> existing)
 			throws IOException {
@@ -327,13 +335,17 @@ private void loosen(ObjectDirectoryInserter inserter, ObjectReader reader, Pack
 	 * directory. If an expirationDate is set then pack files which are younger
 	 * than the expirationDate will not be deleted nor preserved.
 	 * <p>
-	 * If we're not immediately expiring loose objects, loosen any objects
-	 * in the old pack files which aren't in the new pack files.
+	 * If we're not immediately expiring loose objects, loosen any objects in
+	 * the old pack files which aren't in the new pack files.
 	 *
 	 * @param oldPacks
+	 *            old pack files
 	 * @param newPacks
+	 *            new pack files
 	 * @throws ParseException
+	 *             if an error occurred during parsing
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void deleteOldPacks(Collection<Pack> oldPacks,
 			Collection<Pack> newPacks) throws ParseException, IOException {
@@ -380,12 +392,15 @@ private void deleteOldPacks(Collection<Pack> oldPacks,
 	}
 
 	/**
-	 * Deletes old pack file, unless 'preserve-oldpacks' is set, in which case it
-	 * moves the pack file to the preserved directory
+	 * Deletes old pack file, unless 'preserve-oldpacks' is set, in which case
+	 * it moves the pack file to the preserved directory
 	 *
 	 * @param packFile
+	 *            the packfile to delete
 	 * @param deleteOptions
+	 *            delete option flags
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void removeOldPack(PackFile packFile, int deleteOptions)
 			throws IOException {
@@ -424,6 +439,7 @@ private void prunePreserved() {
 	 * with a ".pack" file without a ".index" file.
 	 *
 	 * @param packFile
+	 *            the pack file to prune files for
 	 */
 	private void prunePack(PackFile packFile) {
 		try {
@@ -451,6 +467,7 @@ private void prunePack(PackFile packFile) {
 	 * because the filesystem delete operation fails) this is silently ignored.
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void prunePacked() throws IOException {
 		ObjectDirectory objdb = repo.getObjectDatabase();
@@ -509,6 +526,7 @@ public void prunePacked() throws IOException {
 	 * @param objectsToKeep
 	 *            a set of objects which should explicitly not be pruned
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws java.text.ParseException
 	 *             If the configuration parameter "gc.pruneexpire" couldn't be
 	 *             parsed
@@ -716,10 +734,15 @@ private long getPackExpireDate() throws ParseException {
 	 * by the given ObjectWalk
 	 *
 	 * @param id2File
+	 *            mapping objectIds to files
 	 * @param w
+	 *            used to walk objects
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if an object has an unexpected tyoe
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void removeReferenced(Map<ObjectId, File> id2File,
 			ObjectWalk w) throws MissingObjectException,
@@ -760,6 +783,7 @@ private static boolean equals(Ref r1, Ref r2) {
 	 * is compacted into a single table.
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void packRefs() throws IOException {
 		RefDatabase refDb = repo.getRefDatabase();
@@ -814,7 +838,6 @@ public Collection<Pack> repack() throws IOException {
 		Set<ObjectId> allHeads = new HashSet<>();
 		Set<ObjectId> allTags = new HashSet<>();
 		Set<ObjectId> nonHeads = new HashSet<>();
-		Set<ObjectId> txnHeads = new HashSet<>();
 		Set<ObjectId> tagTargets = new HashSet<>();
 		Set<ObjectId> indexObjects = listNonHEADIndexObjects();
 
@@ -878,12 +901,6 @@ public Collection<Pack> repack() throws IOException {
 			if (rest != null)
 				ret.add(rest);
 		}
-		if (!txnHeads.isEmpty()) {
-			Pack txn = writePack(txnHeads, PackWriter.NONE, PackWriter.NONE,
-					PackWriter.NONE, null, excluded, false);
-			if (txn != null)
-				ret.add(txn);
-		}
 		try {
 			deleteOldPacks(toBeDeleted, ret);
 		} catch (ParseException e) {
@@ -929,6 +946,7 @@ private Set<ObjectId> refsToObjectIds(Collection<Ref> refs)
 	 *            the list of wanted objects, writer walks commits starting at
 	 *            these. Must not be {@code null}.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void writeCommitGraph(@NonNull Set<? extends ObjectId> wants)
 			throws IOException {
@@ -945,7 +963,8 @@ void writeCommitGraph(@NonNull Set<? extends ObjectId> wants)
 		File tmpFile = null;
 		try (RevWalk walk = new RevWalk(repo)) {
 			CommitGraphWriter writer = new CommitGraphWriter(
-					GraphCommits.fromWalk(pm, wants, walk));
+					GraphCommits.fromWalk(pm, wants, walk),
+					shouldWriteBloomFilter());
 			tmpFile = File.createTempFile("commit_", //$NON-NLS-1$
 					COMMIT_GRAPH.getTmpExtension(),
 					repo.getObjectDatabase().getInfoDirectory());
@@ -997,7 +1016,7 @@ private void deleteTempCommitGraph() {
 	/**
 	 * If {@code true}, will rewrite the commit-graph file when gc is run.
 	 *
-	 * @return true if commit-graph should be writen. Default is {@code false}.
+	 * @return true if commit-graph should be written. Default is {@code false}.
 	 */
 	boolean shouldWriteCommitGraphWhenGc() {
 		return repo.getConfig().getBoolean(ConfigConstants.CONFIG_GC_SECTION,
@@ -1005,6 +1024,17 @@ boolean shouldWriteCommitGraphWhenGc() {
 				DEFAULT_WRITE_COMMIT_GRAPH);
 	}
 
+	/**
+	 * If {@code true}, generates bloom filter in the commit-graph file.
+	 *
+	 * @return true if bloom filter should be written. Default is {@code false}.
+	 */
+	boolean shouldWriteBloomFilter() {
+		return repo.getConfig().getBoolean(ConfigConstants.CONFIG_GC_SECTION,
+				ConfigConstants.CONFIG_KEY_WRITE_CHANGED_PATHS,
+				DEFAULT_WRITE_BLOOM_FILTER);
+	}
+
 	private static boolean isHead(Ref ref) {
 		return ref.getName().startsWith(Constants.R_HEADS);
 	}
@@ -1145,9 +1175,11 @@ private void deleteTempPacksIdx() {
 	/**
 	 * @param ref
 	 *            the ref which log should be inspected
-	 * @param minTime only reflog entries not older then this time are processed
+	 * @param minTime
+	 *            only reflog entries not older then this time are processed
 	 * @return the {@link ObjectId}s contained in the reflog
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private Set<ObjectId> listRefLogObjects(Ref ref, long minTime) throws IOException {
 		ReflogReader reflogReader = repo.getReflogReader(ref);
@@ -1179,6 +1211,7 @@ private Set<ObjectId> listRefLogObjects(Ref ref, long minTime) throws IOExceptio
 	 *
 	 * @return a collection of refs pointing to live objects.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private Collection<Ref> getAllRefs() throws IOException {
 		RefDatabase refdb = repo.getRefDatabase();
@@ -1205,8 +1238,11 @@ private Collection<Ref> getAllRefs() throws IOException {
 	 *
 	 * @return a set of ObjectIds of changed objects in the index
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws CorruptObjectException
+	 *             if an object is corrupt
 	 * @throws NoWorkTreeException
+	 *             if the repository has no working directory
 	 */
 	private Set<ObjectId> listNonHEADIndexObjects()
 			throws CorruptObjectException, IOException {
@@ -1326,6 +1362,25 @@ private Pack writePack(@NonNull Set<? extends ObjectId> want,
 				idxChannel.force(true);
 			}
 
+			if (pw.isReverseIndexEnabled()) {
+				File tmpReverseIndexFile = new File(packdir,
+						tmpBase + REVERSE_INDEX.getTmpExtension());
+				tmpExts.put(REVERSE_INDEX, tmpReverseIndexFile);
+				if (!tmpReverseIndexFile.createNewFile()) {
+					throw new IOException(MessageFormat.format(
+							JGitText.get().cannotCreateIndexfile,
+							tmpReverseIndexFile.getPath()));
+				}
+				try (FileOutputStream fos = new FileOutputStream(
+						tmpReverseIndexFile);
+						FileChannel channel = fos.getChannel();
+						OutputStream stream = Channels
+								.newOutputStream(channel)) {
+					pw.writeReverseIndex(stream);
+					channel.force(true);
+				}
+			}
+
 			if (pw.prepareBitmapIndex(pm)) {
 				File tmpBitmapIdx = new File(packdir,
 						tmpBase + BITMAP_INDEX.getTmpExtension());
@@ -1485,6 +1540,7 @@ public String toString() {
 	 *
 	 * @return information about objects and pack files for a FileRepository
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public RepoStatistics getStatistics() throws IOException {
 		RepoStatistics ret = new RepoStatistics();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java
index 86994a9..628bf5d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GcLog.java
@@ -132,6 +132,7 @@ boolean commit() {
 	 * @param content
 	 *            The content to write
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void write(String content) throws IOException {
 		if (content.length() > 0) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GlobalAttributesNode.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GlobalAttributesNode.java
index 254557c..bbb7476 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GlobalAttributesNode.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GlobalAttributesNode.java
@@ -39,6 +39,7 @@ public GlobalAttributesNode(Repository repository) {
 	 *
 	 * @return the attributes node
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public AttributesNode load() throws IOException {
 		AttributesNode r = new AttributesNode();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/InfoAttributesNode.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/InfoAttributesNode.java
index a22cd3f..11d842b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/InfoAttributesNode.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/InfoAttributesNode.java
@@ -39,6 +39,7 @@ public InfoAttributesNode(Repository repository) {
 	 *
 	 * @return the attributes node
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public AttributesNode load() throws IOException {
 		AttributesNode r = new AttributesNode();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LargePackedWholeObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LargePackedWholeObject.java
index e2fbd7a..15223ad 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LargePackedWholeObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LargePackedWholeObject.java
@@ -44,25 +44,21 @@ class LargePackedWholeObject extends ObjectLoader {
 		this.db = db;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getType() {
 		return type;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getSize() {
 		return size;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isLarge() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte[] getCachedBytes() throws LargeObjectException {
 		try {
@@ -72,7 +68,6 @@ public boolean isLarge() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectStream openStream() throws MissingObjectException, IOException {
 		WindowCursor wc = new WindowCursor(db);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LazyObjectIdSetFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LazyObjectIdSetFile.java
index 2d73f9b..d0d320b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LazyObjectIdSetFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LazyObjectIdSetFile.java
@@ -41,7 +41,6 @@ public LazyObjectIdSetFile(File src) {
 		this.src = src;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean contains(AnyObjectId objectId) {
 		if (set == null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java
index f112947..22eef94 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java
@@ -39,7 +39,6 @@ class LocalCachedPack extends CachedPack {
 		this.packs = packs.toArray(new Pack[0]);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() throws IOException {
 		long cnt = 0;
@@ -54,7 +53,6 @@ void copyAsIs(PackOutputStream out, WindowCursor wc)
 			pack.copyPackAsIs(out, wc);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectRepresentation.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectRepresentation.java
index 559718a..3f3d78c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectRepresentation.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectRepresentation.java
@@ -59,13 +59,11 @@ static LocalObjectRepresentation newDelta(Pack pack, long offset, long length,
 
 	private ObjectId baseId;
 
-	/** {@inheritDoc} */
 	@Override
 	public int getWeight() {
 		return (int) Math.min(length, Integer.MAX_VALUE);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getDeltaBase() {
 		if (baseId == null && getFormat() == PACK_DELTA) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectToPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectToPack.java
index ac6cd21..ca25212 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectToPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalObjectToPack.java
@@ -29,14 +29,12 @@ class LocalObjectToPack extends ObjectToPack {
 		super(src, type);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void clearReuseAsIs() {
 		super.clearReuseAsIs();
 		pack = null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void select(StoredObjectRepresentation ref) {
 		LocalObjectRepresentation ptr = (LocalObjectRepresentation) ref;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java
index d06b5a7..8ada0a9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java
@@ -79,6 +79,7 @@ public static boolean unlock(File file) {
 	 * Get the lock file corresponding to the given file.
 	 *
 	 * @param file
+	 *            given file
 	 * @return lock file
 	 */
 	static File getLockFile(File file) {
@@ -575,7 +576,6 @@ public void unlock() {
 		written = false;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LooseObjects.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LooseObjects.java
index 326c5f6..278c846 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LooseObjects.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LooseObjects.java
@@ -90,7 +90,6 @@ void close() {
 		unpackedObjectCache().clear();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "LooseObjects[" + directory + "]"; //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java
index f27daad..0ef38db 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java
@@ -145,7 +145,6 @@ public ObjectDirectory(final Config cfg, final File dir,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final File getDirectory() {
 		return loose.getDirectory();
@@ -169,13 +168,11 @@ public final File getPreservedDirectory() {
 		return preserved.getDirectory();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean exists() {
 		return fs.exists(objects);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void create() throws IOException {
 		loose.create();
@@ -183,7 +180,6 @@ public void create() throws IOException {
 		packed.create();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectDirectoryInserter newInserter() {
 		return new ObjectDirectoryInserter(this, config);
@@ -199,7 +195,6 @@ public PackInserter newPackInserter() {
 		return new PackInserter(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		loose.close();
@@ -214,13 +209,11 @@ public void close() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<Pack> getPacks() {
 		return packed.getPacks();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getApproximateObjectCount() {
 		long count = 0;
@@ -234,7 +227,6 @@ public long getApproximateObjectCount() {
 		return count;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Optional<CommitGraph> getCommitGraph() {
 		if (config.get(CoreConfig.KEY).enableCommitGraph()) {
@@ -244,7 +236,6 @@ public Optional<CommitGraph> getCommitGraph() {
 	}
 
 	/**
-	 * {@inheritDoc}
 	 * <p>
 	 * Add a single existing pack to the list of available pack files.
 	 */
@@ -273,13 +264,11 @@ public Pack openPack(File pack) throws IOException {
 		return res;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "ObjectDirectory[" + getDirectory() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean has(AnyObjectId objectId) {
 		return loose.hasCached(objectId)
@@ -811,7 +800,6 @@ void close() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectDatabase newCachedDatabase() {
 		return newCachedFileObjectDatabase();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java
index e6b2cc1..2f30a97 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java
@@ -49,7 +49,6 @@ class ObjectDirectoryInserter extends ObjectInserter {
 		config = cfg.get(WriteConfig.KEY);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, byte[] data, int off, int len)
 			throws IOException {
@@ -62,12 +61,19 @@ public ObjectId insert(int type, byte[] data, int off, int len)
 	 * ODB.
 	 *
 	 * @param type
+	 *            object type
 	 * @param data
+	 *            object data
 	 * @param off
+	 *            first position within @{code data}
 	 * @param len
+	 *            length number of bytes to copy
 	 * @param createDuplicate
-	 * @return ObjectId
+	 *            whether to insert a duplicate if an object with this id
+	 *            already exists
+	 * @return ObjectId the name of the object
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private ObjectId insert(
 			int type, byte[] data, int off, int len, boolean createDuplicate)
@@ -80,7 +86,6 @@ private ObjectId insert(
 		return insertOneObject(tmp, id, createDuplicate);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, long len, InputStream is)
 			throws IOException {
@@ -93,11 +98,17 @@ public ObjectId insert(int type, long len, InputStream is)
 	 * ODB.
 	 *
 	 * @param type
+	 *            object type
 	 * @param len
+	 *            number of bytes to copy
 	 * @param is
+	 *            input stream
 	 * @param createDuplicate
-	 * @return ObjectId
+	 *            whether to insert a duplicate if an object with this id
+	 *            already exists
+	 * @return ObjectId the name of the object
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	ObjectId insert(int type, long len, InputStream is, boolean createDuplicate)
 			throws IOException {
@@ -132,25 +143,21 @@ private ObjectId insertOneObject(
 				.format(JGitText.get().unableToCreateNewObject, dst));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackParser newPackParser(InputStream in) throws IOException {
 		return new ObjectDirectoryPackParser(db, in);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return new WindowCursor(db, this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		// Do nothing. Loose objects are immediately visible.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (deflate != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java
index 55b2646..9f27f4b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java
@@ -142,7 +142,6 @@ public Pack getPack() {
 		return newPack;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getPackSize() {
 		if (newPack == null)
@@ -158,7 +157,6 @@ public long getPackSize() {
 		return size;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
 			throws IOException {
@@ -193,40 +191,34 @@ public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onPackHeader(long objectCount) throws IOException {
 		// Ignored, the count is not required.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginWholeObject(long streamPosition, int type,
 			long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndWholeObject(PackedObjectInfo info) throws IOException {
 		info.setCRC((int) crc.getValue());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginOfsDelta(long streamPosition,
 			long baseStreamPosition, long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onBeginRefDelta(long streamPosition, AnyObjectId baseId,
 			long inflatedSize) throws IOException {
 		crc.reset();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected UnresolvedDelta onEndDelta() throws IOException {
 		UnresolvedDelta delta = new UnresolvedDelta();
@@ -234,35 +226,30 @@ protected UnresolvedDelta onEndDelta() throws IOException {
 		return delta;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onInflatedObjectData(PackedObjectInfo obj, int typeCode,
 			byte[] data) throws IOException {
 		// ObjectDirectory ignores this event.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onObjectHeader(Source src, byte[] raw, int pos, int len)
 			throws IOException {
 		crc.update(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onObjectData(Source src, byte[] raw, int pos, int len)
 			throws IOException {
 		crc.update(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onStoreStream(byte[] raw, int pos, int len)
 			throws IOException {
 		out.write(raw, pos, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onPackFooter(byte[] hash) throws IOException {
 		packEnd = out.getFilePointer();
@@ -271,7 +258,6 @@ protected void onPackFooter(byte[] hash) throws IOException {
 		packHash = hash;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 			ObjectTypeAndSize info) throws IOException {
@@ -280,7 +266,6 @@ protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 		return readObjectHeader(info);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 			ObjectTypeAndSize info) throws IOException {
@@ -289,13 +274,11 @@ protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 		return readObjectHeader(info);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected int readDatabase(byte[] dst, int pos, int cnt) throws IOException {
 		return out.read(dst, pos, cnt);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean checkCRC(int oldCRC) {
 		return oldCRC == (int) crc.getValue();
@@ -313,7 +296,6 @@ private void cleanupTemporaryFiles() {
 			tmpPack.deleteOnExit();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean onAppendBase(final int typeCode, final byte[] data,
 			final PackedObjectInfo info) throws IOException {
@@ -356,7 +338,6 @@ protected boolean onAppendBase(final int typeCode, final byte[] data,
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndThinPack() throws IOException {
 		final byte[] buf = buffer();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
index 6e74136..2b5586a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
@@ -14,6 +14,7 @@
 
 import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
 import static org.eclipse.jgit.internal.storage.pack.PackExt.KEEP;
+import static org.eclipse.jgit.internal.storage.pack.PackExt.REVERSE_INDEX;
 
 import java.io.EOFException;
 import java.io.File;
@@ -50,12 +51,14 @@
 import org.eclipse.jgit.errors.UnsupportedPackVersionException;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.storage.pack.BinaryDelta;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
 import org.eclipse.jgit.internal.storage.pack.PackOutputStream;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.util.Hex;
 import org.eclipse.jgit.util.LongList;
 import org.eclipse.jgit.util.NB;
 import org.eclipse.jgit.util.RawParseUtils;
@@ -177,10 +180,10 @@ private PackIndex idx() throws IOException {
 							throw new PackMismatchException(MessageFormat
 									.format(JGitText.get().packChecksumMismatch,
 											packFile.getPath(),
-											ObjectId.fromRaw(packChecksum)
-													.name(),
-											ObjectId.fromRaw(idx.packChecksum)
-													.name()));
+											PackExt.PACK.getExtension(),
+											Hex.toHexString(packChecksum),
+											PackExt.INDEX.getExtension(),
+											Hex.toHexString(idx.packChecksum)));
 						}
 						loadedIdx = idx;
 					} catch (InterruptedIOException e) {
@@ -211,6 +214,7 @@ public PackFile getPackFile() {
 	 *
 	 * @return the index for this pack file.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public PackIndex getIndex() throws IOException {
 		return idx();
@@ -764,11 +768,11 @@ private void onOpenPack() throws IOException {
 		fd.seek(length - 20);
 		fd.readFully(buf, 0, 20);
 		if (!Arrays.equals(buf, packChecksum)) {
-			throw new PackMismatchException(MessageFormat.format(
-					JGitText.get().packChecksumMismatch,
-					getPackFile(),
-					ObjectId.fromRaw(buf).name(),
-					ObjectId.fromRaw(idx.packChecksum).name()));
+			throw new PackMismatchException(
+					MessageFormat.format(JGitText.get().packChecksumMismatch,
+							getPackFile(), PackExt.PACK.getExtension(),
+							Hex.toHexString(buf), PackExt.INDEX.getExtension(),
+							Hex.toHexString(idx.packChecksum)));
 		}
 	}
 
@@ -1147,8 +1151,15 @@ synchronized PackBitmapIndex getBitmapIndex() throws IOException {
 	}
 
 	private synchronized PackReverseIndex getReverseIdx() throws IOException {
-		if (reverseIdx == null)
-			reverseIdx = new PackReverseIndex(idx());
+		if (invalid) {
+			throw new PackInvalidException(packFile, invalidatingCause);
+		}
+		if (reverseIdx == null) {
+			PackFile reverseIndexFile = packFile.create(REVERSE_INDEX);
+			reverseIdx = PackReverseIndexFactory.openOrCompute(reverseIndexFile,
+					getObjectCount(), () -> getIndex());
+			reverseIdx.verifyPackChecksum(getPackFile().getPath());
+		}
 		return reverseIdx;
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndex.java
index 8fb17fc..0c3e724 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndex.java
@@ -205,6 +205,7 @@ public interface SupplierWithIOException<T> {
 		/**
 		 * @return result
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		T get() throws IOException;
 	}
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 5666b57..1d1ad98 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
@@ -58,7 +58,7 @@ public class PackBitmapIndexBuilder extends BasePackBitmapIndex {
 	 *            ObjectId (name); it will be resorted in place.
 	 */
 	public PackBitmapIndexBuilder(List<ObjectToPack> objects) {
-		super(new ObjectIdOwnerMap<StoredBitmap>());
+		super(new ObjectIdOwnerMap<>());
 		byOffset = new BlockList<>(objects.size());
 		sortByOffsetAndIndex(byOffset, positionEntries, objects);
 
@@ -214,7 +214,6 @@ public void addBitmap(
 		getBitmaps().add(result);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap ofObjectType(
 			EWAHCompressedBitmap bitmap, int type) {
@@ -231,7 +230,6 @@ public EWAHCompressedBitmap ofObjectType(
 		throw new IllegalArgumentException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objectId) {
 		PositionEntry entry = positionEntries.get(objectId);
@@ -240,7 +238,6 @@ public int findPosition(AnyObjectId objectId) {
 		return entry.offsetPosition;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObject(int position) throws IllegalArgumentException {
 		ObjectId objectId = byOffset.get(position);
@@ -294,7 +291,6 @@ public int getOptions() {
 		return PackBitmapIndexV1.OPT_FULL;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getBitmapCount() {
 		return bitmapsToWriteXorBuffer.size() + bitmapsToWrite.size();
@@ -311,7 +307,6 @@ public void resetBitmaps(int size) {
 		bitmapsToWrite = new ArrayList<>(size);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getObjectCount() {
 		return byOffset.size();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java
index e1b6f78..c97d9f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java
@@ -79,32 +79,27 @@ private PackBitmapIndexRemapper(
 					oldPackIndex.getObject(pos));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objectId) {
 		return newPackIndex.findPosition(objectId);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObject(int position) throws IllegalArgumentException {
 		return newPackIndex.getObject(position);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getObjectCount() {
 		return newPackIndex.getObjectCount();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap ofObjectType(
 			EWAHCompressedBitmap bitmap, int type) {
 		return newPackIndex.ofObjectType(bitmap, type);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<Entry> iterator() {
 		if (oldPackIndex == null)
@@ -141,7 +136,6 @@ public void remove() {
 		};
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap getBitmap(AnyObjectId objectId) {
 		EWAHCompressedBitmap bitmap = newPackIndex.getBitmap(objectId);
@@ -179,7 +173,6 @@ public int getFlags() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getBitmapCount() {
 		// The count is only useful for the end index, not the remapper.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexV1.java
index 988dc6c..f2f24b3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexV1.java
@@ -84,7 +84,7 @@ public Thread newThread(Runnable runnable) {
 			throws IOException {
 		// An entry is object id, xor offset, flag byte, and a length encoded
 		// bitmap. The object id is an int32 of the nth position sorted by name.
-		super(new ObjectIdOwnerMap<StoredBitmap>());
+		super(new ObjectIdOwnerMap<>());
 		this.bitmaps = getBitmaps();
 
 		// Optionally start loading reverse index in parallel to loading bitmap
@@ -214,7 +214,6 @@ public Thread newThread(Runnable runnable) {
 		this.reverseIndex = computedReverseIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objectId) {
 		long offset = packIndex.findOffset(objectId);
@@ -223,7 +222,6 @@ public int findPosition(AnyObjectId objectId) {
 		return reverseIndex.findPosition(offset);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObject(int position) throws IllegalArgumentException {
 		ObjectId objectId = reverseIndex.findObjectByPosition(position);
@@ -232,13 +230,11 @@ public ObjectId getObject(int position) throws IllegalArgumentException {
 		return objectId;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getObjectCount() {
 		return (int) packIndex.getObjectCount();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap ofObjectType(
 			EWAHCompressedBitmap bitmap, int type) {
@@ -255,13 +251,11 @@ public EWAHCompressedBitmap ofObjectType(
 		throw new IllegalArgumentException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getBitmapCount() {
 		return bitmaps.size();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		// TODO(cranger): compare the pack checksum?
@@ -270,7 +264,6 @@ public boolean equals(Object o) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getPackIndex().hashCode();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
index 6a99cb3..85b2d34 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
@@ -123,7 +123,6 @@ Collection<Pack> getPacks() {
 		return Collections.unmodifiableCollection(Arrays.asList(packs));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "PackDirectory[" + getDirectory() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
@@ -350,7 +349,7 @@ private void handlePackError(IOException e, Pack p) {
 	/**
 	 * @param n
 	 *            count of consecutive failures
-	 * @return @{code true} if i is a power of 2
+	 * @return {@code true} if i is a power of 2
 	 */
 	private boolean doLogExponentialBackoff(int n) {
 		return (n & (n - 1)) == 0;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java
index a784af8..dbf7d8a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java
@@ -48,7 +48,6 @@ void setChecksum(AnyObjectId checksum) {
 		this.checksum = checksum;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isModified(File packFile) {
 		if (!super.isModified(packFile)) {
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 f4f62d4..7778cb5 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
@@ -128,7 +128,6 @@ public boolean hasObject(AnyObjectId id) {
 		return findOffset(id) != -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean contains(AnyObjectId id) {
 		return findOffset(id) != -1;
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 fff410b..860ebae 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
@@ -72,13 +72,11 @@ class PackIndexV1 extends PackIndex {
 		IO.readFully(fd, packChecksum, 0, packChecksum.length);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() {
 		return objectCnt;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getOffset64Count() {
 		long n64 = 0;
@@ -111,7 +109,6 @@ private int getLevelTwo(long nthPosition, int levelOne) {
 		return (int) (nthPosition - base);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObjectId(long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
@@ -128,7 +125,6 @@ long getOffset(long nthPosition) {
 		return NB.decodeUInt32(idxdata[levelOne], p);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long findOffset(AnyObjectId objId) {
 		final int levelOne = objId.getFirstByte();
@@ -145,7 +141,6 @@ public long findOffset(AnyObjectId objId) {
 		return (((long) b0) << 24) | (b1 << 16) | (b2 << 8) | (b3);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objId) {
 		int levelOne = objId.getFirstByte();
@@ -193,25 +188,21 @@ else if (cmp == 0) {
 		return -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long findCRC32(AnyObjectId objId) {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasCRC32Support() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<MutableEntry> iterator() {
 		return new IndexV1Iterator();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void resolve(Set<ObjectId> matches, AbbreviatedObjectId id,
 			int matchLimit) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java
index 7a39006..751b62d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java
@@ -131,13 +131,11 @@ class PackIndexV2 extends PackIndex {
 		IO.readFully(fd, packChecksum, 0, packChecksum.length);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() {
 		return objectCnt;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getOffset64Count() {
 		return offset64.length / 8;
@@ -165,7 +163,6 @@ private int getLevelTwo(long nthPosition, int levelOne) {
 		return (int) (nthPosition - base);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObjectId(long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
@@ -174,7 +171,6 @@ public ObjectId getObjectId(long nthPosition) {
 		return ObjectId.fromRaw(names[levelOne], p4 + p); // p * 5
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getOffset(long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
@@ -182,7 +178,6 @@ public long getOffset(long nthPosition) {
 		return getOffset(levelOne, levelTwo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long findOffset(AnyObjectId objId) {
 		final int levelOne = objId.getFirstByte();
@@ -192,7 +187,6 @@ public long findOffset(AnyObjectId objId) {
 		return getOffset(levelOne, levelTwo);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objId) {
 		int levelOne = objId.getFirstByte();
@@ -211,7 +205,6 @@ private long getOffset(int levelOne, int levelTwo) {
 		return p;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long findCRC32(AnyObjectId objId) throws MissingObjectException {
 		final int levelOne = objId.getFirstByte();
@@ -221,19 +214,16 @@ public long findCRC32(AnyObjectId objId) throws MissingObjectException {
 		return NB.decodeUInt32(crc32[levelOne], levelTwo << 2);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasCRC32Support() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<MutableEntry> iterator() {
 		return new EntriesIteratorV2();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void resolve(Set<ObjectId> matches, AbbreviatedObjectId id,
 			int matchLimit) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV1.java
index e1612bb..7e28b5e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV1.java
@@ -35,7 +35,6 @@ static boolean canStore(PackedObjectInfo oe) {
 		super(dst);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void writeImpl() throws IOException {
 		writeFanOutTable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV2.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV2.java
index 7adabad..fc5ef61 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV2.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriterV2.java
@@ -30,7 +30,6 @@ class PackIndexWriterV2 extends PackIndexWriter {
 		super(dst);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void writeImpl() throws IOException {
 		writeTOC(2);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInputStream.java
index 0bceca7..fdc2f80 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInputStream.java
@@ -31,7 +31,6 @@ class PackInputStream extends InputStream {
 		wc.pin(pack, pos);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		int n = wc.copy(pack, pos, b, off, len);
@@ -39,7 +38,6 @@ public int read(byte[] b, int off, int len) throws IOException {
 		return n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		byte[] buf = new byte[1];
@@ -47,7 +45,6 @@ public int read() throws IOException {
 		return n == 1 ? buf[0] & 0xff : -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		wc.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java
index d6209c4..1b092a3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java
@@ -150,7 +150,6 @@ int getBufferSize() {
 		return buffer().length;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, byte[] data, int off, int len)
 			throws IOException {
@@ -169,7 +168,6 @@ public ObjectId insert(int type, byte[] data, int off, int len)
 		return endObject(id, offset);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, long len, InputStream in)
 			throws IOException {
@@ -243,19 +241,16 @@ private static int writePackHeader(byte[] buf, int objectCount) {
 		return 12;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackParser newPackParser(InputStream in) {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return new Reader();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (tmpPack == null) {
@@ -340,7 +335,6 @@ private ObjectId computeName(List<PackedObjectInfo> list) {
 		return ObjectId.fromRaw(md.digest());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackObjectSizeIndexWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackObjectSizeIndexWriter.java
index 65a065d..3286436 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackObjectSizeIndexWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackObjectSizeIndexWriter.java
@@ -72,11 +72,13 @@ public abstract void write(List<? extends PackedObjectInfo> objs)
 	 *
 	 * Store position (in the main index) to size as parallel arrays.
 	 *
-	 * <p>Positions in the main index fit well in unsigned 24 bits (16M) for most
+	 * <p>
+	 * Positions in the main index fit well in unsigned 24 bits (16M) for most
 	 * repositories, but some outliers have even more objects, so we need to
 	 * store also 32 bits positions.
 	 *
-	 * <p>Sizes are stored as a first array parallel to positions. If a size
+	 * <p>
+	 * Sizes are stored as a first array parallel to positions. If a size
 	 * doesn't fit in an element of that array, then we encode there a position
 	 * on the next-size array. This "overflow" array doesn't have entries for
 	 * all positions.
@@ -85,30 +87,36 @@ public abstract void write(List<? extends PackedObjectInfo> objs)
 	 *
 	 *      positions       [10, 500, 1000, 1001]
 	 *      sizes (32bits)  [15MB, -1, 6MB, -2]
-   *                          ___/  ______/
+	*                          ___/  ______/
 	 *                        /     /
 	 *      sizes (64 bits) [3GB, 6GB]
 	 * </pre>
 	 *
-	 * <p>For sizes we use 32 bits as the first level and 64 for the rare objects
+	 * <p>
+	 * For sizes we use 32 bits as the first level and 64 for the rare objects
 	 * over 2GB.
 	 *
-	 * <p>A 24/32/64 bits hierarchy of arrays saves space if we have a lot of small
-	 * objects, but wastes space if we have only big ones. The min size to index is
-	 * controlled by conf and in principle we want to index only rather
-	 * big objects (e.g. > 10MB). We could support more dynamics read/write of sizes
+	 * <p>
+	 * A 24/32/64 bits hierarchy of arrays saves space if we have a lot of small
+	 * objects, but wastes space if we have only big ones. The min size to index
+	 * is controlled by conf and in principle we want to index only rather big
+	 * objects (e.g. > 10MB). We could support more dynamics read/write of sizes
 	 * (e.g. 24 only if the threshold will include many of those objects) but it
-	 * complicates a lot code and spec. If needed it could go for a v2 of the protocol.
+	 * complicates a lot code and spec. If needed it could go for a v2 of the
+	 * protocol.
 	 *
-	 * <p>Format:
-	 *
+	 * <p>
+	 * Format:
+	 * <ul>
 	 * <li>A header with the magic number (4 bytes)
 	 * <li>The index version (1 byte)
 	 * <li>The minimum object size (4 bytes)
 	 * <li>Total count of objects indexed (C, 4 bytes)
+	 * </ul>
 	 * (if count == 0, stop here)
-	 *
+	 * <p>
 	 * Blocks of
+	 * <ul>
 	 * <li>Size per entry in bits (1 byte, either 24 (0x18) or 32 (0x20))
 	 * <li>Count of entries (4 bytes) (c, as a signed int)
 	 * <li>positions encoded in s bytes each (i.e s*c bytes)
@@ -120,6 +128,7 @@ public abstract void write(List<? extends PackedObjectInfo> objs)
 	 * <li>Count of 64 bit sizes (s64) (or 0 if no more indirections)
 	 * <li>64 bit sizes (s64 * 8 bytes)
 	 * <li>0 (end)
+	 * </ul>
 	 */
 	static class PackObjectSizeWriterV1 extends PackObjectSizeIndexWriter {
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndex.java
index 1a5adb4..ef9753c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndex.java
@@ -10,11 +10,8 @@
 
 package org.eclipse.jgit.internal.storage.file;
 
-import java.text.MessageFormat;
-
 import org.eclipse.jgit.errors.CorruptObjectException;
-import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
+import org.eclipse.jgit.errors.PackMismatchException;
 import org.eclipse.jgit.lib.ObjectId;
 
 /**
@@ -27,92 +24,27 @@
  * @see PackIndex
  * @see Pack
  */
-public class PackReverseIndex {
-	/** Index we were created from, and that has our ObjectId data. */
-	private final PackIndex index;
-
-	/** The number of bytes per entry in the offsetIndex. */
-	private final long bucketSize;
+public interface PackReverseIndex {
+	/**
+	 * Magic bytes that uniquely identify git reverse index files.
+	 */
+	byte[] MAGIC = { 'R', 'I', 'D', 'X' };
 
 	/**
-	 * An index into the nth mapping, where the value is the position after the
-	 * the last index that contains the values of the bucket. For example given
-	 * offset o (and bucket = o / bucketSize), the offset will be contained in
-	 * the range nth[offsetIndex[bucket - 1]] inclusive to
-	 * nth[offsetIndex[bucket]] exclusive.
-	 *
-	 * See {@link #binarySearch}
+	 * The first reverse index file version.
 	 */
-	private final int[] offsetIndex;
-
-	/** Mapping from indices in offset order to indices in SHA-1 order. */
-	private final int[] nth;
+	int VERSION_1 = 1;
 
 	/**
-	 * Create reverse index from straight/forward pack index, by indexing all
-	 * its entries.
+	 * Verify that the pack checksum found in the reverse index matches that
+	 * from the pack file.
 	 *
-	 * @param packIndex
-	 *            forward index - entries to (reverse) index.
+	 * @param packFilePath
+	 *            the path to display in event of a mismatch
+	 * @throws PackMismatchException
+	 *             if the checksums do not match
 	 */
-	public PackReverseIndex(PackIndex packIndex) {
-		index = packIndex;
-
-		final long cnt = index.getObjectCount();
-		if (cnt + 1 > Integer.MAX_VALUE)
-			throw new IllegalArgumentException(
-					JGitText.get().hugeIndexesAreNotSupportedByJgitYet);
-
-		if (cnt == 0) {
-			bucketSize = Long.MAX_VALUE;
-			offsetIndex = new int[1];
-			nth = new int[0];
-			return;
-		}
-
-		final long[] offsetsBySha1 = new long[(int) cnt];
-
-		long maxOffset = 0;
-		int ith = 0;
-		for (MutableEntry me : index) {
-			final long o = me.getOffset();
-			offsetsBySha1[ith++] = o;
-			if (o > maxOffset)
-				maxOffset = o;
-		}
-
-		bucketSize = maxOffset / cnt + 1;
-		int[] bucketIndex = new int[(int) cnt];
-		int[] bucketValues = new int[(int) cnt + 1];
-		for (int oi = 0; oi < offsetsBySha1.length; oi++) {
-			final long o = offsetsBySha1[oi];
-			final int bucket = (int) (o / bucketSize);
-			final int bucketValuesPos = oi + 1;
-			final int current = bucketIndex[bucket];
-			bucketIndex[bucket] = bucketValuesPos;
-			bucketValues[bucketValuesPos] = current;
-		}
-
-		int nthByOffset = 0;
-		nth = new int[offsetsBySha1.length];
-		offsetIndex = bucketIndex; // Reuse the allocation
-		for (int bi = 0; bi < bucketIndex.length; bi++) {
-			final int start = nthByOffset;
-			// Insertion sort of the values in the bucket.
-			for (int vi = bucketIndex[bi]; vi > 0; vi = bucketValues[vi]) {
-				final int nthBySha1 = vi - 1;
-				final long o = offsetsBySha1[nthBySha1];
-				int insertion = nthByOffset++;
-				for (; start < insertion; insertion--) {
-					if (o > offsetsBySha1[nth[insertion - 1]])
-						break;
-					nth[insertion] = nth[insertion - 1];
-				}
-				nth[insertion] = nthBySha1;
-			}
-			offsetIndex[bi] = nthByOffset;
-		}
-	}
+	void verifyPackChecksum(String packFilePath) throws PackMismatchException;
 
 	/**
 	 * Search for object id with the specified start offset in this pack
@@ -122,12 +54,7 @@ public PackReverseIndex(PackIndex packIndex) {
 	 *            start offset of object to find.
 	 * @return object id for this offset, or null if no object was found.
 	 */
-	public ObjectId findObject(long offset) {
-		final int ith = binarySearch(offset);
-		if (ith < 0)
-			return null;
-		return index.getObjectId(nth[ith]);
-	}
+	ObjectId findObject(long offset);
 
 	/**
 	 * Search for the next offset to the specified offset in this pack (reverse)
@@ -144,42 +71,25 @@ public ObjectId findObject(long offset) {
 	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             when there is no object with the provided offset.
 	 */
-	public long findNextOffset(long offset, long maxOffset)
-			throws CorruptObjectException {
-		final int ith = binarySearch(offset);
-		if (ith < 0)
-			throw new CorruptObjectException(
-					MessageFormat.format(
-							JGitText.get().cantFindObjectInReversePackIndexForTheSpecifiedOffset,
-							Long.valueOf(offset)));
+	long findNextOffset(long offset, long maxOffset)
+			throws CorruptObjectException;
 
-		if (ith + 1 == nth.length)
-			return maxOffset;
-		return index.getOffset(nth[ith + 1]);
-	}
+	/**
+	 * Find the position in the primary index of the object at the given pack
+	 * offset.
+	 *
+	 * @param offset
+	 *            the pack offset of the object
+	 * @return the position in the primary index of the object
+	 */
+	int findPosition(long offset);
 
-	int findPosition(long offset) {
-		return binarySearch(offset);
-	}
-
-	private int binarySearch(long offset) {
-		int bucket = (int) (offset / bucketSize);
-		int low = bucket == 0 ? 0 : offsetIndex[bucket - 1];
-		int high = offsetIndex[bucket];
-		while (low < high) {
-			final int mid = (low + high) >>> 1;
-			final long o = index.getOffset(nth[mid]);
-			if (offset < o)
-				high = mid;
-			else if (offset == o)
-				return mid;
-			else
-				low = mid + 1;
-		}
-		return -1;
-	}
-
-	ObjectId findObjectByPosition(int nthPosition) {
-		return index.getObjectId(nth[nthPosition]);
-	}
+	/**
+	 * Find the object that is in the given position in the primary index.
+	 *
+	 * @param nthPosition
+	 *            the position of the object in the primary index
+	 * @return the object in that position
+	 */
+	ObjectId findObjectByPosition(int nthPosition);
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexComputed.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexComputed.java
new file mode 100644
index 0000000..0b487a2
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexComputed.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2023, Google LLC and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.storage.file;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.PackMismatchException;
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Reverse index for forward pack index which is computed from the forward pack
+ * index.
+ * <p>
+ * Creating an instance uses an insertion sort of the entries in the forward
+ * index, so it runs in quadratic time on average.
+ */
+final class PackReverseIndexComputed implements PackReverseIndex {
+	/**
+	 * Index we were created from, and that has our ObjectId data.
+	 */
+	private final PackIndex index;
+
+	/**
+	 * The difference in offset between the start of an offset bucket and the
+	 * start of its succeeding bucket.
+	 */
+	private final long bucketSize;
+
+	/**
+	 * The indexes into indexPosInOffsetOrder at which the next bucket starts.
+	 * <p>
+	 * For example, given offset o (and therefore bucket = o / bucketSize), the
+	 * indexPos corresponding to o will be contained in the range
+	 * indexPosInOffsetOrder[nextBucketStart[bucket - 1]] inclusive to
+	 * indexPosInOffsetOrder[nextBucketStart[bucket]] exclusive.
+	 * <p>
+	 * This range information can speed up #binarySearch by identifying the
+	 * relevant bucket and only searching within its range.
+	 * <p>
+	 * See {@link #binarySearch}
+	 */
+	private final int[] nextBucketStart;
+
+	/**
+	 * Mapping from indices in offset order to indices in SHA-1 order.
+	 */
+	private final int[] indexPosInOffsetOrder;
+
+	/**
+	 * Create reverse index from straight/forward pack index, by indexing all
+	 * its entries.
+	 *
+	 * @param packIndex
+	 *            forward index - entries to (reverse) index.
+	 */
+	PackReverseIndexComputed(PackIndex packIndex) {
+		index = packIndex;
+
+		long rawCnt = index.getObjectCount();
+		if (rawCnt + 1 > Integer.MAX_VALUE) {
+			throw new IllegalArgumentException(
+					JGitText.get().hugeIndexesAreNotSupportedByJgitYet);
+		}
+		int cnt = (int) rawCnt;
+
+		if (cnt == 0) {
+			bucketSize = Long.MAX_VALUE;
+			nextBucketStart = new int[1];
+			indexPosInOffsetOrder = new int[0];
+			return;
+		}
+
+		// Sort the index positions according to the corresponding pack offsets.
+		// Use bucket sort since the offsets are somewhat uniformly distributed
+		// over the range (0, pack size).
+		long[] offsetsInIndexOrder = new long[cnt];
+		long maxOffset = 0;
+		int i = 0;
+		for (MutableEntry entry : index) {
+			long offset = entry.getOffset();
+			offsetsInIndexOrder[i++] = offset;
+			if (offset > maxOffset) {
+				maxOffset = offset;
+			}
+		}
+
+		bucketSize = maxOffset / cnt + 1;
+		// The values in each bucket, stored as a linked list. Given a bucket,
+		// headValues[bucket] contains the first value,
+		// furtherValues[headValues[bucket]] contains the second,
+		// furtherValues[furtherValues[headValues[bucket]]] the third, and so
+		// on. The linked list stops when a value is 0. The values themselves
+		// are shifted index positions. There won't be any
+		// collisions because every index position is unique.
+		int[] headValues = new int[cnt];
+		int[] furtherValues = new int[cnt + 1];
+		for (int indexPos = 0; indexPos < cnt; indexPos++) {
+			// The offset determines which bucket this index position falls
+			// into, since the goal is sort into offset order.
+			long offset = offsetsInIndexOrder[indexPos];
+			int bucket = (int) (offset / bucketSize);
+			// Store the index positions as 1-indexed so that default
+			// initialized value 0 can be interpreted as the end of the bucket
+			// values.
+			int asBucketValue = indexPos + 1;
+			// If there is an existing value in this bucket, push the value to
+			// the front of the linked list.
+			int current = headValues[bucket];
+			headValues[bucket] = asBucketValue;
+			furtherValues[asBucketValue] = current;
+		}
+
+		int nthByOffset = 0;
+		indexPosInOffsetOrder = new int[cnt];
+		nextBucketStart = headValues; // Reuse the allocation
+		for (int bi = 0; bi < headValues.length; bi++) {
+			// Insertion sort of the values in the bucket.
+			int start = nthByOffset;
+			for (int vi = headValues[bi]; vi > 0; vi = furtherValues[vi]) {
+				int nthBySha1 = vi - 1;
+				long o = offsetsInIndexOrder[nthBySha1];
+				int insertion = nthByOffset++;
+				for (; start < insertion; insertion--) {
+					if (o > offsetsInIndexOrder[indexPosInOffsetOrder[insertion
+							- 1]]) {
+						break;
+					}
+					indexPosInOffsetOrder[insertion] = indexPosInOffsetOrder[insertion
+							- 1];
+				}
+				indexPosInOffsetOrder[insertion] = nthBySha1;
+			}
+			nextBucketStart[bi] = nthByOffset;
+		}
+	}
+
+	@Override
+	public void verifyPackChecksum(String packFilePath)
+			throws PackMismatchException {
+		// There is no file with a checksum.
+	}
+
+	@Override
+	public ObjectId findObject(long offset) {
+		final int ith = binarySearch(offset);
+		if (ith < 0) {
+			return null;
+		}
+		return index.getObjectId(indexPosInOffsetOrder[ith]);
+	}
+
+	@Override
+	public long findNextOffset(long offset, long maxOffset)
+			throws CorruptObjectException {
+		final int ith = binarySearch(offset);
+		if (ith < 0) {
+			throw new CorruptObjectException(MessageFormat.format(JGitText
+					.get().cantFindObjectInReversePackIndexForTheSpecifiedOffset,
+					Long.valueOf(offset)));
+		}
+
+		if (ith + 1 == indexPosInOffsetOrder.length) {
+			return maxOffset;
+		}
+		return index.getOffset(indexPosInOffsetOrder[ith + 1]);
+	}
+
+	@Override
+	public int findPosition(long offset) {
+		return binarySearch(offset);
+	}
+
+	private int binarySearch(long offset) {
+		int bucket = (int) (offset / bucketSize);
+		int low = bucket == 0 ? 0 : nextBucketStart[bucket - 1];
+		int high = nextBucketStart[bucket];
+		while (low < high) {
+			final int mid = (low + high) >>> 1;
+			final long o = index.getOffset(indexPosInOffsetOrder[mid]);
+			if (offset < o) {
+				high = mid;
+			} else if (offset == o) {
+				return mid;
+			} else {
+				low = mid + 1;
+			}
+		}
+		return -1;
+	}
+
+	@Override
+	public ObjectId findObjectByPosition(int nthPosition) {
+		return index.getObjectId(indexPosInOffsetOrder[nthPosition]);
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexFactory.java
new file mode 100644
index 0000000..32830c3
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexFactory.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2023, Google LLC and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.internal.storage.file;
+
+import static org.eclipse.jgit.internal.storage.file.PackReverseIndex.MAGIC;
+import static org.eclipse.jgit.internal.storage.file.PackReverseIndex.VERSION_1;
+
+import java.io.DataInput;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.DigestInputStream;
+import java.text.MessageFormat;
+import java.util.Arrays;
+
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.util.IO;
+import org.eclipse.jgit.util.io.SilentFileInputStream;
+
+/**
+ * Factory for creating instances of {@link PackReverseIndex}.
+ */
+public final class PackReverseIndexFactory {
+	/**
+	 * Create an in-memory pack reverse index by reading it from the given file
+	 * if the file exists, or computing it from the given pack index if the file
+	 * doesn't exist.
+	 *
+	 * @param idxFile
+	 *            the file to read the pack file from, if it exists
+	 * @param objectCount
+	 *            the number of objects in the corresponding pack
+	 * @param packIndexSupplier
+	 *            a function to lazily get the corresponding forward index
+	 * @return the reverse index instance
+	 * @throws IOException
+	 *             if reading from the file fails
+	 */
+	static PackReverseIndex openOrCompute(File idxFile, long objectCount,
+			PackBitmapIndex.SupplierWithIOException<PackIndex> packIndexSupplier)
+			throws IOException {
+		try (SilentFileInputStream fd = new SilentFileInputStream(idxFile)) {
+			return readFromFile(fd, objectCount, packIndexSupplier);
+		} catch (FileNotFoundException e) {
+			return computeFromIndex(packIndexSupplier.get());
+		} catch (IOException e) {
+			throw new IOException(
+					MessageFormat.format(JGitText.get().unreadablePackIndex,
+							idxFile.getAbsolutePath()),
+					e);
+		}
+	}
+
+	/**
+	 * Compute an in-memory pack reverse index from the in-memory pack forward
+	 * index. This computation uses insertion sort, which has a quadratic
+	 * runtime on average.
+	 *
+	 * @param packIndex
+	 *            the forward index to compute from
+	 * @return the reverse index instance
+	 */
+	public static PackReverseIndex computeFromIndex(PackIndex packIndex) {
+		return new PackReverseIndexComputed(packIndex);
+	}
+
+	/**
+	 * Read an in-memory pack reverse index from the given input stream. This
+	 * has a linear runtime.
+	 *
+	 * @param src
+	 *            the input stream to read the contents from
+	 * @param objectCount
+	 *            the number of objects in the corresponding pack
+	 * @param packIndexSupplier
+	 *            a function to lazily get the corresponding forward index
+	 * @return the reverse index instance
+	 * @throws IOException
+	 *             if reading from the input stream fails
+	 */
+	static PackReverseIndex readFromFile(InputStream src, long objectCount,
+			PackBitmapIndex.SupplierWithIOException<PackIndex> packIndexSupplier)
+			throws IOException {
+		final DigestInputStream digestIn = new DigestInputStream(src,
+				Constants.newMessageDigest());
+
+		final byte[] magic = new byte[MAGIC.length];
+		IO.readFully(digestIn, magic);
+		if (!Arrays.equals(magic, MAGIC)) {
+			throw new IOException(
+					MessageFormat.format(JGitText.get().expectedGot,
+							Arrays.toString(MAGIC), Arrays.toString(magic)));
+		}
+
+		DataInput dataIn = new SimpleDataInput(digestIn);
+		int version = dataIn.readInt();
+		switch (version) {
+		case VERSION_1:
+			return new PackReverseIndexV1(digestIn, objectCount,
+					packIndexSupplier);
+		default:
+			throw new IOException(MessageFormat.format(
+					JGitText.get().unsupportedPackReverseIndexVersion,
+					String.valueOf(version)));
+		}
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1.java
new file mode 100644
index 0000000..c77a8eb
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexV1.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2022, Google LLC and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.internal.storage.file;
+
+import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
+
+import java.io.DataInput;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.security.DigestInputStream;
+import java.text.MessageFormat;
+import java.util.Arrays;
+
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.PackMismatchException;
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.util.Hex;
+import org.eclipse.jgit.util.IO;
+
+/**
+ * Reverse index for forward pack index which is parsed from a version 1 file.
+ * <p>
+ * The file format is specified at
+ * https://git-scm.com/docs/pack-format#_pack_rev_files_have_the_format.
+ */
+final class PackReverseIndexV1 implements PackReverseIndex {
+	static final int OID_VERSION_SHA1 = 1;
+
+	static final int OID_VERSION_SHA256 = 2;
+
+	private static final int SHA1_BYTES = OBJECT_ID_LENGTH;
+
+	private final DigestInputStream inputStream;
+
+	private final DataInput dataIn;
+
+	/**
+	 * A lazy supplier for the corresponding PackIndex. The PackIndex is not
+	 * needed during instantiation and parsing, only later when querying the
+	 * reverse index. Allow lazy loading so that the parsing of the forward and
+	 * reverse indices could happen in parallel.
+	 */
+	private final PackBitmapIndex.SupplierWithIOException<PackIndex> packIndexSupplier;
+
+	private int objectCount;
+
+	private byte[] packChecksum;
+
+	private int[] indexPositionsSortedByOffset;
+
+	private PackIndex packIndex;
+
+	PackReverseIndexV1(DigestInputStream inputStream, long objectCount,
+			PackBitmapIndex.SupplierWithIOException<PackIndex> packIndexSupplier)
+			throws IOException {
+		try {
+			this.objectCount = Math.toIntExact(objectCount);
+		} catch (ArithmeticException e) {
+			throw new IllegalArgumentException(
+					JGitText.get().hugeIndexesAreNotSupportedByJgitYet);
+		}
+
+		this.inputStream = inputStream;
+		dataIn = new SimpleDataInput(inputStream);
+
+		int oid_version = dataIn.readInt();
+		switch (oid_version) {
+		case OID_VERSION_SHA1:
+			// JGit Pack only supports AnyObjectId, which represents SHA1.
+			break;
+		case OID_VERSION_SHA256:
+			throw new IOException(MessageFormat.format(
+					JGitText.get().unsupportedObjectIdVersion, "SHA256")); //$NON-NLS-1$
+		default:
+			throw new IOException(MessageFormat.format(
+					JGitText.get().unsupportedObjectIdVersion,
+					String.valueOf(oid_version)));
+		}
+
+		indexPositionsSortedByOffset = new int[this.objectCount];
+		this.packIndexSupplier = packIndexSupplier;
+
+		parseBody();
+		parseChecksums();
+	}
+
+	@Override
+	public void verifyPackChecksum(String packFilePath)
+			throws PackMismatchException {
+		if (!Arrays.equals(packChecksum, getPackIndex().getChecksum())) {
+			throw new PackMismatchException(
+					MessageFormat.format(JGitText.get().packChecksumMismatch,
+							packFilePath, PackExt.INDEX.getExtension(),
+							Hex.toHexString(getPackIndex().getChecksum()),
+							PackExt.REVERSE_INDEX.getExtension(),
+							Hex.toHexString(packChecksum)));
+		}
+	}
+
+		private void parseBody() throws IOException {
+		for (int i = 0; i < objectCount; i++) {
+			indexPositionsSortedByOffset[i] = dataIn.readInt();
+		}
+	}
+
+	private void parseChecksums() throws IOException {
+		packChecksum = new byte[SHA1_BYTES];
+		IO.readFully(inputStream, packChecksum);
+
+		// Take digest before reading the self checksum changes it.
+		byte[] observedSelfChecksum = inputStream.getMessageDigest().digest();
+
+		byte[] readSelfChecksum = new byte[SHA1_BYTES];
+		IO.readFully(inputStream, readSelfChecksum);
+
+		if (!Arrays.equals(readSelfChecksum, observedSelfChecksum)) {
+			throw new CorruptObjectException(MessageFormat.format(
+					JGitText.get().corruptReverseIndexChecksumIncorrect,
+					Hex.toHexString(readSelfChecksum),
+					Hex.toHexString(observedSelfChecksum)));
+		}
+	}
+
+	@Override
+	public ObjectId findObject(long offset) {
+		int reversePosition = findPosition(offset);
+		if (reversePosition < 0) {
+			return null;
+		}
+		int forwardPosition = findForwardPositionByReversePosition(
+				reversePosition);
+		return getPackIndex().getObjectId(forwardPosition);
+	}
+
+	@Override
+	public long findNextOffset(long offset, long maxOffset)
+			throws CorruptObjectException {
+		int position = findPosition(offset);
+		if (position < 0) {
+			throw new CorruptObjectException(MessageFormat.format(JGitText
+					.get().cantFindObjectInReversePackIndexForTheSpecifiedOffset,
+					Long.valueOf(offset)));
+		}
+		if (position + 1 == objectCount) {
+			return maxOffset;
+		}
+		return findOffsetByReversePosition(position + 1);
+	}
+
+	@Override
+	public int findPosition(long offset) {
+		return binarySearchByOffset(offset);
+	}
+
+	@Override
+	public ObjectId findObjectByPosition(int position) {
+		return getPackIndex()
+				.getObjectId(findForwardPositionByReversePosition(position));
+	}
+
+	private long findOffsetByReversePosition(int position) {
+		return getPackIndex()
+				.getOffset(findForwardPositionByReversePosition(position));
+	}
+
+	private int findForwardPositionByReversePosition(int reversePosition) {
+		assert (reversePosition >= 0);
+		assert (reversePosition < indexPositionsSortedByOffset.length);
+		return indexPositionsSortedByOffset[reversePosition];
+	}
+
+	private int binarySearchByOffset(long wantedOffset) {
+		int low = 0;
+		int high = objectCount - 1;
+		while (low <= high) {
+			int mid = (low + high) >>> 1;
+			long offsetAtMid = findOffsetByReversePosition(mid);
+			if (offsetAtMid == wantedOffset) {
+				return mid;
+			} else if (offsetAtMid > wantedOffset) {
+				high = mid - 1;
+			} else {
+				low = mid + 1;
+			}
+		}
+		return -1;
+	}
+
+	private PackIndex getPackIndex() {
+		if (packIndex == null) {
+			try {
+				packIndex = packIndexSupplier.get();
+			} catch (IOException e) {
+				throw new UncheckedIOException(e);
+			}
+		}
+		return packIndex;
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriter.java
index 4c8417b..94a4e9c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriter.java
@@ -9,6 +9,8 @@
  */
 package org.eclipse.jgit.internal.storage.file;
 
+import static org.eclipse.jgit.internal.storage.file.PackReverseIndex.VERSION_1;
+
 import java.io.BufferedOutputStream;
 import java.io.DataOutput;
 import java.io.IOException;
@@ -29,16 +31,6 @@
  */
 public abstract class PackReverseIndexWriter {
 	/**
-	 * Magic bytes that uniquely identify git reverse index files.
-	 */
-	protected static byte[] MAGIC = { 'R', 'I', 'D', 'X' };
-
-	/**
-	 * The first reverse index file version.
-	 */
-	protected static final int VERSION_1 = 1;
-
-	/**
 	 * Stream to write contents to while maintaining a checksum.
 	 */
 	protected final DigestOutputStream out;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriterV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriterV1.java
index 7630724..ff1809f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriterV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackReverseIndexWriterV1.java
@@ -9,6 +9,10 @@
  */
 package org.eclipse.jgit.internal.storage.file;
 
+import static org.eclipse.jgit.internal.storage.file.PackReverseIndex.MAGIC;
+import static org.eclipse.jgit.internal.storage.file.PackReverseIndex.VERSION_1;
+import static org.eclipse.jgit.internal.storage.file.PackReverseIndexV1.OID_VERSION_SHA1;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.List;
@@ -24,8 +28,6 @@
  * https://git-scm.com/docs/pack-format#_pack_rev_files_have_the_format.
  */
 final class PackReverseIndexWriterV1 extends PackReverseIndexWriter {
-	private static final int OID_VERSION_SHA1 = 1;
-
 	private static final int DEFAULT_OID_VERSION = OID_VERSION_SHA1;
 
 	PackReverseIndexWriterV1(final OutputStream dst) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
index 106313d..5584f13 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
@@ -98,7 +98,6 @@ class PackedBatchRefUpdate extends BatchRefUpdate {
 	  this.shouldLockLooseRefs = shouldLockLooseRefs;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void execute(RevWalk walk, ProgressMonitor monitor,
 			List<String> options) throws IOException {
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 f0676d9..912c89b 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
@@ -247,7 +247,6 @@ public SnapshottingRefDirectory createSnapshottingRefDirectory() {
 		return new SnapshottingRefDirectory(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void create() throws IOException {
 		FileUtils.mkdir(refsDir);
@@ -256,7 +255,6 @@ public void create() throws IOException {
 		newLogWriter(false).create();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		clearReferences();
@@ -267,14 +265,12 @@ private void clearReferences() {
 		packedRefs.set(NO_PACKED_REFS);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void refresh() {
 		super.refresh();
 		clearReferences();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isNameConflicting(String name) throws IOException {
 		// Cannot be nested within an existing reference.
@@ -312,7 +308,6 @@ private Ref readAndResolve(String name, RefList<Ref> packed) throws IOException
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		try {
@@ -322,7 +317,6 @@ public Ref exactRef(String name) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Map<String, Ref> exactRef(String... refs) throws IOException {
@@ -341,7 +335,6 @@ public Map<String, Ref> exactRef(String... refs) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public Ref firstExactRef(String... refs) throws IOException {
@@ -359,7 +352,6 @@ public Ref firstExactRef(String... refs) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		final RefList<LooseRef> oldLoose = looseRefs.get();
@@ -399,7 +391,6 @@ public Map<String, Ref> getRefs(String prefix) throws IOException {
 		return new RefMap(prefix, packed, upcast(loose), symbolic.toRefList());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getAdditionalRefs() throws IOException {
 		List<Ref> ret = new LinkedList<>();
@@ -534,7 +525,6 @@ private void scanOne(String name) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref peel(Ref ref) throws IOException {
 		final Ref leaf = ref.getLeaf();
@@ -585,7 +575,6 @@ void storedSymbolicRef(RefDirectoryUpdate u, FileSnapshot snapshot,
 		fireRefsChanged();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefDirectoryUpdate newUpdate(String name, boolean detach)
 			throws IOException {
@@ -609,7 +598,6 @@ RefDirectoryUpdate createRefDirectoryUpdate(Ref ref) {
 		return new RefDirectoryUpdate(this, ref);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefDirectoryRename newRename(String fromName, String toName)
 			throws IOException {
@@ -622,7 +610,6 @@ RefDirectoryRename createRefDirectoryRename(RefDirectoryUpdate from, RefDirector
 		return new RefDirectoryRename(from, to);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackedBatchRefUpdate newBatchUpdate() {
 		return new PackedBatchRefUpdate(this);
@@ -643,7 +630,6 @@ public PackedBatchRefUpdate newBatchUpdate(boolean shouldLockLooseRefs) {
 		return new PackedBatchRefUpdate(this, shouldLockLooseRefs);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean performsAtomicTransactions() {
 		return true;
@@ -724,6 +710,7 @@ void delete(RefDirectoryUpdate update) throws IOException {
 	 * @param refs
 	 *            the refs to be added. Must be fully qualified.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void pack(List<String> refs) throws IOException {
 		pack(refs, Collections.emptyMap());
@@ -868,26 +855,29 @@ LockFile lockPackedRefsOrThrow() throws IOException {
 	 * has this attributes simply return it. Otherwise create a new peeled
 	 * {@link ObjectIdRef} where Storage is set to PACKED.
 	 *
-	 * @param f
+	 * @param ref
+	 *            given ref
 	 * @return a ref for Storage PACKED having the same name, id, peeledId as f
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
-	private Ref peeledPackedRef(Ref f)
+	private Ref peeledPackedRef(Ref ref)
 			throws MissingObjectException, IOException {
-		if (f.getStorage().isPacked() && f.isPeeled()) {
-			return f;
+		if (ref.getStorage().isPacked() && ref.isPeeled()) {
+			return ref;
 		}
-		if (!f.isPeeled()) {
-			f = peel(f);
+		if (!ref.isPeeled()) {
+			ref = peel(ref);
 		}
-		ObjectId peeledObjectId = f.getPeeledObjectId();
+		ObjectId peeledObjectId = ref.getPeeledObjectId();
 		if (peeledObjectId != null) {
-			return new ObjectIdRef.PeeledTag(PACKED, f.getName(),
-					f.getObjectId(), peeledObjectId);
+			return new ObjectIdRef.PeeledTag(PACKED, ref.getName(),
+					ref.getObjectId(), peeledObjectId);
 		}
-		return new ObjectIdRef.PeeledNonTag(PACKED, f.getName(),
-				f.getObjectId());
+		return new ObjectIdRef.PeeledNonTag(PACKED, ref.getName(),
+				ref.getObjectId());
 	}
 
 	void log(boolean force, RefUpdate update, String msg, boolean deref)
@@ -1236,6 +1226,7 @@ private static boolean isSymRef(byte[] buf, int n) {
 	 *
 	 * @return {@code true} if we are currently cloning a repository
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	boolean isInClone() throws IOException {
 		return hasDanglingHead() && !packedRefsFile.exists() && !hasLooseRef();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryRename.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryRename.java
index d07299e..1c5c48a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryRename.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryRename.java
@@ -68,7 +68,6 @@ protected RefDirectory getRefDirectory() {
 		return refdb;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doRename() throws IOException {
 		if (source.getRef().isSymbolic())
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java
index 0dcb319..1dc4e30 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java
@@ -32,19 +32,16 @@ class RefDirectoryUpdate extends RefUpdate {
 		database = r;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected RefDirectory getRefDatabase() {
 		return database;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Repository getRepository() {
 		return database.getRepository();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean tryLock(boolean deref) throws IOException {
 		shouldDeref = deref;
@@ -61,7 +58,6 @@ protected boolean tryLock(boolean deref) throws IOException {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void unlock() {
 		if (lock != null) {
@@ -70,7 +66,6 @@ protected void unlock() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doUpdate(Result status) throws IOException {
 		WriteConfig wc = database.getRepository().getConfig()
@@ -112,7 +107,6 @@ private String toResultString(Result status) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doDelete(Result status) throws IOException {
 		if (getRef().getStorage() != Ref.Storage.NEW)
@@ -120,7 +114,6 @@ protected Result doDelete(Result status) throws IOException {
 		return status;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected Result doLink(String target) throws IOException {
 		WriteConfig wc = database.getRepository().getConfig()
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogEntryImpl.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogEntryImpl.java
index cb80043..6870d76 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogEntryImpl.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogEntryImpl.java
@@ -60,7 +60,6 @@ public class ReflogEntryImpl implements Serializable, ReflogEntry {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getOldId()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getOldId() {
 		return oldId;
@@ -69,7 +68,6 @@ public ObjectId getOldId() {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getNewId()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getNewId() {
 		return newId;
@@ -78,7 +76,6 @@ public ObjectId getNewId() {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getWho()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public PersonIdent getWho() {
 		return who;
@@ -87,13 +84,11 @@ public PersonIdent getWho() {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getComment()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public String getComment() {
 		return comment;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -104,7 +99,6 @@ public String toString() {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#parseCheckout()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public CheckoutEntry parseCheckout() {
 		if (getComment().startsWith(CheckoutEntryImpl.CHECKOUT_MOVING_FROM)) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogReaderImpl.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogReaderImpl.java
index 99a9e09..21b5a54 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogReaderImpl.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogReaderImpl.java
@@ -32,7 +32,9 @@ class ReflogReaderImpl implements ReflogReader {
 
 	/**
 	 * @param db
+	 *            repository to read reflogs from
 	 * @param refname
+	 *            {@code Ref} name
 	 */
 	ReflogReaderImpl(Repository db, String refname) {
 		logName = new File(db.getDirectory(), Constants.LOGS + '/' + refname);
@@ -41,7 +43,6 @@ class ReflogReaderImpl implements ReflogReader {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getLastEntry()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getLastEntry() throws IOException {
 		return getReverseEntry(0);
@@ -50,7 +51,6 @@ public ReflogEntry getLastEntry() throws IOException {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries()
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public List<ReflogEntry> getReverseEntries() throws IOException {
 		return getReverseEntries(Integer.MAX_VALUE);
@@ -59,7 +59,6 @@ public List<ReflogEntry> getReverseEntries() throws IOException {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntry(int)
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getReverseEntry(int number) throws IOException {
 		if (number < 0)
@@ -89,7 +88,6 @@ public ReflogEntry getReverseEntry(int number) throws IOException {
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries(int)
 	 */
-	/** {@inheritDoc} */
 	@Override
 	public List<ReflogEntry> getReverseEntries(int max) throws IOException {
 		final byte[] log;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java
index 7032083..b1ceb14 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java
@@ -91,6 +91,7 @@ public ReflogWriter(RefDirectory refdb, boolean forceWrite) {
 	 * Create the log directories.
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @return this writer.
 	 */
 	public ReflogWriter create() throws IOException {
@@ -110,6 +111,7 @@ public ReflogWriter create() throws IOException {
 	 *            a {@link org.eclipse.jgit.lib.ReflogEntry} object.
 	 * @return this writer
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public ReflogWriter log(String refName, ReflogEntry entry)
 			throws IOException {
@@ -132,6 +134,7 @@ public ReflogWriter log(String refName, ReflogEntry entry)
 	 *            reflog message
 	 * @return this writer
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public ReflogWriter log(String refName, ObjectId oldId,
 			ObjectId newId, PersonIdent ident, String message) throws IOException {
@@ -150,6 +153,7 @@ public ReflogWriter log(String refName, ObjectId oldId,
 	 *            whether to dereference symbolic refs
 	 * @return this writer
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public ReflogWriter log(RefUpdate update, String msg,
 			boolean deref) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataInput.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataInput.java
index 6a80519..7a564cc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataInput.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataInput.java
@@ -31,14 +31,12 @@ class SimpleDataInput implements DataInput {
 		this.fd = fd;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int readInt() throws IOException {
 		readFully(buf, 0, 4);
 		return NB.decodeInt32(buf, 0);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long readLong() throws IOException {
 		readFully(buf, 0, 8);
@@ -57,79 +55,66 @@ public long readUnsignedInt() throws IOException {
 		return NB.decodeUInt32(buf, 0);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void readFully(byte[] b) throws IOException {
 		readFully(b, 0, b.length);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void readFully(byte[] b, int off, int len) throws IOException {
 		IO.readFully(fd, b, off, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int skipBytes(int n) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean readBoolean() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte readByte() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int readUnsignedByte() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public short readShort() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int readUnsignedShort() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public char readChar() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public float readFloat() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public double readDouble() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String readLine() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String readUTF() throws IOException {
 		throw new UnsupportedOperationException();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataOutput.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataOutput.java
index d01f6b4..7484088 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataOutput.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SimpleDataOutput.java
@@ -31,88 +31,74 @@ class SimpleDataOutput implements DataOutput {
 		this.fd = fd;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeShort(int v) throws IOException {
 		NB.encodeInt16(buf, 0, v);
 		fd.write(buf, 0, 2);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeInt(int v) throws IOException {
 		NB.encodeInt32(buf, 0, v);
 		fd.write(buf, 0, 4);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeLong(long v) throws IOException {
 		NB.encodeInt64(buf, 0, v);
 		fd.write(buf, 0, 8);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, int off, int len) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeBoolean(boolean v) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeByte(int v) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeChar(int v) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeFloat(float v) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeDouble(double v) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeBytes(String s) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeChars(String s) throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeUTF(String s) throws IOException {
 		throw new UnsupportedOperationException();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectory.java
index 0b97480..767084a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/SnapshottingRefDirectory.java
@@ -67,14 +67,12 @@ PackedRefList getPackedRefs() throws IOException {
 		return packedRefs.get();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	void delete(RefDirectoryUpdate update) throws IOException {
 		refreshSnapshot();
 		super.delete(update);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefDirectoryUpdate newUpdate(String name, boolean detach)
 			throws IOException {
@@ -82,19 +80,16 @@ public RefDirectoryUpdate newUpdate(String name, boolean detach)
 		return super.newUpdate(name, detach);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackedBatchRefUpdate newBatchUpdate() {
 		return new SnapshotPackedBatchRefUpdate(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PackedBatchRefUpdate newBatchUpdate(boolean shouldLockLooseRefs) {
 		return new SnapshotPackedBatchRefUpdate(this, shouldLockLooseRefs);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	RefDirectoryUpdate newTemporaryUpdate() throws IOException {
 		refreshSnapshot();
@@ -126,6 +121,7 @@ synchronized void invalidateSnapshot() {
 	 * threads use this snapshot.
 	 *
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private synchronized void refreshSnapshot() throws IOException {
 		compareAndSetPackedRefs(packedRefs.get(), refDb.getPackedRefs());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java
index fa743ba..01f514b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java
@@ -79,13 +79,11 @@ DeltaBaseCache getDeltaBaseCache() {
 		return baseCache;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return new WindowCursor(db);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public BitmapIndex getBitmapIndex() throws IOException {
 		for (Pack pack : db.getPacks()) {
@@ -96,13 +94,11 @@ public BitmapIndex getBitmapIndex() throws IOException {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Optional<CommitGraph> getCommitGraph() {
 		return db.getCommitGraph();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<CachedPack> getCachedPacksAndUpdate(
 			BitmapBuilder needBitmap) throws IOException {
@@ -115,7 +111,6 @@ public Collection<CachedPack> getCachedPacksAndUpdate(
 		return Collections.emptyList();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<ObjectId> resolve(AbbreviatedObjectId id)
 			throws IOException {
@@ -126,13 +121,11 @@ public Collection<ObjectId> resolve(AbbreviatedObjectId id)
 		return matches;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean has(AnyObjectId objectId) throws IOException {
 		return db.has(objectId);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectLoader open(AnyObjectId objectId, int typeHint)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -149,13 +142,11 @@ public ObjectLoader open(AnyObjectId objectId, int typeHint)
 		return ldr;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<ObjectId> getShallowCommits() throws IOException {
 		return db.getShallowCommits();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getObjectSize(AnyObjectId objectId, int typeHint)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -170,13 +161,11 @@ public long getObjectSize(AnyObjectId objectId, int typeHint)
 		return sz;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LocalObjectToPack newObjectToPack(AnyObjectId objectId, int type) {
 		return new LocalObjectToPack(objectId, type);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void selectObjectRepresentation(PackWriter packer,
 			ProgressMonitor monitor, Iterable<ObjectToPack> objects)
@@ -187,7 +176,6 @@ public void selectObjectRepresentation(PackWriter packer,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
 			boolean validate) throws IOException,
@@ -196,7 +184,6 @@ public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
 		src.pack.copyAsIs(out, src, validate, this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void writeObjects(PackOutputStream out, List<ObjectToPack> list)
 			throws IOException {
@@ -240,7 +227,6 @@ int copy(final Pack pack, long position, final byte[] dstbuf,
 		return cnt - need;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void copyPackAsIs(PackOutputStream out, CachedPack pack)
 			throws IOException {
@@ -336,7 +322,6 @@ void pin(Pack pack, long position)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public ObjectInserter getCreatedFromInserter() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/BlockSource.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/BlockSource.java
index 82d07e6..58695fc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/BlockSource.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/BlockSource.java
@@ -147,7 +147,6 @@ public void adviseSequentialRead(long startPos, long endPos) {
 		// Do nothing by default.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract void close();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/CancellableDigestOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/CancellableDigestOutputStream.java
index ca2095f..ce86eab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/CancellableDigestOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/io/CancellableDigestOutputStream.java
@@ -80,7 +80,6 @@ public final long length() {
 		return count;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final void write(int b) throws IOException {
 		if (checkCancelAt <= count) {
@@ -95,7 +94,6 @@ public final void write(int b) throws IOException {
 		count++;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final void write(byte[] b, int off, int len) throws IOException {
 		while (0 < len) {
@@ -116,7 +114,6 @@ public final void write(byte[] b, int off, int len) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		out.flush();
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 1ac6627..acc1c83 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
@@ -300,6 +300,7 @@ public void clear() {
 	 * Find the key which is the longest prefix of the given query string.
 	 *
 	 * @param query
+	 *            the query string
 	 * @return the key which is the longest prefix of the given query string or
 	 *         {@code null} if none exists.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaIndex.java
index 7ed5def..b86ff7f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaIndex.java
@@ -393,7 +393,6 @@ private static int negmatch(byte[] res, int resPtr, byte[] src, int srcPtr,
 		return start - resPtr;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
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 132eb50..9a3f4b0 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
@@ -254,7 +254,6 @@ void add(Slice s) {
 		slices.add(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Object call() throws Exception {
 		or = block.templateReader.newReader();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectToPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectToPack.java
index d9013bf..ea5b946 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectToPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectToPack.java
@@ -156,7 +156,6 @@ public final boolean isWritten() {
 		return 1 < getOffset(); // markWantWrite sets 1.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return (flags >> TYPE_SHIFT) & 0x7;
@@ -357,7 +356,6 @@ public void select(StoredObjectRepresentation ref) {
 		// Empty by default.
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java
index d580083..e6daaea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java
@@ -80,7 +80,6 @@ public String getTmpExtension() {
 		return String.format(".%s_tmp", ext); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return String.format("PackExt[%s, bit=0x%s]", getExtension(), //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
index 9f8ab35..dcd360d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java
@@ -2008,8 +2008,10 @@ private void findObjectsToPack(@NonNull ProgressMonitor countingMonitor,
 		final long countingStart = System.currentTimeMillis();
 		beginPhase(PackingPhase.COUNTING, countingMonitor, ProgressMonitor.UNKNOWN);
 
-		stats.interestingObjects = Collections.unmodifiableSet(new HashSet<ObjectId>(want));
-		stats.uninterestingObjects = Collections.unmodifiableSet(new HashSet<ObjectId>(have));
+		stats.interestingObjects = Collections
+				.unmodifiableSet(new HashSet<>(want));
+		stats.uninterestingObjects = Collections
+				.unmodifiableSet(new HashSet<>(have));
 		excludeFromBitmapSelection = noBitmaps;
 
 		canBuildBitmaps = config.isBuildBitmaps()
@@ -2308,7 +2310,7 @@ private void addObject(
 
 	/**
 	 * Determines if the object should be omitted from the pack as a result of
-	 * its depth (probably because of the tree:<depth> filter).
+	 * its depth (probably because of the tree:&lt;depth&gt; filter).
 	 * <p>
 	 * Causes {@code walker} to skip traversing the current tree, which ought to
 	 * have just started traversal, assuming this method is called as soon as a
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/EmptyLogCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/EmptyLogCursor.java
index 7c06be8..8700556 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/EmptyLogCursor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/EmptyLogCursor.java
@@ -16,31 +16,26 @@
 
 /** Empty {@link LogCursor} with no results. */
 class EmptyLogCursor extends LogCursor {
-	/** {@inheritDoc} */
 	@Override
 	public boolean next() throws IOException {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getRefName() {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getUpdateIndex() {
 		return 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getReflogEntry() {
 		return null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Do nothing.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/LogCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/LogCursor.java
index f78975a..f9c701e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/LogCursor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/LogCursor.java
@@ -51,7 +51,6 @@ public abstract class LogCursor implements AutoCloseable {
 	@Nullable
 	public abstract ReflogEntry getReflogEntry();
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract void close();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java
index e210acf..aeaf241 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java
@@ -39,7 +39,6 @@ public class MergedReftable extends Reftable {
 
 	/**
 	 * Initialize a merged table reader.
-	 * <p>
 	 *
 	 * @param tableStack
 	 *            stack of tables to read from. The base of the stack is at
@@ -91,7 +90,6 @@ public long minUpdateIndex() throws IOException {
 		return minUpdateIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasObjectMap() throws IOException {
 		boolean has = true;
@@ -101,7 +99,6 @@ public boolean hasObjectMap() throws IOException {
 		return has;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor allRefs() throws IOException {
 		MergedRefCursor m = new MergedRefCursor();
@@ -111,7 +108,6 @@ public RefCursor allRefs() throws IOException {
 		return m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor seekRef(String name) throws IOException {
 		MergedRefCursor m = new MergedRefCursor();
@@ -121,7 +117,6 @@ public RefCursor seekRef(String name) throws IOException {
 		return m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor seekRefsWithPrefix(String prefix) throws IOException {
 		MergedRefCursor m = new MergedRefCursor();
@@ -131,7 +126,6 @@ public RefCursor seekRefsWithPrefix(String prefix) throws IOException {
 		return m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor byObjectId(AnyObjectId name) throws IOException {
 		MergedRefCursor m = new FilteringMergedRefCursor(name);
@@ -141,7 +135,6 @@ public RefCursor byObjectId(AnyObjectId name) throws IOException {
 		return m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LogCursor allLogs() throws IOException {
 		MergedLogCursor m = new MergedLogCursor();
@@ -151,7 +144,6 @@ public LogCursor allLogs() throws IOException {
 		return m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LogCursor seekLog(String refName, long updateIdx)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java
index 5e2c350..6cd4f6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java
@@ -58,7 +58,6 @@ public boolean wasDeleted() {
 		return r.getStorage() == Ref.Storage.NEW && r.getObjectId() == null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract void close();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java
index 63786dc..6e83778 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java
@@ -138,7 +138,7 @@ public void setIncludeDeletes(boolean deletes) {
 	public abstract RefCursor byObjectId(AnyObjectId id) throws IOException;
 
 	/**
-	 * @return whether this reftable can do a fast SHA1 => ref lookup.
+	 * @return whether this reftable can do a fast SHA1 =&gt; ref lookup.
 	 * @throws IOException on I/O problems.
 	 */
 	public abstract boolean hasObjectMap() throws IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableBatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableBatchRefUpdate.java
index dbc2ec7..38c17e3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableBatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableBatchRefUpdate.java
@@ -81,7 +81,6 @@ protected ReftableBatchRefUpdate(RefDatabase refdb, ReftableDatabase reftableDb,
 		this.repository = repository;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void execute(RevWalk rw, ProgressMonitor pm, List<String> options) {
 		List<ReceiveCommand> pending = getPending();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableOutputStream.java
index aa3aba5..86e16ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableOutputStream.java
@@ -59,14 +59,12 @@ void setBlockSize(int bs) {
 		blockSize = bs;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) {
 		ensureBytesAvailableInBlockBuf(1);
 		blockBuf[cur++] = (byte) b;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, int off, int cnt) {
 		ensureBytesAvailableInBlockBuf(cnt);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
index cabb2e1..2a73efd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
@@ -127,7 +127,6 @@ public long maxUpdateIndex() throws IOException {
 		return maxUpdateIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor allRefs() throws IOException {
 		if (blockSize == -1) {
@@ -144,7 +143,6 @@ public RefCursor allRefs() throws IOException {
 		return i;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor seekRef(String refName) throws IOException {
 		initRefIndex();
@@ -155,7 +153,6 @@ public RefCursor seekRef(String refName) throws IOException {
 		return i;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor seekRefsWithPrefix(String prefix) throws IOException {
 		initRefIndex();
@@ -166,7 +163,6 @@ public RefCursor seekRefsWithPrefix(String prefix) throws IOException {
 		return i;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RefCursor byObjectId(AnyObjectId id) throws IOException {
 		initObjIndex();
@@ -179,7 +175,6 @@ public RefCursor byObjectId(AnyObjectId id) throws IOException {
 		return i;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LogCursor allLogs() throws IOException {
 		initLogIndex();
@@ -192,7 +187,6 @@ public LogCursor allLogs() throws IOException {
 		return new EmptyLogCursor();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public LogCursor seekLog(String refName, long updateIndex)
 			throws IOException {
@@ -460,7 +454,6 @@ public long size() throws IOException {
 		return src.size();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		src.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReflogReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReflogReader.java
index f9f1def..5973033 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReflogReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReflogReader.java
@@ -34,7 +34,6 @@ public class ReftableReflogReader implements ReflogReader {
 		this.refname = refname;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getLastEntry() throws IOException {
 		lock.lock();
@@ -46,13 +45,11 @@ public ReflogEntry getLastEntry() throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<ReflogEntry> getReverseEntries() throws IOException {
 		return getReverseEntries(Integer.MAX_VALUE);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getReverseEntry(int number) throws IOException {
 		lock.lock();
@@ -72,7 +69,6 @@ public ReflogEntry getReverseEntry(int number) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public List<ReflogEntry> getReverseEntries(int max) throws IOException {
 		lock.lock();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java
index d0e2441..ff8308d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/submodule/SubmoduleValidator.java
@@ -45,8 +45,8 @@ public static class SubmoduleValidationException extends Exception {
 		 * @param message
 		 *            Description of the problem
 		 * @param fsckMessageId
-		 *            Error identifier, following the git fsck fsck.<msg-id>
-		 *            format
+		 *            Error identifier, following the git fsck
+		 *            fsck.&lt;msg-id&gt; format
 		 */
 		SubmoduleValidationException(String message,
 				ObjectChecker.ErrorType fsckMessageId) {
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 659ccb8..29a2922 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
@@ -1154,7 +1154,6 @@ public String substitute(String input, String allowed,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbrevConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbrevConfig.java
index 9109cfd..c3dffdf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbrevConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbrevConfig.java
@@ -19,7 +19,7 @@
 
 /**
  * Git configuration option <a
- * href=https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreabbrev">
+ * href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreabbrev">
  * core.abbrev</a>
  *
  * @since 6.1
@@ -100,6 +100,7 @@ public static AbbrevConfig parseFromConfig(Repository repo)
 	 * object names to stay unique for some time.
 	 *
 	 * @param repo
+	 *            the repository the AbbrevConfig shall be computed for
 	 * @return appropriate value computed based on the approximate number of
 	 *         packed objects in a repository
 	 */
@@ -128,7 +129,10 @@ private static AbbrevConfig auto(Repository repo) {
 	private int abbrev;
 
 	/**
+	 * Create an {@code AbbrevConfig}
+	 *
 	 * @param abbrev
+	 *            abbreviation length
 	 */
 	private AbbrevConfig(int abbrev) {
 		this.abbrev = capAbbrev(abbrev);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
index dc5e5cc..a13136b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
@@ -321,13 +321,11 @@ private int mask(int word, int v) {
 		return mask(nibbles, word, v);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return w1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof AbbreviatedObjectId) {
@@ -366,7 +364,6 @@ public final String name() {
 		return new String(b, 0, nibbles);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
index 7685b30..c58133a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
@@ -248,7 +248,6 @@ public boolean startsWith(AbbreviatedObjectId abbr) {
 		return abbr.prefixCompare(this) == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int hashCode() {
 		return w2;
@@ -266,7 +265,6 @@ public final boolean equals(AnyObjectId other) {
 		return other != null ? isEqual(this, other) : false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final boolean equals(Object o) {
 		if (o instanceof AnyObjectId) {
@@ -477,7 +475,6 @@ static void formatHexChar(char[] dst, int p, int w) {
 			dst[o--] = '0';
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
index d2367cc..f995250 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
@@ -716,7 +716,6 @@ protected boolean isForceRefLog(ReceiveCommand cmd) {
 				: isForceRefLog();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchingProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchingProgressMonitor.java
index f826057..8e92f20 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchingProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchingProgressMonitor.java
@@ -47,13 +47,11 @@ public void setDelayStart(long time, TimeUnit unit) {
 		delayStartUnit = unit;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		// Ignore the number of tasks.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int work) {
 		endTask();
@@ -62,14 +60,12 @@ public void beginTask(String title, int work) {
 			task.delay(delayStartTime, delayStartUnit);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void update(int completed) {
 		if (task != null)
 			task.update(this, completed);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endTask() {
 		if (task != null) {
@@ -78,7 +74,6 @@ public void endTask() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java
index 6c625bb..39fc566 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java
@@ -33,6 +33,7 @@ public class BranchTrackingStatus {
 	 *            the local branch
 	 * @return the tracking status, or null if it is not known
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static BranchTrackingStatus of(Repository repository, String branchName)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitBuilder.java
index 1665f05..ea33082 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitBuilder.java
@@ -275,7 +275,6 @@ public void setEncoding(String encodingName) {
 		return build();
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
index d1d66d2..0cccaec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
@@ -399,6 +399,8 @@ public boolean getBoolean(final String section, String subsection,
 	/**
 	 * Parse an enumeration from the configuration.
 	 *
+	 * @param <T>
+	 *            type of the returned enum
 	 * @param section
 	 *            section the key is grouped within.
 	 * @param subsection
@@ -431,6 +433,8 @@ public <T extends Enum<?>> T getEnum(final String section,
 	/**
 	 * Parse an enumeration from the configuration.
 	 *
+	 * @param <T>
+	 *            type of the returned enum
 	 * @param all
 	 *            all possible values in the enumeration which should be
 	 *            recognized. Typically {@code EnumType.values()}.
@@ -722,7 +726,7 @@ public ListenerHandle addChangeListener(ConfigChangedListener listener) {
 	 * responsible for issuing {@link #fireConfigChangedEvent()} calls
 	 * themselves.
 	 *
-	 * @return <code></code>
+	 * @return whether to issue change events for transient changes
 	 */
 	protected boolean notifyUponTransientChanges() {
 		return true;
@@ -847,6 +851,8 @@ public void setBoolean(final String section, final String subsection,
 	 *         name = value
 	 * </pre>
 	 *
+	 * @param <T>
+	 *            type of the enum to set
 	 * @param section
 	 *            section name, e.g "branch"
 	 * @param subsection
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java
index 4c080f4..7776b00 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java
@@ -60,7 +60,8 @@ public final class ConfigConstants {
 	public static final String CONFIG_KEY_PROMPT = "prompt";
 
 	/**
-	 * The "trustExitCode" key within "difftool" or "mergetool.<name>." section
+	 * The "trustExitCode" key within "difftool" or "mergetool.&lt;name&gt;."
+	 * section
 	 *
 	 * @since 6.1
 	 */
@@ -108,6 +109,7 @@ public final class ConfigConstants {
 
 	/**
 	 * The "fetch" section
+	 *
 	 * @since 3.3
 	 */
 	public static final String CONFIG_FETCH_SECTION = "fetch";
@@ -946,4 +948,25 @@ public final class ConfigConstants {
 	 * @since 5.13.2
 	 */
 	public static final String CONFIG_KEY_PRUNE_PRESERVED = "prunepreserved";
+
+	/**
+	 * The "commitGraph" section
+	 *
+	 * @since 6.7
+	 */
+	public static final String CONFIG_COMMIT_GRAPH_SECTION = "commitGraph";
+
+	/**
+	 * The "writeChangedPaths" key
+	 *
+	 * @since 6.7
+	 */
+	public static final String CONFIG_KEY_WRITE_CHANGED_PATHS = "writeChangedPaths";
+
+	/**
+	 * The "readChangedPaths" key
+	 *
+	 * @since 6.7
+	 */
+	public static final String CONFIG_KEY_READ_CHANGED_PATHS = "readChangedPaths";
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigLine.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigLine.java
index a9235eb..e9a8b44 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigLine.java
@@ -83,7 +83,6 @@ private static boolean eqSameCase(String a, String b) {
 		return a.equals(b);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
index 0b8bf8c..60a23dd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
@@ -337,9 +337,9 @@ public final class Constants {
 	public static final String GIT_CONFIG_NOSYSTEM_KEY = "GIT_CONFIG_NOSYSTEM";
 
 	/**
-	 * The key of the XDG_CONFIG_HOME directory defined in the XDG base
-	 * directory specification, see
-	 * {@link "https://wiki.archlinux.org/index.php/XDG_Base_Directory"}
+	 * The key of the XDG_CONFIG_HOME directory defined in the
+	 * <a href="https://wiki.archlinux.org/index.php/XDG_Base_Directory">
+	 * XDG Base Directory specification</a>.
 	 *
 	 * @since 5.5.2
 	 */
@@ -766,7 +766,7 @@ public static int decodeTypeString(final AnyObjectId id,
 	 *
 	 * @since 6.5
 	 */
-	public static int COMMIT_GENERATION_UNKNOWN = Integer.MAX_VALUE;
+	public static final int COMMIT_GENERATION_UNKNOWN = Integer.MAX_VALUE;
 
 	/**
 	 * If a commit-graph file was written by a version of Git that did not
@@ -775,7 +775,7 @@ public static int decodeTypeString(final AnyObjectId id,
 	 *
 	 * @since 6.5
 	 */
-	public static int COMMIT_GENERATION_NOT_COMPUTED = 0;
+	public static final int COMMIT_GENERATION_NOT_COMPUTED = 0;
 
 	private Constants() {
 		// Hide the default constructor
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
index 8640940..80aceb4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
@@ -31,7 +31,6 @@
  */
 public class DefaultTypedConfigGetter implements TypedConfigGetter {
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean getBoolean(Config config, String section, String subsection,
 			String name, boolean defaultValue) {
@@ -50,7 +49,6 @@ public boolean getBoolean(Config config, String section, String subsection,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public <T extends Enum<?>> T getEnum(Config config, T[] all, String section,
 			String subsection, String name, T defaultValue) {
@@ -106,7 +104,6 @@ public <T extends Enum<?>> T getEnum(Config config, T[] all, String section,
 				JGitText.get().enumValueNotSupported2, section, name, value));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getInt(Config config, String section, String subsection,
 			String name, int defaultValue) {
@@ -118,7 +115,6 @@ public int getInt(Config config, String section, String subsection,
 				.format(JGitText.get().integerValueOutOfRange, section, name));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getIntInRange(Config config, String section, String subsection,
 			String name, int minValue, int maxValue, int defaultValue) {
@@ -138,7 +134,6 @@ public int getIntInRange(Config config, String section, String subsection,
 				Integer.valueOf(minValue), Integer.valueOf(maxValue)));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getLong(Config config, String section, String subsection,
 			String name, long defaultValue) {
@@ -158,7 +153,6 @@ public long getLong(Config config, String section, String subsection,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long getTimeUnit(Config config, String section, String subsection,
 			String name, long defaultValue, TimeUnit wantUnit) {
@@ -269,7 +263,6 @@ private static IllegalArgumentException notTimeUnit(String section,
 						section, name, valueString));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public List<RefSpec> getRefSpecs(Config config, String section,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/EmptyProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/EmptyProgressMonitor.java
index 94d28eb..a5410b7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/EmptyProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/EmptyProgressMonitor.java
@@ -18,31 +18,26 @@
  */
 public abstract class EmptyProgressMonitor implements ProgressMonitor {
 
-	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		// empty
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int totalWork) {
 		// empty
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void update(int completed) {
 		// empty
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endTask() {
 		// empty
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgSignature.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgSignature.java
index e78cf16..4018dab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgSignature.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgSignature.java
@@ -49,7 +49,6 @@ public String toExternalString() {
 		return new String(signature, US_ASCII);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
index df9fd47..b009ea1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
@@ -265,6 +265,7 @@ public TreeFilter clone() {
 	 * @param workingTreeIterator
 	 *            iterator for working directory
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public IndexDiff(Repository repository, String revstr,
 			WorkingTreeIterator workingTreeIterator) throws IOException {
@@ -281,6 +282,7 @@ public IndexDiff(Repository repository, String revstr,
 	 * @param workingTreeIterator
 	 *            iterator for working directory
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public IndexDiff(Repository repository, ObjectId objectId,
 			WorkingTreeIterator workingTreeIterator) throws IOException {
@@ -325,6 +327,7 @@ public interface WorkingTreeIteratorFactory {
 	 * Allows higher layers to set the factory for WorkingTreeIterators.
 	 *
 	 * @param wTreeIt
+	 *            working tree iterator factory
 	 * @since 3.6
 	 */
 	public void setWorkingTreeItFactory(WorkingTreeIteratorFactory wTreeIt) {
@@ -349,6 +352,7 @@ public void setFilter(TreeFilter filter) {
 	 *
 	 * @return if anything is different between index, tree, and workdir
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public boolean diff() throws IOException {
 		return diff(null);
@@ -372,6 +376,7 @@ public boolean diff() throws IOException {
 	 *            {@link RepositoryBuilder}.
 	 * @return if anything is different between index, tree, and workdir
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.6
 	 */
 	public boolean diff(RepositoryBuilderFactory factory)
@@ -395,9 +400,11 @@ public boolean diff(RepositoryBuilderFactory factory)
 	 *            number or estimated files in the working tree
 	 * @param estIndexSize
 	 *            number of estimated entries in the cache
-	 * @param title a {@link java.lang.String} object.
+	 * @param title
+	 *            a {@link java.lang.String} object.
 	 * @return if anything is different between index, tree, and workdir
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize,
 			int estIndexSize, final String title)
@@ -436,6 +443,7 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize,
 	 *            {@link RepositoryBuilder}.
 	 * @return if anything is different between index, tree, and workdir
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.6
 	 */
 	public boolean diff(ProgressMonitor monitor, int estWorkTreeSize,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
index 4a712ba..6a35ded 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
@@ -242,7 +242,6 @@ private void fromHexString(byte[] bs, int p) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId toObjectId() {
 		return new ObjectId(this);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/NullProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/NullProgressMonitor.java
index 127cca9..0a4db2a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/NullProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/NullProgressMonitor.java
@@ -23,31 +23,26 @@ private NullProgressMonitor() {
 		// Do not let others instantiate
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		// Do not report.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int totalWork) {
 		// Do not report.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void update(int completed) {
 		// Do not report.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endTask() {
 		// Do not report.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectBuilder.java
index 4b7054f..064d89e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectBuilder.java
@@ -72,7 +72,6 @@ protected void setAuthor(PersonIdent newAuthor) {
 	 * <li>create {@link GpgSignature} from payload</li>
 	 * <li>set {@link GpgSignature}</li>
 	 * </ol>
-	 * </p>
 	 *
 	 * @param gpgSignature
 	 *            the signature to set or {@code null} to unset
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
index 9e9ef88..a1d6d92 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
@@ -1065,6 +1065,7 @@ && toLower(buf[p + 1]) == 'i'
 	 *
 	 * @return true if the filename in buf could be a ".gitmodules" file
 	 * @throws CorruptObjectException
+	 *             if an object is corrupt
 	 */
 	private boolean isGitmodules(byte[] buf, int start, int end, @Nullable AnyObjectId id)
 			throws CorruptObjectException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
index 269049f..1c31263 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
@@ -262,7 +262,6 @@ protected ObjectId(AnyObjectId src) {
 		w5 = src.w5;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId toObjectId() {
 		return this;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java
index 2903909..a74fddf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java
@@ -128,8 +128,11 @@ public boolean contains(AnyObjectId toFind) {
 	 * <p>
 	 * An existing mapping for <b>must not</b> be in this map. Callers must
 	 * first call {@link #get(AnyObjectId)} to verify there is no current
-	 * mapping prior to adding a new mapping, or use {@link #addIfAbsent(Entry)}.
+	 * mapping prior to adding a new mapping, or use
+	 * {@link #addIfAbsent(Entry)}.
 	 *
+	 * @param <Q>
+	 *            type of values
 	 * @param newValue
 	 *            the object to store.
 	 */
@@ -157,6 +160,8 @@ public <Q extends V> void add(Q newValue) {
 	 * boolean wasNew = map.addIfAbsent(obj) == obj;
 	 * </pre>
 	 *
+	 * @param <Q>
+	 *            type of values
 	 * @param newValue
 	 *            the object to store.
 	 * @return {@code newValue} if stored, or the prior value already stored and
@@ -199,7 +204,6 @@ public boolean isEmpty() {
 		return size == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<V> iterator() {
 		return new Iterator<>() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
index a04ca68..c3c5837 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
@@ -204,41 +204,35 @@ protected ObjectIdRef(@NonNull Storage st, @NonNull String name,
 		this.updateIndex = updateIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public String getName() {
 		return name;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isSymbolic() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Ref getLeaf() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Ref getTarget() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public ObjectId getObjectId() {
 		return objectId;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Storage getStorage() {
@@ -257,7 +251,6 @@ public long getUpdateIndex() {
 		return updateIndex;
 	}
 
-	/** {@inheritDoc} */
 	@NonNull
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
index 0e015b6..d4acfd4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
@@ -96,6 +96,8 @@ public boolean contains(AnyObjectId toFind) {
 	 * mapping prior to adding a new mapping, or use
 	 * {@link #addIfAbsent(ObjectId)}.
 	 *
+	 * @param <Q>
+	 *            type of values
 	 * @param newValue
 	 *            the object to store.
 	 */
@@ -117,6 +119,8 @@ public <Q extends V> void add(Q newValue) {
 	 * boolean wasNew = map.addIfAbsent(obj) == obj;
 	 * </pre>
 	 *
+	 * @param <Q>
+	 *            type of values
 	 * @param newValue
 	 *            the object to store.
 	 * @return {@code newValue} if stored, or the prior value already stored and
@@ -162,7 +166,6 @@ public boolean isEmpty() {
 		return size == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<V> iterator() {
 		return new Iterator<>() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java
index 69b2b51..3e29985 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java
@@ -245,12 +245,15 @@ public abstract ObjectLoader open(AnyObjectId objectId, int typeHint)
 	 *
 	 * @return IDs of shallow commits
 	 * @throws java.io.IOException
+	 *             if an error occurred
 	 */
 	public abstract Set<ObjectId> getShallowCommits() throws IOException;
 
 	/**
 	 * Asynchronous object opening.
 	 *
+	 * @param <T>
+	 *            type of {@code ObjectId}
 	 * @param objectIds
 	 *            objects to open from the object store. The supplied collection
 	 *            must not be modified until the queue has finished.
@@ -370,6 +373,8 @@ public boolean isNotLargerThan(AnyObjectId objectId, int typeHint, long size)
 	/**
 	 * Asynchronous object size lookup.
 	 *
+	 * @param <T>
+	 *            type of {@code ObjectId}
 	 * @param objectIds
 	 *            objects to get the size of from the object store. The supplied
 	 *            collection must not be modified until the queue has finished.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
index 9371029..3ba055a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
@@ -392,7 +392,6 @@ public int hashCode() {
 		return hc;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof PersonIdent) {
@@ -421,7 +420,6 @@ public String toExternalString() {
 		return r.toString();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
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 a4cd1d6..c716f46 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
@@ -55,6 +55,7 @@ public RebaseTodoFile(Repository repo) {
 	 *            <code>true</code> if also comments should be reported
 	 * @return the list of steps
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public List<RebaseTodoLine> readRebaseTodo(String path,
 			boolean includeComments) throws IOException {
@@ -126,8 +127,11 @@ private static void parseComments(byte[] buf, int tokenBegin,
 	 * Skip leading space, tab, CR and LF characters
 	 *
 	 * @param buf
+	 *            byte buffer
 	 * @param tokenBegin
+	 *            index of token begin
 	 * @param lineEnd
+	 *            index of line end
 	 * @return the token within the range of the given {@code buf} that doesn't
 	 *         need to be skipped, {@code -1} if no such token found within the
 	 *         range (i.e. empty line)
@@ -193,6 +197,7 @@ private static RebaseTodoLine parseLine(byte[] buf, int tokenBegin,
 	 * @param append
 	 *            whether to append to an existing file or to write a new file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeRebaseTodoFile(String path, List<RebaseTodoLine> steps,
 			boolean append) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java
index 8b77849..878cfc8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java
@@ -70,6 +70,7 @@ public String toString() {
 
 		/**
 		 * @param token
+		 *            token to parse
 		 * @return the Action
 		 */
 		public static Action parse(String token) {
@@ -245,7 +246,6 @@ public String getComment() {
 		return comment;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
index 3ab64934..c4c0001 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
@@ -27,7 +27,6 @@ public class RefComparator implements Comparator<Ref> {
 	/** Singleton instance of RefComparator */
 	public static final RefComparator INSTANCE = new RefComparator();
 
-	/** {@inheritDoc} */
 	@Override
 	public int compare(Ref o1, Ref o2) {
 		return compareTo(o1, o2);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
index 98089fb..82dcc6b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
@@ -136,6 +136,7 @@ public boolean hasVersioning() {
 	 *         with the passed ref name; empty collection when there are no
 	 *         conflicts
 	 * @throws java.io.IOException
+	 *             if an error occurred
 	 * @since 2.3
 	 * @see #isNameConflicting(String)
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefRename.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefRename.java
index cdd4e4b..e8821d0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefRename.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefRename.java
@@ -122,6 +122,7 @@ public Result getResult() {
 	 *
 	 * @return the result of the new ref update
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public Result rename() throws IOException {
 		try {
@@ -138,6 +139,7 @@ public Result rename() throws IOException {
 	 *
 	 * @return the result of the rename operation.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected abstract Result doRename() throws IOException;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
index d1be63b..d113243 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
@@ -115,7 +115,6 @@ public enum Result {
 
 		/**
 		 * The ref was renamed from another name
-		 * <p>
 		 */
 		RENAMED,
 
@@ -245,6 +244,7 @@ protected RefUpdate(Ref ref) {
 	 *            a {@link org.eclipse.jgit.lib.RefUpdate.Result} object.
 	 * @return {@code result}
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected abstract Result doUpdate(Result desiredResult) throws IOException;
 
@@ -255,6 +255,7 @@ protected RefUpdate(Ref ref) {
 	 *            a {@link org.eclipse.jgit.lib.RefUpdate.Result} object.
 	 * @return {@code result}
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected abstract Result doDelete(Result desiredResult) throws IOException;
 
@@ -265,6 +266,7 @@ protected RefUpdate(Ref ref) {
 	 *            a {@link java.lang.String} object.
 	 * @return {@link org.eclipse.jgit.lib.RefUpdate.Result#NEW} on success.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected abstract Result doLink(String target) throws IOException;
 
@@ -612,6 +614,7 @@ Result execute(Result status) throws IOException {
 	 *
 	 * @return the result status of the delete.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public Result delete() throws IOException {
 		try (RevWalk rw = new RevWalk(getRepository())) {
@@ -628,6 +631,7 @@ public Result delete() throws IOException {
 	 *            the merge test. The walk will be reset to perform the test.
 	 * @return the result status of the delete.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public Result delete(RevWalk walk) throws IOException {
 		final String myName = detachingSymbolicRef
@@ -668,6 +672,7 @@ Result execute(Result status) throws IOException {
 	 * @return {@link org.eclipse.jgit.lib.RefUpdate.Result#NEW} or
 	 *         {@link org.eclipse.jgit.lib.RefUpdate.Result#FORCED} on success.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public Result link(String target) throws IOException {
 		if (!target.startsWith(Constants.R_REFS))
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java
index d2c3f9d..41917f8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java
@@ -177,6 +177,7 @@ public void writePackedRefs() throws IOException {
 	 * @param content
 	 *            byte content of file to be written.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected abstract void writeFile(String file, byte[] content)
 			throws IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogReader.java
index 1e6a661..5233bfc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogReader.java
@@ -25,6 +25,7 @@ public interface ReflogReader {
 	 *
 	 * @return the latest reflog entry, or null if no log
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	ReflogEntry getLastEntry() throws IOException;
 
@@ -33,6 +34,7 @@ public interface ReflogReader {
 	 *
 	 * @return all reflog entries in reverse order
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	List<ReflogEntry> getReverseEntries() throws IOException;
 
@@ -40,9 +42,11 @@ public interface ReflogReader {
 	 * Get specific entry in the reflog relative to the last entry which is
 	 * considered entry zero.
 	 *
-	 * @param number a int.
+	 * @param number
+	 *            a int.
 	 * @return reflog entry or null if not found
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	ReflogEntry getReverseEntry(int number) throws IOException;
 
@@ -53,6 +57,7 @@ public interface ReflogReader {
 	 *            max number of entries to read
 	 * @return all reflog entries in reverse order
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	List<ReflogEntry> getReverseEntries(int max) throws IOException;
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
index db2571c..d446a1c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -175,6 +175,7 @@ public void fireEvent(RepositoryEvent<?> event) {
 	 * the same as {@code create(false)}.
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @see #create(boolean)
 	 */
 	public void create() throws IOException {
@@ -484,11 +485,14 @@ public ObjectId resolve(String revstr)
 	 * Thus this method can be used to process an expression to a method that
 	 * expects a branch or revision id.
 	 *
-	 * @param revstr a {@link java.lang.String} object.
+	 * @param revstr
+	 *            a {@link java.lang.String} object.
 	 * @return object id or ref name from resolved expression or {@code null} if
 	 *         given expression cannot be resolved
 	 * @throws org.eclipse.jgit.errors.AmbiguousObjectException
+	 *             if a shortened ObjectId was ambiguous
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	public String simplify(String revstr)
@@ -968,7 +972,6 @@ protected void doClose() {
 		getRefDatabase().close();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public String toString() {
@@ -999,6 +1002,7 @@ public String toString() {
 	 *         {@code null} if the repository is corrupt and has no HEAD
 	 *         reference.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	public String getFullBranch() throws IOException {
@@ -1027,6 +1031,7 @@ public String getFullBranch() throws IOException {
 	 *         in hex format if the current branch is detached, or {@code null}
 	 *         if the repository is corrupt and has no HEAD reference.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	@Nullable
 	public String getBranch() throws IOException {
@@ -1056,6 +1061,7 @@ public String getBranch() throws IOException {
 	 *
 	 * @return unmodifiable collection of other known objects.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@NonNull
 	public Set<ObjectId> getAdditionalHaves() throws IOException {
@@ -1066,11 +1072,12 @@ public Set<ObjectId> getAdditionalHaves() throws IOException {
 	 * Get a ref by name.
 	 *
 	 * @param name
-	 *            the name of the ref to lookup. Must not be a short-hand
-	 *            form; e.g., "master" is not automatically expanded to
+	 *            the name of the ref to lookup. Must not be a short-hand form;
+	 *            e.g., "master" is not automatically expanded to
 	 *            "refs/heads/master".
 	 * @return the Ref with the given name, or {@code null} if it does not exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	@Nullable
@@ -1087,6 +1094,7 @@ public final Ref exactRef(String name) throws IOException {
 	 *            "refs/heads/master" if "refs/heads/master" already exists.
 	 * @return the Ref with the given name, or {@code null} if it does not exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	@Nullable
@@ -1162,6 +1170,7 @@ public Ref peel(Ref ref) {
 	 *
 	 * @return a map with all objects referenced by a peeled ref.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@NonNull
 	public Map<AnyObjectId, Set<Ref>> getAllRefsByPeeledObjectId()
@@ -1579,6 +1588,7 @@ public File getWorkTree() throws NoWorkTreeException {
 	 * changes are detected.
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public abstract void scanForRepoChanges() throws IOException;
 
@@ -1703,6 +1713,7 @@ public abstract ReflogReader getReflogReader(String refName)
 	 * @return a {@link org.eclipse.jgit.lib.ReflogReader} for the supplied ref,
 	 *         or {@code null} if the ref does not exist.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 5.13.2
 	 */
 	public @Nullable ReflogReader getReflogReader(@NonNull	Ref ref)
@@ -1718,6 +1729,7 @@ public abstract ReflogReader getReflogReader(String refName)
 	 * @return a String containing the content of the MERGE_MSG file or
 	 *         {@code null} if this file doesn't exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1737,6 +1749,7 @@ public String readMergeCommitMsg() throws IOException, NoWorkTreeException {
 	 *            the message which should be written or <code>null</code> to
 	 *            delete the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeMergeCommitMsg(String msg) throws IOException {
 		File mergeMsgFile = new File(gitDir, Constants.MERGE_MSG);
@@ -1751,6 +1764,7 @@ public void writeMergeCommitMsg(String msg) throws IOException {
 	 * @return a String containing the content of the COMMIT_EDITMSG file or
 	 *         {@code null} if this file doesn't exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1770,6 +1784,7 @@ public String readCommitEditMsg() throws IOException, NoWorkTreeException {
 	 *            the message which should be written or {@code null} to delete
 	 *            the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.0
 	 */
 	public void writeCommitEditMsg(String msg) throws IOException {
@@ -1786,6 +1801,7 @@ public void writeCommitEditMsg(String msg) throws IOException {
 	 *         {@code null} if this file doesn't exist. Also if the file exists
 	 *         but is empty {@code null} will be returned
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1818,6 +1834,7 @@ public List<ObjectId> readMergeHeads() throws IOException, NoWorkTreeException {
 	 *            a list of commits which IDs should be written to
 	 *            $GIT_DIR/MERGE_HEAD or <code>null</code> to delete the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeMergeHeads(List<? extends ObjectId> heads) throws IOException {
 		writeHeadsFile(heads, Constants.MERGE_HEAD);
@@ -1830,6 +1847,7 @@ public void writeMergeHeads(List<? extends ObjectId> heads) throws IOException {
 	 *         doesn't exist. Also if the file exists but is empty {@code null}
 	 *         will be returned
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1854,6 +1872,7 @@ public ObjectId readCherryPickHead() throws IOException,
 	 *         doesn't exist. Also if the file exists but is empty {@code null}
 	 *         will be returned
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1877,6 +1896,7 @@ public ObjectId readRevertHead() throws IOException, NoWorkTreeException {
 	 *            an object id of the cherry commit or <code>null</code> to
 	 *            delete the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeCherryPickHead(ObjectId head) throws IOException {
 		List<ObjectId> heads = (head != null) ? Collections.singletonList(head)
@@ -1892,6 +1912,7 @@ public void writeCherryPickHead(ObjectId head) throws IOException {
 	 *            an object id of the revert commit or <code>null</code> to
 	 *            delete the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeRevertHead(ObjectId head) throws IOException {
 		List<ObjectId> heads = (head != null) ? Collections.singletonList(head)
@@ -1906,6 +1927,7 @@ public void writeRevertHead(ObjectId head) throws IOException {
 	 *            an object id of the original HEAD commit or <code>null</code>
 	 *            to delete the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeOrigHead(ObjectId head) throws IOException {
 		List<ObjectId> heads = head != null ? Collections.singletonList(head)
@@ -1920,6 +1942,7 @@ public void writeOrigHead(ObjectId head) throws IOException {
 	 *         doesn't exist. Also if the file exists but is empty {@code null}
 	 *         will be returned
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1941,6 +1964,7 @@ public ObjectId readOrigHead() throws IOException, NoWorkTreeException {
 	 * @return a String containing the content of the SQUASH_MSG file or
 	 *         {@code null} if this file doesn't exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1960,6 +1984,7 @@ public String readSquashCommitMsg() throws IOException {
 	 *            the message which should be written or <code>null</code> to
 	 *            delete the file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void writeSquashCommitMsg(String msg) throws IOException {
 		File squashMsgFile = new File(gitDir, Constants.SQUASH_MSG);
@@ -1997,9 +2022,11 @@ private void writeCommitMsg(File msgFile, String msg) throws IOException {
 	 * Read a file from the git directory.
 	 *
 	 * @param filename
+	 *            the file to read
 	 * @return the raw contents or {@code null} if the file doesn't exist or is
 	 *         empty
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private byte[] readGitDirectoryFile(String filename) throws IOException {
 		File file = new File(getDirectory(), filename);
@@ -2021,8 +2048,11 @@ private void writeCommitMsg(File msgFile, String msg) throws IOException {
 	 *            a list of object ids to write or null if the file should be
 	 *            deleted.
 	 * @param filename
+	 *            name of the file to write heads to
 	 * @throws FileNotFoundException
+	 *             if the heads file couldn't be found
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void writeHeadsFile(List<? extends ObjectId> heads, String filename)
 			throws FileNotFoundException, IOException {
@@ -2052,6 +2082,7 @@ private void writeHeadsFile(List<? extends ObjectId> heads, String filename)
 	 *            <code>true</code> if also comments should be reported
 	 * @return the list of steps
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.2
 	 */
 	@NonNull
@@ -2072,6 +2103,7 @@ public List<RebaseTodoLine> readRebaseTodo(String path,
 	 * @param append
 	 *            whether to append to an existing file or to write a new file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.2
 	 */
 	public void writeRebaseTodoFile(String path, List<RebaseTodoLine> steps,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/StoredConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/StoredConfig.java
index 9ddfd59..a10eb0c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/StoredConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/StoredConfig.java
@@ -57,7 +57,6 @@ public StoredConfig(Config defaultConfig) {
 	 */
 	public abstract void save() throws IOException;
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		super.clear();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
index 3ba3342..6fb8f32 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
@@ -59,20 +59,17 @@ public SymbolicRef(@NonNull String refName, @NonNull Ref target,
 		this.updateIndex = updateIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public String getName() {
 		return name;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isSymbolic() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Ref getLeaf() {
@@ -82,35 +79,30 @@ public Ref getLeaf() {
 		return dst;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Ref getTarget() {
 		return target;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public ObjectId getObjectId() {
 		return getLeaf().getObjectId();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Storage getStorage() {
 		return Storage.LOOSE;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public ObjectId getPeeledObjectId() {
 		return getLeaf().getPeeledObjectId();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isPeeled() {
 		return getLeaf().isPeeled();
@@ -128,7 +120,6 @@ public long getUpdateIndex() {
 		return updateIndex;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TagBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TagBuilder.java
index facb4a5..bbc6144 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TagBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TagBuilder.java
@@ -223,7 +223,6 @@ public void setTagger(PersonIdent taggerIdent) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TextProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TextProgressMonitor.java
index 85aa0b6..98ea2f9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TextProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TextProgressMonitor.java
@@ -45,7 +45,6 @@ public TextProgressMonitor(Writer out) {
 		this.write = true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int workCurr, Duration duration) {
 		StringBuilder s = new StringBuilder();
@@ -53,7 +52,6 @@ protected void onUpdate(String taskName, int workCurr, Duration duration) {
 		send(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int workCurr, Duration duration) {
 		StringBuilder s = new StringBuilder();
@@ -73,7 +71,6 @@ private void format(StringBuilder s, String taskName, int workCurr,
 		appendDuration(s, duration);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt,
 			Duration duration) {
@@ -82,7 +79,6 @@ protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt,
 		send(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int cmp, int totalWork, int pcnt,
 			Duration duration) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ThreadSafeProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ThreadSafeProgressMonitor.java
index e553955..05eacdc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ThreadSafeProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ThreadSafeProgressMonitor.java
@@ -55,7 +55,6 @@ public ThreadSafeProgressMonitor(ProgressMonitor pm) {
 		this.process = new Semaphore(0);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		if (!isMainThread())
@@ -63,7 +62,6 @@ public void start(int totalTasks) {
 		pm.start(totalTasks);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int totalWork) {
 		if (!isMainThread())
@@ -132,14 +130,12 @@ private void doUpdates() {
 			pm.update(cnt);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void update(int completed) {
 		if (0 == pendingUpdates.getAndAdd(completed))
 			process.release();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		lock.lock();
@@ -150,7 +146,6 @@ public boolean isCancelled() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void endTask() {
 		if (!isMainThread())
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
index e1f8684..c3c170a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
@@ -332,7 +332,6 @@ public ObjectId computeId(ObjectInserter ins) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
index c4eb8f1..0c03adc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
@@ -57,6 +57,8 @@ boolean getBoolean(Config config, String section, String subsection,
 	/**
 	 * Parse an enumeration from a git {@link Config}.
 	 *
+	 * @param <T>
+	 *            type of the enum
 	 * @param config
 	 *            to get the value from
 	 * @param all
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java
index e44970a..1ddac18 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java
@@ -79,14 +79,12 @@ boolean isBeginln() {
 		return bol;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int val) throws IOException {
 		out.write(val);
 		bol = (val == '\n');
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf, int pos, int cnt) throws IOException {
 		if (cnt > 0) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java
index 8060735..b902492 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java
@@ -90,10 +90,16 @@ private static boolean isEndEdit(Edit edit) {
 	/**
 	 * Does the three way merge between a common base and two sequences.
 	 *
-	 * @param cmp comparison method for this execution.
-	 * @param base the common base sequence
-	 * @param ours the first sequence to be merged
-	 * @param theirs the second sequence to be merged
+	 * @param <S>
+	 *            type of the sequences
+	 * @param cmp
+	 *            comparison method for this execution.
+	 * @param base
+	 *            the common base sequence
+	 * @param ours
+	 *            the first sequence to be merged
+	 * @param theirs
+	 *            the second sequence to be merged
 	 * @return the resulting content
 	 */
 	public <S extends Sequence> MergeResult<S> merge(
@@ -121,6 +127,8 @@ public <S extends Sequence> MergeResult<S> merge(
 						// Let their complete content conflict with empty text
 						result.add(1, 0, 0,
 								ConflictState.FIRST_CONFLICTING_RANGE);
+						result.add(0, 0, base.size(),
+								ConflictState.BASE_CONFLICTING_RANGE);
 						result.add(2, 0, theirs.size(),
 								ConflictState.NEXT_CONFLICTING_RANGE);
 						break;
@@ -149,6 +157,8 @@ public <S extends Sequence> MergeResult<S> merge(
 					// Let our complete content conflict with empty text
 					result.add(1, 0, ours.size(),
 							ConflictState.FIRST_CONFLICTING_RANGE);
+					result.add(0, 0, base.size(),
+						ConflictState.BASE_CONFLICTING_RANGE);
 					result.add(2, 0, 0, ConflictState.NEXT_CONFLICTING_RANGE);
 					break;
 				}
@@ -318,6 +328,14 @@ public <S extends Sequence> MergeResult<S> merge(
 						result.add(1, oursBeginB + commonPrefix,
 								oursEndB - commonSuffix,
 								ConflictState.FIRST_CONFLICTING_RANGE);
+
+						int baseBegin = Math.min(oursBeginB, theirsBeginB)
+								+ commonPrefix;
+						int baseEnd = Math.min(base.size(),
+								Math.max(oursEndB, theirsEndB)) - commonSuffix;
+						result.add(0, baseBegin, baseEnd,
+								ConflictState.BASE_CONFLICTING_RANGE);
+
 						result.add(2, theirsBeginB + commonPrefix,
 								theirsEndB - commonSuffix,
 								ConflictState.NEXT_CONFLICTING_RANGE);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeChunk.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeChunk.java
index ca998e3..7102aa6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeChunk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeChunk.java
@@ -29,14 +29,22 @@ public enum ConflictState {
 		NO_CONFLICT,
 
 		/**
-		 * This chunk does belong to a conflict and is the first one of the
+		 * This chunk does belong to a conflict and is the ours section of the
 		 * conflicting chunks
 		 */
 		FIRST_CONFLICTING_RANGE,
 
 		/**
-		 * This chunk does belong to a conflict but is not the first one of the
-		 * conflicting chunks. It's a subsequent one.
+		 * This chunk does belong to a conflict and is the base section of the
+		 * conflicting chunks
+		 *
+		 * @since 6.7
+		 */
+		BASE_CONFLICTING_RANGE,
+
+		/**
+		 * This chunk does belong to a conflict and is the theirs section of
+		 * the conflicting chunks. It's a subsequent one.
 		 */
 		NEXT_CONFLICTING_RANGE
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
index 18b0ad9..a35b30e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
@@ -43,6 +43,7 @@ public class MergeFormatter {
 	 *            the name of the character set used when writing conflict
 	 *            metadata
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @deprecated Use
 	 *             {@link #formatMerge(OutputStream, MergeResult, List, Charset)}
 	 *             instead.
@@ -73,6 +74,7 @@ public void formatMerge(OutputStream out, MergeResult<RawText> res,
 	 * @param charset
 	 *            the character set used when writing conflict metadata
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.2
 	 */
 	public void formatMerge(OutputStream out, MergeResult<RawText> res,
@@ -81,6 +83,35 @@ public void formatMerge(OutputStream out, MergeResult<RawText> res,
 	}
 
 	/**
+	 * Formats the results of a merge of {@link org.eclipse.jgit.diff.RawText}
+	 * objects in a Git conformant way using diff3 style. This method also
+	 * assumes that the {@link org.eclipse.jgit.diff.RawText} objects being
+	 * merged are line oriented files which use LF as delimiter. This method
+	 * will also use LF to separate chunks and conflict metadata, therefore it
+	 * fits only to texts that are LF-separated lines.
+	 *
+	 * @param out
+	 *            the output stream where to write the textual presentation
+	 * @param res
+	 *            the merge result which should be presented
+	 * @param seqName
+	 *            When a conflict is reported each conflicting range will get a
+	 *            name. This name is following the "&lt;&lt;&lt;&lt;&lt;&lt;&lt;
+	 *            ", "|||||||" or "&gt;&gt;&gt;&gt;&gt;&gt;&gt; " conflict
+	 *            markers. The names for the sequences are given in this list
+	 * @param charset
+	 *            the character set used when writing conflict metadata
+	 * @throws java.io.IOException
+	 *            if an IO error occurred
+	 * @since 6.7
+	 */
+	public void formatMergeDiff3(OutputStream out,
+			MergeResult<RawText> res, List<String> seqName, Charset charset)
+			throws IOException {
+		new MergeFormatterPass(out, res, seqName, charset, true).formatMerge();
+	}
+
+	/**
 	 * Formats the results of a merge of exactly two
 	 * {@link org.eclipse.jgit.diff.RawText} objects in a Git conformant way.
 	 * This convenience method accepts the names for the three sequences (base
@@ -102,6 +133,7 @@ public void formatMerge(OutputStream out, MergeResult<RawText> res,
 	 *            the name of the character set used when writing conflict
 	 *            metadata
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @deprecated use
 	 *             {@link #formatMerge(OutputStream, MergeResult, String, String, String, Charset)}
 	 *             instead.
@@ -134,6 +166,7 @@ public void formatMerge(OutputStream out, MergeResult res, String baseName,
 	 * @param charset
 	 *            the character set used when writing conflict metadata
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.2
 	 */
 	@SuppressWarnings("unchecked")
@@ -146,4 +179,39 @@ public void formatMerge(OutputStream out, MergeResult res, String baseName,
 		names.add(theirsName);
 		formatMerge(out, res, names, charset);
 	}
+
+	/**
+	 * Formats the results of a merge of three
+	 * {@link org.eclipse.jgit.diff.RawText} objects in a Git conformant way,
+	 * using diff-3 style. This convenience method accepts the names for the
+	 * three sequences (base and the two merged sequences) as explicit
+	 * parameters and doesn't require the caller to specify a List
+	 *
+	 * @param out
+	 *            the {@link java.io.OutputStream} where to write the textual
+	 *            presentation
+	 * @param res
+	 *            the merge result which should be presented
+	 * @param baseName
+	 *            the name ranges from the base should get
+	 * @param oursName
+	 *            the name ranges from ours should get
+	 * @param theirsName
+	 *            the name ranges from theirs should get
+	 * @param charset
+	 *            the character set used when writing conflict metadata
+	 * @throws java.io.IOException
+	 *            if an IO error occurred
+	 * @since 6.7
+	 */
+	@SuppressWarnings("unchecked")
+	public void formatMergeDiff3(OutputStream out,
+			MergeResult res, String baseName, String oursName,
+			String theirsName, Charset charset) throws IOException {
+		List<String> names = new ArrayList<>(3);
+		names.add(baseName);
+		names.add(oursName);
+		names.add(theirsName);
+		formatMergeDiff3(out, res, names, charset);
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java
index f09b343..5e80b5f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java
@@ -31,6 +31,8 @@ class MergeFormatterPass {
 
 	private final boolean threeWayMerge;
 
+	private final boolean writeBase; // diff3-style requested
+
 	private String lastConflictingName; // is set to non-null whenever we are in
 										// a conflict
 
@@ -50,22 +52,47 @@ class MergeFormatterPass {
 	 */
 	MergeFormatterPass(OutputStream out, MergeResult<RawText> res,
 			List<String> seqName, Charset charset) {
+		this(out, res, seqName, charset, false);
+	}
+
+	/**
+	 * @param out
+	 *            the {@link java.io.OutputStream} where to write the textual
+	 *            presentation
+	 * @param res
+	 *            the merge result which should be presented
+	 * @param seqName
+	 *            When a conflict is reported each conflicting range will get a
+	 *            name. This name is following the "&lt;&lt;&lt;&lt;&lt;&lt;&lt;
+	 *            ", "|||||||" or "&gt;&gt;&gt;&gt;&gt;&gt;&gt; " conflict
+	 *            markers. The names for the sequences are given in this list
+	 * @param charset
+	 *            the character set used when writing conflict metadata
+	 * @param writeBase
+	 *            base's contribution should be written in conflicts
+	 */
+	MergeFormatterPass(OutputStream out, MergeResult<RawText> res,
+			List<String> seqName, Charset charset, boolean writeBase) {
 		this.out = new EolAwareOutputStream(out);
 		this.res = res;
 		this.seqName = seqName;
 		this.charset = charset;
 		this.threeWayMerge = (res.getSequences().size() == 3);
+		this.writeBase = writeBase;
 	}
 
 	void formatMerge() throws IOException {
 		boolean missingNewlineAtEnd = false;
 		for (MergeChunk chunk : res) {
-			RawText seq = res.getSequences().get(chunk.getSequenceIndex());
-			writeConflictMetadata(chunk);
-			// the lines with conflict-metadata are written. Now write the chunk
-			for (int i = chunk.getBegin(); i < chunk.getEnd(); i++)
-				writeLine(seq, i);
-			missingNewlineAtEnd = seq.isMissingNewlineAtEnd();
+			if (!isBase(chunk) || writeBase) {
+				RawText seq = res.getSequences().get(chunk.getSequenceIndex());
+				writeConflictMetadata(chunk);
+				// the lines with conflict-metadata are written. Now write the
+				// chunk
+				for (int i = chunk.getBegin(); i < chunk.getEnd(); i++)
+					writeLine(seq, i);
+				missingNewlineAtEnd = seq.isMissingNewlineAtEnd();
+			}
 		}
 		// one possible leftover: if the merge result ended with a conflict we
 		// have to close the last conflict here
@@ -77,16 +104,19 @@ void formatMerge() throws IOException {
 
 	private void writeConflictMetadata(MergeChunk chunk) throws IOException {
 		if (lastConflictingName != null
-				&& chunk.getConflictState() != ConflictState.NEXT_CONFLICTING_RANGE) {
-			// found the end of an conflict
+				&& !isTheirs(chunk) && !isBase(chunk)) {
+			// found the end of a conflict
 			writeConflictEnd();
 		}
-		if (chunk.getConflictState() == ConflictState.FIRST_CONFLICTING_RANGE) {
-			// found the start of an conflict
+		if (isOurs(chunk)) {
+			// found the start of a conflict
 			writeConflictStart(chunk);
-		} else if (chunk.getConflictState() == ConflictState.NEXT_CONFLICTING_RANGE) {
-			// found another conflicting chunk
+		} else if (isTheirs(chunk)) {
+			// found the theirs conflicting chunk
 			writeConflictChange(chunk);
+		} else if (isBase(chunk)) {
+			// found the base conflicting chunk
+			writeConflictBase(chunk);
 		}
 	}
 
@@ -113,6 +143,11 @@ private void writeConflictChange(MergeChunk chunk) throws IOException {
 				+ lastConflictingName);
 	}
 
+	private void writeConflictBase(MergeChunk chunk) throws IOException {
+		lastConflictingName = seqName.get(chunk.getSequenceIndex());
+		writeln("||||||| " + lastConflictingName); //$NON-NLS-1$
+	}
+
 	private void writeln(String s) throws IOException {
 		out.beginln();
 		out.write((s + "\n").getBytes(charset)); //$NON-NLS-1$
@@ -125,4 +160,17 @@ private void writeLine(RawText seq, int i) throws IOException {
 		if (out.isBeginln())
 			out.write('\n');
 	}
+
+	private boolean isBase(MergeChunk chunk) {
+		return chunk.getConflictState() == ConflictState.BASE_CONFLICTING_RANGE;
+	}
+
+	private boolean isOurs(MergeChunk chunk) {
+		return chunk
+				.getConflictState() == ConflictState.FIRST_CONFLICTING_RANGE;
+	}
+
+	private boolean isTheirs(MergeChunk chunk) {
+		return chunk.getConflictState() == ConflictState.NEXT_CONFLICTING_RANGE;
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java
index 20fc3c3..acf9553 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java
@@ -97,7 +97,6 @@ public List<S> getSequences() {
 
 	static final ConflictState[] states = ConflictState.values();
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<MergeChunk> iterator() {
 		return new Iterator<>() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
index df60689..1162a61 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
@@ -123,6 +123,7 @@ protected RevCommit getBaseCommit(RevCommit a, RevCommit b)
 	 *         synthetic merge base this commit is visible only the merger's
 	 *         RevWalk and will not be in the repository.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws IncorrectObjectTypeException
 	 *             one of the input objects is not a commit.
 	 * @throws NoMergeBaseException
@@ -213,6 +214,7 @@ protected RevCommit getBaseCommit(RevCommit a, RevCommit b, int callDepth)
 	 *            the list of parent commits
 	 * @return a new commit visible only within this merger's RevWalk.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private RevCommit createCommitForTree(ObjectId tree, List<RevCommit> parents)
 			throws IOException {
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 e56513d..2b2ab02 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
@@ -466,7 +466,6 @@ private void addCheckoutMetadata(Map<String, CheckoutMetadata> map,
 		/**
 		 * Detects if CRLF conversion has been configured.
 		 * <p>
-		 * </p>
 		 * See {@link EolStreamTypeUtil#detectStreamType} for more info.
 		 *
 		 * @param attributes
@@ -904,7 +903,6 @@ public void setContentMergeStrategy(ContentMergeStrategy strategy) {
 				: strategy;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean mergeImpl() throws IOException {
 		return mergeTrees(mergeBase(), sourceTrees[0], sourceTrees[1],
@@ -915,18 +913,23 @@ protected boolean mergeImpl() throws IOException {
 	 * adds a new path with the specified stage to the index builder
 	 *
 	 * @param path
+	 *            the new path
 	 * @param p
+	 *            canonical tree parser
 	 * @param stage
-	 * @param lastMod
+	 *            the stage
+	 * @param lastModified
+	 *            lastModified attribute of the file
 	 * @param len
+	 *            file length
 	 * @return the entry which was added to the index
 	 */
 	private DirCacheEntry add(byte[] path, CanonicalTreeParser p, int stage,
-			Instant lastMod, long len) {
+			Instant lastModified, long len) {
 		if (p != null && !p.getEntryFileMode().equals(FileMode.TREE)) {
 			return workTreeUpdater.addExistingToIndex(p.getEntryObjectId(), path,
 					p.getEntryFileMode(), stage,
-					lastMod, (int) len);
+					lastModified, (int) len);
 		}
 		return null;
 	}
@@ -1056,6 +1059,7 @@ protected void addDeletion(String path, boolean isFile,
 	 *         didn't match ours or the working-dir file was dirty and a
 	 *         conflict occurred
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 6.1
 	 */
 	protected boolean processEntry(CanonicalTreeParser base,
@@ -1432,15 +1436,21 @@ private static MergeResult<SubmoduleConflict> createGitLinksMergeResult(
 	 * specified as <code>null</code> then an empty text will be used instead.
 	 *
 	 * @param base
+	 *            used to parse base tree
 	 * @param ours
+	 *            used to parse ours tree
 	 * @param theirs
+	 *            used to parse theirs tree
 	 * @param attributes
+	 *            attributes for the different stages
 	 * @param strategy
+	 *            merge strategy
 	 *
 	 * @return the result of the content merge
 	 * @throws BinaryBlobException
 	 *             if any of the blobs looks like a binary blob
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private MergeResult<RawText> contentMerge(CanonicalTreeParser base,
 			CanonicalTreeParser ours, CanonicalTreeParser theirs,
@@ -1516,11 +1526,17 @@ private boolean isWorktreeDirty(WorkingTreeIterator work,
 	 * correct stages to the index.
 	 *
 	 * @param base
+	 *            used to parse base tree
 	 * @param ours
+	 *            used to parse ours tree
 	 * @param theirs
+	 *            used to parse theirs tree
 	 * @param result
+	 *            merge result
 	 * @param attributes
+	 *            the file's attributes
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void updateIndex(CanonicalTreeParser base,
 			CanonicalTreeParser ours, CanonicalTreeParser theirs,
@@ -1571,6 +1587,7 @@ private void updateIndex(CanonicalTreeParser base,
 	 *            the files .gitattributes entries
 	 * @return the working tree file to which the merged content was written.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private File writeMergedFile(TemporaryBuffer rawMerged,
 			Attributes attributes)
@@ -1659,7 +1676,6 @@ private static boolean isGitLink(int mode) {
 		return FileMode.GITLINK.equals(mode);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getResultTreeId() {
 		return (resultTree == null) ? null : resultTree.toObjectId();
@@ -1819,6 +1835,7 @@ public void setWorkingTreeIterator(WorkingTreeIterator workingTreeIterator) {
 	 *            content-merge conflicts.
 	 * @return whether the trees merged cleanly
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.5
 	 */
 	protected boolean mergeTrees(AbstractTreeIterator baseTree,
@@ -1878,6 +1895,7 @@ protected boolean mergeTrees(AbstractTreeIterator baseTree,
 	 *            {@link org.eclipse.jgit.merge.ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
 	 * @return Whether the trees merged cleanly.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.5
 	 */
 	protected boolean mergeTreeWalk(TreeWalk treeWalk, boolean ignoreConflicts)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyOneSided.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyOneSided.java
index 7055ccd..6064ebe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyOneSided.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyOneSided.java
@@ -43,25 +43,21 @@ protected StrategyOneSided(String name, int index) {
 		treeIndex = index;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return strategyName;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Merger newMerger(Repository db) {
 		return new OneSide(db, treeIndex);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Merger newMerger(Repository db, boolean inCore) {
 		return new OneSide(db, treeIndex);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Merger newMerger(ObjectInserter inserter, Config config) {
 		return new OneSide(inserter, treeIndex);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyRecursive.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyRecursive.java
index c9512ed..a74bfc0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyRecursive.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyRecursive.java
@@ -21,25 +21,21 @@
  */
 public class StrategyRecursive extends StrategyResolve {
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(Repository db) {
 		return new RecursiveMerger(db, false);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(Repository db, boolean inCore) {
 		return new RecursiveMerger(db, inCore);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(ObjectInserter inserter, Config config) {
 		return new RecursiveMerger(inserter, config);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return "recursive"; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyResolve.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyResolve.java
index 5991ef6..a686fd0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyResolve.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyResolve.java
@@ -19,25 +19,21 @@
  */
 public class StrategyResolve extends ThreeWayMergeStrategy {
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(Repository db) {
 		return new ResolveMerger(db, false);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(Repository db, boolean inCore) {
 		return new ResolveMerger(db, inCore);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(ObjectInserter inserter, Config config) {
 		return new ResolveMerger(inserter, config);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return "resolve"; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java
index ff40fc1..c3180ab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java
@@ -43,26 +43,22 @@ protected StrategySimpleTwoWayInCore() {
 		//
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return "simple-two-way-in-core"; //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(Repository db) {
 		return new InCoreMerger(db);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(Repository db, boolean inCore) {
 		// This class is always inCore, so ignore the parameter
 		return newMerger(db);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(ObjectInserter inserter, Config config) {
 		return new InCoreMerger(inserter);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMergeStrategy.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMergeStrategy.java
index 411789f..8cefa65 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMergeStrategy.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMergeStrategy.java
@@ -16,11 +16,9 @@
  * A merge strategy to merge 2 trees, using a common base ancestor tree.
  */
 public abstract class ThreeWayMergeStrategy extends MergeStrategy {
-	/** {@inheritDoc} */
 	@Override
 	public abstract ThreeWayMerger newMerger(Repository db);
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract ThreeWayMerger newMerger(Repository db, boolean inCore);
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMerger.java
index f283ede..68a1b5e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMerger.java
@@ -88,7 +88,6 @@ public void setBase(AnyObjectId id) throws MissingObjectException,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean merge(AnyObjectId... tips) throws IOException {
 		if (tips.length != 2)
@@ -96,7 +95,6 @@ public boolean merge(AnyObjectId... tips) throws IOException {
 		return super.merge(tips);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getBaseCommitId() {
 		return baseCommitId;
@@ -108,6 +106,7 @@ public ObjectId getBaseCommitId() {
 	 * @return an iterator over the caller-specified merge base, or the natural
 	 *         merge base of the two input commits.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected AbstractTreeIterator mergeBase() throws IOException {
 		if (baseTree != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
index 881873d..16d1763 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
@@ -83,6 +83,8 @@ private static NLS useJVMDefaultInternal() {
 	 * injected as described in the
 	 * {@link org.eclipse.jgit.nls.TranslationBundle}.
 	 *
+	 * @param <T>
+	 *            type of the translation bundle
 	 * @param type
 	 *            required bundle type
 	 * @return an instance of the required bundle type
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
index bde0b9e..b65f28c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
@@ -34,7 +34,6 @@
  */
 public class DefaultNoteMerger implements NoteMerger {
 
-	/** {@inheritDoc} */
 	@Override
 	public Note merge(Note base, Note ours, Note theirs, ObjectReader reader,
 			ObjectInserter inserter) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/Note.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/Note.java
index c356963..2f719bf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/Note.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/Note.java
@@ -45,7 +45,6 @@ void setData(ObjectId newData) {
 		data = newData;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMap.java
index 93adf36..b872750 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMap.java
@@ -166,7 +166,6 @@ private NoteMap(ObjectReader reader) {
 		this.reader = reader;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<Note> iterator() {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
index a6ea523..79ceb13 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
@@ -94,6 +94,7 @@ public NoteMapMerger(Repository db) {
 	 *            theirs version of the note tree
 	 * @return merge result as a new NoteMap
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public NoteMap merge(NoteMap base, NoteMap ours, NoteMap theirs)
 			throws IOException {
@@ -113,11 +114,16 @@ public NoteMap merge(NoteMap base, NoteMap ours, NoteMap theirs)
 	 * between base, ours and theirs.
 	 *
 	 * @param treeDepth
+	 *            depth of the tree
 	 * @param base
+	 *            base version
 	 * @param ours
+	 *            ours version
 	 * @param theirs
+	 *            theirs version
 	 * @return merge result as an InMemoryBucket
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private InMemoryNoteBucket merge(int treeDepth, InMemoryNoteBucket base,
 			InMemoryNoteBucket ours, InMemoryNoteBucket theirs)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedFileHeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedFileHeader.java
index 4ba7cca..e29af61 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedFileHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedFileHeader.java
@@ -40,7 +40,6 @@ public class CombinedFileHeader extends FileHeader {
 		super(b, offset);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("unchecked")
 	public List<? extends CombinedHunkHeader> getHunks() {
@@ -48,9 +47,6 @@ public List<? extends CombinedHunkHeader> getHunks() {
 	}
 
 	/**
-	 * {@inheritDoc}
-	 * <p>
-	 *
 	 * @return number of ancestor revisions mentioned in this diff.
 	 */
 	@Override
@@ -60,7 +56,7 @@ public int getParentCount() {
 
 	/**
 	 * {@inheritDoc}
-	 * <p>
+	 *
 	 * @return get the file mode of the first parent.
 	 */
 	@Override
@@ -81,7 +77,6 @@ public FileMode getOldMode(int nthParent) {
 
 	/**
 	 * {@inheritDoc}
-	 * <p>
 	 *
 	 * @return get the object id of the first parent.
 	 */
@@ -101,7 +96,6 @@ public AbbreviatedObjectId getOldId(int nthParent) {
 		return oldIds[nthParent];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getScriptText(Charset ocs, Charset ncs) {
 		final Charset[] cs = new Charset[getParentCount() + 1];
@@ -110,11 +104,6 @@ public String getScriptText(Charset ocs, Charset ncs) {
 		return getScriptText(cs);
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * <p>
-	 * Convert the patch script for this file into a string.
-	 */
 	@Override
 	public String getScriptText(Charset[] charsetGuess) {
 		return super.getScriptText(charsetGuess);
@@ -156,7 +145,6 @@ int parseGitHeaders(int ptr, int end) {
 		return ptr;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void parseIndexLine(int ptr, int eol) {
 		// "index $asha1,$bsha1..$csha1"
@@ -178,7 +166,6 @@ protected void parseIndexLine(int ptr, int eol) {
 		oldModes = new FileMode[oldIds.length];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void parseNewFileMode(int ptr, int eol) {
 		for (int i = 0; i < oldModes.length; i++)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java
index 263b1b9..49cf499 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java
@@ -45,13 +45,11 @@ public AbbreviatedObjectId getId() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CombinedFileHeader getFileHeader() {
 		return (CombinedFileHeader) super.getFileHeader();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public OldImage getOldImage() {
 		return getOldImage(0);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java
index 1e6fb78..a47b73d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java
@@ -187,6 +187,13 @@ public String getScriptText(Charset oldCharset, Charset newCharset) {
 		return getScriptText(new Charset[] { oldCharset, newCharset });
 	}
 
+	/**
+	 * Convert the patch script for this file into a string.
+	 *
+	 * @param charsetGuess
+	 *            hint which charset is used
+	 * @return the patch script, as a Unicode string.
+	 */
 	String getScriptText(Charset[] charsetGuess) {
 		if (getHunks().isEmpty()) {
 			// If we have no hunks then we can safely assume the entire
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java
index 5618a71..8d21b6d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java
@@ -91,7 +91,6 @@ public String getLineText() {
 		return RawParseUtils.decode(UTF_8, buf, offset, eol);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/HunkHeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/HunkHeader.java
index 4b59fcf..1359f66 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/HunkHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/HunkHeader.java
@@ -409,7 +409,6 @@ void skipLine(final String[] text, final int[] offsets,
 		offsets[fileIdx] = end < 0 ? s.length() : end + 1;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java
index da698d6..e9c1192 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java
@@ -251,6 +251,7 @@ public Result applyPatch(InputStream patchInput)
 	 *            the patch to apply.
 	 * @return the result of the patch
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 6.6
 	 */
 	public Result applyPatch(Patch p) throws IOException {
@@ -423,6 +424,7 @@ private boolean verifyExistence(FileHeader fh, File src, File dest,
 	 * @param result
 	 *            The patch application result.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void apply(String pathWithOriginalContent, DirCache dirCache,
 			DirCacheBuilder dirCacheBuilder, @Nullable File f, FileHeader fh, Result result)
@@ -777,7 +779,9 @@ private static class ContentStreamLoader {
 	 *            The patch application result
 	 * @return a loader for the new content, or null if invalid.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws UnsupportedOperationException
+	 *             if an operation isn't supported
 	 */
 	private @Nullable ContentStreamLoader applyBinary(String path, File f, FileHeader fh,
 			StreamSupplier inputSupplier, ObjectId id, Result result)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
index c11fca1..fa109e8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
@@ -179,7 +179,6 @@ public final L getLane() {
 		return (L) lane;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		forkingOffLanes = NO_LANES;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java
index 458f240..3177de1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java
@@ -49,7 +49,6 @@ public class PlotCommitList<L extends PlotLane> extends
 	private final HashMap<PlotLane, Integer> laneLength = new HashMap<>(
 			32);
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		super.clear();
@@ -59,7 +58,6 @@ public void clear() {
 		laneLength.clear();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void source(RevWalk w) {
 		if (!(w instanceof PlotWalk))
@@ -91,7 +89,6 @@ public void findPassingThrough(final PlotCommit<L> currCommit,
 			result.add((L) p);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("ReferenceEquality")
 	@Override
 	protected void enter(int index, PlotCommit<L> currCommit) {
@@ -184,6 +181,7 @@ private void continueActiveLanes(PlotCommit currCommit) {
 	 * @param index
 	 *            the index of <code>currCommit</code> in the list
 	 * @param currCommit
+	 *            the current commit
 	 * @param childOnLane
 	 *            the direct child on the same lane as <code>currCommit</code>,
 	 *            may be null if <code>currCommit</code> is the first commit on
@@ -287,8 +285,11 @@ private PlotLane handleMerge(final int index, final PlotCommit currCommit,
 	 * All blockades on the lane must be resolved before calling this method.
 	 *
 	 * @param commitIndex
+	 *            commit index
 	 * @param child
+	 *            child to connect
 	 * @param laneToContinue
+	 *            lane to continue
 	 */
 	@SuppressWarnings("ReferenceEquality")
 	private void drawLaneToChild(final int commitIndex, PlotCommit child,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotWalk.java
index 0582338..0f6bd2d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotWalk.java
@@ -49,7 +49,6 @@ public class PlotWalk extends RevWalk {
 
 	private Repository repository;
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispose() {
 		super.dispose();
@@ -83,6 +82,7 @@ public PlotWalk(Repository repo) {
 	 * @param refs
 	 *            additional refs
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void addAdditionalRefs(Iterable<Ref> refs) throws IOException {
 		for (Ref ref : refs) {
@@ -97,7 +97,6 @@ public void addAdditionalRefs(Iterable<Ref> refs) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void sort(RevSort s, boolean use) {
 		if (s == RevSort.TOPO && !use)
@@ -105,13 +104,11 @@ public void sort(RevSort s, boolean use) {
 		super.sort(s, use);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected RevCommit createCommit(AnyObjectId id) {
 		return new PlotCommit(id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AbstractRevQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AbstractRevQueue.java
index dda108b..73ae62a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AbstractRevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AbstractRevQueue.java
@@ -79,8 +79,6 @@ public final void addParents(RevCommit c, RevFlag queueControl) {
 	}
 
 	/**
-	 * {@inheritDoc}
-	 * <p>
 	 * Remove the first commit from the queue.
 	 */
 	@Override
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BlockRevQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BlockRevQueue.java
index cdd8073..e855d8f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BlockRevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BlockRevQueue.java
@@ -45,8 +45,6 @@ protected BlockRevQueue(boolean firstParent) {
 	}
 
 	/**
-	 * {@inheritDoc}
-	 * <p>
 	 * Reconfigure this queue to share the same free list as another.
 	 * <p>
 	 * Multiple revision queues can be connected to the same free list, making
@@ -56,6 +54,11 @@ protected BlockRevQueue(boolean firstParent) {
 	 * <p>
 	 * Free lists are not thread-safe. Applications must ensure that all queues
 	 * sharing the same free list are doing so from only a single thread.
+	 *
+	 * @param q
+	 *            another FIFO queue that wants to share our queue's free list.
+	 *
+	 * @see Generator#shareFreeList
 	 */
 	@Override
 	public void shareFreeList(BlockRevQueue q) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DateRevQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DateRevQueue.java
index 0cabf07..4ec9afc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DateRevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DateRevQueue.java
@@ -56,7 +56,6 @@ public DateRevQueue() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void add(RevCommit c) {
 		sinceLastIndex++;
@@ -102,7 +101,6 @@ else if (t > when)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() {
 		final Entry q = head;
@@ -139,7 +137,6 @@ public RevCommit peek() {
 		return head != null ? head.commit : null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		head = null;
@@ -173,7 +170,6 @@ int outputType() {
 		return outputType | SORT_COMMIT_TIME_DESC;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthGenerator.java
index ec0824c..664f8fa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthGenerator.java
@@ -55,10 +55,15 @@ class DepthGenerator extends Generator {
 
 	/**
 	 * @param w
-	 * @param s Parent generator
+	 *            walk used for depth filtering
+	 * @param s
+	 *            Parent generator
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if an object has an unexpected type
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	DepthGenerator(DepthWalk w, Generator s) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java
index 5277563..f74666b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java
@@ -159,8 +159,11 @@ public RevWalk(ObjectReader or, int depth) {
 		 * @param c
 		 *            Commit to mark
 		 * @throws IOException
+		 *             if an IO error occurred
 		 * @throws IncorrectObjectTypeException
+		 *             if object has an unexpected type
 		 * @throws MissingObjectException
+		 *             if object is missing
 		 */
 		public void markRoot(RevCommit c) throws MissingObjectException,
 				IncorrectObjectTypeException, IOException {
@@ -289,8 +292,11 @@ public ObjectWalk(ObjectReader or, int depth) {
 		 * @param o
 		 *            Commit to mark
 		 * @throws IOException
+		 *             if an IO error occurred
 		 * @throws IncorrectObjectTypeException
+		 *             if object has an unexpected type
 		 * @throws MissingObjectException
+		 *             if object is missing
 		 */
 		public void markRoot(RevObject o) throws MissingObjectException,
 				IncorrectObjectTypeException, IOException {
@@ -313,8 +319,11 @@ public void markRoot(RevObject o) throws MissingObjectException,
 		 * @param c
 		 *            Commit to mark
 		 * @throws MissingObjectException
+		 *             if object is missing
 		 * @throws IncorrectObjectTypeException
+		 *             if object has an unexpected type
 		 * @throws IOException
+		 *             if an IO error occurred
 		 */
 		public void markUnshallow(RevObject c) throws MissingObjectException,
 				IncorrectObjectTypeException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FIFORevQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FIFORevQueue.java
index 0f8eddd..996745c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FIFORevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FIFORevQueue.java
@@ -37,7 +37,6 @@ public FIFORevQueue() {
 		super(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void add(RevCommit c) {
 		Block b = tail;
@@ -82,7 +81,6 @@ public void unpop(RevCommit c) {
 		head = b;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() {
 		final Block b = head;
@@ -99,7 +97,6 @@ public RevCommit next() {
 		return c;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		head = null;
@@ -135,7 +132,6 @@ void removeFlag(int f) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FollowFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FollowFilter.java
index 3b54123..35ef51f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FollowFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FollowFilter.java
@@ -11,6 +11,8 @@
 package org.eclipse.jgit.revwalk;
 
 import java.io.IOException;
+import java.util.Optional;
+import java.util.Set;
 
 import org.eclipse.jgit.diff.DiffConfig;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -77,7 +79,6 @@ public String getPath() {
 		return path.getPath();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -85,19 +86,22 @@ public boolean include(TreeWalk walker)
 		return path.include(walker) && ANY_DIFF.include(walker);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return path.shouldBeRecursive() || ANY_DIFF.shouldBeRecursive();
 	}
 
+	@Override
+	public Optional<Set<byte[]>> getPathsBestEffort() {
+		return path.getPathsBestEffort();
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return new FollowFilter(path.clone(), cfg);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterKey.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterKey.java
index 74e4c1e..af50794 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterKey.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterKey.java
@@ -51,7 +51,6 @@ public String getName() {
 		return name;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
index 3d128a6..2d396d5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
@@ -11,6 +11,9 @@
 package org.eclipse.jgit.revwalk;
 
 import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.eclipse.jgit.util.RawParseUtils;
 
@@ -47,6 +50,112 @@ public final class FooterLine {
 	}
 
 	/**
+	 * Extract the footer lines from the given message.
+	 *
+	 * @param str
+	 *            the message to extract footers from.
+	 * @return ordered list of footer lines; empty list if no footers found.
+	 * @see RevCommit#getFooterLines()
+	 * @since 6.7
+	 */
+	public static List<FooterLine> fromMessage(
+			String str) {
+		return fromMessage(str.getBytes());
+	}
+
+	/**
+	 * Extract the footer lines from the given message.
+	 *
+	 * @param raw
+	 *            the raw message to extract footers from.
+	 * @return ordered list of footer lines; empty list if no footers found.
+	 * @see RevCommit#getFooterLines()
+	 * @since 6.7
+	 */
+	public static List<FooterLine> fromMessage(
+			byte[] raw) {
+		int ptr = raw.length - 1;
+		while (raw[ptr] == '\n') // trim any trailing LFs, not interesting
+			ptr--;
+
+		int msgB = RawParseUtils.commitMessage(raw, 0);
+		ArrayList<FooterLine> r = new ArrayList<>(4);
+		Charset enc = RawParseUtils.guessEncoding(raw);
+		for (;;) {
+			ptr = RawParseUtils.prevLF(raw, ptr);
+			if (ptr <= msgB)
+				break; // Don't parse commit headers as footer lines.
+
+			int keyStart = ptr + 2;
+			if (raw[keyStart] == '\n')
+				break; // Stop at first paragraph break, no footers above it.
+
+			int keyEnd = RawParseUtils.endOfFooterLineKey(raw, keyStart);
+			if (keyEnd < 0)
+				continue; // Not a well formed footer line, skip it.
+
+			// Skip over the ': *' at the end of the key before the value.
+			//
+			int valStart = keyEnd + 1;
+			while (valStart < raw.length && raw[valStart] == ' ')
+				valStart++;
+
+			// Value ends at the LF, and does not include it.
+			//
+			int valEnd = RawParseUtils.nextLF(raw, valStart);
+			if (raw[valEnd - 1] == '\n')
+				valEnd--;
+
+			r.add(new FooterLine(raw, enc, keyStart, keyEnd, valStart, valEnd));
+		}
+		Collections.reverse(r);
+		return r;
+	}
+
+	/**
+	 * Get the values of all footer lines with the given key.
+	 *
+	 * @param footers
+	 *            list of footers to find the values in.
+	 * @param keyName
+	 *            footer key to find values of, case-insensitive.
+	 * @return values of footers with key of {@code keyName}, ordered by their
+	 *         order of appearance. Duplicates may be returned if the same
+	 *         footer appeared more than once. Empty list if no footers appear
+	 *         with the specified key, or there are no footers at all.
+	 * @see #fromMessage
+	 * @since 6.7
+	 */
+	public static List<String> getValues(List<FooterLine> footers, String keyName) {
+		return getValues(footers, new FooterKey(keyName));
+	}
+
+	/**
+	 * Get the values of all footer lines with the given key.
+	 *
+	 * @param footers
+	 *            list of footers to find the values in.
+	 * @param key
+	 *            footer key to find values of, case-insensitive.
+	 * @return values of footers with key of {@code keyName}, ordered by their
+	 *         order of appearance. Duplicates may be returned if the same
+	 *         footer appeared more than once. Empty list if no footers appear
+	 *         with the specified key, or there are no footers at all.
+	 * @see #fromMessage
+	 * @since 6.7
+	 */
+	public static List<String> getValues(List<FooterLine> footers, FooterKey key) {
+		if (footers.isEmpty())
+			return Collections.emptyList();
+		ArrayList<String> r = new ArrayList<>(footers.size());
+		for (FooterLine f : footers) {
+			if (f.matches(key))
+				r.add(f.getValue());
+		}
+		return r;
+	}
+
+	/**
 	 * Whether keys match
 	 *
 	 * @param key
@@ -117,7 +226,6 @@ public String getEmailAddress() {
 		return RawParseUtils.decode(enc, buffer, lt, gt - 1);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return getKey() + ": " + getValue(); //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/Generator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/Generator.java
index 3493dcf..d97812f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/Generator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/Generator.java
@@ -71,8 +71,11 @@ void shareFreeList(BlockRevQueue q) {
 	 *
 	 * @return next available commit; null if no more are to be returned.
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if an object has an unexpected type
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	abstract RevCommit next() throws MissingObjectException,
 			IncorrectObjectTypeException, IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java
index 4773ca8..ae67ca7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java
@@ -34,7 +34,6 @@ public LIFORevQueue() {
 		super(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void add(RevCommit c) {
 		Block b = head;
@@ -47,7 +46,6 @@ public void add(RevCommit c) {
 		b.unpop(c);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() {
 		final Block b = head;
@@ -62,7 +60,6 @@ public RevCommit next() {
 		return c;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		head = null;
@@ -89,7 +86,6 @@ boolean anybodyHasFlag(int f) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
index 4e48a5c..64b2fcd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
@@ -300,14 +300,12 @@ else if (o instanceof RevTree)
 			addObject(o);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void sort(RevSort s) {
 		super.sort(s);
 		boundary = hasRevSort(RevSort.BOUNDARY);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void sort(RevSort s, boolean use) {
 		super.sort(s, use);
@@ -357,7 +355,6 @@ public void setVisitationPolicy(VisitationPolicy policy) {
 		visitationPolicy = requireNonNull(policy);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -762,7 +759,6 @@ private void growPathBuf(int ptr) {
 		pathBuf = newBuf;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void dispose() {
 		super.dispose();
@@ -771,7 +767,6 @@ public void dispose() {
 		freeVisit = null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void reset(int retainFlags) {
 		super.reset(retainFlags);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RenameCallback.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RenameCallback.java
index ba3399c..9856f2c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RenameCallback.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RenameCallback.java
@@ -23,8 +23,30 @@ public abstract class RenameCallback {
 	 * Called whenever a diff was found that is actually a rename or copy of a
 	 * file.
 	 *
+	 * <p>Subclass of this class have to override this to receive diffEntry for
+	 * the rename.
+	 *
 	 * @param entry
 	 *            the entry representing the rename/copy
 	 */
 	public abstract void renamed(DiffEntry entry);
+
+	/**
+	 * Called whenever a diff was found that is actually a rename or copy of a
+	 * file along with the commit that caused it.
+	 *
+	 * <p>Subclass of this class have an option to override this if it wants to
+	 * know what commit generated the diffEntry. Otherwise defaults to the
+	 * {@link RenameCallback#renamed(DiffEntry)} function.
+	 *
+	 * @param entry
+	 *            the entry representing the rename/copy
+	 * @param commit
+	 *            commit at which callback occurred
+	 *
+	 * @since 6.7
+	 */
+	public void renamed(DiffEntry entry, RevCommit commit) {
+		renamed(entry);
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevBlob.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevBlob.java
index f5abbb8..1f81b6a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevBlob.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevBlob.java
@@ -33,7 +33,6 @@ protected RevBlob(AnyObjectId id) {
 		super(id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return Constants.OBJ_BLOB;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
index b64c9ce..0392ea4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
@@ -11,20 +11,19 @@
 
 package org.eclipse.jgit.revwalk;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.util.RawParseUtils.guessEncoding;
 
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.storage.commitgraph.ChangedPathFilter;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.MutableObjectId;
@@ -222,7 +221,6 @@ void parseCanonical(RevWalk walk, byte[] raw) throws IOException {
 		flags |= PARSED;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return Constants.OBJ_COMMIT;
@@ -484,7 +482,8 @@ public final String getFullMessage() {
 		if (msgB < 0) {
 			return ""; //$NON-NLS-1$
 		}
-		return RawParseUtils.decode(guessEncoding(), raw, msgB, raw.length);
+		return RawParseUtils.decode(guessEncoding(buffer), raw, msgB,
+				raw.length);
 	}
 
 	/**
@@ -510,7 +509,8 @@ public final String getShortMessage() {
 		}
 
 		int msgE = RawParseUtils.endOfParagraph(raw, msgB);
-		String str = RawParseUtils.decode(guessEncoding(), raw, msgB, msgE);
+		String str = RawParseUtils.decode(guessEncoding(buffer), raw, msgB,
+				msgE);
 		if (hasLF(raw, msgB, msgE)) {
 			str = StringUtils.replaceLineBreaksWithSpace(str);
 		}
@@ -562,14 +562,6 @@ public final Charset getEncoding() {
 		return RawParseUtils.parseEncoding(buffer);
 	}
 
-	private Charset guessEncoding() {
-		try {
-			return getEncoding();
-		} catch (IllegalCharsetNameException | UnsupportedCharsetException e) {
-			return UTF_8;
-		}
-	}
-
 	/**
 	 * Parse the footer lines (e.g. "Signed-off-by") for machine processing.
 	 * <p>
@@ -592,50 +584,14 @@ private Charset guessEncoding() {
 	 * @return ordered list of footer lines; empty list if no footers found.
 	 */
 	public final List<FooterLine> getFooterLines() {
-		final byte[] raw = buffer;
-		int ptr = raw.length - 1;
-		while (raw[ptr] == '\n') // trim any trailing LFs, not interesting
-			ptr--;
-
-		final int msgB = RawParseUtils.commitMessage(raw, 0);
-		final ArrayList<FooterLine> r = new ArrayList<>(4);
-		final Charset enc = guessEncoding();
-		for (;;) {
-			ptr = RawParseUtils.prevLF(raw, ptr);
-			if (ptr <= msgB)
-				break; // Don't parse commit headers as footer lines.
-
-			final int keyStart = ptr + 2;
-			if (raw[keyStart] == '\n')
-				break; // Stop at first paragraph break, no footers above it.
-
-			final int keyEnd = RawParseUtils.endOfFooterLineKey(raw, keyStart);
-			if (keyEnd < 0)
-				continue; // Not a well formed footer line, skip it.
-
-			// Skip over the ': *' at the end of the key before the value.
-			//
-			int valStart = keyEnd + 1;
-			while (valStart < raw.length && raw[valStart] == ' ')
-				valStart++;
-
-			// Value ends at the LF, and does not include it.
-			//
-			int valEnd = RawParseUtils.nextLF(raw, valStart);
-			if (raw[valEnd - 1] == '\n')
-				valEnd--;
-
-			r.add(new FooterLine(raw, enc, keyStart, keyEnd, valStart, valEnd));
-		}
-		Collections.reverse(r);
-		return r;
+		return FooterLine.fromMessage(buffer);
 	}
 
 	/**
 	 * Get the values of all footer lines with the given key.
 	 *
 	 * @param keyName
-	 *            footer key to find values of, case insensitive.
+	 *            footer key to find values of, case-insensitive.
 	 * @return values of footers with key of {@code keyName}, ordered by their
 	 *         order of appearance. Duplicates may be returned if the same
 	 *         footer appeared more than once. Empty list if no footers appear
@@ -643,30 +599,22 @@ public final List<FooterLine> getFooterLines() {
 	 * @see #getFooterLines()
 	 */
 	public final List<String> getFooterLines(String keyName) {
-		return getFooterLines(new FooterKey(keyName));
+		return FooterLine.getValues(getFooterLines(), keyName);
 	}
 
 	/**
 	 * Get the values of all footer lines with the given key.
 	 *
-	 * @param keyName
-	 *            footer key to find values of, case insensitive.
+	 * @param key
+	 *            footer key to find values of, case-insensitive.
 	 * @return values of footers with key of {@code keyName}, ordered by their
 	 *         order of appearance. Duplicates may be returned if the same
 	 *         footer appeared more than once. Empty list if no footers appear
 	 *         with the specified key, or there are no footers at all.
 	 * @see #getFooterLines()
 	 */
-	public final List<String> getFooterLines(FooterKey keyName) {
-		final List<FooterLine> src = getFooterLines();
-		if (src.isEmpty())
-			return Collections.emptyList();
-		final ArrayList<String> r = new ArrayList<>(src.size());
-		for (FooterLine f : src) {
-			if (f.matches(keyName))
-				r.add(f.getValue());
-		}
-		return r;
+	public final List<String> getFooterLines(FooterKey key) {
+		return FooterLine.getValues(getFooterLines(), key);
 	}
 
 	/**
@@ -688,6 +636,21 @@ int getGeneration() {
 	}
 
 	/**
+	 * Get the changed path filter of the commit.
+	 * <p>
+	 * This is null when there is no commit graph file, the commit is not in the
+	 * commit graph file, or the commit graph file was generated without changed
+	 * path filters.
+	 *
+	 * @param rw A revwalk to load the commit graph (if available)
+	 * @return the changed path filter
+	 * @since 6.7
+	 */
+	public ChangedPathFilter getChangedPathFilter(RevWalk rw) {
+		return null;
+	}
+
+	/**
 	 * Reset this commit to allow another RevWalk with the same instances.
 	 * <p>
 	 * Subclasses <b>must</b> call <code>super.reset()</code> to ensure the
@@ -713,7 +676,6 @@ public final void disposeBody() {
 		buffer = null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java
index 4d3664d..c7a0399 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java
@@ -14,6 +14,7 @@
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.storage.commitgraph.ChangedPathFilter;
 import org.eclipse.jgit.internal.storage.commitgraph.CommitGraph;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
@@ -44,7 +45,6 @@ protected RevCommitCG(AnyObjectId id, int graphPosition) {
 		this.graphPosition = graphPosition;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	void parseCanonical(RevWalk walk, byte[] raw) throws IOException {
 		if (walk.isRetainBody()) {
@@ -53,7 +53,6 @@ void parseCanonical(RevWalk walk, byte[] raw) throws IOException {
 		parseInGraph(walk);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	void parseHeaders(RevWalk walk) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -98,9 +97,14 @@ private void parseInGraph(RevWalk walk) throws IOException {
 		flags |= PARSED;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	int getGeneration() {
 		return generation;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ChangedPathFilter getChangedPathFilter(RevWalk rw) {
+		return rw.commitGraph().getChangedPathFilter(graphPosition);
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
index 59213a8..58f5d42 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
@@ -25,7 +25,6 @@
 public class RevCommitList<E extends RevCommit> extends RevObjectList<E> {
 	private RevWalk walker;
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		super.clear();
@@ -313,7 +312,6 @@ public void fillTo(int highMark) throws MissingObjectException,
 	 * walker specified by {@link #source(RevWalk)} is pumped until the
 	 * specified commit is loaded. Callers can test the final size of the list
 	 * by {@link #size()} to determine if the high water mark specified was met.
-	 * <p>
 	 *
 	 * @param commitToLoad
 	 *            commit the caller wants this list to contain when the fill
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlag.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlag.java
index a0160dd..3221bf6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlag.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlag.java
@@ -67,7 +67,6 @@ public RevWalk getRevWalk() {
 		return walker;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return name;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java
index 4d2684a..55ea30d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java
@@ -132,7 +132,6 @@ public final void remove(RevFlagSet set) {
 		flags &= ~set.mask;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObjectList.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObjectList.java
index 0393f55..ad8aeed 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObjectList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObjectList.java
@@ -47,7 +47,6 @@ public RevObjectList() {
 		// Initialized above.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void add(int index, E element) {
 		if (index != size)
@@ -58,7 +57,6 @@ public void add(int index, E element) {
 		size++;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("unchecked")
 	public E set(int index, E element) {
@@ -80,7 +78,6 @@ public E set(int index, E element) {
 		return (E) old;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("unchecked")
 	public E get(int index) {
@@ -95,13 +92,11 @@ public E get(int index) {
 		return s != null ? (E) s.contents[index] : null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		return size;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		contents = new Block(0);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
index b9d1450..75dbd57 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
@@ -149,7 +149,6 @@ void parseCanonical(RevWalk walk, byte[] rawTag)
 		flags |= PARSED;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return Constants.OBJ_TAG;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTree.java
index 8119af4..d81af0c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTree.java
@@ -33,7 +33,6 @@ protected RevTree(AnyObjectId id) {
 		super(id);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return Constants.OBJ_TREE;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
index 3737c6b..27a09f4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
@@ -220,7 +220,6 @@ public RevWalk(Repository repo) {
 
 	/**
 	 * Create a new revision walker for a given repository.
-	 * <p>
 	 *
 	 * @param or
 	 *            the reader the walker will obtain data from. The reader is not
@@ -454,7 +453,6 @@ public boolean isMergedInto(RevCommit base, RevCommit tip)
 	 * <p>
 	 * A commit is merged into a ref if we can find a path of commits that leads
 	 * from that specific ref and ends at <code>commit</code>.
-	 * <p>
 	 *
 	 * @param commit
 	 *            commit the caller thinks is reachable from <code>refs</code>.
@@ -476,7 +474,6 @@ public List<Ref> getMergedInto(RevCommit commit, Collection<Ref> refs)
 	 * <p>
 	 * A commit is merged into a ref if we can find a path of commits that leads
 	 * from that specific ref and ends at <code>commit</code>.
-	 * <p>
 	 *
 	 * @param commit
 	 *            commit the caller thinks is reachable from <code>refs</code>.
@@ -1197,6 +1194,8 @@ CommitGraph commitGraph() {
 	/**
 	 * Asynchronous object parsing.
 	 *
+	 * @param <T>
+	 *            Type of returned {@code ObjectId}
 	 * @param objectIds
 	 *            objects to open from the object store. The supplied collection
 	 *            must not be modified until the queue has finished.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java
index e52e916..4bfe2fd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java
@@ -51,8 +51,11 @@ private RevWalkUtils() {
 	 *            should be done until there are no more commits
 	 * @return the number of commits
 	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             if object is missing
 	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             if object has unexpected type
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static int count(final RevWalk walk, final RevCommit start,
 			final RevCommit end) throws MissingObjectException,
@@ -80,8 +83,11 @@ public static int count(final RevWalk walk, final RevCommit start,
 	 *            should be done until there are no more commits
 	 * @return the commits found
 	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             if object is missing
 	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             if object has unexpected type
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static List<RevCommit> find(final RevWalk walk,
 			final RevCommit start, final RevCommit end)
@@ -116,8 +122,11 @@ public static List<RevCommit> find(final RevWalk walk,
 	 *            the set of branches we want to see reachability from
 	 * @return the list of branches a given commit is reachable from
 	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             if object is missing
 	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             if object has unexpected type
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static List<Ref> findBranchesReachableFrom(RevCommit commit,
 			RevWalk revWalk, Collection<Ref> refs)
@@ -147,8 +156,11 @@ public static List<Ref> findBranchesReachableFrom(RevCommit commit,
 	 *            the callback for progress and cancellation
 	 * @return the list of branches a given commit is reachable from
 	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             if object is missing
 	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             if object has unexpected type
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.4
 	 */
 	public static List<Ref> findBranchesReachableFrom(RevCommit commit,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java
index 2c88bb8..4a93f4d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java
@@ -101,9 +101,13 @@ RevCommit next() throws MissingObjectException,
 	 * of this commit by the previous {@link PendingGenerator}.
 	 *
 	 * @param c
+	 *            given commit
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if an object has an unexpected type
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void applyFilterToParents(RevCommit c)
 			throws MissingObjectException, IncorrectObjectTypeException,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoNonIntermixSortGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoNonIntermixSortGenerator.java
index 452545a..c9d8ff9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoNonIntermixSortGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoNonIntermixSortGenerator.java
@@ -33,8 +33,11 @@ class TopoNonIntermixSortGenerator extends Generator {
 	 * @param s
 	 *            generator to pull all commits out of, and into this buffer.
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if an object has an unexpected type
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	TopoNonIntermixSortGenerator(Generator s) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java
index 4739f78..950b0a4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java
@@ -33,8 +33,11 @@ class TopoSortGenerator extends Generator {
 	 * @param s
 	 *            generator to pull all commits out of, and into this buffer.
 	 * @throws MissingObjectException
+	 *             if an object is missing
 	 * @throws IncorrectObjectTypeException
+	 *             if an object has an unexpected type
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	TopoSortGenerator(Generator s) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TreeRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TreeRevFilter.java
index f921449..43571a6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TreeRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TreeRevFilter.java
@@ -12,7 +12,10 @@
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
+import java.util.Set;
 
+import org.eclipse.jgit.internal.storage.commitgraph.ChangedPathFilter;
 import org.eclipse.jgit.diff.DiffConfig;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
@@ -47,6 +50,12 @@ public class TreeRevFilter extends RevFilter {
 
 	private final TreeWalk pathFilter;
 
+	private long changedPathFilterTruePositive = 0;
+
+	private long changedPathFilterFalsePositive = 0;
+
+	private long changedPathFilterNegative = 0;
+
 	/**
 	 * Create a {@link org.eclipse.jgit.revwalk.filter.RevFilter} from a
 	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter}.
@@ -92,13 +101,11 @@ public TreeRevFilter(RevWalk walker, TreeFilter t) {
 		this.rewriteFlag = rewriteFlag;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		throw new UnsupportedOperationException();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit c)
 			throws StopWalkException, MissingObjectException,
@@ -124,12 +131,41 @@ public boolean include(RevWalk walker, RevCommit c)
 			// We have exactly one parent. This is a very common case.
 			//
 			int chgs = 0, adds = 0;
-			while (tw.next()) {
-				chgs++;
-				if (tw.getRawMode(0) == 0 && tw.getRawMode(1) != 0) {
-					adds++;
-				} else {
-					break; // no point in looking at this further.
+			boolean changedPathFilterUsed = false;
+			boolean mustCalculateChgs = true;
+			ChangedPathFilter cpf = c.getChangedPathFilter(walker);
+			if (cpf != null) {
+				Optional<Set<byte[]>> paths = pathFilter.getFilter()
+						.getPathsBestEffort();
+				if (paths.isPresent()) {
+					changedPathFilterUsed = true;
+					for (byte[] path : paths.get()) {
+						if (!cpf.maybeContains(path)) {
+							mustCalculateChgs = false;
+							break;
+						}
+					}
+				}
+			}
+			if (mustCalculateChgs) {
+				while (tw.next()) {
+					chgs++;
+					if (tw.getRawMode(0) == 0 && tw.getRawMode(1) != 0) {
+						adds++;
+					} else {
+						break; // no point in looking at this further.
+					}
+				}
+				if (changedPathFilterUsed) {
+					if (chgs > 0) {
+						changedPathFilterTruePositive++;
+					} else {
+						changedPathFilterFalsePositive++;
+					}
+				}
+			} else {
+				if (changedPathFilterUsed) {
+					changedPathFilterNegative++;
 				}
 			}
 
@@ -149,7 +185,8 @@ public boolean include(RevWalk walker, RevCommit c)
 				// commit. We need to update our filter to its older
 				// name, if we can discover it. Find out what that is.
 				//
-				updateFollowFilter(trees, ((FollowFilter) tw.getFilter()).cfg);
+				updateFollowFilter(trees, ((FollowFilter) tw.getFilter()).cfg,
+						c);
 			}
 			return true;
 		} else if (nParents == 0) {
@@ -241,13 +278,47 @@ public boolean include(RevWalk walker, RevCommit c)
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return false;
 	}
 
-	private void updateFollowFilter(ObjectId[] trees, DiffConfig cfg)
+	/**
+	 * Return how many times a changed path filter correctly predicted that a
+	 * path was changed in a commit, for statistics gathering purposes.
+	 *
+	 * @return count of true positives
+	 * @since 6.7
+	 */
+	public long getChangedPathFilterTruePositive() {
+		return changedPathFilterTruePositive;
+	}
+
+	/**
+	 * Return how many times a changed path filter wrongly predicted that a path
+	 * was changed in a commit, for statistics gathering purposes.
+	 *
+	 * @return count of false positives
+	 * @since 6.7
+	 */
+	public long getChangedPathFilterFalsePositive() {
+		return changedPathFilterFalsePositive;
+	}
+
+	/**
+	 * Return how many times a changed path filter predicted that a path was not
+	 * changed in a commit (allowing that commit to be skipped), for statistics
+	 * gathering purposes.
+	 *
+	 * @return count of negatives
+	 * @since 6.7
+	 */
+	public long getChangedPathFilterNegative() {
+		return changedPathFilterNegative;
+	}
+
+	private void updateFollowFilter(ObjectId[] trees, DiffConfig cfg,
+			RevCommit commit)
 			throws MissingObjectException, IncorrectObjectTypeException,
 			CorruptObjectException, IOException {
 		TreeWalk tw = pathFilter;
@@ -266,7 +337,7 @@ private void updateFollowFilter(ObjectId[] trees, DiffConfig cfg)
 				newFilter = FollowFilter.create(ent.getOldPath(), cfg);
 				RenameCallback callback = oldFilter.getRenameCallback();
 				if (callback != null) {
-					callback.renamed(ent);
+					callback.renamed(ent, commit);
 					// forward the callback to the new follow filter
 					((FollowFilter) newFilter).setRenameCallback(callback);
 				}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java
index 6ac490a..4100e87 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitTimeRevFilter.java
@@ -98,13 +98,11 @@ public static final RevFilter between(long since, long until) {
 		when = (int) (ts / 1000);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MaxCountRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MaxCountRevFilter.java
index 0e3a803..09bcb33 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MaxCountRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MaxCountRevFilter.java
@@ -46,7 +46,6 @@ private MaxCountRevFilter(int maxCount) {
 		this.maxCount = maxCount;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit cmit)
 			throws StopWalkException, MissingObjectException,
@@ -57,7 +56,6 @@ public boolean include(RevWalk walker, RevCommit cmit)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return new MaxCountRevFilter(maxCount);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/NotRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/NotRevFilter.java
index 1482c51..8fcebc9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/NotRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/NotRevFilter.java
@@ -38,13 +38,11 @@ private NotRevFilter(RevFilter one) {
 		a = one;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter negate() {
 		return a;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit c)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -52,19 +50,16 @@ public boolean include(RevWalk walker, RevCommit c)
 		return !a.include(walker, c);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return a.requiresCommitBody();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return new NotRevFilter(a.clone());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "NOT " + a.toString(); //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java
index 256e479..8430646 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java
@@ -264,7 +264,6 @@ public abstract boolean include(RevWalk walker, RevCommit cmit)
 	@Override
 	public abstract RevFilter clone();
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		String n = getClass().getName();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFlagFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFlagFilter.java
index 16d9f76..f9ee632 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFlagFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFlagFilter.java
@@ -91,13 +91,11 @@ public static RevFilter hasAny(RevFlagSet a) {
 		flags = m;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return super.toString() + flags;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java
index 84df36a..bf93b7b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java
@@ -45,7 +45,6 @@ private SkipRevFilter(int skip) {
 		this.skip = skip;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit cmit)
 			throws StopWalkException, MissingObjectException,
@@ -55,7 +54,6 @@ public boolean include(RevWalk walker, RevCommit cmit)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return new SkipRevFilter(skip);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SubStringRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SubStringRevFilter.java
index 7f00dfd..ff1fea2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SubStringRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SubStringRevFilter.java
@@ -67,7 +67,6 @@ protected SubStringRevFilter(String patternText) {
 		pattern = new RawSubStringPattern(patternText);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit cmit)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -75,7 +74,6 @@ public boolean include(RevWalk walker, RevCommit cmit)
 		return pattern.match(text(cmit)) >= 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return true;
@@ -90,13 +88,11 @@ public boolean requiresCommitBody() {
 	 */
 	protected abstract RawCharSequence text(RevCommit cmit);
 
-	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return this; // Typically we are actually thread-safe.
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java
index cba5e16..910c5cb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java
@@ -84,7 +84,6 @@ public FileBasedConfig(Config base, File cfgLocation, FS fs) {
 		this.hash = ObjectId.zeroId();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean notifyUponTransientChanges() {
 		// we will notify listeners upon save()
@@ -197,7 +196,6 @@ public void save() throws IOException {
 		fireConfigChangedEvent();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		hash = hash(new byte[0]);
@@ -208,7 +206,6 @@ private static ObjectId hash(byte[] rawText) {
 		return ObjectId.fromRaw(Constants.newMessageDigest().digest(rawText));
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java
index b0b1d4f..95c001e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java
@@ -256,8 +256,9 @@ public class PackConfig {
 	public static final int DEFAULT_MIN_BYTES_FOR_OBJ_SIZE_INDEX = -1;
 
 	/**
-	 * Default max time to spend during the search for reuse phase. This
-	 * optimization is disabled by default: {@value}
+	 * Default max time to spend during the search for reuse phase.
+	 *
+	 * This optimization is disabled by default: {@link Integer#MAX_VALUE} seconds.
 	 *
 	 * @see #setSearchForReuseTimeout(Duration)
 	 * @since 5.13
@@ -1185,7 +1186,7 @@ public int getBitmapInactiveBranchAgeInDays() {
 	/**
 	 * Get the max time to spend during the search for reuse phase.
 	 *
-	 * Default setting: {@value #DEFAULT_SEARCH_FOR_REUSE_TIMEOUT}
+	 * Default setting: {@link #DEFAULT_SEARCH_FOR_REUSE_TIMEOUT}
 	 *
 	 * @return the maximum time to spend during the search for reuse phase.
 	 * @since 5.13
@@ -1197,7 +1198,7 @@ public Duration getSearchForReuseTimeout() {
 	/**
 	 * Set the age in days that marks a branch as "inactive".
 	 *
-	 * Default setting: {@value #DEFAULT_BITMAP_INACTIVE_BRANCH_AGE_IN_DAYS}
+	 * Default setting: {@link #DEFAULT_BITMAP_INACTIVE_BRANCH_AGE_IN_DAYS}
 	 *
 	 * @param ageInDays
 	 *            the age in days that marks a branch as "inactive"
@@ -1234,7 +1235,7 @@ public void setBitmapExcludedRefsPrefixes(String[] excludedRefsPrefixes) {
 	 * @param timeout
 	 *            max time allowed during the search for reuse phase
 	 *
-	 *            Default setting: {@value #DEFAULT_SEARCH_FOR_REUSE_TIMEOUT}
+	 *            Default setting: {@link #DEFAULT_SEARCH_FOR_REUSE_TIMEOUT}
 	 * @since 5.13
 	 */
 	public void setSearchForReuseTimeout(Duration timeout) {
@@ -1369,7 +1370,6 @@ public void fromConfig(Config rc) {
 				CONFIG_KEY_PRUNE_PRESERVED, DEFAULT_PRUNE_PRESERVED));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder b = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleConflict.java b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleConflict.java
index 856eb72..f09e1a5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleConflict.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleConflict.java
@@ -55,9 +55,11 @@ public class SubmoduleConflict extends Sequence {
     private final ObjectId objectId;
 
     /**
-     * Create a SubmoduleConflict for the given submodule object id
-     * @param objectId
-     */
+	 * Create a SubmoduleConflict for the given submodule object id
+	 *
+	 * @param objectId
+	 *            the id of the object to create a submodule conflict for
+	 */
     public SubmoduleConflict(ObjectId objectId) {
         super();
         this.objectId = objectId;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
index bf77021..7d5836e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
@@ -87,6 +87,7 @@ public enum IgnoreSubmoduleMode {
 	 * @return generator over submodule index entries. The caller is responsible
 	 *         for calling {@link #close()}.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static SubmoduleWalk forIndex(Repository repository)
 			throws IOException {
@@ -116,6 +117,7 @@ public static SubmoduleWalk forIndex(Repository repository)
 	 * @return generator at given path. The caller is responsible for calling
 	 *         {@link #close()}. Null if no submodule at given path.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static SubmoduleWalk forPath(Repository repository,
 			AnyObjectId treeId, String path) throws IOException {
@@ -150,6 +152,7 @@ public static SubmoduleWalk forPath(Repository repository,
 	 * @return generator at given path. The caller is responsible for calling
 	 *         {@link #close()}. Null if no submodule at given path.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static SubmoduleWalk forPath(Repository repository,
 			AbstractTreeIterator iterator, String path) throws IOException {
@@ -193,6 +196,7 @@ public static File getSubmoduleDirectory(final Repository parent,
 	 *            submodule path
 	 * @return repository or null if repository doesn't exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static Repository getSubmoduleRepository(final Repository parent,
 			final String path) throws IOException {
@@ -209,6 +213,7 @@ public static Repository getSubmoduleRepository(final Repository parent,
 	 *            submodule path
 	 * @return repository or null if repository doesn't exist
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static Repository getSubmoduleRepository(final File parent,
 			final String path) throws IOException {
@@ -220,11 +225,14 @@ public static Repository getSubmoduleRepository(final File parent,
 	 * abstraction
 	 *
 	 * @param parent
+	 *            {@link Repository} that contains the submodule
 	 * @param path
+	 *            of the working tree of the submodule
 	 * @param fs
 	 *            the file system abstraction to be used
 	 * @return repository or null if repository doesn't exist
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 4.10
 	 */
 	public static Repository getSubmoduleRepository(final File parent,
@@ -249,7 +257,7 @@ public static Repository getSubmoduleRepository(final File parent,
 	 * @return the {@link Repository} of the submodule, or {@code null} if it
 	 *         doesn't exist
 	 * @throws IOException
-	 *             on errors
+	 *             if an IO error occurred
 	 * @since 5.6
 	 */
 	public static Repository getSubmoduleRepository(File parent, String path,
@@ -286,6 +294,7 @@ public static Repository getSubmoduleRepository(File parent, String path,
 	 *            absolute or relative URL of the submodule repository
 	 * @return resolved URL
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public static String getSubmoduleRemoteUrl(final Repository parent,
 			final String url) throws IOException {
@@ -369,6 +378,7 @@ else if (submoduleUrl.startsWith("../")) { //$NON-NLS-1$
 	 * @param repository
 	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public SubmoduleWalk(Repository repository) throws IOException {
 		this.repository = repository;
@@ -419,13 +429,14 @@ public SubmoduleWalk setRootTree(AbstractTreeIterator tree) {
 	 * The root tree is not read until the first submodule is encountered by the
 	 * walk.
 	 * <p>
-	 * This method need only be called if constructing a walk manually instead of
-	 * with one of the static factory methods above.
+	 * This method need only be called if constructing a walk manually instead
+	 * of with one of the static factory methods above.
 	 *
 	 * @param id
 	 *            ID of a tree containing .gitmodules
 	 * @return this generator
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public SubmoduleWalk setRootTree(AnyObjectId id) throws IOException {
 		final CanonicalTreeParser p = new CanonicalTreeParser();
@@ -448,6 +459,7 @@ public SubmoduleWalk setRootTree(AnyObjectId id) throws IOException {
 	 * @throws java.io.IOException
 	 *             if an error occurred, or if the repository is bare
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 */
 	public SubmoduleWalk loadModulesConfig() throws IOException, ConfigInvalidException {
 		if (rootTree == null) {
@@ -512,11 +524,13 @@ private void loadPathNames() {
 	 *
 	 * @param repository
 	 *            the repository to check
-	 * @return <code>true</code> if the working tree contains a .gitmodules file,
-	 *         <code>false</code> otherwise. Always returns <code>false</code>
-	 *         for bare repositories.
+	 * @return <code>true</code> if the working tree contains a .gitmodules
+	 *         file, <code>false</code> otherwise. Always returns
+	 *         <code>false</code> for bare repositories.
 	 * @throws java.io.IOException
-	 * @throws CorruptObjectException if any.
+	 *             if an IO error occurred
+	 * @throws CorruptObjectException
+	 *             if a corrupt object was found
 	 * @since 3.6
 	 */
 	public static boolean containsGitModulesFile(Repository repository)
@@ -560,6 +574,7 @@ public SubmoduleWalk setFilter(TreeFilter filter) {
 	 *            object.
 	 * @return this generator
 	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             if a corrupt object was found
 	 */
 	public SubmoduleWalk setTree(AbstractTreeIterator iterator)
 			throws CorruptObjectException {
@@ -574,10 +589,11 @@ public SubmoduleWalk setTree(AbstractTreeIterator iterator)
 	 *            an {@link org.eclipse.jgit.lib.AnyObjectId} object.
 	 * @return this generator
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws IncorrectObjectTypeException
-	 *             if any.
+	 *             if object has unexpected type
 	 * @throws MissingObjectException
-	 *             if any.
+	 *             if object is missing
 	 */
 	public SubmoduleWalk setTree(AnyObjectId treeId) throws IOException {
 		walk.addTree(treeId);
@@ -614,6 +630,7 @@ public File getDirectory() {
 	 *
 	 * @return true if entry found, false otherwise
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public boolean next() throws IOException {
 		while (walk.next()) {
@@ -656,9 +673,11 @@ public void setBuilderFactory(RepositoryBuilderFactory factory) {
 	 * name of .git/config)
 	 *
 	 * @since 4.10
-	 * @return name
+	 * @return name of the submodule
 	 * @throws ConfigInvalidException
+	 *             if the .gitmodules config is invalid
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public String getModuleName() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
@@ -680,7 +699,9 @@ public ObjectId getObjectId() {
 	 *
 	 * @return configured path
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public String getModulesPath() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
@@ -694,7 +715,9 @@ public String getModulesPath() throws IOException, ConfigInvalidException {
 	 *
 	 * @return configured URL
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public String getConfigUrl() throws IOException, ConfigInvalidException {
 		return repoConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
@@ -707,7 +730,9 @@ public String getConfigUrl() throws IOException, ConfigInvalidException {
 	 *
 	 * @return configured URL
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public String getModulesUrl() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
@@ -721,7 +746,9 @@ public String getModulesUrl() throws IOException, ConfigInvalidException {
 	 *
 	 * @return update value
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public String getConfigUpdate() throws IOException, ConfigInvalidException {
 		return repoConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
@@ -734,7 +761,9 @@ public String getConfigUpdate() throws IOException, ConfigInvalidException {
 	 *
 	 * @return update value
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public String getModulesUpdate() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
@@ -748,7 +777,9 @@ public String getModulesUpdate() throws IOException, ConfigInvalidException {
 	 *
 	 * @return ignore value
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.6
 	 */
 	public IgnoreSubmoduleMode getModulesIgnore() throws IOException,
@@ -771,6 +802,7 @@ ConfigConstants.CONFIG_SUBMODULE_SECTION, getModuleName(),
 	 *
 	 * @return repository or null if non-existent
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public Repository getRepository() throws IOException {
 		return getSubmoduleRepository(repository.getWorkTree(), path,
@@ -782,6 +814,7 @@ public Repository getRepository() throws IOException {
 	 *
 	 * @return object id of HEAD reference
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public ObjectId getHead() throws IOException {
 		try (Repository subRepo = getRepository()) {
@@ -797,6 +830,7 @@ public ObjectId getHead() throws IOException {
 	 *
 	 * @return ref name, null on failures
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public String getHeadRef() throws IOException {
 		try (Repository subRepo = getRepository()) {
@@ -816,7 +850,9 @@ public String getHeadRef() throws IOException {
 	 *
 	 * @return resolved remote URL
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if .gitmodules config is invalid
 	 */
 	public String getRemoteUrl() throws IOException, ConfigInvalidException {
 		String url = getModulesUrl();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AbstractAdvertiseRefsHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AbstractAdvertiseRefsHook.java
index fb9c145..260a85e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AbstractAdvertiseRefsHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AbstractAdvertiseRefsHook.java
@@ -58,7 +58,6 @@
  * @since 2.0
  */
 public abstract class AbstractAdvertiseRefsHook implements AdvertiseRefsHook {
-	/** {@inheritDoc} */
 	@Override
 	public void advertiseRefs(UploadPack uploadPack)
 			throws ServiceMayNotContinueException {
@@ -67,7 +66,6 @@ public void advertiseRefs(UploadPack uploadPack)
 	}
 
 	/**
-	 * {@inheritDoc}
 	 */
 	@Override
 	public void advertiseRefs(ReceivePack receivePack)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHook.java
index 84c3691..6381f1e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHook.java
@@ -92,6 +92,7 @@ void advertiseRefs(UploadPack uploadPack)
 	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 5.6
 	 */
 	void advertiseRefs(ReceivePack receivePack)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHookChain.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHookChain.java
index eb9c673..6db0775 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHookChain.java
@@ -50,9 +50,6 @@ public static AdvertiseRefsHook newChain(List<? extends AdvertiseRefsHook> hooks
 		}
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public void advertiseRefs(ReceivePack rp)
 			throws IOException {
@@ -60,7 +57,6 @@ public void advertiseRefs(ReceivePack rp)
 			hooks[i].advertiseRefs(rp);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void advertiseRefs(UploadPack rp)
 			throws ServiceMayNotContinueException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java
index 9e229a1..3ac9f59 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java
@@ -38,25 +38,21 @@ public abstract class BaseConnection implements Connection {
 
 	private Writer messageWriter;
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefsMap() {
 		return advertisedRefs;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final Collection<Ref> getRefs() {
 		return advertisedRefs.values();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final Ref getRef(String name) {
 		return advertisedRefs.get(name);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getMessages() {
 		return messageWriter != null ? messageWriter.toString() : ""; //$NON-NLS-1$
@@ -84,7 +80,6 @@ protected void setPeerUserAgent(String agent) {
 		peerUserAgent = agent;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public abstract void close();
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseFetchConnection.java
index 6954bd9..48992f3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseFetchConnection.java
@@ -31,7 +31,6 @@
  */
 abstract class BaseFetchConnection extends BaseConnection implements
 		FetchConnection {
-	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have)
@@ -39,7 +38,6 @@ public final void fetch(final ProgressMonitor monitor,
 		fetch(monitor, want, have, null);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
index 09c559d..bac5025 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
@@ -64,6 +64,7 @@
  */
 abstract class BasePackConnection extends BaseConnection {
 
+	/** The capability prefix for a symlink */
 	protected static final String CAPABILITY_SYMREF_PREFIX = "symref="; //$NON-NLS-1$
 
 	/** The repository this transport fetches into, or pushes out of. */
@@ -72,7 +73,7 @@ abstract class BasePackConnection extends BaseConnection {
 	/** Remote repository location. */
 	protected final URIish uri;
 
-	/** A transport connected to {@link #uri}. */
+	/** A transport connected to {@link BasePackConnection#uri}. */
 	protected final Transport transport;
 
 	/** Low-level input stream, if a timeout was configured. */
@@ -81,7 +82,10 @@ abstract class BasePackConnection extends BaseConnection {
 	/** Low-level output stream, if a timeout was configured. */
 	protected TimeoutOutputStream timeoutOut;
 
-	/** Timer to manage {@link #timeoutIn} and {@link #timeoutOut}. */
+	/**
+	 * Timer to manage {@link #timeoutIn} and
+	 * {@link BasePackConnection#timeoutOut}.
+	 */
 	private InterruptTimer myTimer;
 
 	/** Input stream reading from the remote. */
@@ -90,13 +94,16 @@ abstract class BasePackConnection extends BaseConnection {
 	/** Output stream sending to the remote. */
 	protected OutputStream out;
 
-	/** Packet line decoder around {@link #in}. */
+	/** Packet line decoder around {@link BasePackConnection#in}. */
 	protected PacketLineIn pckIn;
 
-	/** Packet line encoder around {@link #out}. */
+	/** Packet line encoder around {@link BasePackConnection#out}. */
 	protected PacketLineOut pckOut;
 
-	/** Send {@link PacketLineOut#end()} before closing {@link #out}? */
+	/**
+	 * Send {@link PacketLineOut#end()} before closing
+	 * {@link BasePackConnection#out}?
+	 */
 	protected boolean outNeedsEnd;
 
 	/** True if this is a stateless RPC connection. */
@@ -486,7 +493,6 @@ private void processLineV2(String line, ObjectId id, String rest,
 	 * <p>
 	 * If refMap already contains an entry for symRef.key, it is replaced.
 	 * </p>
-	 * </p>
 	 * <p>
 	 * For example, given:
 	 * </p>
@@ -627,7 +633,6 @@ protected void addUserAgentCapability(StringBuilder b) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getPeerUserAgent() {
 		String agent = remoteCapabilities.get(OPTION_AGENT);
@@ -642,7 +647,6 @@ private PackProtocolException invalidRefAdvertisementLine(String line) {
 		return new PackProtocolException(uri, MessageFormat.format(JGitText.get().invalidRefAdvertisementLine, line));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (out != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
index 8909380..cdda3c0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
@@ -334,7 +334,6 @@ static class FetchConfig {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have)
@@ -342,7 +341,6 @@ public final void fetch(final ProgressMonitor monitor,
 		fetch(monitor, want, have, null);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have,
@@ -351,25 +349,21 @@ public final void fetch(final ProgressMonitor monitor,
 		doFetch(monitor, want, have, outputStream);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean didFetchIncludeTags() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean didFetchTestConnectivity() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setPackLockMessage(String message) {
 		lockMessage = message;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<PackLock> getPackLocks() {
 		if (packLock != null)
@@ -659,7 +653,6 @@ private boolean readAcknowledgments(FetchStateV2 fetchState,
 		return gotReady;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (walk != null)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java
index adc1c98..9a96fdc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java
@@ -122,7 +122,6 @@ public BasePackPushConnection(PackTransport packTransport) {
 		useBitmaps = transport.isPushUseBitmaps();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates)
@@ -130,7 +129,6 @@ public void push(final ProgressMonitor monitor,
 		push(monitor, refUpdates, null);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates, OutputStream outputStream)
@@ -139,7 +137,6 @@ public void push(final ProgressMonitor monitor,
 		doPush(monitor, refUpdates, outputStream);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected TransportException noRepository(Throwable cause) {
 		// Sadly we cannot tell the "invalid URI" case from "push not allowed".
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java
index f04e573..5299dfa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java
@@ -147,13 +147,11 @@ private String readLine(byte[] hdrbuf) throws IOException {
 		return line.toString();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean didFetchTestConnectivity() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void doFetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have)
@@ -174,13 +172,11 @@ protected void doFetch(final ProgressMonitor monitor,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setPackLockMessage(String message) {
 		lockMessage = message;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<PackLock> getPackLocks() {
 		if (packLock != null)
@@ -258,7 +254,6 @@ private void verifyPrerequisites() throws TransportException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (bin != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ChainingCredentialsProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ChainingCredentialsProvider.java
index 6a4cfca..3bae0ea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ChainingCredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ChainingCredentialsProvider.java
@@ -39,7 +39,6 @@ public ChainingCredentialsProvider(CredentialsProvider... providers) {
 				Arrays.asList(providers));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		for (CredentialsProvider p : credentialProviders)
@@ -48,7 +47,6 @@ public boolean isInteractive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialsProvider p : credentialProviders)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialItem.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialItem.java
index 2b09424..78c5c63 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialItem.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialItem.java
@@ -115,8 +115,8 @@ public String getValue() {
 		}
 
 		/**
-		 *
 		 * @param newValue
+		 *            the new value
 		 */
 		public void setValue(String newValue) {
 			value = newValue;
@@ -223,6 +223,7 @@ public boolean getValue() {
 		 * Set the new value.
 		 *
 		 * @param newValue
+		 *            the new value
 		 */
 		public void setValue(boolean newValue) {
 			value = newValue;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java
index a8cf849..12a7dd3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java
@@ -55,7 +55,6 @@ boolean contains(int type) {
 			return val.testBit(type);
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public boolean equals(Object obj) {
 			if (!(obj instanceof ObjectTypes)) {
@@ -66,7 +65,6 @@ public boolean equals(Object obj) {
 			return other.val.equals(val);
 		}
 
-		/** {@inheritDoc} */
 		@Override
 		public int hashCode() {
 			return val.hashCode();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FtpChannel.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FtpChannel.java
index 44656c1..6d5b5e6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FtpChannel.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FtpChannel.java
@@ -71,6 +71,7 @@ public int getStatus() {
 	 * @param unit
 	 *            of the {@code timeout}
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void connect(int timeout, TimeUnit unit) throws IOException;
 
@@ -97,6 +98,7 @@ public int getStatus() {
 	/**
 	 * @return the current remote directory path
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	String pwd() throws IOException;
 
@@ -118,6 +120,7 @@ interface DirEntry {
 	 *            of the directory to list
 	 * @return the directory entries
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	Collection<DirEntry> ls(String path) throws IOException;
 
@@ -128,6 +131,7 @@ interface DirEntry {
 	 * @param path
 	 *            to delete
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void rmdir(String path) throws IOException;
 
@@ -137,6 +141,7 @@ interface DirEntry {
 	 * @param path
 	 *            to create
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	void mkdir(String path) throws IOException;
 
@@ -148,6 +153,7 @@ interface DirEntry {
 	 *
 	 * @return the stream to read from
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	InputStream get(String path) throws IOException;
 
@@ -160,6 +166,7 @@ interface DirEntry {
 	 *
 	 * @return the stream to read from
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	OutputStream put(String path) throws IOException;
 
@@ -204,6 +211,7 @@ default void delete(String path) throws IOException {
 	 * @param to
 	 *            new name of the file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @see <a href=
 	 *      "http://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html">stdio.h:
 	 *      rename()</a>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HMACSHA1NonceGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HMACSHA1NonceGenerator.java
index 14d6c1e..655b460 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HMACSHA1NonceGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HMACSHA1NonceGenerator.java
@@ -35,9 +35,8 @@ public class HMACSHA1NonceGenerator implements NonceGenerator {
 	 *
 	 * @param seed
 	 *            seed the generator
-	 * @throws java.lang.IllegalStateException
 	 */
-	public HMACSHA1NonceGenerator(String seed) throws IllegalStateException {
+	public HMACSHA1NonceGenerator(String seed) {
 		try {
 			byte[] keyBytes = seed.getBytes(ISO_8859_1);
 			SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); //$NON-NLS-1$
@@ -48,16 +47,13 @@ public HMACSHA1NonceGenerator(String seed) throws IllegalStateException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
-	public synchronized String createNonce(Repository repo, long timestamp)
-			throws IllegalStateException {
+	public synchronized String createNonce(Repository repo, long timestamp) {
 		String input = repo.getIdentifier() + ":" + String.valueOf(timestamp); //$NON-NLS-1$
 		byte[] rawHmac = mac.doFinal(input.getBytes(UTF_8));
 		return Long.toString(timestamp) + "-" + toHex(rawHmac); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public NonceStatus verify(String received, String sent,
 			Repository db, boolean allowSlop, int slop) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java
index aec5b89..3db0421 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java
@@ -224,7 +224,9 @@ boolean authorize(URIish uri, CredentialsProvider credentialsProvider) {
 	 * Update this method with the given username and password pair.
 	 *
 	 * @param user
+	 *            username
 	 * @param pass
+	 *            password
 	 */
 	abstract void authorize(String user, String pass);
 
@@ -232,7 +234,9 @@ boolean authorize(URIish uri, CredentialsProvider credentialsProvider) {
 	 * Update connection properties based on this authentication method.
 	 *
 	 * @param conn
+	 *            the connection to configure
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	abstract void configureRequest(HttpConnection conn) throws IOException;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalFetchConnection.java
index 18dc792..9a699a8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalFetchConnection.java
@@ -103,7 +103,6 @@ public void run() {
 		readAdvertisedRefs();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		super.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalPushConnection.java
index d2b0ef4..a23fdc9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalPushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalPushConnection.java
@@ -99,7 +99,6 @@ public void run() {
 		readAdvertisedRefs();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		super.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/LsRefsV2Request.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/LsRefsV2Request.java
index 856047e..b2799e1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/LsRefsV2Request.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/LsRefsV2Request.java
@@ -130,6 +130,7 @@ private Builder() {
 
 		/**
 		 * @param value
+		 *            ref prefix values
 		 * @return the Builder
 		 */
 		public Builder setRefPrefixes(List<String> value) {
@@ -139,6 +140,7 @@ public Builder setRefPrefixes(List<String> value) {
 
 		/**
 		 * @param value
+		 *            of symrefs
 		 * @return the Builder
 		 */
 		public Builder setSymrefs(boolean value) {
@@ -148,6 +150,7 @@ public Builder setSymrefs(boolean value) {
 
 		/**
 		 * @param value
+		 *            of peel
 		 * @return the Builder
 		 */
 		public Builder setPeel(boolean value) {
@@ -203,7 +206,11 @@ public Builder setClientSID(@Nullable String value) {
 			return this;
 		}
 
-		/** @return LsRefsV2Request */
+		/**
+		 * Builds the request
+		 *
+		 * @return LsRefsV2Request the request
+		 */
 		public LsRefsV2Request build() {
 			return new LsRefsV2Request(
 					Collections.unmodifiableList(refPrefixes), symrefs, peel,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRCCredentialsProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRCCredentialsProvider.java
index 6531b17..e32530c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRCCredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRCCredentialsProvider.java
@@ -67,7 +67,6 @@ public static void install() {
 		CredentialsProvider.setDefault(new NetRCCredentialsProvider());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -81,7 +80,6 @@ else if (i instanceof CredentialItem.Password)
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean get(URIish uri, CredentialItem... items)
 			throws UnsupportedCredentialItem {
@@ -112,7 +110,6 @@ public boolean get(URIish uri, CredentialItem... items)
 		return !isAnyNull(items);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NonceGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NonceGenerator.java
index 2541ff1..30e80e0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NonceGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NonceGenerator.java
@@ -31,10 +31,8 @@ public interface NonceGenerator {
 	 * @param timestamp
 	 *            The current time in seconds.
 	 * @return The nonce to be signed by the pusher
-	 * @throws java.lang.IllegalStateException
 	 */
-	String createNonce(Repository db, long timestamp)
-			throws IllegalStateException;
+	String createNonce(Repository db, long timestamp);
 
 	/**
 	 * Verify trustworthiness of the received nonce.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectInfoRequest.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectInfoRequest.java
index 86a2716..2a52d7f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectInfoRequest.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectInfoRequest.java
@@ -53,6 +53,7 @@ private Builder() {
 
 		/**
 		 * @param value
+		 *            of objectIds
 		 * @return the Builder
 		 */
 		public Builder setObjectIDs(List<ObjectId> value) {
@@ -60,7 +61,11 @@ public Builder setObjectIDs(List<ObjectId> value) {
 			return this;
 		}
 
-		/** @return ObjectInfoRequest */
+		/**
+		 * Build the request
+		 *
+		 * @return ObjectInfoRequest the request
+		 */
 		public ObjectInfoRequest build() {
 			return new ObjectInfoRequest(
 					Collections.unmodifiableList(objectIDs));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
index d966904..fe9ddab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
@@ -1102,6 +1102,7 @@ private void whole(long pos, int type, long sz)
 	 * @param data
 	 *            raw content of the object.
 	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             if a corrupt object was found
 	 * @since 4.9
 	 */
 	protected void verifySafeObject(final AnyObjectId id, final int type,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackedObjectInfo.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackedObjectInfo.java
index bf7997e..d7ef4f8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackedObjectInfo.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackedObjectInfo.java
@@ -117,6 +117,7 @@ public void setType(int type) {
 	 * Size in storage
 	 *
 	 * @param sizeBeforeInflating
+	 *            size before inflating
 	 */
 	void setSize(long sizeBeforeInflating) {
 		this.sizeBeforeInflating = sizeBeforeInflating;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHookChain.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHookChain.java
index 4d53e1b..f9d2c38 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHookChain.java
@@ -47,7 +47,6 @@ public static PostReceiveHook newChain(
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onPostReceive(ReceivePack rp,
 			Collection<ReceiveCommand> commands) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHookChain.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHookChain.java
index 4334888..072f43f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHookChain.java
@@ -80,7 +80,6 @@ public static PostUploadHook newChain(List<PostUploadHook> hooks) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onPostUpload(PackStatistics stats) {
 		for (PostUploadHook hook : hooks) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHookChain.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHookChain.java
index dffa30d..2a5522b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHookChain.java
@@ -46,7 +46,6 @@ public static PreReceiveHook newChain(List<? extends PreReceiveHook> hooks) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onPreReceive(ReceivePack rp,
 			Collection<ReceiveCommand> commands) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHookChain.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHookChain.java
index 9c28abe..dc703d0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHookChain.java
@@ -48,7 +48,6 @@ public static PreUploadHook newChain(List<PreUploadHook> hooks) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onBeginNegotiateRound(UploadPack up,
 			Collection<? extends ObjectId> wants, int cntOffered)
@@ -58,7 +57,6 @@ public void onBeginNegotiateRound(UploadPack up,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onEndNegotiateRound(UploadPack up,
 			Collection<? extends ObjectId> wants, int cntCommon,
@@ -69,7 +67,6 @@ public void onEndNegotiateRound(UploadPack up,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void onSendPack(UploadPack up,
 			Collection<? extends ObjectId> wants,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProtocolV0Parser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProtocolV0Parser.java
index 9d05551..f1afeab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProtocolV0Parser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProtocolV0Parser.java
@@ -51,7 +51,9 @@ final class ProtocolV0Parser {
 	 *            incoming lines. This method will read until an END line.
 	 * @return a FetchV0Request with the data received in the wire.
 	 * @throws PackProtocolException
+	 *             if a protocol occurred
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	FetchV0Request recvWants(PacketLineIn pckIn)
 			throws PackProtocolException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificate.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificate.java
index d9831c7..437abb0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificate.java
@@ -222,13 +222,11 @@ private StringBuilder toStringBuilder() {
 		return sb;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return signature.hashCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (!(o instanceof PushCertificate)) {
@@ -259,7 +257,6 @@ private static boolean commandsEqual(PushCertificate c1, PushCertificate c2) {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return getClass().getSimpleName() + '['
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateIdent.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateIdent.java
index 94d1169..bd76b34 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateIdent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateIdent.java
@@ -228,20 +228,17 @@ public int getTimeZoneOffset() {
 		return tzOffset;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		return (o instanceof PushCertificateIdent)
 			&& raw.equals(((PushCertificateIdent) o).raw);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return raw.hashCode();
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConnection.java
index 51c8558..32c443f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConnection.java
@@ -43,17 +43,14 @@ public interface PushConnection extends Connection {
 	 * and sending objects that remote repository need to have a consistent
 	 * objects graph from new refs.
 	 * <p>
-	 * <p>
 	 * Only one call per connection is allowed. Subsequent calls will result in
 	 * {@link org.eclipse.jgit.errors.TransportException}.
-	 * </p>
 	 * <p>
 	 * Implementation may use local repository to send a minimum set of objects
 	 * needed by remote repository in efficient way.
 	 * {@link org.eclipse.jgit.transport.Transport#isPushThin()} should be
 	 * honored if applicable. refUpdates should be filled with information about
 	 * status of each update.
-	 * </p>
 	 *
 	 * @param monitor
 	 *            progress monitor to update the end-user about the amount of
@@ -90,17 +87,14 @@ void push(final ProgressMonitor monitor,
 	 * and sending objects that remote repository need to have a consistent
 	 * objects graph from new refs.
 	 * <p>
-	 * <p>
 	 * Only one call per connection is allowed. Subsequent calls will result in
 	 * {@link org.eclipse.jgit.errors.TransportException}.
-	 * </p>
 	 * <p>
 	 * Implementation may use local repository to send a minimum set of objects
 	 * needed by remote repository in efficient way.
 	 * {@link org.eclipse.jgit.transport.Transport#isPushThin()} should be
 	 * honored if applicable. refUpdates should be filled with information about
 	 * status of each update.
-	 * </p>
 	 *
 	 * @param monitor
 	 *            progress monitor to update the end-user about the amount of
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java
index b59ae0c..8f90f32 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java
@@ -76,6 +76,7 @@ class PushProcess {
 	 *            {@link PrePushHook} to run after the remote advertisement has
 	 *            been gotten
 	 * @throws TransportException
+	 *             if a protocol error occurred during push/fetch
 	 */
 	PushProcess(Transport transport, Collection<RemoteRefUpdate> toPush,
 			PrePushHook prePush) throws TransportException {
@@ -96,6 +97,7 @@ class PushProcess {
 	 * @param out
 	 *            OutputStream to write messages to
 	 * @throws TransportException
+	 *             if a protocol error occurred during push/fetch
 	 */
 	PushProcess(Transport transport, Collection<RemoteRefUpdate> toPush,
 			PrePushHook prePush, OutputStream out) throws TransportException {
@@ -272,6 +274,7 @@ private Map<String, RemoteRefUpdate> prepareRemoteUpdates()
 	 *            {@link ObjectId} of the new commit
 	 * @return {@code true} if the update fast-forwards, {@code false} otherwise
 	 * @throws TransportException
+	 *             if a protocol error occurred during push/fetch
 	 */
 	private boolean isFastForward(ObjectId oldOid, ObjectId newOid)
 			throws TransportException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
index ab41160..bfc75f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
@@ -849,7 +849,6 @@ void reject(IOException err) {
 				JGitText.get().lockError, err.getMessage()));
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
index 816cec8..9a61774 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
@@ -460,6 +460,7 @@ public Map<String, Ref> getAdvertisedRefs() {
 	 *            null, assumes the default set of additional haves from the
 	 *            repository.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public void setAdvertisedRefs(Map<String, Ref> allRefs,
 			Set<ObjectId> additionalHaves) throws IOException {
@@ -1024,6 +1025,7 @@ public List<ReceiveCommand> getAllCommands() {
 	 * Set an error handler for {@link ReceiveCommand}.
 	 *
 	 * @param receiveCommandErrorHandler
+	 *            the error handler
 	 * @since 5.7
 	 */
 	public void setReceiveCommandErrorHandler(
@@ -1212,6 +1214,7 @@ protected void init(final InputStream input, final OutputStream output,
 	 *
 	 * @return advertised refs, or the default if not explicitly advertised.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private Map<String, Ref> getAdvertisedOrDefaultRefs() throws IOException {
 		if (refs == null)
@@ -1348,7 +1351,8 @@ private Map<String, Ref> getAllRefs() {
 	/**
 	 * Receive a list of commands from the input.
 	 *
-	 * @throws java.io.IOException
+	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void recvCommands() throws IOException {
 		PacketLineIn pck = maxCommandBytes > 0
@@ -1936,7 +1940,8 @@ else if (cmd.getMessage()
 	/**
 	 * Close and flush (if necessary) the underlying streams.
 	 *
-	 * @throws java.io.IOException
+	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private void close() throws IOException {
 		if (sideBand) {
@@ -2174,6 +2179,7 @@ public String getClientSID() {
 	 *            standard error channel of the command execution. For most
 	 *            other network connections this should be null.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void receive(final InputStream input, final OutputStream output,
 			final OutputStream messages) throws IOException {
@@ -2217,6 +2223,7 @@ public void receive(final InputStream input, final OutputStream output,
 	 *            standard error channel of the command execution. For most
 	 *            other network connections this should be null.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.7
 	 */
 	public void receiveWithExceptionPropagation(InputStream input,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
index c525e66..6b022ea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
@@ -173,7 +173,7 @@ public void setUseProtocolV2(boolean b) {
 	/**
 	 * Toggle tag peeling.
 	 * <p>
-	 * <p>
+	 *
 	 * This method must be invoked prior to any of the following:
 	 * <ul>
 	 * <li>{@link #send(Map)}</li>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefLeaseSpec.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefLeaseSpec.java
index 1af3fad..8a131c8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefLeaseSpec.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefLeaseSpec.java
@@ -58,7 +58,6 @@ public String getExpected() {
 		return expected;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java
index 61d1935..0466085 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java
@@ -616,7 +616,6 @@ private static boolean isValid(String s) {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		int hc = 0;
@@ -627,7 +626,6 @@ public int hashCode() {
 		return hc;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (!(obj instanceof RefSpec))
@@ -649,7 +647,6 @@ public boolean equals(Object obj) {
 				&& Objects.equals(getDestination(), b.getDestination());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java
index 218e62c..fb3cd21 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java
@@ -541,7 +541,6 @@ protected void updateTrackingRef(RevWalk walk) throws IOException {
 			trackingRefUpdate.setResult(localUpdate.update(walk));
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
index 96c7be5..1f96be8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
@@ -94,7 +94,6 @@ public class SideBandInputStream extends InputStream {
 		out = outputStream;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		needDataPacket();
@@ -104,7 +103,6 @@ public int read() throws IOException {
 		return rawIn.read();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		int r = 0;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandOutputStream.java
index bb80299..b6d840d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandOutputStream.java
@@ -94,14 +94,12 @@ void flushBuffer() throws IOException {
 			writeBuffer();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		flushBuffer();
 		out.flush();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, int off, int len) throws IOException {
 		while (0 < len) {
@@ -128,7 +126,6 @@ public void write(byte[] b, int off, int len) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		if (cnt == buffer.length)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandProgressMonitor.java
index 3330860..1e85d81 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandProgressMonitor.java
@@ -28,7 +28,6 @@ class SideBandProgressMonitor extends BatchingProgressMonitor {
 		write = true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int workCurr, Duration duration) {
 		StringBuilder s = new StringBuilder();
@@ -37,7 +36,6 @@ protected void onUpdate(String taskName, int workCurr, Duration duration) {
 		send(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int workCurr, Duration duration) {
 		StringBuilder s = new StringBuilder();
@@ -54,7 +52,6 @@ private void format(StringBuilder s, String taskName, int workCurr,
 		appendDuration(s, duration);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt,
 			Duration duration) {
@@ -64,7 +61,6 @@ protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt,
 		send(s);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int cmp, int totalWork, int pcnt,
 			Duration duration) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConfigStore.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConfigStore.java
index 1226a6b..b2e2549 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConfigStore.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConfigStore.java
@@ -43,6 +43,7 @@ public interface SshConfigStore {
 	 * {@link SshConstants#CONNECTION_ATTEMPTS}, fill those values with defaults
 	 * from the arguments:
 	 * <table>
+	 * <caption>Description of arguments</caption>
 	 * <tr>
 	 * <th>ssh config key</th>
 	 * <th>value from argument</th>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java
index 48cacf0..41dbdca 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java
@@ -125,6 +125,25 @@ private SshConstants() {
 	/** Key in an ssh config file. */
 	public static final String NUMBER_OF_PASSWORD_PROMPTS = "NumberOfPasswordPrompts";
 
+	/**
+	 * Path to a shared library of a PKCS11 key provider, or "none".
+	 * <p>
+	 * If set and not "none", the provider's keys should be used.
+	 * </p>
+	 *
+	 * @since 6.7
+	 */
+	public static final String PKCS11_PROVIDER = "PKCS11Provider";
+
+	/**
+	 * Non-standard JGit addition: specify the PKCS#11 slot list index of the
+	 * token to use. A positive number; defaults to zero; ignored if negative
+	 * (in which case zero is used, too).
+	 *
+	 * @since 6.7
+	 */
+	public static final String PKCS11_SLOT_LIST_INDEX = "PKCS11SlotListIndex";
+
 	/** Key in an ssh config file. */
 	public static final String PORT = "Port";
 
@@ -146,8 +165,8 @@ private SshConstants() {
 	 * Comma-separated list of jump hosts, defining a jump host chain <em>in
 	 * reverse order</em>. Each jump host is a SSH URI or "[user@]host[:port]".
 	 * <p>
-	 * Reverse order means: to connect A->B->target, one can do in
-	 * {@code ~/.ssh/config} either of:
+	 * Reverse order means: to connect {@literal A -> B -> target}, one can do
+	 * in {@code ~/.ssh/config} either of:
 	 * </p>
 	 *
 	 * <pre>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshTransport.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshTransport.java
index 28ec92c..8d93977 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshTransport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshTransport.java
@@ -108,7 +108,6 @@ protected RemoteSession getSession() throws TransportException {
 		return sock;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (sock != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
index 1985b66..77ab0f6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
@@ -81,19 +81,16 @@ public TestProtocol(UploadPackFactory<C> uploadPackFactory,
 		this.handles = new HashMap<>();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return JGitText.get().transportProtoTest;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<String> getSchemes() {
 		return Collections.singleton(SCHEME);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Transport open(URIish uri, Repository local, String remoteName)
 			throws NotSupportedException, TransportException {
@@ -105,13 +102,11 @@ public Transport open(URIish uri, Repository local, String remoteName)
 		return new TransportInternal(local, uri, h);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<URIishField> getRequiredFields() {
 		return EnumSet.of(URIishField.HOST, URIishField.PATH);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<URIishField> getOptionalFields() {
 		return Collections.emptySet();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TrackingRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TrackingRefUpdate.java
index 51bc07c..26045a2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TrackingRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TrackingRefUpdate.java
@@ -174,7 +174,6 @@ private RefUpdate.Result decode(ReceiveCommand.Result status) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
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 ee35f48..4d2f4a9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
@@ -533,10 +533,13 @@ public static Transport open(Repository local, URIish uri, String remoteName)
 	 * Note that the resulting transport instance can not be used for fetching
 	 * or pushing, but only for reading remote refs.
 	 *
-	 * @param uri a {@link org.eclipse.jgit.transport.URIish} object.
+	 * @param uri
+	 *            a {@link org.eclipse.jgit.transport.URIish} object.
 	 * @return new Transport instance
 	 * @throws org.eclipse.jgit.errors.NotSupportedException
+	 *             case that is not supported by JGit
 	 * @throws org.eclipse.jgit.errors.TransportException
+	 *             if transport failed
 	 */
 	public static Transport open(URIish uri) throws NotSupportedException, TransportException {
 		for (WeakReference<TransportProtocol> ref : protocols) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
index 784f566..58232a7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
@@ -170,7 +170,6 @@ private static Properties loadPropertiesFile(File propsFile)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		final DatabaseS3 c = new DatabaseS3(bucket, keyPrefix + "/objects"); //$NON-NLS-1$
@@ -179,7 +178,6 @@ public FetchConnection openFetch() throws TransportException {
 		return r;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		final DatabaseS3 c = new DatabaseS3(bucket, keyPrefix + "/objects"); //$NON-NLS-1$
@@ -188,7 +186,6 @@ public PushConnection openPush() throws TransportException {
 		return r;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// No explicit connections are maintained.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
index 04ebddb..0f84f7e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
@@ -105,7 +105,6 @@ public TransportBundleFile(URIish uri, File bundlePath) {
 		bundle = bundlePath;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws NotSupportedException,
 			TransportException {
@@ -121,14 +120,12 @@ public FetchConnection openFetch() throws NotSupportedException,
 		return new BundleFetchConnection(this, src);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws NotSupportedException {
 		throw new NotSupportedException(
 				JGitText.get().pushIsNotSupportedForBundleTransport);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Resources must be established per-connection.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleStream.java
index eac9208..0366bf3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleStream.java
@@ -57,7 +57,6 @@ public TransportBundleStream(final Repository db, final URIish uri,
 		src = in;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		if (src == null)
@@ -69,14 +68,12 @@ public FetchConnection openFetch() throws TransportException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws NotSupportedException {
 		throw new NotSupportedException(
 				JGitText.get().pushIsNotSupportedForBundleTransport);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (src != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitAnon.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitAnon.java
index a1914b6..43b3f6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitAnon.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitAnon.java
@@ -89,7 +89,6 @@ public Transport open(URIish uri) throws NotSupportedException, TransportExcepti
 		super(uri);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		return new TcpFetchConnection();
@@ -102,13 +101,11 @@ public FetchConnection openFetch(Collection<RefSpec> refSpecs,
 		return new TcpFetchConnection(refSpecs, additionalPatterns);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		return new TcpPushConnection();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Resources must be established per-connection.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
index 19ed4fb..a2273b2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
@@ -140,7 +140,6 @@ public String getType() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		return new SshFetchConnection();
@@ -153,7 +152,6 @@ public FetchConnection openFetch(Collection<RefSpec> refSpecs,
 		return new SshFetchConnection(refSpecs, additionalPatterns);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		return new SshPushConnection();
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 df034bd..c08b7fa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
@@ -311,6 +311,7 @@ private URL toURL(URIish urish) throws MalformedURLException {
 	 * @param uri
 	 *            a {@link org.eclipse.jgit.transport.URIish} object.
 	 * @throws org.eclipse.jgit.errors.NotSupportedException
+	 *             if URI is not supported by JGit
 	 * @since 4.9
 	 */
 	protected void setURI(URIish uri) throws NotSupportedException {
@@ -327,7 +328,9 @@ protected void setURI(URIish uri) throws NotSupportedException {
 	 * Create a minimal HTTP transport with default configuration values.
 	 *
 	 * @param uri
+	 *            URI to create a HTTP transport for
 	 * @throws NotSupportedException
+	 *             if URI is not supported by JGit
 	 */
 	TransportHttp(URIish uri) throws NotSupportedException {
 		super(uri);
@@ -445,7 +448,6 @@ public void setPreemptiveBasicAuthentication(String username,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException,
 			NotSupportedException {
@@ -532,7 +534,6 @@ private BufferedReader toBufferedReader(InputStream in) {
 		return new BufferedReader(new InputStreamReader(in, UTF_8));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws NotSupportedException,
 			TransportException {
@@ -567,7 +568,6 @@ private PushConnection smartPush(String service, HttpConnection c,
 		return p;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (gitSession != null) {
@@ -822,7 +822,7 @@ private static class CredentialItems {
 		/**
 		 * Trust the server for all git operations from this repository; may be
 		 * {@code null} if the transport was created via
-		 * {@link #TransportHttp(URIish)}.
+		 * {@link TransportHttp#TransportHttp(URIish)}.
 		 */
 		CredentialItem.YesNoType forRepo;
 
@@ -1035,11 +1035,15 @@ private URL getServiceURL(String service)
 	/**
 	 * Open an HTTP connection.
 	 *
-	 * @param method HTTP request method
-	 * @param u url of the HTTP connection
-	 * @param acceptEncoding accept-encoding header option
+	 * @param method
+	 *            HTTP request method
+	 * @param u
+	 *            url of the HTTP connection
+	 * @param acceptEncoding
+	 *            accept-encoding header option
 	 * @return the HTTP connection
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.6
 	 */
 	protected HttpConnection httpOpen(String method, URL u,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
index 77d1419..3a06ce5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
@@ -151,7 +151,6 @@ private Repository openRepo() throws TransportException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		return openFetch(Collections.emptyList());
@@ -170,7 +169,6 @@ public FetchConnection openFetch(Collection<RefSpec> refSpecs,
 		return new InternalFetchConnection<>(this, upf, null, openRepo());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		final String rp = getOptionReceivePack();
@@ -183,7 +181,6 @@ public PushConnection openPush() throws TransportException {
 		return new InternalPushConnection<>(this, rpf, null, openRepo());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Resources must be established per-connection.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java
index 912a90a..bfb840d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java
@@ -251,7 +251,9 @@ public abstract Transport open(URIish uri, Repository local,
 	 *            a {@link org.eclipse.jgit.transport.URIish} object.
 	 * @return new Transport
 	 * @throws org.eclipse.jgit.errors.NotSupportedException
+	 *             this protocol does not support the URI.
 	 * @throws org.eclipse.jgit.errors.TransportException
+	 *             the transport cannot open this URI.
 	 */
 	public Transport open(URIish uri)
 			throws NotSupportedException, TransportException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java
index b9feeb9..a59d352 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java
@@ -104,7 +104,6 @@ public Transport open(URIish uri, Repository local, String remoteName)
 		super(local, uri);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		final SftpObjectDB c = new SftpObjectDB(uri.getPath());
@@ -113,7 +112,6 @@ public FetchConnection openFetch() throws TransportException {
 		return r;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		final SftpObjectDB c = new SftpObjectDB(uri.getPath());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
index c9bb89a..4de6ff8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
@@ -94,7 +94,7 @@ public class URIish implements Serializable {
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * A pattern matching standard URI: </br>
+	 * A pattern matching standard URI: <br>
 	 * <code>scheme "://" user_password? hostname? portnumber? path</code>
 	 */
 	private static final Pattern FULL_URI = Pattern.compile("^" // //$NON-NLS-1$
@@ -175,6 +175,7 @@ public class URIish implements Serializable {
 	 * @param s
 	 *            a {@link java.lang.String} object.
 	 * @throws java.net.URISyntaxException
+	 *             if {@code s} was null or couldn't be parsed
 	 */
 	public URIish(String s) throws URISyntaxException {
 		if (StringUtils.isEmptyOrNull(s)) {
@@ -477,6 +478,7 @@ public URIish setPath(String n) {
 	 *            the new value for path.
 	 * @return a new URI with the updated value.
 	 * @throws java.net.URISyntaxException
+	 *             if URI couldn't be parsed from String
 	 */
 	public URIish setRawPath(String n) throws URISyntaxException {
 		final URIish r = new URIish(this);
@@ -551,7 +553,6 @@ public URIish setPort(int n) {
 		return r;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		int hc = 0;
@@ -570,7 +571,6 @@ public int hashCode() {
 		return hc;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (!(obj instanceof URIish))
@@ -611,7 +611,6 @@ public String toPrivateString() {
 		return format(true, false);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return format(false, false);
@@ -683,7 +682,8 @@ public String toPrivateASCIIString() {
 	/**
 	 * Get the "humanish" part of the path. Some examples of a 'humanish' part
 	 * for a full path:
-	 * <table summary="path vs humanish path" border="1">
+	 * <table border="1">
+	 * <caption>path vs. humanish path</caption>
 	 * <tr>
 	 * <th>Path</th>
 	 * <th>Humanish part</th>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index 3264f55..78e9110 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -771,9 +771,13 @@ public void close() {
 	 * its own error handling mechanism.
 	 *
 	 * @param input
+	 *            input stream
 	 * @param output
+	 *            output stream
 	 * @param messages
+	 *            stream for messages
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void upload(InputStream input, OutputStream output,
 			@Nullable OutputStream messages) throws IOException {
@@ -2266,7 +2270,8 @@ private boolean wantSatisfied(RevObject want) throws IOException {
 	 *            request in process
 	 * @param allTags
 	 *            refs to search for annotated tags to include in the pack if
-	 *            the {@link #OPTION_INCLUDE_TAG} capability was requested.
+	 *            the {@link GitProtocolConstants#OPTION_INCLUDE_TAG} capability
+	 *            was requested.
 	 * @param unshallowCommits
 	 *            shallow commits on the client that are now becoming unshallow
 	 * @param deepenNots
@@ -2327,7 +2332,8 @@ private void sendPack(PackStatistics.Accumulator accumulator,
 	 *            where to write statistics about the content of the pack.
 	 * @param allTags
 	 *            refs to search for annotated tags to include in the pack if
-	 *            the {@link #OPTION_INCLUDE_TAG} capability was requested.
+	 *            the {@link GitProtocolConstants#OPTION_INCLUDE_TAG} capability
+	 *            was requested.
 	 * @param unshallowCommits
 	 *            shallow commits on the client that are now becoming unshallow
 	 * @param deepenNots
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java
index df98d0c..7b052ad 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java
@@ -94,10 +94,12 @@ public static void set(String agent) {
 	/**
 	 *
 	 * @param options
+	 *            options
 	 * @param transportAgent
+	 *            name of transport agent
 	 * @return The transport agent.
-	 * @deprecated Capabilities with <key>=<value> shape are now parsed
-	 *             alongside other capabilities in the ReceivePack flow.
+	 * @deprecated Capabilities with &lt;key&gt;=&lt;value&gt; shape are now
+	 *             parsed alongside other capabilities in the ReceivePack flow.
 	 */
 	@Deprecated
 	static String getAgent(Set<String> options, String transportAgent) {
@@ -117,9 +119,10 @@ static String getAgent(Set<String> options, String transportAgent) {
 	/**
 	 *
 	 * @param options
+	 *            options
 	 * @return True if the transport agent is set. False otherwise.
-	 * @deprecated Capabilities with <key>=<value> shape are now parsed
-	 *             alongside other capabilities in the ReceivePack flow.
+	 * @deprecated Capabilities with &lt;key&gt;=&lt;value&gt; shape are now
+	 *             parsed alongside other capabilities in the ReceivePack flow.
 	 */
 	@Deprecated
 	static boolean hasAgent(Set<String> options) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UsernamePasswordCredentialsProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UsernamePasswordCredentialsProvider.java
index c0de42c..da8af5a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UsernamePasswordCredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UsernamePasswordCredentialsProvider.java
@@ -48,13 +48,11 @@ public UsernamePasswordCredentialsProvider(String username, char[] password) {
 		this.password = password;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -77,7 +75,6 @@ public boolean supports(CredentialItem... items) {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean get(URIish uri, CredentialItem... items)
 			throws UnsupportedCredentialItem {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
index c8cdb5a..3bfc523 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
@@ -130,6 +130,7 @@ OutputStream encrypt(OutputStream os) {
 	 * EncryptionUtil.java</a>
 	 * <p>
 	 * Note: EncryptionUtil is inadequate:
+	 * <ul>
 	 * <li>EncryptionUtil.isCipherAvailableForUse checks encryption only which
 	 * "always works", but in JetS3t both encryption and decryption use non-IV
 	 * aware algorithm parameters for all PBE specs, which breaks in case of AES
@@ -137,6 +138,7 @@ OutputStream encrypt(OutputStream os) {
 	 * JetS3t, such as PBEWithMD5AndDES and PBEWithSHAAndTwofish-CBC
 	 * <li>any AES based algorithms such as "PBE...With...And...AES" will not
 	 * work, since they need proper IV setup
+	 * </ul>
 	 */
 	static class JetS3tV2 extends WalkEncryption {
 
@@ -516,8 +518,10 @@ static class JGitV2 extends SymmetricEncryption {
 	 * Encryption factory.
 	 *
 	 * @param props
-	 * @return instance
+	 *            configuration properties
+	 * @return instance this object
 	 * @throws GeneralSecurityException
+	 *             if generic security failure occurred
 	 */
 	static WalkEncryption instance(Properties props)
 			throws GeneralSecurityException {
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 cc6c252..8d89107 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
@@ -186,13 +186,11 @@ class WalkFetchConnection extends BaseFetchConnection {
 		workQueue = new LinkedList<>();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean didFetchTestConnectivity() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected void doFetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have)
@@ -214,19 +212,16 @@ protected void doFetch(final ProgressMonitor monitor,
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Collection<PackLock> getPackLocks() {
 		return packLocks;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setPackLockMessage(String message) {
 		lockMessage = message;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		inserter.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkPushConnection.java
index a54fd8e..464017a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkPushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkPushConnection.java
@@ -104,7 +104,6 @@ class WalkPushConnection extends BaseConnection implements PushConnection {
 		dest = w;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates)
@@ -112,7 +111,6 @@ public void push(final ProgressMonitor monitor,
 		push(monitor, refUpdates, null);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates, OutputStream out)
@@ -184,7 +182,6 @@ protected void writeFile(String file, byte[] content)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		dest.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnection.java
index 98c231a..125ee6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnection.java
@@ -105,6 +105,7 @@ public interface HttpConnection {
 	 * @see HttpURLConnection#getResponseCode()
 	 * @return the HTTP Status-Code, or -1
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	int getResponseCode() throws IOException;
 
@@ -122,6 +123,7 @@ public interface HttpConnection {
 	 * @see HttpURLConnection#getResponseMessage()
 	 * @return the HTTP response message, or <code>null</code>
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	String getResponseMessage() throws IOException;
 
@@ -207,14 +209,14 @@ void setRequestMethod(String method)
 	 * @exception IOException
 	 *                if an I/O error occurs while creating the input stream.
 	 * @throws java.io.IOException
-	 *             if any.
+	 *             if an IO error occurred
 	 */
 	InputStream getInputStream() throws IOException;
 
 	/**
 	 * Get header field. According to
-	 * {@link <a href="https://tools.ietf.org/html/rfc2616#section-4.2">RFC
-	 * 2616</a>} header field names are case insensitive. Header fields defined
+	 * <a href="https://tools.ietf.org/html/rfc2616#section-4.2">RFC 2616</a>
+	 * header field names are case insensitive. Header fields defined
 	 * as a comma separated list can have multiple header fields with the same
 	 * field name. This method only returns one of these header fields. If you
 	 * want the union of all values of all multiple header fields with the same
@@ -230,8 +232,8 @@ void setRequestMethod(String method)
 
 	/**
 	 * Get all values of given header field. According to
-	 * {@link <a href="https://tools.ietf.org/html/rfc2616#section-4.2">RFC
-	 * 2616</a>} header field names are case insensitive. Header fields defined
+	 * <a href="https://tools.ietf.org/html/rfc2616#section-4.2">RFC 2616</a>
+	 * header field names are case insensitive. Header fields defined
 	 * as a comma separated list can have multiple header fields with the same
 	 * field name. This method does not validate if the given header field is
 	 * defined as a comma separated list.
@@ -287,6 +289,7 @@ void setRequestMethod(String method)
 	 * @see HttpURLConnection#getOutputStream()
 	 * @return an output stream that writes to this connection.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	OutputStream getOutputStream() throws IOException;
 
@@ -321,6 +324,7 @@ void setRequestMethod(String method)
 	 *
 	 * @see HttpURLConnection#connect()
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	void connect() throws IOException;
 
@@ -338,7 +342,9 @@ void setRequestMethod(String method)
 	 *            the source of randomness for this generator or null. See
 	 *            {@link javax.net.ssl.SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}
 	 * @throws java.security.NoSuchAlgorithmException
+	 *             if algorithm isn't available
 	 * @throws java.security.KeyManagementException
+	 *             if key management failed
 	 */
 	void configure(KeyManager[] km, TrustManager[] tm,
 			SecureRandom random) throws NoSuchAlgorithmException,
@@ -351,7 +357,9 @@ void configure(KeyManager[] km, TrustManager[] tm,
 	 * @param hostnameverifier
 	 *            a {@link javax.net.ssl.HostnameVerifier} object.
 	 * @throws java.security.NoSuchAlgorithmException
+	 *             if algorithm isn't available
 	 * @throws java.security.KeyManagementException
+	 *             if key management failed
 	 */
 	void setHostnameVerifier(HostnameVerifier hostnameverifier)
 			throws NoSuchAlgorithmException, KeyManagementException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory.java
index bd0aa3f..b50eaa4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory.java
@@ -28,6 +28,7 @@ public interface HttpConnectionFactory {
 	 *            a {@link java.net.URL} object.
 	 * @return a {@link org.eclipse.jgit.transport.http.HttpConnection}
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	HttpConnection create(URL url) throws IOException;
 
@@ -41,6 +42,7 @@ public interface HttpConnectionFactory {
 	 *            the proxy to be used
 	 * @return a {@link org.eclipse.jgit.transport.http.HttpConnection}
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	HttpConnection create(URL url, Proxy proxy)
 			throws IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory2.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory2.java
index 88abc60..71d5c1b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory2.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/HttpConnectionFactory2.java
@@ -48,7 +48,7 @@ interface GitSession {
 		 *            {@link HttpConnectionFactory} instance
 		 * @param sslVerify
 		 *            whether SSL is to be verified
-		 * @return the configured {@connection}
+		 * @return the configured {@code connection}
 		 * @throws IOException
 		 *             if the connection cannot be configured
 		 * @throws GeneralSecurityException
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 3b0bae2..8e9be1d 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
@@ -55,7 +55,9 @@ public class JDKHttpConnection implements HttpConnection {
 	 * @param url
 	 *            a {@link java.net.URL} object.
 	 * @throws java.net.MalformedURLException
+	 *             if URL is malformed
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected JDKHttpConnection(URL url)
 			throws MalformedURLException,
@@ -71,7 +73,9 @@ protected JDKHttpConnection(URL url)
 	 * @param proxy
 	 *            a {@link java.net.Proxy} object.
 	 * @throws java.net.MalformedURLException
+	 *             if URL is malformed
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	protected JDKHttpConnection(URL url, Proxy proxy)
 			throws MalformedURLException, IOException {
@@ -79,73 +83,61 @@ protected JDKHttpConnection(URL url, Proxy proxy)
 				.openConnection(proxy);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getResponseCode() throws IOException {
 		return wrappedUrlConnection.getResponseCode();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public URL getURL() {
 		return wrappedUrlConnection.getURL();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getResponseMessage() throws IOException {
 		return wrappedUrlConnection.getResponseMessage();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Map<String, List<String>> getHeaderFields() {
 		return wrappedUrlConnection.getHeaderFields();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setRequestProperty(String key, String value) {
 		wrappedUrlConnection.setRequestProperty(key, value);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setRequestMethod(String method) throws ProtocolException {
 		wrappedUrlConnection.setRequestMethod(method);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setUseCaches(boolean usecaches) {
 		wrappedUrlConnection.setUseCaches(usecaches);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setConnectTimeout(int timeout) {
 		wrappedUrlConnection.setConnectTimeout(timeout);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setReadTimeout(int timeout) {
 		wrappedUrlConnection.setReadTimeout(timeout);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getContentType() {
 		return wrappedUrlConnection.getContentType();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public InputStream getInputStream() throws IOException {
 		return wrappedUrlConnection.getInputStream();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getHeaderField(@NonNull String name) {
 		return wrappedUrlConnection.getHeaderField(name);
@@ -167,68 +159,57 @@ private static List<String> mapValuesToListIgnoreCase(String keyName,
 		return fields;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int getContentLength() {
 		return wrappedUrlConnection.getContentLength();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setInstanceFollowRedirects(boolean followRedirects) {
 		wrappedUrlConnection.setInstanceFollowRedirects(followRedirects);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setDoOutput(boolean dooutput) {
 		wrappedUrlConnection.setDoOutput(dooutput);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setFixedLengthStreamingMode(int contentLength) {
 		wrappedUrlConnection.setFixedLengthStreamingMode(contentLength);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public OutputStream getOutputStream() throws IOException {
 		return wrappedUrlConnection.getOutputStream();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setChunkedStreamingMode(int chunklen) {
 		wrappedUrlConnection.setChunkedStreamingMode(chunklen);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String getRequestMethod() {
 		return wrappedUrlConnection.getRequestMethod();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean usingProxy() {
 		return wrappedUrlConnection.usingProxy();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void connect() throws IOException {
 		wrappedUrlConnection.connect();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void setHostnameVerifier(HostnameVerifier hostnameverifier) {
 		((HttpsURLConnection) wrappedUrlConnection)
 				.setHostnameVerifier(hostnameverifier);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void configure(KeyManager[] km, TrustManager[] tm,
 			SecureRandom random) throws NoSuchAlgorithmException,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/FileResolver.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/FileResolver.java
index 046f395..36731a5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/FileResolver.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/FileResolver.java
@@ -60,7 +60,6 @@ public FileResolver(File basePath, boolean exportAll) {
 		setExportAll(exportAll);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Repository open(C req, String name)
 			throws RepositoryNotFoundException, ServiceNotEnabledException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
index 3ef5b29..65b1808 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
@@ -718,7 +718,6 @@ public void getName(byte[] buffer, int offset) {
 		System.arraycopy(path, pathOffset, buffer, offset, pathLen - pathOffset);
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
index 5c3f6ae..c6d50d3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
@@ -191,7 +191,6 @@ public void reset(ObjectReader reader, AnyObjectId id)
 		reset(reader.open(id, OBJ_TREE).getCachedBytes());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CanonicalTreeParser createSubtreeIterator(final ObjectReader reader,
 			final MutableObjectId idBuffer)
@@ -227,51 +226,43 @@ public final CanonicalTreeParser createSubtreeIterator0(
 		return p;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CanonicalTreeParser createSubtreeIterator(ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
 		return createSubtreeIterator(reader, new MutableObjectId());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasId() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte[] idBuffer() {
 		return raw;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int idOffset() {
 		return nextPtr - OBJECT_ID_LENGTH;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		if (!first())
 			reset(raw);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean first() {
 		return currPtr == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean eof() {
 		return currPtr == raw.length;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void next(int delta) {
 		if (delta == 1) {
@@ -301,7 +292,6 @@ public void next(int delta) {
 			parseEntry();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void back(int delta) {
 		if (delta == 1 && 0 <= prevPtr) {
@@ -376,6 +366,7 @@ private void parseEntry() {
 	 * @return {@link org.eclipse.jgit.attributes.AttributesNode} for the
 	 *         current entry.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	public AttributesNode getEntryAttributesNode(ObjectReader reader)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/EmptyTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/EmptyTreeIterator.java
index 0661c90..32368dc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/EmptyTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/EmptyTreeIterator.java
@@ -57,75 +57,63 @@ public EmptyTreeIterator(final AbstractTreeIterator p,
 		pathLen = childPathOffset - 1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
 		return new EmptyTreeIterator(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasId() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ObjectId getEntryObjectId() {
 		return ObjectId.zeroId();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte[] idBuffer() {
 		return zeroid;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int idOffset() {
 		return 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean first() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean eof() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void next(int delta) throws CorruptObjectException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void back(int delta) throws CorruptObjectException {
 		// Do nothing.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void stopWalk() {
 		if (parent != null)
 			parent.stopWalk();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected boolean needsStopWalk() {
 		return parent != null && parent.needsStopWalk();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
index 60b92d7..36fa720 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
@@ -175,7 +175,6 @@ protected FileTreeIterator(final WorkingTreeIterator p, final File root,
 		init(entries());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
@@ -425,13 +424,11 @@ public File getEntryFile() {
 		return ((FileEntry) current()).getFile();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected byte[] idSubmodule(Entry e) {
 		return idSubmodule(getDirectory(), e);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected String readSymlinkTarget(Entry entry) throws IOException {
 		return fs.readSymLink(getEntryFile());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
index ece9452..e0a8af1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
@@ -548,7 +548,7 @@ public void setHead(int index) {
 	 * <p>
 	 * Retrieve the git attributes for the current entry.
 	 *
-	 * <h3>Git attribute computation</h3>
+	 * <h4>Git attribute computation</h4>
 	 *
 	 * <ul>
 	 * <li>Get the attributes matching the current path entry from the info file
@@ -563,11 +563,10 @@ public void setHead(int index) {
 	 * <li>In the end, completes the list of matching attributes using the
 	 * global attribute file define in the configuration (see
 	 * {@link AttributesNodeProvider#getGlobalAttributesNode()})</li>
-	 *
 	 * </ul>
 	 *
 	 *
-	 * <h3>Iterator constraints</h3>
+	 * <h4>Iterator constraints</h4>
 	 *
 	 * <p>
 	 * In order to have a correct list of attributes for the current entry, this
@@ -960,6 +959,8 @@ void stopWalk() throws IOException {
 	 * iterators to manage only one list of items, with the diving handled by
 	 * recursive trees.
 	 *
+	 * @param <T>
+	 *            Type of returned {@code AbstractTreeIterator}
 	 * @param nth
 	 *            tree to obtain the current iterator of.
 	 * @param clazz
@@ -1376,12 +1377,14 @@ public void enterSubtree() throws MissingObjectException,
 	}
 
 	/**
-	 * Returns an AbstractTreeIterator from {@code trees} with the smallest name, and sets its
-	 * {@code matches} field. This may clobber {@code matches} in other {@code tree}s. Other iterators
-	 * at the same name will have their {@code matches} pointing to the same {@code min()} value.
+	 * Returns an AbstractTreeIterator from {@code trees} with the smallest
+	 * name, and sets its {@code matches} field. This may clobber
+	 * {@code matches} in other {@code tree}s. Other iterators at the same name
+	 * will have their {@code matches} pointing to the same {@code min()} value.
 	 *
 	 * @return the smallest tree iterator available.
 	 * @throws CorruptObjectException
+	 *             if an object is corrupt
 	 */
 	@SuppressWarnings("unused")
 	AbstractTreeIterator min() throws CorruptObjectException {
@@ -1488,6 +1491,7 @@ public <T extends AbstractTreeIterator> T getTree(Class<T> type) {
 	 *            {{@link #getSmudgeCommand(int)} instead.
 	 * @return a filter command
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	public String getFilterCommand(String filterCommandType)
@@ -1521,6 +1525,7 @@ public String getFilterCommand(String filterCommandType)
 	 *            of the tree the item to be smudged is in
 	 * @return a filter command
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 6.1
 	 */
 	public String getSmudgeCommand(int index)
@@ -1536,6 +1541,7 @@ public String getSmudgeCommand(int index)
 	 *            to use
 	 * @return a filter command
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 6.1
 	 */
 	public String getSmudgeCommand(Attributes attributes) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
index b5d6610..98d08466 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
@@ -25,6 +25,7 @@
 import java.nio.CharBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.nio.charset.CharsetEncoder;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.text.MessageFormat;
 import java.time.Instant;
@@ -68,6 +69,7 @@
 import org.eclipse.jgit.util.IO;
 import org.eclipse.jgit.util.Paths;
 import org.eclipse.jgit.util.RawParseUtils;
+import org.eclipse.jgit.util.SystemReader;
 import org.eclipse.jgit.util.TemporaryBuffer;
 import org.eclipse.jgit.util.TemporaryBuffer.LocalFile;
 import org.eclipse.jgit.util.io.EolStreamTypeUtil;
@@ -270,7 +272,6 @@ public boolean walksIgnoredDirectories() {
 		return state.walkIgnored;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean hasId() {
 		if (contentIdFromPtr == ptr)
@@ -278,7 +279,6 @@ public boolean hasId() {
 		return (mode & FileMode.TYPE_MASK) == FileMode.TYPE_FILE;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public byte[] idBuffer() {
 		if (contentIdFromPtr == ptr)
@@ -316,7 +316,6 @@ public boolean hasId() {
 		return zeroid;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isWorkTree() {
 		return true;
@@ -549,13 +548,11 @@ public Repository getRepository() {
 		return repository;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int idOffset() {
 		return contentIdOffset;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		if (!first()) {
@@ -565,19 +562,16 @@ public void reset() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean first() {
 		return ptr == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean eof() {
 		return ptr == entryCnt;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void next(int delta) throws CorruptObjectException {
 		ptr += delta;
@@ -586,7 +580,6 @@ public void next(int delta) throws CorruptObjectException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void back(int delta) throws CorruptObjectException {
 		ptr -= delta;
@@ -620,6 +613,7 @@ public long getEntryLength() {
 	 *
 	 * @return size of the content, in bytes
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public long getEntryContentLength() throws IOException {
 		if (canonLen == -1) {
@@ -772,6 +766,7 @@ private IgnoreNode getIgnoreNode() throws IOException {
 	 * @return the {@link org.eclipse.jgit.attributes.AttributesNode} for the
 	 *         current entry.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public AttributesNode getEntryAttributesNode() throws IOException {
 		if (attributesNode instanceof PerDirectoryAttributesNode)
@@ -964,6 +959,7 @@ public MetadataDiff compareMetadata(DirCacheEntry entry) {
 	 *            access to repository objects if necessary. Should not be null.
 	 * @return true if content is most likely different.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.3
 	 */
 	public boolean isModified(DirCacheEntry entry, boolean forceContentCheck,
@@ -1070,6 +1066,7 @@ && getOptions().getSymLinks() == SymLinks.FALSE
 	 * @return <code>true</code> if the content doesn't match,
 	 *         <code>false</code> if it matches
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private boolean contentCheck(DirCacheEntry entry, ObjectReader reader)
 			throws IOException {
@@ -1334,7 +1331,11 @@ IgnoreNode load(IgnoreNode parent) throws IOException {
 					ConfigConstants.CONFIG_CORE_SECTION, null,
 					ConfigConstants.CONFIG_KEY_EXCLUDESFILE, fs, null, null);
 			if (path != null) {
-				loadRulesFromFile(coreExclude, path.toFile());
+				if (Files.exists(path)) {
+					loadRulesFromFile(coreExclude, path.toFile());
+				}
+			} else {
+				loadRulesFromDefaultFile(coreExclude, fs);
 			}
 			if (coreExclude.getRules().isEmpty()) {
 				coreExclude = parent;
@@ -1344,7 +1345,9 @@ IgnoreNode load(IgnoreNode parent) throws IOException {
 					coreExclude);
 			File exclude = fs.resolve(repository.getDirectory(),
 					Constants.INFO_EXCLUDE);
-			loadRulesFromFile(infoExclude, exclude);
+			if (fs.exists(exclude)) {
+				loadRulesFromFile(infoExclude, exclude);
+			}
 			if (infoExclude.getRules().isEmpty()) {
 				infoExclude = null;
 			}
@@ -1366,9 +1369,19 @@ IgnoreNode load(IgnoreNode parent) throws IOException {
 
 		private static void loadRulesFromFile(IgnoreNode r, File exclude)
 				throws FileNotFoundException, IOException {
-			if (FS.DETECTED.exists(exclude)) {
-				try (FileInputStream in = new FileInputStream(exclude)) {
-					r.parse(exclude.getAbsolutePath(), in);
+			try (FileInputStream in = new FileInputStream(exclude)) {
+				r.parse(exclude.getAbsolutePath(), in);
+			}
+		}
+
+		private static void loadRulesFromDefaultFile(IgnoreNode r,
+				FS fileSystem) throws FileNotFoundException, IOException {
+			Path cfg = SystemReader.getInstance()
+					.getXdgConfigDirectory(fileSystem);
+			if (cfg != null) {
+				Path cfgPath = cfg.resolve("git").resolve("ignore"); //$NON-NLS-1$ //$NON-NLS-2$
+				if (Files.exists(cfgPath)) {
+					loadRulesFromFile(r, cfgPath.toFile());
 				}
 			}
 		}
@@ -1450,6 +1463,7 @@ void initializeReadBuffer() {
 	 * @return the clean filter command for the current entry or
 	 *         <code>null</code> if no such command is defined
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	public String getCleanFilterCommand() throws IOException {
@@ -1472,6 +1486,7 @@ public String getCleanFilterCommand() throws IOException {
 	 *         {@link org.eclipse.jgit.treewalk.TreeWalk} is not based on a
 	 *         {@link org.eclipse.jgit.lib.Repository} then null is returned.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.3
 	 */
 	public EolStreamType getEolStreamType() throws IOException {
@@ -1486,6 +1501,7 @@ public EolStreamType getEolStreamType() throws IOException {
 	 *         {@link TreeWalk} is not based on a {@link Repository} then null
 	 *         is returned.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	private EolStreamType getEolStreamType(OperationType opType)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/ByteArraySet.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/ByteArraySet.java
index cafa926..c941601 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/ByteArraySet.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/ByteArraySet.java
@@ -39,6 +39,7 @@ class ByteArraySet {
 	 * Create an empty set.
 	 *
 	 * @param capacity
+	 *            initial capacity of the set
 	 */
 	ByteArraySet(int capacity) {
 		initTable(1 << Integer.highestOneBit((capacity * 2) - 1));
@@ -180,7 +181,6 @@ private void initTable(int sz) {
 		table = new byte[sz][];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
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 4731f34..699ff6b 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
@@ -106,7 +106,6 @@ public IndexDiffFilter(int dirCacheIndex, int workingTreeIndex,
 		this.honorIgnores = honorIgnores;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk tw) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -234,7 +233,6 @@ private WorkingTreeIterator workingTree(TreeWalk tw) {
 		return tw.getTree(workingTree, WorkingTreeIterator.class);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		// We cannot compare subtrees in the working tree, so encourage
@@ -242,13 +240,11 @@ public boolean shouldBeRecursive() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "INDEX_DIFF_FILTER"; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/InterIndexDiffFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/InterIndexDiffFilter.java
index 163dc71..0c0b09e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/InterIndexDiffFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/InterIndexDiffFilter.java
@@ -28,7 +28,6 @@ public final class InterIndexDiffFilter extends TreeFilter {
 	 */
 	public static final TreeFilter INSTANCE = new InterIndexDiffFilter();
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker) {
 		final int n = walker.getTreeCount();
@@ -57,19 +56,16 @@ public boolean include(TreeWalk walker) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "INTERINDEX_DIFF"; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java
index 7d04f27..25947da 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java
@@ -33,7 +33,6 @@ public NotIgnoredFilter(int workdirTreeIndex) {
 		this.index = workdirTreeIndex;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk tw) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -41,20 +40,17 @@ public boolean include(TreeWalk tw) throws MissingObjectException,
 		return i == null || !i.isEntryIgnored();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		// immutable
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotTreeFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotTreeFilter.java
index 4fb6153..e9cd83c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotTreeFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotTreeFilter.java
@@ -38,13 +38,11 @@ private NotTreeFilter(TreeFilter one) {
 		a = one;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter negate() {
 		return a;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -52,7 +50,6 @@ public boolean include(TreeWalk walker)
 		return matchFilter(walker) == 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int matchFilter(TreeWalk walker)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -69,20 +66,17 @@ public int matchFilter(TreeWalk walker)
 		return -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return a.shouldBeRecursive();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		final TreeFilter n = a.clone();
 		return n == a ? this : new NotTreeFilter(n);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "NOT " + a.toString(); //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilter.java
index c94215f..66ab8bb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilter.java
@@ -11,6 +11,9 @@
 
 package org.eclipse.jgit.treewalk.filter;
 
+import java.util.Optional;
+import java.util.Set;
+import java.util.HashSet;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.treewalk.TreeWalk;
@@ -45,7 +48,8 @@ public static PathFilter create(String path) {
 		while (path.endsWith("/")) //$NON-NLS-1$
 			path = path.substring(0, path.length() - 1);
 		if (path.length() == 0)
-			throw new IllegalArgumentException(JGitText.get().emptyPathNotPermitted);
+			throw new IllegalArgumentException(
+					JGitText.get().emptyPathNotPermitted);
 		return new PathFilter(path);
 	}
 
@@ -67,19 +71,16 @@ public String getPath() {
 		return pathStr;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker) {
 		return matchFilter(walker) <= 0;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int matchFilter(TreeWalk walker) {
 		return walker.isPathMatch(pathRaw, pathRaw.length);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		for (byte b : pathRaw)
@@ -88,13 +89,19 @@ public boolean shouldBeRecursive() {
 		return false;
 	}
 
+	@Override
+	public Optional<Set<byte[]>> getPathsBestEffort() {
+		HashSet<byte[]> s = new HashSet<>();
+		s.add(pathRaw);
+		return Optional.of(s);
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public PathFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathSuffixFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathSuffixFilter.java
index 3816d5e..ec25903 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathSuffixFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathSuffixFilter.java
@@ -56,13 +56,11 @@ private PathSuffixFilter(String s) {
 		pathRaw = Constants.encode(pathStr);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -82,7 +80,6 @@ public int matchFilter(TreeWalk walker) throws MissingObjectException,
 		return super.matchFilter(walker);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return true;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/SkipWorkTreeFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/SkipWorkTreeFilter.java
index 1ed2ef3..e311523 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/SkipWorkTreeFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/SkipWorkTreeFilter.java
@@ -36,7 +36,6 @@ public SkipWorkTreeFilter(int treeIdx) {
 		this.treeIdx = treeIdx;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker) {
 		DirCacheIterator i = walker.getTree(treeIdx, DirCacheIterator.class);
@@ -47,19 +46,16 @@ public boolean include(TreeWalk walker) {
 		return e == null || !e.isSkipWorkTree();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return this;
 	}
 
-	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilter.java
index 6dbd508..22d430b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilter.java
@@ -11,6 +11,8 @@
 package org.eclipse.jgit.treewalk.filter;
 
 import java.io.IOException;
+import java.util.Optional;
+import java.util.Set;
 
 import org.eclipse.jgit.dircache.DirCacheIterator;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -188,10 +190,8 @@ public abstract boolean include(TreeWalk walker)
 	 *             as thrown by {@link #include(TreeWalk)}
 	 * @since 4.7
 	 */
-	public int matchFilter(TreeWalk walker)
-			throws MissingObjectException, IncorrectObjectTypeException,
-			IOException
-	{
+	public int matchFilter(TreeWalk walker) throws MissingObjectException,
+			IncorrectObjectTypeException, IOException {
 		return include(walker) ? 0 : 1;
 	}
 
@@ -210,6 +210,19 @@ public int matchFilter(TreeWalk walker)
 	public abstract boolean shouldBeRecursive();
 
 	/**
+	 * If this filter checks that a specific set of paths have all been
+	 * modified, returns that set of paths to be checked against a changed path
+	 * filter. Otherwise, returns empty.
+	 *
+	 * @return a set of paths, or empty
+	 *
+	 * @since 6.7
+	 */
+	public Optional<Set<byte[]>> getPathsBestEffort() {
+		return Optional.empty();
+	}
+
+	/**
 	 * {@inheritDoc}
 	 *
 	 * Clone this tree filter, including its parameters.
@@ -220,7 +233,6 @@ public int matchFilter(TreeWalk walker)
 	@Override
 	public abstract TreeFilter clone();
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		String n = getClass().getName();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/BlockList.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/BlockList.java
index 527c5a6..557e2cd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/BlockList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/BlockList.java
@@ -75,13 +75,11 @@ public BlockList(int capacity) {
 		tailBlock = directory[0];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		return size;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		for (T[] block : directory) {
@@ -94,7 +92,6 @@ public void clear() {
 		tailBlock = directory[0];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public T get(int index) {
 		if (index < 0 || size <= index)
@@ -102,7 +99,6 @@ public T get(int index) {
 		return directory[toDirectoryIndex(index)][toBlockIndex(index)];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public T set(int index, T element) {
 		if (index < 0 || size <= index)
@@ -160,7 +156,6 @@ public void addAll(T[] src, int srcIdx, int srcCnt) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean add(T element) {
 		int i = tailBlkIdx;
@@ -191,7 +186,6 @@ public boolean add(T element) {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void add(int index, T element) {
 		if (index == size) {
@@ -213,7 +207,6 @@ public void add(int index, T element) {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public T remove(int index) {
 		if (index == size - 1) {
@@ -253,7 +246,6 @@ private void resetTailBlock() {
 		tailBlock = directory[tailDirIdx];
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<T> iterator() {
 		return new MyIterator();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/CachedAuthenticator.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/CachedAuthenticator.java
index 5815c62..d8183eb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/CachedAuthenticator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/CachedAuthenticator.java
@@ -32,7 +32,6 @@ public static void add(CachedAuthentication ca) {
 		cached.add(ca);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected final PasswordAuthentication getPasswordAuthentication() {
 		final String host = getRequestingHost();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/Equality.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/Equality.java
index da16846..ff136f7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/Equality.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/Equality.java
@@ -13,22 +13,24 @@
 /**
  * Equality utilities.
  *
- * @since: 6.2
+ * @since 6.2
  */
 public class Equality {
 
     /**
-     * Compare by reference
-     *
-     * @param a
-     *            First object to compare
-     * @param b
-     *            Second object to compare
-     * @return {@code true} if the objects are identical, {@code false}
-     *         otherwise
-     *
-     * @since 6.2
-     */
+	 * Compare by reference
+	 *
+	 * @param <T>
+	 *            type of the objects to compare
+	 * @param a
+	 *            First object to compare
+	 * @param b
+	 *            Second object to compare
+	 * @return {@code true} if the objects are identical, {@code false}
+	 *         otherwise
+	 *
+	 * @since 6.2
+	 */
     @SuppressWarnings("ReferenceEquality")
     public static <T> boolean isSameInstance(T a, T b) {
         return a == b;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
index aef9e64..b8fc4fc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
@@ -31,8 +31,6 @@
 import java.nio.file.attribute.BasicFileAttributes;
 import java.nio.file.attribute.FileTime;
 import java.security.AccessControlException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.text.MessageFormat;
 import java.time.Duration;
 import java.time.Instant;
@@ -118,6 +116,7 @@ protected FSFactory() {
 		 * Detect the file system
 		 *
 		 * @param cygwinUsed
+		 *            whether cygwin is used
 		 * @return FS instance
 		 */
 		public FS detect(Boolean cygwinUsed) {
@@ -149,8 +148,11 @@ public static class ExecutionResult {
 
 		/**
 		 * @param stdout
+		 *            stdout stream
 		 * @param stderr
+		 *            stderr stream
 		 * @param rc
+		 *            return code
 		 */
 		public ExecutionResult(TemporaryBuffer stdout, TemporaryBuffer stderr,
 				int rc) {
@@ -263,7 +265,7 @@ public static final class FileStoreAttributes {
 		 */
 		private static final ExecutorService FUTURE_RUNNER = new ThreadPoolExecutor(
 				0, 5, 30L, TimeUnit.SECONDS,
-				new LinkedBlockingQueue<Runnable>(),
+				new LinkedBlockingQueue<>(),
 				runnable -> {
 					Thread t = new Thread(runnable,
 							"JGit-FileStoreAttributeReader-" //$NON-NLS-1$
@@ -287,7 +289,7 @@ public static final class FileStoreAttributes {
 		 */
 		private static final ExecutorService SAVE_RUNNER = new ThreadPoolExecutor(
 				0, 1, 1L, TimeUnit.MILLISECONDS,
-				new LinkedBlockingQueue<Runnable>(),
+				new LinkedBlockingQueue<>(),
 				runnable -> {
 					Thread t = new Thread(runnable,
 							"JGit-FileStoreAttributeWriter-" //$NON-NLS-1$
@@ -849,6 +851,7 @@ public Duration getFsTimestampResolution() {
 		 * timestamp resolution
 		 *
 		 * @param fsTimestampResolution
+		 *            resolution of filesystem timestamps
 		 */
 		public FileStoreAttributes(
 				@NonNull Duration fsTimestampResolution) {
@@ -1074,6 +1077,7 @@ private void detectSymlinkSupport() {
 	 *            a {@link java.io.File} object.
 	 * @return last modified time of f
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 * @deprecated use {@link #lastModifiedInstant(Path)} instead
 	 */
@@ -1120,6 +1124,7 @@ public Instant lastModifiedInstant(File f) {
 	 * @param time
 	 *            last modified time
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 * @deprecated use {@link #setLastModified(Path, Instant)} instead
 	 */
@@ -1138,6 +1143,7 @@ public void setLastModified(File f, long time) throws IOException {
 	 * @param time
 	 *            last modified time
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 5.1.9
 	 */
 	public void setLastModified(Path p, Instant time) throws IOException {
@@ -1152,6 +1158,7 @@ public void setLastModified(Path p, Instant time) throws IOException {
 	 *            a {@link java.io.File} object.
 	 * @return length of a file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public long length(File path) throws IOException {
@@ -1164,7 +1171,7 @@ public long length(File path) throws IOException {
 	 * @param f
 	 *            a {@link java.io.File} object.
 	 * @throws java.io.IOException
-	 *             this may be a Java7 subclass with detailed information
+	 *             if an IO error occurred
 	 * @since 3.3
 	 */
 	public void delete(File f) throws IOException {
@@ -1264,8 +1271,10 @@ public FS setUserHome(File path) {
 	 * Return all the attributes of a file, without following symbolic links.
 	 *
 	 * @param file
+	 *            the file
 	 * @return {@link BasicFileAttributes} of the file
-	 * @throws IOException in case of any I/O errors accessing the file
+	 * @throws IOException
+	 *             in case of any I/O errors accessing the file
 	 *
 	 * @since 4.5.6
 	 */
@@ -1283,11 +1292,10 @@ protected File userHomeImpl() {
 	}
 
 	private File defaultUserHomeImpl() {
-		String home = AccessController.doPrivileged(
-				(PrivilegedAction<String>) () -> System.getProperty("user.home") //$NON-NLS-1$
-		);
-		if (home == null || home.length() == 0)
+		String home = SystemReader.getInstance().getProperty("user.home"); //$NON-NLS-1$
+		if (StringUtils.isEmptyOrNull(home)) {
 			return null;
+		}
 		return new File(home).getAbsoluteFile();
 	}
 
@@ -1671,6 +1679,7 @@ protected static File resolveGrandparentFile(File grandchild) {
 	 *            a {@link java.io.File} object.
 	 * @return target of link or null
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public String readSymLink(File path) throws IOException {
@@ -1684,6 +1693,7 @@ public String readSymLink(File path) throws IOException {
 	 *            a {@link java.io.File} object.
 	 * @return true if the path is a symbolic link (and we support these)
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public boolean isSymLink(File path) throws IOException {
@@ -1738,6 +1748,7 @@ public boolean isFile(File path) {
 	 * @return true if path is hidden, either starts with . on unix or has the
 	 *         hidden attribute in windows
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public boolean isHidden(File path) throws IOException {
@@ -1752,6 +1763,7 @@ public boolean isHidden(File path) throws IOException {
 	 * @param hidden
 	 *            whether to set the file hidden
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public void setHidden(File path, boolean hidden) throws IOException {
@@ -1766,6 +1778,7 @@ public void setHidden(File path, boolean hidden) throws IOException {
 	 * @param target
 	 *            target path of the symlink
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public void createSymLink(File path, String target) throws IOException {
@@ -1782,6 +1795,7 @@ public void createSymLink(File path, String target) throws IOException {
 	 * @return <code>true</code> if the file was created, <code>false</code> if
 	 *         the file already existed
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @deprecated use {@link #createNewFileAtomic(File)} instead
 	 * @since 4.5
 	 */
@@ -1852,6 +1866,7 @@ public String toString() {
 	 * @return LockToken this token must be closed after the created file was
 	 *         deleted
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 4.7
 	 */
 	public LockToken createNewFileAtomic(File path) throws IOException {
@@ -2317,7 +2332,9 @@ private static boolean shutdownAndAwaitTermination(ExecutorService pool) {
 	 *            The standard input stream passed to the process
 	 * @return The result of the executed command
 	 * @throws java.lang.InterruptedException
+	 *             if thread was interrupted
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	public ExecutionResult execute(ProcessBuilder pb, InputStream in)
@@ -2441,8 +2458,10 @@ public Instant getLastModifiedInstant() {
 		 * Constructor when there are issues with reading. All attributes except
 		 * given will be set to the default values.
 		 *
-		 * @param fs
 		 * @param path
+		 *            file path
+		 * @param fs
+		 *            FS to use
 		 */
 		public Attributes(File path, FS fs) {
 			this(fs, path, false, false, false, false, false, 0L, EPOCH, 0L);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
index 1c11361..6f31847 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
@@ -418,6 +418,7 @@ public boolean createNewFile(File lock) throws IOException {
 	 * @return LockToken this lock token must be held until the file is no
 	 *         longer needed
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 5.0
 	 */
 	@Override
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java
index ae73d3f..5926655 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java
@@ -58,43 +58,36 @@ protected FS_Win32(FS src) {
 		super(src);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FS newInstance() {
 		return new FS_Win32(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean supportsExecute() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean canExecute(File f) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean setExecute(File f, boolean canExec) {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isCaseSensitive() {
 		return false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean retryFailedLockFileCommit() {
 		return true;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Entry[] list(File directory, FileModeStrategy fileModeStrategy) {
 		if (!Files.isDirectory(directory.toPath(), LinkOption.NOFOLLOW_LINKS)) {
@@ -140,7 +133,6 @@ public FileVisitResult visitFileFailed(Path file,
 		return result.toArray(new Entry[0]);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected File discoverGitExe() {
 		String path = SystemReader.getInstance().getenv("PATH"); //$NON-NLS-1$
@@ -171,7 +163,6 @@ protected File discoverGitExe() {
 		return gitExe;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected File userHomeImpl() {
 		String home = SystemReader.getInstance().getenv("HOME"); //$NON-NLS-1$
@@ -194,7 +185,6 @@ protected File userHomeImpl() {
 		return super.userHomeImpl();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ProcessBuilder runInShell(String cmd, String[] args) {
 		List<String> argv = new ArrayList<>(3 + args.length);
@@ -207,7 +197,6 @@ public ProcessBuilder runInShell(String cmd, String[] args) {
 		return proc;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Attributes getAttributes(File path) {
 		return FileUtils.getFileAttributesBasic(this, path);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java
index add5498..635351a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java
@@ -72,13 +72,11 @@ protected FS_Win32_Cygwin(FS src) {
 		super(src);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public FS newInstance() {
 		return new FS_Win32_Cygwin(this);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public File resolve(File dir, String pn) {
 		String useCygPath = System.getProperty("jgit.usecygpath"); //$NON-NLS-1$
@@ -99,7 +97,6 @@ public File resolve(File dir, String pn) {
 		return super.resolve(dir, pn);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	protected File userHomeImpl() {
 		final String home = AccessController.doPrivileged(
@@ -110,7 +107,6 @@ protected File userHomeImpl() {
 		return resolve(new File("."), home); //$NON-NLS-1$
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ProcessBuilder runInShell(String cmd, String[] args) {
 		List<String> argv = new ArrayList<>(4 + args.length);
@@ -129,14 +125,12 @@ String shellQuote(String cmd) {
 		return QuotedString.BOURNE.quote(cmd.replace(File.separatorChar, '/'));
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String relativize(String base, String other) {
 		final String relativized = super.relativize(base, other);
 		return relativized.replace(File.separatorChar, '/');
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ProcessResult runHookIfPresent(Repository repository, String hookName,
 			String[] args, OutputStream outRedirect, OutputStream errRedirect,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
index f013e7e..9d052d1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
@@ -288,6 +288,7 @@ public static void rename(File src, File dst)
 	 * @throws java.nio.file.AtomicMoveNotSupportedException
 	 *             if file cannot be moved as an atomic file system operation
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.1
 	 */
 	public static void rename(final File src, final File dst,
@@ -446,6 +447,7 @@ public static void createNewFile(File f) throws IOException {
 	 *            the target of the symbolic link
 	 * @return the path to the symbolic link
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.2
 	 */
 	public static Path createSymLink(File path, String target)
@@ -474,6 +476,7 @@ public static Path createSymLink(File path, String target)
 	 *            a {@link java.io.File} object.
 	 * @return target path of the symlink, or null if it is not a symbolic link
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.0
 	 */
 	public static String readSymLink(File path) throws IOException {
@@ -499,6 +502,7 @@ public static String readSymLink(File path) throws IOException {
 	 *            The parent dir, can be null to use system default temp dir.
 	 * @return the temp dir created.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 3.4
 	 */
 	public static File createTempDir(String prefix, String suffix, File dir)
@@ -749,7 +753,10 @@ public static <T> T readWithRetries(File file,
 	}
 
 	/**
+	 * Check if file is a symlink
+	 *
 	 * @param file
+	 *            the file to be checked if it is a symbolic link
 	 * @return {@code true} if the passed file is a symbolic link
 	 */
 	static boolean isSymlink(File file) {
@@ -757,10 +764,14 @@ static boolean isSymlink(File file) {
 	}
 
 	/**
+	 * Get the lastModified attribute for a given file
+	 *
 	 * @param file
+	 *            the file
 	 * @return lastModified attribute for given file, not following symbolic
 	 *         links
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @deprecated use {@link #lastModifiedInstant(Path)} instead which returns
 	 *             FileTime
 	 */
@@ -771,7 +782,10 @@ static long lastModified(File file) throws IOException {
 	}
 
 	/**
+	 * Get last modified timestamp of a file
+	 *
 	 * @param path
+	 *            file path
 	 * @return lastModified attribute for given file, not following symbolic
 	 *         links
 	 */
@@ -795,8 +809,10 @@ static Instant lastModifiedInstant(Path path) {
 	 * Return all the attributes of a file, without following symbolic links.
 	 *
 	 * @param file
+	 *            the file
 	 * @return {@link BasicFileAttributes} of the file
-	 * @throws IOException in case of any I/O errors accessing the file
+	 * @throws IOException
+	 *             in case of any I/O errors accessing the file
 	 *
 	 * @since 4.5.6
 	 */
@@ -808,8 +824,11 @@ static BasicFileAttributes fileAttributes(File file) throws IOException {
 	 * Set the last modified time of a file system object.
 	 *
 	 * @param file
+	 *            the file
 	 * @param time
+	 *            last modified timestamp
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	@Deprecated
 	static void setLastModified(File file, long time) throws IOException {
@@ -820,8 +839,11 @@ static void setLastModified(File file, long time) throws IOException {
 	 * Set the last modified time of a file system object.
 	 *
 	 * @param path
+	 *            file path
 	 * @param time
+	 *            last modified timestamp of the file
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	static void setLastModified(Path path, Instant time)
 			throws IOException {
@@ -830,6 +852,7 @@ static void setLastModified(Path path, Instant time)
 
 	/**
 	 * @param file
+	 *            the file
 	 * @return {@code true} if the given file exists, not following symbolic
 	 *         links
 	 */
@@ -838,9 +861,13 @@ static boolean exists(File file) {
 	}
 
 	/**
+	 * Check if file is hidden (on Windows)
+	 *
 	 * @param file
+	 *            the file
 	 * @return {@code true} if the given file is hidden
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	static boolean isHidden(File file) throws IOException {
 		return Files.isHidden(toPath(file));
@@ -854,6 +881,7 @@ static boolean isHidden(File file) throws IOException {
 	 * @param hidden
 	 *            a boolean.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.1
 	 */
 	public static void setHidden(File file, boolean hidden) throws IOException {
@@ -868,6 +896,7 @@ public static void setHidden(File file, boolean hidden) throws IOException {
 	 *            a {@link java.io.File}.
 	 * @return length of the given file
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.1
 	 */
 	public static long getLength(File file) throws IOException {
@@ -879,7 +908,10 @@ public static long getLength(File file) throws IOException {
 	}
 
 	/**
+	 * Check if file is directory
+	 *
 	 * @param file
+	 *            the file
 	 * @return {@code true} if the given file is a directory, not following
 	 *         symbolic links
 	 */
@@ -888,7 +920,10 @@ static boolean isDirectory(File file) {
 	}
 
 	/**
+	 * Check if File is a file
+	 *
 	 * @param file
+	 *            the file
 	 * @return {@code true} if the given file is a file, not following symbolic
 	 *         links
 	 */
@@ -930,7 +965,9 @@ public static boolean canExecute(File file) {
 
 	/**
 	 * @param fs
+	 *            a {@link org.eclipse.jgit.util.FS} object.
 	 * @param file
+	 *            the file
 	 * @return non null attributes object
 	 */
 	static Attributes getFileAttributesBasic(FS fs, File file) {
@@ -1079,6 +1116,7 @@ public static String pathToString(File file) {
 	 * @param f
 	 *            the file to touch
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @since 5.1.8
 	 */
 	public static void touch(Path f) throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java
index e3ba606..1942342 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java
@@ -321,6 +321,7 @@ public static Proxy proxyFor(ProxySelector proxySelector, URL u)
 	 *            a {@link org.eclipse.jgit.transport.http.HttpConnection}
 	 *            object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 * @since 4.3
 	 */
 	public static void disableSslVerify(HttpConnection conn)
@@ -346,7 +347,9 @@ public static void disableSslVerify(HttpConnection conn)
 	 * that have all available protocols enabled already, up to the one
 	 * specified.
 	 * <p>
+	 * <br>
 	 * <table>
+	 * <caption>TLS versions</caption>
 	 * <tr>
 	 * <td>SSLContext.getInstance()</td>
 	 * <td>OpenJDK</td>
@@ -354,16 +357,16 @@ public static void disableSslVerify(HttpConnection conn)
 	 * </tr>
 	 * <tr>
 	 * <td>"TLS"</td>
-	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2 (+ TLSv1.3)<br />
+	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2 (+ TLSv1.3)<br>
 	 * Enabled: TLSv1, TLSV1.1, TLSv1.2 (+ TLSv1.3)</td>
-	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2<br />
+	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2<br>
 	 * Enabled: TLSv1</td>
 	 * </tr>
 	 * <tr>
 	 * <td>"TLSv1.2"</td>
-	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2<br />
+	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2<br>
 	 * Enabled: TLSv1, TLSV1.1, TLSv1.2</td>
-	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2<br />
+	 * <td>Supported: TLSv1, TLSV1.1, TLSv1.2<br>
 	 * Enabled: TLSv1.2</td>
 	 * </tr>
 	 * </table>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
index 635dd6a..6a5190c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
@@ -204,7 +204,6 @@ private void grow() {
 		entries = n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
@@ -232,8 +231,8 @@ public interface IntComparator {
 		 *            the first int to compare
 		 * @param second
 		 *            the second int to compare
-		 * @return a negative number if first < second, 0 if first == second, or
-		 *         a positive number if first > second
+		 * @return a negative number if first &lt; second, 0 if first == second, or
+		 *         a positive number if first &gt; second
 		 */
 		int compare(int first, int second);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/LfsFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/LfsFactory.java
index 7456c71..d0b7b9f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/LfsFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/LfsFactory.java
@@ -105,6 +105,7 @@ public LfsInputStream applyCleanFilter(Repository db,
 	 * @return a loader for the actual data of a blob, or the original loader in
 	 *         case LFS is not applicable.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 */
 	public ObjectLoader applySmudgeFilter(Repository db,
 			ObjectLoader loader, Attribute attribute) throws IOException {
@@ -117,6 +118,7 @@ public ObjectLoader applySmudgeFilter(Repository db,
 	 * @param repo
 	 *            the {@link Repository} the hook is applied to.
 	 * @param outputStream
+	 *            output stream
 	 * @return a {@link PrePushHook} implementation or <code>null</code>
 	 */
 	@Nullable
@@ -131,7 +133,9 @@ public PrePushHook getPrePushHook(Repository repo,
 	 * @param repo
 	 *            the {@link Repository} the hook is applied to.
 	 * @param outputStream
+	 *            output stream
 	 * @param errorStream
+	 *            error stream
 	 * @return a {@link PrePushHook} implementation or <code>null</code>
 	 * @since 5.6
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
index b2bdfc1..47f38f4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
@@ -140,7 +140,6 @@ private void grow() {
 		entries = n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawCharSequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawCharSequence.java
index 3de7a15..be4bd9e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawCharSequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawCharSequence.java
@@ -41,25 +41,21 @@ public RawCharSequence(byte[] buf, int start, int end) {
 		endPtr = end;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public char charAt(int index) {
 		return (char) (buffer[startPtr + index] & 0xff);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int length() {
 		return endPtr - startPtr;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public CharSequence subSequence(int start, int end) {
 		return new RawCharSequence(buffer, startPtr + start, startPtr + end);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final int n = length();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
index 0e8e9b3..00e55f5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
@@ -868,6 +868,26 @@ public static Charset parseEncoding(byte[] b) {
 	}
 
 	/**
+	 * Parse the "encoding " header into a character set reference.
+	 * <p>
+	 * If unsuccessful, return UTF-8.
+	 *
+	 * @param buffer
+	 *            buffer to scan.
+	 * @return the Java character set representation. Never null. Default to
+	 *         UTF-8.
+	 * @see #parseEncoding(byte[])
+	 * @since 6.7
+	 */
+	public static Charset guessEncoding(byte[] buffer) {
+		try {
+			return parseEncoding(buffer);
+		} catch (IllegalCharsetNameException | UnsupportedCharsetException e) {
+			return UTF_8;
+		}
+	}
+
+	/**
 	 * Parse a name string (e.g. author, committer, tagger) into a PersonIdent.
 	 * <p>
 	 * Leading spaces won't be trimmed from the string, i.e. will show up in the
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawSubStringPattern.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawSubStringPattern.java
index 57464f3..04fdcd0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawSubStringPattern.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawSubStringPattern.java
@@ -98,7 +98,6 @@ public String pattern() {
 		return needleString;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return pattern();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RefList.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RefList.java
index 462bab0..2a287cf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RefList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RefList.java
@@ -43,6 +43,8 @@ public class RefList<T extends Ref> implements Iterable<Ref> {
 	/**
 	 * Create an empty unmodifiable reference list.
 	 *
+	 * @param <T>
+	 *            type of reference being stored.
 	 * @return an empty unmodifiable reference list.
 	 */
 	@SuppressWarnings("unchecked")
@@ -70,7 +72,6 @@ protected RefList(RefList<T> src) {
 		this.cnt = src.cnt;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Iterator<Ref> iterator() {
 		return new Iterator<>() {
@@ -286,7 +287,6 @@ public final RefList<T> put(T ref) {
 		return add(idx, ref);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder r = new StringBuilder();
@@ -305,6 +305,8 @@ public String toString() {
 	/**
 	 * Create a {@link Collector} for {@link Ref}.
 	 *
+	 * @param <T>
+	 *            type of reference being stored.
 	 * @param mergeFunction
 	 *            if specified the result will be sorted and deduped.
 	 * @return {@link Collector} for {@link Ref}
@@ -390,6 +392,7 @@ public void remove(int idx) {
 		 * after additions are complete using {@link #sort()}.
 		 *
 		 * @param ref
+		 *            reference to add
 		 */
 		public void add(T ref) {
 			if (list.length == size) {
@@ -404,6 +407,7 @@ public void add(T ref) {
 		 * Add all items from another builder.
 		 *
 		 * @param other
+		 *            another builder
 		 * @since 5.4
 		 */
 		public void addAll(Builder other) {
@@ -454,6 +458,7 @@ public void sort() {
 		 * Dedupe the refs in place. Must be called after {@link #sort}.
 		 *
 		 * @param mergeFunction
+		 *            function used for de-duplication
 		 */
 		@SuppressWarnings("unchecked")
 		void dedupe(BinaryOperator<T> mergeFunction) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RefMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RefMap.java
index c68a76c..a4d1fd5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RefMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RefMap.java
@@ -119,13 +119,11 @@ public RefMap(String prefix, RefList<? extends Ref> packed,
 		this.resolved = (RefList<Ref>) resolved;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean containsKey(Object name) {
 		return get(name) != null;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref get(Object key) {
 		String name = toRefName((String) key);
@@ -137,7 +135,6 @@ public Ref get(Object key) {
 		return ref;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref put(String keyName, Ref value) {
 		String name = toRefName(keyName);
@@ -165,7 +162,6 @@ public Ref put(String keyName, Ref value) {
 		return prior;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Ref remove(Object key) {
 		String name = toRefName((String) key);
@@ -189,13 +185,11 @@ public Ref remove(Object key) {
 		return res;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public boolean isEmpty() {
 		return entrySet().isEmpty();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public Set<Entry<String, Ref>> entrySet() {
 		if (entrySet == null) {
@@ -238,7 +232,6 @@ public void clear() {
 		return entrySet;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder r = new StringBuilder();
@@ -259,6 +252,7 @@ public String toString() {
 	 * Create a {@link Collector} for {@link Ref}.
 	 *
 	 * @param mergeFunction
+	 *            merge function
 	 * @return {@link Collector} for {@link Ref}
 	 * @since 5.4
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SshSupport.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SshSupport.java
index e297041..42a76b5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SshSupport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SshSupport.java
@@ -48,6 +48,7 @@ public class SshSupport {
 	 *            cases.
 	 * @return The entire output read from stdout.
 	 * @throws IOException
+	 *             if an IO error occurred
 	 * @throws CommandFailedException
 	 *             if the ssh command execution failed, error message contains
 	 *             the content of stderr.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java
index 917add3..2747060 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java
@@ -181,9 +181,9 @@ public static int compareWithCase(String a, String b) {
 	 *
 	 * @param stringValue
 	 *            the string to parse.
-	 * @return the boolean interpretation of {@code value}.
+	 * @return the boolean interpretation of {@code stringValue}.
 	 * @throws java.lang.IllegalArgumentException
-	 *             if {@code value} is not recognized as one of the standard
+	 *             if {@code stringValue} is not recognized as one of the standard
 	 *             boolean names.
 	 */
 	public static boolean toBoolean(String stringValue) {
@@ -346,7 +346,7 @@ public static String replaceLineBreaksWithSpace(String in) {
 	 *            allow negative numbers, too
 	 * @return the value parsed
 	 * @throws NumberFormatException
-	 *             if the {@value} is not parseable, or beyond the range of
+	 *             if the {@code value} is not parseable, or beyond the range of
 	 *             {@link Long}
 	 * @throws StringIndexOutOfBoundsException
 	 *             if the string is empty or contains only whitespace, or
@@ -420,7 +420,7 @@ public static long parseLongWithSuffix(@NonNull String value,
 	 *            allow negative numbers, too
 	 * @return the value parsed
 	 * @throws NumberFormatException
-	 *             if the {@value} is not parseable or beyond the range of
+	 *             if the {@code value} is not parseable or beyond the range of
 	 *             {@link Integer}
 	 * @throws StringIndexOutOfBoundsException
 	 *             if the string is empty or contains only whitespace, or
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
index a8a7790..991de51 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
@@ -128,24 +128,9 @@ public FileBasedConfig openUserConfig(Config parent, FS fs) {
 					fs);
 		}
 
-		private Path getXDGConfigHome(FS fs) {
-			String configHomePath = getenv(Constants.XDG_CONFIG_HOME);
-			if (StringUtils.isEmptyOrNull(configHomePath)) {
-				configHomePath = new File(fs.userHome(), ".config") //$NON-NLS-1$
-						.getAbsolutePath();
-			}
-			try {
-				return Paths.get(configHomePath);
-			} catch (InvalidPathException e) {
-				LOG.error(JGitText.get().logXDGConfigHomeInvalid,
-						configHomePath, e);
-			}
-			return null;
-		}
-
 		@Override
 		public FileBasedConfig openJGitConfig(Config parent, FS fs) {
-			Path xdgPath = getXDGConfigHome(fs);
+			Path xdgPath = getXdgConfigDirectory(fs);
 			if (xdgPath != null) {
 				Path configPath = xdgPath.resolve("jgit") //$NON-NLS-1$
 						.resolve(Constants.CONFIG);
@@ -391,6 +376,36 @@ public StoredConfig getSystemConfig()
 	}
 
 	/**
+	 * Gets the directory denoted by environment variable XDG_CONFIG_HOME. If
+	 * the variable is not set or empty, return a path for
+	 * {@code $HOME/.config}.
+	 *
+	 * @param fileSystem
+	 *            {@link FS} to get the user's home directory
+	 * @return a {@link Path} denoting the directory, which may exist or not, or
+	 *         {@code null} if the environment variable is not set and there is
+	 *         no home directory, or the path is invalid.
+	 * @since 6.7
+	 */
+	public Path getXdgConfigDirectory(FS fileSystem) {
+		String configHomePath = getenv(Constants.XDG_CONFIG_HOME);
+		if (StringUtils.isEmptyOrNull(configHomePath)) {
+			File home = fileSystem.userHome();
+			if (home == null) {
+				return null;
+			}
+			configHomePath = new File(home, ".config").getAbsolutePath(); //$NON-NLS-1$
+		}
+		try {
+			return Paths.get(configHomePath);
+		} catch (InvalidPathException e) {
+			LOG.error(JGitText.get().logXDGConfigHomeInvalid, configHomePath,
+					e);
+		}
+		return null;
+	}
+
+	/**
 	 * Update config and its parents if they seem modified
 	 *
 	 * @param config
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFInputStream.java
index cedb159..ccc1969 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFInputStream.java
@@ -57,14 +57,12 @@ public AutoCRLFInputStream(InputStream in, boolean detectBinary) {
 		this.detectBinary = detectBinary;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		final int read = read(single, 0, 1);
 		return read == 1 ? single[0] & 0xff : -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] bs, int off, int len) throws IOException {
 		if (len == 0)
@@ -103,7 +101,6 @@ public int read(byte[] bs, int off, int len) throws IOException {
 		return n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		in.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFOutputStream.java
index 305ccbd..9fb316f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoCRLFOutputStream.java
@@ -65,14 +65,12 @@ public AutoCRLFOutputStream(OutputStream out, boolean detectBinary) {
 		this.detectBinary = detectBinary;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		onebytebuf[0] = (byte) b;
 		write(onebytebuf, 0, 1);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b) throws IOException {
 		int overflow = buffer(b, 0, b.length);
@@ -80,7 +78,6 @@ public void write(byte[] b) throws IOException {
 			write(b, b.length - overflow, overflow);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, int startOff, int startLen)
 			throws IOException {
@@ -151,7 +148,6 @@ private void decideMode(boolean complete) throws IOException {
 		write(binbuf, 0, cachedLen);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (binbufcnt <= binbuf.length) {
@@ -161,7 +157,6 @@ public void flush() throws IOException {
 		out.flush();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		flush();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFInputStream.java
index 7db882c..2385865 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFInputStream.java
@@ -185,14 +185,12 @@ public AutoLFInputStream(InputStream in, boolean detectBinary,
 		this.forCheckout = false;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		final int read = read(single, 0, 1);
 		return read == 1 ? single[0] & 0xff : -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] bs, int off, int len)
 			throws IOException {
@@ -242,7 +240,6 @@ public boolean isBinary() {
 		return isBinary;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		in.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFOutputStream.java
index a0e9fb6..e56991d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFOutputStream.java
@@ -69,14 +69,12 @@ public AutoLFOutputStream(OutputStream out, boolean detectBinary) {
 		this.detectBinary = detectBinary;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		onebytebuf[0] = (byte) b;
 		write(onebytebuf, 0, 1);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b) throws IOException {
 		int overflow = buffer(b, 0, b.length);
@@ -85,7 +83,6 @@ public void write(byte[] b) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, int startOff, int startLen)
 			throws IOException {
@@ -164,7 +161,6 @@ private void decideMode(boolean complete) throws IOException {
 		write(binbuf, 0, cachedLen);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (binbufcnt <= binbuf.length) {
@@ -173,7 +169,6 @@ public void flush() throws IOException {
 		out.flush();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		flush();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/CountingOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/CountingOutputStream.java
index 782f3f4..d0049d2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/CountingOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/CountingOutputStream.java
@@ -39,27 +39,23 @@ public long getCount() {
 		return cnt;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int val) throws IOException {
 		out.write(val);
 		cnt++;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf, int off, int len) throws IOException {
 		out.write(buf, off, len);
 		cnt += len;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		out.flush();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		out.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/DisabledOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/DisabledOutputStream.java
index f1bfbe2..03c25bb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/DisabledOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/DisabledOutputStream.java
@@ -27,7 +27,6 @@ private DisabledOutputStream() {
 		// more than one instance from being created.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		// We shouldn't be writing output at this stage, there
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/IsolatedOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/IsolatedOutputStream.java
index 2bbdbef..1faf6ea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/IsolatedOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/IsolatedOutputStream.java
@@ -58,13 +58,11 @@ public IsolatedOutputStream(OutputStream out) {
 				new ArrayBlockingQueue<>(1), new NamedThreadFactory());
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int ch) throws IOException {
 		write(new byte[] { (byte) ch }, 0, 1);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf, int pos, int cnt)
 			throws IOException {
@@ -75,7 +73,6 @@ public void write(byte[] buf, int pos, int cnt)
 		});
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		checkClosed();
@@ -85,7 +82,6 @@ public void flush() throws IOException {
 		});
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		if (!copier.isShutdown()) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/LimitedInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/LimitedInputStream.java
index 8800624..681a529 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/LimitedInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/LimitedInputStream.java
@@ -47,21 +47,18 @@ protected LimitedInputStream(InputStream in, long limit) {
 		this.limit = limit;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int available() throws IOException {
 		return (int) Math.min(in.available(), left);
 	}
 
 	// it's okay to mark even if mark isn't supported, as reset won't work
-	/** {@inheritDoc} */
 	@Override
 	public synchronized void mark(int readLimit) {
 		in.mark(readLimit);
 		mark = left;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		if (left == 0) {
@@ -78,7 +75,6 @@ public int read() throws IOException {
 		return result;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		if (left == 0) {
@@ -96,7 +92,6 @@ public int read(byte[] b, int off, int len) throws IOException {
 		return result;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public synchronized void reset() throws IOException {
 		if (!in.markSupported())
@@ -109,7 +104,6 @@ public synchronized void reset() throws IOException {
 		left = mark;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long skip(long n) throws IOException {
 		n = Math.min(n, left);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/MessageWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/MessageWriter.java
index 2637766..8d5b8fd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/MessageWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/MessageWriter.java
@@ -51,7 +51,6 @@ public MessageWriter() {
 		enc = new OutputStreamWriter(getRawStream(), UTF_8);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(char[] cbuf, int off, int len) throws IOException {
 		synchronized (buf) {
@@ -71,20 +70,17 @@ public OutputStream getRawStream() {
 		return buf;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		// Do nothing, we are buffered with no resources.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		// Do nothing, we are buffered with no resources.
 	}
 
 	/** @return string version of all buffered data. */
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return RawParseUtils.decode(buf.toByteArray());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
index c0724e4..ed412fa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
@@ -67,7 +67,6 @@ public void halt() throws InterruptedException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void run() {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeInputStream.java
index 56d0169..96376bf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeInputStream.java
@@ -46,7 +46,6 @@ public TeeInputStream(InputStream src, OutputStream dst) {
 		this.dst = dst;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		byte[] b = skipBuffer();
@@ -54,7 +53,6 @@ public int read() throws IOException {
 		return n == 1 ? b[0] & 0xff : -1;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long skip(long count) throws IOException {
 		long skipped = 0;
@@ -71,7 +69,6 @@ public long skip(long count) throws IOException {
 		return skipped;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		if (len == 0)
@@ -83,7 +80,6 @@ public int read(byte[] b, int off, int len) throws IOException {
 		return n;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		byte[] b = skipBuffer();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java
index e6fdd70..ab084a6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java
@@ -34,35 +34,30 @@ public TeeOutputStream(OutputStream stream1, OutputStream stream2) {
 		this.stream2 = stream2;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf) throws IOException {
 		this.stream1.write(buf);
 		this.stream2.write(buf);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf, int off, int len) throws IOException {
 		this.stream1.write(buf, off, len);
 		this.stream2.write(buf, off, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		this.stream1.write(b);
 		this.stream2.write(b);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		this.stream1.flush();
 		this.stream2.flush();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/ThrowingPrintWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/ThrowingPrintWriter.java
index 3bc92d5..4764676 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/ThrowingPrintWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/ThrowingPrintWriter.java
@@ -41,19 +41,16 @@ public ThrowingPrintWriter(Writer out) {
 				);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(char[] cbuf, int off, int len) throws IOException {
 		out.write(cbuf, off, len);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		out.flush();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		out.close();
@@ -62,8 +59,10 @@ public void close() throws IOException {
 	/**
 	 * Print a string and terminate with a line feed.
 	 *
-	 * @param s a {@link java.lang.String} object.
+	 * @param s
+	 *            a {@link java.lang.String} object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void println(String s) throws IOException {
 		print(s + LF);
@@ -73,6 +72,7 @@ public void println(String s) throws IOException {
 	 * Print a platform dependent new line
 	 *
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void println() throws IOException {
 		print(LF);
@@ -81,8 +81,10 @@ public void println() throws IOException {
 	/**
 	 * Print a char
 	 *
-	 * @param value a char.
+	 * @param value
+	 *            a char.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void print(char value) throws IOException {
 		print(String.valueOf(value));
@@ -94,6 +96,7 @@ public void print(char value) throws IOException {
 	 * @param value
 	 *            an int.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void print(int value) throws IOException {
 		print(String.valueOf(value));
@@ -102,8 +105,10 @@ public void print(int value) throws IOException {
 	/**
 	 * Print a long as string
 	 *
-	 * @param value a long.
+	 * @param value
+	 *            a long.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void print(long value) throws IOException {
 		print(String.valueOf(value));
@@ -112,8 +117,10 @@ public void print(long value) throws IOException {
 	/**
 	 * Print a short as string
 	 *
-	 * @param value a short.
+	 * @param value
+	 *            a short.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void print(short value) throws IOException {
 		print(String.valueOf(value));
@@ -128,6 +135,7 @@ public void print(short value) throws IOException {
 	 * @param args
 	 *            objects.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void format(String fmt, Object... args) throws IOException {
 		print(String.format(fmt, args));
@@ -139,6 +147,7 @@ public void format(String fmt, Object... args) throws IOException {
 	 * @param any
 	 *            an object.
 	 * @throws java.io.IOException
+	 *             if an IO error occurred
 	 */
 	public void print(Object any) throws IOException {
 		out.write(String.valueOf(any));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java
index 1947b3b..4d9f83d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutInputStream.java
@@ -63,7 +63,6 @@ public void setTimeout(int millis) {
 		timeout = millis;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		try {
@@ -76,13 +75,11 @@ public int read() throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] buf) throws IOException {
 		return read(buf, 0, buf.length);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] buf, int off, int cnt) throws IOException {
 		try {
@@ -95,7 +92,6 @@ public int read(byte[] buf, int off, int cnt) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long skip(long cnt) throws IOException {
 		try {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java
index 3fbf6ff..afd798a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TimeoutOutputStream.java
@@ -65,7 +65,6 @@ public void setTimeout(int millis) {
 		timeout = millis;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		try {
@@ -78,13 +77,11 @@ public void write(int b) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf) throws IOException {
 		write(buf, 0, buf.length);
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf, int off, int len) throws IOException {
 		try {
@@ -97,7 +94,6 @@ public void write(byte[] buf, int off, int len) throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		try {
@@ -110,7 +106,6 @@ public void flush() throws IOException {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		try {
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 4598881..b37f28b 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
@@ -91,7 +91,6 @@ public boolean isEmpty() {
 		return streams.isEmpty();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		for (;;) {
@@ -106,7 +105,6 @@ else if (in == EOF)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		if (len == 0)
@@ -123,13 +121,11 @@ else if (in == EOF)
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public int available() throws IOException {
 		return head().available();
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public long skip(long count) throws IOException {
 		long skipped = 0;
@@ -163,7 +159,6 @@ public long skip(long count) throws IOException {
 		return skipped;
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		IOException err = null;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/SHA1.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/SHA1.java
index 56e90d0..0a56c83 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/SHA1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/SHA1.java
@@ -193,7 +193,6 @@ public abstract void digest(MutableObjectId id)
 	 * <p>
 	 * Implementations not supporting collision detection always return
 	 * {@code false}.
-	 * <p>
 	 *
 	 * @return {@code true} if a likely collision was detected.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicSystemClock.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicSystemClock.java
index 66857b5..4e079f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicSystemClock.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicSystemClock.java
@@ -37,7 +37,6 @@ private static long nowMicros() {
 		}
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public ProposedTimestamp propose() {
 		final long u = nowMicros();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java
index 8c20423..a5ee107 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/ProposedTimestamp.java
@@ -162,7 +162,6 @@ public void close() {
 		// Do nothing by default.
 	}
 
-	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return instant().toString();
diff --git a/pom.xml b/pom.xml
index 41f8439..bd11260 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
   <groupId>org.eclipse.jgit</groupId>
   <artifactId>org.eclipse.jgit-parent</artifactId>
   <packaging>pom</packaging>
-  <version>6.6.1-SNAPSHOT</version>
+  <version>6.7.0-SNAPSHOT</version>
 
   <name>JGit - Parent</name>
   <url>${jgit-url}</url>
@@ -169,7 +169,7 @@
     <slf4j-version>1.7.36</slf4j-version>
     <maven-javadoc-plugin-version>3.5.0</maven-javadoc-plugin-version>
     <gson-version>2.10.1</gson-version>
-    <bouncycastle-version>1.73</bouncycastle-version>
+    <bouncycastle-version>1.75</bouncycastle-version>
     <spotbugs-maven-plugin-version>4.7.3.4</spotbugs-maven-plugin-version>
     <maven-project-info-reports-plugin-version>3.4.3</maven-project-info-reports-plugin-version>
     <maven-jxr-plugin-version>3.3.0</maven-jxr-plugin-version>
@@ -262,7 +262,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
-          <version>3.2.1</version>
+          <version>3.3.0</version>
         </plugin>
 
         <plugin>
@@ -285,7 +285,7 @@
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>build-helper-maven-plugin</artifactId>
-          <version>3.3.0</version>
+          <version>3.4.0</version>
         </plugin>
 
         <plugin>
@@ -331,7 +331,7 @@
         <plugin>
           <groupId>org.eclipse.cbi.maven.plugins</groupId>
           <artifactId>eclipse-jarsigner-plugin</artifactId>
-          <version>1.3.5</version>
+          <version>1.4.2</version>
         </plugin>
         <plugin>
           <groupId>org.jacoco</groupId>
@@ -388,7 +388,7 @@
         <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
-          <version>2.7.11</version>
+          <version>2.7.13</version>
         </plugin>
         <plugin>
           <groupId>org.eclipse.dash</groupId>
@@ -465,13 +465,38 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <configuration>
-          <additionalJOption>-Xdoclint:-missing</additionalJOption>
+          <!-- We check javadoc when compiling with ecj (option -Pecj) and configurations
+          set in .settings/org.eclipse.jdt.core.prefs. This allows more fine grained
+          configuration and fails the build on missing javadoc for protected and
+          public but not for private classes, methods and fields. We don't want
+          to check javadoc on tests. We can reconsider to configure this on javadoc
+          when it starts supporting access specifiers so that we can set
+          -Xdoclint:all,-missing/private -->
+          <additionalJOption>-Xdoclint:none</additionalJOption>-->
           <encoding>${project.build.sourceEncoding}</encoding>
           <quiet>true</quiet>
+          <failOnWarnings>true</failOnWarnings>
           <excludePackageNames>org.eclipse.jgit.http.test</excludePackageNames>
           <links>
             <link>https://docs.oracle.com/en/java/javase/11/docs/api</link>
           </links>
+          <tags>
+            <tag>
+              <name>apiNote</name>
+              <placement>a</placement>
+              <head>API Note:</head>
+            </tag>
+            <tag>
+              <name>implSpec</name>
+              <placement>a</placement>
+              <head>Implementation Requirements:</head>
+            </tag>
+            <tag>
+              <name>implNote</name>
+              <placement>a</placement>
+              <head>Implementation Note:</head>
+            </tag>
+          </tags>
         </configuration>
         <executions>
           <execution>
@@ -589,7 +614,7 @@
           </reportSet>
         </reportSets>
         <configuration>
-          <additionalJOption>-Xdoclint:-missing</additionalJOption>
+          <failOnWarnings>true</failOnWarnings>
         </configuration>
       </plugin>
       <plugin>
@@ -890,7 +915,7 @@
               <dependency>
                 <groupId>org.eclipse.jdt</groupId>
                 <artifactId>ecj</artifactId>
-                <version>3.33.0</version>
+                <version>3.34.0</version>
               </dependency>
             </dependencies>
           </plugin>