diff --git a/.mailmap b/.mailmap
index 560baaa..96a4f257 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1,3 +1,4 @@
+Han-Wen Nienhuys <hanwen@google.com>         Han-Wen NIenhuys <hanwen@google.com>
 Mark Ingram <markdingram@gmail.com>          markdingram <markdingram@gmail.com>
 Roberto Tyley <roberto.tyley@guardian.co.uk> roberto <roberto.tyley@guardian.co.uk>
 Saša Živkov <sasa.zivkov@sap.com>            Sasa Zivkov <sasa.zivkov@sap.com>
diff --git a/WORKSPACE b/WORKSPACE
index afd58b2..234879f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -23,14 +23,14 @@
 
 maven_jar(
     name = "httpclient",
-    artifact = "org.apache.httpcomponents:httpclient:4.3.6",
-    sha1 = "4c47155e3e6c9a41a28db36680b828ced53b8af4",
+    artifact = "org.apache.httpcomponents:httpclient:4.5.2",
+    sha1 = "733db77aa8d9b2d68015189df76ab06304406e50",
 )
 
 maven_jar(
     name = "httpcore",
-    artifact = "org.apache.httpcomponents:httpcore:4.3.3",
-    sha1 = "f91b7a4aadc5cf486df6e4634748d7dd7a73f06d",
+    artifact = "org.apache.httpcomponents:httpcore:4.4.6",
+    sha1 = "e3fd8ced1f52c7574af952e2e6da0df8df08eb82",
 )
 
 maven_jar(
@@ -105,46 +105,46 @@
     sha1 = "a60a5e993c98c864010053cb901b7eab25306568",
 )
 
-JETTY_VER = "9.4.5.v20170502"
+JETTY_VER = "9.4.8.v20171121"
 
 maven_jar(
     name = "jetty-servlet",
     artifact = "org.eclipse.jetty:jetty-servlet:" + JETTY_VER,
-    sha1 = "394a535b76ca7399b25be3266f06f614e020517e",
-    src_sha1 = "4e85803c8d539aa0a8389e113095ef86032ac425",
+    sha1 = "bbbb9b5de08f468c7b9b3de6aea0b098d2c679b6",
+    src_sha1 = "6ef1e65a5af7ab2d79ba6043923affdaeaafb1e5",
 )
 
 maven_jar(
     name = "jetty-security",
     artifact = "org.eclipse.jetty:jetty-security:" + JETTY_VER,
-    sha1 = "4f4fc4cbe3504b6c91143ee37b38a1f3de2dcc72",
-    src_sha1 = "2124a757c87eacea7ad6507be6a415b5b51139b5",
+    sha1 = "e8350eec683b55494287f06740543e4be6f75425",
+    src_sha1 = "e3a879d8675fa10bc305e7a59006f1d09db04a68",
 )
 
 maven_jar(
     name = "jetty-server",
     artifact = "org.eclipse.jetty:jetty-server:" + JETTY_VER,
-    sha1 = "b4d30340213c3d2a5f908860ba170c5a697829be",
-    src_sha1 = "295d873f609a0e2863f33b5dbc8906ca348f1107",
+    sha1 = "34614bd9a29de57ef28ca31f1f2b49a412af196d",
+    src_sha1 = "fef49ac6b2bbc6d142dc0be34f68f0fb0792d52b",
 )
 
 maven_jar(
     name = "jetty-http",
     artifact = "org.eclipse.jetty:jetty-http:" + JETTY_VER,
-    sha1 = "c51b8a6a67d64672889249dd958edd77bff8fc0c",
-    src_sha1 = "c1bee39aeb565a4f26852b1851192d98ab611dbc",
+    sha1 = "9879d6c4e37400bf43f0cd4b3c6e34a3ba409864",
+    src_sha1 = "5e746cd0ccb732eef0427c8c4b9dcb034e26c61b",
 )
 
 maven_jar(
     name = "jetty-io",
     artifact = "org.eclipse.jetty:jetty-io:" + JETTY_VER,
-    sha1 = "76086f955d4e943396b8f340fd5bae3ce4da19d9",
-    src_sha1 = "8d41e410b2f0dd284a6e199ed08f45ef7ab2acf1",
+    sha1 = "d3fe2dfa62f52ee91ff07cb359f63387e0e30b40",
+    src_sha1 = "41f25e1e1bba14ab0d3415488fa189f09c27a1cf",
 )
 
 maven_jar(
     name = "jetty-util",
     artifact = "org.eclipse.jetty:jetty-util:" + JETTY_VER,
-    sha1 = "5fd36dfcf39110b809bd9b20cec62706ab694711",
-    src_sha1 = "629fcda1e4eecfd795e24cc07715ab9797970980",
+    sha1 = "d6ec1a1613c7fa72aa6bf5d8c204750afbc3df3b",
+    src_sha1 = "a74ecb43f96b2e21852f6908604316d7348a16ad",
 )
diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
index 78c6392..f0f7712 100644
--- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF
@@ -2,14 +2,15 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.ant.test
 Bundle-SymbolicName: org.eclipse.jgit.ant.test
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: org.apache.tools.ant,
- org.eclipse.jgit.ant.tasks;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.junit;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
+ org.eclipse.jgit.ant.tasks;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.junit;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.0.0,5.0.0)"
+ org.junit;version="[4.12,5.0.0)"
diff --git a/org.eclipse.jgit.ant.test/pom.xml b/org.eclipse.jgit.ant.test/pom.xml
index 2ea73d8..1386a26 100644
--- a/org.eclipse.jgit.ant.test/pom.xml
+++ b/org.eclipse.jgit.ant.test/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ant.test</artifactId>
diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
index e4657f8..a056886 100644
--- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
@@ -1,12 +1,13 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
+Automatic-Module-Name: org.eclipse.jgit.ant
 Bundle-SymbolicName: org.eclipse.jgit.ant
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: org.apache.tools.ant,
-  org.eclipse.jgit.storage.file;version="[4.9.9,4.10.0)"
+  org.eclipse.jgit.storage.file;version="[4.10.1,4.11.0)"
 Bundle-Localization: plugin
 Bundle-Vendor: %Provider-Name
-Export-Package: org.eclipse.jgit.ant.tasks;version="4.9.9";
+Export-Package: org.eclipse.jgit.ant.tasks;version="4.10.1";
  uses:="org.apache.tools.ant.types,org.apache.tools.ant"
diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml
index 41be91d..56dc17b 100644
--- a/org.eclipse.jgit.ant/pom.xml
+++ b/org.eclipse.jgit.ant/pom.xml
@@ -48,7 +48,7 @@
 	<parent>
 		<groupId>org.eclipse.jgit</groupId>
 		<artifactId>org.eclipse.jgit-parent</artifactId>
-		<version>4.9.9-SNAPSHOT</version>
+		<version>4.10.1-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 db6f008..479dd86 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
@@ -71,6 +71,8 @@
 	private Union path;
 
 	/**
+	 * <p>Set the field <code>src</code>.</p>
+	 *
 	 * @param src
 	 *            the src to set
 	 */
@@ -106,6 +108,7 @@
 		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 9962472..0b27cc2 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
@@ -67,6 +67,8 @@
 	private boolean force;
 
 	/**
+	 * Set the <code>src</code>
+	 *
 	 * @param src
 	 *            the src to set
 	 */
@@ -75,6 +77,8 @@
 	}
 
 	/**
+	 * Set <code>branch</code>
+	 *
 	 * @param branch
 	 *            the initial branch to check out
 	 */
@@ -83,6 +87,8 @@
 	}
 
 	/**
+	 * Set if branch should be created if not yet existing
+	 *
 	 * @param createBranch
 	 *            whether the branch should be created if it does not already
 	 *            exist
@@ -92,6 +98,8 @@
 	}
 
 	/**
+	 * Set <code>force</code>
+	 *
 	 * @param force
 	 *            if <code>true</code> and the branch with the given name
 	 *            already exists, the start-point of an existing branch will be
@@ -102,6 +110,7 @@
 		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 b2cb35c..18a6db8 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
@@ -68,6 +68,8 @@
 	private String branch = Constants.HEAD;
 
 	/**
+	 * Set the <code>uri</code>.
+	 *
 	 * @param uri
 	 *            the uri to clone from
 	 */
@@ -80,7 +82,6 @@
 	 * directory isn't set, a name associated with the source uri will be used.
 	 *
 	 * @see URIish#getHumanishName()
-	 *
 	 * @param destination
 	 *            the directory to clone to
 	 */
@@ -89,6 +90,8 @@
 	}
 
 	/**
+	 * Set <code>bare</code>
+	 *
 	 * @param bare
 	 *            whether the cloned repository is bare or not
 	 */
@@ -97,6 +100,8 @@
 	}
 
 	/**
+	 * Set the <code>branch</code>
+	 *
 	 * @param branch
 	 *            the initial branch to check out when cloning the repository
 	 */
@@ -104,6 +109,7 @@
 		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 91e57c0..70fd80e 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
@@ -71,6 +71,8 @@
 	}
 
 	/**
+	 * Configure if the repository should be <code>bare</code>
+	 *
 	 * @param bare
 	 *            whether the repository should be initialized to a bare
 	 *            repository or not.
@@ -79,6 +81,7 @@
 		this.bare = bare;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void execute() throws BuildException {
 		if (bare) {
diff --git a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
index 88e1c20..de627aa 100644
--- a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.archive
 Bundle-SymbolicName: org.eclipse.jgit.archive
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
@@ -12,15 +13,15 @@
  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="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
+ org.eclipse.jgit.api;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.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="4.9.9";
+Export-Package: org.eclipse.jgit.archive;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.api,
    org.apache.commons.compress.archivers,
diff --git a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF
index 4aec44f..6c43e29 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: 4.9.9.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.archive;version="4.9.9.qualifier";roots="."
+Bundle-Version: 4.10.1.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.archive;version="4.10.1.qualifier";roots="."
diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml
index 603ee84..fde3f51 100644
--- a/org.eclipse.jgit.archive/pom.xml
+++ b/org.eclipse.jgit.archive/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.archive</artifactId>
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ArchiveFormats.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ArchiveFormats.java
index 9d3decd..bf0d88e 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ArchiveFormats.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ArchiveFormats.java
@@ -48,11 +48,11 @@
 import org.eclipse.jgit.api.ArchiveCommand;
 
 /**
- * Registers all format types from the org.eclipse.jgit.archive
- * package for use via the ArchiveCommand API.
+ * Registers all format types from the org.eclipse.jgit.archive package for use
+ * via the ArchiveCommand API.
  *
- * See {@link FormatActivator} for an OSGi bundle activator
- * that performs the same registration automatically.
+ * See {@link org.eclipse.jgit.archive.FormatActivator} for an OSGi bundle
+ * activator that performs the same registration automatically.
  */
 public class ArchiveFormats {
 	private static final List<String> myFormats = new ArrayList<>();
diff --git a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/FormatActivator.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/FormatActivator.java
index aa4e4f5..0bb595a 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/FormatActivator.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/FormatActivator.java
@@ -57,12 +57,11 @@
  */
 public class FormatActivator implements BundleActivator {
 	/**
+	 * {@inheritDoc}
+	 *
 	 * Registers all included archive formats by calling
 	 * {@link ArchiveFormats#registerAll()}. This method is called by the OSGi
 	 * framework when the bundle is started.
-	 *
-	 * @param context
-	 *            unused
 	 */
 	@Override
 	public void start(BundleContext context) {
@@ -70,11 +69,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 *
 	 * Cleans up after {@link #start(BundleContext)} by calling
 	 * {@link ArchiveFormats#unregisterAll}.
-	 *
-	 * @param context
-	 *            unused
 	 */
 	@Override
 	public void stop(BundleContext context) {
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 7b7fbcd..7559ada 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
@@ -70,6 +70,7 @@
 	private static final List<String> SUFFIXES = Collections
 			.unmodifiableList(Arrays.asList(".tar")); //$NON-NLS-1$
 
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -77,9 +78,7 @@
 				Collections.<String, Object> emptyMap());
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -89,6 +88,7 @@
 		return applyFormatOptions(out, o);
 	}
 
+	/** {@inheritDoc} */
 	@Deprecated
 	@Override
 	public void putEntry(ArchiveOutputStream out,
@@ -97,9 +97,7 @@
 		putEntry(out, null, path, mode,loader);
 	}
 
-	/**
-	 * @since 4.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -150,16 +148,19 @@
 		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 5f194ec..2f95f6d 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
@@ -66,6 +66,7 @@
 
 	private final ArchiveCommand.Format<ArchiveOutputStream> tarFormat = new TarFormat();
 
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -73,9 +74,7 @@
 				Collections.<String, Object> emptyMap());
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -83,6 +82,7 @@
 		return tarFormat.createArchiveOutputStream(out, o);
 	}
 
+	/** {@inheritDoc} */
 	@Deprecated
 	@Override
 	public void putEntry(ArchiveOutputStream out,
@@ -91,9 +91,7 @@
 		putEntry(out, null, path, mode,loader);
 	}
 
-	/**
-	 * @since 4.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -101,16 +99,19 @@
 		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 a6d053e..b22a62d 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
@@ -66,6 +66,7 @@
 
 	private final ArchiveCommand.Format<ArchiveOutputStream> tarFormat = new TarFormat();
 
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -73,9 +74,7 @@
 				Collections.<String, Object> emptyMap());
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -83,6 +82,7 @@
 		return tarFormat.createArchiveOutputStream(out, o);
 	}
 
+	/** {@inheritDoc} */
 	@Deprecated
 	@Override
 	public void putEntry(ArchiveOutputStream out,
@@ -91,9 +91,7 @@
 		putEntry(out, null, path, mode,loader);
 	}
 
-	/**
-	 * @since 4.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -101,16 +99,19 @@
 		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 b6742ac..d23d2b6 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
@@ -66,6 +66,7 @@
 
 	private final ArchiveCommand.Format<ArchiveOutputStream> tarFormat = new TarFormat();
 
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -73,9 +74,7 @@
 				Collections.<String, Object> emptyMap());
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
@@ -83,6 +82,7 @@
 		return tarFormat.createArchiveOutputStream(out, o);
 	}
 
+	/** {@inheritDoc} */
 	@Deprecated
 	@Override
 	public void putEntry(ArchiveOutputStream out,
@@ -91,9 +91,7 @@
 		putEntry(out, null, path, mode,loader);
 	}
 
-	/**
-	 * @since 4.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -101,16 +99,19 @@
 		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 46d918e..dc8fb44 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
@@ -68,6 +68,7 @@
 	private static final List<String> SUFFIXES = Collections
 			.unmodifiableList(Arrays.asList(".zip")); //$NON-NLS-1$
 
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
 			throws IOException {
@@ -75,15 +76,14 @@
 				Collections.<String, Object> emptyMap());
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
 			Map<String, Object> o) throws IOException {
 		return applyFormatOptions(new ZipArchiveOutputStream(s), o);
 	}
 
+	/** {@inheritDoc} */
 	@Deprecated
 	@Override
 	public void putEntry(ArchiveOutputStream out,
@@ -92,9 +92,7 @@
 		putEntry(out, null, path, mode,loader);
 	}
 
-	/**
-	 * @since 4.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void putEntry(ArchiveOutputStream out,
 			ObjectId tree, String path, FileMode mode, ObjectLoader loader)
@@ -136,16 +134,19 @@
 		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.archive/src/org/eclipse/jgit/archive/internal/ArchiveText.java b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/internal/ArchiveText.java
index f631cf8..cac491a 100644
--- a/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/internal/ArchiveText.java
+++ b/org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/internal/ArchiveText.java
@@ -51,6 +51,8 @@
  */
 public class ArchiveText extends TranslationBundle {
 	/**
+	 * Get an instance of this translation bundle.
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static ArchiveText get() {
diff --git a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
index 0bec339..6da3208 100644
--- a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
+Automatic-Module-Name: org.eclipse.jgit.http.apache
 Bundle-SymbolicName: org.eclipse.jgit.http.apache
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Localization: plugin
 Bundle-Vendor: %Provider-Name
@@ -22,10 +23,10 @@
  org.apache.http.impl.client;version="[4.3.0,5.0.0)",
  org.apache.http.impl.conn;version="[4.3.0,5.0.0)",
  org.apache.http.params;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)"
-Export-Package: org.eclipse.jgit.transport.http.apache;version="4.9.9";
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)"
+Export-Package: org.eclipse.jgit.transport.http.apache;version="4.10.1";
   uses:="org.apache.http.client,
    org.eclipse.jgit.transport.http,
    org.apache.http.entity,
diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml
index 0e21796..b3bcc50 100644
--- a/org.eclipse.jgit.http.apache/pom.xml
+++ b/org.eclipse.jgit.http.apache/pom.xml
@@ -48,7 +48,7 @@
 	<parent>
 		<groupId>org.eclipse.jgit</groupId>
 		<artifactId>org.eclipse.jgit-parent</artifactId>
-		<version>4.9.9-SNAPSHOT</version>
+		<version>4.10.1-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>org.eclipse.jgit.http.apache</artifactId>
@@ -68,6 +68,14 @@
 			<artifactId>org.eclipse.jgit</artifactId>
 			<version>${project.version}</version>
 		</dependency>
+        <dependency>
+          <groupId>org.apache.httpcomponents</groupId>
+          <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.httpcomponents</groupId>
+          <artifactId>httpcore</artifactId>
+        </dependency>
 	</dependencies>
 
 	<build>
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 945ecd5..2819300 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
@@ -58,7 +58,6 @@
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
-import java.security.cert.X509Certificate;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -67,9 +66,6 @@
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocket;
 import javax.net.ssl.TrustManager;
 
 import org.apache.http.Header;
@@ -91,7 +87,6 @@
 import org.apache.http.conn.socket.ConnectionSocketFactory;
 import org.apache.http.conn.socket.PlainConnectionSocketFactory;
 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
@@ -101,7 +96,8 @@
 import org.eclipse.jgit.util.TemporaryBuffer.LocalFile;
 
 /**
- * A {@link HttpConnection} which uses {@link HttpClient}
+ * A {@link org.eclipse.jgit.transport.http.HttpConnection} which uses
+ * {@link org.apache.http.client.HttpClient}
  *
  * @since 3.3
  */
@@ -128,7 +124,7 @@
 
 	private Boolean followRedirects;
 
-	private X509HostnameVerifier hostnameverifier;
+	private HostnameVerifier hostnameverifier;
 
 	SSLContext ctx;
 
@@ -193,6 +189,8 @@
 	}
 
 	/**
+	 * Constructor for HttpClientConnection.
+	 *
 	 * @param urlStr
 	 * @throws MalformedURLException
 	 */
@@ -201,6 +199,8 @@
 	}
 
 	/**
+	 * Constructor for HttpClientConnection.
+	 *
 	 * @param urlStr
 	 * @param proxy
 	 * @throws MalformedURLException
@@ -211,6 +211,8 @@
 	}
 
 	/**
+	 * Constructor for HttpClientConnection.
+	 *
 	 * @param urlStr
 	 * @param proxy
 	 * @param cl
@@ -223,17 +225,20 @@
 		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();
@@ -262,6 +267,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Map<String, List<String>> getHeaderFields() {
 		Map<String, List<String>> ret = new HashMap<>();
@@ -274,11 +280,13 @@
 		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;
@@ -296,21 +304,25 @@
 		}
 	}
 
+	/** {@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();
@@ -322,18 +334,21 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public InputStream getInputStream() throws IOException {
 		return resp.getEntity().getContent();
 	}
 
 	// will return only the first field
+	/** {@inheritDoc} */
 	@Override
 	public String getHeaderField(String name) {
 		Header header = resp.getFirstHeader(name);
 		return (header == null) ? null : header.getValue();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int getContentLength() {
 		Header contentLength = resp.getFirstHeader("content-length"); //$NON-NLS-1$
@@ -349,16 +364,19 @@
 		}
 	}
 
+	/** {@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)
@@ -367,6 +385,7 @@
 		entity.setContentLength(contentLength);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public OutputStream getOutputStream() throws IOException {
 		if (entity == null)
@@ -374,6 +393,7 @@
 		return entity.getBuffer();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setChunkedStreamingMode(int chunklen) {
 		if (entity == null)
@@ -381,48 +401,31 @@
 		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(final HostnameVerifier hostnameverifier) {
-		this.hostnameverifier = new X509HostnameVerifier() {
-			@Override
-			public boolean verify(String hostname, SSLSession session) {
-				return hostnameverifier.verify(hostname, session);
-			}
-
-			@Override
-			public void verify(String host, String[] cns, String[] subjectAlts)
-					throws SSLException {
-				throw new UnsupportedOperationException(); // TODO message
-			}
-
-			@Override
-			public void verify(String host, X509Certificate cert)
-					throws SSLException {
-				throw new UnsupportedOperationException(); // TODO message
-			}
-
-			@Override
-			public void verify(String host, SSLSocket ssl) throws IOException {
-				hostnameverifier.verify(host, ssl.getSession());
-			}
-		};
+		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/HttpClientConnectionFactory.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnectionFactory.java
index f97d284..4556a34 100644
--- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnectionFactory.java
+++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnectionFactory.java
@@ -50,16 +50,19 @@
 import org.eclipse.jgit.transport.http.HttpConnectionFactory;
 
 /**
- * A factory returning instances of {@link HttpClientConnection}
+ * A factory returning instances of
+ * {@link org.eclipse.jgit.transport.http.apache.HttpClientConnection}
  *
  * @since 3.3
  */
 public class HttpClientConnectionFactory implements HttpConnectionFactory {
+	/** {@inheritDoc} */
 	@Override
 	public HttpConnection create(URL url) throws IOException {
 		return new HttpClientConnection(url.toString());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public HttpConnection create(URL url, Proxy proxy)
 			throws IOException {
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 3efff49..b81e31c 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
@@ -46,12 +46,12 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.apache.http.HttpEntity;
 import org.apache.http.entity.AbstractHttpEntity;
 import org.eclipse.jgit.util.TemporaryBuffer;
 
 /**
- * A {@link HttpEntity} which takes it's content from a {@link TemporaryBuffer}
+ * A {@link org.apache.http.HttpEntity} which takes its content from a
+ * {@link org.eclipse.jgit.util.TemporaryBuffer}
  *
  * @since 3.3
  */
@@ -62,8 +62,8 @@
 	private Integer contentLength;
 
 	/**
-	 * Construct a new {@link HttpEntity} which will contain the content stored
-	 * in the specified buffer
+	 * Construct a new {@link org.apache.http.HttpEntity} which will contain the
+	 * content stored in the specified buffer
 	 *
 	 * @param buffer
 	 */
@@ -72,17 +72,21 @@
 	}
 
 	/**
+	 * Get the <code>buffer</code> containing the content
+	 *
 	 * @return buffer containing the content
 	 */
 	public TemporaryBuffer getBuffer() {
 		return buffer;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isRepeatable() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getContentLength() {
 		if (contentLength != null)
@@ -90,23 +94,28 @@
 		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;
 	}
 
 	/**
+	 * Set the <code>contentLength</code>
+	 *
 	 * @param contentLength
 	 */
 	public void setContentLength(int contentLength) {
@@ -114,8 +123,9 @@
 	}
 
 	/**
-	 * Close destroys the associated buffer used to buffer the entity
+	 * {@inheritDoc}
 	 *
+	 * Close destroys the associated buffer used to buffer the entity
 	 * @since 4.5
 	 */
 	@Override
diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/internal/HttpApacheText.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/internal/HttpApacheText.java
index 38f1578..1c65230 100644
--- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/internal/HttpApacheText.java
+++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/internal/HttpApacheText.java
@@ -51,6 +51,8 @@
  */
 public class HttpApacheText extends TranslationBundle {
 	/**
+	 * Get an instance of this translation bundle.
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static HttpApacheText get() {
diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
index 444c666..e850235 100644
--- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF
@@ -1,14 +1,15 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.http.server
 Bundle-SymbolicName: org.eclipse.jgit.http.server
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
-Export-Package: org.eclipse.jgit.http.server;version="4.9.9",
- org.eclipse.jgit.http.server.glue;version="4.9.9";
+Export-Package: org.eclipse.jgit.http.server;version="4.10.1",
+ org.eclipse.jgit.http.server.glue;version="4.10.1";
   uses:="javax.servlet,javax.servlet.http",
- org.eclipse.jgit.http.server.resolver;version="4.9.9";
+ org.eclipse.jgit.http.server.resolver;version="4.10.1";
   uses:="org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.transport,
@@ -17,12 +18,12 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: javax.servlet;version="[2.5.0,3.2.0)",
  javax.servlet.http;version="[2.5.0,3.2.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.resolver;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)"
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.resolver;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)"
diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml
index 4ef75de..454d808 100644
--- a/org.eclipse.jgit.http.server/pom.xml
+++ b/org.eclipse.jgit.http.server/pom.xml
@@ -52,7 +52,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 05391eb..7f826d4 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
@@ -70,16 +70,19 @@
 		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/ClientVersionUtil.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ClientVersionUtil.java
index c0d4b5e..38a9ea7 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ClientVersionUtil.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ClientVersionUtil.java
@@ -47,13 +47,19 @@
 
 import javax.servlet.http.HttpServletRequest;
 
-/** Parses Git client User-Agent strings. */
+/**
+ * Parses Git client User-Agent strings.
+ */
 public class ClientVersionUtil {
 	private static final int[] v1_7_5 = { 1, 7, 5 };
 	private static final int[] v1_7_8_6 = { 1, 7, 8, 6 };
 	private static final int[] v1_7_9 = { 1, 7, 9 };
 
-	/** @return maximum version array, indicating an invalid version of Git. */
+	/**
+	 * An invalid version of Git
+	 *
+	 * @return maximum version array, indicating an invalid version of Git.
+	 */
 	public static int[] invalidVersion() {
 		return new int[] { Integer.MAX_VALUE };
 	}
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 8070371..2ebe1b7 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
@@ -62,8 +62,6 @@
 import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
 import org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.UploadPack;
 import org.eclipse.jgit.transport.resolver.FileResolver;
 import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
@@ -74,15 +72,16 @@
  * Handles Git repository access over HTTP.
  * <p>
  * Applications embedding this filter should map a directory path within the
- * application to this filter. For a servlet version, see {@link GitServlet}.
+ * application to this filter. For a servlet version, see
+ * {@link org.eclipse.jgit.http.server.GitServlet}.
  * <p>
  * Applications may wish to add additional repository action URLs to this
- * servlet by taking advantage of its extension from {@link MetaFilter}.
- * Callers may register their own URL suffix translations through
- * {@link #serve(String)}, or their regex translations through
- * {@link #serveRegex(String)}. Each translation should contain a complete
- * filter pipeline which ends with the HttpServlet that should handle the
- * requested action.
+ * servlet by taking advantage of its extension from
+ * {@link org.eclipse.jgit.http.server.glue.MetaFilter}. Callers may register
+ * their own URL suffix translations through {@link #serve(String)}, or their
+ * regex translations through {@link #serveRegex(String)}. Each translation
+ * should contain a complete filter pipeline which ends with the HttpServlet
+ * that should handle the requested action.
  */
 public class GitFilter extends MetaFilter {
 	private volatile boolean initialized;
@@ -124,6 +123,8 @@
 	}
 
 	/**
+	 * Set AsIsFileService
+	 *
 	 * @param f
 	 *            the filter to validate direct access to repository files
 	 *            through a dumb client. If {@code null} then dumb client
@@ -135,9 +136,12 @@
 	}
 
 	/**
+	 * Set upload-pack factory
+	 *
 	 * @param f
-	 *            the factory to construct and configure an {@link UploadPack}
-	 *            session when a fetch or clone is requested by a client.
+	 *            the factory to construct and configure an
+	 *            {@link org.eclipse.jgit.transport.UploadPack} session when a
+	 *            fetch or clone is requested by a client.
 	 */
 	@SuppressWarnings("unchecked")
 	public void setUploadPackFactory(UploadPackFactory<HttpServletRequest> f) {
@@ -146,10 +150,12 @@
 	}
 
 	/**
+	 * Add upload-pack filter
+	 *
 	 * @param filter
 	 *            filter to apply before any of the UploadPack operations. The
 	 *            UploadPack instance is available in the request attribute
-	 *            {@link ServletUtils#ATTRIBUTE_HANDLER}.
+	 *            {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
 	 */
 	public void addUploadPackFilter(Filter filter) {
 		assertNotInitialized();
@@ -157,9 +163,12 @@
 	}
 
 	/**
+	 * Set the receive-pack factory
+	 *
 	 * @param f
-	 *            the factory to construct and configure a {@link ReceivePack}
-	 *            session when a push is requested by a client.
+	 *            the factory to construct and configure a
+	 *            {@link org.eclipse.jgit.transport.ReceivePack} session when a
+	 *            push is requested by a client.
 	 */
 	@SuppressWarnings("unchecked")
 	public void setReceivePackFactory(ReceivePackFactory<HttpServletRequest> f) {
@@ -168,10 +177,12 @@
 	}
 
 	/**
+	 * Add receive-pack filter
+	 *
 	 * @param filter
 	 *            filter to apply before any of the ReceivePack operations. The
 	 *            ReceivePack instance is available in the request attribute
-	 *            {@link ServletUtils#ATTRIBUTE_HANDLER}.
+	 *            {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
 	 */
 	public void addReceivePackFilter(Filter filter) {
 		assertNotInitialized();
@@ -183,6 +194,7 @@
 			throw new IllegalStateException(HttpServerText.get().alreadyInitializedByContainer);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void init(FilterConfig filterConfig) throws ServletException {
 		super.init(filterConfig);
@@ -297,6 +309,7 @@
 		}
 	}
 
+	/** {@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 3a5edee..ee23677 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
@@ -54,8 +54,6 @@
 
 import org.eclipse.jgit.http.server.glue.MetaServlet;
 import org.eclipse.jgit.http.server.resolver.AsIsFileService;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.UploadPack;
 import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
 import org.eclipse.jgit.transport.resolver.UploadPackFactory;
@@ -87,12 +85,12 @@
  *
  * <p>
  * Applications may wish to add additional repository action URLs to this
- * servlet by taking advantage of its extension from {@link MetaServlet}.
- * Callers may register their own URL suffix translations through
- * {@link #serve(String)}, or their regex translations through
- * {@link #serveRegex(String)}. Each translation should contain a complete
- * filter pipeline which ends with the HttpServlet that should handle the
- * requested action.
+ * servlet by taking advantage of its extension from
+ * {@link org.eclipse.jgit.http.server.glue.MetaServlet}. Callers may register
+ * their own URL suffix translations through {@link #serve(String)}, or their
+ * regex translations through {@link #serveRegex(String)}. Each translation
+ * should contain a complete filter pipeline which ends with the HttpServlet
+ * that should handle the requested action.
  */
 public class GitServlet extends MetaServlet {
 	private static final long serialVersionUID = 1L;
@@ -124,6 +122,8 @@
 	}
 
 	/**
+	 * Set AsIsFileService
+	 *
 	 * @param f
 	 *            the filter to validate direct access to repository files
 	 *            through a dumb client. If {@code null} then dumb client
@@ -134,43 +134,54 @@
 	}
 
 	/**
+	 * Set upload-pack factory
+	 *
 	 * @param f
-	 *            the factory to construct and configure an {@link UploadPack}
-	 *            session when a fetch or clone is requested by a client.
+	 *            the factory to construct and configure an
+	 *            {@link org.eclipse.jgit.transport.UploadPack} session when a
+	 *            fetch or clone is requested by a client.
 	 */
 	public void setUploadPackFactory(UploadPackFactory<HttpServletRequest> f) {
 		gitFilter.setUploadPackFactory(f);
 	}
 
 	/**
+	 * Add upload-pack filter
+	 *
 	 * @param filter
 	 *            filter to apply before any of the UploadPack operations. The
 	 *            UploadPack instance is available in the request attribute
-	 *            {@link ServletUtils#ATTRIBUTE_HANDLER}.
+	 *            {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
 	 */
 	public void addUploadPackFilter(Filter filter) {
 		gitFilter.addUploadPackFilter(filter);
 	}
 
 	/**
+	 * Set receive-pack factory
+	 *
 	 * @param f
-	 *            the factory to construct and configure a {@link ReceivePack}
-	 *            session when a push is requested by a client.
+	 *            the factory to construct and configure a
+	 *            {@link org.eclipse.jgit.transport.ReceivePack} session when a
+	 *            push is requested by a client.
 	 */
 	public void setReceivePackFactory(ReceivePackFactory<HttpServletRequest> f) {
 		gitFilter.setReceivePackFactory(f);
 	}
 
 	/**
+	 * Add receive-pack filter
+	 *
 	 * @param filter
 	 *            filter to apply before any of the ReceivePack operations. The
 	 *            ReceivePack instance is available in the request attribute
-	 *            {@link ServletUtils#ATTRIBUTE_HANDLER}.
+	 *            {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
 	 */
 	public void addReceivePackFilter(Filter filter) {
 		gitFilter.addReceivePackFilter(filter);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void init(final ServletConfig config) throws ServletException {
 		gitFilter.init(new FilterConfig() {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitSmartHttpTools.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitSmartHttpTools.java
index cfe4822..d6955b4 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitSmartHttpTools.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitSmartHttpTools.java
@@ -154,9 +154,9 @@
 	 * an HTTP response code is returned instead.
 	 * <p>
 	 * This method may only be called before handing off the request to
-	 * {@link UploadPack#upload(java.io.InputStream, OutputStream, OutputStream)}
+	 * {@link org.eclipse.jgit.transport.UploadPack#upload(java.io.InputStream, OutputStream, OutputStream)}
 	 * or
-	 * {@link ReceivePack#receive(java.io.InputStream, OutputStream, OutputStream)}.
+	 * {@link org.eclipse.jgit.transport.ReceivePack#receive(java.io.InputStream, OutputStream, OutputStream)}.
 	 *
 	 * @param req
 	 *            current request.
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/HttpServerText.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/HttpServerText.java
index dff90a6..fbb2061 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/HttpServerText.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/HttpServerText.java
@@ -52,6 +52,8 @@
 public class HttpServerText extends TranslationBundle {
 
 	/**
+	 * Get an instance of this translation bundle
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static HttpServerText get() {
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 91c2f9f..830e061 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
@@ -60,6 +60,7 @@
 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 72c7136..ccb76ad 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
@@ -64,6 +64,7 @@
 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 223813f..b0b831f 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
@@ -66,16 +66,19 @@
  * 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 bdc3420..5177858 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
@@ -57,18 +57,21 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
-/** Adds HTTP response headers to prevent caching by proxies/browsers. */
+/** 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 babc036..50dc68f 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
@@ -117,12 +117,14 @@
 
 	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/ReceivePackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
index 9d24bf7..a46652e 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
@@ -165,6 +165,7 @@
 		}
 	}
 
+	/** {@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 de09c54..c89a5d7 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,16 +71,19 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
 /**
- * Opens a repository named by the path info through {@link RepositoryResolver}.
+ * Open a repository named by the path info through
+ * {@link org.eclipse.jgit.transport.resolver.RepositoryResolver}.
  * <p>
- * This filter assumes it is invoked by {@link GitServlet} and is likely to not
- * work as expected if called from any other class. This filter assumes the path
- * info of the current request is a repository name which can be used by the
- * configured {@link RepositoryResolver} to open a {@link Repository} and attach
- * it to the current request.
+ * This filter assumes it is invoked by
+ * {@link org.eclipse.jgit.http.server.GitServlet} and is likely to not work as
+ * expected if called from any other class. This filter assumes the path info of
+ * the current request is a repository name which can be used by the configured
+ * {@link org.eclipse.jgit.transport.resolver.RepositoryResolver} to open a
+ * {@link org.eclipse.jgit.lib.Repository} and attach it to the current request.
  * <p>
- * This filter sets request attribute {@link ServletUtils#ATTRIBUTE_REPOSITORY}
- * when it discovers the repository, and automatically closes and removes the
+ * This filter sets request attribute
+ * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_REPOSITORY} when
+ * it discovers the repository, and automatically closes and removes the
  * attribute when the request is complete.
  */
 public class RepositoryFilter implements Filter {
@@ -93,23 +96,27 @@
 	 *
 	 * @param resolver
 	 *            the resolver which will be used to translate the URL name
-	 *            component to the actual {@link Repository} instance for the
+	 *            component to the actual
+	 *            {@link org.eclipse.jgit.lib.Repository} instance for the
 	 *            current web request.
 	 */
 	public RepositoryFilter(final RepositoryResolver<HttpServletRequest> resolver) {
 		this.resolver = resolver;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void init(final 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/ServletUtils.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
index c7fbaf6..f1ff547 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
@@ -68,7 +68,9 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 
-/** Common utility functions for servlets. */
+/**
+ * Common utility functions for servlets.
+ */
 public final class ServletUtils {
 	/** Request attribute which stores the {@link Repository} instance. */
 	public static final String ATTRIBUTE_REPOSITORY = "org.eclipse.jgit.Repository";
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 08a5eba..4eb94a3 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
@@ -83,6 +83,7 @@
 		this.compressStream = compressStream;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected OutputStream overflow() throws IOException {
 		startedOutput = true;
@@ -95,6 +96,7 @@
 		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 fe34f66..6417877 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
@@ -80,16 +80,19 @@
 		this.filters = filters.toArray(new Filter[filters.size()]);
 	}
 
+	/** {@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 {
@@ -146,10 +149,31 @@
 		}
 	}
 
+	/**
+	 * Begin service.
+	 *
+	 * @param req
+	 *            request
+	 * @param db
+	 *            repository
+	 * @throws IOException
+	 * @throws ServiceNotEnabledException
+	 * @throws ServiceNotAuthorizedException
+	 */
 	protected abstract void begin(HttpServletRequest req, Repository db)
 			throws IOException, ServiceNotEnabledException,
 			ServiceNotAuthorizedException;
 
+	/**
+	 * Advertise.
+	 *
+	 * @param req
+	 *            request
+	 * @param pck
+	 * @throws IOException
+	 * @throws ServiceNotEnabledException
+	 * @throws ServiceNotAuthorizedException
+	 */
 	protected abstract void advertise(HttpServletRequest req,
 			PacketLineOutRefAdvertiser pck) throws IOException,
 			ServiceNotEnabledException, ServiceNotAuthorizedException;
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 28ee17d..00851cf 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
@@ -68,6 +68,7 @@
 		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/UploadPackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java
index 97d00c1..3e9c1fe 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
@@ -164,6 +164,7 @@
 		}
 	}
 
+	/** {@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/glue/ErrorServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ErrorServlet.java
index c0a9e0e..57fddda 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
@@ -50,7 +50,9 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-/** Sends a fixed status code to the client. */
+/**
+ * Send a fixed status code to the client.
+ */
 public class ErrorServlet extends HttpServlet {
 	private static final long serialVersionUID = 1L;
 
@@ -66,6 +68,7 @@
 		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 adb6c42..43e22b3 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
@@ -87,7 +87,9 @@
 
 	private volatile UrlPipeline[] pipelines;
 
-	/** Empty filter with no bindings. */
+	/**
+	 * Empty filter with no bindings.
+	 */
 	public MetaFilter() {
 		this.bindings = new ArrayList<>();
 	}
@@ -128,11 +130,13 @@
 		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) {
@@ -168,6 +172,7 @@
 		};
 	}
 
+	/** {@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 71365c8..d8fa712 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
@@ -74,7 +74,9 @@
 
 	private final MetaFilter filter;
 
-	/** Empty servlet with no bindings. */
+	/**
+	 * Empty servlet with no bindings.
+	 */
 	public MetaServlet() {
 		this(new MetaFilter());
 	}
@@ -89,7 +91,11 @@
 		filter = delegateFilter;
 	}
 
-	/** @return filter this servlet delegates all routing logic to. */
+	/**
+	 * Get delegate filter
+	 *
+	 * @return filter this servlet delegates all routing logic to.
+	 */
 	protected MetaFilter getDelegateFilter() {
 		return filter;
 	}
@@ -116,6 +122,7 @@
 		return filter.serveRegex(expression);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void init(ServletConfig config) throws ServletException {
 		String name = filter.getClass().getName();
@@ -123,11 +130,13 @@
 		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 961f88e..b4b7455 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
@@ -59,11 +59,13 @@
 		this.context = context;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getInitParameter(String name) {
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Enumeration<String> getInitParameterNames() {
 		return new Enumeration<String>() {
@@ -79,11 +81,13 @@
 		};
 	}
 
+	/** {@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 a402977..a3dc6c3 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
@@ -61,14 +61,17 @@
  * Switch servlet path and path info to use another regex match group.
  * <p>
  * This filter is meant to be installed in the middle of a pipeline created by
- * {@link MetaServlet#serveRegex(String)}. The passed request's servlet path is
- * updated to be all text up to the start of the designated capture group, and
- * the path info is changed to the contents of the capture group.
- **/
+ * {@link org.eclipse.jgit.http.server.glue.MetaServlet#serveRegex(String)}. The
+ * passed request's servlet path is updated to be all text up to the start of
+ * the designated capture group, and the path info is changed to the contents of
+ * the capture group.
+ */
 public class RegexGroupFilter implements Filter {
 	private final int groupIdx;
 
 	/**
+	 * Constructor for RegexGroupFilter
+	 *
 	 * @param groupIdx
 	 *            capture group number, 1 through the number of groups.
 	 */
@@ -79,16 +82,19 @@
 		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 f33243b..bf2d6db 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
@@ -164,6 +164,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "Pipeline[regex: " + pattern + " ]";
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinder.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinder.java
index 47443f5..b2b4748 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinder.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/ServletBinder.java
@@ -46,9 +46,13 @@
 import javax.servlet.Filter;
 import javax.servlet.http.HttpServlet;
 
-/** Binds a servlet to a URL. */
+/**
+ * Binds a servlet to a URL.
+ */
 public interface ServletBinder {
 	/**
+	 * Set the filter to trigger while processing the path.
+	 *
 	 * @param filter
 	 *            the filter to trigger while processing the path.
 	 * @return {@code this}.
@@ -56,6 +60,8 @@
 	public ServletBinder through(Filter filter);
 
 	/**
+	 * Set the servlet to execute on this path
+	 *
 	 * @param servlet
 	 *            the servlet to execute on this path.
 	 */
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 4e879a9..18650eb 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
@@ -61,6 +61,7 @@
 		this.filters = new ArrayList<>();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ServletBinder through(Filter filter) {
 		if (filter == null)
@@ -69,6 +70,7 @@
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void with(HttpServlet servlet) {
 		if (servlet == null)
@@ -78,7 +80,11 @@
 		httpServlet = servlet;
 	}
 
-	/** @return the configured servlet, or singleton returning 404 if none. */
+	/**
+	 * Get the servlet
+	 *
+	 * @return the configured servlet, or singleton returning 404 if none.
+	 */
 	protected HttpServlet getServlet() {
 		if (httpServlet != null)
 			return httpServlet;
@@ -86,7 +92,11 @@
 			return new ErrorServlet(HttpServletResponse.SC_NOT_FOUND);
 	}
 
-	/** @return the configured filters; zero-length array if none. */
+	/**
+	 * Get filters
+	 *
+	 * @return the configured filters; zero-length array if none.
+	 */
 	protected Filter[] getFilters() {
 		return filters.toArray(new Filter[filters.size()]);
 	}
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 903de63..6742c9f 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
@@ -103,6 +103,7 @@
 		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 b702c07..0964568 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
@@ -46,7 +46,9 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 
-/** Overrides the path and path info. */
+/**
+ * Overrides the path and path info.
+ */
 public class WrappedRequest extends HttpServletRequestWrapper {
 	private final String path;
 
@@ -69,17 +71,20 @@
 		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/AsIsFileService.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/AsIsFileService.java
index d20fe9f..11ad5e0 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/AsIsFileService.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/resolver/AsIsFileService.java
@@ -45,7 +45,6 @@
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.eclipse.jgit.http.server.GitServlet;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
@@ -57,8 +56,9 @@
  * Older HTTP clients which do not speak the smart HTTP variant of the Git
  * protocol fetch from a repository by directly getting its objects and pack
  * files. This class, along with the {@code http.getanyfile} per-repository
- * configuration setting, can be used by {@link GitServlet} to control whether
- * or not these older clients are permitted to read these direct files.
+ * configuration setting, can be used by
+ * {@link org.eclipse.jgit.http.server.GitServlet} to control whether or not
+ * these older clients are permitted to read these direct files.
  */
 public class AsIsFileService {
 	/** Always throws {@link ServiceNotEnabledException}. */
@@ -98,8 +98,10 @@
 	 * throwing a checked exception if access should be denied.
 	 * <p>
 	 * The default implementation of this method checks {@code http.getanyfile},
-	 * throwing {@link ServiceNotEnabledException} if it was explicitly set to
-	 * {@code false}, and otherwise succeeding silently.
+	 * throwing
+	 * {@link org.eclipse.jgit.transport.resolver.ServiceNotEnabledException} if
+	 * it was explicitly set to {@code false}, and otherwise succeeding
+	 * silently.
 	 *
 	 * @param req
 	 *            current HTTP request, in case information from the request may
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 c0ffbb6..95eb8d5 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
@@ -54,12 +54,14 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
 /**
- * Create and configure {@link ReceivePack} service instance.
+ * Create and configure {@link org.eclipse.jgit.transport.ReceivePack} service
+ * instance.
  * <p>
  * Writing by receive-pack is permitted if any of the following is true:
  * <ul>
  * <li>The container has authenticated the user and set
- * {@link HttpServletRequest#getRemoteUser()} to the authenticated name.
+ * {@link javax.servlet.http.HttpServletRequest#getRemoteUser()} to the
+ * authenticated name.
  * <li>The repository configuration file has {@code http.receivepack} explicitly
  * set to true.
  * </ul>
@@ -78,6 +80,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ReceivePack create(final HttpServletRequest req, final 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 642623b..f5afa1e 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
@@ -53,7 +53,8 @@
 import org.eclipse.jgit.transport.resolver.UploadPackFactory;
 
 /**
- * Create and configure {@link UploadPack} service instance.
+ * Create and configure {@link org.eclipse.jgit.transport.UploadPack} service
+ * instance.
  * <p>
  * Reading by upload-pack is permitted unless {@code http.uploadpack} is
  * explicitly set to false.
@@ -68,6 +69,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public UploadPack create(final HttpServletRequest req, final 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 33218fe..9d5e805 100644
--- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.http.test
 Bundle-SymbolicName: org.eclipse.jgit.http.test
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
@@ -24,27 +25,28 @@
  org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.thread;version="[9.4.5,10.0.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.http.server;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.http.server.glue;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.http.server.resolver;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.junit;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.junit.http;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http.apache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.resolver;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.http.server;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.http.server.glue;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.http.server.resolver;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.junit;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.junit.http;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http.apache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.resolver;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.0.0,5.0.0)",
- org.junit.rules;version="[4.0.0,5.0.0)",
- org.junit.runner;version="[4.0.0,5.0.0)",
- org.junit.runners;version="[4.0.0,5.0.0)"
+ org.junit;version="[4.12,5.0.0)",
+ org.junit.rules;version="[4.12,5.0.0)",
+ org.junit.runner;version="[4.12,5.0.0)",
+ org.junit.runners;version="[4.12,5.0.0)"
 Require-Bundle: org.hamcrest.library;bundle-version="[1.1.0,2.0.0)"
diff --git a/org.eclipse.jgit.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml
index 838b996..d302cf8 100644
--- a/org.eclipse.jgit.http.test/pom.xml
+++ b/org.eclipse.jgit.http.test/pom.xml
@@ -51,7 +51,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 a1e41d1..78f909e 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
@@ -46,6 +46,7 @@
 
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.internal.storage.reftable.Reftable;
 import org.eclipse.jgit.lib.RefDatabase;
 
 /**
@@ -64,6 +65,7 @@
 		failing = false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefDatabase getRefDatabase() {
 		return refs;
@@ -80,14 +82,12 @@
 	}
 
 	private class RefsUnreadableRefDatabase extends MemRefDatabase {
-
 		@Override
-		protected RefCache scanAllRefs() throws IOException {
+		protected Reftable reader() throws IOException {
 			if (failing) {
 				throw new IOException("disk failed, no refs found");
-			} else {
-				return super.scanAllRefs();
 			}
+			return super.reader();
 		}
 	}
 }
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 334e57c..c6a3e3b 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
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
-/** A simple repository resolver for tests. */
+/**
+ * A simple repository resolver for tests.
+ */
 public final class TestRepositoryResolver
 		implements RepositoryResolver<HttpServletRequest> {
 
@@ -59,8 +61,8 @@
 	private final String repoName;
 
 	/**
-	 * Creates a new {@link TestRepositoryResolver} that resolves the given name to
-	 * the given repository.
+	 * Create a new {@link org.eclipse.jgit.http.test.TestRepositoryResolver}
+	 * that resolves the given name to the given repository.
 	 *
 	 * @param repo
 	 *            to resolve to
@@ -72,6 +74,7 @@
 		this.repoName = repoName;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Repository open(HttpServletRequest req, String name)
 			throws RepositoryNotFoundException, ServiceNotEnabledException {
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
index caa172e..31832e7 100644
--- a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.http.test;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_ENCODING;
 import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_LENGTH;
 import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_TYPE;
@@ -56,7 +57,6 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1166,7 +1166,7 @@
 	public void testInvalidWant() throws Exception {
 		@SuppressWarnings("resource")
 		ObjectId id = new ObjectInserter.Formatter().idFor(Constants.OBJ_BLOB,
-				"testInvalidWant".getBytes(StandardCharsets.UTF_8));
+				"testInvalidWant".getBytes(UTF_8));
 
 		Repository dst = createBareRepository();
 		try (Transport t = Transport.open(dst, remoteURI);
diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
index dd12de4..966af78 100644
--- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.junit.http
 Bundle-SymbolicName: org.eclipse.jgit.junit.http
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
 Bundle-ActivationPolicy: lazy
@@ -21,16 +22,16 @@
  org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.ssl;version="[9.4.5,10.0.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.http.server;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.junit;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.resolver;version="[4.9.9,4.10.0)",
- org.junit;version="[4.0.0,5.0.0)"
-Export-Package: org.eclipse.jgit.junit.http;version="4.9.9";
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.http.server;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.junit;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.resolver;version="[4.10.1,4.11.0)",
+ org.junit;version="[4.12,5.0.0)"
+Export-Package: org.eclipse.jgit.junit.http;version="4.10.1";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.junit,
    javax.servlet.http,
diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml
index 8a9e7cc..6fe484d 100644
--- a/org.eclipse.jgit.junit.http/pom.xml
+++ b/org.eclipse.jgit.junit.http/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 0154a7f..01c4360 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
@@ -51,7 +51,9 @@
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Response;
 
-/** A single request made through {@link AppServer}. */
+/**
+ * A single request made through {@link org.eclipse.jgit.junit.http.AppServer}.
+ */
 public class AccessEvent {
 	private final String method;
 
@@ -105,17 +107,27 @@
 		return new TreeMap<>(parameterMap);
 	}
 
-	/** @return {@code "GET"} or {@code "POST"} */
+	/**
+	 * Get the <code>method</code>.
+	 *
+	 * @return {@code "GET"} or {@code "POST"}
+	 */
 	public String getMethod() {
 		return method;
 	}
 
-	/** @return path of the file on the server, e.g. {@code /git/HEAD}. */
+	/**
+	 * Get <code>path</code>.
+	 *
+	 * @return path of the file on the server, e.g. {@code /git/HEAD}.
+	 */
 	public String getPath() {
 		return uri;
 	}
 
 	/**
+	 * Get request header
+	 *
 	 * @param name
 	 *            name of the request header to read.
 	 * @return first value of the request header; null if not sent.
@@ -125,6 +137,8 @@
 	}
 
 	/**
+	 * Get parameter
+	 *
 	 * @param name
 	 *            name of the request parameter to read.
 	 * @return first value of the request parameter; null if not sent.
@@ -134,17 +148,27 @@
 		return r != null && 1 <= r.length ? r[0] : null;
 	}
 
-	/** @return all parameters in the request. */
+	/**
+	 * Get <code>parameters</code>
+	 *
+	 * @return all parameters in the request.
+	 */
 	public Map<String, String[]> getParameters() {
 		return parameters;
 	}
 
-	/** @return HTTP status code of the response, e.g. 200, 403, 500. */
+	/**
+	 * Get the <code>status</code>.
+	 *
+	 * @return HTTP status code of the response, e.g. 200, 403, 500.
+	 */
 	public int getStatus() {
 		return status;
 	}
 
 	/**
+	 * Get response header.
+	 *
 	 * @param name
 	 *            name of the response header to read.
 	 * @return first value of the response header; null if not sent.
@@ -153,6 +177,7 @@
 		return responseHeaders.get(name);
 	}
 
+	/** {@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 e257cf6..9309fe7 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
@@ -124,11 +124,16 @@
 
 	private List<File> filesToDelete = new ArrayList<>();
 
+	/**
+	 * Constructor for <code>AppServer</code>.
+	 */
 	public AppServer() {
 		this(0, -1);
 	}
 
 	/**
+	 * Constructor for <code>AppServer</code>.
+	 *
 	 * @param port
 	 *            the http port number; may be zero to allocate a port
 	 *            dynamically
@@ -139,6 +144,8 @@
 	}
 
 	/**
+	 * Constructor for <code>AppServer</code>.
+	 *
 	 * @param port
 	 *            for http, may be zero to allocate a port dynamically
 	 * @param sslPort
@@ -268,6 +275,13 @@
 		return ctx;
 	}
 
+	/**
+	 * Configure basic authentication.
+	 *
+	 * @param ctx
+	 * @param methods
+	 * @return servlet context handler
+	 */
 	public ServletContextHandler authBasic(ServletContextHandler ctx,
 			String... methods) {
 		assertNotYetSetUp();
@@ -395,24 +409,38 @@
 		}
 	}
 
-	/** @return the local port number the server is listening on. */
+	/**
+	 * Get port.
+	 *
+	 * @return the local port number the server is listening on.
+	 */
 	public int getPort() {
 		assertAlreadySetUp();
 		return connector.getLocalPort();
 	}
 
-	/** @return the HTTPS port or -1 if not configured. */
+	/**
+	 * Get secure port.
+	 *
+	 * @return the HTTPS port or -1 if not configured.
+	 */
 	public int getSecurePort() {
 		assertAlreadySetUp();
 		return secureConnector != null ? secureConnector.getLocalPort() : -1;
 	}
 
-	/** @return all requests since the server was started. */
+	/**
+	 * Get requests.
+	 *
+	 * @return all requests since the server was started.
+	 */
 	public List<AccessEvent> getRequests() {
 		return new ArrayList<>(log.getEvents());
 	}
 
 	/**
+	 * Get requests.
+	 *
 	 * @param base
 	 *            base URI used to access the server.
 	 * @param path
@@ -424,6 +452,8 @@
 	}
 
 	/**
+	 * Get requests.
+	 *
 	 * @param path
 	 *            the path to locate requests for.
 	 * @return all requests which match the given path.
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 eabb0f2..a133ca6 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
@@ -67,19 +67,24 @@
 import org.eclipse.jgit.transport.RemoteRefUpdate;
 import org.eclipse.jgit.transport.URIish;
 
-/** Base class for HTTP related transport testing. */
+/**
+ * Base class for HTTP related transport testing.
+ */
 public abstract class HttpTestCase extends LocalDiskRepositoryTestCase {
+	/** Constant <code>master="Constants.R_HEADS + Constants.MASTER"</code> */
 	protected static final String master = Constants.R_HEADS + Constants.MASTER;
 
 	/** 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();
@@ -87,29 +92,50 @@
 	}
 
 	/**
-	 * Creates the {@linkAppServer}.This default implementation creates a server
+	 * Create the {@link AppServer}.This default implementation creates a server
 	 * without SSLsupport listening for HTTP connections on a dynamically chosen
 	 * port, which can be gotten once the server has been started via its
-	 * {@link AppServer#getPort()} method. Subclasses may override if they need
-	 * a more specialized server.
+	 * {@link org.eclipse.jgit.junit.http.AppServer#getPort()} method.
+	 * Subclasses may override if they need a more specialized server.
 	 *
-	 * @return the {@link AppServer}.
+	 * @return the {@link org.eclipse.jgit.junit.http.AppServer}.
 	 * @since 4.9
 	 */
 	protected AppServer createServer() {
 		return new AppServer();
 	}
 
+	/**
+	 * Create TestRepository
+	 *
+	 * @return the TestRepository
+	 * @throws IOException
+	 */
 	protected TestRepository<Repository> createTestRepository()
 			throws IOException {
 		return new TestRepository<>(createBareRepository());
 	}
 
+	/**
+	 * Convert path to URIish
+	 *
+	 * @param path
+	 * @return the URIish
+	 * @throws URISyntaxException
+	 */
 	protected URIish toURIish(String path) throws URISyntaxException {
 		URI u = server.getURI().resolve(path);
 		return new URIish(u.toString());
 	}
 
+	/**
+	 * Convert a path relative to the app's context path to a URIish
+	 *
+	 * @param app
+	 * @param name
+	 * @return the warnings (if any) from the last execution
+	 * @throws URISyntaxException
+	 */
 	protected URIish toURIish(ServletContextHandler app, String name)
 			throws URISyntaxException {
 		String p = app.getContextPath();
@@ -119,18 +145,45 @@
 		return toURIish(p);
 	}
 
+	/**
+	 * Get requests.
+	 *
+	 * @return list of events
+	 */
 	protected List<AccessEvent> getRequests() {
 		return server.getRequests();
 	}
 
+	/**
+	 * Get requests.
+	 *
+	 * @param base
+	 * @param path
+	 *
+	 * @return list of events
+	 */
 	protected List<AccessEvent> getRequests(URIish base, String path) {
 		return server.getRequests(base, path);
 	}
 
+	/**
+	 * Get requests.
+	 *
+	 * @param path
+	 *
+	 * @return list of events
+	 */
 	protected List<AccessEvent> getRequests(String path) {
 		return server.getRequests(path);
 	}
 
+	/**
+	 * Run fsck
+	 *
+	 * @param db
+	 * @param tips
+	 * @throws Exception
+	 */
 	protected static void fsck(Repository db, RevObject... tips)
 			throws Exception {
 		TestRepository<? extends Repository> tr =
@@ -138,6 +191,12 @@
 		tr.fsck(tips);
 	}
 
+	/**
+	 * Mirror refs
+	 *
+	 * @param refs
+	 * @return set of RefSpecs
+	 */
 	protected static Set<RefSpec> mirror(String... refs) {
 		HashSet<RefSpec> r = new HashSet<>();
 		for (String name : refs) {
@@ -149,6 +208,14 @@
 		return r;
 	}
 
+	/**
+	 * Push a commit
+	 *
+	 * @param from
+	 * @param q
+	 * @return collection of RefUpdates
+	 * @throws IOException
+	 */
 	protected static Collection<RemoteRefUpdate> push(TestRepository from,
 			RevCommit q) throws IOException {
 		final Repository db = from.getRepository();
@@ -163,6 +230,13 @@
 		return Collections.singleton(u);
 	}
 
+	/**
+	 * Create loose object path
+	 *
+	 * @param base
+	 * @param id
+	 * @return path of the loose object
+	 */
 	public static String loose(URIish base, AnyObjectId id) {
 		final String objectName = id.name();
 		final String d = objectName.substring(0, 2);
@@ -170,6 +244,14 @@
 		return join(base, "objects/" + d + "/" + f);
 	}
 
+	/**
+	 * Join a base URIish and a path
+	 *
+	 * @param base
+	 * @param path
+	 *            a relative path
+	 * @return the joined path
+	 */
 	public static String join(URIish base, String path) {
 		if (path.startsWith("/"))
 			fail("Cannot join absolute path " + path + " to URIish " + base);
@@ -180,6 +262,14 @@
 		return dir + path;
 	}
 
+	/**
+	 * Rewrite a url
+	 *
+	 * @param url
+	 * @param newProtocol
+	 * @param newPort
+	 * @return the rewritten url
+	 */
 	protected static String rewriteUrl(String url, String newProtocol,
 			int newPort) {
 		String newUrl = url;
@@ -198,6 +288,14 @@
 		return newUrl;
 	}
 
+	/**
+	 * Extend a path
+	 *
+	 * @param uri
+	 * @param pathComponents
+	 * @return the extended URIish
+	 * @throws URISyntaxException
+	 */
 	protected static URIish extendPath(URIish uri, String pathComponents)
 			throws URISyntaxException {
 		String raw = uri.toString();
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 03c0816..895070f 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
@@ -51,18 +51,29 @@
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 
+/**
+ * Mock ServletConfig
+ */
 public class MockServletConfig implements ServletConfig {
 	private final Map<String, String> parameters = new HashMap<>();
 
+	/**
+	 * Set init parameter.
+	 *
+	 * @param name
+	 * @param 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();
@@ -79,11 +90,13 @@
 		};
 	}
 
+	/** {@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 4e35ff6..fed063a 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
@@ -50,18 +50,27 @@
 
 import org.eclipse.jetty.util.log.Logger;
 
-/** Logs warnings into an array for later inspection. */
+/**
+ * Log warnings into an array for later inspection.
+ */
 public class RecordingLogger implements Logger {
 	private static List<Warning> warnings = new ArrayList<>();
 
-	/** Clear the warnings, automatically done by {@link AppServer#setUp()} */
+	/**
+	 * Clear the warnings, automatically done by
+	 * {@link org.eclipse.jgit.junit.http.AppServer#setUp()}
+	 */
 	public static void clear() {
 		synchronized (warnings) {
 			warnings.clear();
 		}
 	}
 
-	/** @return the warnings (if any) from the last execution */
+	/**
+	 * Get the <code>warnings</code>.
+	 *
+	 * @return the warnings (if any) from the last execution
+	 */
 	public static List<Warning> getWarnings() {
 		synchronized (warnings) {
 			ArrayList<Warning> copy = new ArrayList<>(warnings);
@@ -86,30 +95,48 @@
 
 	private final String name;
 
+	/**
+	 * Constructor for <code>RecordingLogger</code>.
+	 */
 	public RecordingLogger() {
 		this("");
 	}
 
+	/**
+	 * Constructor for <code>RecordingLogger</code>.
+	 *
+	 * @param name
+	 */
 	public RecordingLogger(final String name) {
 		this.name = name;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Logger getLogger(@SuppressWarnings("hiding") String name) {
 		return new RecordingLogger(name);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return name;
 	}
 
+	/**
+	 * Warning
+	 *
+	 * @param msg
+	 * @param arg0
+	 * @param arg1
+	 */
 	public void warn(String msg, Object arg0, Object arg1) {
 		synchronized (warnings) {
 			warnings.add(new Warning(MessageFormat.format(msg, arg0, arg1)));
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void warn(String msg, Throwable th) {
 		synchronized (warnings) {
@@ -117,47 +144,78 @@
 		}
 	}
 
+	/**
+	 * Warning
+	 *
+	 * @param msg
+	 *            warning message
+	 */
 	public void warn(String msg) {
 		synchronized (warnings) {
 			warnings.add(new Warning(msg));
 		}
 	}
 
-	public void debug(@SuppressWarnings("unused") String msg,
-			          @SuppressWarnings("unused") Object arg0,
-			          @SuppressWarnings("unused") Object arg1) {
+	/**
+	 * Debug log
+	 *
+	 * @param msg
+	 * @param arg0
+	 * @param arg1
+	 */
+	public void debug(String msg, Object arg0, Object arg1) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void debug(String msg, Throwable th) {
 		// Ignore (not relevant to test failures)
 	}
 
-	public void debug(@SuppressWarnings("unused") String msg) {
+	/**
+	 * Debug log
+	 *
+	 * @param msg
+	 *            debug message
+	 */
+	public void debug(String msg) {
 		// Ignore (not relevant to test failures)
 	}
 
-	public void info(@SuppressWarnings("unused") String msg,
-			         @SuppressWarnings("unused") Object arg0,
-			         @SuppressWarnings("unused") Object arg1) {
+	/**
+	 * Info
+	 *
+	 * @param msg
+	 * @param arg0
+	 * @param arg1
+	 */
+	public void info(String msg, Object arg0, Object arg1) {
 		// Ignore (not relevant to test failures)
 	}
 
-	public void info(@SuppressWarnings("unused") String msg) {
+	/**
+	 * Info
+	 *
+	 * @param msg
+	 */
+	public void info(String msg) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isDebugEnabled() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setDebugEnabled(boolean enabled) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void warn(String msg, Object... args) {
 		synchronized (warnings) {
@@ -171,6 +229,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void warn(Throwable thrown) {
 		synchronized (warnings) {
@@ -178,36 +237,43 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void info(String msg, Object... args) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void info(Throwable thrown) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void info(String msg, Throwable thrown) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void debug(String msg, Object... args) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void debug(Throwable thrown) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void ignore(Throwable arg0) {
 		// Ignore (not relevant to test failures)
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void debug(String msg, long value) {
 		// Ignore (not relevant to test failures)
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 0ea0721..c5576f9 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
@@ -71,15 +71,31 @@
 
 	private URIish secureUri;
 
+	/**
+	 * Constructor for <code>SimpleHttpServer</code>.
+	 *
+	 * @param repository
+	 */
 	public SimpleHttpServer(Repository repository) {
 		this(repository, false);
 	}
 
+	/**
+	 * Constructor for <code>SimpleHttpServer</code>.
+	 *
+	 * @param repository
+	 * @param withSsl
+	 */
 	public SimpleHttpServer(Repository repository, boolean withSsl) {
 		this.db = repository;
 		server = new AppServer(0, withSsl ? 0 : -1);
 	}
 
+	/**
+	 * Start the server
+	 *
+	 * @throws Exception
+	 */
 	public void start() throws Exception {
 		ServletContextHandler sBasic = server.authBasic(smart("/sbasic"));
 		server.setUp();
@@ -91,14 +107,29 @@
 		}
 	}
 
+	/**
+	 * Stop the server.
+	 *
+	 * @throws Exception
+	 */
 	public void stop() throws Exception {
 		server.tearDown();
 	}
 
+	/**
+	 * Get the <code>uri</code>.
+	 *
+	 * @return the uri
+	 */
 	public URIish getUri() {
 		return uri;
 	}
 
+	/**
+	 * Get the <code>secureUri</code>.
+	 *
+	 * @return the secure uri
+	 */
 	public URIish getSecureUri() {
 		return secureUri;
 	}
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 c218c07..43181f2 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
@@ -105,6 +105,7 @@
     }
   }
 
+  /** {@inheritDoc} */
   @Override
   public void handle(String target, Request baseRequest, HttpServletRequest request,
       HttpServletResponse response) throws IOException, ServletException {
diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
index b3f92d9..1e60a90 100644
--- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF
@@ -1,32 +1,33 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.junit
 Bundle-SymbolicName: org.eclipse.jgit.junit
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.jgit.api;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.api.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.dircache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.pack;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.merge;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util.io;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util.time;version="[4.9.9,4.10.0)",
- org.junit;version="[4.0.0,5.0.0)",
- org.junit.rules;version="[4.9.0,5.0.0)",
- org.junit.runner;version="[4.0.0,5.0.0)",
- org.junit.runners.model;version="[4.5.0,5.0.0)"
-Export-Package: org.eclipse.jgit.junit;version="4.9.9";
+Import-Package: org.eclipse.jgit.api;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.api.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.dircache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.merge;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util.io;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util.time;version="[4.10.1,4.11.0)",
+ org.junit;version="[4.12,5.0.0)",
+ org.junit.rules;version="[4.12,5.0.0)",
+ org.junit.runner;version="[4.12,5.0.0)",
+ org.junit.runners.model;version="[4.12,5.0.0)"
+Export-Package: org.eclipse.jgit.junit;version="4.10.1";
   uses:="org.eclipse.jgit.dircache,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
@@ -35,4 +36,4 @@
    org.eclipse.jgit.util,
    org.eclipse.jgit.storage.file,
    org.eclipse.jgit.api",
- org.eclipse.jgit.junit.time;version="4.9.9"
+ org.eclipse.jgit.junit.time;version="4.10.1"
diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml
index 16b9a6d..df94de6 100644
--- a/org.eclipse.jgit.junit/pom.xml
+++ b/org.eclipse.jgit.junit/pom.xml
@@ -52,7 +52,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.junit</artifactId>
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Assert.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Assert.java
index 40a05b4..57b33e1 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Assert.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/Assert.java
@@ -44,12 +44,33 @@
 
 import static java.lang.Boolean.valueOf;
 
+/**
+ * Assertion class
+ */
 public class Assert {
 
+	/**
+	 * Assert booleans are equal
+	 *
+	 * @param expect
+	 *            expected value
+	 * @param actual
+	 *            actual value
+	 */
 	public static void assertEquals(boolean expect, boolean actual) {
 		org.junit.Assert.assertEquals(valueOf(expect), valueOf(actual));
 	}
 
+	/**
+	 * Assert booleans are equal
+	 *
+	 * @param message
+	 *            message
+	 * @param expect
+	 *            expected value
+	 * @param actual
+	 *            actual value
+	 */
 	public static void assertEquals(String message, boolean expect,
 			boolean actual) {
 		org.junit.Assert
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 5bf61f0..4ba2606 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
@@ -64,13 +64,22 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+/**
+ * Abstract test util class
+ */
 public abstract class JGitTestUtil {
+	/** Constant <code>CLASSPATH_TO_RESOURCES="org/eclipse/jgit/test/resources/"</code> */
 	public static final String CLASSPATH_TO_RESOURCES = "org/eclipse/jgit/test/resources/";
 
 	private JGitTestUtil() {
 		throw new UnsupportedOperationException();
 	}
 
+	/**
+	 * Get name of current test by inspecting stack trace
+	 *
+	 * @return the name
+	 */
 	public static String getName() {
 		GatherStackTrace stack;
 		try {
@@ -109,6 +118,14 @@
 		// Thrown above to collect the stack frame.
 	}
 
+	/**
+	 * Assert byte arrays are equal
+	 *
+	 * @param exp
+	 *            expected value
+	 * @param act
+	 *            actual value
+	 */
 	public static void assertEquals(byte[] exp, byte[] act) {
 		Assert.assertEquals(s(exp), s(act));
 	}
@@ -117,6 +134,12 @@
 		return RawParseUtils.decode(raw);
 	}
 
+	/**
+	 * Get test resource file.
+	 *
+	 * @param fileName
+	 * @return the test resource file
+	 */
 	public static File getTestResourceFile(final String fileName) {
 		if (fileName == null || fileName.length() <= 0) {
 			return null;
@@ -145,6 +168,13 @@
 		}
 	}
 
+	/**
+	 * Copy test resource.
+	 *
+	 * @param name
+	 * @param dest
+	 * @throws IOException
+	 */
 	public static void copyTestResource(String name, File dest)
 			throws IOException {
 		URL url = cl().getResource(CLASSPATH_TO_RESOURCES + name);
@@ -169,6 +199,15 @@
 		return JGitTestUtil.class.getClassLoader();
 	}
 
+	/**
+	 * Write a trash file.
+	 *
+	 * @param db
+	 * @param name
+	 * @param data
+	 * @return the trash file
+	 * @throws IOException
+	 */
 	public static File writeTrashFile(final Repository db,
 			final String name, final String data) throws IOException {
 		File path = new File(db.getWorkTree(), name);
@@ -176,6 +215,16 @@
 		return path;
 	}
 
+	/**
+	 * Write a trash file.
+	 *
+	 * @param db
+	 * @param subdir
+	 * @param name
+	 * @param data
+	 * @return the trash file
+	 * @throws IOException
+	 */
 	public static File writeTrashFile(final Repository db,
 			final String subdir,
 			final String name, final String data) throws IOException {
@@ -224,17 +273,40 @@
 		return new String(body, 0, body.length, "UTF-8");
 	}
 
+	/**
+	 * Read a file's content
+	 *
+	 * @param db
+	 * @param name
+	 * @return the content of the file
+	 * @throws IOException
+	 */
 	public static String read(final Repository db, final String name)
 			throws IOException {
 		File file = new File(db.getWorkTree(), name);
 		return read(file);
 	}
 
+	/**
+	 * Check if file exists
+	 *
+	 * @param db
+	 * @param name
+	 *            name of the file
+	 * @return {@code true} if the file exists
+	 */
 	public static boolean check(final Repository db, final String name) {
 		File file = new File(db.getWorkTree(), name);
 		return file.exists();
 	}
 
+	/**
+	 * Delete a trash file.
+	 *
+	 * @param db
+	 * @param name
+	 * @throws IOException
+	 */
 	public static void deleteTrashFile(final Repository db,
 			final String name) throws IOException {
 		File path = new File(db.getWorkTree(), name);
@@ -242,6 +314,8 @@
 	}
 
 	/**
+	 * Write a symbolic link
+	 *
 	 * @param db
 	 *            the repository
 	 * @param 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 6ace9fc..9dac11e 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
@@ -82,8 +82,9 @@
  * A temporary directory is created for each test, allowing each test to use a
  * fresh environment. The temporary directory is cleaned up after the test ends.
  * <p>
- * Callers should not use {@link RepositoryCache} from within these tests as it
- * may wedge file descriptors open past the end of the test.
+ * Callers should not use {@link org.eclipse.jgit.lib.RepositoryCache} from
+ * within these tests as it may wedge file descriptors open past the end of the
+ * test.
  * <p>
  * A system property {@code jgit.junit.usemmap} defines whether memory mapping
  * is used. Memory mapping has an effect on the file system, in that memory
@@ -112,6 +113,11 @@
 	private final Set<Repository> toClose = new HashSet<>();
 	private File tmp;
 
+	/**
+	 * Setup test
+	 *
+	 * @throws Exception
+	 */
 	@Before
 	public void setUp() throws Exception {
 		tmp = File.createTempFile("jgit_test_", "_tmp");
@@ -142,10 +148,20 @@
 		c.install();
 	}
 
+	/**
+	 * Get temporary directory.
+	 *
+	 * @return the temporary directory
+	 */
 	protected File getTemporaryDirectory() {
 		return tmp.getAbsoluteFile();
 	}
 
+	/**
+	 * Get list of ceiling directories
+	 *
+	 * @return list of ceiling directories
+	 */
 	protected List<File> getCeilings() {
 		return Collections.singletonList(getTemporaryDirectory());
 	}
@@ -164,6 +180,11 @@
 		return stringBuilder.toString();
 	}
 
+	/**
+	 * Tear down the test
+	 *
+	 * @throws Exception
+	 */
 	@After
 	public void tearDown() throws Exception {
 		RepositoryCache.clear();
@@ -185,7 +206,9 @@
 		SystemReader.setInstance(null);
 	}
 
-	/** Increment the {@link #author} and {@link #committer} times. */
+	/**
+	 * Increment the {@link #author} and {@link #committer} times.
+	 */
 	protected void tick() {
 		mockSystemReader.tick(5 * 60);
 		final long now = mockSystemReader.getCurrentTime();
@@ -239,16 +262,22 @@
 			System.err.println(msg);
 	}
 
+	/** Constant <code>MOD_TIME=1</code> */
 	public static final int MOD_TIME = 1;
 
+	/** Constant <code>SMUDGE=2</code> */
 	public static final int SMUDGE = 2;
 
+	/** Constant <code>LENGTH=4</code> */
 	public static final int LENGTH = 4;
 
+	/** Constant <code>CONTENT_ID=8</code> */
 	public static final int CONTENT_ID = 8;
 
+	/** Constant <code>CONTENT=16</code> */
 	public static final int CONTENT = 16;
 
+	/** Constant <code>ASSUME_UNCHANGED=32</code> */
 	public static final int ASSUME_UNCHANGED = 32;
 
 	/**
@@ -279,7 +308,6 @@
 	 *
 	 * @param repo
 	 *            the repository the index state should be determined for
-	 *
 	 * @param includedOptions
 	 *            a bitmask constructed out of the constants {@link #MOD_TIME},
 	 *            {@link #SMUDGE}, {@link #LENGTH}, {@link #CONTENT_ID} and
@@ -546,6 +574,14 @@
 		JGitTestUtil.write(f, body);
 	}
 
+	/**
+	 * Read a file's content
+	 *
+	 * @param f
+	 *            the file
+	 * @return the content of the file
+	 * @throws IOException
+	 */
 	protected String read(final 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 68482c6..05d1522 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
@@ -67,7 +67,7 @@
 import org.eclipse.jgit.util.time.ProposedTimestamp;
 
 /**
- * Mock {@link SystemReader} for tests.
+ * Mock {@link org.eclipse.jgit.util.SystemReader} for tests.
  */
 public class MockSystemReader extends SystemReader {
 	private final class MockConfig extends FileBasedConfig {
@@ -94,6 +94,9 @@
 
 	FileBasedConfig systemGitConfig;
 
+	/**
+	 * Constructor for <code>MockSystemReader</code>
+	 */
 	public MockSystemReader() {
 		init(Constants.OS_USER_NAME_KEY);
 		init(Constants.GIT_AUTHOR_NAME_KEY);
@@ -110,46 +113,62 @@
 		setProperty(n, n);
 	}
 
+	/**
+	 * Clear properties
+	 */
 	public void clearProperties() {
 		values.clear();
 	}
 
+	/**
+	 * Set a property
+	 *
+	 * @param key
+	 * @param 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;
 		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 new MonotonicClock() {
@@ -182,26 +201,31 @@
 		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 a3c869f..08220ce 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
@@ -46,8 +46,14 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * Annotation enabling to run tests repeatedly
+ */
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ java.lang.annotation.ElementType.METHOD })
 public @interface Repeat {
+	/**
+	 * 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 4230073..8165738 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
@@ -51,8 +51,8 @@
 import org.junit.runners.model.Statement;
 
 /**
- * {@link TestRule} which enables to run the same JUnit test repeatedly. Add
- * this rule to the test class
+ * {@link org.junit.rules.TestRule} which enables to run the same JUnit test
+ * repeatedly. Add this rule to the test class
  *
  * <pre>
  * public class MyTest {
@@ -118,6 +118,7 @@
 		}
 	}
 
+	/** {@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 c282df0..044f080 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
@@ -84,6 +84,13 @@
  * repositories and destroying them when the tests are finished.
  */
 public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
+	/**
+	 * Copy a file
+	 *
+	 * @param src
+	 * @param dst
+	 * @throws IOException
+	 */
 	protected static void copyFile(final File src, final File dst)
 			throws IOException {
 		final FileInputStream fis = new FileInputStream(src);
@@ -103,6 +110,14 @@
 		}
 	}
 
+	/**
+	 * Write a trash file
+	 *
+	 * @param name
+	 * @param data
+	 * @return the trash file
+	 * @throws IOException
+	 */
 	protected File writeTrashFile(final String name, final String data)
 			throws IOException {
 		return JGitTestUtil.writeTrashFile(db, name, data);
@@ -124,24 +139,62 @@
 		return JGitTestUtil.writeLink(db, link, target);
 	}
 
+	/**
+	 * Write a trash file
+	 *
+	 * @param subdir
+	 * @param name
+	 * @param data
+	 * @return the trash file
+	 * @throws IOException
+	 */
 	protected File writeTrashFile(final String subdir, final String name,
 			final String data)
 			throws IOException {
 		return JGitTestUtil.writeTrashFile(db, subdir, name, data);
 	}
 
+	/**
+	 * Read content of a file
+	 *
+	 * @param name
+	 * @return the file's content
+	 * @throws IOException
+	 */
 	protected String read(final String name) throws IOException {
 		return JGitTestUtil.read(db, name);
 	}
 
+	/**
+	 * Check if file exists
+	 *
+	 * @param name
+	 *            file name
+	 * @return if the file exists
+	 */
 	protected boolean check(final String name) {
 		return JGitTestUtil.check(db, name);
 	}
 
+	/**
+	 * Delete a trash file
+	 *
+	 * @param name
+	 *            file name
+	 * @throws IOException
+	 */
 	protected void deleteTrashFile(final String name) throws IOException {
 		JGitTestUtil.deleteTrashFile(db, name);
 	}
 
+	/**
+	 * Check content of a file.
+	 *
+	 * @param f
+	 * @param checkData
+	 *            expected content
+	 * @throws IOException
+	 */
 	protected static void checkFile(File f, final String checkData)
 			throws IOException {
 		Reader r = new InputStreamReader(new FileInputStream(f), "UTF-8");
@@ -161,6 +214,7 @@
 	/** Working directory of {@link #db}. */
 	protected File trash;
 
+	/** {@inheritDoc} */
 	@Override
 	@Before
 	public void setUp() throws Exception {
@@ -220,8 +274,8 @@
 	 * have an index which matches their prepared content.
 	 *
 	 * @param treeItr
-	 *            a {@link FileTreeIterator} which determines which files should
-	 *            go into the new index
+	 *            a {@link org.eclipse.jgit.treewalk.FileTreeIterator} which
+	 *            determines which files should go into the new index
 	 * @throws FileNotFoundException
 	 * @throws IOException
 	 */
@@ -261,13 +315,13 @@
 	 *
 	 * @param l
 	 *            the object to lookup
+	 * @param lookupTable
+	 *            a table storing object-name mappings.
 	 * @param nameTemplate
 	 *            the name for that object. Can contain "%n" which will be
 	 *            replaced by a running number before used as a name. If the
 	 *            lookup table already contains the object this parameter will
 	 *            be ignored
-	 * @param lookupTable
-	 *            a table storing object-name mappings.
 	 * @return a name of that object. Is not guaranteed to be unique. Use
 	 *         nameTemplates containing "%n" to always have unique names
 	 */
@@ -288,7 +342,7 @@
 	 * @param str
 	 *            the string in which backslashes should be replaced
 	 * @return the resulting string with slashes
-         * @since 4.2
+	 * @since 4.2
 	 */
 	public static String slashify(String str) {
 		str = str.replace('\\', '/');
@@ -335,6 +389,13 @@
 		}
 	}
 
+	/**
+	 * Create a branch
+	 *
+	 * @param objectId
+	 * @param branchName
+	 * @throws IOException
+	 */
 	protected void createBranch(ObjectId objectId, String branchName)
 			throws IOException {
 		RefUpdate updateRef = db.updateRef(branchName);
@@ -342,6 +403,13 @@
 		updateRef.update();
 	}
 
+	/**
+	 * Checkout a branch
+	 *
+	 * @param branchName
+	 * @throws IllegalStateException
+	 * @throws IOException
+	 */
 	protected void checkoutBranch(String branchName)
 			throws IllegalStateException, IOException {
 		try (RevWalk walk = new RevWalk(db)) {
@@ -429,15 +497,39 @@
 		}
 	}
 
+	/**
+	 * Create <code>DirCacheEntry</code>
+	 *
+	 * @param path
+	 * @param mode
+	 * @return the DirCacheEntry
+	 */
 	protected DirCacheEntry createEntry(final String path, final FileMode mode) {
 		return createEntry(path, mode, DirCacheEntry.STAGE_0, path);
 	}
 
+	/**
+	 * Create <code>DirCacheEntry</code>
+	 *
+	 * @param path
+	 * @param mode
+	 * @param content
+	 * @return the DirCacheEntry
+	 */
 	protected DirCacheEntry createEntry(final String path, final FileMode mode,
 			final String content) {
 		return createEntry(path, mode, DirCacheEntry.STAGE_0, content);
 	}
 
+	/**
+	 * Create <code>DirCacheEntry</code>
+	 *
+	 * @param path
+	 * @param mode
+	 * @param stage
+	 * @param content
+	 * @return the DirCacheEntry
+	 */
 	protected DirCacheEntry createEntry(final String path, final FileMode mode,
 			final int stage, final String content) {
 		final DirCacheEntry entry = new DirCacheEntry(path, stage);
@@ -449,6 +541,13 @@
 		return entry;
 	}
 
+	/**
+	 * Assert files are equal
+	 *
+	 * @param expected
+	 * @param actual
+	 * @throws IOException
+	 */
 	public static void assertEqualsFile(File expected, File actual)
 			throws IOException {
 		assertEquals(expected.getCanonicalFile(), actual.getCanonicalFile());
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 22b69a3..fcedfb0 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
@@ -47,30 +47,38 @@
 
 import org.eclipse.jgit.lib.ProgressMonitor;
 
+/**
+ * Strict work monitor
+ */
 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 d1358ee..41634e7 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
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.junit;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -113,12 +114,16 @@
  */
 public class TestRepository<R extends Repository> {
 
+	/** Constant <code>AUTHOR="J. Author"</code> */
 	public static final String AUTHOR = "J. Author";
 
+	/** Constant <code>AUTHOR_EMAIL="jauthor@example.com"</code> */
 	public static final String AUTHOR_EMAIL = "jauthor@example.com";
 
+	/** Constant <code>COMMITTER="J. Committer"</code> */
 	public static final String COMMITTER = "J. Committer";
 
+	/** Constant <code>COMMITTER_EMAIL="jcommitter@example.com"</code> */
 	public static final String COMMITTER_EMAIL = "jcommitter@example.com";
 
 	private final PersonIdent defaultAuthor;
@@ -185,25 +190,38 @@
 		defaultCommitter = new PersonIdent(COMMITTER, COMMITTER_EMAIL, now, tz);
 	}
 
-	/** @return the repository this helper class operates against. */
+	/**
+	 * Get repository
+	 *
+	 * @return the repository this helper class operates against.
+	 */
 	public R getRepository() {
 		return db;
 	}
 
-	/** @return get the RevWalk pool all objects are allocated through. */
+	/**
+	 * Get RevWalk
+	 *
+	 * @return get the RevWalk pool all objects are allocated through.
+	 */
 	public RevWalk getRevWalk() {
 		return pool;
 	}
 
 	/**
+	 * Return Git API wrapper
+	 *
 	 * @return an API wrapper for the underlying repository. This wrapper does
-	 *         not allocate any new resources and need not be closed (but closing
-	 *         it is harmless). */
+	 *         not allocate any new resources and need not be closed (but
+	 *         closing it is harmless).
+	 */
 	public Git git() {
 		return git;
 	}
 
 	/**
+	 * Get date
+	 *
 	 * @return current date.
 	 * @since 4.2
 	 */
@@ -211,7 +229,11 @@
 		return new Date(mockSystemReader.getCurrentTime());
 	}
 
-	/** @return timezone used for default identities. */
+	/**
+	 * Get timezone
+	 *
+	 * @return timezone used for default identities.
+	 */
 	public TimeZone getTimeZone() {
 		return mockSystemReader.getTimeZone();
 	}
@@ -246,7 +268,7 @@
 	 * @throws Exception
 	 */
 	public RevBlob blob(final String content) throws Exception {
-		return blob(content.getBytes("UTF-8"));
+		return blob(content.getBytes(UTF_8));
 	}
 
 	/**
@@ -423,7 +445,11 @@
 		return pool.lookupCommit(id);
 	}
 
-	/** @return a new commit builder. */
+	/**
+	 * Create commit builder
+	 *
+	 * @return a new commit builder.
+	 */
 	public CommitBuilder commit() {
 		return new CommitBuilder();
 	}
@@ -587,6 +613,7 @@
 	public void delete(String ref) throws Exception {
 		ref = normalizeRef(ref);
 		RefUpdate u = db.updateRef(ref);
+		u.setForceUpdate(true);
 		switch (u.delete()) {
 		case FAST_FORWARD:
 		case FORCED:
@@ -616,7 +643,7 @@
 
 	/**
 	 * Soft-reset HEAD to a detached state.
-	 * <p>
+	 *
 	 * @param id
 	 *            ID of detached head.
 	 * @throws Exception
@@ -756,7 +783,8 @@
 	 * Ensure the body of the given object has been parsed.
 	 *
 	 * @param <T>
-	 *            type of object, e.g. {@link RevTag} or {@link RevCommit}.
+	 *            type of object, e.g. {@link org.eclipse.jgit.revwalk.RevTag}
+	 *            or {@link org.eclipse.jgit.revwalk.RevCommit}.
 	 * @param object
 	 *            reference to the (possibly unparsed) object to force body
 	 *            parsing of.
@@ -912,7 +940,7 @@
 	}
 
 	private static File nameFor(ObjectDirectory odb, ObjectId name, String t) {
-		File packdir = new File(odb.getDirectory(), "pack");
+		File packdir = odb.getPackDirectory();
 		return new File(packdir, "pack-" + name.name() + t);
 	}
 
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRng.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRng.java
index 93facc3..54c81f2 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRng.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRng.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.junit;
 
-/** Toy RNG to ensure we get predictable numbers during unit tests. */
+/**
+ * Toy RNG to ensure we get predictable numbers during unit tests.
+ */
 public class TestRng {
 	private int next;
 
@@ -74,6 +76,8 @@
 	}
 
 	/**
+	 * Next int
+	 *
 	 * @return the next random integer.
 	 */
 	public int nextInt() {
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 f09d303..1f5cac6 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
@@ -50,7 +50,8 @@
 import org.eclipse.jgit.util.time.ProposedTimestamp;
 
 /**
- * Fake {@link MonotonicClock} for testing code that uses Clock.
+ * Fake {@link org.eclipse.jgit.util.time.MonotonicClock} for testing code that
+ * uses Clock.
  *
  * @since 4.6
  */
@@ -72,6 +73,7 @@
 		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 64a964a..266a084 100644
--- a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.lfs.server.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server.test
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
@@ -27,12 +28,13 @@
  org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.thread;version="[9.4.5,10.0.0)",
- org.eclipse.jgit.junit.http;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.server.fs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.test;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
+ org.eclipse.jgit.junit.http;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.test;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.0.0,5.0.0)",
- org.junit.runner;version="[4.0.0,5.0.0)",
- org.junit.runners;version="[4.0.0,5.0.0)"
+ org.junit;version="[4.12,5.0.0)",
+ org.junit.rules;version="[4.12,5.0.0)",
+ org.junit.runner;version="[4.12,5.0.0)",
+ org.junit.runners;version="[4.12,5.0.0)"
diff --git a/org.eclipse.jgit.lfs.server.test/pom.xml b/org.eclipse.jgit.lfs.server.test/pom.xml
index 2fba3f8..7aa399f 100644
--- a/org.eclipse.jgit.lfs.server.test/pom.xml
+++ b/org.eclipse.jgit.lfs.server.test/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.server.test</artifactId>
diff --git a/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java b/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java
index 303d8056..a38bf6a 100644
--- a/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java
+++ b/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java
@@ -45,7 +45,6 @@
 import static org.apache.http.HttpStatus.SC_NOT_FOUND;
 import static org.apache.http.HttpStatus.SC_UNPROCESSABLE_ENTITY;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -56,10 +55,15 @@
 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
 import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
 import org.eclipse.jgit.util.FileUtils;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 public class DownloadTest extends LfsServerTest {
 
+	@Rule
+	public ExpectedException exception = ExpectedException.none();
+
 	@Test
 	public void testDownload() throws Exception {
 		String TEXT = "test";
@@ -76,15 +80,12 @@
 		String TEXT = "test";
 		String id = putContent(TEXT).name().substring(0, 60);
 		Path f = Paths.get(getTempDirectory().toString(), "download");
-		try {
-			getContent(id, f);
-			fail("expected RuntimeException");
-		} catch (RuntimeException e) {
-			String error = String.format(
-					"Invalid pathInfo: '/%s' does not match '/{SHA-256}'", id);
-			assertEquals(formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error),
-					e.getMessage());
-		}
+		String error = String.format(
+				"Invalid pathInfo: '/%s' does not match '/{SHA-256}'", id);
+		exception.expect(RuntimeException.class);
+		exception.expectMessage(
+				formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error));
+		getContent(id, f);
 	}
 
 	@Test
@@ -93,14 +94,11 @@
 		String TEXT = "test";
 		String id = putContent(TEXT).name().replace('f', 'z');
 		Path f = Paths.get(getTempDirectory().toString(), "download");
-		try {
-			getContent(id, f);
-			fail("expected RuntimeException");
-		} catch (RuntimeException e) {
-			String error = String.format("Invalid id: %s", id);
-			assertEquals(formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error),
-					e.getMessage());
-		}
+		String error = String.format("Invalid id: %s", id);
+		exception.expect(RuntimeException.class);
+		exception.expectMessage(
+				formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error));
+		getContent(id, f);
 	}
 
 	@Test
@@ -109,14 +107,10 @@
 		String TEXT = "test";
 		AnyLongObjectId id = LongObjectIdTestUtils.hash(TEXT);
 		Path f = Paths.get(getTempDirectory().toString(), "download");
-		try {
-			getContent(id, f);
-			fail("expected RuntimeException");
-		} catch (RuntimeException e) {
-			String error = String.format("Object '%s' not found", id.getName());
-			assertEquals(formatErrorMessage(SC_NOT_FOUND, error),
-					e.getMessage());
-		}
+		String error = String.format("Object '%s' not found", id.getName());
+		exception.expect(RuntimeException.class);
+		exception.expectMessage(formatErrorMessage(SC_NOT_FOUND, error));
+		getContent(id, f);
 	}
 
 	@SuppressWarnings("boxing")
diff --git a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
index 62af450..ddd35a4 100644
--- a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF
@@ -1,20 +1,21 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.lfs.server
 Bundle-SymbolicName: org.eclipse.jgit.lfs.server
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
-Export-Package: org.eclipse.jgit.lfs.server;version="4.9.9";
+Export-Package: org.eclipse.jgit.lfs.server;version="4.10.1";
   uses:="javax.servlet.http,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.fs;version="4.9.9";
+ org.eclipse.jgit.lfs.server.fs;version="4.10.1";
   uses:="javax.servlet,
    javax.servlet.http,
    org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib",
- org.eclipse.jgit.lfs.server.internal;version="4.9.9";x-internal:=true,
- org.eclipse.jgit.lfs.server.s3;version="4.9.9";
+ org.eclipse.jgit.lfs.server.internal;version="4.10.1";x-internal:=true,
+ org.eclipse.jgit.lfs.server.s3;version="4.10.1";
   uses:="org.eclipse.jgit.lfs.server,
    org.eclipse.jgit.lfs.lib"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
@@ -24,14 +25,14 @@
  javax.servlet.http;version="[3.1.0,4.0.0)",
  org.apache.http;version="[4.3.0,5.0.0)",
  org.apache.http.client;version="[4.3.0,5.0.0)",
- org.eclipse.jgit.annotations;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http.apache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
+ org.eclipse.jgit.annotations;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http.apache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
  org.slf4j;version="[1.7.0,2.0.0)"
diff --git a/org.eclipse.jgit.lfs.server/pom.xml b/org.eclipse.jgit.lfs.server/pom.xml
index e28e6d2..351802d 100644
--- a/org.eclipse.jgit.lfs.server/pom.xml
+++ b/org.eclipse.jgit.lfs.server/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 3bdf8d0..cfa53af 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
@@ -55,6 +55,8 @@
 public interface LargeFileRepository {
 
 	/**
+	 * Get download action
+	 *
 	 * @param id
 	 *            id of the object to download
 	 * @return Action for downloading the object
@@ -62,6 +64,8 @@
 	public Response.Action getDownloadAction(AnyLongObjectId id);
 
 	/**
+	 * Get upload action
+	 *
 	 * @param id
 	 *            id of the object to upload
 	 * @param size
@@ -71,6 +75,8 @@
 	public Response.Action getUploadAction(AnyLongObjectId id, long size);
 
 	/**
+	 * Get verify action
+	 *
 	 * @param id
 	 *            id of the object to be verified
 	 * @return Action for verifying the object, or {@code null} if the server
@@ -79,11 +85,13 @@
 	public @Nullable Response.Action getVerifyAction(AnyLongObjectId id);
 
 	/**
+	 * Get size of an object
+	 *
 	 * @param id
 	 *            id of the object
 	 * @return length of the object content in bytes, -1 if the object doesn't
 	 *         exist
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public long getSize(AnyLongObjectId id) throws IOException;
 }
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsObject.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsObject.java
index 4d97502..907e156 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsObject.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsObject.java
@@ -52,6 +52,8 @@
 	long size;
 
 	/**
+	 * Get the <code>oid</code> of this object.
+	 *
 	 * @return the object ID.
 	 */
 	public String getOid() {
@@ -59,6 +61,8 @@
 	}
 
 	/**
+	 * Get the <code>size</code> of this object.
+	 *
 	 * @return the object size.
 	 */
 	public long getSize() {
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 2473dcd..6968d75 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
@@ -81,13 +81,10 @@
 import org.eclipse.jgit.lfs.errors.LfsUnavailable;
 import org.eclipse.jgit.lfs.errors.LfsValidationError;
 import org.eclipse.jgit.lfs.internal.LfsText;
+import org.eclipse.jgit.lfs.server.internal.LfsGson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.FieldNamingPolicy;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
 /**
  * LFS protocol handler implementing the LFS batch API [1]
  *
@@ -108,8 +105,6 @@
 
 	private static final int SC_BANDWIDTH_LIMIT_EXCEEDED = 509;
 
-	private Gson gson = createGson();
-
 	/**
 	 * Get the large file repository for the given request and path.
 	 *
@@ -117,30 +112,29 @@
 	 *            the request
 	 * @param path
 	 *            the path
-	 *
 	 * @return the large file repository storing large files.
-	 * @throws LfsException
+	 * @throws org.eclipse.jgit.lfs.errors.LfsException
 	 *             implementations should throw more specific exceptions to
 	 *             signal which type of error occurred:
 	 *             <dl>
-	 *             <dt>{@link LfsValidationError}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsValidationError}</dt>
 	 *             <dd>when there is a validation error with one or more of the
 	 *             objects in the request</dd>
-	 *             <dt>{@link LfsRepositoryNotFound}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsRepositoryNotFound}</dt>
 	 *             <dd>when the repository does not exist for the user</dd>
-	 *             <dt>{@link LfsRepositoryReadOnly}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsRepositoryReadOnly}</dt>
 	 *             <dd>when the user has read, but not write access. Only
 	 *             applicable when the operation in the request is "upload"</dd>
-	 *             <dt>{@link LfsRateLimitExceeded}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsRateLimitExceeded}</dt>
 	 *             <dd>when the user has hit a rate limit with the server</dd>
-	 *             <dt>{@link LfsBandwidthLimitExceeded}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsBandwidthLimitExceeded}</dt>
 	 *             <dd>when the bandwidth limit for the user or repository has
 	 *             been exceeded</dd>
-	 *             <dt>{@link LfsInsufficientStorage}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsInsufficientStorage}</dt>
 	 *             <dd>when there is insufficient storage on the server</dd>
-	 *             <dt>{@link LfsUnavailable}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsUnavailable}</dt>
 	 *             <dd>when LFS is not available</dd>
-	 *             <dt>{@link LfsException}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsException}</dt>
 	 *             <dd>when an unexpected internal server error occurred</dd>
 	 *             </dl>
 	 * @since 4.5
@@ -162,30 +156,29 @@
 	 *            the path
 	 * @param auth
 	 *            the Authorization HTTP header
-	 *
 	 * @return the large file repository storing large files.
-	 * @throws LfsException
+	 * @throws org.eclipse.jgit.lfs.errors.LfsException
 	 *             implementations should throw more specific exceptions to
 	 *             signal which type of error occurred:
 	 *             <dl>
-	 *             <dt>{@link LfsValidationError}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsValidationError}</dt>
 	 *             <dd>when there is a validation error with one or more of the
 	 *             objects in the request</dd>
-	 *             <dt>{@link LfsRepositoryNotFound}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsRepositoryNotFound}</dt>
 	 *             <dd>when the repository does not exist for the user</dd>
-	 *             <dt>{@link LfsRepositoryReadOnly}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsRepositoryReadOnly}</dt>
 	 *             <dd>when the user has read, but not write access. Only
 	 *             applicable when the operation in the request is "upload"</dd>
-	 *             <dt>{@link LfsRateLimitExceeded}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsRateLimitExceeded}</dt>
 	 *             <dd>when the user has hit a rate limit with the server</dd>
-	 *             <dt>{@link LfsBandwidthLimitExceeded}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsBandwidthLimitExceeded}</dt>
 	 *             <dd>when the bandwidth limit for the user or repository has
 	 *             been exceeded</dd>
-	 *             <dt>{@link LfsInsufficientStorage}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsInsufficientStorage}</dt>
 	 *             <dd>when there is insufficient storage on the server</dd>
-	 *             <dt>{@link LfsUnavailable}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsUnavailable}</dt>
 	 *             <dd>when LFS is not available</dd>
-	 *             <dt>{@link LfsException}</dt>
+	 *             <dt>{@link org.eclipse.jgit.lfs.errors.LfsException}</dt>
 	 *             <dd>when an unexpected internal server error occurred</dd>
 	 *             </dl>
 	 * @since 4.7
@@ -246,6 +239,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void doPost(HttpServletRequest req, HttpServletResponse res)
 			throws ServletException, IOException {
@@ -254,7 +248,7 @@
 
 		Reader r = new BufferedReader(
 				new InputStreamReader(req.getInputStream(), UTF_8));
-		LfsRequest request = gson.fromJson(r, LfsRequest.class);
+		LfsRequest request = LfsGson.fromJson(r, LfsRequest.class);
 		String path = req.getPathInfo();
 
 		res.setContentType(CONTENTTYPE_VND_GIT_LFS_JSON);
@@ -271,7 +265,7 @@
 			res.setStatus(SC_OK);
 			TransferHandler handler = TransferHandler
 					.forOperation(request.operation, repo, request.objects);
-			gson.toJson(handler.process(), w);
+			LfsGson.toJson(handler.process(), w);
 		} catch (LfsValidationError e) {
 			sendError(res, w, SC_UNPROCESSABLE_ENTITY, e.getMessage());
 		} catch (LfsRepositoryNotFound e) {
@@ -295,24 +289,9 @@
 		}
 	}
 
-	static class Error {
-		String message;
-
-		Error(String m) {
-			this.message = m;
-		}
-	}
-
 	private void sendError(HttpServletResponse rsp, Writer writer, int status,
 			String message) {
 		rsp.setStatus(status);
-		gson.toJson(new Error(message), writer);
-	}
-
-	private Gson createGson() {
-		return new GsonBuilder()
-				.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
-				.disableHtmlEscaping()
-				.create();
+		LfsGson.toJson(message, writer);
 	}
 }
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/Response.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/Response.java
index dc972e0..a80e5b9 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/Response.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/Response.java
@@ -46,11 +46,10 @@
 import java.util.Map;
 
 /**
- * POJOs for Gson serialization/deserialization
+ * POJOs for Gson serialization/de-serialization.
  *
- * See
- * {@link <a href="https://github.com/github/git-lfs/tree/master/docs/api">LFS
- * API specification</a>}
+ * See the <a href="https://github.com/github/git-lfs/tree/master/docs/api">LFS
+ * API specification</a>
  *
  * @since 4.3
  */
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 a05fa01..5b12be6 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
@@ -71,11 +71,13 @@
 	private final Path dir;
 
 	/**
+	 * <p>Constructor for FileLfsRepository.</p>
+	 *
 	 * @param url
 	 *            external URL of this repository
 	 * @param dir
 	 *            storage directory
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public FileLfsRepository(String url, Path dir) throws IOException {
 		this.url = url;
@@ -83,21 +85,25 @@
 		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
 	public @Nullable Action getVerifyAction(AnyLongObjectId id) {
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getSize(AnyLongObjectId id) throws IOException {
 		Path p = getPath(id);
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java
index d02d466..b805ef5 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java
@@ -58,12 +58,9 @@
 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
 import org.eclipse.jgit.lfs.lib.Constants;
 import org.eclipse.jgit.lfs.lib.LongObjectId;
+import org.eclipse.jgit.lfs.server.internal.LfsGson;
 import org.eclipse.jgit.lfs.server.internal.LfsServerText;
 
-import com.google.gson.FieldNamingPolicy;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
 /**
  * Servlet supporting upload and download of large objects as defined by the
  * GitHub Large File Storage extension API extending git to allow separate
@@ -81,9 +78,9 @@
 
 	private final long timeout;
 
-	private static Gson gson = createGson();
-
 	/**
+	 * <p>Constructor for FileLfsServlet.</p>
+	 *
 	 * @param repository
 	 *            the repository storing the large objects
 	 * @param timeout
@@ -95,16 +92,9 @@
 	}
 
 	/**
-	 * Handles object downloads
+	 * {@inheritDoc}
 	 *
-	 * @param req
-	 *            servlet request
-	 * @param rsp
-	 *            servlet response
-	 * @throws ServletException
-	 *             if a servlet-specific error occurs
-	 * @throws IOException
-	 *             if an I/O error occurs
+	 * Handle object downloads
 	 */
 	@Override
 	protected void doGet(HttpServletRequest req,
@@ -134,9 +124,9 @@
 	 *            servlet response
 	 * @return object id, or <code>null</code> if the object id could not be
 	 *         retrieved
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if an I/O error occurs
-         * @since 4.6
+	 * @since 4.6
 	 */
 	protected AnyLongObjectId getObjectToTransfer(HttpServletRequest req,
 			HttpServletResponse rsp) throws IOException {
@@ -156,16 +146,9 @@
 	}
 
 	/**
-	 * Handle object uploads
+	 * {@inheritDoc}
 	 *
-	 * @param req
-	 *            servlet request
-	 * @param rsp
-	 *            servlet response
-	 * @throws ServletException
-	 *             if a servlet-specific error occurs
-	 * @throws IOException
-	 *             if an I/O error occurs
+	 * Handle object uploads
 	 */
 	@Override
 	protected void doPut(HttpServletRequest req,
@@ -179,14 +162,6 @@
 		}
 	}
 
-	static class Error {
-		String message;
-
-		Error(String m) {
-			this.message = m;
-		}
-	}
-
 	/**
 	 * Send an error response.
 	 *
@@ -196,7 +171,7 @@
 	 *            HTTP status code
 	 * @param message
 	 *            error message
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             on failure to send the response
 	 * @since 4.6
 	 */
@@ -209,16 +184,9 @@
 		rsp.reset();
 		rsp.setStatus(status);
 		PrintWriter writer = rsp.getWriter();
-		gson.toJson(new Error(message), writer);
+		LfsGson.toJson(message, writer);
 		writer.flush();
 		writer.close();
 		rsp.flushBuffer();
 	}
-
-	private static Gson createGson() {
-		return new GsonBuilder()
-				.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
-				.disableHtmlEscaping()
-				.create();
-	}
 }
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 a76f7ef..06a7726 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
@@ -83,6 +83,8 @@
 	private ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
 
 	/**
+	 * <p>Constructor for ObjectDownloadListener.</p>
+	 *
 	 * @param repository
 	 *            the repository storing large objects
 	 * @param context
@@ -91,7 +93,7 @@
 	 *            the servlet response
 	 * @param id
 	 *            id of the object to be downloaded
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public ObjectDownloadListener(FileLfsRepository repository,
 			AsyncContext context, HttpServletResponse response,
@@ -108,9 +110,9 @@
 	}
 
 	/**
-	 * Write file content
+	 * {@inheritDoc}
 	 *
-	 * @throws IOException
+	 * Write file content
 	 */
 	@Override
 	public void onWritePossible() throws IOException {
@@ -150,10 +152,9 @@
 	}
 
 	/**
-	 * Handle errors
+	 * {@inheritDoc}
 	 *
-	 * @param e
-	 *            the cause
+	 * Handle errors
 	 */
 	@Override
 	public void onError(Throwable e) {
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 da86880..c5b6a67 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
@@ -88,14 +88,20 @@
 	private final ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
 
 	/**
+	 * Constructor for ObjectUploadListener.
+	 *
 	 * @param repository
 	 *            the repository storing large objects
 	 * @param context
+	 *            a {@link javax.servlet.AsyncContext} object.
 	 * @param request
+	 *            a {@link javax.servlet.http.HttpServletRequest} object.
 	 * @param response
+	 *            a {@link javax.servlet.http.HttpServletResponse} object.
 	 * @param id
-	 * @throws FileNotFoundException
-	 * @throws IOException
+	 *            a {@link org.eclipse.jgit.lfs.lib.AnyLongObjectId} object.
+	 * @throws java.io.FileNotFoundException
+	 * @throws java.io.IOException
 	 */
 	public ObjectUploadListener(FileLfsRepository repository,
 			AsyncContext context, HttpServletRequest request,
@@ -111,9 +117,9 @@
 	}
 
 	/**
-	 * Writes all the received data to the output channel
+	 * {@inheritDoc}
 	 *
-	 * @throws IOException
+	 * Writes all the received data to the output channel
 	 */
 	@Override
 	public void onDataAvailable() throws IOException {
@@ -133,16 +139,16 @@
 		}
 	}
 
-	/**
-	 * @throws IOException
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void onAllDataRead() throws IOException {
 		close();
 	}
 
 	/**
-	 * @throws IOException
+	 * Close resources held by this listener
+	 *
+	 * @throws java.io.IOException
 	 */
 	protected void close() throws IOException {
 		try {
@@ -158,10 +164,7 @@
 		}
 	}
 
-	/**
-	 * @param e
-	 *            the exception that caused the problem
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void onError(Throwable e) {
 		try {
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsGson.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsGson.java
new file mode 100644
index 0000000..7974b24
--- /dev/null
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsGson.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2017, David Pursehouse <david.pursehouse@gmail.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.server.internal;
+
+import java.io.Reader;
+
+import com.google.gson.FieldNamingPolicy;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonIOException;
+import com.google.gson.JsonSyntaxException;
+
+/**
+ * Wrapper for {@link com.google.gson.Gson} used by LFS servlets.
+ *
+ * @since 4.10.0
+ */
+public class LfsGson {
+	private static final Gson gson = new GsonBuilder()
+			.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
+			.disableHtmlEscaping()
+			.create();
+
+	/**
+	 * Wrapper class only used for serialization of error messages.
+	 */
+	static class Error {
+		String message;
+
+		Error(String m) {
+			this.message = m;
+		}
+	}
+
+	/**
+	 * Serializes the specified object into its equivalent Json representation.
+	 *
+	 * @param src
+	 *            the object for which Json representation is to be created. If
+	 *            this is a String, it is wrapped in an instance of
+	 *            {@link org.eclipse.jgit.lfs.server.internal.LfsGson.Error}.
+	 * @param writer
+	 *            Writer to which the Json representation needs to be written
+	 * @throws com.google.gson.JsonIOException
+	 *             if there was a problem writing to the writer
+	 * @see Gson#toJson(Object, Appendable)
+	 */
+	public static void toJson(Object src, Appendable writer)
+			throws JsonIOException {
+		if (src instanceof String) {
+			gson.toJson(new Error((String) src), writer);
+		} else {
+			gson.toJson(src, writer);
+		}
+	}
+
+	/**
+	 * Deserializes the Json read from the specified reader into an object of
+	 * the specified type.
+	 *
+	 * @param json
+	 *            reader producing json from which the object is to be
+	 *            deserialized
+	 * @param classOfT
+	 *            specified type to deserialize
+	 * @return an Object of type T
+	 * @throws com.google.gson.JsonIOException
+	 *             if there was a problem reading from the Reader
+	 * @throws com.google.gson.JsonSyntaxException
+	 *             if json is not a valid representation for an object of type
+	 * @see Gson#fromJson(Reader, java.lang.reflect.Type)
+	 * @param <T>
+	 *            a T object.
+	 */
+	public static <T> T fromJson(Reader json, Class<T> classOfT)
+			throws JsonSyntaxException, JsonIOException {
+		return gson.fromJson(json, classOfT);
+	}
+}
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsServerText.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsServerText.java
index 2e088fd..5d6bbfa 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsServerText.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsServerText.java
@@ -51,6 +51,8 @@
 public class LfsServerText extends TranslationBundle {
 
 	/**
+	 * Get an instance of this translation bundle
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static LfsServerText get() {
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Config.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Config.java
index 4876fb8..4c21421 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Config.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Config.java
@@ -58,6 +58,8 @@
 	private final boolean disableSslVerify;
 
 	/**
+	 * <p>Constructor for S3Config.</p>
+	 *
 	 * @param region
 	 *            AWS region
 	 * @param bucket
@@ -88,6 +90,8 @@
 	}
 
 	/**
+	 * Get the <code>region</code>.
+	 *
 	 * @return Get name of AWS region this bucket resides in
 	 */
 	public String getRegion() {
@@ -95,6 +99,8 @@
 	}
 
 	/**
+	 * Get the <code>bucket</code>.
+	 *
 	 * @return Get S3 storage bucket name
 	 */
 	public String getBucket() {
@@ -102,6 +108,8 @@
 	}
 
 	/**
+	 * Get the <code>storageClass</code>.
+	 *
 	 * @return S3 storage class to use for objects stored in this bucket
 	 */
 	public String getStorageClass() {
@@ -109,6 +117,8 @@
 	}
 
 	/**
+	 * Get the <code>accessKey</code>.
+	 *
 	 * @return access key for authenticating to AWS
 	 */
 	public String getAccessKey() {
@@ -116,6 +126,8 @@
 	}
 
 	/**
+	 * Get the <code>secretKey</code>.
+	 *
 	 * @return secret key for authenticating to AWS
 	 */
 	public String getSecretKey() {
@@ -123,6 +135,8 @@
 	}
 
 	/**
+	 * Get the <code>expirationSeconds</code>.
+	 *
 	 * @return period in seconds after which requests signed for this bucket
 	 *         will expire
 	 */
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 ed896ad..043d3d0 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
@@ -91,6 +91,7 @@
 		this.s3Config = config;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Response.Action getDownloadAction(AnyLongObjectId oid) {
 		URL endpointUrl = getObjectUrl(oid);
@@ -107,6 +108,7 @@
 		return a;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Response.Action getUploadAction(AnyLongObjectId oid, long size) {
 		cacheObjectMetaData(oid, size);
@@ -126,11 +128,13 @@
 		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);
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/SignerV4.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/SignerV4.java
index a9b0ec4..b21c94e 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/SignerV4.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/SignerV4.java
@@ -43,12 +43,12 @@
  */
 package org.eclipse.jgit.lfs.server.s3;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.util.HttpSupport.HDR_AUTHORIZATION;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
@@ -359,13 +359,13 @@
 
 	private static byte[] hash(String s) {
 		MessageDigest md = Constants.newMessageDigest();
-		md.update(s.getBytes(StandardCharsets.UTF_8));
+		md.update(s.getBytes(UTF_8));
 		return md.digest();
 	}
 
 	private static byte[] sign(String stringData, byte[] key) {
 		try {
-			byte[] data = stringData.getBytes("UTF-8"); //$NON-NLS-1$
+			byte[] data = stringData.getBytes(UTF_8);
 			Mac mac = Mac.getInstance(HMACSHA256);
 			mac.init(new SecretKeySpec(key, HMACSHA256));
 			return mac.doFinal(data);
@@ -395,7 +395,7 @@
 	private static String urlEncode(String url, boolean keepPathSlash) {
 		String encoded;
 		try {
-			encoded = URLEncoder.encode(url, StandardCharsets.UTF_8.name());
+			encoded = URLEncoder.encode(url, UTF_8.name());
 		} catch (UnsupportedEncodingException e) {
 			throw new RuntimeException(LfsServerText.get().unsupportedUtf8, e);
 		}
diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
index c18d99c..5ae0989 100644
--- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
@@ -1,24 +1,25 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.lfs.test
 Bundle-SymbolicName: org.eclipse.jgit.lfs.test
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.jgit.internal.storage.dfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.junit;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
+Import-Package: org.eclipse.jgit.internal.storage.dfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.junit;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
  org.hamcrest.core;version="[1.1.0,2.0.0)",
- org.junit;version="[4.0.0,5.0.0)",
- org.junit.runner;version="[4.0.0,5.0.0)",
- org.junit.runners;version="[4.0.0,5.0.0)"
-Export-Package: org.eclipse.jgit.lfs.test;version="4.9.9";x-friends:="org.eclipse.jgit.lfs.server.test"
+ org.junit;version="[4.12,5.0.0)",
+ org.junit.runner;version="[4.12,5.0.0)",
+ org.junit.runners;version="[4.12,5.0.0)"
+Export-Package: org.eclipse.jgit.lfs.test;version="4.10.1";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 ced210c..6206ba0 100644
--- a/org.eclipse.jgit.lfs.test/pom.xml
+++ b/org.eclipse.jgit.lfs.test/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.lfs.test</artifactId>
diff --git a/org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java b/org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java
index 6c6400f..c3c3859 100644
--- a/org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java
+++ b/org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java
@@ -42,11 +42,12 @@
  */
 package org.eclipse.jgit.lfs.test;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.io.BufferedInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.security.MessageDigest;
@@ -65,7 +66,7 @@
 	 */
 	public static LongObjectId hash(String s) {
 		MessageDigest md = Constants.newMessageDigest();
-		md.update(s.getBytes(StandardCharsets.UTF_8));
+		md.update(s.getBytes(UTF_8));
 		return LongObjectId.fromRaw(md.digest());
 	}
 
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java
index 8938a78..2a8f66e 100644
--- a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java
+++ b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java
@@ -587,6 +587,7 @@
 		assertEquals(id.getFirstByte(), a.getFirstByte());
 	}
 
+	@SuppressWarnings("unlikely-arg-type")
 	@Test
 	public void testNotEquals() {
 		AbbreviatedLongObjectId a = new LongObjectId(1L, 2L, 3L, 4L)
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LFSPointerTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LFSPointerTest.java
index 4827d3d..2ace2e3 100644
--- a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LFSPointerTest.java
+++ b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LFSPointerTest.java
@@ -43,11 +43,11 @@
 
 package org.eclipse.jgit.lfs.lib;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
 
 import org.eclipse.jgit.lfs.LfsPointer;
 import org.junit.Test;
@@ -66,6 +66,6 @@
 		baos.close();
 		assertEquals("version https://git-lfs.github.com/spec/v1\noid sha256:"
 				+ s + "\nsize 4\n",
-				baos.toString(StandardCharsets.UTF_8.name()));
+				baos.toString(UTF_8.name()));
 	}
 }
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java
index 31ab783..d6dd3aa 100644
--- a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java
+++ b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.lfs.lib;
 
+import static java.nio.charset.StandardCharsets.US_ASCII;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -54,7 +55,6 @@
 import java.io.OutputStreamWriter;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Locale;
@@ -270,7 +270,7 @@
 	public void testCopyFromStringByte() {
 		AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
 		byte[] buf = new byte[64];
-		Charset cs = StandardCharsets.US_ASCII;
+		Charset cs = US_ASCII;
 		cs.encode(id1.name()).get(buf);
 		AnyLongObjectId id2 = LongObjectId.fromString(buf, 0);
 		assertEquals("objects should be equals", id1, id2);
diff --git a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
index c71473f..7421587 100644
--- a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
@@ -1,21 +1,22 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.lfs
 Bundle-SymbolicName: org.eclipse.jgit.lfs
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
-Export-Package: org.eclipse.jgit.lfs;version="4.9.9",
- org.eclipse.jgit.lfs.errors;version="4.9.9",
- org.eclipse.jgit.lfs.internal;version="4.9.9";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server",
- org.eclipse.jgit.lfs.lib;version="4.9.9"
+Export-Package: org.eclipse.jgit.lfs;version="4.10.1",
+ org.eclipse.jgit.lfs.errors;version="4.10.1",
+ org.eclipse.jgit.lfs.internal;version="4.10.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="4.10.1"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.jgit.annotations;version="[4.9.9,4.10.0)";resolution:=optional,
- org.eclipse.jgit.attributes;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)"
+Import-Package: org.eclipse.jgit.annotations;version="[4.10.1,4.11.0)";resolution:=optional,
+ org.eclipse.jgit.attributes;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)"
diff --git a/org.eclipse.jgit.lfs/pom.xml b/org.eclipse.jgit.lfs/pom.xml
index 3c88796..8585ccf 100644
--- a/org.eclipse.jgit.lfs/pom.xml
+++ b/org.eclipse.jgit.lfs/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 b78ee04..4a98286 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
@@ -66,7 +66,7 @@
  * content with content of a so-called LFS pointer file. The pointer file
  * content will then be added to the git repository. Additionally this filter
  * writes the original content in a so-called 'media file' to '.git/lfs/objects/
- * <first-two-characters-of-contentid>/<rest-of-contentid>'
+ * &lt;first-two-characters-of-contentid&gt;/&lt;rest-of-contentid&gt;'
  *
  * @see <a href="https://github.com/github/git-lfs/blob/master/docs/spec.md">Git
  *      LFS Specification</a>
@@ -74,7 +74,8 @@
  */
 public class CleanFilter extends FilterCommand {
 	/**
-	 * The factory is responsible for creating instances of {@link CleanFilter}
+	 * The factory is responsible for creating instances of
+	 * {@link org.eclipse.jgit.lfs.CleanFilter}
 	 */
 	public final static FilterCommandFactory FACTORY = new FilterCommandFactory() {
 
@@ -109,27 +110,30 @@
 	private Path tmpFile;
 
 	/**
+	 * Constructor for CleanFilter.
+	 *
 	 * @param db
 	 *            the repository
 	 * @param in
-	 *            an {@link InputStream} providing the original content
+	 *            an {@link java.io.InputStream} providing the original content
 	 * @param out
-	 *            the {@link OutputStream} into which the content of the pointer
-	 *            file should be written. That's the content which will be added
-	 *            to the git repository
-	 * @throws IOException
+	 *            the {@link java.io.OutputStream} into which the content of the
+	 *            pointer file should be written. That's the content which will
+	 *            be added to the git repository
+	 * @throws java.io.IOException
 	 *             when the creation of the temporary file fails or when no
-	 *             {@link OutputStream} for this file can be created
+	 *             {@link java.io.OutputStream} for this file can be created
 	 */
 	public CleanFilter(Repository db, InputStream in, OutputStream out)
 			throws IOException {
 		super(in, out);
-		lfsUtil = new Lfs(db.getDirectory().toPath().resolve("lfs")); //$NON-NLS-1$
+		lfsUtil = new Lfs(FileUtils.toPath(db.getDirectory()).resolve("lfs")); //$NON-NLS-1$
 		Files.createDirectories(lfsUtil.getLfsTmpDir());
 		tmpFile = lfsUtil.createTmpFile();
 		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/Lfs.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/Lfs.java
index 75e34e0..138996d 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/Lfs.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/Lfs.java
@@ -49,7 +49,7 @@
 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
 
 /**
- * Class which represents the lfs folder hierarchy inside a .git folder
+ * Class which represents the lfs folder hierarchy inside a {@code .git} folder
  *
  * @since 4.6
  */
@@ -61,14 +61,19 @@
 	private Path tmpDir;
 
 	/**
+	 * Constructor for Lfs.
+	 *
 	 * @param root
-	 *            the path to the LFS media directory. Will be "<repo>/.git/lfs"
+	 *            the path to the LFS media directory. Will be
+	 *            {@code "<repo>/.git/lfs"}
 	 */
 	public Lfs(Path root) {
 		this.root = root;
 	}
 
 	/**
+	 * Get the LFS root directory
+	 *
 	 * @return the path to the LFS directory
 	 */
 	public Path getLfsRoot() {
@@ -76,8 +81,10 @@
 	}
 
 	/**
-	 * @return the path to the temp directory used by LFS. Will be
-	 *         "<repo>/.git/lfs/tmp"
+	 * Get the path to the temporary directory used by LFS.
+	 *
+	 * @return the path to the temporary directory used by LFS. Will be
+	 *         {@code <repo>/.git/lfs/tmp}
 	 */
 	public Path getLfsTmpDir() {
 		if (tmpDir == null) {
@@ -87,8 +94,10 @@
 	}
 
 	/**
+	 * Get the object directory used by LFS
+	 *
 	 * @return the path to the object directory used by LFS. Will be
-	 *         "<repo>/.git/lfs/objects"
+	 *         {@code <repo>/.git/lfs/objects}
 	 */
 	public Path getLfsObjDir() {
 		if (objDir == null) {
@@ -98,11 +107,13 @@
 	}
 
 	/**
+	 * Get the media file which stores the original content
+	 *
 	 * @param id
 	 *            the id of the mediafile
-	 * @return the file which stores the original content. This will be files
-	 *         underneath
-	 *         "<repo>/.git/lfs/objects/<firstTwoLettersOfID>/<remainingLettersOfID>"
+	 * @return the file which stores the original content. Its path will look
+	 *         like
+	 *         {@code "<repo>/.git/lfs/objects/<firstTwoLettersOfID>/<remainingLettersOfID>"}
 	 */
 	public Path getMediaFile(AnyLongObjectId id) {
 		String idStr = id.name();
@@ -114,7 +125,7 @@
 	 * Create a new temp file in the LFS directory
 	 *
 	 * @return a new temporary file in the LFS directory
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when the temp file could not be created
 	 */
 	public Path createTmpFile() throws IOException {
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 0f62025..3604531 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
@@ -42,6 +42,8 @@
  */
 package org.eclipse.jgit.lfs;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -49,7 +51,6 @@
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
 import java.nio.charset.UnsupportedCharsetException;
 import java.util.Locale;
 
@@ -87,6 +88,8 @@
 	private long size;
 
 	/**
+	 * <p>Constructor for LfsPointer.</p>
+	 *
 	 * @param oid
 	 *            the id of the content
 	 * @param size
@@ -98,6 +101,8 @@
 	}
 
 	/**
+	 * <p>Getter for the field <code>oid</code>.</p>
+	 *
 	 * @return the id of the content
 	 */
 	public AnyLongObjectId getOid() {
@@ -105,6 +110,8 @@
 	}
 
 	/**
+	 * <p>Getter for the field <code>size</code>.</p>
+	 *
 	 * @return the size of the content
 	 */
 	public long getSize() {
@@ -115,12 +122,12 @@
 	 * Encode this object into the LFS format defined by {@link #VERSION}
 	 *
 	 * @param out
-	 *            the {@link OutputStream} into which the encoded data should be
+	 *            the {@link java.io.OutputStream} into which the encoded data should be
 	 *            written
 	 */
 	public void encode(OutputStream out) {
 		try (PrintStream ps = new PrintStream(out, false,
-				StandardCharsets.UTF_8.name())) {
+				UTF_8.name())) {
 			ps.print("version "); //$NON-NLS-1$
 			ps.print(VERSION + "\n"); //$NON-NLS-1$
 			ps.print("oid " + HASH_FUNCTION_NAME + ":"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -129,8 +136,7 @@
 			ps.print(size + "\n"); //$NON-NLS-1$
 		} catch (UnsupportedEncodingException e) {
 			// should not happen, we are using a standard charset
-			throw new UnsupportedCharsetException(
-					StandardCharsets.UTF_8.name());
+			throw new UnsupportedCharsetException(UTF_8.name());
 		}
 	}
 
@@ -139,10 +145,10 @@
 	 * {@link #VERSION}
 	 *
 	 * @param in
-	 *            the {@link InputStream} from where to read the data
-	 * @return an {@link LfsPointer} or <code>null</code> if the stream was not
-	 *         parseable as LfsPointer
-	 * @throws IOException
+	 *            the {@link java.io.InputStream} from where to read the data
+	 * @return an {@link org.eclipse.jgit.lfs.LfsPointer} or <code>null</code>
+	 *         if the stream was not parseable as LfsPointer
+	 * @throws java.io.IOException
 	 */
 	@Nullable
 	public static LfsPointer parseLfsPointer(InputStream in)
@@ -152,7 +158,7 @@
 		long sz = -1;
 
 		try (BufferedReader br = new BufferedReader(
-				new InputStreamReader(in, StandardCharsets.UTF_8.name()))) {
+				new InputStreamReader(in, UTF_8))) {
 			for (String s = br.readLine(); s != null; s = br.readLine()) {
 				if (s.startsWith("#") || s.length() == 0) { //$NON-NLS-1$
 					continue;
@@ -173,6 +179,7 @@
 		return null;
 	}
 
+	/** {@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 2332477..941edec 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
@@ -53,6 +53,7 @@
 import org.eclipse.jgit.attributes.FilterCommandRegistry;
 import org.eclipse.jgit.lfs.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.util.FileUtils;
 
 /**
  * Built-in LFS smudge filter
@@ -69,7 +70,8 @@
  */
 public class SmudgeFilter extends FilterCommand {
 	/**
-	 * The factory is responsible for creating instances of {@link SmudgeFilter}
+	 * The factory is responsible for creating instances of
+	 * {@link org.eclipse.jgit.lfs.SmudgeFilter}
 	 */
 	public final static FilterCommandFactory FACTORY = new FilterCommandFactory() {
 		@Override
@@ -92,15 +94,20 @@
 	private Lfs lfs;
 
 	/**
+	 * Constructor for SmudgeFilter.
+	 *
 	 * @param db
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param in
+	 *            a {@link java.io.InputStream} object.
 	 * @param out
-	 * @throws IOException
+	 *            a {@link java.io.OutputStream} object.
+	 * @throws java.io.IOException
 	 */
 	public SmudgeFilter(Repository db, InputStream in, OutputStream out)
 			throws IOException {
 		super(in, out);
-		lfs = new Lfs(db.getDirectory().toPath().resolve(Constants.LFS));
+		lfs = new Lfs(FileUtils.toPath(db.getDirectory()).resolve(Constants.LFS));
 		LfsPointer res = LfsPointer.parseLfsPointer(in);
 		if (res != null) {
 			Path mediaFile = lfs.getMediaFile(res.getOid());
@@ -110,6 +117,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int run() throws IOException {
 		int b;
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptLongObjectException.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptLongObjectException.java
index fea148b..d45a0ee 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptLongObjectException.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptLongObjectException.java
@@ -66,8 +66,7 @@
 	 *            id of the long object
 	 * @param contentHash
 	 *            hash of the long object's content
-	 *
-	 * @param message
+	 * @param message a {@link java.lang.String} object.
 	 */
 	public CorruptLongObjectException(AnyLongObjectId id,
 			AnyLongObjectId contentHash,
@@ -78,6 +77,8 @@
 	}
 
 	/**
+	 * Get the <code>id</code> of the object.
+	 *
 	 * @return the id of the object, i.e. the expected hash of the object's
 	 *         content
 	 */
@@ -86,6 +87,8 @@
 	}
 
 	/**
+	 * Get the <code>contentHash</code>.
+	 *
 	 * @return the actual hash of the object's content which doesn't match the
 	 *         object's id when this exception is thrown which signals that the
 	 *         object has been corrupted
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptMediaFile.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptMediaFile.java
index f2b51c0..08ef807 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptMediaFile.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/CorruptMediaFile.java
@@ -63,9 +63,11 @@
 	private long size;
 
 	/**
-	 * @param mediaFile
-	 * @param expectedSize
-	 * @param size
+	 * <p>Constructor for CorruptMediaFile.</p>
+	 *
+	 * @param mediaFile a {@link java.nio.file.Path} object.
+	 * @param expectedSize a long.
+	 * @param size a long.
 	 */
 	@SuppressWarnings("boxing")
 	public CorruptMediaFile(Path mediaFile, long expectedSize,
@@ -78,6 +80,8 @@
 	}
 
 	/**
+	 * Get the <code>mediaFile</code>.
+	 *
 	 * @return the media file which seems to be corrupt
 	 */
 	public Path getMediaFile() {
@@ -85,6 +89,8 @@
 	}
 
 	/**
+	 * Get the <code>expectedSize</code>.
+	 *
 	 * @return the expected size of the media file
 	 */
 	public long getExpectedSize() {
@@ -92,6 +98,8 @@
 	}
 
 	/**
+	 * Get the <code>size</code>.
+	 *
 	 * @return the actual size of the media file in the file system
 	 */
 	public long getSize() {
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java
index 44ac317..f7bba85 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java
@@ -45,7 +45,8 @@
 
 package org.eclipse.jgit.lfs.errors;
 
-import java.io.UnsupportedEncodingException;
+import static java.nio.charset.StandardCharsets.US_ASCII;
+
 import java.text.MessageFormat;
 
 import org.eclipse.jgit.lfs.internal.LfsText;
@@ -71,6 +72,8 @@
 	}
 
 	/**
+	 * <p>Constructor for InvalidLongObjectIdException.</p>
+	 *
 	 * @param idString
 	 *            String containing the invalid id
 	 */
@@ -80,10 +83,8 @@
 
 	private static String asAscii(byte[] bytes, int offset, int length) {
 		try {
-			return new String(bytes, offset, length, "US-ASCII"); //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e2) {
-			return ""; //$NON-NLS-1$
-		} catch (StringIndexOutOfBoundsException e2) {
+			return new String(bytes, offset, length, US_ASCII);
+		} catch (StringIndexOutOfBoundsException e) {
 			return ""; //$NON-NLS-1$
 		}
 	}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsBandwidthLimitExceeded.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsBandwidthLimitExceeded.java
index 1b1baec..949981f 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsBandwidthLimitExceeded.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsBandwidthLimitExceeded.java
@@ -47,12 +47,13 @@
  * Thrown when the bandwidth limit for the user or repository has been exceeded.
  *
  * @since 4.5
- *
  */
 public class LfsBandwidthLimitExceeded extends LfsException {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsBandwidthLimitExceeded.</p>
+	 *
 	 * @param message
 	 *            error message, which may be shown to an end-user.
 	 */
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsException.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsException.java
index 3b83639..778a819 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsException.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsException.java
@@ -52,6 +52,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsException.</p>
+	 *
 	 * @param message
 	 *            error message, which may be shown to an end-user.
 	 */
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsInsufficientStorage.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsInsufficientStorage.java
index 4faace9..f8bb89c 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsInsufficientStorage.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsInsufficientStorage.java
@@ -47,12 +47,13 @@
  * Thrown when there is insufficient storage on the server.
  *
  * @since 4.5
- *
  */
 public class LfsInsufficientStorage extends LfsException {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsInsufficientStorage.</p>
+	 *
 	 * @param message
 	 *            error message, which may be shown to an end-user.
 	 */
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRateLimitExceeded.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRateLimitExceeded.java
index 606783041..7f7ed9b 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRateLimitExceeded.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRateLimitExceeded.java
@@ -47,12 +47,13 @@
  * Thrown when the user has hit a rate limit with the server.
  *
  * @since 4.5
- *
  */
 public class LfsRateLimitExceeded extends LfsException {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsRateLimitExceeded.</p>
+	 *
 	 * @param message
 	 *            error message, which may be shown to an end-user.
 	 */
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryNotFound.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryNotFound.java
index 52c932a..9fa1105 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryNotFound.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryNotFound.java
@@ -56,9 +56,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsRepositoryNotFound.</p>
+	 *
 	 * @param name
 	 *            the repository name.
-	 *
 	 */
 	public LfsRepositoryNotFound(String name) {
 		super(MessageFormat.format(LfsText.get().repositoryNotFound, name));
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryReadOnly.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryReadOnly.java
index 3610377..c3821fc 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryReadOnly.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsRepositoryReadOnly.java
@@ -57,6 +57,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsRepositoryReadOnly.</p>
+	 *
 	 * @param name
 	 *            the repository name.
 	 */
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnauthorized.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnauthorized.java
index 62b0cde..45e29ec 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnauthorized.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnauthorized.java
@@ -56,6 +56,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * <p>Constructor for LfsUnauthorized.</p>
+	 *
 	 * @param operation
 	 *            the operation that was attempted.
 	 * @param name
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnavailable.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnavailable.java
index ecb5e9e..285a172 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnavailable.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsUnavailable.java
@@ -56,6 +56,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for LfsUnavailable.
+	 *
 	 * @param name
 	 *            the repository name.
 	 */
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsValidationError.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsValidationError.java
index 5e445ec..0492d3f 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsValidationError.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/LfsValidationError.java
@@ -53,6 +53,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for LfsValidationError.
+	 *
 	 * @param message
 	 *            error message, which may be shown to an end-user.
 	 */
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 1598b9e..0762ac5 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
@@ -56,9 +56,9 @@
 import org.eclipse.jgit.lfs.lib.LongObjectId;
 
 /**
- * Output stream writing content to a {@link LockFile} which is committed on
- * close(). The stream checks if the hash of the stream content matches the
- * id.
+ * Output stream writing content to a
+ * {@link org.eclipse.jgit.internal.storage.file.LockFile} which is committed on
+ * close(). The stream checks if the hash of the stream content matches the id.
  */
 public class AtomicObjectOutputStream extends OutputStream {
 
@@ -71,9 +71,13 @@
 	private AnyLongObjectId id;
 
 	/**
+	 * Constructor for AtomicObjectOutputStream.
+	 *
 	 * @param path
+	 *            a {@link java.nio.file.Path} object.
 	 * @param id
-	 * @throws IOException
+	 *            a {@link org.eclipse.jgit.lfs.lib.AnyLongObjectId} object.
+	 * @throws java.io.IOException
 	 */
 	public AtomicObjectOutputStream(Path path, AnyLongObjectId id)
 			throws IOException {
@@ -85,36 +89,46 @@
 	}
 
 	/**
+	 * Constructor for AtomicObjectOutputStream.
+	 *
 	 * @param path
-	 * @throws IOException
+	 *            a {@link java.nio.file.Path} object.
+	 * @throws java.io.IOException
 	 */
 	public AtomicObjectOutputStream(Path path) throws IOException {
 		this(path, null);
 	}
 
 	/**
+	 * Get the <code>id</code>.
+	 *
 	 * @return content hash of the object which was streamed through this
-	 *         stream. May return {@code null} if called before closing this stream.
+	 *         stream. May return {@code null} if called before closing this
+	 *         stream.
 	 */
 	public @Nullable 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/LfsText.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsText.java
index 4459588..ae5548c 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsText.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsText.java
@@ -51,6 +51,8 @@
 public class LfsText extends TranslationBundle {
 
 	/**
+	 * Get an instance of this translation bundle.
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static LfsText get() {
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 e9eb0e3..4529a25 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
@@ -48,14 +48,11 @@
 
 import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
 import org.eclipse.jgit.lfs.internal.LfsText;
-import org.eclipse.jgit.lib.AbbreviatedObjectId;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.util.NB;
 import org.eclipse.jgit.util.RawParseUtils;
 
 /**
- * A prefix abbreviation of an {@link LongObjectId}.
+ * A prefix abbreviation of an {@link org.eclipse.jgit.lfs.lib.LongObjectId}.
  * <p>
  * Enable abbreviating SHA-256 strings used by Git LFS, using sufficient leading
  * digits from the LongObjectId name to still be unique within the repository
@@ -65,7 +62,7 @@
  * This class converts the hex string into a binary form, to make it more
  * efficient for matching against an object.
  *
- * Ported to SHA-256 from {@link AbbreviatedObjectId}
+ * Ported to SHA-256 from {@link org.eclipse.jgit.lib.AbbreviatedObjectId}
  *
  * @since 4.3
  */
@@ -117,13 +114,14 @@
 	}
 
 	/**
-	 * Convert an AbbreviatedObjectId from an {@link AnyObjectId}.
+	 * Convert an AbbreviatedObjectId from an
+	 * {@link org.eclipse.jgit.lib.AnyObjectId}.
 	 * <p>
 	 * This method copies over all bits of the Id, and is therefore complete
 	 * (see {@link #isComplete()}).
 	 *
 	 * @param id
-	 *            the {@link ObjectId} to convert from.
+	 *            the {@link org.eclipse.jgit.lib.ObjectId} to convert from.
 	 * @return the converted object id.
 	 */
 	public static final AbbreviatedLongObjectId fromLongObjectId(
@@ -213,17 +211,29 @@
 		w4 = new_4;
 	}
 
-	/** @return number of hex digits appearing in this id */
+	/**
+	 * Get length
+	 *
+	 * @return number of hex digits appearing in this id.
+	 */
 	public int length() {
 		return nibbles;
 	}
 
-	/** @return true if this ObjectId is actually a complete id. */
+	/**
+	 * Check if this id is complete
+	 *
+	 * @return true if this ObjectId is actually a complete id.
+	 */
 	public boolean isComplete() {
 		return length() == Constants.LONG_OBJECT_ID_STRING_LENGTH;
 	}
 
-	/** @return a complete ObjectId; null if {@link #isComplete()} is false */
+	/**
+	 * Convert to LongObjectId
+	 *
+	 * @return a complete ObjectId; null if {@link #isComplete()} is false.
+	 */
 	public LongObjectId toLongObjectId() {
 		return isComplete() ? new LongObjectId(w1, w2, w3, w4) : null;
 	}
@@ -321,7 +331,11 @@
 		return NB.compareUInt64(w4, mask(4, bs[p + 3]));
 	}
 
-	/** @return value for a fan-out style map, only valid of length &gt;= 2. */
+	/**
+	 * Get the first byte of this id
+	 *
+	 * @return value for a fan-out style map, only valid of length &gt;= 2.
+	 */
 	public final int getFirstByte() {
 		return (int) (w1 >>> 56);
 	}
@@ -330,11 +344,13 @@
 		return mask(nibbles, word, v);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return (int) (w1 >> 32);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(final Object o) {
 		if (o instanceof AbbreviatedLongObjectId) {
@@ -346,6 +362,8 @@
 	}
 
 	/**
+	 * <p>name.</p>
+	 *
 	 * @return string form of the abbreviation, in lower case hexadecimal.
 	 */
 	public final String name() {
@@ -367,6 +385,7 @@
 		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 caf034d..96d6938 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
@@ -49,17 +49,17 @@
 import java.nio.ByteBuffer;
 
 import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.util.NB;
 
 /**
  * A (possibly mutable) SHA-256 abstraction.
  * <p>
- * If this is an instance of {@link MutableLongObjectId} the concept of equality
+ * If this is an instance of
+ * {@link org.eclipse.jgit.lfs.lib.MutableLongObjectId} the concept of equality
  * with this instance can alter at any time, if this instance is modified to
  * represent a different object name.
  *
- * Ported to SHA-256 from {@link AnyObjectId}
+ * Ported to SHA-256 from {@link org.eclipse.jgit.lib.AnyObjectId}
  *
  * @since 4.3
  */
@@ -132,14 +132,15 @@
 	 * @param index
 	 *            index of the byte to obtain from the raw form of the
 	 *            LongObjectId. Must be in range [0,
-	 *            {@link Constants#LONG_OBJECT_ID_LENGTH}).
+	 *            {@link org.eclipse.jgit.lfs.lib.Constants#LONG_OBJECT_ID_LENGTH}).
 	 * @return the value of the requested byte at {@code index}. Returned values
 	 *         are unsigned and thus are in the range [0,255] rather than the
 	 *         signed byte range of [-128, 127].
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             {@code index} is less than 0, equal to
-	 *             {@link Constants#LONG_OBJECT_ID_LENGTH}, or greater than
-	 *             {@link Constants#LONG_OBJECT_ID_LENGTH}.
+	 *             {@link org.eclipse.jgit.lfs.lib.Constants#LONG_OBJECT_ID_LENGTH},
+	 *             or greater than
+	 *             {@link org.eclipse.jgit.lfs.lib.Constants#LONG_OBJECT_ID_LENGTH}.
 	 */
 	public final int getByte(int index) {
 		long w;
@@ -164,12 +165,9 @@
 	}
 
 	/**
-	 * Compare this LongObjectId to another and obtain a sort ordering.
+	 * {@inheritDoc}
 	 *
-	 * @param other
-	 *            the other id to compare to. Must not be null.
-	 * @return &lt; 0 if this id comes before other; 0 if this id is equal to
-	 *         other; &gt; 0 if this id comes after other.
+	 * Compare this LongObjectId to another and obtain a sort ordering.
 	 */
 	@Override
 	public final int compareTo(final AnyLongObjectId other) {
@@ -263,6 +261,7 @@
 		return abbr.prefixCompare(this) == 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final int hashCode() {
 		return (int) (w1 >> 32);
@@ -279,6 +278,7 @@
 		return other != null ? equals(this, other) : false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final boolean equals(final Object o) {
 		if (o instanceof AnyLongObjectId)
@@ -335,7 +335,7 @@
 	 *
 	 * @param w
 	 *            the stream to write to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyRawTo(final OutputStream w) throws IOException {
@@ -362,7 +362,7 @@
 	 *
 	 * @param w
 	 *            the stream to copy to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyTo(final OutputStream w) throws IOException {
@@ -421,7 +421,7 @@
 	 *
 	 * @param w
 	 *            the stream to copy to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyTo(final Writer w) throws IOException {
@@ -437,7 +437,7 @@
 	 *            of object id (64 characters or larger).
 	 * @param w
 	 *            the stream to copy to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyTo(final char[] tmp, final Writer w) throws IOException {
@@ -486,6 +486,7 @@
 			dst[o--] = '0';
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -493,6 +494,8 @@
 	}
 
 	/**
+	 * Get string form of the SHA-256
+	 *
 	 * @return string form of the SHA-256, in lower case hexadecimal.
 	 */
 	public final String name() {
@@ -500,6 +503,8 @@
 	}
 
 	/**
+	 * Get string form of the SHA-256
+	 *
 	 * @return string form of the SHA-256, in lower case hexadecimal.
 	 */
 	public final String getName() {
@@ -510,8 +515,10 @@
 	 * Return an abbreviation (prefix) of this object SHA-256.
 	 * <p>
 	 * This implementation does not guarantee uniqueness. Callers should instead
-	 * use {@link ObjectReader#abbreviate(AnyObjectId, int)} to obtain a unique
-	 * abbreviation within the scope of a particular object database.
+	 * use
+	 * {@link org.eclipse.jgit.lib.ObjectReader#abbreviate(AnyObjectId, int)} to
+	 * obtain a unique abbreviation within the scope of a particular object
+	 * database.
 	 *
 	 * @param len
 	 *            length of the abbreviated string.
@@ -529,8 +536,8 @@
 	 * Obtain an immutable copy of this current object.
 	 * <p>
 	 * Only returns <code>this</code> if this instance is an unsubclassed
-	 * instance of {@link LongObjectId}; otherwise a new instance is returned
-	 * holding the same value.
+	 * instance of {@link org.eclipse.jgit.lfs.lib.LongObjectId}; otherwise a
+	 * new instance is returned holding the same value.
 	 * <p>
 	 * This method is useful to shed any additional memory that may be tied to
 	 * the subclass, yet retain the unique identity of the object id for future
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java
index 0220743..d5b96ab 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java
@@ -52,7 +52,7 @@
  * Misc. constants used throughout JGit LFS extension.
  *
  * @since 4.3
- **/
+ */
 @SuppressWarnings("nls")
 public final class Constants {
 	/**
@@ -111,7 +111,7 @@
 	 * Create a new digest function for objects.
 	 *
 	 * @return a new digest object.
-	 * @throws RuntimeException
+	 * @throws java.lang.RuntimeException
 	 *             this Java virtual machine does not support the required hash
 	 *             function. Very unlikely given that JGit uses a hash function
 	 *             that is in the Java reference specification.
@@ -133,14 +133,15 @@
 	}
 
 	/**
-	 * Content type used by LFS REST API as defined in
-	 * {@link "https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md"}
+	 * Content type used by LFS REST API as defined in <a href=
+	 * "https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md">
+	 * https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md</a>
 	 */
 	public static final String CONTENT_TYPE_GIT_LFS_JSON = "application/vnd.git-lfs+json";
 
 	/**
-	 * "arbitrary binary data" as defined in RFC 2046
-	 * {@link "https://www.ietf.org/rfc/rfc2046.txt"}
+	 * "Arbitrary binary data" as defined in
+	 * <a href="https://www.ietf.org/rfc/rfc2046.txt">RFC 2046</a>
 	 */
 	public static final String HDR_APPLICATION_OCTET_STREAM = "application/octet-stream";
 }
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 6f672b8..dcc915d 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
@@ -66,12 +66,15 @@
 	private LfsPointer pointer;
 
 	/**
-	 * @return {@link LfsPointer} or {@code null}
+	 * Get the field <code>pointer</code>.
+	 *
+	 * @return {@link org.eclipse.jgit.lfs.LfsPointer} or {@code null}
 	 */
 	public LfsPointer getPointer() {
 		return pointer;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walk) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -91,11 +94,13 @@
 		}
 	}
 
+	/** {@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 c4a4e43..ec1e179 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
@@ -49,14 +49,13 @@
 import java.io.Serializable;
 
 import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
-import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.util.NB;
 import org.eclipse.jgit.util.RawParseUtils;
 
 /**
  * A SHA-256 abstraction.
  *
- * Ported to SHA-256 from {@link ObjectId}
+ * Ported to SHA-256 from {@link org.eclipse.jgit.lib.ObjectId}
  *
  * @since 4.3
  */
@@ -288,6 +287,7 @@
 		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 130e94e..7b0c494 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
@@ -47,14 +47,13 @@
 
 import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
 import org.eclipse.jgit.lfs.internal.LfsText;
-import org.eclipse.jgit.lib.MutableObjectId;
 import org.eclipse.jgit.util.NB;
 import org.eclipse.jgit.util.RawParseUtils;
 
 /**
  * A mutable SHA-256 abstraction.
  *
- * Ported to SHA-256 from {@link MutableObjectId}
+ * Ported to SHA-256 from {@link org.eclipse.jgit.lib.MutableObjectId}
  *
  * @since 4.3
  */
@@ -81,15 +80,17 @@
 	 *
 	 * @param index
 	 *            index of the byte to set in the raw form of the ObjectId. Must
-	 *            be in range [0, {@link Constants#LONG_OBJECT_ID_LENGTH}).
+	 *            be in range [0,
+	 *            {@link org.eclipse.jgit.lfs.lib.Constants#LONG_OBJECT_ID_LENGTH}).
 	 * @param value
 	 *            the value of the specified byte at {@code index}. Values are
 	 *            unsigned and thus are in the range [0,255] rather than the
 	 *            signed byte range of [-128, 127].
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             {@code index} is less than 0, equal to
-	 *             {@link Constants#LONG_OBJECT_ID_LENGTH}, or greater than
-	 *             {@link Constants#LONG_OBJECT_ID_LENGTH}.
+	 *             {@link org.eclipse.jgit.lfs.lib.Constants#LONG_OBJECT_ID_LENGTH},
+	 *             or greater than
+	 *             {@link org.eclipse.jgit.lfs.lib.Constants#LONG_OBJECT_ID_LENGTH}.
 	 */
 	public void setByte(int index, int value) {
 		switch (index >> 3) {
@@ -135,7 +136,10 @@
 		}
 	}
 
-	/** Make this id match {@link LongObjectId#zeroId()}. */
+	/**
+	 * Make this id match
+	 * {@link org.eclipse.jgit.lfs.lib.LongObjectId#zeroId()}.
+	 */
 	public void clear() {
 		w1 = 0;
 		w2 = 0;
@@ -144,7 +148,7 @@
 	}
 
 	/**
-	 * Copy an LongObjectId into this mutable buffer.
+	 * Copy a LongObjectId into this mutable buffer.
 	 *
 	 * @param src
 	 *            the source id to copy from.
@@ -157,7 +161,7 @@
 	}
 
 	/**
-	 * Convert an LongObjectId from raw binary representation.
+	 * Convert a LongObjectId from raw binary representation.
 	 *
 	 * @param bs
 	 *            the raw byte buffer to read from. At least 32 bytes must be
@@ -168,7 +172,7 @@
 	}
 
 	/**
-	 * Convert an LongObjectId from raw binary representation.
+	 * Convert a LongObjectId from raw binary representation.
 	 *
 	 * @param bs
 	 *            the raw byte buffer to read from. At least 32 bytes after p
@@ -184,7 +188,7 @@
 	}
 
 	/**
-	 * Convert an LongObjectId from binary representation expressed in integers.
+	 * Convert a LongObjectId from binary representation expressed in integers.
 	 *
 	 * @param longs
 	 *            the raw long buffer to read from. At least 4 longs must be
@@ -195,14 +199,13 @@
 	}
 
 	/**
-	 * Convert an LongObjectId from binary representation expressed in longs.
+	 * Convert a LongObjectId from binary representation expressed in longs.
 	 *
 	 * @param longs
 	 *            the raw int buffer to read from. At least 4 longs after p must
 	 *            be available within this longs array.
 	 * @param p
 	 *            position to read the first integer of data from.
-	 *
 	 */
 	public void fromRaw(final long[] longs, final int p) {
 		w1 = longs[p];
@@ -212,7 +215,7 @@
 	}
 
 	/**
-	 * Convert an LongObjectId from hex characters (US-ASCII).
+	 * Convert a LongObjectId from hex characters (US-ASCII).
 	 *
 	 * @param buf
 	 *            the US-ASCII buffer to read from. At least 32 bytes after
@@ -225,7 +228,7 @@
 	}
 
 	/**
-	 * Convert an LongObjectId from hex characters.
+	 * Convert a LongObjectId from hex characters.
 	 *
 	 * @param str
 	 *            the string to read from. Must be 64 characters long.
@@ -249,6 +252,7 @@
 		}
 	}
 
+	/** {@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 44c47da..e3f229a 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="4.9.9.qualifier"
+      version="4.10.1.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 5071bee..da36437 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 62b3dd5..0d67440 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="4.9.9.qualifier"
+      version="4.10.1.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
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 38f4aba..06ce041 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
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 1783966..0664991 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="4.9.9.qualifier"
+      version="4.10.1.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
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 c8a7e70..b0dc93c 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
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 232f9c6..0cd35e0 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="4.9.9.qualifier"
+      version="4.10.1.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
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 32cb40d..ee9b28f 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
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 8baafce..7434e2c 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="4.9.9.qualifier"
+      version="4.10.1.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
@@ -31,8 +31,8 @@
          version="0.0.0"/>
 
    <requires>
-      <import feature="org.eclipse.jgit" version="4.9.9" match="equivalent"/>
-      <import feature="org.eclipse.jgit.lfs" version="4.9.9" match="equivalent"/>
+      <import feature="org.eclipse.jgit" version="4.10.1" match="equivalent"/>
+      <import feature="org.eclipse.jgit.lfs" version="4.10.1" 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 62dd1c1..1695b26 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
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <groupId>org.eclipse.jgit.feature</groupId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml
index f0b3222..14c2c1c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jgit.pgm.source"
       label="%featureName"
-      version="4.9.9.qualifier"
+      version="4.10.1.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml
index a9fc6e5..073ae32 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 209a96c..e8ddf11 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 6c74a88..66daef8 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="4.9.9.qualifier"
+      version="4.10.1.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/jgit/">
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 b26350b..fe3818a 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
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 7190313..b850297 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: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.target
index b4b3908..e3d9e4d 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.target
@@ -1,64 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform -->
-<target name="jgit-4.5" sequenceNumber="1504052010">
+<target name="jgit-4.5" sequenceNumber="1512295767">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
-      <unit id="org.eclipse.jetty.client" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.client.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util.source" version="9.4.5.v20170502"/>
-      <repository id="jetty-9.4.5" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.5.v20170502/"/>
-    </location>
-    <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
-      <unit id="org.apache.ant" version="1.9.4.v201504302020"/>
-      <unit id="org.apache.ant.source" version="1.9.4.v201504302020"/>
-      <unit id="org.apache.commons.compress" version="1.6.0.v201310281400"/>
-      <unit id="org.apache.commons.compress.source" version="1.6.0.v201310281400"/>
-      <unit id="org.apache.commons.logging" version="1.1.1.v201101211721"/>
-      <unit id="org.apache.commons.logging.source" version="1.1.1.v201101211721"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.3.6.v201411290715B"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.3.6.v201411290715B"/>
-      <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
-      <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
-      <unit id="org.kohsuke.args4j" version="2.0.21.v201301150030"/>
-      <unit id="org.kohsuke.args4j.source" version="2.0.21.v201301150030"/>
-      <unit id="org.hamcrest.core" version="1.3.0.v201303031735"/>
-      <unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/>
-      <unit id="javaewah" version="0.7.9.v201401101600"/>
-      <unit id="javaewah.source" version="0.7.9.v201401101600"/>
-      <unit id="org.objenesis" version="1.0.0.v201505121915"/>
-      <unit id="org.objenesis.source" version="1.0.0.v201505121915"/>
-      <unit id="org.mockito" version="1.8.4.v201303031500"/>
-      <unit id="org.mockito.source" version="1.8.4.v201303031500"/>
-      <unit id="com.google.gson" version="2.2.4.v201311231704"/>
-      <unit id="com.jcraft.jsch" version="0.1.53.v201508180515"/>
-      <unit id="com.jcraft.jsch.source" version="0.1.53.v201508180515"/>
-      <unit id="org.junit" version="4.11.0.v201303080030"/>
-      <unit id="org.junit.source" version="4.11.0.v201303080030"/>
-      <unit id="javax.servlet" version="3.1.0.v201410161800"/>
-      <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
-      <unit id="org.tukaani.xz" version="1.3.0.v201308270617"/>
-      <unit id="org.tukaani.xz.source" version="1.3.0.v201308270617"/>
-      <unit id="org.slf4j.api" version="1.7.2.v20121108-1250"/>
-      <unit id="org.slf4j.api.source" version="1.7.2.v20121108-1250"/>
-      <unit id="org.slf4j.impl.log4j12" version="1.7.2.v20131105-2200"/>
-      <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
-      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20160221192158/repository/"/>
+      <unit id="org.eclipse.jetty.client" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.client.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util.source" version="9.4.8.v20171121"/>
+      <repository id="jetty-9.4.8" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.8.v20171121"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.apache.ant" version="1.9.6.v201510161327"/>
@@ -69,10 +31,10 @@
       <unit id="org.apache.commons.compress.source" version="1.6.0.v201310281400"/>
       <unit id="org.apache.commons.logging" version="1.1.1.v201101211721"/>
       <unit id="org.apache.commons.logging.source" version="1.1.1.v201101211721"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.3.6.v201511171540"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.3.6.v201511171540"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.2.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.2.v20170210-0925"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
@@ -100,7 +62,7 @@
       <unit id="org.slf4j.api.source" version="1.7.2.v20121108-1250"/>
       <unit id="org.slf4j.impl.log4j12" version="1.7.2.v20131105-2200"/>
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
-      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170516192513/repository"/>
+      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170919201930/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.tpd
index f9653b2..75101f6 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.5.tpd
@@ -1,8 +1,7 @@
 target "jgit-4.5" with source configurePhase
 
-include "projects/jetty-9.4.5.tpd"
-include "orbit/R20160221192158-Mars.tpd"
-include "orbit/R20170516192513-Oxygen.tpd"
+include "projects/jetty-9.4.8.tpd"
+include "orbit/R20170919201930-Oxygen.tpd"
 
 location "http://download.eclipse.org/releases/mars/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target
index 48cd300..4c79441 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform -->
-<target name="jgit-4.6" sequenceNumber="1504051999">
+<target name="jgit-4.6" sequenceNumber="1512295762">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
-      <unit id="org.eclipse.jetty.client" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.client.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util.source" version="9.4.5.v20170502"/>
-      <repository id="jetty-9.4.5" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.5.v20170502/"/>
+      <unit id="org.eclipse.jetty.client" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.client.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util.source" version="9.4.8.v20171121"/>
+      <repository id="jetty-9.4.8" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.8.v20171121"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.apache.ant" version="1.9.6.v201510161327"/>
@@ -31,10 +31,10 @@
       <unit id="org.apache.commons.compress.source" version="1.6.0.v201310281400"/>
       <unit id="org.apache.commons.logging" version="1.1.1.v201101211721"/>
       <unit id="org.apache.commons.logging.source" version="1.1.1.v201101211721"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.3.6.v201511171540"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.3.6.v201511171540"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.2.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.2.v20170210-0925"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
@@ -62,7 +62,7 @@
       <unit id="org.slf4j.api.source" version="1.7.2.v20121108-1250"/>
       <unit id="org.slf4j.impl.log4j12" version="1.7.2.v20131105-2200"/>
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
-      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170516192513/repository"/>
+      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170919201930/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd
index 9ddba2d..7de5870 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.6" with source configurePhase
 
-include "projects/jetty-9.4.5.tpd"
-include "orbit/R20170516192513-Oxygen.tpd"
+include "projects/jetty-9.4.8.tpd"
+include "orbit/R20170919201930-Oxygen.tpd"
 
 location "http://download.eclipse.org/releases/neon/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target
index 4ac65dd..9b1c15b 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform -->
-<target name="jgit-4.7" sequenceNumber="1504051975">
+<target name="jgit-4.7" sequenceNumber="1512295741">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
-      <unit id="org.eclipse.jetty.client" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.client.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util.source" version="9.4.5.v20170502"/>
-      <repository id="jetty-9.4.5" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.5.v20170502/"/>
+      <unit id="org.eclipse.jetty.client" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.client.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util.source" version="9.4.8.v20171121"/>
+      <repository id="jetty-9.4.8" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.8.v20171121"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.apache.ant" version="1.9.6.v201510161327"/>
@@ -31,10 +31,10 @@
       <unit id="org.apache.commons.compress.source" version="1.6.0.v201310281400"/>
       <unit id="org.apache.commons.logging" version="1.1.1.v201101211721"/>
       <unit id="org.apache.commons.logging.source" version="1.1.1.v201101211721"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.3.6.v201511171540"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.3.6.v201511171540"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.2.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.2.v20170210-0925"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
@@ -62,7 +62,7 @@
       <unit id="org.slf4j.api.source" version="1.7.2.v20121108-1250"/>
       <unit id="org.slf4j.impl.log4j12" version="1.7.2.v20131105-2200"/>
       <unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/>
-      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170516192513/repository"/>
+      <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170919201930/repository"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.eclipse.osgi" version="0.0.0"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd
index 4185079..1def86c 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.tpd
@@ -1,7 +1,7 @@
 target "jgit-4.7" with source configurePhase
 
-include "projects/jetty-9.4.5.tpd"
-include "orbit/R20170516192513-Oxygen.tpd"
+include "projects/jetty-9.4.8.tpd"
+include "orbit/R20170919201930-Oxygen.tpd"
 
 location "http://download.eclipse.org/releases/oxygen/" {
 	org.eclipse.osgi lazy
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target
index d82fe3e..5180e41 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde?>
 <!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform -->
-<target name="jgit-4.8" sequenceNumber="1535021913">
+<target name="jgit-4.8" sequenceNumber="1535124646">
   <locations>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
-      <unit id="org.eclipse.jetty.client" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.client.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.continuation.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.http.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.io.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.security.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.server.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.servlet.source" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util" version="9.4.5.v20170502"/>
-      <unit id="org.eclipse.jetty.util.source" version="9.4.5.v20170502"/>
-      <repository id="jetty-9.4.5" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.5.v20170502/"/>
+      <unit id="org.eclipse.jetty.client" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.client.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.continuation.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.http.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.io.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.security.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.server.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.servlet.source" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util" version="9.4.8.v20171121"/>
+      <unit id="org.eclipse.jetty.util.source" version="9.4.8.v20171121"/>
+      <repository id="jetty-9.4.8" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.8.v20171121"/>
     </location>
     <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
       <unit id="org.apache.ant" version="1.9.6.v201510161327"/>
@@ -31,10 +31,10 @@
       <unit id="org.apache.commons.compress.source" version="1.6.0.v201310281400"/>
       <unit id="org.apache.commons.logging" version="1.1.1.v201101211721"/>
       <unit id="org.apache.commons.logging.source" version="1.1.1.v201101211721"/>
-      <unit id="org.apache.httpcomponents.httpcore" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpcore.source" version="4.3.3.v201411290715"/>
-      <unit id="org.apache.httpcomponents.httpclient" version="4.3.6.v201511171540"/>
-      <unit id="org.apache.httpcomponents.httpclient.source" version="4.3.6.v201511171540"/>
+      <unit id="org.apache.httpcomponents.httpcore" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.6.v20170210-0925"/>
+      <unit id="org.apache.httpcomponents.httpclient" version="4.5.2.v20180410-1551"/>
+      <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.2.v20180410-1551"/>
       <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
       <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
       <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd
index cd1954f..0ea2b99 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.tpd
@@ -1,6 +1,6 @@
 target "jgit-4.8" with source configurePhase
 
-include "projects/jetty-9.4.5.tpd"
+include "projects/jetty-9.4.8.tpd"
 include "orbit/R20180606145124-Photon.tpd"
 
 location "http://download.eclipse.org/releases/photon/" {
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20150124073747-Luna-SR2.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20150124073747-Luna-SR2.tpd
deleted file mode 100644
index d9e072f..0000000
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20150124073747-Luna-SR2.tpd
+++ /dev/null
@@ -1,40 +0,0 @@
-target "R20150124073747" with source configurePhase
-// see http://download.eclipse.org/tools/orbit/downloads/
-
-location "http://download.eclipse.org/tools/orbit/downloads/drops/R20150124073747/repository/" {
-	org.apache.ant [1.9.2.v201404171502,1.9.2.v201404171502]
-	org.apache.ant.source [1.9.2.v201404171502,1.9.2.v201404171502]
-	org.apache.commons.compress [1.6.0.v201310281400,1.6.0.v201310281400]
-	org.apache.commons.compress.source [1.6.0.v201310281400,1.6.0.v201310281400]
-	org.apache.commons.logging [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.commons.logging.source [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.httpcomponents.httpcore [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpcore.source [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpclient [4.3.6.v201411290715,4.3.6.v201411290715]
-	org.apache.httpcomponents.httpclient.source [4.3.6.v201411290715,4.3.6.v201411290715]
-	org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
-	org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
-	org.kohsuke.args4j [2.0.21.v201301150030,2.0.21.v201301150030]
-	org.kohsuke.args4j.source [2.0.21.v201301150030,2.0.21.v201301150030]
-	org.hamcrest.core [1.3.0.v201303031735,1.3.0.v201303031735]
-	org.hamcrest.core.source [1.3.0.v201303031735,1.3.0.v201303031735]
-	javaewah [0.7.9.v201401101600,0.7.9.v201401101600]
-	javaewah.source [0.7.9.v201401101600,0.7.9.v201401101600]
-	org.objenesis [1.0.0.v201105211943,1.0.0.v201105211943]
-	org.objenesis.source [1.0.0.v201105211943,1.0.0.v201105211943]
-	org.mockito [1.8.4.v201303031500,1.8.4.v201303031500]
-	org.mockito.source [1.8.4.v201303031500,1.8.4.v201303031500]
-	com.google.gson [2.2.4.v201311231704,2.2.4.v201311231704]
-	com.jcraft.jsch [0.1.51.v201410302000,0.1.51.v201410302000]
-	com.jcraft.jsch.source [0.1.51.v201410302000,0.1.51.v201410302000]
-	org.junit [4.11.0.v201303080030,4.11.0.v201303080030]
-	org.junit.source [4.11.0.v201303080030,4.11.0.v201303080030]
-	javax.servlet [3.1.0.v20140303-1611,3.1.0.v20140303-1611]
-	javax.servlet.source [3.1.0.v20140303-1611,3.1.0.v20140303-1611]
-	org.tukaani.xz [1.3.0.v201308270617,1.3.0.v201308270617]
-	org.tukaani.xz.source [1.3.0.v201308270617,1.3.0.v201308270617]
-	org.slf4j.api [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
-	org.slf4j.api.source [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
-	org.slf4j.impl.log4j12 [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
-	org.slf4j.impl.log4j12.source [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
-}
\ No newline at end of file
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20160221192158-Mars.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20160221192158-Mars.tpd
deleted file mode 100644
index 5e47f68..0000000
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20160221192158-Mars.tpd
+++ /dev/null
@@ -1,40 +0,0 @@
-target "R20160221192158-Mars" with source configurePhase
-// see http://download.eclipse.org/tools/orbit/downloads/
-
-location "http://download.eclipse.org/tools/orbit/downloads/drops/R20160221192158/repository/" {
-	org.apache.ant [1.9.4.v201504302020,1.9.4.v201504302020]
-	org.apache.ant.source [1.9.4.v201504302020,1.9.4.v201504302020]
-	org.apache.commons.compress [1.6.0.v201310281400,1.6.0.v201310281400]
-	org.apache.commons.compress.source [1.6.0.v201310281400,1.6.0.v201310281400]
-	org.apache.commons.logging [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.commons.logging.source [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.httpcomponents.httpcore [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpcore.source [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpclient [4.3.6.v201411290715B,4.3.6.v201411290715B]
-	org.apache.httpcomponents.httpclient.source [4.3.6.v201411290715B,4.3.6.v201411290715B]
-	org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
-	org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
-	org.kohsuke.args4j [2.0.21.v201301150030,2.0.21.v201301150030]
-	org.kohsuke.args4j.source [2.0.21.v201301150030,2.0.21.v201301150030]
-	org.hamcrest.core [1.3.0.v201303031735,1.3.0.v201303031735]
-	org.hamcrest.core.source [1.3.0.v201303031735,1.3.0.v201303031735]
-	javaewah [0.7.9.v201401101600,0.7.9.v201401101600]
-	javaewah.source [0.7.9.v201401101600,0.7.9.v201401101600]
-	org.objenesis [1.0.0.v201505121915,1.0.0.v201505121915]
-	org.objenesis.source [1.0.0.v201505121915,1.0.0.v201505121915]
-	org.mockito [1.8.4.v201303031500,1.8.4.v201303031500]
-	org.mockito.source [1.8.4.v201303031500,1.8.4.v201303031500]
-	com.google.gson [2.2.4.v201311231704,2.2.4.v201311231704]
-	com.jcraft.jsch [0.1.53.v201508180515,0.1.53.v201508180515]
-	com.jcraft.jsch.source [0.1.53.v201508180515,0.1.53.v201508180515]
-	org.junit [4.11.0.v201303080030,4.11.0.v201303080030]
-	org.junit.source [4.11.0.v201303080030,4.11.0.v201303080030]
-	javax.servlet [3.1.0.v201410161800,3.1.0.v201410161800]
-	javax.servlet.source [3.1.0.v201410161800,3.1.0.v201410161800]
-	org.tukaani.xz [1.3.0.v201308270617,1.3.0.v201308270617]
-	org.tukaani.xz.source [1.3.0.v201308270617,1.3.0.v201308270617]
-	org.slf4j.api [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
-	org.slf4j.api.source [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
-	org.slf4j.impl.log4j12 [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
-	org.slf4j.impl.log4j12.source [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
-}
\ No newline at end of file
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20160520211859-Neon.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20160520211859-Neon.tpd
deleted file mode 100644
index 5aca0b7..0000000
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20160520211859-Neon.tpd
+++ /dev/null
@@ -1,40 +0,0 @@
-target "R20160520211859-Neon" with source configurePhase
-// see http://download.eclipse.org/tools/orbit/downloads/
-
-location "http://download.eclipse.org/tools/orbit/downloads/drops/R20160520211859/repository/" {
-	org.apache.ant [1.9.6.v201510161327,1.9.6.v201510161327]
-	org.apache.ant.source [1.9.6.v201510161327,1.9.6.v201510161327]
-	org.apache.commons.compress [1.6.0.v201310281400,1.6.0.v201310281400]
-	org.apache.commons.compress.source [1.6.0.v201310281400,1.6.0.v201310281400]
-	org.apache.commons.logging [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.commons.logging.source [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.httpcomponents.httpcore [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpcore.source [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpclient [4.3.6.v201511171540,4.3.6.v201511171540]
-	org.apache.httpcomponents.httpclient.source [4.3.6.v201511171540,4.3.6.v201511171540]
-	org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
-	org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
-	org.kohsuke.args4j [2.0.21.v201301150030,2.0.21.v201301150030]
-	org.kohsuke.args4j.source [2.0.21.v201301150030,2.0.21.v201301150030]
-	org.hamcrest.core [1.3.0.v201303031735,1.3.0.v201303031735]
-	org.hamcrest.core.source [1.3.0.v201303031735,1.3.0.v201303031735]
-	javaewah [0.7.9.v201605172130,0.7.9.v201605172130]
-	javaewah.source [0.7.9.v201605172130,0.7.9.v201605172130]
-	org.objenesis [1.0.0.v201505121915,1.0.0.v201505121915]
-	org.objenesis.source [1.0.0.v201505121915,1.0.0.v201505121915]
-	org.mockito [1.8.4.v201303031500,1.8.4.v201303031500]
-	org.mockito.source [1.8.4.v201303031500,1.8.4.v201303031500]
-	com.google.gson [2.2.4.v201311231704,2.2.4.v201311231704]
-	com.jcraft.jsch [0.1.53.v201508180515,0.1.53.v201508180515]
-	com.jcraft.jsch.source [0.1.53.v201508180515,0.1.53.v201508180515]
-	org.junit [4.12.0.v201504281640,4.12.0.v201504281640]
-	org.junit.source [4.12.0.v201504281640,4.12.0.v201504281640]
-	javax.servlet [3.1.0.v201410161800,3.1.0.v201410161800]
-	javax.servlet.source [3.1.0.v201410161800,3.1.0.v201410161800]
-	org.tukaani.xz [1.3.0.v201308270617,1.3.0.v201308270617]
-	org.tukaani.xz.source [1.3.0.v201308270617,1.3.0.v201308270617]
-	org.slf4j.api [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
-	org.slf4j.api.source [1.7.2.v20121108-1250,1.7.2.v20121108-1250]
-	org.slf4j.impl.log4j12 [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
-	org.slf4j.impl.log4j12.source [1.7.2.v20131105-2200,1.7.2.v20131105-2200]
-}
\ No newline at end of file
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20170516192513-Oxygen.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20170919201930-Oxygen.tpd
similarity index 84%
rename from org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20170516192513-Oxygen.tpd
rename to org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20170919201930-Oxygen.tpd
index f4cb572..4e9cc13 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20170516192513-Oxygen.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20170919201930-Oxygen.tpd
@@ -1,7 +1,7 @@
-target "R20170516192513-Oxygen" with source configurePhase
+target "R20170919201930-Oxygen" with source configurePhase
 // see http://download.eclipse.org/tools/orbit/downloads/
 
-location "http://download.eclipse.org/tools/orbit/downloads/drops/R20170516192513/repository" {
+location "http://download.eclipse.org/tools/orbit/downloads/drops/R20170919201930/repository" {
 	org.apache.ant [1.9.6.v201510161327,1.9.6.v201510161327]
 	org.apache.ant.source [1.9.6.v201510161327,1.9.6.v201510161327]
 	org.apache.commons.codec [1.9.0.v20170208-1614,1.9.0.v20170208-1614]
@@ -10,10 +10,10 @@
 	org.apache.commons.compress.source [1.6.0.v201310281400,1.6.0.v201310281400]
 	org.apache.commons.logging [1.1.1.v201101211721,1.1.1.v201101211721]
 	org.apache.commons.logging.source [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.httpcomponents.httpcore [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpcore.source [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpclient [4.3.6.v201511171540,4.3.6.v201511171540]
-	org.apache.httpcomponents.httpclient.source [4.3.6.v201511171540,4.3.6.v201511171540]
+	org.apache.httpcomponents.httpcore [4.4.6.v20170210-0925,4.4.6.v20170210-0925]
+	org.apache.httpcomponents.httpcore.source [4.4.6.v20170210-0925,4.4.6.v20170210-0925]
+	org.apache.httpcomponents.httpclient [4.5.2.v20170210-0925,4.5.2.v20170210-0925]
+	org.apache.httpcomponents.httpclient.source [4.5.2.v20170210-0925,4.5.2.v20170210-0925]
 	org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
 	org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
 	org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20180606145124-Photon.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20180606145124-Photon.tpd
index a7ad1a4..86c888a 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20180606145124-Photon.tpd
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/R20180606145124-Photon.tpd
@@ -10,10 +10,10 @@
 	org.apache.commons.compress.source [1.6.0.v201310281400,1.6.0.v201310281400]
 	org.apache.commons.logging [1.1.1.v201101211721,1.1.1.v201101211721]
 	org.apache.commons.logging.source [1.1.1.v201101211721,1.1.1.v201101211721]
-	org.apache.httpcomponents.httpcore [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpcore.source [4.3.3.v201411290715,4.3.3.v201411290715]
-	org.apache.httpcomponents.httpclient [4.3.6.v201511171540,4.3.6.v201511171540]
-	org.apache.httpcomponents.httpclient.source [4.3.6.v201511171540,4.3.6.v201511171540]
+	org.apache.httpcomponents.httpcore [4.4.6.v20170210-0925,4.4.6.v20170210-0925]
+	org.apache.httpcomponents.httpcore.source [4.4.6.v20170210-0925,4.4.6.v20170210-0925]
+	org.apache.httpcomponents.httpclient [4.5.2.v20180410-1551,4.5.2.v20180410-1551]
+	org.apache.httpcomponents.httpclient.source [4.5.2.v20180410-1551,4.5.2.v20180410-1551]
 	org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
 	org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
 	org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
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 69ff043..2d26e79 100644
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml
@@ -49,7 +49,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>jgit.tycho.parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.target</artifactId>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/projects/jetty-9.4.5.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/projects/jetty-9.4.5.tpd
deleted file mode 100644
index 363c600..0000000
--- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/projects/jetty-9.4.5.tpd
+++ /dev/null
@@ -1,20 +0,0 @@
-target "jetty-9.4.5" with source configurePhase
-
-location jetty-9.4.5 "http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.5.v20170502/" {
-	org.eclipse.jetty.client [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.client.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.continuation [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.continuation.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.http [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.http.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.io [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.io.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.security [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.security.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.server [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.server.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.servlet [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.servlet.source [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.util [9.4.5.v20170502,9.4.5.v20170502]
-	org.eclipse.jetty.util.source [9.4.5.v20170502,9.4.5.v20170502]
-}
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/projects/jetty-9.4.8.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/projects/jetty-9.4.8.tpd
new file mode 100644
index 0000000..e37a062
--- /dev/null
+++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/projects/jetty-9.4.8.tpd
@@ -0,0 +1,20 @@
+target "jetty-9.4.8" with source configurePhase
+
+location jetty-9.4.8 "http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.8.v20171121" {
+	org.eclipse.jetty.client [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.client.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.continuation [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.continuation.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.http [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.http.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.io [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.io.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.security [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.security.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.server [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.server.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.servlet [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.servlet.source [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.util [9.4.8.v20171121,9.4.8.v20171121]
+	org.eclipse.jetty.util.source [9.4.8.v20171121,9.4.8.v20171121]
+}
diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml
index 8c04633..e12a212 100644
--- a/org.eclipse.jgit.packaging/pom.xml
+++ b/org.eclipse.jgit.packaging/pom.xml
@@ -53,7 +53,7 @@
 
   <groupId>org.eclipse.jgit</groupId>
   <artifactId>jgit.tycho.parent</artifactId>
-  <version>4.9.9-SNAPSHOT</version>
+  <version>4.10.1-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>JGit Tycho Parent</name>
@@ -120,6 +120,26 @@
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>3.0.0-M1</version>
+        <executions>
+          <execution>
+            <id>enforce-maven</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireMavenVersion>
+                  <version>3.5.2</version>
+                </requireMavenVersion>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>org.eclipse.tycho</groupId>
         <artifactId>tycho-maven-plugin</artifactId>
         <version>${tycho-version}</version>
diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
index f48032c..5518017 100644
--- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF
@@ -1,31 +1,32 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.pgm.test
 Bundle-SymbolicName: org.eclipse.jgit.pgm.test
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.jgit.api;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.api.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.diff;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.dircache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="4.9.9",
- org.eclipse.jgit.junit;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.merge;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.pgm;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.pgm.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.pgm.opt;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util.io;version="[4.9.9,4.10.0)",
+Import-Package: org.eclipse.jgit.api;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.api.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.diff;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.dircache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="4.10.1",
+ org.eclipse.jgit.junit;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.merge;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.pgm;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.pgm.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.pgm.opt;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util.io;version="[4.10.1,4.11.0)",
  org.hamcrest.core;bundle-version="[1.1.0,2.0.0)",
- org.junit;version="[4.11.0,5.0.0)",
- org.junit.rules;version="[4.11.0,5.0.0)",
+ org.junit;version="[4.12,5.0.0)",
+ org.junit.rules;version="[4.12,5.0.0)",
  org.kohsuke.args4j;version="[2.33.0,3.0.0)"
 Require-Bundle: org.tukaani.xz;bundle-version="[1.3.0,2.0.0)"
diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml
index d180157..f4d6171 100644
--- a/org.eclipse.jgit.pgm.test/pom.xml
+++ b/org.eclipse.jgit.pgm.test/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.pgm.test</artifactId>
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java
index 6f32bfa..3b352ce 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java
@@ -43,6 +43,7 @@
 package org.eclipse.jgit.pgm;
 
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeNoException;
 
@@ -635,7 +636,10 @@
 		BufferedInputStream in = new BufferedInputStream(
 				new FileInputStream(file));
 		try {
-			in.skip(offset);
+			if (offset > 0) {
+				long skipped = in.skip(offset);
+				assertEquals(offset, skipped);
+			}
 
 			byte[] actual = new byte[magicBytes.length];
 			in.read(actual);
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java
index a98dd1c..b2115a4 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java
@@ -502,7 +502,8 @@
 	 * <li>Create branch '1'
 	 * <li>Modify file 'a'
 	 * <li>Commit
-	 * <li>Delete file 'a' & replace by folder 'a' in the working tree & index
+	 * <li>Delete file 'a' and replace by folder 'a' in the working tree and
+	 * index
 	 * <li>Checkout branch '1'
 	 * </ol>
 	 * <p>
@@ -555,7 +556,8 @@
 	 * <li>Create branch '1'
 	 * <li>Modify file 'a'
 	 * <li>Commit
-	 * <li>Delete file 'a' & replace by folder 'a' in the working tree & index
+	 * <li>Delete file 'a' and replace by folder 'a' in the working tree and
+	 * index
 	 * <li>Checkout branch '1'
 	 * </ol>
 	 * <p>
diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
index aad2b51..d1e2a3f 100644
--- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.pgm
 Bundle-SymbolicName: org.eclipse.jgit.pgm
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: plugin
@@ -27,49 +28,49 @@
  org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)",
  org.eclipse.jetty.util.thread;version="[9.4.5,10.0.0)",
- org.eclipse.jgit.api;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.api.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.archive;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.awtui;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.blame;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.diff;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.dircache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.gitrepo;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.ketch;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.io;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.pack;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.reftree;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.server;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.server.fs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs.server.s3;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.merge;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.notes;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revplot;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.pack;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http.apache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.resolver;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util.io;version="[4.9.9,4.10.0)",
+ org.eclipse.jgit.api;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.api.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.archive;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.awtui;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.blame;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.diff;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.dircache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.gitrepo;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.ketch;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.io;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.reftree;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.server;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.server.fs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs.server.s3;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.merge;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.notes;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revplot;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.pack;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http.apache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.resolver;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util.io;version="[4.10.1,4.11.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="4.9.9";
+Export-Package: org.eclipse.jgit.console;version="4.10.1";
   uses:="org.eclipse.jgit.transport,
    org.eclipse.jgit.util",
- org.eclipse.jgit.pgm;version="4.9.9";
+ org.eclipse.jgit.pgm;version="4.10.1";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.pgm.opt,
@@ -80,11 +81,11 @@
    org.eclipse.jgit.treewalk,
    javax.swing,
    org.eclipse.jgit.transport",
- org.eclipse.jgit.pgm.debug;version="4.9.9";
+ org.eclipse.jgit.pgm.debug;version="4.10.1";
   uses:="org.eclipse.jgit.util.io,
    org.eclipse.jgit.pgm",
- org.eclipse.jgit.pgm.internal;version="4.9.9";x-friends:="org.eclipse.jgit.pgm.test,org.eclipse.jgit.test",
- org.eclipse.jgit.pgm.opt;version="4.9.9";
+ org.eclipse.jgit.pgm.internal;version="4.10.1";x-friends:="org.eclipse.jgit.pgm.test,org.eclipse.jgit.test",
+ org.eclipse.jgit.pgm.opt;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.kohsuke.args4j.spi,
diff --git a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF
index 06a9af4..7d8d4ba 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: 4.9.9.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="4.9.9.qualifier";roots="."
+Bundle-Version: 4.10.1.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="4.10.1.qualifier";roots="."
diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml
index ea3424d..165733e 100644
--- a/org.eclipse.jgit.pgm/pom.xml
+++ b/org.eclipse.jgit.pgm/pom.xml
@@ -50,7 +50,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-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 8bf451c..06c95d8 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
@@ -58,7 +58,9 @@
  * @since 4.0
  */
 public class ConsoleAuthenticator extends CachedAuthenticator {
-	/** Install this authenticator implementation into the JVM. */
+	/**
+	 * Install this authenticator implementation into the JVM.
+	 */
 	public static void install() {
 		final ConsoleAuthenticator c = new ConsoleAuthenticator();
 		if (c.cons == null)
@@ -69,6 +71,7 @@
 
 	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 0aa0cf4..f8442fa 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
@@ -61,7 +61,9 @@
  * @since 4.0
  */
 public class ConsoleCredentialsProvider extends CredentialsProvider {
-	/** Install this implementation as the default. */
+	/**
+	 * Install this implementation as the default.
+	 */
 	public static void install() {
 		final ConsoleCredentialsProvider c = new ConsoleCredentialsProvider();
 		if (c.cons == null)
@@ -74,11 +76,13 @@
 
 	private final Console cons = System.console();
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -100,6 +104,7 @@
 		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/AbstractFetchCommand.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java
index 08ec096..f0754b1 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java
@@ -66,6 +66,14 @@
 	@Option(name = "--verbose", aliases = { "-v" }, usage = "usage_beMoreVerbose")
 	private boolean verbose;
 
+	/**
+	 * Show fetch result.
+	 *
+	 * @param r
+	 *            a {@link org.eclipse.jgit.transport.FetchResult} object.
+	 * @throws java.io.IOException
+	 *             if any.
+	 */
 	protected void showFetchResult(final FetchResult r) throws IOException {
 		try (ObjectReader reader = db.newObjectReader()) {
 			boolean shownURI = false;
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 3c13590..08a9f48 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
@@ -60,6 +60,7 @@
 	@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 e0a9244..086c976 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
@@ -75,11 +75,13 @@
 	@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 cff0bf6..4721b3a 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
@@ -74,6 +74,7 @@
 	@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 4193254..13a38dd 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
@@ -134,6 +134,7 @@
 
 	private BlameResult blame;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		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 f6e3810..e6685c2 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
@@ -87,6 +87,12 @@
 
 	private List<String> delete;
 
+	/**
+	 * Delete branches
+	 *
+	 * @param names
+	 *            a {@link java.util.List} of branch names.
+	 */
 	@Option(name = "--delete", aliases = {
 			"-d" }, metaVar = "metaVar_branchNames", usage = "usage_deleteFullyMergedBranch", handler = OptionWithValuesListHandler.class)
 	public void delete(List<String> names) {
@@ -98,6 +104,12 @@
 
 	private List<String> deleteForce;
 
+	/**
+	 * Forcefully delete branches
+	 *
+	 * @param names
+	 *            a {@link java.util.List} of branch names.
+	 */
 	@Option(name = "--delete-force", aliases = {
 			"-D" }, metaVar = "metaVar_branchNames", usage = "usage_deleteBranchEvenIfNotMerged", handler = OptionWithValuesListHandler.class)
 	public void deleteForce(List<String> names) {
@@ -107,6 +119,12 @@
 		deleteForce = names;
 	}
 
+	/**
+	 * Forcefully create a list of branches
+	 *
+	 * @param branchAndStartPoint
+	 *            a branch name and a start point
+	 */
 	@Option(name = "--create-force", aliases = {
 			"-f" }, metaVar = "metaVar_branchAndStartPoint", usage = "usage_forceCreateBranchEvenExists", handler = OptionWithValuesListHandler.class)
 	public void createForce(List<String> branchAndStartPoint) {
@@ -125,6 +143,12 @@
 		}
 	}
 
+	/**
+	 * Move or rename a branch
+	 *
+	 * @param currentAndNew
+	 *            the current and the new branch name
+	 */
 	@Option(name = "--move", aliases = {
 			"-m" }, metaVar = "metaVar_oldNewBranchNames", usage = "usage_moveRenameABranch", handler = OptionWithValuesListHandler.class)
 	public void moveRename(List<String> currentAndNew) {
@@ -156,6 +180,7 @@
 
 	private int maxNameLength;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (delete != null || deleteForce != null) {
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 2af1eca..1f80301 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
@@ -80,6 +80,7 @@
 	@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 ce4faf8..6ae078c 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
@@ -62,6 +62,7 @@
 	@Option(name = "--dryRun", aliases = { "-n" })
 	private boolean dryRun = false;
 
+	/** {@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/Clone.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
index a8eb474..393c607 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
@@ -86,11 +86,13 @@
 	@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,6 +150,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void initializedSubmodules(Collection<String> submodules) {
 		try {
@@ -161,6 +164,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void cloningSubmodule(String path) {
 		try {
@@ -172,6 +176,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void checkingOut(AnyObjectId commit, String path) {
 		try {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Command.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Command.java
index 0562416..d7adaf8 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Command.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Command.java
@@ -50,7 +50,7 @@
 import java.lang.annotation.Target;
 
 /**
- * Annotation to document a {@link TextBuiltin}.
+ * Annotation to document a {@link org.eclipse.jgit.pgm.TextBuiltin}.
  * <p>
  * This is an optional annotation for TextBuiltin subclasses and it carries
  * documentation forward into the runtime system describing what the command is
@@ -60,6 +60,8 @@
 @Target( { TYPE })
 public @interface Command {
 	/**
+	 * Get the command name
+	 *
 	 * @return name the command is invoked as from the command line. If the
 	 *         (default) empty string is supplied the name will be generated
 	 *         from the class name.
@@ -67,11 +69,15 @@
 	public String name() default "";
 
 	/**
+	 * Get command description
+	 *
 	 * @return one line description of the command's feature set.
 	 */
 	public String usage() default "";
 
 	/**
+	 * If this command is considered to be commonly used
+	 *
 	 * @return true if this command is considered to be commonly used.
 	 */
 	public boolean common() default false;
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java
index cf4c6e3..7bab692 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CommandCatalog.java
@@ -60,9 +60,10 @@
 /**
  * List of all commands known by jgit's command line tools.
  * <p>
- * Commands are implementations of {@link TextBuiltin}, with an optional
- * {@link Command} class annotation to insert additional documentation or
- * override the default command name (which is guessed from the class name).
+ * Commands are implementations of {@link org.eclipse.jgit.pgm.TextBuiltin},
+ * with an optional {@link org.eclipse.jgit.pgm.Command} class annotation to
+ * insert additional documentation or override the default command name (which
+ * is guessed from the class name).
  * <p>
  * Commands may be registered by adding them to a services file in the same JAR
  * (or classes directory) as the command implementation. The service file name
@@ -90,6 +91,8 @@
 	}
 
 	/**
+	 * Get all commands sorted by their name
+	 *
 	 * @return all known commands, sorted by command name.
 	 */
 	public static CommandRef[] all() {
@@ -97,6 +100,8 @@
 	}
 
 	/**
+	 * Get all common commands sorted by their name
+	 *
 	 * @return all common commands, sorted by command name.
 	 */
 	public static CommandRef[] common() {
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 e5f8532..2c9bc0d 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
@@ -50,7 +50,8 @@
 import org.eclipse.jgit.pgm.internal.CLIText;
 
 /**
- * Description of a command (a {@link TextBuiltin} subclass.
+ * Description of a command (a {@link org.eclipse.jgit.pgm.TextBuiltin}
+ * subclass).
  * <p>
  * These descriptions are lightweight compared to creating a command instance
  * and are therefore suitable for catalogs of "known" commands without linking
@@ -102,6 +103,8 @@
 	}
 
 	/**
+	 * Get the <code>name</code>.
+	 *
 	 * @return name the command is invoked as from the command line.
 	 */
 	public String getName() {
@@ -109,6 +112,8 @@
 	}
 
 	/**
+	 * Get <code>usage</code>.
+	 *
 	 * @return one line description of the command's feature set.
 	 */
 	public String getUsage() {
@@ -116,6 +121,8 @@
 	}
 
 	/**
+	 * Is this command commonly used
+	 *
 	 * @return true if this command is considered to be commonly used.
 	 */
 	public boolean isCommon() {
@@ -123,6 +130,8 @@
 	}
 
 	/**
+	 * Get implementation class name
+	 *
 	 * @return name of the Java class which implements this command.
 	 */
 	public String getImplementationClassName() {
@@ -130,6 +139,8 @@
 	}
 
 	/**
+	 * Get implementation class loader
+	 *
 	 * @return loader for {@link #getImplementationClassName()}.
 	 */
 	public ClassLoader getImplementationClassLoader() {
@@ -137,6 +148,8 @@
 	}
 
 	/**
+	 * Create an instance of the command implementation
+	 *
 	 * @return a new instance of the command implementation.
 	 */
 	public TextBuiltin create() {
@@ -166,6 +179,7 @@
 		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 befc4ec..2e67c02 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
@@ -77,6 +77,7 @@
 	@Argument(metaVar = "metaVar_commitPaths", usage = "usage_CommitPaths")
 	private List<String> paths = new ArrayList<>();
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws NoHeadException, NoMessageException,
 			ConcurrentRefUpdateException, JGitInternalException, Exception {
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 f5c3f9a..f762c0d 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,6 +68,7 @@
 	@Option(name = "--file", aliases = { "-f" }, metaVar = "metaVar_file", usage = "usage_configFile")
 	private File configFile;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (list)
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 51bb979..d0ada67 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
@@ -111,11 +111,13 @@
 	@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 03e2711..f9c1cf5 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
@@ -65,6 +65,7 @@
 	@Option(name = "--match", usage = "usage_Match", metaVar = "metaVar_pattern")
 	private List<String> patterns = 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/Die.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java
index a25f1e9..59de80c 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java
@@ -45,7 +45,8 @@
 package org.eclipse.jgit.pgm;
 
 /**
- * Indicates a {@link TextBuiltin} implementation has failed during execution.
+ * Indicates a {@link org.eclipse.jgit.pgm.TextBuiltin} implementation has
+ * failed during execution.
  * <p>
  * Typically the stack trace for a Die exception is not shown to the user as it
  * may indicate a simple error condition that the end-user can fix on their own,
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 16284d5..ed6f7b4 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
@@ -168,12 +168,14 @@
 
 	// END -- Options shared with Log
 
+	/** {@inheritDoc} */
 	@Override
 	protected void init(final Repository repository, final String gitDir) {
 		super.init(repository, gitDir);
 		diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		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 4432405..5104063 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
@@ -72,6 +72,7 @@
 	@Option(name = "--", metaVar = "metaVar_path", handler = PathTreeFilterHandler.class)
 	private TreeFilter pathFilter = TreeFilter.ALL;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (final 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 f4b7708..bc76372 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
@@ -131,6 +131,7 @@
 	@Argument(index = 1, metaVar = "metaVar_refspec")
 	private List<RefSpec> toget;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (Git git = new Git(db)) {
@@ -164,6 +165,7 @@
 		}
 	}
 
+	/** {@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 7289abb..56172f5 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
@@ -58,6 +58,7 @@
 	@Option(name = "--prune-preserved", usage = "usage_PrunePreserved")
 	private boolean prunePreserved;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		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 7b71575..a081b78 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
@@ -102,6 +102,7 @@
 		frame.getContentPane().add(world);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int walkLoop() throws Exception {
 		graphPane.getCommitList().source(walk);
@@ -113,11 +114,13 @@
 		return graphPane.getCommitList().size();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void show(final 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 22f3be9..2627671 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
@@ -60,6 +60,7 @@
 	@Option(name = "--index-version", usage = "usage_indexFileFormatToCreate")
 	private int indexVersion = -1;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		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 a7bee7f..f880fc2 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
@@ -66,11 +66,13 @@
 	@Argument(index = 0, metaVar = "metaVar_directory")
 	private String directory;
 
+	/** {@inheritDoc} */
 	@Override
 	protected final boolean requiresRepository() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		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 1108ddd..75542d4 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
@@ -184,12 +184,14 @@
 		dateFormatter = new GitDateFormatter(Format.DEFAULT);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void init(final Repository repository, final String gitDir) {
 		super.init(repository, gitDir);
 		diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		diffFmt.setRepository(db);
@@ -237,6 +239,7 @@
 				NoteMap.read(argWalk.getObjectReader(), notesCommit));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void show(final RevCommit c) throws Exception {
 		outw.print(CLIText.get().commitLabel);
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 7a5f3d8..9013ff6 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
@@ -70,6 +70,7 @@
 	@Argument(index = 0, metaVar = "metaVar_uriish", required = true)
 	private String remote;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		LsRemoteCommand command = Git.lsRemoteRepository().setRemote(remote)
@@ -89,6 +90,7 @@
 		}
 	}
 
+	/** {@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 398d305..c57f9f2 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
@@ -70,6 +70,7 @@
 	@Option(name = "--", metaVar = "metaVar_paths", handler = StopOptionHandler.class)
 	private List<String> paths = new ArrayList<>();
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (final 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 9d44dc0..b29b097 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
@@ -80,7 +80,9 @@
 import org.kohsuke.args4j.Option;
 import org.kohsuke.args4j.OptionHandlerFilter;
 
-/** Command line entry point. */
+/**
+ * Command line entry point.
+ */
 public class Main {
 	@Option(name = "--help", usage = "usage_displayThisHelpText", aliases = { "-h" })
 	private boolean help;
@@ -105,7 +107,7 @@
 	private ExecutorService gcExecutor;
 
 	/**
-	 *
+	 * <p>Constructor for Main.</p>
 	 */
 	public Main() {
 		HttpTransport.setConnectionFactory(new HttpClientConnectionFactory());
@@ -129,7 +131,7 @@
 	 *
 	 * @param argv
 	 *            arguments.
-	 * @throws Exception
+	 * @throws java.lang.Exception
 	 */
 	public static void main(final String[] argv) throws Exception {
 		new Main().run(argv);
@@ -150,7 +152,7 @@
 	 *
 	 * @param argv
 	 *            arguments.
-	 * @throws Exception
+	 * @throws java.lang.Exception
 	 */
 	protected void run(final String[] argv) throws Exception {
 		writer = createErrorWriter();
@@ -309,7 +311,7 @@
 	 *            the {@code --git-dir} option given on the command line. May be
 	 *            null if it was not supplied.
 	 * @return the repository to operate on.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be opened.
 	 */
 	protected Repository openGitDir(String aGitdir) throws IOException {
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 1aab748..de059e9 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
@@ -101,6 +101,7 @@
 	@Option(name = "-m", usage = "usage_message")
 	private String message;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		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 975d5de..62a88ae 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
@@ -65,6 +65,7 @@
 	@Argument(index = 1, metaVar = "metaVar_commitish", required = true)
 	private List<RevCommit> commits = new ArrayList<>();
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		for (final RevCommit c : commits)
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 389708e..309dca2 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
@@ -113,6 +113,7 @@
 
 	private boolean shownURI;
 
+	/** {@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/ReceivePack.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/ReceivePack.java
index d7f895a..f3baafb 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
@@ -58,11 +58,13 @@
 	@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() throws Exception {
 		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 86a021d..6f4fcc2 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
@@ -57,6 +57,7 @@
 	@Argument(metaVar = "metaVar_ref")
 	private String ref;
 
+	/** {@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/Remote.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Remote.java
index 24916bd..948cbc5 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
@@ -84,6 +84,7 @@
 	@Argument(index = 2, metaVar = "metaVar_uriish")
 	private String uri;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (Git git = new Git(db)) {
@@ -143,6 +144,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void printUsage(final String message, final 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 bec5003..f557211 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
@@ -58,6 +58,7 @@
 	@Argument(required = true, metaVar = "metaVar_path", usage = "usage_pathToXml")
 	private String path;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		new RepoCommand(db)
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 4c19883..f84c848 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
@@ -72,6 +72,7 @@
 	@Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
 	private List<String> paths = 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/RevList.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevList.java
index 4420abe..8c88a5c 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
@@ -51,6 +51,7 @@
 
 @Command(usage = "usage_RevList")
 class RevList extends RevWalkTextBuiltin {
+	/** {@inheritDoc} */
 	@Override
 	protected void show(final RevCommit c) throws Exception {
 		if (c.has(RevFlag.UNINTERESTING))
@@ -64,6 +65,7 @@
 		outw.println();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void show(final ObjectWalk ow, final 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 2157034..21adf73 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
@@ -70,6 +70,7 @@
 	@Argument(index = 0, metaVar = "metaVar_commitish")
 	private List<ObjectId> commits = new ArrayList<>();
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (all) {
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 6b0744d..3fc9101 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
@@ -149,6 +149,7 @@
 	@Option(name = "--max-count", aliases = "-n", metaVar = "metaVar_n")
 	private int maxCount = -1;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		walk = createWalk();
@@ -210,6 +211,11 @@
 		}
 	}
 
+	/**
+	 * Create RevWalk
+	 *
+	 * @return a {@link org.eclipse.jgit.revwalk.RevWalk} object.
+	 */
 	protected RevWalk createWalk() {
 		RevWalk result;
 		if (objects)
@@ -222,6 +228,13 @@
 		return result;
 	}
 
+	/**
+	 * Loop the walk
+	 *
+	 * @return number of RevCommits walked
+	 * @throws java.lang.Exception
+	 *             if any.
+	 */
 	protected int walkLoop() throws Exception {
 		int n = 0;
 		for (final RevCommit c : walk) {
@@ -248,8 +261,8 @@
 	 * RevWalkTextBuiltin.
 	 *
 	 * @param c
-	 *            The current {@link RevCommit}
-	 * @throws Exception
+	 *            The current {@link org.eclipse.jgit.revwalk.RevCommit}
+	 * @throws java.lang.Exception
 	 */
 	protected abstract void show(final RevCommit c) throws Exception;
 
@@ -260,10 +273,11 @@
 	 * process RevCommits.
 	 *
 	 * @param objectWalk
-	 *            the {@link ObjectWalk} used by {@link #walkLoop()}
+	 *            the {@link org.eclipse.jgit.revwalk.ObjectWalk} used by
+	 *            {@link #walkLoop()}
 	 * @param currentObject
-	 *            The current {@link RevObject}
-	 * @throws Exception
+	 *            The current {@link org.eclipse.jgit.revwalk.RevObject}
+	 * @throws java.lang.Exception
 	 */
 	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 32a5631..f591610 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
@@ -59,6 +59,7 @@
 	@Option(name = "--", handler = StopOptionHandler.class)
 	private List<String> paths = 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/Show.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
index 5eda36f..de04045 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
@@ -165,12 +165,14 @@
 		fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy ZZZZZ", Locale.US); //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void init(final Repository repository, final String gitDir) {
 		super.init(repository, gitDir);
 		diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("boxing")
 	@Override
 	protected void run() throws Exception {
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 e9d9df6..7b59d43 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
@@ -58,6 +58,7 @@
 
 @Command(usage = "usage_ShowRef")
 class ShowRef extends TextBuiltin {
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		for (final Ref r : getSortedRefs()) {
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 adcfea4..fb2fd7e 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
@@ -86,6 +86,7 @@
 	@Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
 	protected List<String> filterPaths;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (Git git = new Git(db)) {
@@ -261,6 +262,15 @@
 		}
 	}
 
+	/**
+	 * Print section header
+	 *
+	 * @param pattern
+	 *            a {@link java.lang.String} object.
+	 * @param arguments
+	 *            a {@link java.lang.Object} object.
+	 * @throws java.io.IOException
+	 */
 	protected void printSectionHeader(String pattern, Object... arguments)
 			throws IOException {
 		if (!porcelain) {
@@ -272,6 +282,14 @@
 		}
 	}
 
+	/**
+	 * Print String list
+	 *
+	 * @param list
+	 *            a {@link java.util.Collection} object.
+	 * @return a int.
+	 * @throws java.io.IOException
+	 */
 	protected int printList(Collection<String> list) throws IOException {
 		if (!list.isEmpty()) {
 			List<String> sortedList = new ArrayList<>(list);
@@ -286,10 +304,30 @@
 			return 0;
 	}
 
+	/**
+	 * Print String list
+	 *
+	 * @param status1
+	 *            a {@link java.lang.String} object.
+	 * @param status2
+	 *            a {@link java.lang.String} object.
+	 * @param status3
+	 *            a {@link java.lang.String} object.
+	 * @param list
+	 *            a {@link java.util.Collection} object.
+	 * @param set1
+	 *            a {@link java.util.Collection} object.
+	 * @param set2
+	 *            a {@link java.util.Collection} object.
+	 * @param set3
+	 *            a {@link java.util.Collection} object.
+	 * @return a int.
+	 * @throws java.io.IOException
+	 */
 	protected int printList(String status1, String status2, String status3,
 			Collection<String> list, Collection<String> set1,
 			Collection<String> set2,
-			@SuppressWarnings("unused") Collection<String> set3)
+			Collection<String> set3)
 			throws IOException {
 		List<String> sortedList = new ArrayList<>(list);
 		java.util.Collections.sort(sortedList);
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 dc4b037..43c1f54 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
@@ -80,6 +80,7 @@
 	@Argument(index = 1, metaVar = "metaVar_object")
 	private ObjectId object;
 
+	/** {@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/TextBuiltin.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
index c3b45e8..bc3755d 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
@@ -133,7 +133,11 @@
 		commandName = name;
 	}
 
-	/** @return true if {@link #db}/{@link #getRepository()} is required. */
+	/**
+	 * If this command requires a repository.
+	 *
+	 * @return true if {@link #db}/{@link #getRepository()} is required
+	 */
 	protected boolean requiresRepository() {
 		return true;
 	}
@@ -214,7 +218,7 @@
 	 *
 	 * @param args
 	 *            command line arguments passed after the command name.
-	 * @throws Exception
+	 * @throws java.lang.Exception
 	 *             an error occurred while processing the command. The main
 	 *             framework will catch the exception and print a message on
 	 *             standard error.
@@ -233,7 +237,7 @@
 	 *
 	 * @param args
 	 *            the arguments supplied on the command line, if any.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void parseArguments(final String[] args) throws IOException {
 		final CmdLineParser clp = new CmdLineParser(this);
@@ -260,7 +264,8 @@
 	 * Print the usage line
 	 *
 	 * @param clp
-	 * @throws IOException
+	 *            a {@link org.eclipse.jgit.pgm.opt.CmdLineParser} object.
+	 * @throws java.io.IOException
 	 */
 	public void printUsageAndExit(final CmdLineParser clp) throws IOException {
 		printUsageAndExit("", clp); //$NON-NLS-1$
@@ -270,8 +275,10 @@
 	 * Print an error message and the usage line
 	 *
 	 * @param message
+	 *            a {@link java.lang.String} object.
 	 * @param clp
-	 * @throws IOException
+	 *            a {@link org.eclipse.jgit.pgm.opt.CmdLineParser} object.
+	 * @throws java.io.IOException
 	 */
 	public void printUsageAndExit(final String message, final CmdLineParser clp) throws IOException {
 		printUsage(message, clp);
@@ -279,11 +286,13 @@
 	}
 
 	/**
+	 * Print usage help text.
+	 *
 	 * @param message
 	 *            non null
 	 * @param clp
 	 *            parser used to print options
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	protected void printUsage(final String message, final CmdLineParser clp)
@@ -302,6 +311,8 @@
 	}
 
 	/**
+	 * Get error writer
+	 *
 	 * @return error writer, typically this is standard error.
 	 * @since 4.2
 	 */
@@ -310,6 +321,8 @@
 	}
 
 	/**
+	 * Get output writer
+	 *
 	 * @return output writer, typically this is standard output.
 	 * @since 4.9
 	 */
@@ -318,6 +331,8 @@
 	}
 
 	/**
+	 * Get resource bundle with localized texts
+	 *
 	 * @return the resource bundle that will be passed to args4j for purpose of
 	 *         string localization
 	 */
@@ -330,7 +345,7 @@
 	 * <p>
 	 * This method should only be invoked by {@link #execute(String[])}.
 	 *
-	 * @throws Exception
+	 * @throws java.lang.Exception
 	 *             an error occurred while processing the command. The main
 	 *             framework will catch the exception and print a message on
 	 *             standard error.
@@ -338,6 +353,8 @@
 	protected abstract void run() throws Exception;
 
 	/**
+	 * Get the repository
+	 *
 	 * @return the repository this command accesses.
 	 */
 	public Repository getRepository() {
@@ -352,6 +369,8 @@
 	}
 
 	/**
+	 * Exit the command with an error message
+	 *
 	 * @param why
 	 *            textual explanation
 	 * @return a runtime exception the caller is expected to throw
@@ -361,6 +380,8 @@
 	}
 
 	/**
+	 * Exit the command with an error message and an exception
+	 *
 	 * @param why
 	 *            textual explanation
 	 * @param cause
@@ -372,8 +393,11 @@
 	}
 
 	/**
+	 * Exit the command
+	 *
 	 * @param aborted
-	 *            boolean indicating that the execution has been aborted before running
+	 *            boolean indicating that the execution has been aborted before
+	 *            running
 	 * @return a runtime exception the caller is expected to throw
 	 * @since 3.4
 	 */
@@ -382,6 +406,8 @@
 	}
 
 	/**
+	 * Exit the command
+	 *
 	 * @param aborted
 	 *            boolean indicating that the execution has been aborted before
 	 *            running
@@ -405,6 +431,8 @@
 	}
 
 	/**
+	 * Check if the arguments contain a help option
+	 *
 	 * @param args
 	 *            non null
 	 * @return true if the given array contains help option
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 447374d..5d032d2 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
@@ -62,11 +62,13 @@
 	@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() throws Exception {
 		final org.eclipse.jgit.transport.UploadPack up;
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 6bed9c6..5efc03b 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
@@ -55,6 +55,7 @@
 
 @Command(common = true, usage = "usage_DisplayTheVersionOfJgit")
 class Version extends TextBuiltin {
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		// read the Implementation-Version from Manifest
@@ -73,6 +74,7 @@
 		outw.println(MessageFormat.format(CLIText.get().jgitVersion, version));
 	}
 
+	/** {@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 71c8db8..248eaac 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
@@ -95,6 +95,7 @@
 	@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 8de57e3..5f8ebdb 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
@@ -130,11 +130,13 @@
 
 	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 9dc4721..973b0d7 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
@@ -214,11 +214,13 @@
 
 	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 d3a0a3e..127e541 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
@@ -57,6 +57,7 @@
 
 @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/ReadDirCache.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ReadDirCache.java
index 07bfc4b..0194cca 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
@@ -54,6 +54,7 @@
 
 @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 9b8db3e..fda1901 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
@@ -63,6 +63,7 @@
 	@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 da602d0..2e41eec 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
@@ -114,6 +114,7 @@
 
 	private Map<ObjectId, ObjectId> rewrites = new HashMap<>();
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		if (!really && !db.getRefDatabase().getRefs(ALL).isEmpty()) {
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildRefTree.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildRefTree.java
index 8cde513..3172483 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildRefTree.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildRefTree.java
@@ -73,6 +73,7 @@
 	private String txnNamespace;
 	private String txnCommitted;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		try (ObjectReader reader = db.newObjectReader();
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 e287425..20fa4a3 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
@@ -57,6 +57,7 @@
 
 @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 415c7d3..a960ec6 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
@@ -59,6 +59,7 @@
 	@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 bb4f73d..7f99d76 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
@@ -64,6 +64,7 @@
 	@Option(name = "--millis", aliases = { "-m" }, usage = "usage_showTimeInMilliseconds")
 	private boolean millis = false;
 
+	/** {@inheritDoc} */
 	@Override
 	protected void run() throws Exception {
 		final SimpleDateFormat fmt;
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 150fe6e..bbc1b0f 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
@@ -72,6 +72,7 @@
 	@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 ce58201..83b7bce 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
@@ -262,11 +262,13 @@
 	@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 dffb579..b38de14 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
@@ -75,6 +75,7 @@
 	@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 42428c7..d3b0005 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
@@ -51,6 +51,7 @@
 
 @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 76ffa19..6cbc1b0 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
@@ -104,6 +104,7 @@
 	@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/internal/CLIText.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java
index dfb489d..b3ad8bf 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java
@@ -79,6 +79,8 @@
 	}
 
 	/**
+	 * Format text
+	 *
 	 * @param text
 	 *            the text to format.
 	 * @return a new Format instance.
@@ -88,6 +90,8 @@
 	}
 
 	/**
+	 * Get an instance of this translation bundle
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static CLIText get() {
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 587f98c..6fe7927 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
@@ -68,7 +68,8 @@
 import org.kohsuke.args4j.spi.Setter;
 
 /**
- * Custom argument handler {@link AbstractTreeIterator} from string values.
+ * Custom argument handler
+ * {@link org.eclipse.jgit.treewalk.AbstractTreeIterator} from string values.
  * <p>
  * Assumes the parser has been initialized with a Repository.
  */
@@ -82,8 +83,11 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public AbstractTreeIteratorHandler(final CmdLineParser parser,
 			final OptionDef option,
@@ -92,6 +96,7 @@
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -144,6 +149,7 @@
 		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 3dcb2a3..e071bdf 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
@@ -61,11 +61,9 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.transport.RefSpec;
 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
-import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.CmdLineException;
 import org.kohsuke.args4j.IllegalAnnotationError;
 import org.kohsuke.args4j.NamedOptionDef;
-import org.kohsuke.args4j.Option;
 import org.kohsuke.args4j.OptionDef;
 import org.kohsuke.args4j.OptionHandlerRegistry;
 import org.kohsuke.args4j.spi.OptionHandler;
@@ -105,9 +103,10 @@
 	 * them into the given object.
 	 *
 	 * @param bean
-	 *            instance of a class annotated by {@link Option} and
-	 *            {@link Argument}. this object will receive values.
-	 *
+	 *            instance of a class annotated by
+	 *            {@link org.kohsuke.args4j.Option} and
+	 *            {@link org.kohsuke.args4j.Argument}. this object will receive
+	 *            values.
 	 * @throws IllegalAnnotationError
 	 *             if the option bean class is using args4j annotations
 	 *             incorrectly.
@@ -121,8 +120,10 @@
 	 * them into the given object.
 	 *
 	 * @param bean
-	 *            instance of a class annotated by {@link Option} and
-	 *            {@link Argument}. this object will receive values.
+	 *            instance of a class annotated by
+	 *            {@link org.kohsuke.args4j.Option} and
+	 *            {@link org.kohsuke.args4j.Argument}. this object will receive
+	 *            values.
 	 * @param repo
 	 *            repository this parser can translate options through.
 	 * @throws IllegalAnnotationError
@@ -140,6 +141,7 @@
 		this.db = repo;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void parseArgument(final String... args) throws CmdLineException {
 		final ArrayList<String> tmp = new ArrayList<>(args.length);
@@ -223,6 +225,8 @@
 	}
 
 	/**
+	 * Check if array contains help option
+	 *
 	 * @param args
 	 *            non null
 	 * @return true if the given array contains help option
@@ -292,6 +296,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected OptionHandler createOptionHandler(OptionDef o, Setter setter) {
 		if (o instanceof NamedOptionDef)
@@ -301,6 +306,7 @@
 
 	}
 
+	/** {@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/ObjectIdHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/ObjectIdHandler.java
index 74bab2d..0e5b0f5 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
@@ -56,7 +56,8 @@
 import org.kohsuke.args4j.spi.Setter;
 
 /**
- * Custom argument handler {@link ObjectId} from string values.
+ * Custom argument handler {@link org.eclipse.jgit.lib.ObjectId} from string
+ * values.
  * <p>
  * Assumes the parser has been initialized with a Repository.
  */
@@ -69,8 +70,11 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public ObjectIdHandler(final CmdLineParser parser, final OptionDef option,
 			final Setter<? super ObjectId> setter) {
@@ -78,6 +82,7 @@
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -96,6 +101,7 @@
 				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 3de7a81..7d7c806 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
@@ -19,15 +19,21 @@
 public class OptionWithValuesListHandler extends OptionHandler<List<?>> {
 
 	/**
+	 * Constructor for OptionWithValuesListHandler.
+	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public OptionWithValuesListHandler(CmdLineParser parser,
 			OptionDef option, Setter<List<?>> setter) {
 		super(parser, option, setter);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		final List<String> list = new ArrayList<>();
@@ -44,6 +50,7 @@
 		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 b873c3d..33d669c 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
@@ -52,17 +52,17 @@
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.kohsuke.args4j.CmdLineException;
 import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
 import org.kohsuke.args4j.OptionDef;
 import org.kohsuke.args4j.spi.OptionHandler;
 import org.kohsuke.args4j.spi.Parameters;
 import org.kohsuke.args4j.spi.Setter;
 
 /**
- * Create a {@link TreeFilter} to patch math names.
+ * Create a {@link org.eclipse.jgit.treewalk.filter.TreeFilter} to patch math
+ * names.
  * <p>
  * This handler consumes all arguments to the end of the command line, and is
- * meant to be used on an {@link Option} of name "--".
+ * meant to be used on an {@link org.kohsuke.args4j.Option} of name "--".
  */
 public class PathTreeFilterHandler extends OptionHandler<TreeFilter> {
 	/**
@@ -71,14 +71,18 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public PathTreeFilterHandler(final CmdLineParser parser,
 			final OptionDef option, final Setter<? super TreeFilter> setter) {
 		super(parser, option, setter);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final Parameters params) throws CmdLineException {
 		final List<PathFilter> filters = new ArrayList<>();
@@ -102,6 +106,7 @@
 		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 f50c7ad..dd8520a 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
@@ -53,7 +53,8 @@
 import org.kohsuke.args4j.spi.Setter;
 
 /**
- * Custom argument handler {@link RefSpec} from string values.
+ * Custom argument handler {@link org.eclipse.jgit.transport.RefSpec} from
+ * string values.
  * <p>
  * Assumes the parser has been initialized with a Repository.
  */
@@ -64,20 +65,25 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public RefSpecHandler(final CmdLineParser parser, final OptionDef option,
 			final Setter<? super RefSpec> setter) {
 		super(parser, option, setter);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final 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 27555e3..d2fa764 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
@@ -60,7 +60,8 @@
 import org.kohsuke.args4j.spi.Setter;
 
 /**
- * Custom argument handler {@link RevCommit} from string values.
+ * Custom argument handler {@link org.eclipse.jgit.revwalk.RevCommit} from
+ * string values.
  * <p>
  * Assumes the parser has been initialized with a Repository.
  */
@@ -73,8 +74,11 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public RevCommitHandler(final CmdLineParser parser, final OptionDef option,
 			final Setter<? super RevCommit> setter) {
@@ -82,6 +86,7 @@
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final Parameters params) throws CmdLineException {
 		String name = params.getParameter(0);
@@ -145,6 +150,7 @@
 		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 15ed589..9444363 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
@@ -59,7 +59,8 @@
 import org.kohsuke.args4j.spi.Setter;
 
 /**
- * Custom argument handler {@link RevTree} from string values.
+ * Custom argument handler {@link org.eclipse.jgit.revwalk.RevTree} from string
+ * values.
  * <p>
  * Assumes the parser has been initialized with a Repository.
  */
@@ -72,8 +73,11 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public RevTreeHandler(final CmdLineParser parser, final OptionDef option,
 			final Setter<? super RevTree> setter) {
@@ -81,6 +85,7 @@
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -112,6 +117,7 @@
 		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 ae5263f..d60071f 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
@@ -57,8 +57,9 @@
 /**
  * Custom Argument handler for jgit command selection.
  * <p>
- * Translates a single argument string to a {@link TextBuiltin} instance which
- * we can execute at runtime with the remaining arguments of the parser.
+ * Translates a single argument string to a
+ * {@link org.eclipse.jgit.pgm.TextBuiltin} instance which we can execute at
+ * runtime with the remaining arguments of the parser.
  */
 public class SubcommandHandler extends OptionHandler<TextBuiltin> {
 	private final org.eclipse.jgit.pgm.opt.CmdLineParser clp;
@@ -69,8 +70,11 @@
 	 * This constructor is used only by args4j.
 	 *
 	 * @param parser
+	 *            a {@link org.kohsuke.args4j.CmdLineParser} object.
 	 * @param option
+	 *            a {@link org.kohsuke.args4j.OptionDef} object.
 	 * @param setter
+	 *            a {@link org.kohsuke.args4j.spi.Setter} object.
 	 */
 	public SubcommandHandler(final CmdLineParser parser,
 			final OptionDef option, final Setter<? super TextBuiltin> setter) {
@@ -78,6 +82,7 @@
 		clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(final Parameters params) throws CmdLineException {
 		final String name = params.getParameter(0);
@@ -95,6 +100,7 @@
 		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 e22b2e4..2487a92 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
@@ -71,6 +71,8 @@
 public class UntrackedFilesHandler extends StringOptionHandler {
 
 	/**
+	 * <p>Constructor for UntrackedFilesHandler.</p>
+	 *
 	 * @param parser
 	 *            The parser to which this handler belongs to.
 	 * @param option
@@ -83,6 +85,7 @@
 		super(parser, option, setter);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int parseArguments(Parameters params) throws CmdLineException {
 		String alias = params.getParameter(-1);
diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
index 4e064f8..c215c90 100644
--- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF
@@ -1,64 +1,65 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.test
 Bundle-SymbolicName: org.eclipse.jgit.test
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
  com.jcraft.jsch;version="[0.1.54,0.2.0)",
- org.eclipse.jgit.api;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.api.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.attributes;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.awtui;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.blame;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.diff;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.dircache;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.events;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.fnmatch;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.gitrepo;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.hooks;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.ignore;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.ignore.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.fsck;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.dfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.io;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.pack;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.reftable;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.internal.storage.reftree;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.junit;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lfs;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.merge;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.notes;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.patch;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.pgm;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.pgm.internal;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revplot;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.file;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.storage.pack;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.submodule;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.http;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport.resolver;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.treewalk.filter;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util.io;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util.sha1;version="[4.9.9,4.10.0)",
- org.junit;version="[4.4.0,5.0.0)",
- org.junit.experimental.theories;version="[4.4.0,5.0.0)",
- org.junit.rules;version="[4.11.0,5.0.0)",
- org.junit.runner;version="[4.4.0,5.0.0)",
- org.junit.runners;version="[4.11.0,5.0.0)",
+ org.eclipse.jgit.api;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.api.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.attributes;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.awtui;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.blame;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.diff;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.dircache;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.events;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.fnmatch;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.gitrepo;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.hooks;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.ignore;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.ignore.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.fsck;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.dfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.io;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.pack;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.reftable;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.internal.storage.reftree;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.junit;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lfs;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.merge;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.notes;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.patch;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.pgm;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.pgm.internal;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revplot;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.file;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.storage.pack;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.submodule;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.http;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport.resolver;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.treewalk.filter;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util.io;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util.sha1;version="[4.10.1,4.11.0)",
+ org.junit;version="[4.12,5.0.0)",
+ org.junit.experimental.theories;version="[4.12,5.0.0)",
+ org.junit.rules;version="[4.12,5.0.0)",
+ org.junit.runner;version="[4.12,5.0.0)",
+ org.junit.runners;version="[4.12,5.0.0)",
  org.slf4j;version="[1.7.2,2.0.0)"
 Require-Bundle: org.hamcrest.core;bundle-version="[1.1.0,2.0.0)",
  org.hamcrest.library;bundle-version="[1.1.0,2.0.0)"
diff --git a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/ignore/CGitVsJGitRandomIgnorePatternTest.java b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/ignore/CGitVsJGitRandomIgnorePatternTest.java
index db5f1b2..03b34ac 100644
--- a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/ignore/CGitVsJGitRandomIgnorePatternTest.java
+++ b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/ignore/CGitVsJGitRandomIgnorePatternTest.java
@@ -42,13 +42,14 @@
  */
 package org.eclipse.jgit.ignore;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.nio.file.Files;
 import java.nio.file.StandardOpenOption;
 import java.util.Arrays;
@@ -56,6 +57,7 @@
 import java.util.Random;
 
 import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.util.FileUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -152,13 +154,11 @@
 
 		private String pattern;
 
-		public CGitIgnoreRule(File gitDir, String pattern)
-				throws UnsupportedEncodingException, IOException {
+		public CGitIgnoreRule(File gitDir, String pattern) throws IOException {
 			this.gitDir = gitDir;
 			this.pattern = pattern;
-			Files.write(new File(gitDir, ".gitignore").toPath(),
-					(pattern + "\n").getBytes("UTF-8"),
-					StandardOpenOption.CREATE,
+			Files.write(FileUtils.toPath(new File(gitDir, ".gitignore")),
+					(pattern + "\n").getBytes(UTF_8), StandardOpenOption.CREATE,
 					StandardOpenOption.TRUNCATE_EXISTING,
 					StandardOpenOption.WRITE);
 		}
@@ -188,7 +188,7 @@
 			Process proc = Runtime.getRuntime().exec(command, new String[0],
 					gitDir);
 			OutputStream out = proc.getOutputStream();
-			out.write((path + "\n").getBytes("UTF-8"));
+			out.write((path + "\n").getBytes(UTF_8));
 			out.flush();
 			out.close();
 			return proc;
diff --git a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java
index 7c0ea44..586505c 100644
--- a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java
+++ b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.patch;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -218,7 +219,7 @@
 					commitId = line.substring("commit ".length());
 					buf = new TemporaryBuffer.LocalFile(null);
 				} else if (buf != null) {
-					buf.write(line.getBytes("ISO-8859-1"));
+					buf.write(line.getBytes(ISO_8859_1));
 					buf.write('\n');
 				}
 			}
diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml
index 5b39d5e..900af56 100644
--- a/org.eclipse.jgit.test/pom.xml
+++ b/org.eclipse.jgit.test/pom.xml
@@ -52,7 +52,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.test</artifactId>
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitOnlyTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitOnlyTest.java
index 5f7434b..cc21b47 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitOnlyTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitOnlyTest.java
@@ -70,19 +70,19 @@
  * ---------------------------------------------------------------------
  *        | HEAD  DirCache  Worktree | HEAD  DirCache
  * ---------------------------------------------------------------------
- *  f1_1  |  -       -       c       |                => e: path unknown
- *  f1_2  |  -       c       -       |                => no changes
+ *  f1_1  |  -       -       c       |                =&gt; e: path unknown
+ *  f1_2  |  -       c       -       |                =&gt; no changes
  *  f1_3  |  c       -       -       |  -       -
  *  f1_4  |  -       c       c       |  c       c
  *  f1_5  |  c       c       -       |  -       -
- *  f1_6  |  c       -       c       |                => no changes
- *  f1_7  |  c       c       c       |                => no changes
+ *  f1_6  |  c       -       c       |                =&gt; no changes
+ *  f1_7  |  c       c       c       |                =&gt; no changes
  * ---------------------------------------------------------------------
  *  f1_8  |  -       c       c'      |  c'      c'
  *  f1_9  |  c       -       c'      |  c'      c'
  * f1_10  |  c       c'      -       |  -       -
  * f1_11  |  c       c       c'      |  c'      c'
- * f1_12  |  c       c'      c       |                => no changes
+ * f1_12  |  c       c'      c       |                =&gt; no changes
  * f1_13  |  c       c'      c'      |  c'      c'
  * ---------------------------------------------------------------------
  * f1_14  |  c       c'      c''     |  c''     c''
@@ -97,7 +97,7 @@
  * ---------------------------------------------------------------------------
  *              | HEAD  DirCache  Worktree | HEAD  DirCache
  * ---------------------------------------------------------------------------
- *  f1_1_f2_14  |  -       -       c       |                => e: path unknown
+ *  f1_1_f2_14  |  -       -       c       |                =&gt; e: path unknown
  *  f1_2_f2_14  |  -       c       -       |  -       -
  *  f1_6_f2_14  |  c       -       c       |  c       c
  *  f1_7_f2_14  |  c       c       c       |  c       c
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java
index 6a66783..d78a328 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java
@@ -158,9 +158,9 @@
 	 * Make sure it finds a tag when not all ancestries include a tag.
 	 *
 	 * <pre>
-	 * c1 -+-> T  -
+	 * c1 -+-&gt; T  -
 	 *     |       |
-	 *     +-> c3 -+-> c4
+	 *     +-&gt; c3 -+-&gt; c4
 	 * </pre>
 	 *
 	 * @throws Exception
@@ -193,9 +193,9 @@
 	 * When t2 dominates t1, it's clearly preferable to describe by using t2.
 	 *
 	 * <pre>
-	 * t1 -+-> t2  -
+	 * t1 -+-&gt; t2  -
 	 *     |       |
-	 *     +-> c3 -+-> c4
+	 *     +-&gt; c3 -+-&gt; c4
 	 * </pre>
 	 *
 	 * @throws Exception
@@ -225,9 +225,9 @@
 	 * When t1 is nearer than t2, t2 should be found
 	 *
 	 * <pre>
-	 * c1 -+-> c2 -> t1 -+
+	 * c1 -+-&gt; c2 -&gt; t1 -+
 	 *     |             |
-	 *     +-> t2 -> c3 -+-> c4
+	 *     +-&gt; t2 -&gt; c3 -+-&gt; c4
 	 * </pre>
 	 *
 	 * @throws Exception
@@ -254,9 +254,9 @@
 	 * paths
 	 *
 	 * <pre>
-	 * c1 -+-> t1 -> c2 -+
+	 * c1 -+-&gt; t1 -&gt; c2 -+
 	 *     |             |
-	 *     +-> t2 -> c3 -+-> c4
+	 *     +-&gt; t2 -&gt; c3 -+-&gt; c4
 	 * </pre>
 	 *
 	 * @throws Exception
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/EolStreamTypeUtilTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/EolStreamTypeUtilTest.java
index 2ee77a0..1e3a39a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/EolStreamTypeUtilTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/EolStreamTypeUtilTest.java
@@ -42,6 +42,7 @@
 
 package org.eclipse.jgit.api;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.lib.CoreConfig.EolStreamType.AUTO_CRLF;
 import static org.eclipse.jgit.lib.CoreConfig.EolStreamType.AUTO_LF;
 import static org.eclipse.jgit.lib.CoreConfig.EolStreamType.DIRECT;
@@ -53,7 +54,6 @@
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
 import org.eclipse.jgit.lib.CoreConfig.EolStreamType;
@@ -150,9 +150,8 @@
 			EolStreamType streamTypeWithBinaryCheck, String output,
 			String expectedConversion) throws Exception {
 		ByteArrayOutputStream b;
-		byte[] outputBytes = output.getBytes(StandardCharsets.UTF_8);
-		byte[] expectedConversionBytes = expectedConversion
-				.getBytes(StandardCharsets.UTF_8);
+		byte[] outputBytes = output.getBytes(UTF_8);
+		byte[] expectedConversionBytes = expectedConversion.getBytes(UTF_8);
 
 		// test using output text and assuming it was declared TEXT
 		b = new ByteArrayOutputStream();
@@ -278,9 +277,8 @@
 	private void testCheckin(EolStreamType streamTypeText,
 			EolStreamType streamTypeWithBinaryCheck, String input,
 			String expectedConversion) throws Exception {
-		byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
-		byte[] expectedConversionBytes = expectedConversion
-				.getBytes(StandardCharsets.UTF_8);
+		byte[] inputBytes = input.getBytes(UTF_8);
+		byte[] expectedConversionBytes = expectedConversion.getBytes(UTF_8);
 
 		// test using input text and assuming it was declared TEXT
 		try (InputStream in = EolStreamTypeUtil.wrapInputStream(
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java
index a341284..cc5a024 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandTest.java
@@ -42,6 +42,7 @@
  */
 package org.eclipse.jgit.api;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -593,7 +594,7 @@
 		FileOutputStream fos = null;
 		try {
 			fos = new FileOutputStream(actFile);
-			fos.write(string.getBytes("UTF-8"));
+			fos.write(string.getBytes(UTF_8));
 			fos.close();
 		} finally {
 			if (fos != null)
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java
index 6f6b115..dfe05b8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java
@@ -42,6 +42,7 @@
  */
 package org.eclipse.jgit.api;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -397,7 +398,7 @@
 		FileOutputStream fos = null;
 		try {
 			fos = new FileOutputStream(actFile);
-			fos.write(string.getBytes("UTF-8"));
+			fos.write(string.getBytes(UTF_8));
 			fos.close();
 		} finally {
 			if (fos != null)
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
index 0cc0816..3f43c6b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
@@ -42,6 +42,7 @@
  */
 package org.eclipse.jgit.api;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -1463,7 +1464,7 @@
 		assertEquals("GIT_AUTHOR_DATE='@123456789 -0100'", lines[2]);
 
 		PersonIdent parsedIdent = git.rebase().parseAuthor(
-				convertedAuthor.getBytes("UTF-8"));
+				convertedAuthor.getBytes(UTF_8));
 		assertEquals(ident.getName(), parsedIdent.getName());
 		assertEquals(ident.getEmailAddress(), parsedIdent.getEmailAddress());
 		// this is rounded to the last second
@@ -1480,7 +1481,7 @@
 		assertEquals("GIT_AUTHOR_DATE='@123456789 +0930'", lines[2]);
 
 		parsedIdent = git.rebase().parseAuthor(
-				convertedAuthor.getBytes("UTF-8"));
+				convertedAuthor.getBytes(UTF_8));
 		assertEquals(ident.getName(), parsedIdent.getName());
 		assertEquals(ident.getEmailAddress(), parsedIdent.getEmailAddress());
 		assertEquals(123456789000L, parsedIdent.getWhen().getTime());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesMatcherTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesMatcherTest.java
index 72cc1d1..196c4f7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesMatcherTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesMatcherTest.java
@@ -424,7 +424,7 @@
 	 * @param target
 	 *            Target file path relative to repository's GIT_DIR
 	 */
-	public void assertMatched(String pattern, String target) {
+	private void assertMatched(String pattern, String target) {
 		boolean value = match(pattern, target);
 		assertTrue("Expected a match for: " + pattern + " with: " + target,
 				value);
@@ -439,7 +439,7 @@
 	 * @param target
 	 *            Target file path relative to repository's GIT_DIR
 	 */
-	public void assertNotMatched(String pattern, String target) {
+	private void assertNotMatched(String pattern, String target) {
 		boolean value = match(pattern, target);
 		assertFalse("Expected no match for: " + pattern + " with: " + target,
 				value);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java
index 4130b7e..0f13a68 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/AbstractDiffTestCase.java
@@ -43,11 +43,10 @@
 
 package org.eclipse.jgit.diff;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import java.io.UnsupportedEncodingException;
-
 import org.junit.Test;
 
 public abstract class AbstractDiffTestCase {
@@ -241,10 +240,6 @@
 			r.append(text.charAt(i));
 			r.append('\n');
 		}
-		try {
-			return new RawText(r.toString().getBytes("UTF-8"));
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
+		return new RawText(r.toString().getBytes(UTF_8));
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditListTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditListTest.java
index d6a5dcd..70447c7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditListTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditListTest.java
@@ -53,6 +53,7 @@
 import org.junit.Test;
 
 public class EditListTest {
+	@SuppressWarnings("unlikely-arg-type")
 	@Test
 	public void testEmpty() {
 		final EditList l = new EditList();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java
index 1a0c39e..c621a7f 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java
@@ -125,6 +125,7 @@
 		assertEquals("REPLACE(1-2,1-4)", e.toString());
 	}
 
+	@SuppressWarnings("unlikely-arg-type")
 	@Test
 	public void testEquals1() {
 		final Edit e1 = new Edit(1, 2, 3, 4);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextLoadTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextLoadTest.java
new file mode 100644
index 0000000..a11402f
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextLoadTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.diff;
+
+import org.eclipse.jgit.errors.BinaryBlobException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class RawTextLoadTest extends RepositoryTestCase {
+	private static byte[] generate(int size, int nullAt) {
+		byte[] data = new byte[size];
+		for (int i = 0; i < data.length; i++) {
+			data[i] = (byte) ((i % 72 == 0) ? '\n' : (i%10) + '0');
+		}
+		if (nullAt >= 0) {
+			data[nullAt] = '\0';
+		}
+		return data;
+	}
+
+	private RawText textFor(byte[] data, int limit) throws IOException, BinaryBlobException {
+		FileRepository repo = createBareRepository();
+		ObjectId id;
+		try (ObjectInserter ins = repo.getObjectDatabase().newInserter()) {
+			id = ins.insert(Constants.OBJ_BLOB, data);
+		}
+		ObjectLoader ldr = repo.open(id);
+		return RawText.load(ldr, limit);
+	}
+
+	@Test
+	public void testSmallOK() throws Exception {
+		byte[] data = generate(1000, -1);
+		RawText result = textFor(data, 1 << 20);
+		Assert.assertArrayEquals(result.content, data);
+	}
+
+	@Test(expected = BinaryBlobException.class)
+	public void testSmallNull() throws Exception {
+		byte[] data = generate(1000, 22);
+		textFor(data, 1 << 20);
+	}
+
+	@Test
+	public void testBigOK() throws Exception {
+		byte[] data = generate(10000, -1);
+		RawText result = textFor(data, 1 << 20);
+		Assert.assertArrayEquals(result.content, data);
+	}
+
+	@Test(expected = BinaryBlobException.class)
+	public void testBigWithNullAtStart() throws Exception {
+		byte[] data = generate(10000, 22);
+		textFor(data, 1 << 20);
+	}
+
+	@Test(expected = BinaryBlobException.class)
+	public void testBinaryThreshold() throws Exception {
+		byte[] data = generate(2 << 20, -1);
+		textFor(data, 1 << 20);
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java
index 93ea9a7..6ad59b9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java
@@ -44,6 +44,7 @@
 
 package org.eclipse.jgit.diff;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -51,7 +52,6 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.util.RawParseUtils;
@@ -110,8 +110,7 @@
 	}
 
 	@Test
-	public void testComparatorReduceCommonStartEnd()
-			throws UnsupportedEncodingException {
+	public void testComparatorReduceCommonStartEnd() {
 		final RawTextComparator c = RawTextComparator.DEFAULT;
 		Edit e;
 
@@ -137,54 +136,51 @@
 		e = c.reduceCommonStartEnd(t("abQxy"), t("abRxy"), e);
 		assertEquals(new Edit(2, 3, 2, 3), e);
 
-		RawText a = new RawText("p\na b\nQ\nc d\n".getBytes("UTF-8"));
-		RawText b = new RawText("p\na  b \nR\n c  d \n".getBytes("UTF-8"));
+		RawText a = new RawText("p\na b\nQ\nc d\n".getBytes(UTF_8));
+		RawText b = new RawText("p\na  b \nR\n c  d \n".getBytes(UTF_8));
 		e = new Edit(0, 4, 0, 4);
 		e = RawTextComparator.WS_IGNORE_ALL.reduceCommonStartEnd(a, b, e);
 		assertEquals(new Edit(2, 3, 2, 3), e);
 	}
 
 	@Test
-	public void testComparatorReduceCommonStartEnd_EmptyLine()
-			throws UnsupportedEncodingException {
+	public void testComparatorReduceCommonStartEnd_EmptyLine() {
 		RawText a;
 		RawText b;
 		Edit e;
 
-		a = new RawText("R\n y\n".getBytes("UTF-8"));
-		b = new RawText("S\n\n y\n".getBytes("UTF-8"));
+		a = new RawText("R\n y\n".getBytes(UTF_8));
+		b = new RawText("S\n\n y\n".getBytes(UTF_8));
 		e = new Edit(0, 2, 0, 3);
 		e = RawTextComparator.DEFAULT.reduceCommonStartEnd(a, b, e);
 		assertEquals(new Edit(0, 1, 0, 2), e);
 
-		a = new RawText("S\n\n y\n".getBytes("UTF-8"));
-		b = new RawText("R\n y\n".getBytes("UTF-8"));
+		a = new RawText("S\n\n y\n".getBytes(UTF_8));
+		b = new RawText("R\n y\n".getBytes(UTF_8));
 		e = new Edit(0, 3, 0, 2);
 		e = RawTextComparator.DEFAULT.reduceCommonStartEnd(a, b, e);
 		assertEquals(new Edit(0, 2, 0, 1), e);
 	}
 
 	@Test
-	public void testComparatorReduceCommonStartButLastLineNoEol()
-			throws UnsupportedEncodingException {
+	public void testComparatorReduceCommonStartButLastLineNoEol() {
 		RawText a;
 		RawText b;
 		Edit e;
-		a = new RawText("start".getBytes("UTF-8"));
-		b = new RawText("start of line".getBytes("UTF-8"));
+		a = new RawText("start".getBytes(UTF_8));
+		b = new RawText("start of line".getBytes(UTF_8));
 		e = new Edit(0, 1, 0, 1);
 		e = RawTextComparator.DEFAULT.reduceCommonStartEnd(a, b, e);
 		assertEquals(new Edit(0, 1, 0, 1), e);
 	}
 
 	@Test
-	public void testComparatorReduceCommonStartButLastLineNoEol_2()
-			throws UnsupportedEncodingException {
+	public void testComparatorReduceCommonStartButLastLineNoEol_2() {
 		RawText a;
 		RawText b;
 		Edit e;
-		a = new RawText("start".getBytes("UTF-8"));
-		b = new RawText("start of\nlastline".getBytes("UTF-8"));
+		a = new RawText("start".getBytes(UTF_8));
+		b = new RawText("start of\nlastline".getBytes(UTF_8));
 		e = new Edit(0, 1, 0, 2);
 		e = RawTextComparator.DEFAULT.reduceCommonStartEnd(a, b, e);
 		assertEquals(new Edit(0, 1, 0, 2), e);
@@ -243,10 +239,6 @@
 			r.append(text.charAt(i));
 			r.append('\n');
 		}
-		try {
-			return new RawText(r.toString().getBytes("UTF-8"));
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
+		return new RawText(r.toString().getBytes(UTF_8));
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/SimilarityIndexTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/SimilarityIndexTest.java
index 4724677..f168e83 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/SimilarityIndexTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/SimilarityIndexTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.diff;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -81,7 +82,7 @@
 				+ "A\n" //
 				+ "B\n" //
 				+ "B\n" //
-				+ "B\n").getBytes("UTF-8");
+				+ "B\n").getBytes(UTF_8);
 		SimilarityIndex si = new SimilarityIndex();
 		si.hash(new ByteArrayInputStream(in), in.length, false);
 		assertEquals(2, si.size());
@@ -129,12 +130,12 @@
 				+ "D\r\n" //
 				+ "B\r\n";
 		SimilarityIndex src = new SimilarityIndex();
-		byte[] bytes1 = text.getBytes("UTF-8");
+		byte[] bytes1 = text.getBytes(UTF_8);
 		src.hash(new ByteArrayInputStream(bytes1), bytes1.length, true);
 		src.sort();
 
 		SimilarityIndex dst = new SimilarityIndex();
-		byte[] bytes2 = text.replace("\r", "").getBytes("UTF-8");
+		byte[] bytes2 = text.replace("\r", "").getBytes(UTF_8);
 		dst.hash(new ByteArrayInputStream(bytes2), bytes2.length, true);
 		dst.sort();
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java
index 6ed2c21..9afb58e 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java
@@ -42,6 +42,7 @@
  */
 package org.eclipse.jgit.gitrepo;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -54,7 +55,6 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.net.URI;
-import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -213,7 +213,8 @@
 		repos.put("platform/base", child);
 
 		RevCommit commit = cmd
-			.setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(StandardCharsets.UTF_8)))
+				.setInputStream(new ByteArrayInputStream(
+						xmlContent.toString().getBytes(UTF_8)))
 			.setRemoteReader(repos)
 			.setURI("platform/")
 			.setTargetURI("platform/superproject")
@@ -263,7 +264,7 @@
 		repos.put("plugins/cookbook", child);
 
 		RevCommit commit = cmd
-			.setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(StandardCharsets.UTF_8)))
+			.setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(UTF_8)))
 			.setRemoteReader(repos)
 			.setURI("")
 			.setTargetURI("gerrit")
@@ -317,7 +318,7 @@
 				repos.put(repoUrl, child);
 
 				RevCommit commit = cmd
-					.setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(StandardCharsets.UTF_8)))
+					.setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(UTF_8)))
 					.setRemoteReader(repos)
 					.setURI(baseUrl)
 					.setTargetURI("gerrit")
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java
index bcc8f7e..06164c8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java
@@ -465,7 +465,7 @@
 				split("/a/b/c/", '/').toArray());
 	}
 
-	public void assertMatched(String pattern, String path) {
+	private void assertMatched(String pattern, String path) {
 		boolean match = match(pattern, path);
 		String result = path + " is " + (match ? "ignored" : "not ignored")
 				+ " via '" + pattern + "' rule";
@@ -485,7 +485,7 @@
 				match);
 	}
 
-	public void assertNotMatched(String pattern, String path) {
+	private void assertNotMatched(String pattern, String path) {
 		boolean match = match(pattern, path);
 		String result = path + " is " + (match ? "ignored" : "not ignored")
 				+ " via '" + pattern + "' rule";
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreMatcherParametrizedTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreMatcherParametrizedTest.java
index 529c75f..137230d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreMatcherParametrizedTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreMatcherParametrizedTest.java
@@ -346,7 +346,7 @@
 	 *            Target file path relative to repository's GIT_DIR
 	 * @param assume
 	 */
-	public void assertMatched(String pattern, String target, Boolean... assume) {
+	private void assertMatched(String pattern, String target, Boolean... assume) {
 		boolean value = match(pattern, target);
 		if (assume.length == 0 || !assume[0].booleanValue())
 			assertTrue("Expected a match for: " + pattern + " with: " + target,
@@ -366,7 +366,7 @@
 	 *            Target file path relative to repository's GIT_DIR
 	 * @param assume
 	 */
-	public void assertNotMatched(String pattern, String target,
+	private void assertNotMatched(String pattern, String target,
 			Boolean... assume) {
 		boolean value = match(pattern, target);
 		if (assume.length == 0 || !assume[0].booleanValue())
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 4a7dcd5..1178eb3 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
@@ -42,6 +42,7 @@
  */
 package org.eclipse.jgit.ignore;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.junit.Assert.assertEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -541,11 +542,11 @@
 		writeTrashFile(name, data.toString());
 	}
 
-	private InputStream writeToString(String... rules) throws IOException {
+	private InputStream writeToString(String... rules) {
 		StringBuilder data = new StringBuilder();
 		for (String line : rules) {
 			data.append(line + "\n");
 		}
-		return new ByteArrayInputStream(data.toString().getBytes("UTF-8"));
+		return new ByteArrayInputStream(data.toString().getBytes(UTF_8));
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/indexdiff/IndexDiffWithSymlinkTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/indexdiff/IndexDiffWithSymlinkTest.java
index 4228c9d..3db2792 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/indexdiff/IndexDiffWithSymlinkTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/indexdiff/IndexDiffWithSymlinkTest.java
@@ -41,6 +41,7 @@
  */
 package org.eclipse.jgit.indexdiff;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -60,7 +61,6 @@
 import java.io.Writer;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -130,8 +130,7 @@
 		File restoreScript = new File(testDir, name + ".sh");
 		try (OutputStream out = new BufferedOutputStream(
 				new FileOutputStream(restoreScript));
-				Writer writer = new OutputStreamWriter(out,
-						StandardCharsets.UTF_8)) {
+				Writer writer = new OutputStreamWriter(out, UTF_8)) {
 			writer.write("echo `which git` 1>&2\n");
 			writer.write("echo `git --version` 1>&2\n");
 			writer.write("git init " + name + " && \\\n");
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DeltaBaseCacheTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DeltaBaseCacheTest.java
index 32d711f..6a5d3c2 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DeltaBaseCacheTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DeltaBaseCacheTest.java
@@ -64,7 +64,7 @@
 	@Before
 	public void setUp() {
 		DfsRepositoryDescription repo = new DfsRepositoryDescription("test");
-		key = DfsStreamKey.of(repo, "test.key");
+		key = DfsStreamKey.of(repo, "test.key", null);
 		cache = new DeltaBaseCache(SZ);
 		rng = new TestRng(getClass().getSimpleName());
 	}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheTest.java
index 2e3ee45..d29744d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheTest.java
@@ -50,6 +50,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.LongStream;
 
 import org.eclipse.jgit.junit.TestRng;
 import org.eclipse.jgit.lib.ObjectId;
@@ -84,9 +85,9 @@
 			ins.flush();
 		}
 
-		long oldSize = cache.getCurrentSize();
+		long oldSize = LongStream.of(cache.getCurrentSize()).sum();
 		assertTrue(oldSize > 2000);
-		assertEquals(0, cache.getHitCount());
+		assertEquals(0, LongStream.of(cache.getHitCount()).sum());
 
 		List<DfsPackDescription> packs = r1.getObjectDatabase().listPacks();
 		InMemoryRepository r2 = new InMemoryRepository(repo);
@@ -95,8 +96,8 @@
 			byte[] actual = rdr.open(id, OBJ_BLOB).getBytes();
 			assertTrue(Arrays.equals(content, actual));
 		}
-		assertEquals(0, cache.getMissCount());
-		assertEquals(oldSize, cache.getCurrentSize());
+		assertEquals(0, LongStream.of(cache.getMissCount()).sum());
+		assertEquals(oldSize, LongStream.of(cache.getCurrentSize()).sum());
 	}
 
 	@SuppressWarnings("resource")
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 55a5f72..5b567d0 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
@@ -9,16 +9,17 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource;
+import org.eclipse.jgit.internal.storage.dfs.DfsRefDatabase;
 import org.eclipse.jgit.internal.storage.reftable.RefCursor;
 import org.eclipse.jgit.internal.storage.reftable.ReftableConfig;
 import org.eclipse.jgit.internal.storage.reftable.ReftableReader;
@@ -722,7 +723,7 @@
 
 		DfsPackDescription t1 = odb.newPack(INSERT);
 		try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) {
-			out.write("ignored".getBytes(StandardCharsets.UTF_8));
+			new ReftableWriter().begin(out).finish();
 			t1.addFileExt(REFTABLE);
 		}
 		odb.commitPack(Collections.singleton(t1), null);
@@ -739,9 +740,9 @@
 		assertTrue("commit0 in pack", isObjectInPack(commit0, pack));
 		assertTrue("commit1 in pack", isObjectInPack(commit1, pack));
 
-		// Only INSERT REFTABLE above is present.
+		// A GC and the older INSERT REFTABLE above is present.
 		DfsReftable[] tables = odb.getReftables();
-		assertEquals(1, tables.length);
+		assertEquals(2, tables.length);
 		assertEquals(t1, tables[0].getPackDescription());
 	}
 
@@ -754,7 +755,7 @@
 
 		DfsPackDescription t1 = odb.newPack(INSERT);
 		try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) {
-			out.write("ignored".getBytes(StandardCharsets.UTF_8));
+			new ReftableWriter().begin(out).finish();
 			t1.addFileExt(REFTABLE);
 		}
 		odb.commitPack(Collections.singleton(t1), null);
@@ -843,6 +844,106 @@
 		}
 	}
 
+	@Test
+	public void reftableWithoutTombstoneResurrected() throws Exception {
+		RevCommit commit0 = commit().message("0").create();
+		String NEXT = "refs/heads/next";
+		DfsRefDatabase refdb = (DfsRefDatabase)repo.getRefDatabase();
+		git.update(NEXT, commit0);
+		Ref next = refdb.exactRef(NEXT);
+		assertNotNull(next);
+		assertEquals(commit0, next.getObjectId());
+
+		git.delete(NEXT);
+		refdb.clearCache();
+		assertNull(refdb.exactRef(NEXT));
+
+		DfsGarbageCollector gc = new DfsGarbageCollector(repo);
+		gc.setReftableConfig(new ReftableConfig());
+		gc.setIncludeDeletes(false);
+		gc.setConvertToReftable(false);
+		run(gc);
+		assertEquals(1, odb.getReftables().length);
+		try (DfsReader ctx = odb.newReader();
+			 ReftableReader rr = odb.getReftables()[0].open(ctx)) {
+			rr.setIncludeDeletes(true);
+			assertEquals(1, rr.minUpdateIndex());
+			assertEquals(2, rr.maxUpdateIndex());
+			assertNull(rr.exactRef(NEXT));
+		}
+
+		RevCommit commit1 = commit().message("1").create();
+		DfsPackDescription t1 = odb.newPack(INSERT);
+		Ref newNext = new ObjectIdRef.PeeledNonTag(Ref.Storage.LOOSE, NEXT,
+				commit1);
+		try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) {
+			ReftableWriter w = new ReftableWriter();
+			w.setMinUpdateIndex(1);
+			w.setMaxUpdateIndex(1);
+			w.begin(out);
+			w.writeRef(newNext, 1);
+			w.finish();
+			t1.addFileExt(REFTABLE);
+			t1.setReftableStats(w.getStats());
+		}
+		odb.commitPack(Collections.singleton(t1), null);
+		assertEquals(2, odb.getReftables().length);
+		refdb.clearCache();
+		newNext = refdb.exactRef(NEXT);
+		assertNotNull(newNext);
+		assertEquals(commit1, newNext.getObjectId());
+	}
+
+	@Test
+	public void reftableWithTombstoneNotResurrected() throws Exception {
+		RevCommit commit0 = commit().message("0").create();
+		String NEXT = "refs/heads/next";
+		DfsRefDatabase refdb = (DfsRefDatabase)repo.getRefDatabase();
+		git.update(NEXT, commit0);
+		Ref next = refdb.exactRef(NEXT);
+		assertNotNull(next);
+		assertEquals(commit0, next.getObjectId());
+
+		git.delete(NEXT);
+		refdb.clearCache();
+		assertNull(refdb.exactRef(NEXT));
+
+		DfsGarbageCollector gc = new DfsGarbageCollector(repo);
+		gc.setReftableConfig(new ReftableConfig());
+		gc.setIncludeDeletes(true);
+		gc.setConvertToReftable(false);
+		run(gc);
+		assertEquals(1, odb.getReftables().length);
+		try (DfsReader ctx = odb.newReader();
+			 ReftableReader rr = odb.getReftables()[0].open(ctx)) {
+			rr.setIncludeDeletes(true);
+			assertEquals(1, rr.minUpdateIndex());
+			assertEquals(2, rr.maxUpdateIndex());
+			next = rr.exactRef(NEXT);
+			assertNotNull(next);
+			assertNull(next.getObjectId());
+		}
+
+		RevCommit commit1 = commit().message("1").create();
+		DfsPackDescription t1 = odb.newPack(INSERT);
+		Ref newNext = new ObjectIdRef.PeeledNonTag(Ref.Storage.LOOSE, NEXT,
+				commit1);
+		try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) {
+			ReftableWriter w = new ReftableWriter();
+			w.setMinUpdateIndex(1);
+			w.setMaxUpdateIndex(1);
+			w.begin(out);
+			w.writeRef(newNext, 1);
+			w.finish();
+			t1.addFileExt(REFTABLE);
+			t1.setReftableStats(w.getStats());
+		}
+		odb.commitPack(Collections.singleton(t1), null);
+		assertEquals(2, odb.getReftables().length);
+		refdb.clearCache();
+		assertNull(refdb.exactRef(NEXT));
+	}
+
 	private TestRepository<InMemoryRepository>.CommitBuilder commit() {
 		return git.commit();
 	}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/AbbreviationTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/AbbreviationTest.java
index 343120e..a9edf73 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/AbbreviationTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/AbbreviationTest.java
@@ -178,7 +178,7 @@
 		}
 
 		String packName = "pack-" + id.name();
-		File packDir = new File(db.getObjectDatabase().getDirectory(), "pack");
+		File packDir = db.getObjectDatabase().getPackDirectory();
 		File idxFile = new File(packDir, packName + ".idx");
 		File packFile = new File(packDir, packName + ".pack");
 		FileUtils.mkdir(packDir, true);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ConcurrentRepackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ConcurrentRepackTest.java
index 09438e9..4813d28 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ConcurrentRepackTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ConcurrentRepackTest.java
@@ -272,7 +272,7 @@
 	}
 
 	private File fullPackFileName(final ObjectId name, final String suffix) {
-		final File packdir = new File(db.getObjectDatabase().getDirectory(), "pack");
+		final File packdir = db.getObjectDatabase().getPackDirectory();
 		return new File(packdir, "pack-" + name.name() + suffix);
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java
index 5393987..79d72c5 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java
@@ -71,7 +71,7 @@
 	@Before
 	public void setUp() throws Exception {
 		super.setUp();
-		packDir = new File(repo.getObjectsDirectory(), PACK);
+		packDir = repo.getObjectDatabase().getPackDirectory();
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
index f1cbb99..cbb73bb 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/ObjectDirectoryTest.java
@@ -129,8 +129,8 @@
 			assertTrue(receivingDB.getObjectDatabase().hasPackedObject(id));
 
 			// preparations
-			File packsFolder = new File(receivingDB.getObjectsDirectory(),
-					"pack");
+			File packsFolder = receivingDB.getObjectDatabase()
+					.getPackDirectory();
 			// prepare creation of a temporary file in the pack folder. This
 			// simulates that a native git gc is happening starting to write
 			// temporary files but has not yet finished
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java
index 8596f74..b782ce8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackInserterTest.java
@@ -575,9 +575,12 @@
 
 		@Override
 		public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
-			String name = file.getFileName().toString();
-			if (!attrs.isDirectory() && badName.test(name)) {
-				bad.add(name);
+			Path fileName = file.getFileName();
+			if (fileName != null) {
+				String name = fileName.toString();
+				if (!attrs.isDirectory() && badName.test(name)) {
+					bad.add(name);
+				}
 			}
 			return FileVisitResult.CONTINUE;
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackWriterTest.java
index 9b97eb4..379432d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackWriterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackWriterTest.java
@@ -337,7 +337,7 @@
 	 */
 	@Test
 	public void testWritePack2DeltasCRC32Copy() throws IOException {
-		final File packDir = new File(db.getObjectDatabase().getDirectory(), "pack");
+		final File packDir = db.getObjectDatabase().getPackDirectory();
 		final File crc32Pack = new File(packDir,
 				"pack-34be9032ac282b11fa9babdc2b2a93ca996c9c2f.pack");
 		final File crc32Idx = new File(packDir,
@@ -713,7 +713,7 @@
 
 			pw.preparePack(NullProgressMonitor.INSTANCE, ow, want, have, NONE);
 			String id = pw.computeName().getName();
-			File packdir = new File(repo.getObjectsDirectory(), "pack");
+			File packdir = repo.getObjectDatabase().getPackDirectory();
 			File packFile = new File(packdir, "pack-" + id + ".pack");
 			FileOutputStream packOS = new FileOutputStream(packFile);
 			pw.writePack(NullProgressMonitor.INSTANCE,
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java
index 9d23d83..aa50697 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/T0003_BasicTest.java
@@ -46,6 +46,7 @@
 
 package org.eclipse.jgit.internal.storage.file;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -55,7 +56,6 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileReader;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 
@@ -82,6 +82,7 @@
 import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
 import org.eclipse.jgit.util.FileUtils;
+import org.eclipse.jgit.util.IO;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -360,11 +361,15 @@
 		assertEquals("a many line\ncomment\n to test", c.getString("user",
 				null, "defaultCheckInComment"));
 		c.save();
-		final FileReader fr = new FileReader(cfg);
-		final char[] cbuf = new char[configStr.length()];
-		fr.read(cbuf);
-		fr.close();
-		assertEquals(configStr, new String(cbuf));
+
+		// Saving normalizes out the weird "\\n\\\n" to a single escaped newline,
+		// and quotes the whole string.
+		final String expectedStr = "  [core];comment\n\tfilemode = yes\n"
+				+ "[user]\n"
+				+ "  email = A U Thor <thor@example.com> # Just an example...\n"
+				+ " name = \"A  Thor \\\\ \\\"\\t \"\n"
+				+ "    defaultCheckInComment = a many line\\ncomment\\n to test\n";
+		assertEquals(expectedStr, new String(IO.readFully(cfg), Constants.CHARSET));
 	}
 
 	@Test
@@ -544,9 +549,9 @@
 	}
 
 	@Test
-	public void test025_computeSha1NoStore() throws IOException {
+	public void test025_computeSha1NoStore() {
 		byte[] data = "test025 some data, more than 16 bytes to get good coverage"
-				.getBytes("ISO-8859-1");
+				.getBytes(ISO_8859_1);
 		try (ObjectInserter.Formatter formatter = new ObjectInserter.Formatter()) {
 			final ObjectId id = formatter.idFor(Constants.OBJ_BLOB, data);
 			assertEquals("4f561df5ecf0dfbd53a0dc0f37262fef075d9dde", id.name());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableCompactorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableCompactorTest.java
new file mode 100644
index 0000000..46a37ff
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/ReftableCompactorTest.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright (C) 2017, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.internal.storage.reftable;
+
+import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
+import static org.eclipse.jgit.lib.Ref.Storage.NEW;
+import static org.eclipse.jgit.lib.Ref.Storage.PACKED;
+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;
+import java.util.Arrays;
+
+import org.eclipse.jgit.internal.storage.io.BlockSource;
+import org.eclipse.jgit.internal.storage.reftable.ReftableWriter.Stats;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
+import org.junit.Test;
+
+public class ReftableCompactorTest {
+	private static final String MASTER = "refs/heads/master";
+	private static final String NEXT = "refs/heads/next";
+
+	@Test
+	public void noTables() throws IOException {
+		ReftableCompactor compactor = new ReftableCompactor();
+		try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+			compactor.compact(out);
+		}
+		Stats stats = compactor.getStats();
+		assertEquals(0, stats.minUpdateIndex());
+		assertEquals(0, stats.maxUpdateIndex());
+		assertEquals(0, stats.refCount());
+	}
+
+	@Test
+	public void oneTable() throws IOException {
+		byte[] inTab;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(0)
+				.setMaxUpdateIndex(0)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 1));
+			writer.finish();
+			inTab = inBuf.toByteArray();
+		}
+
+		byte[] outTab;
+		ReftableCompactor compactor = new ReftableCompactor();
+		try (ByteArrayOutputStream outBuf = new ByteArrayOutputStream()) {
+			compactor.tryAddFirst(read(inTab));
+			compactor.compact(outBuf);
+			outTab = outBuf.toByteArray();
+		}
+		Stats stats = compactor.getStats();
+		assertEquals(0, stats.minUpdateIndex());
+		assertEquals(0, stats.maxUpdateIndex());
+		assertEquals(1, stats.refCount());
+
+		ReftableReader rr = read(outTab);
+		try (RefCursor rc = rr.allRefs()) {
+			assertTrue(rc.next());
+			assertEquals(MASTER, rc.getRef().getName());
+			assertEquals(id(1), rc.getRef().getObjectId());
+			assertEquals(0, rc.getUpdateIndex());
+		}
+	}
+
+	@Test
+	public void twoTablesOneRef() throws IOException {
+		byte[] inTab1;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(0)
+				.setMaxUpdateIndex(0)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 1));
+			writer.finish();
+			inTab1 = inBuf.toByteArray();
+		}
+
+		byte[] inTab2;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(1)
+				.setMaxUpdateIndex(1)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 2));
+			writer.finish();
+			inTab2 = inBuf.toByteArray();
+		}
+
+		byte[] outTab;
+		ReftableCompactor compactor = new ReftableCompactor();
+		try (ByteArrayOutputStream outBuf = new ByteArrayOutputStream()) {
+			compactor.addAll(Arrays.asList(read(inTab1), read(inTab2)));
+			compactor.compact(outBuf);
+			outTab = outBuf.toByteArray();
+		}
+		Stats stats = compactor.getStats();
+		assertEquals(0, stats.minUpdateIndex());
+		assertEquals(1, stats.maxUpdateIndex());
+		assertEquals(1, stats.refCount());
+
+		ReftableReader rr = read(outTab);
+		try (RefCursor rc = rr.allRefs()) {
+			assertTrue(rc.next());
+			assertEquals(MASTER, rc.getRef().getName());
+			assertEquals(id(2), rc.getRef().getObjectId());
+			assertEquals(1, rc.getUpdateIndex());
+		}
+	}
+
+	@Test
+	public void twoTablesTwoRefs() throws IOException {
+		byte[] inTab1;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(0)
+				.setMaxUpdateIndex(0)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 1));
+			writer.writeRef(ref(NEXT, 2));
+			writer.finish();
+			inTab1 = inBuf.toByteArray();
+		}
+
+		byte[] inTab2;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(1)
+				.setMaxUpdateIndex(1)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 3));
+			writer.finish();
+			inTab2 = inBuf.toByteArray();
+		}
+
+		byte[] outTab;
+		ReftableCompactor compactor = new ReftableCompactor();
+		try (ByteArrayOutputStream outBuf = new ByteArrayOutputStream()) {
+			compactor.addAll(Arrays.asList(read(inTab1), read(inTab2)));
+			compactor.compact(outBuf);
+			outTab = outBuf.toByteArray();
+		}
+		Stats stats = compactor.getStats();
+		assertEquals(0, stats.minUpdateIndex());
+		assertEquals(1, stats.maxUpdateIndex());
+		assertEquals(2, stats.refCount());
+
+		ReftableReader rr = read(outTab);
+		try (RefCursor rc = rr.allRefs()) {
+			assertTrue(rc.next());
+			assertEquals(MASTER, rc.getRef().getName());
+			assertEquals(id(3), rc.getRef().getObjectId());
+			assertEquals(1, rc.getUpdateIndex());
+
+			assertTrue(rc.next());
+			assertEquals(NEXT, rc.getRef().getName());
+			assertEquals(id(2), rc.getRef().getObjectId());
+			assertEquals(0, rc.getUpdateIndex());
+		}
+	}
+
+	@Test
+	public void twoTablesIncludeOneDelete() throws IOException {
+		byte[] inTab1;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(0)
+				.setMaxUpdateIndex(0)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 1));
+			writer.finish();
+			inTab1 = inBuf.toByteArray();
+		}
+
+		byte[] inTab2;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(1)
+				.setMaxUpdateIndex(1)
+				.begin(inBuf);
+
+			writer.writeRef(tombstone(MASTER));
+			writer.finish();
+			inTab2 = inBuf.toByteArray();
+		}
+
+		byte[] outTab;
+		ReftableCompactor compactor = new ReftableCompactor();
+		try (ByteArrayOutputStream outBuf = new ByteArrayOutputStream()) {
+			compactor.setIncludeDeletes(true);
+			compactor.addAll(Arrays.asList(read(inTab1), read(inTab2)));
+			compactor.compact(outBuf);
+			outTab = outBuf.toByteArray();
+		}
+		Stats stats = compactor.getStats();
+		assertEquals(0, stats.minUpdateIndex());
+		assertEquals(1, stats.maxUpdateIndex());
+		assertEquals(1, stats.refCount());
+
+		ReftableReader rr = read(outTab);
+		try (RefCursor rc = rr.allRefs()) {
+			assertFalse(rc.next());
+		}
+	}
+
+	@Test
+	public void twoTablesNotIncludeOneDelete() throws IOException {
+		byte[] inTab1;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(0)
+				.setMaxUpdateIndex(0)
+				.begin(inBuf);
+
+			writer.writeRef(ref(MASTER, 1));
+			writer.finish();
+			inTab1 = inBuf.toByteArray();
+		}
+
+		byte[] inTab2;
+		try (ByteArrayOutputStream inBuf = new ByteArrayOutputStream()) {
+			ReftableWriter writer = new ReftableWriter()
+				.setMinUpdateIndex(1)
+				.setMaxUpdateIndex(1)
+				.begin(inBuf);
+
+			writer.writeRef(tombstone(MASTER));
+			writer.finish();
+			inTab2 = inBuf.toByteArray();
+		}
+
+		byte[] outTab;
+		ReftableCompactor compactor = new ReftableCompactor();
+		try (ByteArrayOutputStream outBuf = new ByteArrayOutputStream()) {
+			compactor.setIncludeDeletes(false);
+			compactor.addAll(Arrays.asList(read(inTab1), read(inTab2)));
+			compactor.compact(outBuf);
+			outTab = outBuf.toByteArray();
+		}
+		Stats stats = compactor.getStats();
+		assertEquals(0, stats.minUpdateIndex());
+		assertEquals(1, stats.maxUpdateIndex());
+		assertEquals(0, stats.refCount());
+
+		ReftableReader rr = read(outTab);
+		try (RefCursor rc = rr.allRefs()) {
+			assertFalse(rc.next());
+		}
+	}
+
+	private static Ref ref(String name, int id) {
+		return new ObjectIdRef.PeeledNonTag(PACKED, name, id(id));
+	}
+
+	private static Ref tombstone(String name) {
+		return new ObjectIdRef.Unpeeled(NEW, name, null);
+	}
+
+	private static ObjectId id(int i) {
+		byte[] buf = new byte[OBJECT_ID_LENGTH];
+		buf[0] = (byte) (i & 0xff);
+		buf[1] = (byte) ((i >>> 8) & 0xff);
+		buf[2] = (byte) ((i >>> 16) & 0xff);
+		buf[3] = (byte) (i >>> 24);
+		return ObjectId.fromRaw(buf);
+	}
+
+	private static ReftableReader read(byte[] table) {
+		return new ReftableReader(BlockSource.from(table));
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabaseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabaseTest.java
index 9aef943..1684afa 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabaseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabaseTest.java
@@ -657,7 +657,8 @@
 				Ref old = tree.exactRef(reader, name);
 				Command n;
 				try (RevWalk rw = new RevWalk(repo)) {
-					n = new Command(old, Command.toRef(rw, id, name, true));
+					n = new Command(old,
+							Command.toRef(rw, id, null, name, true));
 				}
 				return tree.apply(Collections.singleton(n));
 			}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
index a12831a..fb1ee8c 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
@@ -53,6 +53,7 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.eclipse.jgit.util.FileUtils.pathToString;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -80,7 +81,6 @@
 import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.SystemReader;
 import org.junit.After;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -89,7 +89,10 @@
 /**
  * Test reading of git config
  */
+@SuppressWarnings("boxing")
 public class ConfigTest {
+	// A non-ASCII whitespace character: U+2002 EN QUAD.
+	private static final char WS = '\u2002';
 
 	@Rule
 	public ExpectedException expectedEx = ExpectedException.none();
@@ -666,28 +669,6 @@
 		assertTrue("Subsection should contain \"B\"", names.contains("B"));
 	}
 
-	@Test
-	public void testQuotingForSubSectionNames() {
-		String resultPattern = "[testsection \"{0}\"]\n\ttestname = testvalue\n";
-		String result;
-
-		Config config = new Config();
-		config.setString("testsection", "testsubsection", "testname",
-				"testvalue");
-
-		result = MessageFormat.format(resultPattern, "testsubsection");
-		assertEquals(result, config.toText());
-		config.clear();
-
-		config.setString("testsection", "#quotable", "testname", "testvalue");
-		result = MessageFormat.format(resultPattern, "#quotable");
-		assertEquals(result, config.toText());
-		config.clear();
-
-		config.setString("testsection", "with\"quote", "testname", "testvalue");
-		result = MessageFormat.format(resultPattern, "with\\\"quote");
-		assertEquals(result, config.toText());
-	}
 
 	@Test
 	public void testNoFinalNewline() throws ConfigInvalidException {
@@ -767,7 +748,6 @@
 	}
 
 	@Test
-	@Ignore
 	public void testIncludeInvalidName() throws ConfigInvalidException {
 		expectedEx.expect(ConfigInvalidException.class);
 		expectedEx.expectMessage(JGitText.get().invalidLineInConfigFile);
@@ -775,7 +755,6 @@
 	}
 
 	@Test
-	@Ignore
 	public void testIncludeNoValue() throws ConfigInvalidException {
 		expectedEx.expect(ConfigInvalidException.class);
 		expectedEx.expectMessage(JGitText.get().invalidLineInConfigFile);
@@ -783,7 +762,6 @@
 	}
 
 	@Test
-	@Ignore
 	public void testIncludeEmptyValue() throws ConfigInvalidException {
 		expectedEx.expect(ConfigInvalidException.class);
 		expectedEx.expectMessage(JGitText.get().invalidLineInConfigFile);
@@ -820,10 +798,9 @@
 	}
 
 	@Test
-	@Ignore
 	public void testIncludeTooManyRecursions() throws IOException {
 		File config = tmp.newFile("config");
-		String include = "[include]\npath=" + config.toPath() + "\n";
+		String include = "[include]\npath=" + pathToString(config) + "\n";
 		Files.write(config.toPath(), include.getBytes());
 		FileBasedConfig fbConfig = new FileBasedConfig(null, config,
 				FS.DETECTED);
@@ -843,7 +820,7 @@
 		String fooBar = "[foo]\nbar=true\n";
 		Files.write(config.toPath(), fooBar.getBytes());
 
-		Config parsed = parse("[include]\npath=" + config.toPath() + "\n");
+		Config parsed = parse("[include]\npath=" + pathToString(config) + "\n");
 		assertFalse(parsed.getBoolean("foo", "bar", false));
 	}
 
@@ -957,4 +934,207 @@
 		expectedEx.expect(IllegalArgumentException.class);
 		parseTime("-1", MILLISECONDS);
 	}
+
+	@Test
+	public void testEscapeSpacesOnly() throws ConfigInvalidException {
+		// Empty string is read back as null, so this doesn't round-trip.
+		assertEquals("", Config.escapeValue(""));
+
+		assertValueRoundTrip(" ", "\" \"");
+		assertValueRoundTrip("  ", "\"  \"");
+	}
+
+	@Test
+	public void testEscapeLeadingSpace() throws ConfigInvalidException {
+		assertValueRoundTrip("x", "x");
+		assertValueRoundTrip(" x", "\" x\"");
+		assertValueRoundTrip("  x", "\"  x\"");
+	}
+
+	@Test
+	public void testEscapeTrailingSpace() throws ConfigInvalidException {
+		assertValueRoundTrip("x", "x");
+		assertValueRoundTrip("x  ","\"x  \"");
+		assertValueRoundTrip("x ","\"x \"");
+	}
+
+	@Test
+	public void testEscapeLeadingAndTrailingSpace()
+			throws ConfigInvalidException {
+		assertValueRoundTrip(" x ", "\" x \"");
+		assertValueRoundTrip("  x ", "\"  x \"");
+		assertValueRoundTrip(" x  ", "\" x  \"");
+		assertValueRoundTrip("  x  ", "\"  x  \"");
+	}
+
+	@Test
+	public void testNoEscapeInternalSpaces() throws ConfigInvalidException {
+		assertValueRoundTrip("x y");
+		assertValueRoundTrip("x  y");
+		assertValueRoundTrip("x  y");
+		assertValueRoundTrip("x  y   z");
+		assertValueRoundTrip("x " + WS + " y");
+	}
+
+	@Test
+	public void testNoEscapeSpecialCharacters() throws ConfigInvalidException {
+		assertValueRoundTrip("x\\y", "x\\\\y");
+		assertValueRoundTrip("x\"y", "x\\\"y");
+		assertValueRoundTrip("x\ny", "x\\ny");
+		assertValueRoundTrip("x\ty", "x\\ty");
+		assertValueRoundTrip("x\by", "x\\by");
+	}
+
+	@Test
+	public void testParseLiteralBackspace() throws ConfigInvalidException {
+		// This is round-tripped with an escape sequence by JGit, but C git writes
+		// it out as a literal backslash.
+		assertEquals("x\by", parseEscapedValue("x\by"));
+	}
+
+	@Test
+	public void testEscapeCommentCharacters() throws ConfigInvalidException {
+		assertValueRoundTrip("x#y", "\"x#y\"");
+		assertValueRoundTrip("x;y", "\"x;y\"");
+	}
+
+	@Test
+	public void testEscapeValueInvalidCharacters() {
+		assertIllegalArgumentException(() -> Config.escapeSubsection("x\0y"));
+	}
+
+	@Test
+	public void testEscapeSubsectionInvalidCharacters() {
+		assertIllegalArgumentException(() -> Config.escapeSubsection("x\ny"));
+		assertIllegalArgumentException(() -> Config.escapeSubsection("x\0y"));
+	}
+
+	@Test
+	public void testParseMultipleQuotedRegions() throws ConfigInvalidException {
+		assertEquals("b a z; \n", parseEscapedValue("b\" a\"\" z; \\n\""));
+	}
+
+	@Test
+	public void testParseComments() throws ConfigInvalidException {
+		assertEquals("baz", parseEscapedValue("baz; comment"));
+		assertEquals("baz", parseEscapedValue("baz# comment"));
+		assertEquals("baz", parseEscapedValue("baz ; comment"));
+		assertEquals("baz", parseEscapedValue("baz # comment"));
+
+		assertEquals("baz", parseEscapedValue("baz ; comment"));
+		assertEquals("baz", parseEscapedValue("baz # comment"));
+		assertEquals("baz", parseEscapedValue("baz " + WS + " ; comment"));
+		assertEquals("baz", parseEscapedValue("baz " + WS + " # comment"));
+
+		assertEquals("baz ", parseEscapedValue("\"baz \"; comment"));
+		assertEquals("baz ", parseEscapedValue("\"baz \"# comment"));
+		assertEquals("baz ", parseEscapedValue("\"baz \" ; comment"));
+		assertEquals("baz ", parseEscapedValue("\"baz \" # comment"));
+	}
+
+	@Test
+	public void testEscapeSubsection() throws ConfigInvalidException {
+		assertSubsectionRoundTrip("", "\"\"");
+		assertSubsectionRoundTrip("x", "\"x\"");
+		assertSubsectionRoundTrip(" x", "\" x\"");
+		assertSubsectionRoundTrip("x ", "\"x \"");
+		assertSubsectionRoundTrip(" x ", "\" x \"");
+		assertSubsectionRoundTrip("x y", "\"x y\"");
+		assertSubsectionRoundTrip("x  y", "\"x  y\"");
+		assertSubsectionRoundTrip("x\\y", "\"x\\\\y\"");
+		assertSubsectionRoundTrip("x\"y", "\"x\\\"y\"");
+
+		// Unlike for values, \b and \t are not escaped.
+		assertSubsectionRoundTrip("x\by", "\"x\by\"");
+		assertSubsectionRoundTrip("x\ty", "\"x\ty\"");
+	}
+
+	@Test
+	public void testParseInvalidValues() {
+		assertInvalidValue(JGitText.get().newlineInQuotesNotAllowed, "x\"\n\"y");
+		assertInvalidValue(JGitText.get().endOfFileInEscape, "x\\");
+		assertInvalidValue(
+				MessageFormat.format(JGitText.get().badEscape, 'q'), "x\\q");
+	}
+
+	@Test
+	public void testParseInvalidSubsections() {
+		assertInvalidSubsection(
+				JGitText.get().newlineInQuotesNotAllowed, "\"x\ny\"");
+	}
+
+	@Test
+	public void testDropBackslashFromInvalidEscapeSequenceInSubsectionName()
+			throws ConfigInvalidException {
+		assertEquals("x0", parseEscapedSubsection("\"x\\0\""));
+		assertEquals("xq", parseEscapedSubsection("\"x\\q\""));
+		// Unlike for values, \b, \n, and \t are not valid escape sequences.
+		assertEquals("xb", parseEscapedSubsection("\"x\\b\""));
+		assertEquals("xn", parseEscapedSubsection("\"x\\n\""));
+		assertEquals("xt", parseEscapedSubsection("\"x\\t\""));
+	}
+
+	private static void assertValueRoundTrip(String value)
+			throws ConfigInvalidException {
+		assertValueRoundTrip(value, value);
+	}
+
+	private static void assertValueRoundTrip(String value, String expectedEscaped)
+			throws ConfigInvalidException {
+		String escaped = Config.escapeValue(value);
+		assertEquals("escape failed;", expectedEscaped, escaped);
+		assertEquals("parse failed;", value, parseEscapedValue(escaped));
+	}
+
+	private static String parseEscapedValue(String escapedValue)
+			throws ConfigInvalidException {
+		String text = "[foo]\nbar=" + escapedValue;
+		Config c = parse(text);
+		return c.getString("foo", null, "bar");
+	}
+
+	private static void assertInvalidValue(String expectedMessage,
+			String escapedValue) {
+		try {
+			parseEscapedValue(escapedValue);
+			fail("expected ConfigInvalidException");
+		} catch (ConfigInvalidException e) {
+			assertEquals(expectedMessage, e.getMessage());
+		}
+	}
+
+	private static void assertSubsectionRoundTrip(String subsection,
+			String expectedEscaped) throws ConfigInvalidException {
+		String escaped = Config.escapeSubsection(subsection);
+		assertEquals("escape failed;", expectedEscaped, escaped);
+		assertEquals("parse failed;", subsection, parseEscapedSubsection(escaped));
+	}
+
+	private static String parseEscapedSubsection(String escapedSubsection)
+			throws ConfigInvalidException {
+		String text = "[foo " + escapedSubsection + "]\nbar = value";
+		Config c = parse(text);
+		Set<String> subsections = c.getSubsections("foo");
+		assertEquals("only one section", 1, subsections.size());
+		return subsections.iterator().next();
+	}
+
+	private static void assertIllegalArgumentException(Runnable r) {
+		try {
+			r.run();
+			fail("expected IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// Expected.
+		}
+	}
+
+	private static void assertInvalidSubsection(String expectedMessage,
+			String escapedSubsection) {
+		try {
+			parseEscapedSubsection(escapedSubsection);
+			fail("expected ConfigInvalidException");
+		} catch (ConfigInvalidException e) {
+			assertEquals(expectedMessage, e.getMessage());
+		}
+	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
index 05573b9..4d42bd1 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
@@ -218,8 +218,8 @@
 	/**
 	 * Reset hard from unclean condition.
 	 * <p>
-	 * WorkDir: Empty <br/>
-	 * Index: f/g <br/>
+	 * WorkDir: Empty <br>
+	 * Index: f/g <br>
 	 * Merge: x
 	 *
 	 * @throws Exception
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
index 476c4e5..f6879b9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
@@ -45,6 +45,7 @@
 package org.eclipse.jgit.lib;
 
 import static java.lang.Integer.valueOf;
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.junit.JGitTestUtil.concat;
 import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
 import static org.eclipse.jgit.lib.Constants.OBJ_BAD;
@@ -68,7 +69,6 @@
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
-import java.io.UnsupportedEncodingException;
 import java.text.MessageFormat;
 
 import org.eclipse.jgit.errors.CorruptObjectException;
@@ -1556,11 +1556,11 @@
 
 	@Test
 	public void testInvalidTreeDuplicateNames5()
-			throws UnsupportedEncodingException, CorruptObjectException {
+			throws CorruptObjectException {
 		StringBuilder b = new StringBuilder();
 		entry(b, "100644 A");
 		entry(b, "100644 a");
-		byte[] data = b.toString().getBytes("UTF-8");
+		byte[] data = b.toString().getBytes(UTF_8);
 		checker.setSafeForWindows(true);
 		assertCorrupt("duplicate entry names", OBJ_TREE, data);
 		assertSkipListAccepts(OBJ_TREE, data);
@@ -1570,11 +1570,11 @@
 
 	@Test
 	public void testInvalidTreeDuplicateNames6()
-			throws UnsupportedEncodingException, CorruptObjectException {
+			throws CorruptObjectException {
 		StringBuilder b = new StringBuilder();
 		entry(b, "100644 A");
 		entry(b, "100644 a");
-		byte[] data = b.toString().getBytes("UTF-8");
+		byte[] data = b.toString().getBytes(UTF_8);
 		checker.setSafeForMacOS(true);
 		assertCorrupt("duplicate entry names", OBJ_TREE, data);
 		assertSkipListAccepts(OBJ_TREE, data);
@@ -1584,11 +1584,11 @@
 
 	@Test
 	public void testInvalidTreeDuplicateNames7()
-			throws UnsupportedEncodingException, CorruptObjectException {
+			throws CorruptObjectException {
 		StringBuilder b = new StringBuilder();
 		entry(b, "100644 \u0065\u0301");
 		entry(b, "100644 \u00e9");
-		byte[] data = b.toString().getBytes("UTF-8");
+		byte[] data = b.toString().getBytes(UTF_8);
 		checker.setSafeForMacOS(true);
 		assertCorrupt("duplicate entry names", OBJ_TREE, data);
 		assertSkipListAccepts(OBJ_TREE, data);
@@ -1598,11 +1598,11 @@
 
 	@Test
 	public void testInvalidTreeDuplicateNames8()
-			throws UnsupportedEncodingException, CorruptObjectException {
+			throws CorruptObjectException {
 		StringBuilder b = new StringBuilder();
 		entry(b, "100644 A");
 		checker.setSafeForMacOS(true);
-		checker.checkTree(b.toString().getBytes("UTF-8"));
+		checker.checkTree(b.toString().getBytes(UTF_8));
 	}
 
 	@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java
index d8b8750..3272d59 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java
@@ -65,8 +65,12 @@
 import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.AnyObjectId;
 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.ObjectStream;
 import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -689,6 +693,143 @@
 		}
 	}
 
+
+	/**
+	 * Merging a change involving large binary files should short-circuit reads.
+	 *
+	 * @param strategy
+	 * @throws Exception
+	 */
+	@Theory
+	public void checkContentMergeLargeBinaries(MergeStrategy strategy) throws Exception {
+		Git git = Git.wrap(db);
+		final int LINELEN = 72;
+
+		// setup a merge that would work correctly if we disconsider the stray '\0'
+		// that the file contains near the start.
+		byte[] binary = new byte[LINELEN * 2000];
+		for (int i = 0; i < binary.length; i++) {
+			binary[i] = (byte)((i % LINELEN) == 0 ? '\n' : 'x');
+		}
+		binary[50] = '\0';
+
+		writeTrashFile("file", new String(binary, UTF_8));
+		git.add().addFilepattern("file").call();
+		RevCommit first = git.commit().setMessage("added file").call();
+
+		// Generate an edit in a single line.
+		int idx = LINELEN * 1200 + 1;
+		byte save = binary[idx];
+		binary[idx] = '@';
+		writeTrashFile("file", new String(binary, UTF_8));
+
+		binary[idx] = save;
+		git.add().addFilepattern("file").call();
+		RevCommit masterCommit = git.commit().setAll(true)
+			.setMessage("modified file l 1200").call();
+
+		git.checkout().setCreateBranch(true).setStartPoint(first).setName("side").call();
+		binary[LINELEN * 1500 + 1] = '!';
+		writeTrashFile("file", new String(binary, UTF_8));
+		git.add().addFilepattern("file").call();
+		RevCommit sideCommit = git.commit().setAll(true)
+			.setMessage("modified file l 1500").call();
+
+		try (ObjectInserter ins = db.newObjectInserter()) {
+			// Check that we don't read the large blobs.
+			ObjectInserter forbidInserter = new ObjectInserter.Filter() {
+				@Override
+				protected ObjectInserter delegate() {
+					return ins;
+				}
+
+				@Override
+				public ObjectReader newReader() {
+					return new BigReadForbiddenReader(super.newReader(), 8000);
+				}
+			};
+
+			ResolveMerger merger =
+				(ResolveMerger) strategy.newMerger(forbidInserter, db.getConfig());
+			boolean noProblems = merger.merge(masterCommit, sideCommit);
+			assertFalse(noProblems);
+		}
+	}
+
+	/**
+	 * Throws an exception if reading beyond limit.
+	 */
+	class BigReadForbiddenStream extends ObjectStream.Filter {
+		int limit;
+
+		BigReadForbiddenStream(ObjectStream orig, int limit) {
+			super(orig.getType(), orig.getSize(), orig);
+			this.limit = limit;
+		}
+
+		@Override
+		public long skip(long n) throws IOException {
+			limit -= n;
+			if (limit < 0) {
+				throw new IllegalStateException();
+			}
+
+			return super.skip(n);
+		}
+
+		@Override
+		public int read() throws IOException {
+			int r = super.read();
+			limit--;
+			if (limit < 0) {
+				throw new IllegalStateException();
+			}
+			return r;
+		}
+
+		@Override
+		public int read(byte[] b, int off, int len) throws IOException {
+			int n = super.read(b, off, len);
+			limit -= n;
+			if (limit < 0) {
+				throw new IllegalStateException();
+			}
+			return n;
+		}
+	}
+
+	class BigReadForbiddenReader extends ObjectReader.Filter {
+		ObjectReader delegate;
+		int limit;
+
+		@Override
+		protected ObjectReader delegate() {
+			return delegate;
+		}
+
+		BigReadForbiddenReader(ObjectReader delegate, int limit) {
+			this.delegate = delegate;
+			this.limit = limit;
+		}
+
+		@Override
+		public ObjectLoader open(AnyObjectId objectId, int typeHint) throws IOException {
+			ObjectLoader orig = super.open(objectId, typeHint);
+			return new ObjectLoader.Filter() {
+				@Override
+				protected ObjectLoader delegate() {
+					return orig;
+				}
+
+				@Override
+				public ObjectStream openStream() throws IOException {
+					ObjectStream os = orig.openStream();
+					return new BigReadForbiddenStream(os, limit);
+				}
+			};
+		}
+	}
+
 	@Theory
 	public void checkContentMergeConflict(MergeStrategy strategy)
 			throws Exception {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
index 1a15842..88f240b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevCommitParseTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.revwalk;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -113,7 +114,7 @@
 		assertNull(c.getTree());
 		assertNull(c.parents);
 
-		c.parseCanonical(rw, body.toString().getBytes("UTF-8"));
+		c.parseCanonical(rw, body.toString().getBytes(UTF_8));
 		assertNotNull(c.getTree());
 		assertEquals(treeId, c.getTree().getId());
 		assertSame(rw.lookupTree(treeId), c.getTree());
@@ -147,7 +148,7 @@
 
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
-		c.parseCanonical(new RevWalk(db), b.toString().getBytes("UTF-8"));
+		c.parseCanonical(new RevWalk(db), b.toString().getBytes(UTF_8));
 		return c;
 	}
 
@@ -160,7 +161,7 @@
 
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
-		c.parseCanonical(new RevWalk(db), b.toString().getBytes("UTF-8"));
+		c.parseCanonical(new RevWalk(db), b.toString().getBytes(UTF_8));
 
 		assertEquals("", c.getFullMessage());
 		assertEquals("", c.getShortMessage());
@@ -175,7 +176,7 @@
 
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
-		c.parseCanonical(new RevWalk(db), b.toString().getBytes("UTF-8"));
+		c.parseCanonical(new RevWalk(db), b.toString().getBytes(UTF_8));
 
 		assertEquals(new PersonIdent("", "a_u_thor@example.com", 1218123387000l, 7), c.getAuthorIdent());
 		assertEquals(new PersonIdent("", "", 1218123390000l, -5), c.getCommitterIdent());
@@ -184,13 +185,13 @@
 	@Test
 	public void testParse_implicit_UTF8_encoded() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
-		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes("UTF-8"));
-		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes("UTF-8"));
-		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
+		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes(UTF_8));
+		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes(UTF_8));
+		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67")); // bogus id
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
@@ -204,13 +205,13 @@
 	@Test
 	public void testParse_implicit_mixed_encoded() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
-		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes("UTF-8"));
-		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes("ISO-8859-1"));
-		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
+		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes(UTF_8));
+		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes(ISO_8859_1));
+		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67")); // bogus id
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
@@ -259,14 +260,14 @@
 	@Test
 	public void testParse_explicit_bad_encoded() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
-		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes("UTF-8"));
-		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes("ISO-8859-1"));
-		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes("UTF-8"));
-		b.write("encoding EUC-JP\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Hi\n".getBytes("UTF-8"));
+		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes(UTF_8));
+		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes(ISO_8859_1));
+		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes(UTF_8));
+		b.write("encoding EUC-JP\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Hi\n".getBytes(UTF_8));
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67")); // bogus id
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
@@ -290,14 +291,14 @@
 	@Test
 	public void testParse_explicit_bad_encoded2() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
-		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes("UTF-8"));
-		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes("UTF-8"));
-		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes("UTF-8"));
-		b.write("encoding ISO-8859-1\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Hi\n".getBytes("UTF-8"));
+		b.write("tree 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes(UTF_8));
+		b.write("author F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n".getBytes(UTF_8));
+		b.write("committer C O. Miter <c@example.com> 1218123390 -0500\n".getBytes(UTF_8));
+		b.write("encoding ISO-8859-1\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Hi\n".getBytes(UTF_8));
 		final RevCommit c;
 		c = new RevCommit(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67")); // bogus id
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevObjectTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevObjectTest.java
index 95e7ca6..122a397 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevObjectTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevObjectTest.java
@@ -60,6 +60,7 @@
 		assertSame(a, a.getId());
 	}
 
+	@SuppressWarnings("unlikely-arg-type")
 	@Test
 	public void testEquals() throws Exception {
 		final RevCommit a1 = commit();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java
index f97043b..38bd371 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.revwalk;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -97,7 +98,7 @@
 		assertNull(c.getObject());
 		assertNull(c.getTagName());
 
-		c.parseCanonical(rw, b.toString().getBytes("UTF-8"));
+		c.parseCanonical(rw, b.toString().getBytes(UTF_8));
 		assertNotNull(c.getObject());
 		assertEquals(id, c.getObject().getId());
 		assertSame(rw.lookupAny(id, typeCode), c.getObject());
@@ -140,7 +141,7 @@
 		assertNull(c.getObject());
 		assertNull(c.getTagName());
 
-		c.parseCanonical(rw, body.toString().getBytes("UTF-8"));
+		c.parseCanonical(rw, body.toString().getBytes(UTF_8));
 		assertNotNull(c.getObject());
 		assertEquals(treeId, c.getObject().getId());
 		assertSame(rw.lookupTree(treeId), c.getObject());
@@ -188,7 +189,7 @@
 		assertNull(c.getObject());
 		assertNull(c.getTagName());
 
-		c.parseCanonical(rw, body.toString().getBytes("UTF-8"));
+		c.parseCanonical(rw, body.toString().getBytes(UTF_8));
 		assertNotNull(c.getObject());
 		assertEquals(treeId, c.getObject().getId());
 		assertSame(rw.lookupTree(treeId), c.getObject());
@@ -212,7 +213,7 @@
 
 		final RevTag c;
 		c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
-		c.parseCanonical(new RevWalk(db), b.toString().getBytes("UTF-8"));
+		c.parseCanonical(new RevWalk(db), b.toString().getBytes(UTF_8));
 		return c;
 	}
 
@@ -220,17 +221,17 @@
 	public void testParse_implicit_UTF8_encoded() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
 		b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
-				.getBytes("UTF-8"));
-		b.write("type tree\n".getBytes("UTF-8"));
-		b.write("tag v1.2.3.4.5\n".getBytes("UTF-8"));
+				.getBytes(UTF_8));
+		b.write("type tree\n".getBytes(UTF_8));
+		b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
 
 		b
 				.write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
-						.getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
+						.getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
 		final RevTag c;
 		c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
@@ -245,16 +246,15 @@
 	public void testParse_implicit_mixed_encoded() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
 		b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
-				.getBytes("UTF-8"));
-		b.write("type tree\n".getBytes("UTF-8"));
-		b.write("tag v1.2.3.4.5\n".getBytes("UTF-8"));
-		b
-				.write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
-						.getBytes("ISO-8859-1"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
+				.getBytes(UTF_8));
+		b.write("type tree\n".getBytes(UTF_8));
+		b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
+		b.write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
+				.getBytes(ISO_8859_1));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Sm\u00f6rg\u00e5sbord\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
 		final RevTag c;
 		c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
@@ -307,17 +307,17 @@
 	public void testParse_explicit_bad_encoded() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
 		b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
-				.getBytes("UTF-8"));
-		b.write("type tree\n".getBytes("UTF-8"));
-		b.write("tag v1.2.3.4.5\n".getBytes("UTF-8"));
+				.getBytes(UTF_8));
+		b.write("type tree\n".getBytes(UTF_8));
+		b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
 		b
 				.write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
-						.getBytes("ISO-8859-1"));
-		b.write("encoding EUC-JP\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Hi\n".getBytes("UTF-8"));
+						.getBytes(ISO_8859_1));
+		b.write("encoding EUC-JP\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Hi\n".getBytes(UTF_8));
 		final RevTag c;
 		c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
@@ -342,17 +342,17 @@
 	public void testParse_explicit_bad_encoded2() throws Exception {
 		final ByteArrayOutputStream b = new ByteArrayOutputStream();
 		b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
-				.getBytes("UTF-8"));
-		b.write("type tree\n".getBytes("UTF-8"));
-		b.write("tag v1.2.3.4.5\n".getBytes("UTF-8"));
+				.getBytes(UTF_8));
+		b.write("type tree\n".getBytes(UTF_8));
+		b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
 		b
 				.write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
-						.getBytes("UTF-8"));
-		b.write("encoding ISO-8859-1\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("\u304d\u308c\u3044\n".getBytes("UTF-8"));
-		b.write("\n".getBytes("UTF-8"));
-		b.write("Hi\n".getBytes("UTF-8"));
+						.getBytes(UTF_8));
+		b.write("encoding ISO-8859-1\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
+		b.write("\n".getBytes(UTF_8));
+		b.write("Hi\n".getBytes(UTF_8));
 		final RevTag c;
 		c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
 		c.parseCanonical(new RevWalk(db), b.toByteArray());
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 1860185..ab2705c 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
@@ -145,8 +145,9 @@
 
 	/**
 	 * Assert which renames should have happened, in traversal order.
+	 *
 	 * @param expectedRenames
-	 *            the rename specs, each one in the form "srcPath->destPath"
+	 *            the rename specs, each one in the form "srcPath-&gt;destPath"
 	 */
 	protected void assertRenames(String... expectedRenames) {
 		Assert.assertEquals("Unexpected number of renames. Expected: " +
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileBasedConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileBasedConfigTest.java
index ee845c5..2a54dc6 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileBasedConfigTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileBasedConfigTest.java
@@ -42,6 +42,8 @@
  */
 package org.eclipse.jgit.storage.file;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.util.FileUtils.pathToString;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -103,7 +105,7 @@
 
 	@Test
 	public void testUTF8withoutBOM() throws IOException, ConfigInvalidException {
-		final File file = createFile(CONTENT1.getBytes("UTF-8"));
+		final File file = createFile(CONTENT1.getBytes(UTF_8));
 		final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
 		config.load();
 		assertEquals(ALICE, config.getString(USER, null, NAME));
@@ -119,7 +121,7 @@
 		bos1.write(0xEF);
 		bos1.write(0xBB);
 		bos1.write(0xBF);
-		bos1.write(CONTENT1.getBytes("UTF-8"));
+		bos1.write(CONTENT1.getBytes(UTF_8));
 
 		final File file = createFile(bos1.toByteArray());
 		final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
@@ -133,7 +135,7 @@
 		bos2.write(0xEF);
 		bos2.write(0xBB);
 		bos2.write(0xBF);
-		bos2.write(CONTENT2.getBytes("UTF-8"));
+		bos2.write(CONTENT2.getBytes(UTF_8));
 		assertArrayEquals(bos2.toByteArray(), IO.readFully(file));
 	}
 
@@ -157,9 +159,89 @@
 		assertArrayEquals(bos2.toByteArray(), IO.readFully(file));
 	}
 
+	@Test
+	public void testIncludeAbsolute()
+			throws IOException, ConfigInvalidException {
+		final File includedFile = createFile(CONTENT1.getBytes());
+		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		bos.write("[include]\npath=".getBytes());
+		bos.write(pathToString(includedFile).getBytes());
+
+		final File file = createFile(bos.toByteArray());
+		final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+		config.load();
+		assertEquals(ALICE, config.getString(USER, null, NAME));
+	}
+
+	@Test
+	public void testIncludeRelativeDot()
+			throws IOException, ConfigInvalidException {
+		final File includedFile = createFile(CONTENT1.getBytes(), "dir1");
+		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		bos.write("[include]\npath=".getBytes());
+		bos.write(("./" + includedFile.getName()).getBytes());
+
+		final File file = createFile(bos.toByteArray(), "dir1");
+		final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+		config.load();
+		assertEquals(ALICE, config.getString(USER, null, NAME));
+	}
+
+	@Test
+	public void testIncludeRelativeDotDot()
+			throws IOException, ConfigInvalidException {
+		final File includedFile = createFile(CONTENT1.getBytes(), "dir1");
+		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		bos.write("[include]\npath=".getBytes());
+		bos.write(("../" + includedFile.getParentFile().getName() + "/"
+				+ includedFile.getName()).getBytes());
+
+		final File file = createFile(bos.toByteArray(), "dir2");
+		final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+		config.load();
+		assertEquals(ALICE, config.getString(USER, null, NAME));
+	}
+
+	@Test
+	public void testIncludeRelativeDotDotNotFound()
+			throws IOException, ConfigInvalidException {
+		final File includedFile = createFile(CONTENT1.getBytes());
+		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		bos.write("[include]\npath=".getBytes());
+		bos.write(("../" + includedFile.getName()).getBytes());
+
+		final File file = createFile(bos.toByteArray());
+		final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+		config.load();
+		assertEquals(null, config.getString(USER, null, NAME));
+	}
+
+	@Test
+	public void testIncludeWithTilde()
+			throws IOException, ConfigInvalidException {
+		final File includedFile = createFile(CONTENT1.getBytes(), "home");
+		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		bos.write("[include]\npath=".getBytes());
+		bos.write(("~/" + includedFile.getName()).getBytes());
+
+		final File file = createFile(bos.toByteArray(), "repo");
+		final FS fs = FS.DETECTED.newInstance();
+		fs.setUserHome(includedFile.getParentFile());
+
+		final FileBasedConfig config = new FileBasedConfig(file, fs);
+		config.load();
+		assertEquals(ALICE, config.getString(USER, null, NAME));
+	}
+
 	private File createFile(byte[] content) throws IOException {
-		trash.mkdirs();
-		File f = File.createTempFile(getClass().getName(), null, trash);
+		return createFile(content, null);
+	}
+
+	private File createFile(byte[] content, String subdir) throws IOException {
+		File dir = subdir != null ? new File(trash, subdir) : trash;
+		dir.mkdirs();
+
+		File f = File.createTempFile(getClass().getName(), null, dir);
 		FileOutputStream os = new FileOutputStream(f, true);
 		try {
 			os.write(content);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleDeinitTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleDeinitTest.java
new file mode 100644
index 0000000..df4b963
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleDeinitTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2017, Two Sigma Open Source
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.submodule;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.SubmoduleDeinitCommand;
+import org.eclipse.jgit.api.SubmoduleDeinitResult;
+import org.eclipse.jgit.api.SubmoduleUpdateCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.ConfigConstants;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests of {@link SubmoduleDeinitCommand}
+ */
+public class SubmoduleDeinitTest extends RepositoryTestCase {
+
+	@Test
+	public void repositoryWithNoSubmodules() throws GitAPIException {
+		SubmoduleDeinitCommand command = new SubmoduleDeinitCommand(db);
+		Collection<SubmoduleDeinitResult> modules = command.call();
+		assertNotNull(modules);
+		assertTrue(modules.isEmpty());
+	}
+
+	@Test
+	public void alreadyClosedSubmodule() throws Exception {
+		final String path = "sub";
+		Git git = Git.wrap(db);
+
+		commitSubmoduleCreation(path, git);
+
+		SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
+		assertEquals(path, result.getPath());
+		assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.ALREADY_DEINITIALIZED, result.getStatus());
+	}
+
+	@Test
+	public void dirtySubmoduleBecauseUntracked() throws Exception {
+		final String path = "sub";
+		Git git = Git.wrap(db);
+
+		commitSubmoduleCreation(path, git);
+
+		Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
+		assertEquals(1, updated.size());
+
+		File submoduleDir = assertSubmoduleIsInitialized();
+		SubmoduleWalk generator;
+
+		write(new File(submoduleDir, "untracked"), "untracked");
+
+		SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
+		assertEquals(path, result.getPath());
+		assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.DIRTY, result.getStatus());
+
+		generator = SubmoduleWalk.forIndex(db);
+		assertTrue(generator.next());
+		assertTrue(submoduleDir.isDirectory());
+		assertNotEquals(0, submoduleDir.list().length);
+	}
+
+	@Test
+	public void dirtySubmoduleBecauseNewCommit() throws Exception {
+		final String path = "sub";
+		Git git = Git.wrap(db);
+
+		commitSubmoduleCreation(path, git);
+
+		Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
+		assertEquals(1, updated.size());
+
+		File submoduleDir = assertSubmoduleIsInitialized();
+		SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
+		generator.next();
+
+		//want to create a commit inside the repo...
+		Repository submoduleLocalRepo = generator.getRepository();
+		JGitTestUtil.writeTrashFile(submoduleLocalRepo, "file.txt", "new data");
+		Git.wrap(submoduleLocalRepo).commit().setAll(true).setMessage("local commit").call();
+
+		SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
+		assertEquals(path, result.getPath());
+		assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.DIRTY, result.getStatus());
+
+		generator = SubmoduleWalk.forIndex(db);
+		assertTrue(generator.next());
+		assertTrue(submoduleDir.isDirectory());
+		assertNotEquals(0, submoduleDir.list().length);
+	}
+
+	private File assertSubmoduleIsInitialized() throws IOException {
+		SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
+		assertTrue(generator.next());
+		File submoduleDir = new File(db.getWorkTree(), generator.getPath());
+		assertTrue(submoduleDir.isDirectory());
+		assertNotEquals(0, submoduleDir.list().length);
+		return submoduleDir;
+	}
+
+	@Test
+	public void dirtySubmoduleWithForce() throws Exception {
+		final String path = "sub";
+		Git git = Git.wrap(db);
+
+		commitSubmoduleCreation(path, git);
+
+		Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
+		assertEquals(1, updated.size());
+
+		File submoduleDir = assertSubmoduleIsInitialized();
+
+		write(new File(submoduleDir, "untracked"), "untracked");
+
+		SubmoduleDeinitCommand command = new SubmoduleDeinitCommand(db).addPath("sub").setForce(true);
+		SubmoduleDeinitResult result = runDeinit(command);
+		assertEquals(path, result.getPath());
+		assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.FORCED, result.getStatus());
+
+		SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
+		assertTrue(generator.next());
+		assertTrue(submoduleDir.isDirectory());
+		assertEquals(0, submoduleDir.list().length);
+	}
+
+	@Test
+	public void cleanSubmodule() throws Exception {
+		final String path = "sub";
+		Git git = Git.wrap(db);
+
+		commitSubmoduleCreation(path, git);
+
+		Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
+		assertEquals(1, updated.size());
+
+		File submoduleDir = assertSubmoduleIsInitialized();
+
+		SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
+		assertEquals(path, result.getPath());
+		assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.SUCCESS, result.getStatus());
+
+		SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
+		assertTrue(generator.next());
+		assertTrue(submoduleDir.isDirectory());
+		assertEquals(0, submoduleDir.list().length);
+	}
+
+	private SubmoduleDeinitResult runDeinit(SubmoduleDeinitCommand command) throws GitAPIException {
+		Collection<SubmoduleDeinitResult> deinitialized = command.call();
+		assertNotNull(deinitialized);
+		assertEquals(1, deinitialized.size());
+		return deinitialized.iterator().next();
+	}
+
+
+	private RevCommit commitSubmoduleCreation(String path, Git git) throws IOException, GitAPIException {
+		writeTrashFile("file.txt", "content");
+		git.add().addFilepattern("file.txt").call();
+		final RevCommit commit = git.commit().setMessage("create file").call();
+
+		DirCache cache = db.lockDirCache();
+		DirCacheEditor editor = cache.editor();
+		editor.add(new PathEdit(path) {
+
+			@Override
+			public void apply(DirCacheEntry ent) {
+				ent.setFileMode(FileMode.GITLINK);
+				ent.setObjectId(commit);
+			}
+		});
+		editor.commit();
+
+		StoredConfig config = db.getConfig();
+		config.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
+				ConfigConstants.CONFIG_KEY_URL, db.getDirectory().toURI()
+						.toString());
+		config.save();
+
+		FileBasedConfig modulesConfig = new FileBasedConfig(new File(
+				db.getWorkTree(), Constants.DOT_GIT_MODULES), db.getFS());
+		modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
+				ConfigConstants.CONFIG_KEY_PATH, path);
+		modulesConfig.save();
+
+		new File(db.getWorkTree(), "sub").mkdir();
+		git.add().addFilepattern(Constants.DOT_GIT_MODULES).call();
+		git.commit().setMessage("create submodule").call();
+		return commit;
+	}
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/symlinks/SymlinksTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/symlinks/SymlinksTest.java
index 274fa53..7d54399 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/symlinks/SymlinksTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/symlinks/SymlinksTest.java
@@ -206,7 +206,7 @@
 	 * Steps: 1.Add file 'b' 2.Commit 3.Create branch '1' 4.Add symlink 'a'
 	 * 5.Commit 6.Checkout branch '1'
 	 *
-	 * The working tree should not contain 'a' -> FileMode.MISSING after the
+	 * The working tree should not contain 'a' -&gt; FileMode.MISSING after the
 	 * checkout.
 	 *
 	 * @throws Exception
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/test/resources/SampleDataRepositoryTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/test/resources/SampleDataRepositoryTestCase.java
index a57ef40..85a8aa7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/test/resources/SampleDataRepositoryTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/test/resources/SampleDataRepositoryTestCase.java
@@ -79,8 +79,7 @@
 				"pack-e6d07037cbcf13376308a0a995d1fa48f8f76aaa",
 				"pack-3280af9c07ee18a87705ef50b0cc4cd20266cf12"
 		};
-		final File packDir = new File(repo.getObjectDatabase().getDirectory(),
-				"pack");
+		final File packDir = repo.getObjectDatabase().getPackDirectory();
 		for (String n : packs) {
 			JGitTestUtil.copyTestResource(n + ".pack", new File(packDir, n + ".pack"));
 			JGitTestUtil.copyTestResource(n + ".idx", new File(packDir, n + ".idx"));
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 b2497b8..5d9bdbd 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
@@ -47,7 +47,6 @@
 package org.eclipse.jgit.transport;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -270,7 +269,7 @@
 			fail("PackParser should have failed");
 		} catch (TooLargeObjectInPackException e) {
 			assertTrue(e.getMessage().contains("13")); // max obj size
-			assertFalse(e.getMessage().contains("14")); // no delta size
+			assertTrue(e.getMessage().contains("14")); // delta size
 		}
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConnectionTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConnectionTest.java
index 0e4e9cc..c16c1b2 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConnectionTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/PushConnectionTest.java
@@ -184,7 +184,7 @@
 			updates.put(rru.getRemoteName(), rru);
 		}
 
-		server.getConfig().setInt("receive", null, "maxCommandBytes", 190);
+		server.getConfig().setInt("receive", null, "maxCommandBytes", 195);
 		try (Transport tn = testProtocol.open(uri, client, "server");
 				PushConnection connection = tn.openPush()) {
 			try {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
index e55d373..1eb218c 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
@@ -198,6 +198,10 @@
 		URIish u = new URIish(str);
 		assertEquals("file", u.getScheme());
 		assertFalse(u.isRemote());
+		assertEquals(null, u.getHost());
+		assertEquals(-1, u.getPort());
+		assertEquals(null, u.getUser());
+		assertEquals(null, u.getPass());
 		assertEquals("D:/m y", u.getRawPath());
 		assertEquals("D:/m y", u.getPath());
 		assertEquals("file:///D:/m y", u.toString());
@@ -206,6 +210,84 @@
 	}
 
 	@Test
+	public void testFileProtoWindowsWithHost() throws Exception {
+		final String str = "file://localhost/D:/m y";
+		URIish u = new URIish(str);
+		assertEquals("file", u.getScheme());
+		assertTrue(u.isRemote());
+		assertEquals("localhost", u.getHost());
+		assertEquals(-1, u.getPort());
+		assertEquals(null, u.getUser());
+		assertEquals(null, u.getPass());
+		assertEquals("D:/m y", u.getRawPath());
+		assertEquals("D:/m y", u.getPath());
+		assertEquals("file://localhost/D:/m y", u.toString());
+		assertEquals("file://localhost/D:/m%20y", u.toASCIIString());
+		assertEquals(u, new URIish(str));
+	}
+
+	@Test
+	public void testFileProtoWindowsWithHostAndPort() throws Exception {
+		final String str = "file://localhost:80/D:/m y";
+		URIish u = new URIish(str);
+		assertEquals("file", u.getScheme());
+		assertTrue(u.isRemote());
+		assertEquals("localhost", u.getHost());
+		assertEquals(80, u.getPort());
+		assertEquals(null, u.getUser());
+		assertEquals(null, u.getPass());
+		assertEquals("D:/m y", u.getRawPath());
+		assertEquals("D:/m y", u.getPath());
+		assertEquals("file://localhost:80/D:/m y", u.toString());
+		assertEquals("file://localhost:80/D:/m%20y", u.toASCIIString());
+		assertEquals(u, new URIish(str));
+	}
+
+	@Test
+	public void testFileProtoWindowsWithHostAndEmptyPortIsAmbiguous()
+			throws Exception {
+		final String str = "file://localhost:/D:/m y";
+		URIish u = new URIish(str);
+		assertEquals("file", u.getScheme());
+		assertFalse(u.isRemote());
+		assertEquals(null, u.getHost());
+		assertEquals(-1, u.getPort());
+		assertEquals(null, u.getUser());
+		assertEquals(null, u.getPass());
+		assertEquals("localhost:/D:/m y", u.getRawPath());
+		assertEquals("localhost:/D:/m y", u.getPath());
+		assertEquals("file:///localhost:/D:/m y", u.toString());
+		assertEquals("file:///localhost:/D:/m%20y", u.toASCIIString());
+		assertEquals(u, new URIish(str));
+	}
+
+	@Test
+	public void testFileProtoWindowsMissingHostSlash() throws Exception {
+		final String str = "file://D:/m y";
+		URIish u = new URIish(str);
+		assertEquals("file", u.getScheme());
+		assertFalse(u.isRemote());
+		assertEquals("D:/m y", u.getRawPath());
+		assertEquals("D:/m y", u.getPath());
+		assertEquals("file:///D:/m y", u.toString());
+		assertEquals("file:///D:/m%20y", u.toASCIIString());
+		assertEquals(u, new URIish(str));
+	}
+
+	@Test
+	public void testFileProtoWindowsMissingHostSlash2() throws Exception {
+		final String str = "file://D: /m y";
+		URIish u = new URIish(str);
+		assertEquals("file", u.getScheme());
+		assertFalse(u.isRemote());
+		assertEquals("D: /m y", u.getRawPath());
+		assertEquals("D: /m y", u.getPath());
+		assertEquals("file:///D: /m y", u.toString());
+		assertEquals("file:///D:%20/m%20y", u.toASCIIString());
+		assertEquals(u, new URIish(str));
+	}
+
+	@Test
 	public void testGitProtoUnix() throws Exception {
 		final String str = "git://example.com/home/m y";
 		URIish u = new URIish(str);
@@ -421,6 +503,22 @@
 	}
 
 	@Test
+	public void testSshProtoHostWithEmptyPortAndPath() throws Exception {
+		final String str = "ssh://example.com:/path";
+		URIish u = new URIish(str);
+		assertEquals("ssh", u.getScheme());
+		assertTrue(u.isRemote());
+		assertEquals("/path", u.getRawPath());
+		assertEquals("/path", u.getPath());
+		assertEquals("example.com", u.getHost());
+		assertEquals(-1, u.getPort());
+		assertEquals("ssh://example.com/path", u.toString());
+		assertEquals("ssh://example.com/path", u.toASCIIString());
+		assertEquals(u, new URIish(str));
+		assertEquals(u, new URIish("ssh://example.com/path"));
+	}
+
+	@Test
 	public void testSshProtoWithUserAndPort() throws Exception {
 		final String str = "ssh://user@example.com:33/some/p ath";
 		URIish u = new URIish(str);
@@ -891,13 +989,6 @@
 	}
 
 	@Test
-	public void testMissingPort() throws URISyntaxException {
-		final String incorrectSshUrl = "ssh://some-host:/path/to/repository.git";
-		URIish u = new URIish(incorrectSshUrl);
-		assertFalse(TransportGitSsh.PROTO_SSH.canHandle(u));
-	}
-
-	@Test
 	public void testALot() throws URISyntaxException {
 		// user pass host port path
 		// 1 2 3 4 5
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 27c7674..a8127ab 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
@@ -4,24 +4,33 @@
 import static org.junit.Assert.assertTrue;
 
 import java.util.Collections;
+import org.eclipse.jgit.errors.TransportException;
+import org.eclipse.jgit.internal.storage.dfs.DfsGarbageCollector;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevBlob;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.transport.UploadPack.RequestPolicy;
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 import org.eclipse.jgit.transport.resolver.UploadPackFactory;
+import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 /**
  * Tests for server upload-pack utilities.
  */
 public class UploadPackTest {
+	@Rule
+	public ExpectedException thrown = ExpectedException.none();
+
 	private URIish uri;
 
 	private TestProtocol<Object> testProtocol;
@@ -32,23 +41,14 @@
 
 	private InMemoryRepository client;
 
-	private RevCommit commit0;
-
-	private RevCommit commit1;
-
-	private RevCommit tip;
+	private TestRepository<InMemoryRepository> remote;
 
 	@Before
 	public void setUp() throws Exception {
 		server = newRepo("server");
 		client = newRepo("client");
 
-		TestRepository<InMemoryRepository> remote =
-				new TestRepository<>(server);
-		commit0 = remote.commit().message("0").create();
-		commit1 = remote.commit().message("1").parent(commit0).create();
-		tip = remote.commit().message("2").parent(commit1).create();
-		remote.update("master", tip);
+		remote = new TestRepository<>(server);
 	}
 
 	@After
@@ -60,8 +60,32 @@
 		return new InMemoryRepository(new DfsRepositoryDescription(name));
 	}
 
+	private void generateBitmaps(InMemoryRepository repo) throws Exception {
+		new DfsGarbageCollector(repo).pack(null);
+		repo.scanForRepoChanges();
+	}
+
+	private static TestProtocol<Object> generateReachableCommitUploadPackProtocol() {
+		return new TestProtocol<>(
+				new UploadPackFactory<Object>() {
+					@Override
+					public UploadPack create(Object req, Repository db)
+							throws ServiceNotEnabledException,
+							ServiceNotAuthorizedException {
+						UploadPack up = new UploadPack(db);
+						up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT);
+						return up;
+					}
+				}, null);
+	}
+
 	@Test
 	public void testFetchParentOfShallowCommit() throws Exception {
+		RevCommit commit0 = remote.commit().message("0").create();
+		RevCommit commit1 = remote.commit().message("1").parent(commit0).create();
+		RevCommit tip = remote.commit().message("2").parent(commit1).create();
+		remote.update("master", tip);
+
 		testProtocol = new TestProtocol<>(
 				new UploadPackFactory<Object>() {
 					@Override
@@ -87,4 +111,63 @@
 			assertTrue(client.hasObject(commit0.toObjectId()));
 		}
 	}
+
+	@Test
+	public void testFetchUnreachableBlobWithBitmap() throws Exception {
+		RevBlob blob = remote.blob("foo");
+		remote.commit(remote.tree(remote.file("foo", blob)));
+		generateBitmaps(server);
+
+		testProtocol = generateReachableCommitUploadPackProtocol();
+		uri = testProtocol.register(ctx, server);
+
+		assertFalse(client.hasObject(blob.toObjectId()));
+
+		try (Transport tn = testProtocol.open(uri, client, "server")) {
+			thrown.expect(TransportException.class);
+			thrown.expectMessage(Matchers.containsString(
+						"want " + blob.name() + " not valid"));
+			tn.fetch(NullProgressMonitor.INSTANCE,
+					Collections.singletonList(new RefSpec(blob.name())));
+		}
+	}
+
+	@Test
+	public void testFetchReachableBlobWithBitmap() throws Exception {
+		RevBlob blob = remote.blob("foo");
+		RevCommit commit = remote.commit(remote.tree(remote.file("foo", blob)));
+		remote.update("master", commit);
+		generateBitmaps(server);
+
+		testProtocol = generateReachableCommitUploadPackProtocol();
+		uri = testProtocol.register(ctx, server);
+
+		assertFalse(client.hasObject(blob.toObjectId()));
+
+		try (Transport tn = testProtocol.open(uri, client, "server")) {
+			tn.fetch(NullProgressMonitor.INSTANCE,
+					Collections.singletonList(new RefSpec(blob.name())));
+			assertTrue(client.hasObject(blob.toObjectId()));
+		}
+	}
+
+	@Test
+	public void testFetchReachableBlobWithoutBitmap() throws Exception {
+		RevBlob blob = remote.blob("foo");
+		RevCommit commit = remote.commit(remote.tree(remote.file("foo", blob)));
+		remote.update("master", commit);
+
+		testProtocol = generateReachableCommitUploadPackProtocol();
+		uri = testProtocol.register(ctx, server);
+
+		assertFalse(client.hasObject(blob.toObjectId()));
+
+		try (Transport tn = testProtocol.open(uri, client, "server")) {
+			thrown.expect(TransportException.class);
+			thrown.expectMessage(Matchers.containsString(
+						"want " + blob.name() + " not valid"));
+			tn.fetch(NullProgressMonitor.INSTANCE,
+					Collections.singletonList(new RefSpec(blob.name())));
+		}
+	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorWithTimeControl.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorWithTimeControl.java
index ff5730e..717a2f3 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorWithTimeControl.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorWithTimeControl.java
@@ -58,10 +58,10 @@
  * <p>
  * This iterator is configured by a list of strictly increasing long values
  * t(0), t(1), ..., t(n). For each file with a modification between t(x) and
- * t(x+1) [ t(x) <= time < t(x+1) ] this iterator will report t(x). For files
- * with a modification time smaller t(0) a modification time of 0 is returned.
- * For files with a modification time greater or equal t(n) t(n) will be
- * returned.
+ * t(x+1) [ t(x) &lt;= time &lt; t(x+1) ] this iterator will report t(x). For
+ * files with a modification time smaller t(0) a modification time of 0 is
+ * returned. For files with a modification time greater or equal t(n) t(n) will
+ * be returned.
  * <p>
  * This class was written especially to test racy-git problems
  */
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/QuotedStringGitPathStyleTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/QuotedStringGitPathStyleTest.java
index cc73c70..a6f3345 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/QuotedStringGitPathStyleTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/QuotedStringGitPathStyleTest.java
@@ -43,14 +43,13 @@
 
 package org.eclipse.jgit.util;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static org.eclipse.jgit.util.QuotedString.GIT_PATH;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
 
-import java.io.UnsupportedEncodingException;
-
 import org.eclipse.jgit.lib.Constants;
 import org.junit.Test;
 
@@ -63,12 +62,7 @@
 	}
 
 	private static void assertDequote(final String exp, final String in) {
-		final byte[] b;
-		try {
-			b = ('"' + in + '"').getBytes("ISO-8859-1");
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
+		final byte[] b = ('"' + in + '"').getBytes(ISO_8859_1);
 		final String r = GIT_PATH.dequote(b, 0, b.length);
 		assertEquals(exp, r);
 	}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawCharUtilTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawCharUtilTest.java
index a8c5763..f1b3da2 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawCharUtilTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawCharUtilTest.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.util;
 
+import static java.nio.charset.StandardCharsets.US_ASCII;
 import static org.eclipse.jgit.util.RawCharUtil.isWhitespace;
 import static org.eclipse.jgit.util.RawCharUtil.trimLeadingWhitespace;
 import static org.eclipse.jgit.util.RawCharUtil.trimTrailingWhitespace;
@@ -50,8 +51,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.io.UnsupportedEncodingException;
-
 import org.junit.Test;
 
 public class RawCharUtilTest {
@@ -78,37 +77,31 @@
 	/**
 	 * Test method for
 	 * {@link RawCharUtil#trimTrailingWhitespace(byte[], int, int)}.
-	 *
-	 * @throws UnsupportedEncodingException
 	 */
 	@Test
-	public void testTrimTrailingWhitespace()
-			throws UnsupportedEncodingException {
-		assertEquals(0, trimTrailingWhitespace("".getBytes("US-ASCII"), 0, 0));
-		assertEquals(0, trimTrailingWhitespace(" ".getBytes("US-ASCII"), 0, 1));
-		assertEquals(1, trimTrailingWhitespace("a ".getBytes("US-ASCII"), 0, 2));
-		assertEquals(2,
-				trimTrailingWhitespace(" a ".getBytes("US-ASCII"), 0, 3));
-		assertEquals(3,
-				trimTrailingWhitespace("  a".getBytes("US-ASCII"), 0, 3));
-		assertEquals(6, trimTrailingWhitespace(
-				"  test   ".getBytes("US-ASCII"), 2, 9));
+	public void testTrimTrailingWhitespace() {
+		assertEquals(0, trimTrailingWhitespace("".getBytes(US_ASCII), 0, 0));
+		assertEquals(0, trimTrailingWhitespace(" ".getBytes(US_ASCII), 0, 1));
+		assertEquals(1, trimTrailingWhitespace("a ".getBytes(US_ASCII), 0, 2));
+		assertEquals(2, trimTrailingWhitespace(" a ".getBytes(US_ASCII), 0, 3));
+		assertEquals(3, trimTrailingWhitespace("  a".getBytes(US_ASCII), 0, 3));
+		assertEquals(6,
+				trimTrailingWhitespace("  test   ".getBytes(US_ASCII), 2, 9));
 	}
 
 	/**
 	 * Test method for
 	 * {@link RawCharUtil#trimLeadingWhitespace(byte[], int, int)}.
-	 *
-	 * @throws UnsupportedEncodingException
 	 */
 	@Test
-	public void testTrimLeadingWhitespace() throws UnsupportedEncodingException {
-		assertEquals(0, trimLeadingWhitespace("".getBytes("US-ASCII"), 0, 0));
-		assertEquals(1, trimLeadingWhitespace(" ".getBytes("US-ASCII"), 0, 1));
-		assertEquals(0, trimLeadingWhitespace("a ".getBytes("US-ASCII"), 0, 2));
-		assertEquals(1, trimLeadingWhitespace(" a ".getBytes("US-ASCII"), 0, 3));
-		assertEquals(2, trimLeadingWhitespace("  a".getBytes("US-ASCII"), 0, 3));
-		assertEquals(2, trimLeadingWhitespace("  test   ".getBytes("US-ASCII"),
+	public void testTrimLeadingWhitespace() {
+		assertEquals(0, trimLeadingWhitespace("".getBytes(US_ASCII), 0, 0));
+		assertEquals(1, trimLeadingWhitespace(" ".getBytes(US_ASCII), 0, 1));
+		assertEquals(0, trimLeadingWhitespace("a ".getBytes(US_ASCII), 0, 2));
+		assertEquals(1, trimLeadingWhitespace(" a ".getBytes(US_ASCII), 0, 3));
+		assertEquals(2, trimLeadingWhitespace("  a".getBytes(US_ASCII), 0, 3));
+		assertEquals(2,
+				trimLeadingWhitespace("  test   ".getBytes(US_ASCII),
 				2, 9));
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java
index 6efdce6..0243798 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java
@@ -43,11 +43,10 @@
 
 package org.eclipse.jgit.util;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertNotNull;
 
-import java.io.UnsupportedEncodingException;
-
 import org.junit.Test;
 
 public class RawParseUtils_LineMapTest {
@@ -65,29 +64,29 @@
 	}
 
 	@Test
-	public void testTwoLineFooBar() throws UnsupportedEncodingException {
-		final byte[] buf = "foo\nbar\n".getBytes("ISO-8859-1");
+	public void testTwoLineFooBar() {
+		final byte[] buf = "foo\nbar\n".getBytes(ISO_8859_1);
 		final IntList map = RawParseUtils.lineMap(buf, 0, buf.length);
 		assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 4, buf.length}, asInts(map));
 	}
 
 	@Test
-	public void testTwoLineNoLF() throws UnsupportedEncodingException {
-		final byte[] buf = "foo\nbar".getBytes("ISO-8859-1");
+	public void testTwoLineNoLF() {
+		final byte[] buf = "foo\nbar".getBytes(ISO_8859_1);
 		final IntList map = RawParseUtils.lineMap(buf, 0, buf.length);
 		assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 4, buf.length}, asInts(map));
 	}
 
 	@Test
-	public void testBinary() throws UnsupportedEncodingException {
-		final byte[] buf = "xxxfoo\nb\0ar".getBytes("ISO-8859-1");
+	public void testBinary() {
+		final byte[] buf = "xxxfoo\nb\0ar".getBytes(ISO_8859_1);
 		final IntList map = RawParseUtils.lineMap(buf, 3, buf.length);
 		assertArrayEquals(new int[]{Integer.MIN_VALUE, 3, buf.length}, asInts(map));
 	}
 
 	@Test
-	public void testFourLineBlanks() throws UnsupportedEncodingException {
-		final byte[] buf = "foo\n\n\nbar\n".getBytes("ISO-8859-1");
+	public void testFourLineBlanks() {
+		final byte[] buf = "foo\n\n\nbar\n".getBytes(ISO_8859_1);
 		final IntList map = RawParseUtils.lineMap(buf, 0, buf.length);
 
 		assertArrayEquals(new int[]{
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawSubStringPatternTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawSubStringPatternTest.java
index 194fab4..e8566d2 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawSubStringPatternTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawSubStringPatternTest.java
@@ -42,11 +42,10 @@
  */
 package org.eclipse.jgit.util;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import java.io.UnsupportedEncodingException;
-
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.junit.Test;
 
@@ -94,11 +93,7 @@
 	}
 
 	private static RawCharSequence raw(String text) {
-		try {
-			byte[] bytes = text.getBytes("UTF-8");
-			return new RawCharSequence(bytes, 0, bytes.length);
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
+		byte[] bytes = text.getBytes(UTF_8);
+		return new RawCharSequence(bytes, 0, bytes.length);
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/AutoLFInputStreamTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/AutoLFInputStreamTest.java
index 40cac93..38199d8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/AutoLFInputStreamTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/AutoLFInputStreamTest.java
@@ -44,12 +44,12 @@
 
 package org.eclipse.jgit.util.io;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
 
 import org.junit.Test;
 
@@ -129,10 +129,6 @@
 	}
 
 	private static byte[] asBytes(String in) {
-		try {
-			return in.getBytes("UTF-8");
-		} catch (UnsupportedEncodingException ex) {
-			throw new AssertionError();
-		}
+		return in.getBytes(UTF_8);
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/sha1/SHA1Test.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/sha1/SHA1Test.java
index 0778989..e6045a9 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/sha1/SHA1Test.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/sha1/SHA1Test.java
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.util.sha1;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -51,7 +52,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 
@@ -95,15 +95,15 @@
 				.fromString("a9993e364706816aba3e25717850c26c9cd0d89d");
 
 		MessageDigest m = MessageDigest.getInstance("SHA-1");
-		m.update(TEST1.getBytes(StandardCharsets.UTF_8));
+		m.update(TEST1.getBytes(UTF_8));
 		ObjectId m1 = ObjectId.fromRaw(m.digest());
 
 		SHA1 s = SHA1.newInstance();
-		s.update(TEST1.getBytes(StandardCharsets.UTF_8));
+		s.update(TEST1.getBytes(UTF_8));
 		ObjectId s1 = ObjectId.fromRaw(s.digest());
 
 		s.reset();
-		s.update(TEST1.getBytes(StandardCharsets.UTF_8));
+		s.update(TEST1.getBytes(UTF_8));
 		ObjectId s2 = s.toObjectId();
 
 		assertEquals(m1, s1);
@@ -117,15 +117,15 @@
 				.fromString("84983e441c3bd26ebaae4aa1f95129e5e54670f1");
 
 		MessageDigest m = MessageDigest.getInstance("SHA-1");
-		m.update(TEST2.getBytes(StandardCharsets.UTF_8));
+		m.update(TEST2.getBytes(UTF_8));
 		ObjectId m1 = ObjectId.fromRaw(m.digest());
 
 		SHA1 s = SHA1.newInstance();
-		s.update(TEST2.getBytes(StandardCharsets.UTF_8));
+		s.update(TEST2.getBytes(UTF_8));
 		ObjectId s1 = ObjectId.fromRaw(s.digest());
 
 		s.reset();
-		s.update(TEST2.getBytes(StandardCharsets.UTF_8));
+		s.update(TEST2.getBytes(UTF_8));
 		ObjectId s2 = s.toObjectId();
 
 		assertEquals(m1, s1);
diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
index f810bf7..d1709f8 100644
--- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF
@@ -2,15 +2,16 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit.ui
 Bundle-SymbolicName: org.eclipse.jgit.ui
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Vendor: %provider_name
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.jgit.awtui;version="4.9.9"
-Import-Package: org.eclipse.jgit.errors;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.lib;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.nls;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revplot;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.revwalk;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.transport;version="[4.9.9,4.10.0)",
- org.eclipse.jgit.util;version="[4.9.9,4.10.0)"
+Export-Package: org.eclipse.jgit.awtui;version="4.10.1"
+Import-Package: org.eclipse.jgit.errors;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.lib;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.nls;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revplot;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.revwalk;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.transport;version="[4.10.1,4.11.0)",
+ org.eclipse.jgit.util;version="[4.10.1,4.11.0)"
diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml
index 45997a2..4979f08 100644
--- a/org.eclipse.jgit.ui/pom.xml
+++ b/org.eclipse.jgit.ui/pom.xml
@@ -52,7 +52,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit.ui</artifactId>
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AWTPlotRenderer.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AWTPlotRenderer.java
index 632114f..bccf0c0 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AWTPlotRenderer.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AWTPlotRenderer.java
@@ -84,6 +84,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void drawLine(final Color color, int x1, int y1, int x2,
 			int y2, int width) {
@@ -100,6 +101,7 @@
 		g.drawLine(x1, y1, x2, y2);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void drawCommitDot(final int x, final int y, final int w,
 			final int h) {
@@ -110,6 +112,7 @@
 		g.drawOval(x, y, w, h);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void drawBoundaryDot(final int x, final int y, final int w,
 			final int h) {
@@ -120,6 +123,7 @@
 		g.drawOval(x, y, w, h);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void drawText(final String msg, final int x, final int y) {
 		final int texth = g.getFontMetrics().getHeight();
@@ -128,6 +132,7 @@
 		g.drawString(msg, x, y0 + texth - g.getFontMetrics().getDescent());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Color laneColor(final SwingLane myLane) {
 		return myLane != null ? myLane.color : Color.black;
@@ -147,6 +152,7 @@
 		g.drawPolygon(triangle);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int drawLabel(int x, int y, Ref ref) {
 		String txt;
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 486bbf6..dfa6e2b 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
@@ -58,13 +58,18 @@
 
 import org.eclipse.jgit.util.CachedAuthenticator;
 
-/** Basic network prompt for username/password when using AWT. */
+/**
+ * Basic network prompt for username/password when using AWT.
+ */
 public class AwtAuthenticator extends CachedAuthenticator {
-	/** Install this authenticator implementation into the JVM. */
+	/**
+	 * Install this authenticator implementation into the JVM.
+	 */
 	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 a9967ae..edf94cf 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
@@ -62,9 +62,13 @@
 import org.eclipse.jgit.transport.NetRCCredentialsProvider;
 import org.eclipse.jgit.transport.URIish;
 
-/** Interacts with the user during authentication by using AWT/Swing dialogs. */
+/**
+ * Interacts with the user during authentication by using AWT/Swing dialogs.
+ */
 public class AwtCredentialsProvider extends CredentialsProvider {
-	/** Install this implementation as the default. */
+	/**
+	 * Install this implementation as the default.
+	 */
 	public static void install() {
 		final AwtCredentialsProvider c = new AwtCredentialsProvider();
 		CredentialsProvider cp = new ChainingCredentialsProvider(
@@ -72,11 +76,13 @@
 		CredentialsProvider.setDefault(cp);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -98,6 +104,7 @@
 		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 4c8cf53..d122a77 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
@@ -81,7 +81,9 @@
 
 	private final SwingCommitList allCommits;
 
-	/** Create a new empty panel. */
+	/**
+	 * Create a new empty panel.
+	 */
 	public CommitGraphPane() {
 		allCommits = new SwingCommitList();
 		configureHeader();
@@ -110,6 +112,7 @@
 		return allCommits;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setModel(final TableModel dataModel) {
 		if (dataModel != null && !(dataModel instanceof CommitTableModel))
@@ -117,6 +120,7 @@
 		super.setModel(dataModel);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected TableModel createDefaultDataModel() {
 		return new CommitTableModel();
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java
index fe0c486..743eb78 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/SwingCommitList.java
@@ -67,6 +67,7 @@
 		colors.add(Color.orange);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected SwingLane createLane() {
 		final SwingLane lane = new SwingLane();
@@ -76,6 +77,7 @@
 		return lane;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void recycleLane(final SwingLane lane) {
 		colors.add(lane.color);
diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/UIText.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/UIText.java
index d9b6d9c..b2b19ad 100644
--- a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/UIText.java
+++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/UIText.java
@@ -52,6 +52,8 @@
 public class UIText extends TranslationBundle {
 
 	/**
+	 * Get an instance of this translation bundle.
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static UIText get() {
diff --git a/org.eclipse.jgit/.settings/.api_filters b/org.eclipse.jgit/.settings/.api_filters
index f746d88..d30eafe 100644
--- a/org.eclipse.jgit/.settings/.api_filters
+++ b/org.eclipse.jgit/.settings/.api_filters
@@ -3,23 +3,8 @@
     <resource path="META-INF/MANIFEST.MF">
         <filter id="924844039">
             <message_arguments>
-                <message_argument value="4.9.8"/>
-                <message_argument value="4.9.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jgit/lib/ConfigConstants.java" type="org.eclipse.jgit.lib.ConfigConstants">
-        <filter id="336658481">
-            <message_arguments>
-                <message_argument value="org.eclipse.jgit.lib.ConfigConstants"/>
-                <message_argument value="CONFIG_KEY_SUPPORTSATOMICFILECREATION"/>
-            </message_arguments>
-        </filter>
-        <filter id="1141899266">
-            <message_arguments>
-                <message_argument value="4.5"/>
-                <message_argument value="4.9"/>
-                <message_argument value="CONFIG_KEY_SUPPORTSATOMICFILECREATION"/>
+                <message_argument value="4.10.1"/>
+                <message_argument value="4.10.0"/>
             </message_arguments>
         </filter>
     </resource>
@@ -27,7 +12,7 @@
         <filter id="1141899266">
             <message_arguments>
                 <message_argument value="4.7"/>
-                <message_argument value="4.9"/>
+                <message_argument value="4.10"/>
                 <message_argument value="LOCK_SUFFIX"/>
             </message_arguments>
         </filter>
@@ -48,34 +33,11 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="src/org/eclipse/jgit/merge/ResolveMerger.java" type="org.eclipse.jgit.merge.ResolveMerger">
-        <filter id="1141899266">
-            <message_arguments>
-                <message_argument value="3.5"/>
-                <message_argument value="4.9"/>
-                <message_argument value="processEntry(CanonicalTreeParser, CanonicalTreeParser, CanonicalTreeParser, DirCacheBuildIterator, WorkingTreeIterator, boolean)"/>
-            </message_arguments>
-        </filter>
-    </resource>
     <resource path="src/org/eclipse/jgit/util/FS.java" type="org.eclipse.jgit.util.FS">
         <filter id="1141899266">
             <message_arguments>
-                <message_argument value="4.5"/>
-                <message_argument value="4.9"/>
-                <message_argument value="createNewFile(File)"/>
-            </message_arguments>
-        </filter>
-        <filter id="1141899266">
-            <message_arguments>
-                <message_argument value="4.5"/>
-                <message_argument value="4.9"/>
-                <message_argument value="supportsAtomicCreateNewFile()"/>
-            </message_arguments>
-        </filter>
-        <filter id="1141899266">
-            <message_arguments>
                 <message_argument value="4.7"/>
-                <message_argument value="4.9"/>
+                <message_argument value="4.10"/>
                 <message_argument value="createNewFileAtomic(File)"/>
             </message_arguments>
         </filter>
@@ -84,7 +46,7 @@
         <filter id="1141899266">
             <message_arguments>
                 <message_argument value="4.7"/>
-                <message_argument value="4.9"/>
+                <message_argument value="4.10"/>
                 <message_argument value="LockToken"/>
             </message_arguments>
         </filter>
diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF
index daf17e0..b2d7c8e 100644
--- a/org.eclipse.jgit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/MANIFEST.MF
@@ -1,13 +1,14 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin_name
+Automatic-Module-Name: org.eclipse.jgit
 Bundle-SymbolicName: org.eclipse.jgit
-Bundle-Version: 4.9.9.qualifier
+Bundle-Version: 4.10.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %provider_name
 Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jgit.annotations;version="4.9.9",
- org.eclipse.jgit.api;version="4.9.9";
+Export-Package: org.eclipse.jgit.annotations;version="4.10.1",
+ org.eclipse.jgit.api;version="4.10.1";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.diff,
@@ -21,52 +22,52 @@
    org.eclipse.jgit.submodule,
    org.eclipse.jgit.transport,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.api.errors;version="4.9.9";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.errors",
- org.eclipse.jgit.attributes;version="4.9.9",
- org.eclipse.jgit.blame;version="4.9.9";
+ org.eclipse.jgit.api.errors;version="4.10.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.errors",
+ org.eclipse.jgit.attributes;version="4.10.1",
+ org.eclipse.jgit.blame;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.diff",
- org.eclipse.jgit.diff;version="4.9.9";
+ org.eclipse.jgit.diff;version="4.10.1";
   uses:="org.eclipse.jgit.patch,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.util",
- org.eclipse.jgit.dircache;version="4.9.9";
+ org.eclipse.jgit.dircache;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.util,
    org.eclipse.jgit.events,
    org.eclipse.jgit.attributes",
- org.eclipse.jgit.errors;version="4.9.9";
+ org.eclipse.jgit.errors;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.internal.storage.pack,
    org.eclipse.jgit.transport,
    org.eclipse.jgit.dircache",
- org.eclipse.jgit.events;version="4.9.9";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.fnmatch;version="4.9.9",
- org.eclipse.jgit.gitrepo;version="4.9.9";
+ org.eclipse.jgit.events;version="4.10.1";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.fnmatch;version="4.10.1",
+ org.eclipse.jgit.gitrepo;version="4.10.1";
   uses:="org.eclipse.jgit.api,
    org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.xml.sax.helpers,
    org.xml.sax",
- org.eclipse.jgit.gitrepo.internal;version="4.9.9";x-internal:=true,
- org.eclipse.jgit.hooks;version="4.9.9";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.ignore;version="4.9.9",
- org.eclipse.jgit.ignore.internal;version="4.9.9";x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal;version="4.9.9";x-friends:="org.eclipse.jgit.test,org.eclipse.jgit.http.test",
- org.eclipse.jgit.internal.fsck;version="4.9.9";x-friends:="org.eclipse.jgit.test",
- org.eclipse.jgit.internal.ketch;version="4.9.9";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.dfs;version="4.9.9";
+ org.eclipse.jgit.gitrepo.internal;version="4.10.1";x-internal:=true,
+ org.eclipse.jgit.hooks;version="4.10.1";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.ignore;version="4.10.1",
+ org.eclipse.jgit.ignore.internal;version="4.10.1";x-friends:="org.eclipse.jgit.test",
+ org.eclipse.jgit.internal;version="4.10.1";x-friends:="org.eclipse.jgit.test,org.eclipse.jgit.http.test",
+ org.eclipse.jgit.internal.fsck;version="4.10.1";x-friends:="org.eclipse.jgit.test",
+ org.eclipse.jgit.internal.ketch;version="4.10.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
+ org.eclipse.jgit.internal.storage.dfs;version="4.10.1";
   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="4.9.9";
+ org.eclipse.jgit.internal.storage.file;version="4.10.1";
   x-friends:="org.eclipse.jgit.test,
    org.eclipse.jgit.junit,
    org.eclipse.jgit.junit.http,
@@ -74,11 +75,12 @@
    org.eclipse.jgit.lfs,
    org.eclipse.jgit.pgm,
    org.eclipse.jgit.pgm.test",
- org.eclipse.jgit.internal.storage.io;version="4.9.9";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.pack;version="4.9.9";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.reftable;version="4.9.9";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
- org.eclipse.jgit.internal.storage.reftree;version="4.9.9";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
- org.eclipse.jgit.lib;version="4.9.9";
+ org.eclipse.jgit.internal.storage.io;version="4.10.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
+ org.eclipse.jgit.internal.storage.pack;version="4.10.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
+ org.eclipse.jgit.internal.storage.reftable;version="4.10.1";
+  x-friends:="org.eclipse.jgit.http.test,org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
+ org.eclipse.jgit.internal.storage.reftree;version="4.10.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
+ org.eclipse.jgit.lib;version="4.10.1";
   uses:="org.eclipse.jgit.revwalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.util,
@@ -88,33 +90,33 @@
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.transport,
    org.eclipse.jgit.submodule",
- org.eclipse.jgit.lib.internal;version="4.9.9";x-internal:=true,
- org.eclipse.jgit.merge;version="4.9.9";
+ org.eclipse.jgit.lib.internal;version="4.10.1";x-internal:=true,
+ org.eclipse.jgit.merge;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.dircache,
    org.eclipse.jgit.api",
- org.eclipse.jgit.nls;version="4.9.9",
- org.eclipse.jgit.notes;version="4.9.9";
+ org.eclipse.jgit.nls;version="4.10.1",
+ org.eclipse.jgit.notes;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.merge",
- org.eclipse.jgit.patch;version="4.9.9";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.diff",
- org.eclipse.jgit.revplot;version="4.9.9";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.revwalk",
- org.eclipse.jgit.revwalk;version="4.9.9";
+ org.eclipse.jgit.patch;version="4.10.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.diff",
+ org.eclipse.jgit.revplot;version="4.10.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.revwalk",
+ org.eclipse.jgit.revwalk;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.treewalk,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.diff,
    org.eclipse.jgit.revwalk.filter",
- org.eclipse.jgit.revwalk.filter;version="4.9.9";uses:="org.eclipse.jgit.revwalk,org.eclipse.jgit.lib,org.eclipse.jgit.util",
- org.eclipse.jgit.storage.file;version="4.9.9";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.util",
- org.eclipse.jgit.storage.pack;version="4.9.9";uses:="org.eclipse.jgit.lib",
- org.eclipse.jgit.submodule;version="4.9.9";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.treewalk.filter,org.eclipse.jgit.treewalk",
- org.eclipse.jgit.transport;version="4.9.9";
+ org.eclipse.jgit.revwalk.filter;version="4.10.1";uses:="org.eclipse.jgit.revwalk,org.eclipse.jgit.lib,org.eclipse.jgit.util",
+ org.eclipse.jgit.storage.file;version="4.10.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.util",
+ org.eclipse.jgit.storage.pack;version="4.10.1";uses:="org.eclipse.jgit.lib",
+ org.eclipse.jgit.submodule;version="4.10.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.treewalk.filter,org.eclipse.jgit.treewalk",
+ org.eclipse.jgit.transport;version="4.10.1";
   uses:="org.eclipse.jgit.transport.resolver,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.internal.storage.pack,
@@ -126,24 +128,24 @@
    org.eclipse.jgit.transport.http,
    org.eclipse.jgit.errors,
    org.eclipse.jgit.storage.pack",
- org.eclipse.jgit.transport.http;version="4.9.9";uses:="javax.net.ssl",
- org.eclipse.jgit.transport.resolver;version="4.9.9";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.transport",
- org.eclipse.jgit.treewalk;version="4.9.9";
+ org.eclipse.jgit.transport.http;version="4.10.1";uses:="javax.net.ssl",
+ org.eclipse.jgit.transport.resolver;version="4.10.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.transport",
+ org.eclipse.jgit.treewalk;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.revwalk,
    org.eclipse.jgit.attributes,
    org.eclipse.jgit.treewalk.filter,
    org.eclipse.jgit.util,
    org.eclipse.jgit.dircache",
- org.eclipse.jgit.treewalk.filter;version="4.9.9";uses:="org.eclipse.jgit.treewalk",
- org.eclipse.jgit.util;version="4.9.9";
+ org.eclipse.jgit.treewalk.filter;version="4.10.1";uses:="org.eclipse.jgit.treewalk",
+ org.eclipse.jgit.util;version="4.10.1";
   uses:="org.eclipse.jgit.lib,
    org.eclipse.jgit.transport.http,
    org.eclipse.jgit.storage.file,
    org.ietf.jgss",
- org.eclipse.jgit.util.io;version="4.9.9",
- org.eclipse.jgit.util.sha1;version="4.9.9",
- org.eclipse.jgit.util.time;version="4.9.9"
+ org.eclipse.jgit.util.io;version="4.10.1",
+ org.eclipse.jgit.util.sha1;version="4.10.1",
+ org.eclipse.jgit.util.time;version="4.10.1"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
  com.jcraft.jsch;version="[0.1.37,0.2.0)",
diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF
index 2cb4baa..ec2a99a 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: 4.9.9.qualifier
-Eclipse-SourceBundle: org.eclipse.jgit;version="4.9.9.qualifier";roots="."
+Bundle-Version: 4.10.1.qualifier
+Eclipse-SourceBundle: org.eclipse.jgit;version="4.10.1.qualifier";roots="."
diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml
index d81c9d9..a0d8a12 100644
--- a/org.eclipse.jgit/pom.xml
+++ b/org.eclipse.jgit/pom.xml
@@ -53,7 +53,7 @@
   <parent>
     <groupId>org.eclipse.jgit</groupId>
     <artifactId>org.eclipse.jgit-parent</artifactId>
-    <version>4.9.9-SNAPSHOT</version>
+    <version>4.10.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>org.eclipse.jgit</artifactId>
@@ -206,7 +206,7 @@
     <pluginManagement>
       <plugins>
         <plugin>
-          <groupId>com.github.hazendaz.spotbugs</groupId>
+          <groupId>com.github.spotbugs</groupId>
           <artifactId>spotbugs-maven-plugin</artifactId>
           <configuration>
             <excludeFilterFile>findBugs/FindBugsExcludeFilter.xml</excludeFilterFile>
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 b02430b..d505420 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
@@ -22,6 +22,7 @@
 atLeastTwoFiltersNeeded=At least two filters needed.
 atomicPushNotSupported=Atomic push not supported.
 atomicRefUpdatesNotSupported=Atomic ref updates not supported
+atomicSymRefNotSupported=Atomic symref not supported
 authenticationNotSupported=authentication not supported
 badBase64InputCharacterAt=Bad Base64 input character at {0} : {1} (decimal)
 badEntryDelimiter=Bad entry delimiter
@@ -41,6 +42,7 @@
 blobNotFound=Blob not found: {0}
 blobNotFoundForPath=Blob not found: {0} for path: {1}
 blockSizeNotPowerOf2=blockSize must be a power of 2
+bothRefTargetsMustNotBeNull=both old and new ref targets must not be null.
 branchNameInvalid=Branch name {0} is not allowed
 buildingBitmaps=Building bitmaps
 cachedPacksPreventsIndexCreation=Using cached packs prevents index creation
@@ -130,6 +132,9 @@
 commitOnRepoWithoutHEADCurrentlyNotSupported=Commit on repo without HEAD currently not supported
 commitAmendOnInitialNotPossible=Amending is not possible on initial commit.
 compressingObjects=Compressing objects
+configSubsectionContainsNewline=config subsection name contains newline
+configSubsectionContainsNullByte=config subsection name contains byte 0x00
+configValueContainsNullByte=config value contains byte 0x00
 configHandleIsStale=config file handle is stale, {0}. retry
 connectionFailed=connection failed
 connectionTimeOut=Connection time out: {0}
@@ -284,6 +289,7 @@
 expectedACKNAKGot=Expected ACK/NAK, got: {0}
 expectedBooleanStringValue=Expected boolean string value
 expectedCharacterEncodingGuesses=Expected {0} character encoding guesses
+expectedDirectoryNotSubmodule=Expected submodule ''{0}'' to be a directory
 expectedEOFReceived=expected EOF; received ''{0}'' instead
 expectedGot=expected ''{0}'', got ''{1}''
 expectedLessThanGot=expected less than ''{0}'', got ''{1}''
@@ -442,6 +448,7 @@
 months=months
 monthsAgo={0} months ago
 multipleMergeBasesFor=Multiple merge bases for:\n  {0}\n  {1} found:\n  {2}\n  {3}
+nameMustNotBeNullOrEmpty=Ref name must not be null or empty.
 need2Arguments=Need 2 arguments
 needPackOut=need packOut
 needsAtLeastOneEntry=Needs at least one entry
@@ -457,6 +464,7 @@
 noMergeHeadSpecified=No merge head specified
 nonBareLinkFilesNotSupported=Link files are not supported with nonbare repos
 noSuchRef=no such ref
+noSuchSubmodule=no such submodule {0}
 notABoolean=Not a boolean: {0}
 notABundle=not a bundle
 notADIRCFile=Not a DIRC file.
@@ -705,6 +713,7 @@
 unexpectedRefReport={0}: unexpected ref report: {1}
 unexpectedReportLine=unexpected report line: {0}
 unexpectedReportLine2={0} unexpected report line: {1}
+unexpectedSubmoduleStatus=Unexpected submodule status: ''{0}''
 unknownOrUnsupportedCommand=Unknown or unsupported command "{0}", only "{1}" is allowed.
 unknownDIRCVersion=Unknown DIRC version {0}
 unknownHost=unknown host
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/annotations/Nullable.java b/org.eclipse.jgit/src/org/eclipse/jgit/annotations/Nullable.java
index 7b91567..f8a7a36 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/annotations/Nullable.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/annotations/Nullable.java
@@ -89,7 +89,6 @@
  * @see <a href=
  *      "http://types.cs.washington.edu/checker-framework/current/checker-framework-manual.html#faq-array-syntax-meaning">
  *      The checker-framework manual</a>
- *
  * @since 4.2
  */
 @Documented
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java
index 1ed7944..f0408ab 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java
@@ -91,8 +91,10 @@
 	private boolean update = false;
 
 	/**
+	 * Constructor for AddCommand
 	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public AddCommand(Repository repo) {
 		super(repo);
@@ -119,7 +121,10 @@
 
 	/**
 	 * Allow clients to provide their own implementation of a FileTreeIterator
+	 *
 	 * @param f
+	 *            a {@link org.eclipse.jgit.treewalk.WorkingTreeIterator}
+	 *            object.
 	 * @return {@code this}
 	 */
 	public AddCommand setWorkingTreeIterator(WorkingTreeIterator f) {
@@ -128,11 +133,11 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Add} command. Each instance of this class should only
 	 * be used for one invocation of the command. Don't call this method twice
 	 * on an instance.
-	 *
-	 * @return the DirCache after Add
 	 */
 	@Override
 	public DirCache call() throws GitAPIException, NoFilepatternException {
@@ -260,17 +265,18 @@
 	}
 
 	/**
+	 * Set whether to only match against already tracked files
+	 *
 	 * @param update
 	 *            If set to true, the command only matches {@code filepattern}
 	 *            against already tracked files in the index rather than the
 	 *            working tree. That means that it will never stage new files,
 	 *            but that it will stage modified new contents of tracked files
 	 *            and that it will remove files from the index if the
-	 *            corresponding files in the working tree have been removed.
-	 *            In contrast to the git command line a {@code filepattern} must
-	 *            exist also if update is set to true as there is no
-	 *            concept of a working directory here.
-	 *
+	 *            corresponding files in the working tree have been removed. In
+	 *            contrast to the git command line a {@code filepattern} must
+	 *            exist also if update is set to true as there is no concept of
+	 *            a working directory here.
 	 * @return {@code this}
 	 */
 	public AddCommand setUpdate(boolean update) {
@@ -279,7 +285,9 @@
 	}
 
 	/**
-	 * @return is the parameter update is set
+	 * Whether to only match against already tracked files
+	 *
+	 * @return whether to only match against already tracked files
 	 */
 	public boolean isUpdate() {
 		return update;
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 fa88fb7..f80c8c7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java
@@ -75,12 +75,16 @@
 	private String notesRef = Constants.R_NOTES_COMMITS;
 
 	/**
+	 * Constructor for AddNoteCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected AddNoteCommand(Repository repo) {
 		super(repo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Note call() throws GitAPIException {
 		checkCallable();
@@ -108,6 +112,7 @@
 	 * has a note, the existing note will be replaced.
 	 *
 	 * @param id
+	 *            a {@link org.eclipse.jgit.revwalk.RevObject}
 	 * @return {@code this}
 	 */
 	public AddNoteCommand setObjectId(RevObject id) {
@@ -117,6 +122,8 @@
 	}
 
 	/**
+	 * Set the notes message
+	 *
 	 * @param message
 	 *            the notes message used when adding a note
 	 * @return {@code this}
@@ -152,12 +159,13 @@
 	}
 
 	/**
+	 * Set name of a {@code Ref} to read notes from
+	 *
 	 * @param notesRef
 	 *            the ref to read notes from. Note, the default value of
-	 *            {@link Constants#R_NOTES_COMMITS} will be used if nothing is
-	 *            set
+	 *            {@link org.eclipse.jgit.lib.Constants#R_NOTES_COMMITS} will be
+	 *            used if nothing is set
 	 * @return {@code this}
-	 *
 	 * @see Constants#R_NOTES_COMMITS
 	 */
 	public AddNoteCommand setNotesRef(String notesRef) {
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 ba5673d..cfc55d8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
@@ -87,6 +87,8 @@
 	}
 
 	/**
+	 * Set patch
+	 *
 	 * @param in
 	 *            the patch to apply
 	 * @return this instance
@@ -98,16 +100,13 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code ApplyCommand} command with all the options and
 	 * parameters collected by the setter methods (e.g.
 	 * {@link #setPatch(InputStream)} of this class. Each instance of this class
 	 * should only be used for one invocation of the command. Don't call this
 	 * method twice on an instance.
-	 *
-	 * @return an {@link ApplyResult} object representing the command result
-	 * @throws GitAPIException
-	 * @throws PatchFormatException
-	 * @throws PatchApplyException
 	 */
 	@Override
 	public ApplyResult call() throws GitAPIException, PatchFormatException,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyResult.java
index 2ef6650..60561fc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyResult.java
@@ -47,7 +47,7 @@
 import java.util.List;
 
 /**
- * Encapsulates the result of a {@link ApplyCommand}
+ * Encapsulates the result of a {@link org.eclipse.jgit.api.ApplyCommand}
  *
  * @since 2.0
  */
@@ -56,6 +56,8 @@
 	private List<File> updatedFiles = new ArrayList<>();
 
 	/**
+	 * Add updated file
+	 *
 	 * @param f
 	 *            an updated file
 	 * @return this instance
@@ -67,6 +69,8 @@
 	}
 
 	/**
+	 * Get updated files
+	 *
 	 * @return updated files
 	 */
 	public List<File> getUpdatedFiles() {
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 7ea8e73..c29ed0e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java
@@ -70,19 +70,16 @@
 /**
  * Create an archive of files from a named tree.
  * <p>
- * Examples (<code>git</code> is a {@link Git} instance):
+ * Examples (<code>git</code> is a {@link org.eclipse.jgit.api.Git} instance):
  * <p>
  * Create a tarball from HEAD:
  *
  * <pre>
  * ArchiveCommand.registerFormat("tar", new TarFormat());
  * try {
- *	git.archive()
- *		.setTree(db.resolve(&quot;HEAD&quot;))
- *		.setOutputStream(out)
- *		.call();
+ * 	git.archive().setTree(db.resolve(&quot;HEAD&quot;)).setOutputStream(out).call();
  * } finally {
- *	ArchiveCommand.unregisterFormat("tar");
+ * 	ArchiveCommand.unregisterFormat("tar");
  * }
  * </pre>
  * <p>
@@ -103,7 +100,6 @@
  *
  * @see <a href="http://git-htmldocs.googlecode.com/git/git-archive.html" >Git
  *      documentation about archive</a>
- *
  * @since 3.1
  */
 public class ArchiveCommand extends GitCommand<OutputStream> {
@@ -383,7 +379,10 @@
 	private String suffix;
 
 	/**
+	 * Constructor for ArchiveCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public ArchiveCommand(Repository repo) {
 		super(repo);
@@ -440,9 +439,7 @@
 		}
 	}
 
-	/**
-	 * @return the stream to which the archive has been written
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public OutputStream call() throws GitAPIException {
 		checkCallable();
@@ -456,6 +453,8 @@
 	}
 
 	/**
+	 * Set the tag, commit, or tree object to produce an archive for
+	 *
 	 * @param tree
 	 *            the tag, commit, or tree object to produce an archive for
 	 * @return this
@@ -470,6 +469,8 @@
 	}
 
 	/**
+	 * Set string prefixed to filenames in archive
+	 *
 	 * @param prefix
 	 *            string prefixed to filenames in archive (e.g., "master/").
 	 *            null means to not use any leading prefix.
@@ -502,8 +503,10 @@
 	}
 
 	/**
+	 * Set output stream
+	 *
 	 * @param out
-	 *	      the stream to which to write the archive
+	 *            the stream to which to write the archive
 	 * @return this
 	 */
 	public ArchiveCommand setOutputStream(OutputStream out) {
@@ -512,10 +515,11 @@
 	}
 
 	/**
+	 * Set archive format
+	 *
 	 * @param fmt
-	 *	      archive format (e.g., "tar" or "zip").
-	 *	      null means to choose automatically based on
-	 *	      the archive filename.
+	 *            archive format (e.g., "tar" or "zip"). null means to choose
+	 *            automatically based on the archive filename.
 	 * @return this
 	 */
 	public ArchiveCommand setFormat(String fmt) {
@@ -524,6 +528,8 @@
 	}
 
 	/**
+	 * Set archive format options
+	 *
 	 * @param options
 	 *            archive format options (e.g., level=9 for zip compression).
 	 * @return this
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java
index b1c81ff..f7576e9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java
@@ -69,7 +69,8 @@
 import org.eclipse.jgit.util.io.AutoLFInputStream;
 
 /**
- * Blame command for building a {@link BlameResult} for a file path.
+ * Blame command for building a {@link org.eclipse.jgit.blame.BlameResult} for a
+ * file path.
  */
 public class BlameCommand extends GitCommand<BlameResult> {
 
@@ -86,7 +87,10 @@
 	private Boolean followFileRenames;
 
 	/**
+	 * Constructor for BlameCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public BlameCommand(Repository repo) {
 		super(repo);
@@ -108,6 +112,7 @@
 	 * Set diff algorithm
 	 *
 	 * @param diffAlgorithm
+	 *            a {@link org.eclipse.jgit.diff.DiffAlgorithm} object.
 	 * @return this command
 	 */
 	public BlameCommand setDiffAlgorithm(DiffAlgorithm diffAlgorithm) {
@@ -119,6 +124,7 @@
 	 * Set raw text comparator
 	 *
 	 * @param textComparator
+	 *            a {@link org.eclipse.jgit.diff.RawTextComparator}
 	 * @return this command
 	 */
 	public BlameCommand setTextComparator(RawTextComparator textComparator) {
@@ -130,6 +136,7 @@
 	 * Set start commit id
 	 *
 	 * @param commit
+	 *            id of a commit
 	 * @return this command
 	 */
 	public BlameCommand setStartCommit(AnyObjectId commit) {
@@ -164,7 +171,7 @@
 	 *            most recent commit to stop traversal at. Usually an active
 	 *            branch tip, tag, or HEAD.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameCommand reverse(AnyObjectId start, AnyObjectId end)
@@ -182,7 +189,7 @@
 	 *            most recent commits to stop traversal at. Usually an active
 	 *            branch tip, tag, or HEAD.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameCommand reverse(AnyObjectId start, Collection<ObjectId> end)
@@ -193,10 +200,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Generate a list of lines with information about when the lines were
 	 * introduced into the file path.
-	 *
-	 * @return list of lines
 	 */
 	@Override
 	public BlameResult call() throws GitAPIException {
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 6b20da3..aa9939e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java
@@ -43,6 +43,8 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.treewalk.TreeWalk.OperationType.CHECKOUT_OP;
+
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -89,7 +91,7 @@
 /**
  * Checkout a branch to the working tree.
  * <p>
- * Examples (<code>git</code> is a {@link Git} instance):
+ * Examples (<code>git</code> is a {@link org.eclipse.jgit.api.Git} instance):
  * <p>
  * Check out an existing branch:
  *
@@ -124,9 +126,9 @@
  * 		.setStartPoint(&quot;origin/stable&quot;).call();
  * </pre>
  *
- * @see <a
- *      href="http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html"
- *      >Git documentation about Checkout</a>
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html" >Git
+ *      documentation about Checkout</a>
  */
 public class CheckoutCommand extends GitCommand<Ref> {
 
@@ -181,26 +183,17 @@
 	private Set<String> actuallyModifiedPaths;
 
 	/**
+	 * Constructor for CheckoutCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected CheckoutCommand(Repository repo) {
 		super(repo);
 		this.paths = new LinkedList<>();
 	}
 
-	/**
-	 * @throws RefAlreadyExistsException
-	 *             when trying to create (without force) a branch with a name
-	 *             that already exists
-	 * @throws RefNotFoundException
-	 *             if the start point or branch can not be found
-	 * @throws InvalidRefNameException
-	 *             if the provided name is <code>null</code> or otherwise
-	 *             invalid
-	 * @throws CheckoutConflictException
-	 *             if the checkout results in a conflict
-	 * @return the newly created branch
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Ref call() throws GitAPIException, RefAlreadyExistsException,
 			RefNotFoundException, InvalidRefNameException,
@@ -416,11 +409,12 @@
 
 	/**
 	 * Checkout paths into index and working directory, firing a
-	 * {@link WorkingTreeModifiedEvent} if the working tree was modified.
+	 * {@link org.eclipse.jgit.events.WorkingTreeModifiedEvent} if the working
+	 * tree was modified.
 	 *
 	 * @return this instance
-	 * @throws IOException
-	 * @throws RefNotFoundException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.api.errors.RefNotFoundException
 	 */
 	protected CheckoutCommand checkoutPaths() throws IOException,
 			RefNotFoundException {
@@ -468,7 +462,8 @@
 			if (path.equals(previousPath))
 				continue;
 
-			final EolStreamType eolStreamType = treeWalk.getEolStreamType();
+			final EolStreamType eolStreamType = treeWalk
+					.getEolStreamType(CHECKOUT_OP);
 			final String filterCommand = treeWalk
 					.getFilterCommand(Constants.ATTR_FILTER_TYPE_SMUDGE);
 			editor.add(new PathEdit(path) {
@@ -508,7 +503,8 @@
 		while (treeWalk.next()) {
 			final ObjectId blobId = treeWalk.getObjectId(0);
 			final FileMode mode = treeWalk.getFileMode(0);
-			final EolStreamType eolStreamType = treeWalk.getEolStreamType();
+			final EolStreamType eolStreamType = treeWalk
+					.getEolStreamType(CHECKOUT_OP);
 			final String filterCommand = treeWalk
 					.getFilterCommand(Constants.ATTR_FILTER_TYPE_SMUDGE);
 			final String path = treeWalk.getPathString();
@@ -735,6 +731,8 @@
 	}
 
 	/**
+	 * Get the result, never <code>null</code>
+	 *
 	 * @return the result, never <code>null</code>
 	 */
 	public CheckoutResult getResult() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutResult.java
index 2186eb4..16f4685 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutResult.java
@@ -46,8 +46,7 @@
 import java.util.List;
 
 /**
- * Encapsulates the result of a {@link CheckoutCommand}
- *
+ * Encapsulates the result of a {@link org.eclipse.jgit.api.CheckoutCommand}
  */
 public class CheckoutResult {
 
@@ -168,6 +167,8 @@
 	}
 
 	/**
+	 * Get status
+	 *
 	 * @return the status
 	 */
 	public Status getStatus() {
@@ -175,33 +176,44 @@
 	}
 
 	/**
+	 * Get list of file that created a checkout conflict
+	 *
 	 * @return the list of files that created a checkout conflict, or an empty
-	 *         list if {@link #getStatus()} is not {@link Status#CONFLICTS};
+	 *         list if {@link #getStatus()} is not
+	 *         {@link org.eclipse.jgit.api.CheckoutResult.Status#CONFLICTS};
 	 */
 	public List<String> getConflictList() {
 		return conflictList;
 	}
 
 	/**
+	 * Get the list of files that could not be deleted during checkout
+	 *
 	 * @return the list of files that could not be deleted during checkout, or
 	 *         an empty list if {@link #getStatus()} is not
-	 *         {@link Status#NONDELETED};
+	 *         {@link org.eclipse.jgit.api.CheckoutResult.Status#NONDELETED};
 	 */
 	public List<String> getUndeletedList() {
 		return undeletedList;
 	}
 
 	/**
+	 * Get the list of files that where modified during checkout
+	 *
 	 * @return the list of files that where modified during checkout, or an
-	 *         empty list if {@link #getStatus()} is not {@link Status#OK}
+	 *         empty list if {@link #getStatus()} is not
+	 *         {@link org.eclipse.jgit.api.CheckoutResult.Status#OK}
 	 */
 	public List<String> getModifiedList() {
 		return modifiedList;
 	}
 
 	/**
+	 * Get the list of files that where removed during checkout
+	 *
 	 * @return the list of files that where removed during checkout, or an empty
-	 *         list if {@link #getStatus()} is not {@link Status#OK}
+	 *         list if {@link #getStatus()} is not
+	 *         {@link org.eclipse.jgit.api.CheckoutResult.Status#OK}
 	 */
 	public List<String> getRemovedList() {
 		return removedList;
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 eed7b2a..771798a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java
@@ -96,25 +96,22 @@
 	private boolean noCommit = false;
 
 	/**
+	 * Constructor for CherryPickCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected CherryPickCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Cherry-Pick} command with all the options and
 	 * parameters collected by the setter methods (e.g. {@link #include(Ref)} of
 	 * this class. Each instance of this class should only be used for one
 	 * invocation of the command. Don't call this method twice on an instance.
-	 *
-	 * @return the result of the cherry-pick
-	 * @throws GitAPIException
-	 * @throws WrongRepositoryStateException
-	 * @throws ConcurrentRefUpdateException
-	 * @throws UnmergedPathsException
-	 * @throws NoMessageException
-	 * @throws NoHeadException
 	 */
 	@Override
 	public CherryPickResult call() throws GitAPIException, NoMessageException,
@@ -224,6 +221,8 @@
 	}
 
 	/**
+	 * Include a reference to a commit
+	 *
 	 * @param commit
 	 *            a reference to a commit which is cherry-picked to the current
 	 *            head
@@ -236,6 +235,8 @@
 	}
 
 	/**
+	 * Include a commit
+	 *
 	 * @param commit
 	 *            the Id of a commit which is cherry-picked to the current head
 	 * @return {@code this}
@@ -245,6 +246,8 @@
 	}
 
 	/**
+	 * Include a commit
+	 *
 	 * @param name
 	 *            a name given to the commit
 	 * @param commit
@@ -257,6 +260,8 @@
 	}
 
 	/**
+	 * Set the name that should be used in the "OURS" place for conflict markers
+	 *
 	 * @param ourCommitName
 	 *            the name that should be used in the "OURS" place for conflict
 	 *            markers
@@ -284,6 +289,8 @@
 	}
 
 	/**
+	 * Set the {@code MergeStrategy}
+	 *
 	 * @param strategy
 	 *            The merge strategy to use during this Cherry-pick.
 	 * @return {@code this}
@@ -295,6 +302,8 @@
 	}
 
 	/**
+	 * Set the (1-based) parent number to diff against
+	 *
 	 * @param mainlineParentNumber
 	 *            the (1-based) parent number to diff against. This allows
 	 *            cherry-picking of merges.
@@ -332,6 +341,7 @@
 		return headName;
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java
index b121291..ff55aeb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java
@@ -46,12 +46,11 @@
 import java.util.Map;
 
 import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.merge.ResolveMerger;
 import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
 import org.eclipse.jgit.revwalk.RevCommit;
 
 /**
- * Encapsulates the result of a {@link CherryPickCommand}.
+ * Encapsulates the result of a {@link org.eclipse.jgit.api.CherryPickCommand}.
  */
 public class CherryPickResult {
 
@@ -91,6 +90,8 @@
 	private final Map<String, MergeFailureReason> failingPaths;
 
 	/**
+	 * Constructor for CherryPickResult
+	 *
 	 * @param newHead
 	 *            commit the head points at after this cherry-pick
 	 * @param cherryPickedRefs
@@ -104,9 +105,12 @@
 	}
 
 	/**
+	 * Constructor for CherryPickResult
+	 *
 	 * @param failingPaths
 	 *            list of paths causing this cherry-pick to fail (see
-	 *            {@link ResolveMerger#getFailingPaths()} for details)
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#getFailingPaths()}
+	 *            for details)
 	 */
 	public CherryPickResult(Map<String, MergeFailureReason> failingPaths) {
 		this.status = CherryPickStatus.FAILED;
@@ -130,6 +134,8 @@
 			CherryPickStatus.CONFLICTING);
 
 	/**
+	 * Get status
+	 *
 	 * @return the status this cherry-pick resulted in
 	 */
 	public CherryPickStatus getStatus() {
@@ -137,28 +143,34 @@
 	}
 
 	/**
+	 * Get the new head after this cherry-pick
+	 *
 	 * @return the commit the head points at after this cherry-pick,
 	 *         <code>null</code> if {@link #getStatus} is not
-	 *         {@link CherryPickStatus#OK}
+	 *         {@link org.eclipse.jgit.api.CherryPickResult.CherryPickStatus#OK}
 	 */
 	public RevCommit getNewHead() {
 		return newHead;
 	}
 
 	/**
+	 * Get the cherry-picked {@code Ref}s
+	 *
 	 * @return the list of successfully cherry-picked <code>Ref</code>'s,
 	 *         <code>null</code> if {@link #getStatus} is not
-	 *         {@link CherryPickStatus#OK}
+	 *         {@link org.eclipse.jgit.api.CherryPickResult.CherryPickStatus#OK}
 	 */
 	public List<Ref> getCherryPickedRefs() {
 		return cherryPickedRefs;
 	}
 
 	/**
+	 * Get the list of paths causing this cherry-pick to fail
+	 *
 	 * @return the list of paths causing this cherry-pick to fail (see
-	 *         {@link ResolveMerger#getFailingPaths()} for details),
-	 *         <code>null</code> if {@link #getStatus} is not
-	 *         {@link CherryPickStatus#FAILED}
+	 *         {@link org.eclipse.jgit.merge.ResolveMerger#getFailingPaths()}
+	 *         for details), <code>null</code> if {@link #getStatus} is not
+	 *         {@link org.eclipse.jgit.api.CherryPickResult.CherryPickStatus#FAILED}
 	 */
 	public Map<String, MergeFailureReason> getFailingPaths() {
 		return failingPaths;
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 e41a03b..c814250 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java
@@ -79,21 +79,22 @@
 	private boolean force = false;
 
 	/**
+	 * Constructor for CleanCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected CleanCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code clean} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command (means: one
 	 * call to {@link #call()})
-	 *
-	 * @return a set of strings representing each file cleaned.
-	 * @throws GitAPIException
-	 * @throws NoWorkTreeException
 	 */
 	@Override
 	public Set<String> call() throws NoWorkTreeException, GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
index bde8e63..6d3afc6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
@@ -77,8 +77,8 @@
 import org.eclipse.jgit.transport.RemoteConfig;
 import org.eclipse.jgit.transport.TagOpt;
 import org.eclipse.jgit.transport.URIish;
-import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.FileUtils;
+import org.eclipse.jgit.util.FS;
 
 /**
  * Clone a repository into a new working directory
@@ -96,6 +96,8 @@
 
 	private boolean bare;
 
+	private FS fs;
+
 	private String remote = Constants.DEFAULT_REMOTE_NAME;
 
 	private String branch = Constants.HEAD;
@@ -168,6 +170,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Clone} command.
 	 *
 	 * The Git instance returned by this command needs to be closed by the
@@ -175,11 +179,6 @@
 	 * instance. It is recommended to call this method as soon as you don't need
 	 * a reference to this {@link Git} instance and the underlying
 	 * {@link Repository} instance anymore.
-	 *
-	 * @return the newly created {@code Git} object with associated repository
-	 * @throws InvalidRemoteException
-	 * @throws org.eclipse.jgit.api.errors.TransportException
-	 * @throws GitAPIException
 	 */
 	@Override
 	public Git call() throws GitAPIException, InvalidRemoteException,
@@ -263,6 +262,9 @@
 	private Repository init() throws GitAPIException {
 		InitCommand command = Git.init();
 		command.setBare(bare);
+		if (fs != null) {
+			command.setFs(fs);
+		}
 		if (directory != null) {
 			command.setDirectory(directory);
 		}
@@ -451,9 +453,11 @@
 	}
 
 	/**
+	 * Set the URI to clone from
+	 *
 	 * @param uri
-	 *            the URI to clone from, or {@code null} to unset the URI.
-	 *            The URI must be set before {@link #call} is called.
+	 *            the URI to clone from, or {@code null} to unset the URI. The
+	 *            URI must be set before {@link #call} is called.
 	 * @return this instance
 	 */
 	public CloneCommand setURI(String uri) {
@@ -466,12 +470,11 @@
 	 * directory isn't set, a name associated with the source uri will be used.
 	 *
 	 * @see URIish#getHumanishName()
-	 *
 	 * @param directory
 	 *            the directory to clone to, or {@code null} if the directory
 	 *            name should be taken from the source uri
 	 * @return this instance
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if the combination of directory, gitDir and bare is illegal.
 	 *             E.g. if for a non-bare repository directory and gitDir point
 	 *             to the same directory of if for a bare repository both
@@ -484,11 +487,13 @@
 	}
 
 	/**
+	 * Set the repository meta directory (.git)
+	 *
 	 * @param gitDir
 	 *            the repository meta directory, or {@code null} to choose one
 	 *            automatically at clone time
 	 * @return this instance
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if the combination of directory, gitDir and bare is illegal.
 	 *             E.g. if for a non-bare repository directory and gitDir point
 	 *             to the same directory of if for a bare repository both
@@ -502,10 +507,12 @@
 	}
 
 	/**
+	 * Set whether the cloned repository shall be bare
+	 *
 	 * @param bare
 	 *            whether the cloned repository is bare or not
 	 * @return this instance
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if the combination of directory, gitDir and bare is illegal.
 	 *             E.g. if for a non-bare repository directory and gitDir point
 	 *             to the same directory of if for a bare repository both
@@ -518,6 +525,20 @@
 	}
 
 	/**
+	 * Set the file system abstraction to be used for repositories created by
+	 * this command.
+	 *
+	 * @param fs
+	 *            the abstraction.
+	 * @return {@code this} (for chaining calls).
+	 * @since 4.10
+	 */
+	public CloneCommand setFs(FS fs) {
+		this.fs = fs;
+		return this;
+	}
+
+	/**
 	 * The remote name used to keep track of the upstream repository for the
 	 * clone operation. If no remote name is set, the default value of
 	 * <code>Constants.DEFAULT_REMOTE_NAME</code> will be used.
@@ -537,13 +558,15 @@
 	}
 
 	/**
+	 * Set the initial branch
+	 *
 	 * @param branch
 	 *            the initial branch to check out when cloning the repository.
 	 *            Can be specified as ref name (<code>refs/heads/master</code>),
-	 *            branch name (<code>master</code>) or tag name (<code>v1.2.3</code>).
-	 *            The default is to use the branch pointed to by the cloned
-	 *            repository's HEAD and can be requested by passing {@code null}
-	 *            or <code>HEAD</code>.
+	 *            branch name (<code>master</code>) or tag name
+	 *            (<code>v1.2.3</code>). The default is to use the branch
+	 *            pointed to by the cloned repository's HEAD and can be
+	 *            requested by passing {@code null} or <code>HEAD</code>.
 	 * @return this instance
 	 */
 	public CloneCommand setBranch(String branch) {
@@ -559,8 +582,8 @@
 	 * this is set to <code>NullProgressMonitor</code>
 	 *
 	 * @see NullProgressMonitor
-	 *
 	 * @param monitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor}
 	 * @return {@code this}
 	 */
 	public CloneCommand setProgressMonitor(ProgressMonitor monitor) {
@@ -572,6 +595,8 @@
 	}
 
 	/**
+	 * Set whether all branches have to be fetched
+	 *
 	 * @param cloneAllBranches
 	 *            true when all branches have to be fetched (indicates wildcard
 	 *            in created fetch refspec), false otherwise.
@@ -583,6 +608,8 @@
 	}
 
 	/**
+	 * Set whether to clone submodules
+	 *
 	 * @param cloneSubmodules
 	 *            true to initialize and update submodules. Ignored when
 	 *            {@link #setBare(boolean)} is set to true.
@@ -594,6 +621,8 @@
 	}
 
 	/**
+	 * Set branches to clone
+	 *
 	 * @param branchesToClone
 	 *            collection of branches to clone. Ignored when allSelected is
 	 *            true. Must be specified as full ref names (e.g.
@@ -606,6 +635,8 @@
 	}
 
 	/**
+	 * Set whether to skip checking out a branch
+	 *
 	 * @param noCheckout
 	 *            if set to <code>true</code> no branch will be checked out
 	 *            after the clone. This enhances performance of the clone
@@ -681,10 +712,11 @@
 	}
 
 	private void deleteChildren(File file) throws IOException {
-		if (!FS.DETECTED.isDirectory(file)) {
+		File[] files = file.listFiles();
+		if (files == null) {
 			return;
 		}
-		for (File child : file.listFiles()) {
+		for (File child : files) {
 			FileUtils.delete(child, FileUtils.RECURSIVE | FileUtils.SKIP_MISSING
 					| FileUtils.IGNORE_ERRORS);
 		}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java
index e29fc05..8a89ba1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java
@@ -140,33 +140,22 @@
 	private Boolean allowEmpty;
 
 	/**
+	 * Constructor for CommitCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected CommitCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code commit} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command (means: one
 	 * call to {@link #call()})
-	 *
-	 * @return a {@link RevCommit} object representing the successful commit.
-	 * @throws NoHeadException
-	 *             when called on a git repo without a HEAD reference
-	 * @throws NoMessageException
-	 *             when called without specifying a commit message
-	 * @throws UnmergedPathsException
-	 *             when the current index contained unmerged paths (conflicts)
-	 * @throws ConcurrentRefUpdateException
-	 *             when HEAD or branch ref is updated concurrently by someone
-	 *             else
-	 * @throws WrongRepositoryStateException
-	 *             when repository is not in the right state for committing
-	 * @throws AbortedByHookException
-	 *             if there are either pre-commit or commit-msg hooks present in
-	 *             the repository and one of them rejects the commit.
 	 */
 	@Override
 	public RevCommit call() throws GitAPIException, NoHeadException,
@@ -602,6 +591,8 @@
 	}
 
 	/**
+	 * Set the commit message
+	 *
 	 * @param message
 	 *            the commit message used for the {@code commit}
 	 * @return {@code this}
@@ -613,6 +604,8 @@
 	}
 
 	/**
+	 * Set whether to allow to create an empty commit
+	 *
 	 * @param allowEmpty
 	 *            whether it should be allowed to create a commit which has the
 	 *            same tree as it's sole predecessor (a commit which doesn't
@@ -623,8 +616,9 @@
 	 *            <p>
 	 *            By default when creating a commit containing only specified
 	 *            paths an attempt to create an empty commit leads to a
-	 *            {@link JGitInternalException}. By setting this flag to
-	 *            <code>true</code> this exception will not be thrown.
+	 *            {@link org.eclipse.jgit.api.errors.JGitInternalException}. By
+	 *            setting this flag to <code>true</code> this exception will not
+	 *            be thrown.
 	 * @return {@code this}
 	 * @since 4.2
 	 */
@@ -634,6 +628,8 @@
 	}
 
 	/**
+	 * Get the commit message
+	 *
 	 * @return the commit message used for the <code>commit</code>
 	 */
 	public String getMessage() {
@@ -673,10 +669,12 @@
 	}
 
 	/**
+	 * Get the committer
+	 *
 	 * @return the committer used for the {@code commit}. If no committer was
 	 *         specified {@code null} is returned and the default
-	 *         {@link PersonIdent} of this repo is used during execution of the
-	 *         command
+	 *         {@link org.eclipse.jgit.lib.PersonIdent} of this repo is used
+	 *         during execution of the command
 	 */
 	public PersonIdent getCommitter() {
 		return committer;
@@ -715,10 +713,12 @@
 	}
 
 	/**
+	 * Get the author
+	 *
 	 * @return the author used for the {@code commit}. If no author was
 	 *         specified {@code null} is returned and the default
-	 *         {@link PersonIdent} of this repo is used during execution of the
-	 *         command
+	 *         {@link org.eclipse.jgit.lib.PersonIdent} of this repo is used
+	 *         during execution of the command
 	 */
 	public PersonIdent getAuthor() {
 		return author;
@@ -730,6 +730,8 @@
 	 * not affected. This corresponds to the parameter -a on the command line.
 	 *
 	 * @param all
+	 *            whether to auto-stage all files that have been modified and
+	 *            deleted
 	 * @return {@code this}
 	 * @throws JGitInternalException
 	 *             in case of an illegal combination of arguments/ options
@@ -745,11 +747,12 @@
 	}
 
 	/**
-	 * Used to amend the tip of the current branch. If set to true, the previous
-	 * commit will be amended. This is equivalent to --amend on the command
-	 * line.
+	 * Used to amend the tip of the current branch. If set to {@code true}, the
+	 * previous commit will be amended. This is equivalent to --amend on the
+	 * command line.
 	 *
 	 * @param amend
+	 *            whether to ammend the tip of the current branch
 	 * @return {@code this}
 	 */
 	public CommitCommand setAmend(boolean amend) {
@@ -790,7 +793,7 @@
 	 * will be replaced by the change id.
 	 *
 	 * @param insertChangeId
-	 *
+	 *            whether to insert a change id
 	 * @return {@code this}
 	 */
 	public CommitCommand setInsertChangeId(boolean insertChangeId) {
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 39420d0..29baf4c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
@@ -103,23 +103,16 @@
 	}
 
 	/**
+	 * Constructor for CreateBranchCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected CreateBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/**
-	 * @throws RefAlreadyExistsException
-	 *             when trying to create (without force) a branch with a name
-	 *             that already exists
-	 * @throws RefNotFoundException
-	 *             if the start point can not be found
-	 * @throws InvalidRefNameException
-	 *             if the provided name is <code>null</code> or otherwise
-	 *             invalid
-	 * @return the newly created branch
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Ref call() throws GitAPIException, RefAlreadyExistsException,
 			RefNotFoundException, InvalidRefNameException {
@@ -297,6 +290,8 @@
 	}
 
 	/**
+	 * Set the name of the new branch
+	 *
 	 * @param name
 	 *            the name of the new branch
 	 * @return this instance
@@ -308,6 +303,8 @@
 	}
 
 	/**
+	 * Set whether to create the branch forcefully
+	 *
 	 * @param force
 	 *            if <code>true</code> and the branch with the given name
 	 *            already exists, the start-point of an existing branch will be
@@ -322,6 +319,8 @@
 	}
 
 	/**
+	 * Set the start point
+	 *
 	 * @param startPoint
 	 *            corresponds to the start-point option; if <code>null</code>,
 	 *            the current HEAD will be used
@@ -335,6 +334,8 @@
 	}
 
 	/**
+	 * Set the start point
+	 *
 	 * @param startPoint
 	 *            corresponds to the start-point option; if <code>null</code>,
 	 *            the current HEAD will be used
@@ -348,6 +349,8 @@
 	}
 
 	/**
+	 * Set the upstream mode
+	 *
 	 * @param mode
 	 *            corresponds to the --track/--no-track/--set-upstream options;
 	 *            may be <code>null</code>
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 d7e7e5c..31e7281 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteBranchCommand.java
@@ -84,19 +84,16 @@
 	private boolean force;
 
 	/**
+	 * Constructor for DeleteBranchCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected DeleteBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/**
-	 * @throws NotMergedException
-	 *             when trying to delete a branch which has not been merged into
-	 *             the currently checked out branch without force
-	 * @throws CannotDeleteCurrentBranchException
-	 * @return the list with the (full) names of the deleted branches
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public List<String> call() throws GitAPIException,
 			NotMergedException, CannotDeleteCurrentBranchException {
@@ -181,6 +178,8 @@
 	}
 
 	/**
+	 * Set the names of the branches to delete
+	 *
 	 * @param branchnames
 	 *            the names of the branches to delete; if not set, this will do
 	 *            nothing; invalid branch names will simply be ignored
@@ -195,6 +194,8 @@
 	}
 
 	/**
+	 * Set whether to forcefully delete branches
+	 *
 	 * @param force
 	 *            <code>true</code> corresponds to the -D option,
 	 *            <code>false</code> to the -d option (default) <br>
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 77e3539..63a090c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
@@ -71,15 +71,16 @@
 	private final Set<String> tags = new HashSet<>();
 
 	/**
+	 * Constructor for DeleteTagCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected DeleteTagCommand(Repository repo) {
 		super(repo);
 	}
 
-	/**
-	 * @return the list with the full names of the deleted tags
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public List<String> call() throws GitAPIException {
 		checkCallable();
@@ -124,6 +125,8 @@
 	}
 
 	/**
+	 * Set names of the tags to delete
+	 *
 	 * @param tags
 	 *            the names of the tags to delete; if not set, this will do
 	 *            nothing; invalid tag names will simply be ignored
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
index 68b1bd9..01fe4aa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
@@ -104,8 +104,10 @@
 	private List<IMatcher> matchers = new ArrayList<>();
 
 	/**
+	 * Constructor for DescribeCommand.
 	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected DescribeCommand(Repository repo) {
 		super(repo);
@@ -123,7 +125,7 @@
 	 *             the supplied commit does not exist.
 	 * @throws IncorrectObjectTypeException
 	 *             the supplied id is not a commit or an annotated tag.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public DescribeCommand setTarget(ObjectId target) throws IOException {
@@ -135,14 +137,15 @@
 	 * Sets the commit to be described.
 	 *
 	 * @param rev
-	 * 		Commit ID, tag, branch, ref, etc.
-	 * 		See {@link Repository#resolve(String)} for allowed syntax.
+	 *            Commit ID, tag, branch, ref, etc. See
+	 *            {@link org.eclipse.jgit.lib.Repository#resolve(String)} for
+	 *            allowed syntax.
 	 * @return {@code this}
 	 * @throws IncorrectObjectTypeException
 	 *             the supplied id is not a commit or an annotated tag.
-	 * @throws RefNotFoundException
-	 * 				the given rev didn't resolve to any object.
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.api.errors.RefNotFoundException
+	 *             the given rev didn't resolve to any object.
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public DescribeCommand setTarget(String rev) throws IOException,
@@ -160,7 +163,6 @@
 	 * @param longDesc
 	 *            <code>true</code> if always the long format should be used.
 	 * @return {@code this}
-	 *
 	 * @see <a
 	 *      href="https://www.kernel.org/pub/software/scm/git/docs/git-describe.html"
 	 *      >Git documentation about describe</a>
@@ -180,15 +182,17 @@
 	}
 
 	/**
-	 * Sets one or more {@code glob(7)} patterns that tags must match to be considered.
-	 * If multiple patterns are provided, tags only need match one of them.
+	 * Sets one or more {@code glob(7)} patterns that tags must match to be
+	 * considered. If multiple patterns are provided, tags only need match one
+	 * of them.
 	 *
-	 * @param patterns the {@code glob(7)} pattern or patterns
+	 * @param patterns
+	 *            the {@code glob(7)} pattern or patterns
 	 * @return {@code this}
-	 * @throws InvalidPatternException if the pattern passed in was invalid.
-	 *
-	 * @see <a
-	 *      href="https://www.kernel.org/pub/software/scm/git/docs/git-describe.html"
+	 * @throws org.eclipse.jgit.errors.InvalidPatternException
+	 *             if the pattern passed in was invalid.
+	 * @see <a href=
+	 *      "https://www.kernel.org/pub/software/scm/git/docs/git-describe.html"
 	 *      >Git documentation about describe</a>
 	 * @since 4.9
 	 */
@@ -229,16 +233,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Describes the specified commit. Target defaults to HEAD if no commit was
 	 * set explicitly.
-	 *
-	 * @return if there's a tag that points to the commit being described, this
-	 *         tag name is returned. Otherwise additional suffix is added to the
-	 *         nearest tag, just like git-describe(1).
-	 *         <p>
-	 *         If none of the ancestors of the commit being described has any
-	 *         tags at all, then this method returns null, indicating that
-	 *         there's no way to describe this tag.
 	 */
 	@Override
 	public String call() throws GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java
index b137fc5..4c6f351 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java
@@ -95,19 +95,22 @@
 	private ProgressMonitor monitor = NullProgressMonitor.INSTANCE;
 
 	/**
+	 * Constructor for DiffCommand
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected DiffCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Diff} command with all the options and parameters
 	 * collected by the setter methods (e.g. {@link #setCached(boolean)} of this
 	 * class. Each instance of this class should only be used for one invocation
 	 * of the command. Don't call this method twice on an instance.
-	 *
-	 * @return a DiffEntry for each path which is different
 	 */
 	@Override
 	public List<DiffEntry> call() throws GitAPIException {
@@ -162,9 +165,10 @@
 	}
 
 	/**
+	 * Whether to view the changes staged for the next commit
 	 *
 	 * @param cached
-	 *            whether to view the changes you staged for the next commit
+	 *            whether to view the changes staged for the next commit
 	 * @return this instance
 	 */
 	public DiffCommand setCached(boolean cached) {
@@ -173,6 +177,8 @@
 	}
 
 	/**
+	 * Set path filter
+	 *
 	 * @param pathFilter
 	 *            parameter, used to limit the diff to the named path
 	 * @return this instance
@@ -183,6 +189,8 @@
 	}
 
 	/**
+	 * Set old tree
+	 *
 	 * @param oldTree
 	 *            the previous state
 	 * @return this instance
@@ -193,6 +201,8 @@
 	}
 
 	/**
+	 * Set new tree
+	 *
 	 * @param newTree
 	 *            the updated state
 	 * @return this instance
@@ -203,6 +213,8 @@
 	}
 
 	/**
+	 * Set whether to return only names and status of changed files
+	 *
 	 * @param showNameAndStatusOnly
 	 *            whether to return only names and status of changed files
 	 * @return this instance
@@ -213,6 +225,8 @@
 	}
 
 	/**
+	 * Set output stream
+	 *
 	 * @param out
 	 *            the stream to write line data
 	 * @return this instance
@@ -263,7 +277,6 @@
 	 * is set to <code>NullProgressMonitor</code>
 	 *
 	 * @see NullProgressMonitor
-	 *
 	 * @param monitor
 	 *            a progress monitor
 	 * @return this instance
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java
index 5270283..b2c28da 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java
@@ -122,7 +122,10 @@
 	}
 
 	/**
+	 * Constructor for FetchCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected FetchCommand(Repository repo) {
 		super(repo);
@@ -210,17 +213,12 @@
 	}
 
 	/**
-	 * Executes the {@code fetch} command with all the options and parameters
+	 * {@inheritDoc}
+	 * <p>
+	 * Execute the {@code fetch} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command (means: one
 	 * call to {@link #call()})
-	 *
-	 * @return a {@link FetchResult} object representing the successful fetch
-	 *         result
-	 * @throws InvalidRemoteException
-	 *             when called with an invalid remote uri
-	 * @throws org.eclipse.jgit.api.errors.TransportException
-	 *             when an error occurs during transport
 	 */
 	@Override
 	public FetchResult call() throws GitAPIException, InvalidRemoteException,
@@ -288,6 +286,7 @@
 	 *
 	 * @see Constants#DEFAULT_REMOTE_NAME
 	 * @param remote
+	 *            name of a remote
 	 * @return {@code this}
 	 */
 	public FetchCommand setRemote(String remote) {
@@ -297,6 +296,8 @@
 	}
 
 	/**
+	 * Get the remote
+	 *
 	 * @return the remote used for the remote operation
 	 */
 	public String getRemote() {
@@ -304,6 +305,8 @@
 	}
 
 	/**
+	 * Get timeout
+	 *
 	 * @return the timeout used for the fetch operation
 	 */
 	public int getTimeout() {
@@ -311,16 +314,19 @@
 	}
 
 	/**
-	 * @return whether to check received objects checked for validity
+	 * Whether to check received objects for validity
+	 *
+	 * @return whether to check received objects for validity
 	 */
 	public boolean isCheckFetchedObjects() {
 		return checkFetchedObjects;
 	}
 
 	/**
-	 * If set to true, objects received will be checked for validity
+	 * If set to {@code true}, objects received will be checked for validity
 	 *
 	 * @param checkFetchedObjects
+	 *            whether to check objects for validity
 	 * @return {@code this}
 	 */
 	public FetchCommand setCheckFetchedObjects(boolean checkFetchedObjects) {
@@ -330,7 +336,9 @@
 	}
 
 	/**
-	 * @return whether or not to remove refs which no longer exist in the source
+	 * Whether to remove refs which no longer exist in the source
+	 *
+	 * @return whether to remove refs which no longer exist in the source
 	 */
 	public boolean isRemoveDeletedRefs() {
 		if (removeDeletedRefs != null)
@@ -347,9 +355,11 @@
 	}
 
 	/**
-	 * If set to true, refs are removed which no longer exist in the source
+	 * If set to {@code true}, refs are removed which no longer exist in the
+	 * source
 	 *
 	 * @param removeDeletedRefs
+	 *            whether to remove deleted {@code Ref}s
 	 * @return {@code this}
 	 */
 	public FetchCommand setRemoveDeletedRefs(boolean removeDeletedRefs) {
@@ -359,6 +369,8 @@
 	}
 
 	/**
+	 * Get progress monitor
+	 *
 	 * @return the progress monitor for the fetch operation
 	 */
 	public ProgressMonitor getProgressMonitor() {
@@ -370,8 +382,8 @@
 	 * this is set to <code>NullProgressMonitor</code>
 	 *
 	 * @see NullProgressMonitor
-	 *
 	 * @param monitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor}
 	 * @return {@code this}
 	 */
 	public FetchCommand setProgressMonitor(ProgressMonitor monitor) {
@@ -384,6 +396,8 @@
 	}
 
 	/**
+	 * Get list of {@code RefSpec}s
+	 *
 	 * @return the ref specs
 	 */
 	public List<RefSpec> getRefSpecs() {
@@ -394,6 +408,7 @@
 	 * The ref specs to be used in the fetch operation
 	 *
 	 * @param specs
+	 *            String representation of {@code RefSpec}s
 	 * @return {@code this}
 	 * @since 4.9
 	 */
@@ -406,6 +421,7 @@
 	 * The ref specs to be used in the fetch operation
 	 *
 	 * @param specs
+	 *            one or multiple {@link org.eclipse.jgit.transport.RefSpec}s
 	 * @return {@code this}
 	 */
 	public FetchCommand setRefSpecs(RefSpec... specs) {
@@ -416,6 +432,7 @@
 	 * The ref specs to be used in the fetch operation
 	 *
 	 * @param specs
+	 *            list of {@link org.eclipse.jgit.transport.RefSpec}s
 	 * @return {@code this}
 	 */
 	public FetchCommand setRefSpecs(List<RefSpec> specs) {
@@ -426,6 +443,8 @@
 	}
 
 	/**
+	 * Whether to do a dry run
+	 *
 	 * @return the dry run preference for the fetch operation
 	 */
 	public boolean isDryRun() {
@@ -436,6 +455,7 @@
 	 * Sets whether the fetch operation should be a dry run
 	 *
 	 * @param dryRun
+	 *            whether to do a dry run
 	 * @return {@code this}
 	 */
 	public FetchCommand setDryRun(boolean dryRun) {
@@ -445,6 +465,8 @@
 	}
 
 	/**
+	 * Get thin-pack preference
+	 *
 	 * @return the thin-pack preference for fetch operation
 	 */
 	public boolean isThin() {
@@ -457,6 +479,7 @@
 	 * Default setting is Transport.DEFAULT_FETCH_THIN
 	 *
 	 * @param thin
+	 *            the thin-pack preference
 	 * @return {@code this}
 	 */
 	public FetchCommand setThin(boolean thin) {
@@ -469,6 +492,7 @@
 	 * Sets the specification of annotated tag behavior during fetch
 	 *
 	 * @param tagOpt
+	 *            the {@link org.eclipse.jgit.transport.TagOpt}
 	 * @return {@code this}
 	 */
 	public FetchCommand setTagOpt(TagOpt tagOpt) {
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 0f38db5..7ea2771 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/GarbageCollectCommand.java
@@ -61,7 +61,6 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.storage.pack.PackConfig;
-import org.eclipse.jgit.util.GitDateParser;
 
 /**
  * A class used to execute a {@code gc} command. It has setters for all
@@ -97,7 +96,10 @@
 	private PackConfig pconfig;
 
 	/**
+	 * Constructor for GarbageCollectCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected GarbageCollectCommand(Repository repo) {
 		super(repo);
@@ -105,6 +107,8 @@
 	}
 
 	/**
+	 * Set progress monitor
+	 *
 	 * @param monitor
 	 *            a progress monitor
 	 * @return this instance
@@ -118,8 +122,8 @@
 	 * During gc() or prune() each unreferenced, loose object which has been
 	 * created or modified after <code>expire</code> will not be pruned. Only
 	 * older objects may be pruned. If set to null then every object is a
-	 * candidate for pruning. Use {@link GitDateParser} to parse time formats
-	 * used by git gc.
+	 * candidate for pruning. Use {@link org.eclipse.jgit.util.GitDateParser} to
+	 * parse time formats used by git gc.
 	 *
 	 * @param expire
 	 *            minimal age of objects to be pruned.
@@ -191,6 +195,7 @@
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Properties call() throws GitAPIException {
 		checkCallable();
@@ -229,7 +234,7 @@
 	 * Computes and returns the repository statistics.
 	 *
 	 * @return the repository statistics
-	 * @throws GitAPIException
+	 * @throws org.eclipse.jgit.api.errors.GitAPIException
 	 *             thrown if the repository statistics cannot be computed
 	 * @since 3.0
 	 */
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 9699569..400a7df 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
@@ -89,25 +89,30 @@
 	private final boolean closeRepo;
 
 	/**
+	 * Open repository
+	 *
 	 * @param dir
 	 *            the repository to open. May be either the GIT_DIR, or the
 	 *            working tree directory that contains {@code .git}.
-	 * @return a {@link Git} object for the existing git repository
-	 * @throws IOException
+	 * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
+	 *         repository
+	 * @throws java.io.IOException
 	 */
 	public static Git open(File dir) throws IOException {
 		return open(dir, FS.DETECTED);
 	}
 
 	/**
+	 * Open repository
+	 *
 	 * @param dir
 	 *            the repository to open. May be either the GIT_DIR, or the
 	 *            working tree directory that contains {@code .git}.
 	 * @param fs
 	 *            filesystem abstraction to use when accessing the repository.
-	 * @return a {@link Git} object for the existing git repository. Closing this
-	 *         instance will close the repo.
-	 * @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
 	 */
 	public static Git open(File dir, FS fs) throws IOException {
 		RepositoryCache.FileKey key;
@@ -119,31 +124,36 @@
 	}
 
 	/**
+	 * Wrap repository
+	 *
 	 * @param repo
 	 *            the git repository this class is interacting with;
 	 *            {@code null} is not allowed.
-	 * @return a {@link Git} object for the existing git repository. The caller is
-	 *         responsible for closing the repository; {@link #close()} on this
-	 *         instance does not close the repo.
+	 * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
+	 *         repository. The caller is responsible for closing the repository;
+	 *         {@link #close()} on this instance does not close the repo.
 	 */
 	public static Git wrap(Repository repo) {
 		return new Git(repo);
 	}
 
 	/**
-	 * Frees resources associated with this instance.
+	 * {@inheritDoc}
 	 * <p>
-	 * If the repository was opened by a static factory method in this class, then
-	 * this method calls {@link Repository#close()} on the underlying repository
-	 * instance. (Whether this actually releases underlying resources, such as
-	 * file handles, may vary; see {@link Repository} for more details.)
+	 * Free resources associated with this instance.
 	 * <p>
-	 * If the repository was created by a caller and passed into {@link
-	 * #Git(Repository)} or a static factory method in this class, then this
-	 * method does not call close on the underlying repository.
+	 * If the repository was opened by a static factory method in this class,
+	 * then this method calls {@link Repository#close()} on the underlying
+	 * repository instance. (Whether this actually releases underlying
+	 * resources, such as file handles, may vary; see {@link Repository} for
+	 * more details.)
 	 * <p>
-	 * In all cases, after calling this method you should not use this {@link Git}
-	 * instance anymore.
+	 * If the repository was created by a caller and passed into
+	 * {@link #Git(Repository)} or a static factory method in this class, then
+	 * this method does not call close on the underlying repository.
+	 * <p>
+	 * In all cases, after calling this method you should not use this
+	 * {@link Git} instance anymore.
 	 *
 	 * @since 3.2
 	 */
@@ -154,23 +164,23 @@
 	}
 
 	/**
-	 * Returns a command object to execute a {@code clone} command
+	 * Return a command object to execute a {@code clone} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-clone.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-clone.html"
 	 *      >Git documentation about clone</a>
-	 * @return a {@link CloneCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code clone} command
+	 * @return a {@link org.eclipse.jgit.api.CloneCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code clone}
+	 *         command
 	 */
 	public static CloneCommand cloneRepository() {
 		return new CloneCommand();
 	}
 
 	/**
-	 * Returns a command to list remote branches/tags without a local
-	 * repository.
+	 * Return a command to list remote branches/tags without a local repository.
 	 *
-	 * @return a {@link LsRemoteCommand}
+	 * @return a {@link org.eclipse.jgit.api.LsRemoteCommand}
 	 * @since 3.1
 	 */
 	public static LsRemoteCommand lsRemoteRepository() {
@@ -178,24 +188,25 @@
 	}
 
 	/**
-	 * Returns a command object to execute a {@code init} command
+	 * Return a command object to execute a {@code init} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-init.html"
-	 *      >Git documentation about init</a>
-	 * @return a {@link InitCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code init} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-init.html" >Git
+	 *      documentation about init</a>
+	 * @return a {@link org.eclipse.jgit.api.InitCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code init}
+	 *         command
 	 */
 	public static InitCommand init() {
 		return new InitCommand();
 	}
 
 	/**
-	 * Constructs a new {@link Git} object which can interact with the specified
-	 * git repository.
+	 * Construct a new {@link org.eclipse.jgit.api.Git} object which can
+	 * interact with the specified git repository.
 	 * <p>
-	 * All command classes returned by methods of this class will always interact
-	 * with this git repository.
+	 * All command classes returned by methods of this class will always
+	 * interact with this git repository.
 	 * <p>
 	 * The caller is responsible for closing the repository; {@link #close()} on
 	 * this instance does not close the repo.
@@ -216,75 +227,78 @@
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Commit} command
+	 * Return a command object to execute a {@code Commit} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-commit.html"
 	 *      >Git documentation about Commit</a>
-	 * @return a {@link CommitCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code Commit} command
+	 * @return a {@link org.eclipse.jgit.api.CommitCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Commit}
+	 *         command
 	 */
 	public CommitCommand commit() {
 		return new CommitCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Log} command
+	 * Return a command object to execute a {@code Log} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-log.html"
-	 *      >Git documentation about Log</a>
-	 * @return a {@link LogCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code Log} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-log.html" >Git
+	 *      documentation about Log</a>
+	 * @return a {@link org.eclipse.jgit.api.LogCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Log}
+	 *         command
 	 */
 	public LogCommand log() {
 		return new LogCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Merge} command
+	 * Return a command object to execute a {@code Merge} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-merge.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-merge.html"
 	 *      >Git documentation about Merge</a>
-	 * @return a {@link MergeCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code Merge} command
+	 * @return a {@link org.eclipse.jgit.api.MergeCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Merge}
+	 *         command
 	 */
 	public MergeCommand merge() {
 		return new MergeCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Pull} command
+	 * Return a command object to execute a {@code Pull} command
 	 *
-	 * @return a {@link PullCommand}
+	 * @return a {@link org.eclipse.jgit.api.PullCommand}
 	 */
 	public PullCommand pull() {
 		return new PullCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to create branches
+	 * Return a command object used to create branches
 	 *
-	 * @return a {@link CreateBranchCommand}
+	 * @return a {@link org.eclipse.jgit.api.CreateBranchCommand}
 	 */
 	public CreateBranchCommand branchCreate() {
 		return new CreateBranchCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to delete branches
+	 * Return a command object used to delete branches
 	 *
-	 * @return a {@link DeleteBranchCommand}
+	 * @return a {@link org.eclipse.jgit.api.DeleteBranchCommand}
 	 */
 	public DeleteBranchCommand branchDelete() {
 		return new DeleteBranchCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to list branches
+	 * Return a command object used to list branches
 	 *
-	 * @return a {@link ListBranchCommand}
+	 * @return a {@link org.eclipse.jgit.api.ListBranchCommand}
 	 */
 	public ListBranchCommand branchList() {
 		return new ListBranchCommand(repo);
@@ -292,170 +306,180 @@
 
 	/**
 	 *
-	 * Returns a command object used to list tags
+	 * Return a command object used to list tags
 	 *
-	 * @return a {@link ListTagCommand}
+	 * @return a {@link org.eclipse.jgit.api.ListTagCommand}
 	 */
 	public ListTagCommand tagList() {
 		return new ListTagCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to rename branches
+	 * Return a command object used to rename branches
 	 *
-	 * @return a {@link RenameBranchCommand}
+	 * @return a {@link org.eclipse.jgit.api.RenameBranchCommand}
 	 */
 	public RenameBranchCommand branchRename() {
 		return new RenameBranchCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Add} command
+	 * Return a command object to execute a {@code Add} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-add.html"
-	 *      >Git documentation about Add</a>
-	 * @return a {@link AddCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code Add} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-add.html" >Git
+	 *      documentation about Add</a>
+	 * @return a {@link org.eclipse.jgit.api.AddCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Add}
+	 *         command
 	 */
 	public AddCommand add() {
 		return new AddCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Tag} command
+	 * Return a command object to execute a {@code Tag} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-tag.html"
-	 *      >Git documentation about Tag</a>
-	 * @return a {@link TagCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code Tag} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-tag.html" >Git
+	 *      documentation about Tag</a>
+	 * @return a {@link org.eclipse.jgit.api.TagCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Tag}
+	 *         command
 	 */
 	public TagCommand tag() {
 		return new TagCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Fetch} command
+	 * Return a command object to execute a {@code Fetch} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-fetch.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-fetch.html"
 	 *      >Git documentation about Fetch</a>
-	 * @return a {@link FetchCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code Fetch} command
+	 * @return a {@link org.eclipse.jgit.api.FetchCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Fetch}
+	 *         command
 	 */
 	public FetchCommand fetch() {
 		return new FetchCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Push} command
+	 * Return a command object to execute a {@code Push} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-push.html"
-	 *      >Git documentation about Push</a>
-	 * @return a {@link PushCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code Push} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-push.html" >Git
+	 *      documentation about Push</a>
+	 * @return a {@link org.eclipse.jgit.api.PushCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code Push}
+	 *         command
 	 */
 	public PushCommand push() {
 		return new PushCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code cherry-pick} command
+	 * Return a command object to execute a {@code cherry-pick} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html"
 	 *      >Git documentation about cherry-pick</a>
-	 * @return a {@link CherryPickCommand} used to collect all optional
-	 *         parameters and to finally execute the {@code cherry-pick} command
+	 * @return a {@link org.eclipse.jgit.api.CherryPickCommand} used to collect
+	 *         all optional parameters and to finally execute the
+	 *         {@code cherry-pick} command
 	 */
 	public CherryPickCommand cherryPick() {
 		return new CherryPickCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code revert} command
+	 * Return a command object to execute a {@code revert} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-revert.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-revert.html"
 	 *      >Git documentation about reverting changes</a>
-	 * @return a {@link RevertCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code cherry-pick} command
+	 * @return a {@link org.eclipse.jgit.api.RevertCommand} used to collect all
+	 *         optional parameters and to finally execute the
+	 *         {@code cherry-pick} command
 	 */
 	public RevertCommand revert() {
 		return new RevertCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code Rebase} command
+	 * Return a command object to execute a {@code Rebase} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html"
 	 *      >Git documentation about rebase</a>
-	 * @return a {@link RebaseCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code rebase} command
+	 * @return a {@link org.eclipse.jgit.api.RebaseCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code rebase}
+	 *         command
 	 */
 	public RebaseCommand rebase() {
 		return new RebaseCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code rm} command
+	 * Return a command object to execute a {@code rm} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-rm.html"
-	 *      >Git documentation about rm</a>
-	 * @return a {@link RmCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code rm} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-rm.html" >Git
+	 *      documentation about rm</a>
+	 * @return a {@link org.eclipse.jgit.api.RmCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code rm} command
 	 */
 	public RmCommand rm() {
 		return new RmCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code checkout} command
+	 * Return a command object to execute a {@code checkout} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html"
 	 *      >Git documentation about checkout</a>
-	 * @return a {@link CheckoutCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code checkout} command
+	 * @return a {@link org.eclipse.jgit.api.CheckoutCommand} used to collect
+	 *         all optional parameters and to finally execute the
+	 *         {@code checkout} command
 	 */
 	public CheckoutCommand checkout() {
 		return new CheckoutCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code reset} command
+	 * Return a command object to execute a {@code reset} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-reset.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-reset.html"
 	 *      >Git documentation about reset</a>
-	 * @return a {@link ResetCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code reset} command
+	 * @return a {@link org.eclipse.jgit.api.ResetCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code reset}
+	 *         command
 	 */
 	public ResetCommand reset() {
 		return new ResetCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code status} command
+	 * Return a command object to execute a {@code status} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-status.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-status.html"
 	 *      >Git documentation about status</a>
-	 * @return a {@link StatusCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code status} command
+	 * @return a {@link org.eclipse.jgit.api.StatusCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code status}
+	 *         command
 	 */
 	public StatusCommand status() {
 		return new StatusCommand(repo);
 	}
 
 	/**
-	 * Returns a command to create an archive from a tree
+	 * Return a command to create an archive from a tree
 	 *
-	 * @return a {@link ArchiveCommand}
+	 * @return a {@link org.eclipse.jgit.api.ArchiveCommand}
 	 * @since 3.1
 	 */
 	public ArchiveCommand archive() {
@@ -463,179 +487,196 @@
 	}
 
 	/**
-	 * Returns a command to add notes to an object
+	 * Return a command to add notes to an object
 	 *
-	 * @return a {@link AddNoteCommand}
+	 * @return a {@link org.eclipse.jgit.api.AddNoteCommand}
 	 */
 	public AddNoteCommand notesAdd() {
 		return new AddNoteCommand(repo);
 	}
 
 	/**
-	 * Returns a command to remove notes on an object
+	 * Return a command to remove notes on an object
 	 *
-	 * @return a {@link RemoveNoteCommand}
+	 * @return a {@link org.eclipse.jgit.api.RemoveNoteCommand}
 	 */
 	public RemoveNoteCommand notesRemove() {
 		return new RemoveNoteCommand(repo);
 	}
 
 	/**
-	 * Returns a command to list all notes
+	 * Return a command to list all notes
 	 *
-	 * @return a {@link ListNotesCommand}
+	 * @return a {@link org.eclipse.jgit.api.ListNotesCommand}
 	 */
 	public ListNotesCommand notesList() {
 		return new ListNotesCommand(repo);
 	}
 
 	/**
-	 * Returns a command to show notes on an object
+	 * Return a command to show notes on an object
 	 *
-	 * @return a {@link ShowNoteCommand}
+	 * @return a {@link org.eclipse.jgit.api.ShowNoteCommand}
 	 */
 	public ShowNoteCommand notesShow() {
 		return new ShowNoteCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code ls-remote} command
+	 * Return a command object to execute a {@code ls-remote} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-ls-remote.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-ls-remote.html"
 	 *      >Git documentation about ls-remote</a>
-	 * @return a {@link LsRemoteCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code status} command
+	 * @return a {@link org.eclipse.jgit.api.LsRemoteCommand} used to collect
+	 *         all optional parameters and to finally execute the {@code status}
+	 *         command
 	 */
 	public LsRemoteCommand lsRemote() {
 		return new LsRemoteCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code clean} command
+	 * Return a command object to execute a {@code clean} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-clean.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-clean.html"
 	 *      >Git documentation about Clean</a>
-	 * @return a {@link CleanCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code clean} command
+	 * @return a {@link org.eclipse.jgit.api.CleanCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code clean}
+	 *         command
 	 */
 	public CleanCommand clean() {
 		return new CleanCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code blame} command
+	 * Return a command object to execute a {@code blame} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-blame.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-blame.html"
 	 *      >Git documentation about Blame</a>
-	 * @return a {@link BlameCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code blame} command
+	 * @return a {@link org.eclipse.jgit.api.BlameCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code blame}
+	 *         command
 	 */
 	public BlameCommand blame() {
 		return new BlameCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code reflog} command
+	 * Return a command object to execute a {@code reflog} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-reflog.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-reflog.html"
 	 *      >Git documentation about reflog</a>
-	 * @return a {@link ReflogCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code reflog} command
+	 * @return a {@link org.eclipse.jgit.api.ReflogCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code reflog}
+	 *         command
 	 */
 	public ReflogCommand reflog() {
 		return new ReflogCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code diff} command
+	 * Return a command object to execute a {@code diff} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-diff.html"
-	 *      >Git documentation about diff</a>
-	 * @return a {@link DiffCommand} used to collect all optional parameters and
-	 *         to finally execute the {@code diff} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-diff.html" >Git
+	 *      documentation about diff</a>
+	 * @return a {@link org.eclipse.jgit.api.DiffCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code diff}
+	 *         command
 	 */
 	public DiffCommand diff() {
 		return new DiffCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to delete tags
+	 * Return a command object used to delete tags
 	 *
-	 * @return a {@link DeleteTagCommand}
+	 * @return a {@link org.eclipse.jgit.api.DeleteTagCommand}
 	 */
 	public DeleteTagCommand tagDelete() {
 		return new DeleteTagCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code submodule add} command
+	 * Return a command object to execute a {@code submodule add} command
 	 *
-	 * @return a {@link SubmoduleAddCommand} used to add a new submodule to a
-	 *         parent repository
+	 * @return a {@link org.eclipse.jgit.api.SubmoduleAddCommand} used to add a
+	 *         new submodule to a parent repository
 	 */
 	public SubmoduleAddCommand submoduleAdd() {
 		return new SubmoduleAddCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code submodule init} command
+	 * Return a command object to execute a {@code submodule init} command
 	 *
-	 * @return a {@link SubmoduleInitCommand} used to initialize the
-	 *         repository's config with settings from the .gitmodules file in
-	 *         the working tree
+	 * @return a {@link org.eclipse.jgit.api.SubmoduleInitCommand} used to
+	 *         initialize the repository's config with settings from the
+	 *         .gitmodules file in the working tree
 	 */
 	public SubmoduleInitCommand submoduleInit() {
 		return new SubmoduleInitCommand(repo);
 	}
 
 	/**
+	 * Returns a command object to execute a {@code submodule deinit} command
+	 *
+	 * @return a {@link org.eclipse.jgit.api.SubmoduleDeinitCommand} used to
+	 *         remove a submodule's working tree manifestation
+	 * @since 4.10
+	 */
+	public SubmoduleDeinitCommand submoduleDeinit() {
+		return new SubmoduleDeinitCommand(repo);
+	}
+
+	/**
 	 * Returns a command object to execute a {@code submodule status} command
 	 *
-	 * @return a {@link SubmoduleStatusCommand} used to report the status of a
-	 *         repository's configured submodules
+	 * @return a {@link org.eclipse.jgit.api.SubmoduleStatusCommand} used to
+	 *         report the status of a repository's configured submodules
 	 */
 	public SubmoduleStatusCommand submoduleStatus() {
 		return new SubmoduleStatusCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code submodule sync} command
+	 * Return a command object to execute a {@code submodule sync} command
 	 *
-	 * @return a {@link SubmoduleSyncCommand} used to update the URL of a
-	 *         submodule from the parent repository's .gitmodules file
+	 * @return a {@link org.eclipse.jgit.api.SubmoduleSyncCommand} used to
+	 *         update the URL of a submodule from the parent repository's
+	 *         .gitmodules file
 	 */
 	public SubmoduleSyncCommand submoduleSync() {
 		return new SubmoduleSyncCommand(repo);
 	}
 
 	/**
-	 * Returns a command object to execute a {@code submodule update} command
+	 * Return a command object to execute a {@code submodule update} command
 	 *
-	 * @return a {@link SubmoduleUpdateCommand} used to update the submodules in
-	 *         a repository to the configured revision
+	 * @return a {@link org.eclipse.jgit.api.SubmoduleUpdateCommand} used to
+	 *         update the submodules in a repository to the configured revision
 	 */
 	public SubmoduleUpdateCommand submoduleUpdate() {
 		return new SubmoduleUpdateCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to list stashed commits
+	 * Return a command object used to list stashed commits
 	 *
-	 * @return a {@link StashListCommand}
+	 * @return a {@link org.eclipse.jgit.api.StashListCommand}
 	 */
 	public StashListCommand stashList() {
 		return new StashListCommand(repo);
 	}
 
 	/**
-	 * Returns a command object used to create a stashed commit
+	 * Return a command object used to create a stashed commit
 	 *
-	 * @return a {@link StashCreateCommand}
+	 * @return a {@link org.eclipse.jgit.api.StashCreateCommand}
 	 * @since 2.0
 	 */
 	public StashCreateCommand stashCreate() {
@@ -643,9 +684,9 @@
 	}
 
 	/**
-	 * Returns a command object used to apply a stashed commit
+	 * Returs a command object used to apply a stashed commit
 	 *
-	 * @return a {@link StashApplyCommand}
+	 * @return a {@link org.eclipse.jgit.api.StashApplyCommand}
 	 * @since 2.0
 	 */
 	public StashApplyCommand stashApply() {
@@ -653,9 +694,9 @@
 	}
 
 	/**
-	 * Returns a command object used to drop a stashed commit
+	 * Return a command object used to drop a stashed commit
 	 *
-	 * @return a {@link StashDropCommand}
+	 * @return a {@link org.eclipse.jgit.api.StashDropCommand}
 	 * @since 2.0
 	 */
 	public StashDropCommand stashDrop() {
@@ -663,14 +704,14 @@
 	}
 
 	/**
-	 * Returns a command object to execute a {@code apply} command
+	 * Return a command object to execute a {@code apply} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-apply.html"
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-apply.html"
 	 *      >Git documentation about apply</a>
-	 *
-	 * @return a {@link ApplyCommand} used to collect all optional parameters
-	 *         and to finally execute the {@code apply} command
+	 * @return a {@link org.eclipse.jgit.api.ApplyCommand} used to collect all
+	 *         optional parameters and to finally execute the {@code apply}
+	 *         command
 	 * @since 2.0
 	 */
 	public ApplyCommand apply() {
@@ -678,14 +719,14 @@
 	}
 
 	/**
-	 * Returns a command object to execute a {@code gc} command
+	 * Return a command object to execute a {@code gc} command
 	 *
-	 * @see <a
-	 *      href="http://www.kernel.org/pub/software/scm/git/docs/git-gc.html"
-	 *      >Git documentation about gc</a>
-	 *
-	 * @return a {@link GarbageCollectCommand} used to collect all optional
-	 *         parameters and to finally execute the {@code gc} command
+	 * @see <a href=
+	 *      "http://www.kernel.org/pub/software/scm/git/docs/git-gc.html" >Git
+	 *      documentation about gc</a>
+	 * @return a {@link org.eclipse.jgit.api.GarbageCollectCommand} used to
+	 *         collect all optional parameters and to finally execute the
+	 *         {@code gc} command
 	 * @since 2.2
 	 */
 	public GarbageCollectCommand gc() {
@@ -693,9 +734,9 @@
 	}
 
 	/**
-	 * Returns a command object to find human-readable names of revisions.
+	 * Return a command object to find human-readable names of revisions.
 	 *
-	 * @return a {@link NameRevCommand}.
+	 * @return a {@link org.eclipse.jgit.api.NameRevCommand}.
 	 * @since 3.0
 	 */
 	public NameRevCommand nameRev() {
@@ -703,10 +744,10 @@
 	}
 
 	/**
-	 * Returns a command object to come up with a short name that describes a
+	 * Return a command object to come up with a short name that describes a
 	 * commit in terms of the nearest git tag.
 	 *
-	 * @return a {@link DescribeCommand}.
+	 * @return a {@link org.eclipse.jgit.api.DescribeCommand}.
 	 * @since 3.2
 	 */
 	public DescribeCommand describe() {
@@ -716,7 +757,7 @@
 	/**
 	 * Return a command used to list the available remotes.
 	 *
-	 * @return a {@link RemoteListCommand}
+	 * @return a {@link org.eclipse.jgit.api.RemoteListCommand}
 	 * @since 4.2
 	 */
 	public RemoteListCommand remoteList() {
@@ -726,7 +767,7 @@
 	/**
 	 * Return a command used to add a new remote.
 	 *
-	 * @return a {@link RemoteAddCommand}
+	 * @return a {@link org.eclipse.jgit.api.RemoteAddCommand}
 	 * @since 4.2
 	 */
 	public RemoteAddCommand remoteAdd() {
@@ -736,7 +777,7 @@
 	/**
 	 * Return a command used to remove an existing remote.
 	 *
-	 * @return a {@link RemoteRemoveCommand}
+	 * @return a {@link org.eclipse.jgit.api.RemoteRemoveCommand}
 	 * @since 4.2
 	 */
 	public RemoteRemoveCommand remoteRemove() {
@@ -746,7 +787,7 @@
 	/**
 	 * Return a command used to change the URL of an existing remote.
 	 *
-	 * @return a {@link RemoteSetUrlCommand}
+	 * @return a {@link org.eclipse.jgit.api.RemoteSetUrlCommand}
 	 * @since 4.2
 	 */
 	public RemoteSetUrlCommand remoteSetUrl() {
@@ -754,6 +795,8 @@
 	}
 
 	/**
+	 * Get repository
+	 *
 	 * @return the git repository this class is interacting with; see
 	 *         {@link #close()} for notes on closing this repository.
 	 */
@@ -761,6 +804,7 @@
 		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/GitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/GitCommand.java
index 2a23408..ee7d75c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/GitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/GitCommand.java
@@ -48,18 +48,20 @@
 /**
  * Common superclass of all commands in the package {@code org.eclipse.jgit.api}
  * <p>
- * This class ensures that all commands fulfill the {@link Callable} interface.
- * It also has a property {@link #repo} holding a reference to the git
- * {@link Repository} this command should work with.
+ * This class ensures that all commands fulfill the
+ * {@link java.util.concurrent.Callable} interface. It also has a property
+ * {@link #repo} holding a reference to the git
+ * {@link org.eclipse.jgit.lib.Repository} this command should work with.
  * <p>
  * Finally this class stores a state telling whether it is allowed to call
- * {@link #call()} on this instance. Instances of {@link GitCommand} can only be
- * used for one single successful call to {@link #call()}. Afterwards this
- * instance may not be used anymore to set/modify any properties or to call
- * {@link #call()} again. This is achieved by setting the {@link #callable}
- * property to false after the successful execution of {@link #call()} and to
- * check the state (by calling {@link #checkCallable()}) before setting of
- * properties and inside {@link #call()}.
+ * {@link #call()} on this instance. Instances of
+ * {@link org.eclipse.jgit.api.GitCommand} can only be used for one single
+ * successful call to {@link #call()}. Afterwards this instance may not be used
+ * anymore to set/modify any properties or to call {@link #call()} again. This
+ * is achieved by setting the {@link #callable} property to false after the
+ * successful execution of {@link #call()} and to check the state (by calling
+ * {@link #checkCallable()}) before setting of properties and inside
+ * {@link #call()}.
  *
  * @param <T>
  *            the return type which is expected from {@link #call()}
@@ -78,14 +80,18 @@
 	 * Creates a new command which interacts with a single repository
 	 *
 	 * @param repo
-	 *            the {@link Repository} this command should interact with
+	 *            the {@link org.eclipse.jgit.lib.Repository} this command
+	 *            should interact with
 	 */
 	protected GitCommand(Repository repo) {
 		this.repo = repo;
 	}
 
 	/**
-	 * @return the {@link Repository} this command is interacting with
+	 * Get repository this command is working on
+	 *
+	 * @return the {@link org.eclipse.jgit.lib.Repository} this command is
+	 *         interacting with
 	 */
 	public Repository getRepository() {
 		return repo;
@@ -106,9 +112,9 @@
 
 	/**
 	 * Checks that the property {@link #callable} is {@code true}. If not then
-	 * an {@link IllegalStateException} is thrown
+	 * an {@link java.lang.IllegalStateException} is thrown
 	 *
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             when this method is called and the property {@link #callable}
 	 *             is {@code false}
 	 */
@@ -120,11 +126,9 @@
 	}
 
 	/**
-	 * Executes the command
-	 *
-	 * @return T a result. Each command has its own return type
-	 * @throws GitAPIException
-	 *             or subclass thereof when an error occurs
+	 * {@inheritDoc}
+	 * <p>
+	 * Execute the command
 	 */
 	@Override
 	public abstract T call() throws GitAPIException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java
index 649484c..f10bcdf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/InitCommand.java
@@ -53,6 +53,7 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.RepositoryBuilder;
+import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.SystemReader;
 
 /**
@@ -68,10 +69,12 @@
 
 	private boolean bare;
 
+	private FS fs;
+
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Init} command.
-	 *
-	 * @return the newly created {@code Git} object with associated repository
 	 */
 	@Override
 	public Git call() throws GitAPIException {
@@ -79,6 +82,9 @@
 			RepositoryBuilder builder = new RepositoryBuilder();
 			if (bare)
 				builder.setBare();
+			if (fs != null) {
+				builder.setFS(fs);
+			}
 			builder.readEnvironment();
 			if (gitDir != null)
 				builder.setGitDir(gitDir);
@@ -127,7 +133,7 @@
 	 * @param directory
 	 *            the directory to init to
 	 * @return this instance
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if the combination of directory, gitDir and bare is illegal.
 	 *             E.g. if for a non-bare repository directory and gitDir point
 	 *             to the same directory of if for a bare repository both
@@ -141,10 +147,12 @@
 	}
 
 	/**
+	 * Set the repository meta directory (.git)
+	 *
 	 * @param gitDir
 	 *            the repository meta directory
 	 * @return this instance
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if the combination of directory, gitDir and bare is illegal.
 	 *             E.g. if for a non-bare repository directory and gitDir point
 	 *             to the same directory of if for a bare repository both
@@ -176,9 +184,11 @@
 	}
 
 	/**
+	 * Set whether the repository is bare or not
+	 *
 	 * @param bare
 	 *            whether the repository is bare or not
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if the combination of directory, gitDir and bare is illegal.
 	 *             E.g. if for a non-bare repository directory and gitDir point
 	 *             to the same directory of if for a bare repository both
@@ -190,4 +200,18 @@
 		this.bare = bare;
 		return this;
 	}
+
+	/**
+	 * Set the file system abstraction to be used for repositories created by
+	 * this command.
+	 *
+	 * @param fs
+	 *            the abstraction.
+	 * @return {@code this} (for chaining calls).
+	 * @since 4.10
+	 */
+	public InitCommand setFs(FS fs) {
+		this.fs = fs;
+		return this;
+	}
 }
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 961eeaa..cdae782 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListBranchCommand.java
@@ -95,12 +95,16 @@
 	}
 
 	/**
+	 * Constructor for ListBranchCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected ListBranchCommand(Repository repo) {
 		super(repo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public List<Ref> call() throws GitAPIException {
 		checkCallable();
@@ -154,6 +158,8 @@
 	}
 
 	/**
+	 * Set the list mode
+	 *
 	 * @param listMode
 	 *            optional: corresponds to the -r/-a options; by default, only
 	 *            local branches will be listed
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 476c10b..41691fb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListNotesCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListNotesCommand.java
@@ -68,15 +68,16 @@
 	private String notesRef = Constants.R_NOTES_COMMITS;
 
 	/**
+	 * Constructor for ListNotesCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected ListNotesCommand(Repository repo) {
 		super(repo);
 	}
 
-	/**
-	 * @return the requested notes
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public List<Note> call() throws GitAPIException {
 		checkCallable();
@@ -101,12 +102,14 @@
 	}
 
 	/**
-	 * @param notesRef
-	 *            the ref to read notes from. Note, the default value of
-	 *            {@link Constants#R_NOTES_COMMITS} will be used if nothing is
-	 *            set
-	 * @return {@code this}
+	 * Set the {@code Ref} to read notes from
 	 *
+	 * @param notesRef
+	 *            the name of the {@code Ref} to read notes from. Note, the
+	 *            default value of
+	 *            {@link org.eclipse.jgit.lib.Constants#R_NOTES_COMMITS} will be
+	 *            used if nothing is set
+	 * @return {@code this}
 	 * @see Constants#R_NOTES_COMMITS
 	 */
 	public ListNotesCommand setNotesRef(String notesRef) {
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 d649a53..9161211 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ListTagCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ListTagCommand.java
@@ -65,15 +65,16 @@
 public class ListTagCommand extends GitCommand<List<Ref>> {
 
 	/**
+	 * Constructor for ListTagCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected ListTagCommand(Repository repo) {
 		super(repo);
 	}
 
-	/**
-	 * @return the tags available
-	 */
+	/** {@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 f8fe95a..fd6c1fa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
@@ -78,7 +78,7 @@
  * 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>
- * Examples (<code>git</code> is a {@link Git} instance):
+ * Examples (<code>git</code> is a {@link org.eclipse.jgit.api.Git} instance):
  * <p>
  * Get newest 10 commits, starting from the current branch:
  *
@@ -114,7 +114,10 @@
 	private int skip = -1;
 
 	/**
+	 * Constructor for LogCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected LogCommand(Repository repo) {
 		super(repo);
@@ -122,15 +125,13 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Log} command with all the options and parameters
 	 * collected by the setter methods (e.g. {@link #add(AnyObjectId)},
 	 * {@link #not(AnyObjectId)}, ..) of this class. Each instance of this class
 	 * should only be used for one invocation of the command. Don't call this
 	 * method twice on an instance.
-	 *
-	 * @return an iteration over RevCommits
-	 * @throws NoHeadException
-	 *             of the references ref cannot be resolved
 	 */
 	@Override
 	public Iterable<RevCommit> call() throws GitAPIException, NoHeadException {
@@ -174,23 +175,26 @@
 	 *
 	 * @see RevWalk#markStart(RevCommit)
 	 * @param start
+	 *            the id of the commit to start from
 	 * @return {@code this}
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the commit supplied is not available from the object
 	 *             database. This usually indicates the supplied commit is
 	 *             invalid, but the reference was constructed during an earlier
-	 *             invocation to {@link RevWalk#lookupCommit(AnyObjectId)}.
-	 * @throws IncorrectObjectTypeException
+	 *             invocation to
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupCommit(AnyObjectId)}.
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually a commit. This usually
 	 *             indicates the caller supplied a non-commit SHA-1 to
-	 *             {@link RevWalk#lookupCommit(AnyObjectId)}.
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupCommit(AnyObjectId)}.
 	 * @throws JGitInternalException
 	 *             a low-level exception of JGit has occurred. The original
 	 *             exception can be retrieved by calling
-	 *             {@link Exception#getCause()}. Expect only
+	 *             {@link java.lang.Exception#getCause()}. Expect only
 	 *             {@code IOException's} to be wrapped. Subclasses of
-	 *             {@link IOException} (e.g. {@link MissingObjectException}) are
+	 *             {@link java.io.IOException} (e.g.
+	 *             {@link org.eclipse.jgit.errors.MissingObjectException}) are
 	 *             typically not wrapped here but thrown as original exception
 	 */
 	public LogCommand add(AnyObjectId start) throws MissingObjectException,
@@ -202,23 +206,26 @@
 	 * Same as {@code --not start}, or {@code ^start}
 	 *
 	 * @param start
+	 *            a {@link org.eclipse.jgit.lib.AnyObjectId}
 	 * @return {@code this}
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the commit supplied is not available from the object
 	 *             database. This usually indicates the supplied commit is
 	 *             invalid, but the reference was constructed during an earlier
-	 *             invocation to {@link RevWalk#lookupCommit(AnyObjectId)}.
-	 * @throws IncorrectObjectTypeException
+	 *             invocation to
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupCommit(AnyObjectId)}.
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually a commit. This usually
 	 *             indicates the caller supplied a non-commit SHA-1 to
-	 *             {@link RevWalk#lookupCommit(AnyObjectId)}.
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupCommit(AnyObjectId)}.
 	 * @throws JGitInternalException
 	 *             a low-level exception of JGit has occurred. The original
 	 *             exception can be retrieved by calling
-	 *             {@link Exception#getCause()}. Expect only
+	 *             {@link java.lang.Exception#getCause()}. Expect only
 	 *             {@code IOException's} to be wrapped. Subclasses of
-	 *             {@link IOException} (e.g. {@link MissingObjectException}) are
+	 *             {@link java.io.IOException} (e.g.
+	 *             {@link org.eclipse.jgit.errors.MissingObjectException}) are
 	 *             typically not wrapped here but thrown as original exception
 	 */
 	public LogCommand not(AnyObjectId start) throws MissingObjectException,
@@ -230,24 +237,28 @@
 	 * Adds the range {@code since..until}
 	 *
 	 * @param since
+	 *            a {@link org.eclipse.jgit.lib.AnyObjectId} object.
 	 * @param until
+	 *            a {@link org.eclipse.jgit.lib.AnyObjectId} object.
 	 * @return {@code this}
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the commit supplied is not available from the object
 	 *             database. This usually indicates the supplied commit is
 	 *             invalid, but the reference was constructed during an earlier
-	 *             invocation to {@link RevWalk#lookupCommit(AnyObjectId)}.
-	 * @throws IncorrectObjectTypeException
+	 *             invocation to
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupCommit(AnyObjectId)}.
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually a commit. This usually
 	 *             indicates the caller supplied a non-commit SHA-1 to
-	 *             {@link RevWalk#lookupCommit(AnyObjectId)}.
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupCommit(AnyObjectId)}.
 	 * @throws JGitInternalException
 	 *             a low-level exception of JGit has occurred. The original
 	 *             exception can be retrieved by calling
-	 *             {@link Exception#getCause()}. Expect only
+	 *             {@link java.lang.Exception#getCause()}. Expect only
 	 *             {@code IOException's} to be wrapped. Subclasses of
-	 *             {@link IOException} (e.g. {@link MissingObjectException}) are
+	 *             {@link java.io.IOException} (e.g.
+	 *             {@link org.eclipse.jgit.errors.MissingObjectException}) are
 	 *             typically not wrapped here but thrown as original exception
 	 */
 	public LogCommand addRange(AnyObjectId since, AnyObjectId until)
@@ -260,7 +271,7 @@
 	 *
 	 * @see #add(AnyObjectId)
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the references could not be accessed
 	 */
 	public LogCommand all() throws IOException {
@@ -354,8 +365,7 @@
 
 
 	/**
-	 * Sets a filter for the <code>LogCommand</code>.
-	 *
+	 * Set a filter for the <code>LogCommand</code>.
 	 *
 	 * @param aFilter
 	 *            the filter that this instance of <code>LogCommand</code>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java
index 5157a41..3dcc3a5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java
@@ -83,6 +83,8 @@
 	private String uploadPack;
 
 	/**
+	 * Constructor for LsRemoteCommand
+	 *
 	 * @param repo
 	 *            local repository or null for operation without local
 	 *            repository
@@ -98,6 +100,7 @@
 	 *
 	 * @see Constants#DEFAULT_REMOTE_NAME
 	 * @param remote
+	 *            a {@link java.lang.String} object.
 	 * @return {@code this}
 	 */
 	public LsRemoteCommand setRemote(String remote) {
@@ -110,6 +113,7 @@
 	 * Include refs/heads in references results
 	 *
 	 * @param heads
+	 *            whether to include refs/heads
 	 * @return {@code this}
 	 */
 	public LsRemoteCommand setHeads(boolean heads) {
@@ -121,6 +125,7 @@
 	 * Include refs/tags in references results
 	 *
 	 * @param tags
+	 *            whether to include tags
 	 * @return {@code this}
 	 */
 	public LsRemoteCommand setTags(boolean tags) {
@@ -132,6 +137,8 @@
 	 * The full path of git-upload-pack on the remote host
 	 *
 	 * @param uploadPack
+	 *            the full path of executable providing the git-upload-pack
+	 *            service on remote host
 	 * @return {@code this}
 	 */
 	public LsRemoteCommand setUploadPack(String uploadPack) {
@@ -140,18 +147,12 @@
 	}
 
 	/**
-	 * Executes the {@code LsRemote} command with all the options and parameters
+	 * {@inheritDoc}
+	 * <p>
+	 * Execute the {@code LsRemote} command with all the options and parameters
 	 * collected by the setter methods (e.g. {@link #setHeads(boolean)}) of this
 	 * class. Each instance of this class should only be used for one invocation
 	 * of the command. Don't call this method twice on an instance.
-	 *
-	 * @return a collection of references in the remote repository
-	 * @throws GitAPIException
-	 *             or subclass thereof when an error occurs
-	 * @throws InvalidRemoteException
-	 *             when called with an invalid remote uri
-	 * @throws org.eclipse.jgit.api.errors.TransportException
-	 *             for errors that occurs during transport
 	 */
 	@Override
 	public Collection<Ref> call() throws GitAPIException,
@@ -164,9 +165,9 @@
 	 * Same as {@link #call()}, but return Map instead of Collection.
 	 *
 	 * @return a map from names to references in the remote repository
-	 * @throws GitAPIException
+	 * @throws org.eclipse.jgit.api.errors.GitAPIException
 	 *             or subclass thereof when an error occurs
-	 * @throws InvalidRemoteException
+	 * @throws org.eclipse.jgit.api.errors.InvalidRemoteException
 	 *             when called with an invalid remote uri
 	 * @throws org.eclipse.jgit.api.errors.TransportException
 	 *             for errors that occurs during transport
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
index 75460fb..44ff18f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
@@ -211,19 +211,22 @@
 	private Boolean commit;
 
 	/**
+	 * Constructor for MergeCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected MergeCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
-	 * Executes the {@code Merge} command with all the options and parameters
+	 * {@inheritDoc}
+	 * <p>
+	 * Execute the {@code Merge} command with all the options and parameters
 	 * collected by the setter methods (e.g. {@link #include(Ref)}) of this
 	 * class. Each instance of this class should only be used for one invocation
 	 * of the command. Don't call this method twice on an instance.
-	 *
-	 * @return the result of the merge
 	 */
 	@Override
 	@SuppressWarnings("boxing")
@@ -492,9 +495,10 @@
 	}
 
 	/**
+	 * Set merge strategy
 	 *
 	 * @param mergeStrategy
-	 *            the {@link MergeStrategy} to be used
+	 *            the {@link org.eclipse.jgit.merge.MergeStrategy} to be used
 	 * @return {@code this}
 	 */
 	public MergeCommand setStrategy(MergeStrategy mergeStrategy) {
@@ -504,6 +508,8 @@
 	}
 
 	/**
+	 * Reference to a commit to be merged with the current head
+	 *
 	 * @param aCommit
 	 *            a reference to a commit which is merged with the current head
 	 * @return {@code this}
@@ -515,6 +521,8 @@
 	}
 
 	/**
+	 * Id of a commit which is to be merged with the current head
+	 *
 	 * @param aCommit
 	 *            the Id of a commit which is merged with the current head
 	 * @return {@code this}
@@ -524,8 +532,10 @@
 	}
 
 	/**
+	 * Include a commit
+	 *
 	 * @param name
-	 *            a name given to the commit
+	 *            a name of a {@code Ref} pointing to the commit
 	 * @param aCommit
 	 *            the Id of a commit which is merged with the current head
 	 * @return {@code this}
@@ -541,9 +551,10 @@
 	 * HEAD. Otherwise, perform the merge and commit the result.
 	 * <p>
 	 * In case the merge was successful but this flag was set to
-	 * <code>true</code> a {@link MergeResult} with status
-	 * {@link MergeStatus#MERGED_SQUASHED} or
-	 * {@link MergeStatus#FAST_FORWARD_SQUASHED} is returned.
+	 * <code>true</code> a {@link org.eclipse.jgit.api.MergeResult} with status
+	 * {@link org.eclipse.jgit.api.MergeResult.MergeStatus#MERGED_SQUASHED} or
+	 * {@link org.eclipse.jgit.api.MergeResult.MergeStatus#FAST_FORWARD_SQUASHED}
+	 * is returned.
 	 *
 	 * @param squash
 	 *            whether to squash commits or not
@@ -582,9 +593,11 @@
 	 *            <code>true</code> if this command should commit (this is the
 	 *            default behavior). <code>false</code> if this command should
 	 *            not commit. In case the merge was successful but this flag was
-	 *            set to <code>false</code> a {@link MergeResult} with type
-	 *            {@link MergeResult} with status
-	 *            {@link MergeStatus#MERGED_NOT_COMMITTED} is returned
+	 *            set to <code>false</code> a
+	 *            {@link org.eclipse.jgit.api.MergeResult} with type
+	 *            {@link org.eclipse.jgit.api.MergeResult} with status
+	 *            {@link org.eclipse.jgit.api.MergeResult.MergeStatus#MERGED_NOT_COMMITTED}
+	 *            is returned
 	 * @return {@code this}
 	 * @since 3.0
 	 */
@@ -612,7 +625,6 @@
 	 * is set to <code>NullProgressMonitor</code>
 	 *
 	 * @see NullProgressMonitor
-	 *
 	 * @param monitor
 	 *            A progress monitor
 	 * @return this instance
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 c487ef6..765b320 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
@@ -53,11 +53,10 @@
 import org.eclipse.jgit.merge.MergeChunk;
 import org.eclipse.jgit.merge.MergeChunk.ConflictState;
 import org.eclipse.jgit.merge.MergeStrategy;
-import org.eclipse.jgit.merge.ResolveMerger;
 import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
 
 /**
- * Encapsulates the result of a {@link MergeCommand}.
+ * Encapsulates the result of a {@link org.eclipse.jgit.api.MergeCommand}.
  */
 public class MergeResult {
 
@@ -249,6 +248,8 @@
 	private List<String> checkoutConflicts;
 
 	/**
+	 * Constructor for MergeResult.
+	 *
 	 * @param newHead
 	 *            the object the head points at after the merge
 	 * @param base
@@ -260,10 +261,10 @@
 	 * @param mergeStatus
 	 *            the status the merge resulted in
 	 * @param mergeStrategy
-	 *            the used {@link MergeStrategy}
+	 *            the used {@link org.eclipse.jgit.merge.MergeStrategy}
 	 * @param lowLevelResults
 	 *            merge results as returned by
-	 *            {@link ResolveMerger#getMergeResults()}
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#getMergeResults()}
 	 * @since 2.0
 	 */
 	public MergeResult(ObjectId newHead, ObjectId base,
@@ -275,6 +276,8 @@
 	}
 
 	/**
+	 * Constructor for MergeResult.
+	 *
 	 * @param newHead
 	 *            the object the head points at after the merge
 	 * @param base
@@ -286,9 +289,10 @@
 	 * @param mergeStatus
 	 *            the status the merge resulted in
 	 * @param mergeStrategy
-	 *            the used {@link MergeStrategy}
+	 *            the used {@link org.eclipse.jgit.merge.MergeStrategy}
 	 * @param lowLevelResults
-	 *            merge results as returned by {@link ResolveMerger#getMergeResults()}
+	 *            merge results as returned by
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#getMergeResults()}
 	 * @param description
 	 *            a user friendly description of the merge result
 	 */
@@ -302,6 +306,8 @@
 	}
 
 	/**
+	 * Constructor for MergeResult.
+	 *
 	 * @param newHead
 	 *            the object the head points at after the merge
 	 * @param base
@@ -313,13 +319,13 @@
 	 * @param mergeStatus
 	 *            the status the merge resulted in
 	 * @param mergeStrategy
-	 *            the used {@link MergeStrategy}
+	 *            the used {@link org.eclipse.jgit.merge.MergeStrategy}
 	 * @param lowLevelResults
 	 *            merge results as returned by
-	 *            {@link ResolveMerger#getMergeResults()}
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#getMergeResults()}
 	 * @param failingPaths
 	 *            list of paths causing this merge to fail as returned by
-	 *            {@link ResolveMerger#getFailingPaths()}
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#getFailingPaths()}
 	 * @param description
 	 *            a user friendly description of the merge result
 	 */
@@ -354,6 +360,8 @@
 	}
 
 	/**
+	 * Get the object the head points at after the merge
+	 *
 	 * @return the object the head points at after the merge
 	 */
 	public ObjectId getNewHead() {
@@ -361,6 +369,8 @@
 	}
 
 	/**
+	 * Get the merge status
+	 *
 	 * @return the status the merge resulted in
 	 */
 	public MergeStatus getMergeStatus() {
@@ -368,6 +378,8 @@
 	}
 
 	/**
+	 * Get the commits which have been merged
+	 *
 	 * @return all the commits which have been merged together
 	 */
 	public ObjectId[] getMergedCommits() {
@@ -375,6 +387,8 @@
 	}
 
 	/**
+	 * Get the common base
+	 *
 	 * @return base the common base which was used to produce a content-merge.
 	 *         May be <code>null</code> if the merge-result was produced without
 	 *         computing a common base
@@ -383,6 +397,7 @@
 		return base;
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -402,6 +417,8 @@
 	}
 
 	/**
+	 * Set conflicts
+	 *
 	 * @param conflicts
 	 *            the conflicts to set
 	 */
@@ -410,7 +427,10 @@
 	}
 
 	/**
+	 * Add a conflict
+	 *
 	 * @param path
+	 *            path of the file to add a conflict for
 	 * @param conflictingRanges
 	 *            the conflicts to set
 	 */
@@ -421,8 +441,12 @@
 	}
 
 	/**
+	 * Add a conflict
+	 *
 	 * @param path
+	 *            path of the file to add a conflict for
 	 * @param lowLevelResult
+	 *            a {@link org.eclipse.jgit.merge.MergeResult}
 	 */
 	public void addConflict(String path, org.eclipse.jgit.merge.MergeResult<?> lowLevelResult) {
 		if (!lowLevelResult.containsConflicts())
@@ -462,9 +486,10 @@
 
 	/**
 	 * Returns information about the conflicts which occurred during a
-	 * {@link MergeCommand}. The returned value maps the path of a conflicting
-	 * file to a two-dimensional int-array of line-numbers telling where in the
-	 * file conflict markers for which merged commit can be found.
+	 * {@link org.eclipse.jgit.api.MergeCommand}. The returned value maps the
+	 * path of a conflicting file to a two-dimensional int-array of line-numbers
+	 * telling where in the file conflict markers for which merged commit can be
+	 * found.
 	 * <p>
 	 * If the returned value contains a mapping "path"-&gt;[x][y]=z then this
 	 * means
@@ -505,7 +530,7 @@
 
 	/**
 	 * Returns a list of paths causing this merge to fail as returned by
-	 * {@link ResolveMerger#getFailingPaths()}
+	 * {@link org.eclipse.jgit.merge.ResolveMerger#getFailingPaths()}
 	 *
 	 * @return the list of paths causing this merge to fail or <code>null</code>
 	 *         if no failure occurred
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 2a86fab..a9d9759 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
@@ -57,7 +57,6 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.FIFORevQueue;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -120,6 +119,7 @@
 	 * Create a new name-rev command.
 	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected NameRevCommand(Repository repo) {
 		super(repo);
@@ -134,6 +134,7 @@
 		};
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Map<ObjectId, String> call() throws GitAPIException {
 		try {
@@ -199,13 +200,13 @@
 	 * @param id
 	 *            object ID to add.
 	 * @return {@code this}
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object supplied is not available from the object
 	 *             database.
-	 * @throws JGitInternalException
+	 * @throws org.eclipse.jgit.api.errors.JGitInternalException
 	 *             a low-level exception of JGit has occurred. The original
 	 *             exception can be retrieved by calling
-	 *             {@link Exception#getCause()}.
+	 *             {@link java.lang.Exception#getCause()}.
 	 */
 	public NameRevCommand add(ObjectId id) throws MissingObjectException,
 			JGitInternalException {
@@ -227,13 +228,13 @@
 	 * @param ids
 	 *            object IDs to add.
 	 * @return {@code this}
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object supplied is not available from the object
 	 *             database.
-	 * @throws JGitInternalException
+	 * @throws org.eclipse.jgit.api.errors.JGitInternalException
 	 *             a low-level exception of JGit has occurred. The original
 	 *             exception can be retrieved by calling
-	 *             {@link Exception#getCause()}.
+	 *             {@link java.lang.Exception#getCause()}.
 	 */
 	public NameRevCommand add(Iterable<ObjectId> ids)
 			throws MissingObjectException, JGitInternalException {
@@ -250,7 +251,8 @@
 	 * prefix added by {@link #addPrefix(String)}.
 	 *
 	 * @param prefix
-	 *            prefix to add; see {@link RefDatabase#getRefs(String)}
+	 *            prefix to add; see
+	 *            {@link org.eclipse.jgit.lib.RefDatabase#getRefs(String)}
 	 * @return {@code this}
 	 */
 	public NameRevCommand addPrefix(String prefix) {
@@ -260,8 +262,8 @@
 	}
 
 	/**
-	 * Add all annotated tags under {@code refs/tags/} to the set that all results
-	 * must match.
+	 * Add all annotated tags under {@code refs/tags/} to the set that all
+	 * results must match.
 	 * <p>
 	 * Calls {@link #addRef(Ref)}; see that method for a note on matching
 	 * priority.
@@ -270,7 +272,7 @@
 	 * @throws JGitInternalException
 	 *             a low-level exception of JGit has occurred. The original
 	 *             exception can be retrieved by calling
-	 *             {@link Exception#getCause()}.
+	 *             {@link java.lang.Exception#getCause()}.
 	 */
 	public NameRevCommand addAnnotatedTags() {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
index aa97996..f0ad29d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
@@ -52,7 +52,6 @@
 import org.eclipse.jgit.api.MergeCommand.FastForwardMode.Merge;
 import org.eclipse.jgit.api.RebaseCommand.Operation;
 import org.eclipse.jgit.api.errors.CanceledException;
-import org.eclipse.jgit.api.errors.DetachedHeadException;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.InvalidConfigurationException;
 import org.eclipse.jgit.api.errors.InvalidRemoteException;
@@ -104,13 +103,18 @@
 	private FetchRecurseSubmodulesMode submoduleRecurseMode = null;
 
 	/**
+	 * Constructor for PullCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected PullCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * Set progress monitor
+	 *
 	 * @param monitor
 	 *            a progress monitor
 	 * @return this instance
@@ -139,6 +143,7 @@
 	 * branch.[name].rebase and branch.autosetuprebase.
 	 *
 	 * @param useRebase
+	 *            whether to use rebase after fetching
 	 * @return {@code this}
 	 */
 	public PullCommand setRebase(boolean useRebase) {
@@ -149,7 +154,8 @@
 	}
 
 	/**
-	 * Sets the {@link BranchRebaseMode} to use after fetching.
+	 * Sets the {@link org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode} to
+	 * use after fetching.
 	 *
 	 * <dl>
 	 * <dt>BranchRebaseMode.REBASE</dt>
@@ -176,7 +182,8 @@
 	 * {@code pull.rebase}.
 	 *
 	 * @param rebaseMode
-	 *            the {@link BranchRebaseMode} to use
+	 *            the {@link org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode}
+	 *            to use
 	 * @return {@code this}
 	 * @since 4.5
 	 */
@@ -187,23 +194,13 @@
 	}
 
 	/**
-	 * Executes the {@code Pull} command with all the options and parameters
+	 * {@inheritDoc}
+	 * <p>
+	 * Execute the {@code Pull} command with all the options and parameters
 	 * collected by the setter methods (e.g.
 	 * {@link #setProgressMonitor(ProgressMonitor)}) of this class. Each
 	 * instance of this class should only be used for one invocation of the
 	 * command. Don't call this method twice on an instance.
-	 *
-	 * @return the result of the pull
-	 * @throws WrongRepositoryStateException
-	 * @throws InvalidConfigurationException
-	 * @throws DetachedHeadException
-	 * @throws InvalidRemoteException
-	 * @throws CanceledException
-	 * @throws RefNotFoundException
-	 * @throws RefNotAdvertisedException
-	 * @throws NoHeadException
-	 * @throws org.eclipse.jgit.api.errors.TransportException
-	 * @throws GitAPIException
 	 */
 	@Override
 	public PullResult call() throws GitAPIException,
@@ -370,6 +367,7 @@
 	 *
 	 * @see Constants#DEFAULT_REMOTE_NAME
 	 * @param remote
+	 *            name of the remote to pull from
 	 * @return {@code this}
 	 * @since 3.3
 	 */
@@ -386,6 +384,7 @@
 	 * the current branch is used.
 	 *
 	 * @param remoteBranchName
+	 *            remote branch name to be used for pull operation
 	 * @return {@code this}
 	 * @since 3.3
 	 */
@@ -396,6 +395,8 @@
 	}
 
 	/**
+	 * Get the remote name used for pull operation
+	 *
 	 * @return the remote used for the pull operation if it was set explicitly
 	 * @since 3.3
 	 */
@@ -404,6 +405,8 @@
 	}
 
 	/**
+	 * Get the remote branch name for the pull operation
+	 *
 	 * @return the remote branch name used for the pull operation if it was set
 	 *         explicitly
 	 * @since 3.3
@@ -413,6 +416,8 @@
 	}
 
 	/**
+	 * Set the @{code MergeStrategy}
+	 *
 	 * @param strategy
 	 *            The merge strategy to use during this pull operation.
 	 * @return {@code this}
@@ -424,9 +429,10 @@
 	}
 
 	/**
-	 * Sets the specification of annotated tag behavior during fetch
+	 * Set the specification of annotated tag behavior during fetch
 	 *
 	 * @param tagOpt
+	 *            the {@link org.eclipse.jgit.transport.TagOpt}
 	 * @return {@code this}
 	 * @since 4.7
 	 */
@@ -437,8 +443,8 @@
 	}
 
 	/**
-	 * Sets the fast forward mode. It is used if pull is configured to do a
-	 * merge as opposed to rebase. If non-{@code null} takes precedence over the
+	 * Set the fast forward mode. It is used if pull is configured to do a merge
+	 * as opposed to rebase. If non-{@code null} takes precedence over the
 	 * fast-forward mode configured in git config.
 	 *
 	 * @param fastForwardMode
@@ -461,6 +467,9 @@
 	 * Set the mode to be used for recursing into submodules.
 	 *
 	 * @param recurse
+	 *            the
+	 *            {@link org.eclipse.jgit.lib.SubmoduleConfig.FetchRecurseSubmodulesMode}
+	 *            to be used for recursing into submodules
 	 * @return {@code this}
 	 * @since 4.7
 	 * @see FetchCommand#setRecurseSubmodules(FetchRecurseSubmodulesMode)
@@ -475,13 +484,14 @@
 	 * Reads the rebase mode to use for a pull command from the repository
 	 * configuration. This is the value defined for the configurations
 	 * {@code branch.[branchName].rebase}, or,if not set, {@code pull.rebase}.
-	 * If neither is set, yields {@link BranchRebaseMode#NONE}.
+	 * If neither is set, yields
+	 * {@link org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode#NONE}.
 	 *
 	 * @param branchName
 	 *            name of the local branch
 	 * @param config
-	 *            the {@link Config} to read the value from
-	 * @return the {@link BranchRebaseMode}
+	 *            the {@link org.eclipse.jgit.lib.Config} to read the value from
+	 * @return the {@link org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode}
 	 * @since 4.5
 	 */
 	public static BranchRebaseMode getRebaseMode(String branchName,
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 c1eb89d..7210088 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullResult.java
@@ -45,7 +45,7 @@
 import org.eclipse.jgit.transport.FetchResult;
 
 /**
- * Encapsulates the result of a {@link PullCommand}
+ * Encapsulates the result of a {@link org.eclipse.jgit.api.PullCommand}
  */
 public class PullResult {
 	private final FetchResult fetchResult;
@@ -73,6 +73,8 @@
 	}
 
 	/**
+	 * Get fetch result
+	 *
 	 * @return the fetch result, or <code>null</code>
 	 */
 	public FetchResult getFetchResult() {
@@ -80,6 +82,8 @@
 	}
 
 	/**
+	 * Get merge result
+	 *
 	 * @return the merge result, or <code>null</code>
 	 */
 	public MergeResult getMergeResult() {
@@ -87,6 +91,8 @@
 	}
 
 	/**
+	 * Get rebase result
+	 *
 	 * @return the rebase result, or <code>null</code>
 	 */
 	public RebaseResult getRebaseResult() {
@@ -94,6 +100,8 @@
 	}
 
 	/**
+	 * Get name of the remote configuration from which fetch was tried
+	 *
 	 * @return the name of the remote configuration from which fetch was tried,
 	 *         or <code>null</code>
 	 */
@@ -102,6 +110,8 @@
 	}
 
 	/**
+	 * Whether the pull was successful
+	 *
 	 * @return whether the pull was successful
 	 */
 	public boolean isSuccessful() {
@@ -112,6 +122,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java
index bf88842..19bdd35 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java
@@ -105,7 +105,12 @@
 	private List<String> pushOptions;
 
 	/**
+	 * <p>
+	 * Constructor for PushCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected PushCommand(Repository repo) {
 		super(repo);
@@ -114,17 +119,12 @@
 	}
 
 	/**
-	 * Executes the {@code push} command with all the options and parameters
+	 * {@inheritDoc}
+	 * <p>
+	 * Execute the {@code push} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command (means: one
 	 * call to {@link #call()})
-	 *
-	 * @return an iteration over {@link PushResult} objects
-	 * @throws InvalidRemoteException
-	 *             when called with an invalid remote uri
-	 * @throws org.eclipse.jgit.api.errors.TransportException
-	 *             when an error occurs with the transport
-	 * @throws GitAPIException
 	 */
 	@Override
 	public Iterable<PushResult> call() throws GitAPIException,
@@ -209,6 +209,7 @@
 	 *
 	 * @see Constants#DEFAULT_REMOTE_NAME
 	 * @param remote
+	 *            the remote name
 	 * @return {@code this}
 	 */
 	public PushCommand setRemote(String remote) {
@@ -218,6 +219,8 @@
 	}
 
 	/**
+	 * Get remote name
+	 *
 	 * @return the remote used for the remote operation
 	 */
 	public String getRemote() {
@@ -231,6 +234,8 @@
 	 *
 	 * @see RemoteConfig#DEFAULT_RECEIVE_PACK
 	 * @param receivePack
+	 *            name of the remote executable providing the receive-pack
+	 *            service
 	 * @return {@code this}
 	 */
 	public PushCommand setReceivePack(String receivePack) {
@@ -240,6 +245,8 @@
 	}
 
 	/**
+	 * Get the name of the remote executable providing the receive-pack service
+	 *
 	 * @return the receive-pack used for the remote operation
 	 */
 	public String getReceivePack() {
@@ -247,6 +254,8 @@
 	}
 
 	/**
+	 * Get timeout used for push operation
+	 *
 	 * @return the timeout used for the push operation
 	 */
 	public int getTimeout() {
@@ -254,6 +263,8 @@
 	}
 
 	/**
+	 * Get the progress monitor
+	 *
 	 * @return the progress monitor for the push operation
 	 */
 	public ProgressMonitor getProgressMonitor() {
@@ -265,8 +276,8 @@
 	 * is set to <code>NullProgressMonitor</code>
 	 *
 	 * @see NullProgressMonitor
-	 *
 	 * @param monitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor}
 	 * @return {@code this}
 	 */
 	public PushCommand setProgressMonitor(ProgressMonitor monitor) {
@@ -279,7 +290,9 @@
 	}
 
 	/**
-	 * @return the ref lease specs
+	 * Get the <code>RefLeaseSpec</code>s.
+	 *
+	 * @return the <code>RefLeaseSpec</code>s
 	 * @since 4.7
 	 */
 	public List<RefLeaseSpec> getRefLeaseSpecs() {
@@ -287,10 +300,11 @@
 	}
 
 	/**
-	 * The ref lease specs to be used in the push operation,
-	 * for a force-with-lease push operation.
+	 * The ref lease specs to be used in the push operation, for a
+	 * force-with-lease push operation.
 	 *
 	 * @param specs
+	 *            a {@link org.eclipse.jgit.transport.RefLeaseSpec} object.
 	 * @return {@code this}
 	 * @since 4.7
 	 */
@@ -299,10 +313,11 @@
 	}
 
 	/**
-	 * The ref lease specs to be used in the push operation,
-	 * for a force-with-lease push operation.
+	 * The ref lease specs to be used in the push operation, for a
+	 * force-with-lease push operation.
 	 *
 	 * @param specs
+	 *            list of {@code RefLeaseSpec}s
 	 * @return {@code this}
 	 * @since 4.7
 	 */
@@ -316,6 +331,8 @@
 	}
 
 	/**
+	 * Get {@code RefSpec}s.
+	 *
 	 * @return the ref specs
 	 */
 	public List<RefSpec> getRefSpecs() {
@@ -325,7 +342,7 @@
 	/**
 	 * The ref specs to be used in the push operation
 	 *
-	 * @param specs
+	 * @param specs a {@link org.eclipse.jgit.transport.RefSpec} object.
 	 * @return {@code this}
 	 */
 	public PushCommand setRefSpecs(RefSpec... specs) {
@@ -339,6 +356,7 @@
 	 * The ref specs to be used in the push operation
 	 *
 	 * @param specs
+	 *            list of {@link org.eclipse.jgit.transport.RefSpec}s
 	 * @return {@code this}
 	 */
 	public PushCommand setRefSpecs(List<RefSpec> specs) {
@@ -408,6 +426,8 @@
 	}
 
 	/**
+	 * Whether to run the push operation as a dry run
+	 *
 	 * @return the dry run preference for the push operation
 	 */
 	public boolean isDryRun() {
@@ -417,7 +437,7 @@
 	/**
 	 * Sets whether the push operation should be a dry run
 	 *
-	 * @param dryRun
+	 * @param dryRun a boolean.
 	 * @return {@code this}
 	 */
 	public PushCommand setDryRun(boolean dryRun) {
@@ -427,6 +447,8 @@
 	}
 
 	/**
+	 * Get the thin-pack preference
+	 *
 	 * @return the thin-pack preference for push operation
 	 */
 	public boolean isThin() {
@@ -434,11 +456,12 @@
 	}
 
 	/**
-	 * Sets the thin-pack preference for push operation.
+	 * Set the thin-pack preference for push operation.
 	 *
 	 * Default setting is Transport.DEFAULT_PUSH_THIN
 	 *
 	 * @param thin
+	 *            the thin-pack preference value
 	 * @return {@code this}
 	 */
 	public PushCommand setThin(boolean thin) {
@@ -448,6 +471,9 @@
 	}
 
 	/**
+	 * Whether this push should be executed atomically (all references updated,
+	 * or none)
+	 *
 	 * @return true if all-or-nothing behavior is requested.
 	 * @since 4.2
 	 */
@@ -461,6 +487,7 @@
 	 * Default setting is false.
 	 *
 	 * @param atomic
+	 *            whether to run the push atomically
 	 * @return {@code this}
 	 * @since 4.2
 	 */
@@ -471,6 +498,8 @@
 	}
 
 	/**
+	 * Whether to push forcefully
+	 *
 	 * @return the force preference for push operation
 	 */
 	public boolean isForce() {
@@ -481,6 +510,7 @@
 	 * Sets the force preference for push operation.
 	 *
 	 * @param force
+	 *            whether to push forcefully
 	 * @return {@code this}
 	 */
 	public PushCommand setForce(boolean force) {
@@ -493,6 +523,7 @@
 	 * Sets the output stream to write sideband messages to
 	 *
 	 * @param out
+	 *            an {@link java.io.OutputStream}
 	 * @return {@code this}
 	 * @since 3.0
 	 */
@@ -502,6 +533,8 @@
 	}
 
 	/**
+	 * Get push options
+	 *
 	 * @return the option strings associated with the push operation
 	 * @since 4.5
 	 */
@@ -510,9 +543,10 @@
 	}
 
 	/**
-	 * Sets the option strings associated with the push operation.
+	 * Set the option strings associated with the push operation.
 	 *
 	 * @param pushOptions
+	 *            a {@link java.util.List} of push option strings
 	 * @return {@code this}
 	 * @since 4.5
 	 */
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 955c50b..b86a2fd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -238,7 +238,12 @@
 	private boolean preserveMerges = false;
 
 	/**
+	 * <p>
+	 * Constructor for RebaseCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RebaseCommand(Repository repo) {
 		super(repo);
@@ -247,16 +252,12 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Rebase} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command. Don't call
 	 * this method twice on an instance.
-	 *
-	 * @return an object describing the result of this command
-	 * @throws GitAPIException
-	 * @throws WrongRepositoryStateException
-	 * @throws NoHeadException
-	 * @throws RefNotFoundException
 	 */
 	@Override
 	public RebaseResult call() throws GitAPIException, NoHeadException,
@@ -1228,12 +1229,14 @@
 	}
 
 	/**
-	 * checks if we can fast-forward and returns the new head if it is possible
+	 * Check if we can fast-forward and returns the new head if it is possible
 	 *
 	 * @param newCommit
+	 *            a {@link org.eclipse.jgit.revwalk.RevCommit} object to check
+	 *            if we can fast-forward to.
 	 * @return the new head, or null
-	 * @throws IOException
-	 * @throws GitAPIException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.api.errors.GitAPIException
 	 */
 	public RevCommit tryFastForward(RevCommit newCommit) throws IOException,
 			GitAPIException {
@@ -1436,6 +1439,8 @@
 
 
 	/**
+	 * Set upstream {@code RevCommit}
+	 *
 	 * @param upstream
 	 *            the upstream commit
 	 * @return {@code this}
@@ -1447,6 +1452,8 @@
 	}
 
 	/**
+	 * Set the upstream commit
+	 *
 	 * @param upstream
 	 *            id of the upstream commit
 	 * @return {@code this}
@@ -1464,10 +1471,12 @@
 	}
 
 	/**
+	 * Set the upstream branch
+	 *
 	 * @param upstream
-	 *            the upstream branch
+	 *            the name of the upstream branch
 	 * @return {@code this}
-	 * @throws RefNotFoundException
+	 * @throws org.eclipse.jgit.api.errors.RefNotFoundException
 	 */
 	public RebaseCommand setUpstream(String upstream)
 			throws RefNotFoundException {
@@ -1502,6 +1511,8 @@
 	}
 
 	/**
+	 * Set the operation to execute during rebase
+	 *
 	 * @param operation
 	 *            the operation to perform
 	 * @return {@code this}
@@ -1512,6 +1523,8 @@
 	}
 
 	/**
+	 * Set progress monitor
+	 *
 	 * @param monitor
 	 *            a progress monitor
 	 * @return this instance
@@ -1525,15 +1538,18 @@
 	}
 
 	/**
-	 * Enables interactive rebase
+	 * Enable interactive rebase
 	 * <p>
 	 * Does not stop after initialization of interactive rebase. This is
 	 * equivalent to
-	 * {@link RebaseCommand#runInteractively(InteractiveHandler, boolean)
+	 * {@link org.eclipse.jgit.api.RebaseCommand#runInteractively(InteractiveHandler, boolean)
 	 * runInteractively(handler, false)};
 	 * </p>
 	 *
 	 * @param handler
+	 *            the
+	 *            {@link org.eclipse.jgit.api.RebaseCommand.InteractiveHandler}
+	 *            to use
 	 * @return this
 	 */
 	public RebaseCommand runInteractively(InteractiveHandler handler) {
@@ -1541,14 +1557,17 @@
 	}
 
 	/**
-	 * Enables interactive rebase
+	 * Enable interactive rebase
 	 * <p>
 	 * If stopAfterRebaseInteractiveInitialization is {@code true} the rebase
 	 * stops after initialization of interactive rebase returning
-	 * {@link RebaseResult#INTERACTIVE_PREPARED_RESULT}
+	 * {@link org.eclipse.jgit.api.RebaseResult#INTERACTIVE_PREPARED_RESULT}
 	 * </p>
 	 *
 	 * @param handler
+	 *            the
+	 *            {@link org.eclipse.jgit.api.RebaseCommand.InteractiveHandler}
+	 *            to use
 	 * @param stopAfterRebaseInteractiveInitialization
 	 *            if {@code true} the rebase stops after initialization
 	 * @return this instance
@@ -1562,6 +1581,8 @@
 	}
 
 	/**
+	 * Set the <code>MergeStrategy</code>.
+	 *
 	 * @param strategy
 	 *            The merge strategy to use during this rebase operation.
 	 * @return {@code this}
@@ -1573,9 +1594,11 @@
 	}
 
 	/**
+	 * Whether to preserve merges during rebase
+	 *
 	 * @param preserve
-	 *            True to re-create merges during rebase. Defaults to false, a
-	 *            flattening rebase.
+	 *            {@code true} to re-create merges during rebase. Defaults to
+	 *            {@code false}, a flattening rebase.
 	 * @return {@code this}
 	 * @since 3.5
 	 */
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 92c1347..bad6a7c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java
@@ -45,12 +45,11 @@
 import java.util.List;
 import java.util.Map;
 
-import org.eclipse.jgit.merge.ResolveMerger;
 import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
 import org.eclipse.jgit.revwalk.RevCommit;
 
 /**
- * The result of a {@link RebaseCommand} execution
+ * The result of a {@link org.eclipse.jgit.api.RebaseCommand} execution
  */
 public class RebaseResult {
 	/**
@@ -279,6 +278,8 @@
 	}
 
 	/**
+	 * Get the status
+	 *
 	 * @return the overall status
 	 */
 	public Status getStatus() {
@@ -286,33 +287,46 @@
 	}
 
 	/**
-	 * @return the current commit if status is {@link Status#STOPPED}, otherwise
-	 *         <code>null</code>
+	 * Get the current commit if status is
+	 * {@link org.eclipse.jgit.api.RebaseResult.Status#STOPPED}, otherwise
+	 * <code>null</code>
+	 *
+	 * @return the current commit if status is
+	 *         {@link org.eclipse.jgit.api.RebaseResult.Status#STOPPED},
+	 *         otherwise <code>null</code>
 	 */
 	public RevCommit getCurrentCommit() {
 		return currentCommit;
 	}
 
 	/**
+	 * Get the list of paths causing this rebase to fail
+	 *
 	 * @return the list of paths causing this rebase to fail (see
-	 *         {@link ResolveMerger#getFailingPaths()} for details) if status is
-	 *         {@link Status#FAILED}, otherwise <code>null</code>
+	 *         {@link org.eclipse.jgit.merge.ResolveMerger#getFailingPaths()}
+	 *         for details) if status is
+	 *         {@link org.eclipse.jgit.api.RebaseResult.Status#FAILED},
+	 *         otherwise <code>null</code>
 	 */
 	public Map<String, MergeFailureReason> getFailingPaths() {
 		return failingPaths;
 	}
 
 	/**
-	 * @return the list of conflicts if status is {@link Status#CONFLICTS}
+	 * Get the list of conflicts
+	 *
+	 * @return the list of conflicts if status is
+	 *         {@link org.eclipse.jgit.api.RebaseResult.Status#CONFLICTS}
 	 */
 	public List<String> getConflicts() {
 		return conflicts;
 	}
 
 	/**
-	 * @return the list of uncommitted changes if status is
-	 *         {@link Status#UNCOMMITTED_CHANGES}
+	 * <p>Getter for the field <code>uncommittedChanges</code>.</p>
 	 *
+	 * @return the list of uncommitted changes if status is
+	 *         {@link org.eclipse.jgit.api.RebaseResult.Status#UNCOMMITTED_CHANGES}
 	 * @since 3.2
 	 */
 	public List<String> getUncommittedChanges() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java
index 394bea5..bf3163a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java
@@ -67,7 +67,10 @@
 	private String ref = Constants.HEAD;
 
 	/**
+	 * Constructor for ReflogCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public ReflogCommand(Repository repo) {
 		super(repo);
@@ -78,6 +81,7 @@
 	 * value of HEAD will be used.
 	 *
 	 * @param ref
+	 *            the name of the {@code Ref} to log
 	 * @return {@code this}
 	 */
 	public ReflogCommand setRef(String ref) {
@@ -87,10 +91,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Run the reflog command
-	 *
-	 * @throws GitAPIException
-	 * @throws InvalidRefNameException
 	 */
 	@Override
 	public Collection<ReflogEntry> call() throws GitAPIException,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteAddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteAddCommand.java
index 6795669..c43c5c6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteAddCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteAddCommand.java
@@ -63,7 +63,6 @@
  * @see <a href=
  *      "http://www.kernel.org/pub/software/scm/git/docs/git-remote.html" > Git
  *      documentation about Remote</a>
- *
  * @since 4.2
  */
 public class RemoteAddCommand extends GitCommand<RemoteConfig> {
@@ -73,7 +72,10 @@
 	private URIish uri;
 
 	/**
+	 * Constructor for RemoteAddCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RemoteAddCommand(Repository repo) {
 		super(repo);
@@ -100,10 +102,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code remote add} command with all the options and
 	 * parameters collected by the setter methods of this class.
-	 *
-	 * @return the {@link RemoteConfig} object of the added remote
 	 */
 	@Override
 	public RemoteConfig call() throws GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteListCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteListCommand.java
index f778eaa..f96651f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteListCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteListCommand.java
@@ -59,23 +59,27 @@
  * @see <a href=
  *      "http://www.kernel.org/pub/software/scm/git/docs/git-remote.html" > Git
  *      documentation about Remote</a>
- *
  * @since 4.2
  */
 public class RemoteListCommand extends GitCommand<List<RemoteConfig>> {
 
 	/**
+	 * <p>
+	 * Constructor for RemoteListCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RemoteListCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code remote} command with all the options and parameters
 	 * collected by the setter methods of this class.
-	 *
-	 * @return a list of {@link RemoteConfig} objects.
 	 */
 	@Override
 	public List<RemoteConfig> call() throws GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteRemoveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteRemoveCommand.java
index 5782bf6..7a5885c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteRemoveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteRemoveCommand.java
@@ -61,7 +61,6 @@
  * @see <a href=
  *      "http://www.kernel.org/pub/software/scm/git/docs/git-remote.html" > Git
  *      documentation about Remote</a>
- *
  * @since 4.2
  */
 public class RemoteRemoveCommand extends GitCommand<RemoteConfig> {
@@ -69,7 +68,12 @@
 	private String name;
 
 	/**
+	 * <p>
+	 * Constructor for RemoteRemoveCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RemoteRemoveCommand(Repository repo) {
 		super(repo);
@@ -86,10 +90,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code remote} command with all the options and parameters
 	 * collected by the setter methods of this class.
-	 *
-	 * @return the {@link RemoteConfig} object of the removed remote
 	 */
 	@Override
 	public RemoteConfig call() throws GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteSetUrlCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteSetUrlCommand.java
index 6bd2ac7..d7b7a31 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteSetUrlCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoteSetUrlCommand.java
@@ -62,7 +62,6 @@
  * @see <a href=
  *      "http://www.kernel.org/pub/software/scm/git/docs/git-remote.html" > Git
  *      documentation about Remote</a>
- *
  * @since 4.2
  */
 public class RemoteSetUrlCommand extends GitCommand<RemoteConfig> {
@@ -74,7 +73,12 @@
 	private boolean push;
 
 	/**
+	 * <p>
+	 * Constructor for RemoteSetUrlCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RemoteSetUrlCommand(Repository repo) {
 		super(repo);
@@ -112,10 +116,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code remote} command with all the options and parameters
 	 * collected by the setter methods of this class.
-	 *
-	 * @return the {@link RemoteConfig} object of the modified remote
 	 */
 	@Override
 	public RemoteConfig call() throws GitAPIException {
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 fd8aac7..baae8248f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoveNoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RemoveNoteCommand.java
@@ -73,12 +73,18 @@
 	private String notesRef = Constants.R_NOTES_COMMITS;
 
 	/**
+	 * <p>
+	 * Constructor for RemoveNoteCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RemoveNoteCommand(Repository repo) {
 		super(repo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Note call() throws GitAPIException {
 		checkCallable();
@@ -105,6 +111,8 @@
 	 * Sets the object id of object you want to remove a note
 	 *
 	 * @param id
+	 *            the {@link org.eclipse.jgit.revwalk.RevObject} to remove a
+	 *            note from.
 	 * @return {@code this}
 	 */
 	public RemoveNoteCommand setObjectId(RevObject id) {
@@ -138,12 +146,13 @@
 	}
 
 	/**
-	 * @param notesRef
-	 *            the ref to read notes from. Note, the default value of
-	 *            {@link Constants#R_NOTES_COMMITS} will be used if nothing is
-	 *            set
-	 * @return {@code this}
+	 * Set the name of the <code>Ref</code> to remove a note from.
 	 *
+	 * @param notesRef
+	 *            the {@code Ref} to read notes from. Note, the default value of
+	 *            {@link org.eclipse.jgit.lib.Constants#R_NOTES_COMMITS} will be
+	 *            used if nothing is set
+	 * @return {@code this}
 	 * @see Constants#R_NOTES_COMMITS
 	 */
 	public RemoveNoteCommand setNotesRef(String notesRef) {
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 ce3a29f..24d9dd4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RenameBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RenameBranchCommand.java
@@ -77,25 +77,18 @@
 	private String newName;
 
 	/**
+	 * <p>
+	 * Constructor for RenameBranchCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RenameBranchCommand(Repository repo) {
 		super(repo);
 	}
 
-	/**
-	 * @throws RefNotFoundException
-	 *             if the old branch can not be found (branch with provided old
-	 *             name does not exist or old name resolves to a tag)
-	 * @throws InvalidRefNameException
-	 *             if the provided new name is <code>null</code> or otherwise
-	 *             invalid
-	 * @throws RefAlreadyExistsException
-	 *             if a branch with the new name already exists
-	 * @throws DetachedHeadException
-	 *             if rename is tried without specifying the old name and HEAD
-	 *             is detached
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Ref call() throws GitAPIException, RefNotFoundException, InvalidRefNameException,
 			RefAlreadyExistsException, DetachedHeadException {
@@ -198,6 +191,8 @@
 	}
 
 	/**
+	 * Set the new name of the branch
+	 *
 	 * @param newName
 	 *            the new name
 	 * @return this instance
@@ -209,6 +204,8 @@
 	}
 
 	/**
+	 * Set the old name of the branch
+	 *
 	 * @param oldName
 	 *            the name of the branch to rename; if not set, the currently
 	 *            checked out branch (if any) will be renamed
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 c5222c2..86a69b0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
@@ -126,20 +126,23 @@
 	private boolean isReflogDisabled;
 
 	/**
+	 * <p>
+	 * Constructor for ResetCommand.
+	 * </p>
 	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public ResetCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Reset} command. Each instance of this class should
 	 * only be used for one invocation of the command. Don't call this method
 	 * twice on an instance.
-	 *
-	 * @return the Ref after reset
-	 * @throws GitAPIException
 	 */
 	@Override
 	public Ref call() throws GitAPIException, CheckoutConflictException {
@@ -258,6 +261,8 @@
 	}
 
 	/**
+	 * Set the name of the <code>Ref</code> to reset to
+	 *
 	 * @param ref
 	 *            the ref to reset to, defaults to HEAD if not specified
 	 * @return this instance
@@ -268,6 +273,8 @@
 	}
 
 	/**
+	 * Set the reset mode
+	 *
 	 * @param mode
 	 *            the mode of the reset command
 	 * @return this instance
@@ -282,6 +289,8 @@
 	}
 
 	/**
+	 * Repository relative path of file or directory to reset
+	 *
 	 * @param path
 	 *            repository-relative path of file/directory to reset (with
 	 *            <code>/</code> as separator)
@@ -297,6 +306,8 @@
 	}
 
 	/**
+	 * Whether to disable reflog
+	 *
 	 * @param disable
 	 *            if {@code true} disables writing a reflog entry for this reset
 	 *            command
@@ -309,6 +320,8 @@
 	}
 
 	/**
+	 * Whether reflog is disabled
+	 *
 	 * @return {@code true} if writing reflog is disabled for this reset command
 	 * @since 4.5
 	 */
@@ -433,6 +446,7 @@
 		repo.writeMergeCommitMsg(null);
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
index c3152a9..fa0d4c4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java
@@ -98,27 +98,24 @@
 	private MergeStrategy strategy = MergeStrategy.RECURSIVE;
 
 	/**
+	 * <p>
+	 * Constructor for RevertCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected RevertCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code revert} command with all the options and parameters
 	 * collected by the setter methods (e.g. {@link #include(Ref)} of this
 	 * class. Each instance of this class should only be used for one invocation
 	 * of the command. Don't call this method twice on an instance.
-	 *
-	 * @return on success the {@link RevCommit} pointed to by the new HEAD is
-	 *         returned. If a failure occurred during revert <code>null</code>
-	 *         is returned. The list of successfully reverted {@link Ref}'s can
-	 *         be obtained by calling {@link #getRevertedRefs()}
-	 * @throws GitAPIException
-	 * @throws WrongRepositoryStateException
-	 * @throws ConcurrentRefUpdateException
-	 * @throws UnmergedPathsException
-	 * @throws NoMessageException
 	 */
 	@Override
 	public RevCommit call() throws NoMessageException, UnmergedPathsException,
@@ -227,9 +224,10 @@
 	}
 
 	/**
+	 * Include a {@code Ref} to a commit to be reverted
+	 *
 	 * @param commit
-	 *            a reference to a commit which is reverted into the current
-	 *            head
+	 *            a reference to a commit to be reverted into the current head
 	 * @return {@code this}
 	 */
 	public RevertCommand include(Ref commit) {
@@ -239,8 +237,10 @@
 	}
 
 	/**
+	 * Include a commit to be reverted
+	 *
 	 * @param commit
-	 *            the Id of a commit which is reverted into the current head
+	 *            the Id of a commit to be reverted into the current head
 	 * @return {@code this}
 	 */
 	public RevertCommand include(AnyObjectId commit) {
@@ -248,8 +248,10 @@
 	}
 
 	/**
+	 * Include a commit to be reverted
+	 *
 	 * @param name
-	 *            a name given to the commit
+	 *            name of a {@code Ref} referring to the commit
 	 * @param commit
 	 *            the Id of a commit which is reverted into the current head
 	 * @return {@code this}
@@ -260,6 +262,8 @@
 	}
 
 	/**
+	 * Set the name to be used in the "OURS" place for conflict markers
+	 *
 	 * @param ourCommitName
 	 *            the name that should be used in the "OURS" place for conflict
 	 *            markers
@@ -280,16 +284,20 @@
 	}
 
 	/**
-	 * @return the list of successfully reverted {@link Ref}'s. Never
-	 *         <code>null</code> but maybe an empty list if no commit was
-	 *         successfully cherry-picked
+	 * Get the list of successfully reverted {@link org.eclipse.jgit.lib.Ref}'s.
+	 *
+	 * @return the list of successfully reverted
+	 *         {@link org.eclipse.jgit.lib.Ref}'s. Never <code>null</code> but
+	 *         maybe an empty list if no commit was successfully cherry-picked
 	 */
 	public List<Ref> getRevertedRefs() {
 		return revertedRefs;
 	}
 
 	/**
-	 * @return the result of the merge failure, <code>null</code> if no merge
+	 * Get the result of a merge failure
+	 *
+	 * @return the result of a merge failure, <code>null</code> if no merge
 	 *         failure occurred during the revert
 	 */
 	public MergeResult getFailingResult() {
@@ -297,6 +305,8 @@
 	}
 
 	/**
+	 * Get unmerged paths
+	 *
 	 * @return the unmerged paths, will be null if no merge conflicts
 	 */
 	public List<String> getUnmergedPaths() {
@@ -304,8 +314,10 @@
 	}
 
 	/**
+	 * Set the merge strategy to use for this revert command
+	 *
 	 * @param strategy
-	 *            The merge strategy to use during this revert command.
+	 *            The merge strategy to use for this revert command.
 	 * @return {@code this}
 	 * @since 3.4
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java
index 48c23f5..088aa15 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RmCommand.java
@@ -72,7 +72,7 @@
  * class should only be used for one invocation of the command (means: one call
  * to {@link #call()}).
  * <p>
- * Examples (<code>git</code> is a {@link Git} instance):
+ * Examples (<code>git</code> is a {@link org.eclipse.jgit.api.Git} instance):
  * <p>
  * Remove file "test.txt" from both index and working directory:
  *
@@ -97,8 +97,10 @@
 	private boolean cached = false;
 
 	/**
+	 * Constructor for RmCommand.
 	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public RmCommand(Repository repo) {
 		super(repo);
@@ -106,6 +108,8 @@
 	}
 
 	/**
+	 * Add file name pattern of files to be removed
+	 *
 	 * @param filepattern
 	 *            repository-relative path of file to remove (with
 	 *            <code>/</code> as separator)
@@ -121,8 +125,9 @@
 	 * Only remove the specified files from the index.
 	 *
 	 * @param cached
-	 *            true if files should only be removed from index, false if
-	 *            files should also be deleted from the working directory
+	 *            {@code true} if files should only be removed from index,
+	 *            {@code false} if files should also be deleted from the working
+	 *            directory
 	 * @return {@code this}
 	 * @since 2.2
 	 */
@@ -133,11 +138,11 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Rm} command. Each instance of this class should only
 	 * be used for one invocation of the command. Don't call this method twice
 	 * on an instance.
-	 *
-	 * @return the DirCache after Rm
 	 */
 	@Override
 	public DirCache call() throws GitAPIException,
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 dbff463..eb81d20 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ShowNoteCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ShowNoteCommand.java
@@ -68,12 +68,16 @@
 	private String notesRef = Constants.R_NOTES_COMMITS;
 
 	/**
+	 * Constructor for ShowNoteCommand.
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	protected ShowNoteCommand(Repository repo) {
 		super(repo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Note call() throws GitAPIException {
 		checkCallable();
@@ -96,6 +100,8 @@
 	 * Sets the object id of object you want a note on
 	 *
 	 * @param id
+	 *            the {@link org.eclipse.jgit.revwalk.RevObject} to show notes
+	 *            for.
 	 * @return {@code this}
 	 */
 	public ShowNoteCommand setObjectId(RevObject id) {
@@ -105,12 +111,13 @@
 	}
 
 	/**
+	 * Set the {@code Ref} to read notes from.
+	 *
 	 * @param notesRef
 	 *            the ref to read notes from. Note, the default value of
-	 *            {@link Constants#R_NOTES_COMMITS} will be used if nothing is
-	 *            set
+	 *            {@link org.eclipse.jgit.lib.Constants#R_NOTES_COMMITS} will be
+	 *            used if nothing is set
 	 * @return {@code this}
-	 *
 	 * @see Constants#R_NOTES_COMMITS
 	 */
 	public ShowNoteCommand setNotesRef(String notesRef) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
index b56fb25..5f7928d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
@@ -42,6 +42,8 @@
  */
 package org.eclipse.jgit.api;
 
+import static org.eclipse.jgit.treewalk.TreeWalk.OperationType.CHECKOUT_OP;
+
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.HashSet;
@@ -86,7 +88,6 @@
  *
  * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-stash.html"
  *      >Git documentation about Stash</a>
- *
  * @since 2.0
  */
 public class StashApplyCommand extends GitCommand<ObjectId> {
@@ -107,6 +108,8 @@
 	 * Create command to apply the changes of a stashed commit
 	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository} to apply the stash
+	 *            to
 	 */
 	public StashApplyCommand(final Repository repo) {
 		super(repo);
@@ -119,6 +122,7 @@
 	 * unspecified
 	 *
 	 * @param stashRef
+	 *            name of the stash {@code Ref} to apply
 	 * @return {@code this}
 	 */
 	public StashApplyCommand setStashRef(final String stashRef) {
@@ -127,7 +131,10 @@
 	}
 
 	/**
+	 * Whether to ignore the repository state when applying the stash
+	 *
 	 * @param willIgnoreRepositoryState
+	 *            whether to ignore the repository state when applying the stash
 	 * @return {@code this}
 	 * @since 3.2
 	 */
@@ -152,14 +159,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Apply the changes in a stashed commit to the working directory and index
-	 *
-	 * @return id of stashed commit that was applied TODO: Does anyone depend on
-	 *         this, or could we make it more like Merge/CherryPick/Revert?
-	 * @throws GitAPIException
-	 * @throws WrongRepositoryStateException
-	 * @throws NoHeadException
-	 * @throws StashApplyFailureException
 	 */
 	@Override
 	public ObjectId call() throws GitAPIException,
@@ -271,6 +273,8 @@
 	}
 
 	/**
+	 * Whether to restore the index state
+	 *
 	 * @param applyIndex
 	 *            true (default) if the command should restore the index state
 	 */
@@ -279,6 +283,8 @@
 	}
 
 	/**
+	 * Set the <code>MergeStrategy</code> to use.
+	 *
 	 * @param strategy
 	 *            The merge strategy to use in order to merge during this
 	 *            command execution.
@@ -291,6 +297,8 @@
 	}
 
 	/**
+	 * Whether the command should restore untracked files
+	 *
 	 * @param applyUntracked
 	 *            true (default) if the command should restore untracked files
 	 * @since 3.4
@@ -355,7 +363,8 @@
 					// Not in commit, don't create untracked
 					continue;
 
-				final EolStreamType eolStreamType = walk.getEolStreamType();
+				final EolStreamType eolStreamType = walk
+						.getEolStreamType(CHECKOUT_OP);
 				final DirCacheEntry entry = new DirCacheEntry(walk.getRawPath());
 				entry.setFileMode(cIter.getEntryFileMode());
 				entry.setObjectIdFromRaw(cIter.idBuffer(), cIter.idOffset());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java
index 77a7fff..3495ff8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java
@@ -115,6 +115,7 @@
 	 * Create a command to stash changes in the working directory and index
 	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public StashCreateCommand(Repository repo) {
 		super(repo);
@@ -128,6 +129,7 @@
 	 * id, and short commit message when used.
 	 *
 	 * @param message
+	 *            the stash message
 	 * @return {@code this}
 	 */
 	public StashCreateCommand setIndexMessage(String message) {
@@ -142,6 +144,7 @@
 	 * id, and short commit message when used.
 	 *
 	 * @param message
+	 *            the working directory message
 	 * @return {@code this}
 	 */
 	public StashCreateCommand setWorkingDirectoryMessage(String message) {
@@ -153,6 +156,8 @@
 	 * Set the person to use as the author and committer in the commits made
 	 *
 	 * @param person
+	 *            the {@link org.eclipse.jgit.lib.PersonIdent} of the person who
+	 *            creates the stash.
 	 * @return {@code this}
 	 */
 	public StashCreateCommand setPerson(PersonIdent person) {
@@ -161,12 +166,13 @@
 	}
 
 	/**
-	 * Set the reference to update with the stashed commit id
-	 * If null, no reference is updated
+	 * Set the reference to update with the stashed commit id If null, no
+	 * reference is updated
 	 * <p>
-	 * This value defaults to {@link Constants#R_STASH}
+	 * This value defaults to {@link org.eclipse.jgit.lib.Constants#R_STASH}
 	 *
 	 * @param ref
+	 *            the name of the {@code Ref} to update
 	 * @return {@code this}
 	 */
 	public StashCreateCommand setRef(String ref) {
@@ -178,6 +184,7 @@
 	 * Whether to include untracked files in the stash.
 	 *
 	 * @param includeUntracked
+	 *            whether to include untracked files in the stash
 	 * @return {@code this}
 	 * @since 3.4
 	 */
@@ -232,11 +239,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Stash the contents on the working directory and index in separate commits
 	 * and reset to the current HEAD commit.
-	 *
-	 * @return stashed commit or null if no changes to stash
-	 * @throws GitAPIException
 	 */
 	@Override
 	public RevCommit call() throws GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java
index 85e7b3d..cd8f8e6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java
@@ -84,7 +84,10 @@
 	private boolean all;
 
 	/**
+	 * Constructor for StashDropCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public StashDropCommand(Repository repo) {
 		super(repo);
@@ -101,6 +104,7 @@
 	 * unspecified
 	 *
 	 * @param stashRef
+	 *            the 0-based index of the stash reference
 	 * @return {@code this}
 	 */
 	public StashDropCommand setStashRef(final int stashRef) {
@@ -112,11 +116,12 @@
 	}
 
 	/**
-	 * Set wheter drop all stashed commits
+	 * Set whether to drop all stashed commits
 	 *
 	 * @param all
-	 *            true to drop all stashed commits, false to drop only the
-	 *            stashed commit set via calling {@link #setStashRef(int)}
+	 *            {@code true} to drop all stashed commits, {@code false} to
+	 *            drop only the stashed commit set via calling
+	 *            {@link #setStashRef(int)}
 	 * @return {@code this}
 	 */
 	public StashDropCommand setAll(final boolean all) {
@@ -173,11 +178,10 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Drop the configured entry from the stash reflog and return value of the
 	 * stash reference after the drop occurs
-	 *
-	 * @return commit id of stash reference or null if no more stashed changes
-	 * @throws GitAPIException
 	 */
 	@Override
 	public ObjectId call() throws GitAPIException {
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 8420dd2..6451b70 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java
@@ -70,12 +70,13 @@
 	/**
 	 * Create a new stash list command
 	 *
-	 * @param repo
+	 * @param repo a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public StashListCommand(final Repository repo) {
 		super(repo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<RevCommit> call() throws GitAPIException,
 			InvalidRefNameException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/Status.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/Status.java
index 5b7c73b..909a745 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/Status.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/Status.java
@@ -70,7 +70,10 @@
 	private final boolean hasUncommittedChanges;
 
 	/**
+	 * Constructor for Status.
+	 *
 	 * @param diff
+	 *            the {@link org.eclipse.jgit.lib.IndexDiff} having the status
 	 */
 	public Status(IndexDiff diff) {
 		super();
@@ -86,16 +89,20 @@
 	}
 
 	/**
-	 * @return true if no differences exist between the working-tree, the index,
-	 *         and the current HEAD, false if differences do exist
+	 * Whether the status is clean
+	 *
+	 * @return {@code true} if no differences exist between the working-tree,
+	 *         the index, and the current HEAD, {@code false} if differences do
+	 *         exist
 	 */
 	public boolean isClean() {
 		return clean;
 	}
 
 	/**
-	 * @return true if any tracked file is changed
+	 * Whether there are uncommitted changes
 	 *
+	 * @return {@code true} if any tracked file is changed
 	 * @since 3.2
 	 */
 	public boolean hasUncommittedChanges() {
@@ -103,14 +110,18 @@
 	}
 
 	/**
+	 * Get files added to the index
+	 *
 	 * @return list of files added to the index, not in HEAD (e.g. what you get
-	 *         if you call 'git add ...' on a newly created file)
+	 *         if you call {@code git add ...} on a newly created file)
 	 */
 	public Set<String> getAdded() {
 		return Collections.unmodifiableSet(diff.getAdded());
 	}
 
 	/**
+	 * Get changed files from HEAD to index
+	 *
 	 * @return list of files changed from HEAD to index (e.g. what you get if
 	 *         you modify an existing file and call 'git add ...' on it)
 	 */
@@ -119,6 +130,8 @@
 	}
 
 	/**
+	 * Get removed files
+	 *
 	 * @return list of files removed from index, but in HEAD (e.g. what you get
 	 *         if you call 'git rm ...' on a existing file)
 	 */
@@ -127,6 +140,8 @@
 	}
 
 	/**
+	 * Get missing files
+	 *
 	 * @return list of files in index, but not filesystem (e.g. what you get if
 	 *         you call 'rm ...' on a existing file)
 	 */
@@ -135,6 +150,8 @@
 	}
 
 	/**
+	 * Get modified files relative to the index
+	 *
 	 * @return list of files modified on disk relative to the index (e.g. what
 	 *         you get if you modify an existing file without adding it to the
 	 *         index)
@@ -144,6 +161,8 @@
 	}
 
 	/**
+	 * Get untracked files
+	 *
 	 * @return list of files that are not ignored, and not in the index. (e.g.
 	 *         what you get if you create a new file without adding it to the
 	 *         index)
@@ -153,6 +172,8 @@
 	}
 
 	/**
+	 * Get untracked folders
+	 *
 	 * @return set of directories that are not ignored, and not in the index.
 	 */
 	public Set<String> getUntrackedFolders() {
@@ -160,6 +181,8 @@
 	}
 
 	/**
+	 * Get conflicting files
+	 *
 	 * @return list of files that are in conflict. (e.g what you get if you
 	 *         modify file that was modified by someone else in the meantime)
 	 */
@@ -168,7 +191,10 @@
 	}
 
 	/**
-	 * @return a map from conflicting path to its {@link StageState}.
+	 * Get StageState of conflicting files
+	 *
+	 * @return a map from conflicting path to its
+	 *         {@link org.eclipse.jgit.lib.IndexDiff.StageState}.
 	 * @since 3.0
 	 */
 	public Map<String, StageState> getConflictingStageState() {
@@ -176,6 +202,8 @@
 	}
 
 	/**
+	 * Get ignored files which are not in the index
+	 *
 	 * @return set of files and folders that are ignored and not in the index.
 	 */
 	public Set<String> getIgnoredNotInIndex() {
@@ -183,9 +211,11 @@
 	}
 
 	/**
+	 * Get uncommitted changes, i.e. all files changed in the index or working
+	 * tree
+	 *
 	 * @return set of files and folders that are known to the repo and changed
 	 *         either in the index or in the working tree.
-	 *
 	 * @since 3.2
 	 */
 	public Set<String> getUncommittedChanges() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java
index 8f7804a..98c5520 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java
@@ -64,9 +64,9 @@
  * 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()})
  *
- * @see <a
- *      href="http://www.kernel.org/pub/software/scm/git/docs/git-status.html"
- *      >Git documentation about Status</a>
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-status.html" >Git
+ *      documentation about Status</a>
  */
 public class StatusCommand extends GitCommand<Status> {
 	private WorkingTreeIterator workingTreeIt;
@@ -76,14 +76,21 @@
 	private IgnoreSubmoduleMode ignoreSubmoduleMode = null;
 
 	/**
+	 * Constructor for StatusCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected StatusCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * Whether to ignore submodules
+	 *
 	 * @param mode
+	 *            the
+	 *            {@link org.eclipse.jgit.submodule.SubmoduleWalk.IgnoreSubmoduleMode}
 	 * @return {@code this}
 	 * @since 3.6
 	 */
@@ -126,13 +133,12 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code Status} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command. Don't call
 	 * this method twice on an instance.
-	 *
-	 * @return a {@link Status} object telling about each path where working
-	 *         tree, index or HEAD differ from each other.
 	 */
 	@Override
 	public Status call() throws GitAPIException, NoWorkTreeException {
@@ -157,8 +163,9 @@
 	}
 
 	/**
-	 * To set the {@link WorkingTreeIterator} which should be used. If this
-	 * method is not called a standard {@link FileTreeIterator} is used.
+	 * To set the {@link org.eclipse.jgit.treewalk.WorkingTreeIterator} which
+	 * should be used. If this method is not called a standard
+	 * {@link org.eclipse.jgit.treewalk.FileTreeIterator} is used.
 	 *
 	 * @param workingTreeIt
 	 *            a working tree iterator
@@ -170,10 +177,11 @@
 	}
 
 	/**
-	 * To set the {@link ProgressMonitor} which contains callback methods to
-	 * inform you about the progress of this command.
+	 * To set the {@link org.eclipse.jgit.lib.ProgressMonitor} which contains
+	 * callback methods to inform you about the progress of this command.
 	 *
 	 * @param progressMonitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor} object.
 	 * @return {@code this}
 	 * @since 3.1
 	 */
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 e3ba894..81ea350 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java
@@ -70,8 +70,8 @@
  * .gitmodules file and the repository config file, and also add the submodule
  * and .gitmodules file to the index.
  *
- * @see <a
- *      href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
  *      >Git documentation about submodules</a>
  */
 public class SubmoduleAddCommand extends
@@ -84,7 +84,10 @@
 	private ProgressMonitor monitor;
 
 	/**
+	 * Constructor for SubmoduleAddCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public SubmoduleAddCommand(final Repository repo) {
 		super(repo);
@@ -106,6 +109,7 @@
 	 * Set URI to clone submodule from
 	 *
 	 * @param uri
+	 *            a {@link java.lang.String} object.
 	 * @return this command
 	 */
 	public SubmoduleAddCommand setURI(final String uri) {
@@ -119,6 +123,7 @@
 	 *
 	 * @see NullProgressMonitor
 	 * @param monitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor} object.
 	 * @return this command
 	 */
 	public SubmoduleAddCommand setProgressMonitor(final ProgressMonitor monitor) {
@@ -130,7 +135,7 @@
 	 * Is the configured already a submodule in the index?
 	 *
 	 * @return true if submodule exists in index, false otherwise
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected boolean submoduleExists() throws IOException {
 		TreeFilter filter = PathFilter.create(path);
@@ -140,15 +145,14 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code SubmoduleAddCommand}
 	 *
 	 * The {@code Repository} instance returned by this command needs to be
 	 * closed by the caller to free resources held by the {@code Repository}
 	 * instance. It is recommended to call this method as soon as you don't need
 	 * a reference to this {@code Repository} instance anymore.
-	 *
-	 * @return the newly created {@link Repository}
-	 * @throws GitAPIException
 	 */
 	@Override
 	public Repository call() throws GitAPIException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java
new file mode 100644
index 0000000..569a8e3
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitCommand.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2017, Two Sigma Open Source
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.api;
+
+import static org.eclipse.jgit.util.FileUtils.RECURSIVE;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.lib.ConfigConstants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.submodule.SubmoduleWalk;
+import org.eclipse.jgit.treewalk.filter.PathFilter;
+import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
+import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.eclipse.jgit.util.FileUtils;
+
+/**
+ * A class used to execute a submodule deinit command.
+ * <p>
+ * This will remove the module(s) from the working tree, but won't affect
+ * .git/modules.
+ *
+ * @since 4.10
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
+ *      >Git documentation about submodules</a>
+ */
+public class SubmoduleDeinitCommand
+		extends GitCommand<Collection<SubmoduleDeinitResult>> {
+
+	private final Collection<String> paths;
+
+	private boolean force;
+
+	/**
+	 * Constructor of SubmoduleDeinitCommand
+	 *
+	 * @param repo
+	 */
+	public SubmoduleDeinitCommand(Repository repo) {
+		super(repo);
+		paths = new ArrayList<>();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 *
+	 * @return the set of repositories successfully deinitialized.
+	 * @throws NoSuchSubmoduleException
+	 *             if any of the submodules which we might want to deinitialize
+	 *             don't exist
+	 */
+	@Override
+	public Collection<SubmoduleDeinitResult> call() throws GitAPIException {
+		checkCallable();
+		try {
+			if (paths.isEmpty()) {
+				return Collections.emptyList();
+			}
+			for (String path : paths) {
+				if (!submoduleExists(path)) {
+					throw new NoSuchSubmoduleException(path);
+				}
+			}
+			List<SubmoduleDeinitResult> results = new ArrayList<>(paths.size());
+			try (RevWalk revWalk = new RevWalk(repo);
+					SubmoduleWalk generator = SubmoduleWalk.forIndex(repo)) {
+				generator.setFilter(PathFilterGroup.createFromStrings(paths));
+				StoredConfig config = repo.getConfig();
+				while (generator.next()) {
+					String path = generator.getPath();
+					String name = generator.getModuleName();
+					SubmoduleDeinitStatus status = checkDirty(revWalk, path);
+					switch (status) {
+					case SUCCESS:
+						deinit(path);
+						break;
+					case ALREADY_DEINITIALIZED:
+						break;
+					case DIRTY:
+						if (force) {
+							deinit(path);
+							status = SubmoduleDeinitStatus.FORCED;
+						}
+						break;
+					default:
+						throw new JGitInternalException(MessageFormat.format(
+								JGitText.get().unexpectedSubmoduleStatus,
+								status));
+					}
+
+					config.unsetSection(
+							ConfigConstants.CONFIG_SUBMODULE_SECTION, name);
+					results.add(new SubmoduleDeinitResult(path, status));
+				}
+			}
+			return results;
+		} catch (IOException e) {
+			throw new JGitInternalException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Recursively delete the *contents* of path, but leave path as an empty
+	 * directory
+	 *
+	 * @param path
+	 *            the path to clean
+	 * @throws IOException
+	 */
+	private void deinit(String path) throws IOException {
+		File dir = new File(repo.getWorkTree(), path);
+		if (!dir.isDirectory()) {
+			throw new JGitInternalException(MessageFormat.format(
+					JGitText.get().expectedDirectoryNotSubmodule, path));
+		}
+		final File[] ls = dir.listFiles();
+		if (ls != null) {
+			for (int i = 0; i < ls.length; i++) {
+				FileUtils.delete(ls[i], RECURSIVE);
+			}
+		}
+	}
+
+	/**
+	 * Check if a submodule is dirty. A submodule is dirty if there are local
+	 * changes to the submodule relative to its HEAD, including untracked files.
+	 * It is also dirty if the HEAD of the submodule does not match the value in
+	 * the parent repo's index or HEAD.
+	 *
+	 * @param revWalk
+	 * @param path
+	 * @return status of the command
+	 * @throws GitAPIException
+	 * @throws IOException
+	 */
+	private SubmoduleDeinitStatus checkDirty(RevWalk revWalk, String path)
+			throws GitAPIException, IOException {
+		Ref head = repo.exactRef("HEAD"); //$NON-NLS-1$
+		if (head == null) {
+			throw new NoHeadException(
+					JGitText.get().invalidRepositoryStateNoHead);
+		}
+		RevCommit headCommit = revWalk.parseCommit(head.getObjectId());
+		RevTree tree = headCommit.getTree();
+
+		ObjectId submoduleHead;
+		try (SubmoduleWalk w = SubmoduleWalk.forPath(repo, tree, path)) {
+			submoduleHead = w.getHead();
+			if (submoduleHead == null) {
+				// The submodule is not checked out.
+				return SubmoduleDeinitStatus.ALREADY_DEINITIALIZED;
+			}
+			if (!submoduleHead.equals(w.getObjectId())) {
+				// The submodule's current HEAD doesn't match the value in the
+				// outer repo's HEAD.
+				return SubmoduleDeinitStatus.DIRTY;
+			}
+		}
+
+		try (SubmoduleWalk w = SubmoduleWalk.forIndex(repo)) {
+			if (!w.next()) {
+				// The submodule does not exist in the index (shouldn't happen
+				// since we check this earlier)
+				return SubmoduleDeinitStatus.DIRTY;
+			}
+			if (!submoduleHead.equals(w.getObjectId())) {
+				// The submodule's current HEAD doesn't match the value in the
+				// outer repo's index.
+				return SubmoduleDeinitStatus.DIRTY;
+			}
+
+			Repository submoduleRepo = w.getRepository();
+
+			Status status = Git.wrap(submoduleRepo).status().call();
+			return status.isClean() ? SubmoduleDeinitStatus.SUCCESS
+					: SubmoduleDeinitStatus.DIRTY;
+		}
+	}
+
+	/**
+	 * Check if this path is a submodule by checking the index, which is what
+	 * git submodule deinit checks.
+	 *
+	 * @param path
+	 *            path of the submodule
+	 *
+	 * @return {@code true} if path exists and is a submodule in index,
+	 *         {@code false} otherwise
+	 * @throws IOException
+	 */
+	private boolean submoduleExists(String path) throws IOException {
+		TreeFilter filter = PathFilter.create(path);
+		try (SubmoduleWalk w = SubmoduleWalk.forIndex(repo)) {
+			return w.setFilter(filter).next();
+		}
+	}
+
+	/**
+	 * Add repository-relative submodule path to deinitialize
+	 *
+	 * @param path
+	 *            (with <code>/</code> as separator)
+	 * @return this command
+	 */
+	public SubmoduleDeinitCommand addPath(String path) {
+		paths.add(path);
+		return this;
+	}
+
+	/**
+	 * If {@code true}, call() will deinitialize modules with local changes;
+	 * else it will refuse to do so.
+	 *
+	 * @param force
+	 * @return {@code this}
+	 */
+	public SubmoduleDeinitCommand setForce(boolean force) {
+		this.force = force;
+		return this;
+	}
+
+	/**
+	 * The user tried to deinitialize a submodule that doesn't exist in the
+	 * index.
+	 */
+	public static class NoSuchSubmoduleException extends GitAPIException {
+		private static final long serialVersionUID = 1L;
+
+		/**
+		 * Constructor of NoSuchSubmoduleException
+		 *
+		 * @param path
+		 *            path of non-existing submodule
+		 */
+		public NoSuchSubmoduleException(String path) {
+			super(MessageFormat.format(JGitText.get().noSuchSubmodule, path));
+		}
+	}
+
+	/**
+	 * The effect of a submodule deinit command for a given path
+	 */
+	public enum SubmoduleDeinitStatus {
+		/**
+		 * The submodule was not initialized in the first place
+		 */
+		ALREADY_DEINITIALIZED,
+		/**
+		 * The submodule was deinitialized
+		 */
+		SUCCESS,
+		/**
+		 * The submodule had local changes, but was deinitialized successfully
+		 */
+		FORCED,
+		/**
+		 * The submodule had local changes and force was false
+		 */
+		DIRTY,
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java
new file mode 100644
index 0000000..5a9cbc1
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleDeinitResult.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2017, Two Sigma Open Source
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.api;
+
+/**
+ * The result of a submodule deinit command for a particular path
+ *
+ * @since 4.10
+ */
+public class SubmoduleDeinitResult {
+	private String path;
+
+	private SubmoduleDeinitCommand.SubmoduleDeinitStatus status;
+
+	/**
+	 * Constructor for SubmoduleDeinitResult
+	 *
+	 * @param path
+	 *            path of the submodule
+	 * @param status
+	 */
+	public SubmoduleDeinitResult(String path,
+			SubmoduleDeinitCommand.SubmoduleDeinitStatus status) {
+		this.path = path;
+		this.status = status;
+	}
+
+	/**
+	 * Get the path of the submodule
+	 *
+	 * @return path of the submodule
+	 */
+	public String getPath() {
+		return path;
+	}
+
+	/**
+	 * Set the path of the submodule
+	 *
+	 * @param path
+	 *            path of the submodule
+	 */
+	public void setPath(String path) {
+		this.path = path;
+	}
+
+	/**
+	 * Get the status of the command
+	 *
+	 * @return the status of the command
+	 */
+	public SubmoduleDeinitCommand.SubmoduleDeinitStatus getStatus() {
+		return status;
+	}
+
+	/**
+	 * Set the status of the command
+	 *
+	 * @param status
+	 *            the status of the command
+	 */
+	public void setStatus(SubmoduleDeinitCommand.SubmoduleDeinitStatus status) {
+		this.status = 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 4c5e317..6af27d7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleInitCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleInitCommand.java
@@ -63,8 +63,8 @@
  * .gitmodules file to a repository's config file for each submodule not
  * currently present in the repository's config file.
  *
- * @see <a
- *      href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
  *      >Git documentation about submodules</a>
  */
 public class SubmoduleInitCommand extends GitCommand<Collection<String>> {
@@ -72,7 +72,10 @@
 	private final Collection<String> paths;
 
 	/**
+	 * Constructor for SubmoduleInitCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public SubmoduleInitCommand(final Repository repo) {
 		super(repo);
@@ -91,6 +94,7 @@
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<String> call() throws GitAPIException {
 		checkCallable();
@@ -106,16 +110,17 @@
 					continue;
 
 				String path = generator.getPath();
+				String name = generator.getModuleName();
 				// Copy 'url' and 'update' fields from .gitmodules to config
 				// file
 				String url = generator.getRemoteUrl();
 				String update = generator.getModulesUpdate();
 				if (url != null)
 					config.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-							path, ConfigConstants.CONFIG_KEY_URL, url);
+							name, ConfigConstants.CONFIG_KEY_URL, url);
 				if (update != null)
 					config.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-							path, ConfigConstants.CONFIG_KEY_UPDATE, update);
+							name, ConfigConstants.CONFIG_KEY_UPDATE, update);
 				if (url != null || update != null)
 					initialized.add(path);
 			}
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 8b27e4c..97ae668 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleStatusCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleStatusCommand.java
@@ -62,8 +62,8 @@
 /**
  * A class used to execute a submodule status command.
  *
- * @see <a
- *      href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
  *      >Git documentation about submodules</a>
  */
 public class SubmoduleStatusCommand extends
@@ -72,7 +72,10 @@
 	private final Collection<String> paths;
 
 	/**
+	 * Constructor for SubmoduleStatusCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public SubmoduleStatusCommand(final Repository repo) {
 		super(repo);
@@ -91,6 +94,7 @@
 		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 b5c0b15..d22d820 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleSyncCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleSyncCommand.java
@@ -65,8 +65,8 @@
  * This will set the remote URL in a submodule's repository to the current value
  * in the .gitmodules file.
  *
- * @see <a
- *      href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
+ * @see <a href=
+ *      "http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"
  *      >Git documentation about submodules</a>
  */
 public class SubmoduleSyncCommand extends GitCommand<Map<String, String>> {
@@ -74,7 +74,10 @@
 	private final Collection<String> paths;
 
 	/**
+	 * Constructor for SubmoduleSyncCommand.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public SubmoduleSyncCommand(final Repository repo) {
 		super(repo);
@@ -97,8 +100,9 @@
 	 * Get branch that HEAD currently points to
 	 *
 	 * @param subRepo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @return shortened branch name, null on failures
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected String getHeadBranch(final Repository subRepo) throws IOException {
 		Ref head = subRepo.exactRef(Constants.HEAD);
@@ -108,6 +112,7 @@
 			return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Map<String, String> call() throws GitAPIException {
 		checkCallable();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java
index 4faaac2..4b4e18c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java
@@ -96,7 +96,12 @@
 	private boolean fetch = false;
 
 	/**
+	 * <p>
+	 * Constructor for SubmoduleUpdateCommand.
+	 * </p>
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public SubmoduleUpdateCommand(final Repository repo) {
 		super(repo);
@@ -109,6 +114,7 @@
 	 *
 	 * @see NullProgressMonitor
 	 * @param monitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor} object.
 	 * @return this command
 	 */
 	public SubmoduleUpdateCommand setProgressMonitor(
@@ -122,6 +128,7 @@
 	 * is set to <code>false</code>
 	 *
 	 * @param fetch
+	 *            whether to fetch the submodules before we update them
 	 * @return this command
 	 * @since 4.9
 	 */
@@ -143,18 +150,9 @@
 	}
 
 	/**
-	 * Execute the SubmoduleUpdateCommand command.
+	 * {@inheritDoc}
 	 *
-	 * @return a collection of updated submodule paths
-	 * @throws ConcurrentRefUpdateException
-	 * @throws CheckoutConflictException
-	 * @throws InvalidMergeHeadsException
-	 * @throws InvalidConfigurationException
-	 * @throws NoHeadException
-	 * @throws NoMessageException
-	 * @throws RefNotFoundException
-	 * @throws WrongRepositoryStateException
-	 * @throws GitAPIException
+	 * Execute the SubmoduleUpdateCommand command.
 	 */
 	@Override
 	public Collection<String> call() throws InvalidConfigurationException,
@@ -252,6 +250,8 @@
 	}
 
 	/**
+	 * Setter for the field <code>strategy</code>.
+	 *
 	 * @param strategy
 	 *            The merge strategy to use during this update operation.
 	 * @return {@code this}
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 bdbb862..c29b753 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/TagCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/TagCommand.java
@@ -68,7 +68,7 @@
 /**
  * Create/update an annotated tag object or a simple unannotated tag
  * <p>
- * Examples (<code>git</code> is a {@link Git} instance):
+ * Examples (<code>git</code> is a {@link org.eclipse.jgit.api.Git} instance):
  * <p>
  * Create a new tag for the current commit:
  *
@@ -104,21 +104,22 @@
 	private boolean annotated = true;
 
 	/**
-	 * @param repo
+	 * <p>Constructor for TagCommand.</p>
+	 *
+	 * @param repo a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected TagCommand(Repository repo) {
 		super(repo);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Executes the {@code tag} command with all the options and parameters
 	 * collected by the setter methods of this class. Each instance of this
 	 * class should only be used for one invocation of the command (means: one
 	 * call to {@link #call()})
 	 *
-	 * @return a {@link Ref} a ref pointing to a tag
-	 * @throws NoHeadException
-	 *             when called on a git repo without a HEAD reference
 	 * @since 2.0
 	 */
 	@Override
@@ -226,6 +227,8 @@
 	}
 
 	/**
+	 * Set the tag <code>name</code>.
+	 *
 	 * @param name
 	 *            the tag name used for the {@code tag}
 	 * @return {@code this}
@@ -237,6 +240,8 @@
 	}
 
 	/**
+	 * Get the tag <code>name</code>.
+	 *
 	 * @return the tag name used for the <code>tag</code>
 	 */
 	public String getName() {
@@ -244,6 +249,8 @@
 	}
 
 	/**
+	 * Get the tag <code>message</code>.
+	 *
 	 * @return the tag message used for the <code>tag</code>
 	 */
 	public String getMessage() {
@@ -251,6 +258,8 @@
 	}
 
 	/**
+	 * Set the tag <code>message</code>.
+	 *
 	 * @param message
 	 *            the tag message used for the {@code tag}
 	 * @return {@code this}
@@ -262,6 +271,8 @@
 	}
 
 	/**
+	 * Whether this tag is signed
+	 *
 	 * @return whether the tag is signed
 	 */
 	public boolean isSigned() {
@@ -273,6 +284,7 @@
 	 * corresponds to the parameter -s on the command line.
 	 *
 	 * @param signed
+	 *            a boolean.
 	 * @return {@code this}
 	 */
 	public TagCommand setSigned(boolean signed) {
@@ -285,6 +297,7 @@
 	 * created from the info in the repository.
 	 *
 	 * @param tagger
+	 *            a {@link org.eclipse.jgit.lib.PersonIdent} object.
 	 * @return {@code this}
 	 */
 	public TagCommand setTagger(PersonIdent tagger) {
@@ -293,6 +306,8 @@
 	}
 
 	/**
+	 * Get the <code>tagger</code> who created the tag.
+	 *
 	 * @return the tagger of the tag
 	 */
 	public PersonIdent getTagger() {
@@ -300,6 +315,8 @@
 	}
 
 	/**
+	 * Get the tag's object id
+	 *
 	 * @return the object id of the tag
 	 */
 	public RevObject getObjectId() {
@@ -311,6 +328,7 @@
 	 * pointed to from HEAD will be used.
 	 *
 	 * @param id
+	 *            a {@link org.eclipse.jgit.revwalk.RevObject} object.
 	 * @return {@code this}
 	 */
 	public TagCommand setObjectId(RevObject id) {
@@ -319,6 +337,8 @@
 	}
 
 	/**
+	 * Whether this is a forced update
+	 *
 	 * @return is this a force update
 	 */
 	public boolean isForceUpdate() {
@@ -330,6 +350,7 @@
 	 * corresponds to the parameter -f on the command line.
 	 *
 	 * @param forceUpdate
+	 *            whether this is a forced update
 	 * @return {@code this}
 	 */
 	public TagCommand setForceUpdate(boolean forceUpdate) {
@@ -338,7 +359,10 @@
 	}
 
 	/**
+	 * Configure this tag to be created as an annotated tag
+	 *
 	 * @param annotated
+	 *            whether this shall be an annotated tag
 	 * @return {@code this}
 	 * @since 3.0
 	 */
@@ -348,6 +372,8 @@
 	}
 
 	/**
+	 * Whether this will create an annotated command
+	 *
 	 * @return true if this command will create an annotated tag (default is
 	 *         true)
 	 * @since 3.0
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 1541df5..9c91537 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportCommand.java
@@ -47,11 +47,12 @@
 import org.eclipse.jgit.transport.Transport;
 
 /**
- * Base class for commands that use a {@link Transport} during execution.
+ * Base class for commands that use a
+ * {@link org.eclipse.jgit.transport.Transport} during execution.
  * <p>
  * This class provides standard configuration of a transport for options such as
- * a {@link CredentialsProvider}, a timeout, and a
- * {@link TransportConfigCallback}.
+ * a {@link org.eclipse.jgit.transport.CredentialsProvider}, a timeout, and a
+ * {@link org.eclipse.jgit.api.TransportConfigCallback}.
  *
  * @param <C>
  * @param <T>
@@ -75,7 +76,9 @@
 	protected TransportConfigCallback transportConfigCallback;
 
 	/**
-	 * @param repo
+	 * <p>Constructor for TransportCommand.</p>
+	 *
+	 * @param repo a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected TransportCommand(final Repository repo) {
 		super(repo);
@@ -83,8 +86,11 @@
 	}
 
 	/**
+	 * Set the <code>credentialsProvider</code>.
+	 *
 	 * @param credentialsProvider
-	 *            the {@link CredentialsProvider} to use
+	 *            the {@link org.eclipse.jgit.transport.CredentialsProvider} to
+	 *            use
 	 * @return {@code this}
 	 */
 	public C setCredentialsProvider(
@@ -94,6 +100,8 @@
 	}
 
 	/**
+	 * Set <code>timeout</code>.
+	 *
 	 * @param timeout
 	 *            the timeout (in seconds) used for the transport step
 	 * @return {@code this}
@@ -104,12 +112,15 @@
 	}
 
 	/**
+	 * Set the <code>TransportConfigCallback</code>.
+	 *
 	 * @param transportConfigCallback
 	 *            if set, the callback will be invoked after the
-	 *            {@link Transport} has created, but before the
-	 *            {@link Transport} is used. The callback can use this
-	 *            opportunity to set additional type-specific configuration on
-	 *            the {@link Transport} instance.
+	 *            {@link org.eclipse.jgit.transport.Transport} has created, but
+	 *            before the {@link org.eclipse.jgit.transport.Transport} is
+	 *            used. The callback can use this opportunity to set additional
+	 *            type-specific configuration on the
+	 *            {@link org.eclipse.jgit.transport.Transport} instance.
 	 * @return {@code this}
 	 */
 	public C setTransportConfigCallback(
@@ -118,7 +129,11 @@
 		return self();
 	}
 
-	/** @return {@code this} */
+	/**
+	 * Return this command cast to {@code C}
+	 *
+	 * @return {@code this} cast to {@code C}
+	 */
 	@SuppressWarnings("unchecked")
 	protected final C self() {
 		return (C) this;
@@ -129,6 +144,7 @@
 	 * callback
 	 *
 	 * @param transport
+	 *            a {@link org.eclipse.jgit.transport.Transport} object.
 	 * @return {@code this}
 	 */
 	protected C configure(final Transport transport) {
@@ -145,6 +161,7 @@
 	 * {@code this} command
 	 *
 	 * @param childCommand
+	 *            a {@link org.eclipse.jgit.api.TransportCommand} object.
 	 * @return {@code this}
 	 */
 	protected C configure(final TransportCommand childCommand) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportConfigCallback.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportConfigCallback.java
index 4faadba..f60926c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportConfigCallback.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/TransportConfigCallback.java
@@ -64,7 +64,9 @@
 
 	/**
 	 * Add any additional transport-specific configuration required.
+	 *
 	 * @param transport
+	 *            a {@link org.eclipse.jgit.transport.Transport} object.
 	 */
 	public void configure(Transport transport);
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/AbortedByHookException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/AbortedByHookException.java
index 995611e..db6440b 100755
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/AbortedByHookException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/AbortedByHookException.java
@@ -67,6 +67,8 @@
 	private final int returnCode;
 
 	/**
+	 * Constructor for AbortedByHookException
+	 *
 	 * @param message
 	 *            The error details.
 	 * @param hookName
@@ -83,6 +85,8 @@
 	}
 
 	/**
+	 * Get hook name
+	 *
 	 * @return the type of the hook that interrupted the git command.
 	 */
 	public String getHookName() {
@@ -90,12 +94,15 @@
 	}
 
 	/**
+	 * Get return code
+	 *
 	 * @return the hook process result.
 	 */
 	public int getReturnCode() {
 		return returnCode;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getMessage() {
 		return MessageFormat.format(JGitText.get().commandRejectedByHook,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CanceledException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CanceledException.java
index 3ad2597..5f831e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CanceledException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CanceledException.java
@@ -45,7 +45,9 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * @param message
+	 * <p>Constructor for CanceledException.</p>
+	 *
+	 * @param message a {@link java.lang.String} object.
 	 */
 	public CanceledException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CannotDeleteCurrentBranchException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CannotDeleteCurrentBranchException.java
index 76d7732..65e05a1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CannotDeleteCurrentBranchException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/CannotDeleteCurrentBranchException.java
@@ -44,8 +44,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for CannotDeleteCurrentBranchException
+	 *
 	 * @param message
-	 *            the message
+	 *            error message
 	 */
 	public CannotDeleteCurrentBranchException(String message) {
 		super(message);
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 7df35c9..3b71373 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
@@ -53,7 +53,6 @@
 	 *
 	 * @param conflictingPaths
 	 *            list of conflicting paths
-	 *
 	 * @param e
 	 *            a {@link org.eclipse.jgit.errors.CheckoutConflictException}
 	 *            exception
@@ -82,7 +81,11 @@
 		this.conflictingPaths = conflictingPaths;
 	}
 
-	/** @return all the paths where unresolved conflicts have been detected */
+	/**
+	 * Get conflicting paths
+	 *
+	 * @return all the paths where unresolved conflicts have been detected
+	 */
 	public List<String> getConflictingPaths() {
 		return conflictingPaths;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/ConcurrentRefUpdateException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/ConcurrentRefUpdateException.java
index b5e87f1..514d65e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/ConcurrentRefUpdateException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/ConcurrentRefUpdateException.java
@@ -55,10 +55,16 @@
 	private Ref ref;
 
 	/**
+	 * Constructor for ConcurrentRefUpdateException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param ref
+	 *            a {@link org.eclipse.jgit.lib.Ref}
 	 * @param rc
+	 *            a {@link org.eclipse.jgit.lib.RefUpdate.Result}
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public ConcurrentRefUpdateException(String message, Ref ref,
 			RefUpdate.Result rc, Throwable cause) {
@@ -69,9 +75,14 @@
 	}
 
 	/**
+	 * Constructor for ConcurrentRefUpdateException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param ref
+	 *            a {@link org.eclipse.jgit.lib.Ref}
 	 * @param rc
+	 *            a {@link org.eclipse.jgit.lib.RefUpdate.Result}
 	 */
 	public ConcurrentRefUpdateException(String message, Ref ref,
 			RefUpdate.Result rc) {
@@ -82,15 +93,21 @@
 	}
 
 	/**
-	 * @return the {@link Ref} which was tried to by updated
+	 * Get <code>Ref</code>
+	 *
+	 * @return the {@link org.eclipse.jgit.lib.Ref} which was tried to by
+	 *         updated
 	 */
 	public Ref getRef() {
 		return ref;
 	}
 
 	/**
-	 * @return the result which was returned by {@link RefUpdate#update()} and
-	 *         which caused this error
+	 * Get result
+	 *
+	 * @return the result which was returned by
+	 *         {@link org.eclipse.jgit.lib.RefUpdate#update()} and which caused
+	 *         this error
 	 */
 	public RefUpdate.Result getResult() {
 		return rc;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/DetachedHeadException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/DetachedHeadException.java
index 01b1f31..30b5853 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/DetachedHeadException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/DetachedHeadException.java
@@ -55,15 +55,22 @@
 	}
 
 	/**
+	 * Constructor for DetachedHeadException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable} object.
 	 */
 	public DetachedHeadException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for DetachedHeadException.
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public DetachedHeadException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/EmtpyCommitException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/EmtpyCommitException.java
index b3cc1bf..ea0e718 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/EmtpyCommitException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/EmtpyCommitException.java
@@ -42,19 +42,26 @@
  *
  * @since 4.2
  */
-public class EmtpyCommitException extends GitAPIException {
+public class EmtpyCommitException extends GitAPIException { // TODO: Correct spelling of this class name in 5.0
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for EmtpyCommitException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public EmtpyCommitException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for EmtpyCommitException.
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public EmtpyCommitException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/FilterFailedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/FilterFailedException.java
index fbc30ef..f07e79f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/FilterFailedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/FilterFailedException.java
@@ -106,6 +106,8 @@
 	}
 
 	/**
+	 * Get filter command
+	 *
 	 * @return the filterCommand
 	 */
 	public String getFilterCommand() {
@@ -113,6 +115,8 @@
 	}
 
 	/**
+	 * Get path
+	 *
 	 * @return the path of the file processed by the filter command
 	 */
 	public String getPath() {
@@ -120,6 +124,8 @@
 	}
 
 	/**
+	 * Get output
+	 *
 	 * @return the output generated by the filter command. Might be truncated to
 	 *         limit memory consumption.
 	 */
@@ -128,6 +134,8 @@
 	}
 
 	/**
+	 * Get error
+	 *
 	 * @return the error output returned by the filter command
 	 */
 	public String getError() {
@@ -135,6 +143,8 @@
 	}
 
 	/**
+	 * Get return code
+	 *
 	 * @return the return code returned by the filter command
 	 */
 	public int getReturnCode() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/GitAPIException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/GitAPIException.java
index b251c7d..a2d6996 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/GitAPIException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/GitAPIException.java
@@ -40,7 +40,6 @@
 /**
  * Superclass of all exceptions thrown by the API classes in
  * {@code org.eclipse.jgit.api}
- *
  */
 public abstract class GitAPIException extends Exception {
 	private static final long serialVersionUID = 1L;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidConfigurationException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidConfigurationException.java
index cb89e46..e99bfb1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidConfigurationException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidConfigurationException.java
@@ -45,15 +45,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for InvalidConfigurationException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public InvalidConfigurationException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for InvalidConfigurationException.
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public InvalidConfigurationException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidMergeHeadsException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidMergeHeadsException.java
index c8edb57..9fbdce5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidMergeHeadsException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidMergeHeadsException.java
@@ -47,7 +47,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for InvalidMergeHeadsException.
+	 *
 	 * @param msg
+	 *            error message
 	 */
 	public InvalidMergeHeadsException(String msg) {
 		super(msg);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRebaseStepException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRebaseStepException.java
index ef89a98..1f03286 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRebaseStepException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRebaseStepException.java
@@ -45,16 +45,24 @@
  */
 public class InvalidRebaseStepException extends GitAPIException {
 	private static final long serialVersionUID = 1L;
+
 	/**
+	 * Constructor for InvalidRebaseStepException.
+	 *
 	 * @param msg
+	 *            error message
 	 */
 	public InvalidRebaseStepException(String msg) {
 		super(msg);
 	}
 
 	/**
+	 * Constructor for InvalidRebaseStepException.
+	 *
 	 * @param msg
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public InvalidRebaseStepException(String msg, Throwable cause) {
 		super(msg, cause);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRefNameException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRefNameException.java
index 287713c..552c148 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRefNameException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRefNameException.java
@@ -44,15 +44,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for InvalidRefNameException
+	 *
 	 * @param msg
+	 *            error message
 	 */
 	public InvalidRefNameException(String msg) {
 		super(msg);
 	}
 
 	/**
+	 * Constructor for InvalidRefNameException.
+	 *
 	 * @param msg
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public InvalidRefNameException(String msg, Throwable cause) {
 		super(msg, cause);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRemoteException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRemoteException.java
index 3f059b7..4db5022 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRemoteException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidRemoteException.java
@@ -44,15 +44,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * @param msg message describing the invalid remote.
+	 * Constructor for InvalidRemoteException
+	 *
+	 * @param msg
+	 *            message describing the invalid remote.
 	 */
 	public InvalidRemoteException(String msg) {
 		super(msg);
 	}
 
 	/**
-	 * @param msg message describing the invalid remote.
-	 * @param cause why the remote is invalid.
+	 * Constructor for InvalidRemoteException
+	 *
+	 * @param msg
+	 *            message describing the invalid remote.
+	 * @param cause
+	 *            why the remote is invalid.
 	 */
 	public InvalidRemoteException(String msg, Throwable cause) {
 		super(msg, cause);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidTagNameException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidTagNameException.java
index 1779c45..72ba0c3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidTagNameException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/InvalidTagNameException.java
@@ -45,7 +45,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for InvalidTagNameException.
+	 *
 	 * @param msg
+	 *            error message
 	 */
 	public InvalidTagNameException(String msg) {
 		super(msg);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/JGitInternalException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/JGitInternalException.java
index ca56200..57d8a13 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/JGitInternalException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/JGitInternalException.java
@@ -63,7 +63,9 @@
 	 * Construct an exception for low-level internal exceptions
 	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public JGitInternalException(String message, Throwable cause) {
 		super(message, cause);
@@ -73,6 +75,7 @@
 	 * Construct an exception for low-level internal exceptions
 	 *
 	 * @param message
+	 *            error message
 	 */
 	public JGitInternalException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/MultipleParentsNotAllowedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/MultipleParentsNotAllowedException.java
index c71cc04..5067272 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/MultipleParentsNotAllowedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/MultipleParentsNotAllowedException.java
@@ -49,15 +49,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for MultipleParentsNotAllowedException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public MultipleParentsNotAllowedException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for MultipleParentsNotAllowedException.
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public MultipleParentsNotAllowedException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoFilepatternException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoFilepatternException.java
index 1130c25..893bf65 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoFilepatternException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoFilepatternException.java
@@ -48,15 +48,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for NoFilepatternException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public NoFilepatternException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for NoFilepatternException.
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public NoFilepatternException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoHeadException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoHeadException.java
index 50c4dc9..43dbc41 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoHeadException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoHeadException.java
@@ -45,15 +45,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for NoHeadException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public NoHeadException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for NoHeadException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public NoHeadException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoMessageException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoMessageException.java
index b7d8dc8..fa6e791 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoMessageException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/NoMessageException.java
@@ -47,15 +47,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for NoMessageException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public NoMessageException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for NoMessageException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public NoMessageException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchApplyException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchApplyException.java
index 4329860..6957dca 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchApplyException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchApplyException.java
@@ -46,21 +46,27 @@
  * Exception thrown when applying a patch fails
  *
  * @since 2.0
- *
  */
 public class PatchApplyException extends GitAPIException {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for PatchApplyException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public PatchApplyException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for PatchApplyException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public PatchApplyException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchFormatException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchFormatException.java
index 02ab423..e10b8b4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchFormatException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/PatchFormatException.java
@@ -52,7 +52,6 @@
  * Exception thrown when applying a patch fails due to an invalid format
  *
  * @since 2.0
- *
  */
 public class PatchFormatException extends GitAPIException {
 	private static final long serialVersionUID = 1L;
@@ -60,7 +59,10 @@
 	private List<FormatError> errors;
 
 	/**
+	 * Constructor for PatchFormatException
+	 *
 	 * @param errors
+	 *            a {@link java.util.List} of {@link FormatError}s
 	 */
 	public PatchFormatException(List<FormatError> errors) {
 		super(MessageFormat.format(JGitText.get().patchFormatException, errors));
@@ -68,6 +70,8 @@
 	}
 
 	/**
+	 * Get list of errors
+	 *
 	 * @return all the errors where unresolved conflicts have been detected
 	 */
 	public List<FormatError> getErrors() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefAlreadyExistsException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefAlreadyExistsException.java
index 837028c..7e39361 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefAlreadyExistsException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefAlreadyExistsException.java
@@ -37,17 +37,18 @@
  */
 package org.eclipse.jgit.api.errors;
 
-import org.eclipse.jgit.lib.Ref;
-
 /**
- * Thrown when trying to create a {@link Ref} with the same name as an existing
- * one
+ * Thrown when trying to create a {@link org.eclipse.jgit.lib.Ref} with the same
+ * name as an existing one
  */
 public class RefAlreadyExistsException extends GitAPIException {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for RefAlreadyExistsException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public RefAlreadyExistsException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotAdvertisedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotAdvertisedException.java
index 2bd8477..b52cd58 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotAdvertisedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotAdvertisedException.java
@@ -46,7 +46,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for RefNotAdvertisedException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public RefNotAdvertisedException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotFoundException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotFoundException.java
index b9f2a56..406fa45 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotFoundException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/RefNotFoundException.java
@@ -44,8 +44,12 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for RefNotFoundException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 * @since 4.1
 	 */
 	public RefNotFoundException(String message, Throwable cause) {
@@ -53,7 +57,10 @@
 	}
 
 	/**
+	 * Constructor for RefNotFoundException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public RefNotFoundException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/StashApplyFailureException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/StashApplyFailureException.java
index 222c1db..517b512 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/StashApplyFailureException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/StashApplyFailureException.java
@@ -8,8 +8,12 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for StashApplyFailureException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 * @since 4.1
 	 */
 	public StashApplyFailureException(String message, Throwable cause) {
@@ -20,6 +24,7 @@
 	 * Create a StashApplyFailedException
 	 *
 	 * @param message
+	 *            error message
 	 */
 	public StashApplyFailureException(final String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargeObjectInPackException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargeObjectInPackException.java
index b841f57..ceaa6b2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargeObjectInPackException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargeObjectInPackException.java
@@ -47,6 +47,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for TooLargeObjectInPackException
+	 *
 	 * @param msg
 	 *            message describing the transport failure.
 	 */
@@ -55,6 +57,8 @@
 	}
 
 	/**
+	 * Constructor for TooLargeObjectInPackException
+	 *
 	 * @param msg
 	 *            message describing the transport exception.
 	 * @param cause
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargePackException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargePackException.java
index 3833054..462b701 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargePackException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TooLargePackException.java
@@ -46,6 +46,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for TooLargePackException
+	 *
 	 * @param msg
 	 *            message describing the transport failure.
 	 */
@@ -54,6 +56,8 @@
 	}
 
 	/**
+	 * Constructor for TooLargePackException
+	 *
 	 * @param msg
 	 *            message describing the transport exception.
 	 * @param cause
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TransportException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TransportException.java
index 9f0e2fb..5569928 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TransportException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/TransportException.java
@@ -44,6 +44,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for TransportException
+	 *
 	 * @param msg
 	 *            message describing the transport failure.
 	 */
@@ -52,6 +54,8 @@
 	}
 
 	/**
+	 * Constructor for TransportException
+	 *
 	 * @param msg
 	 *            message describing the transport exception.
 	 * @param cause
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/UnmergedPathsException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/UnmergedPathsException.java
index 082f94c..9d6318e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/UnmergedPathsException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/UnmergedPathsException.java
@@ -63,8 +63,12 @@
 	}
 
 	/**
+	 * Constructor for UnmergedPathsException
+	 *
 	 * @param message
+	 *            the message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 * @since 4.1
 	 */
 	public UnmergedPathsException(String message, Throwable cause) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/WrongRepositoryStateException.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/WrongRepositoryStateException.java
index dd2b399..4b58711 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/WrongRepositoryStateException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/errors/WrongRepositoryStateException.java
@@ -46,15 +46,22 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for WrongRepositoryStateException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 */
 	public WrongRepositoryStateException(String message, Throwable cause) {
 		super(message, cause);
 	}
 
 	/**
+	 * Constructor for WrongRepositoryStateException.
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public WrongRepositoryStateException(String message) {
 		super(message);
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 c256b73..f1df0da 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java
@@ -47,15 +47,17 @@
  * <p>
  * According to the man page, an attribute can have the following states:
  * <ul>
- * <li>Set - represented by {@link State#SET}</li>
- * <li>Unset - represented by {@link State#UNSET}</li>
- * <li>Set to a value - represented by {@link State#CUSTOM}</li>
+ * <li>Set - represented by
+ * {@link org.eclipse.jgit.attributes.Attribute.State#SET}</li>
+ * <li>Unset - represented by
+ * {@link org.eclipse.jgit.attributes.Attribute.State#UNSET}</li>
+ * <li>Set to a value - represented by
+ * {@link org.eclipse.jgit.attributes.Attribute.State#CUSTOM}</li>
  * <li>Unspecified - used to revert an attribute . This is crucial in order to
  * mark an attribute as unspecified in the attributes map and thus preventing
  * following (with lower priority) nodes from setting the attribute to a value
  * at all</li>
  * </ul>
- * </p>
  *
  * @since 3.7
  */
@@ -93,10 +95,11 @@
 	 * @param key
 	 *            the attribute key. Should not be <code>null</code>.
 	 * @param state
-	 *            the attribute state. It should be either {@link State#SET} or
-	 *            {@link State#UNSET}. In order to create a custom value
-	 *            attribute prefer the use of {@link #Attribute(String, String)}
-	 *            constructor.
+	 *            the attribute state. It should be either
+	 *            {@link org.eclipse.jgit.attributes.Attribute.State#SET} or
+	 *            {@link org.eclipse.jgit.attributes.Attribute.State#UNSET}. In
+	 *            order to create a custom value attribute prefer the use of
+	 *            {@link #Attribute(String, String)} constructor.
 	 */
 	public Attribute(String key, State state) {
 		this(key, state, null);
@@ -127,6 +130,7 @@
 		this(key, State.CUSTOM, value);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj)
@@ -147,6 +151,8 @@
 	}
 
 	/**
+	 * Get key
+	 *
 	 * @return the attribute key (never returns <code>null</code>)
 	 */
 	public String getKey() {
@@ -154,7 +160,7 @@
 	}
 
 	/**
-	 * Returns the state.
+	 * Return the state.
 	 *
 	 * @return the state (never returns <code>null</code>)
 	 */
@@ -163,12 +169,15 @@
 	}
 
 	/**
+	 * Get value
+	 *
 	 * @return the attribute value (may be <code>null</code>)
 	 */
 	public String getValue() {
 		return value;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		final int prime = 31;
@@ -179,6 +188,7 @@
 		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 d3826b3..125ee59 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attributes.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attributes.java
@@ -53,7 +53,6 @@
 
 /**
  * Represents a set of attributes for a path
- * <p>
  *
  * @since 4.2
  */
@@ -64,6 +63,7 @@
 	 * Creates a new instance
 	 *
 	 * @param attributes
+	 *            a {@link org.eclipse.jgit.attributes.Attribute}
 	 */
 	public Attributes(Attribute... attributes) {
 		if (attributes != null) {
@@ -74,6 +74,8 @@
 	}
 
 	/**
+	 * Whether the set of attributes is empty
+	 *
 	 * @return true if the set does not contain any attributes
 	 */
 	public boolean isEmpty() {
@@ -81,7 +83,10 @@
 	}
 
 	/**
+	 * Get the attribute with the given key
+	 *
 	 * @param key
+	 *            a {@link java.lang.String} object.
 	 * @return the attribute or null
 	 */
 	public Attribute get(String key) {
@@ -89,6 +94,8 @@
 	}
 
 	/**
+	 * Get all attributes
+	 *
 	 * @return all attributes
 	 */
 	public Collection<Attribute> getAll() {
@@ -96,32 +103,42 @@
 	}
 
 	/**
+	 * Put an attribute
+	 *
 	 * @param a
+	 *            an {@link org.eclipse.jgit.attributes.Attribute}
 	 */
 	public void put(Attribute a) {
 		map.put(a.getKey(), a);
 	}
 
 	/**
+	 * Remove attribute with given key
+	 *
 	 * @param key
+	 *            an attribute name
 	 */
 	public void remove(String key) {
 		map.remove(key);
 	}
 
 	/**
+	 * Whether there is an attribute with this key
+	 *
 	 * @param key
-	 * @return true if the {@link Attributes} contains this key
+	 *            key of an attribute
+	 * @return true if the {@link org.eclipse.jgit.attributes.Attributes}
+	 *         contains this key
 	 */
 	public boolean containsKey(String key) {
 		return map.containsKey(key);
 	}
 
 	/**
-	 * Returns the state.
+	 * Return the state.
 	 *
 	 * @param key
-	 *
+	 *            key of an attribute
 	 * @return the state (never returns <code>null</code>)
 	 */
 	public Attribute.State getState(String key) {
@@ -130,41 +147,63 @@
 	}
 
 	/**
+	 * Whether the attribute is set
+	 *
 	 * @param key
-	 * @return true if the key is {@link State#SET}, false in all other cases
+	 *            a {@link java.lang.String} object.
+	 * @return true if the key is
+	 *         {@link org.eclipse.jgit.attributes.Attribute.State#SET}, false in
+	 *         all other cases
 	 */
 	public boolean isSet(String key) {
 		return (getState(key) == State.SET);
 	}
 
 	/**
+	 * Whether the attribute is unset
+	 *
 	 * @param key
-	 * @return true if the key is {@link State#UNSET}, false in all other cases
+	 *            a {@link java.lang.String} object.
+	 * @return true if the key is
+	 *         {@link org.eclipse.jgit.attributes.Attribute.State#UNSET}, false
+	 *         in all other cases
 	 */
 	public boolean isUnset(String key) {
 		return (getState(key) == State.UNSET);
 	}
 
 	/**
+	 * Whether the attribute with the given key is unspecified
+	 *
 	 * @param key
-	 * @return true if the key is {@link State#UNSPECIFIED}, false in all other
-	 *         cases
+	 *            a {@link java.lang.String} object.
+	 * @return true if the key is
+	 *         {@link org.eclipse.jgit.attributes.Attribute.State#UNSPECIFIED},
+	 *         false in all other cases
 	 */
 	public boolean isUnspecified(String key) {
 		return (getState(key) == State.UNSPECIFIED);
 	}
 
 	/**
+	 * Is this a custom attribute
+	 *
 	 * @param key
-	 * @return true if the key is {@link State#CUSTOM}, false in all other cases
-	 *         see {@link #getValue(String)} for the value of the key
+	 *            a {@link java.lang.String} object.
+	 * @return true if the key is
+	 *         {@link org.eclipse.jgit.attributes.Attribute.State#CUSTOM}, false
+	 *         in all other cases see {@link #getValue(String)} for the value of
+	 *         the key
 	 */
 	public boolean isCustom(String key) {
 		return (getState(key) == State.CUSTOM);
 	}
 
 	/**
+	 * Get attribute value
+	 *
 	 * @param key
+	 *            an attribute key
 	 * @return the attribute value (may be <code>null</code>)
 	 */
 	public String getValue(String key) {
@@ -192,6 +231,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder buf = new StringBuilder();
@@ -206,11 +246,13 @@
 		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 8d928e3..638dd82 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesHandler.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesHandler.java
@@ -61,7 +61,8 @@
  * The attributes handler knows how to retrieve, parse and merge attributes from
  * the various gitattributes files. Furthermore it collects and expands macro
  * expressions. The method {@link #getAttributes()} yields the ready processed
- * attributes for the current path represented by the {@link TreeWalk}
+ * attributes for the current path represented by the
+ * {@link org.eclipse.jgit.treewalk.TreeWalk}
  * <p>
  * The implementation is based on the specifications in
  * http://git-scm.com/docs/gitattributes
@@ -90,11 +91,13 @@
 	private final Map<String, List<Attribute>> expansions = new HashMap<>();
 
 	/**
-	 * Create an {@link AttributesHandler} with default rules as well as merged
-	 * rules from global, info and worktree root attributes
+	 * Create an {@link org.eclipse.jgit.attributes.AttributesHandler} with
+	 * default rules as well as merged rules from global, info and worktree root
+	 * attributes
 	 *
 	 * @param treeWalk
-	 * @throws IOException
+	 *            a {@link org.eclipse.jgit.treewalk.TreeWalk}
+	 * @throws java.io.IOException
 	 */
 	public AttributesHandler(TreeWalk treeWalk) throws IOException {
 		this.treeWalk = treeWalk;
@@ -129,11 +132,12 @@
 	}
 
 	/**
-	 * see {@link TreeWalk#getAttributes()}
+	 * See {@link org.eclipse.jgit.treewalk.TreeWalk#getAttributes()}
 	 *
-	 * @return the {@link Attributes} for the current path represented by the
-	 *         {@link TreeWalk}
-	 * @throws IOException
+	 * @return the {@link org.eclipse.jgit.attributes.Attributes} for the
+	 *         current path represented by the
+	 *         {@link org.eclipse.jgit.treewalk.TreeWalk}
+	 * @throws java.io.IOException
 	 */
 	public Attributes getAttributes() throws IOException {
 		String entryPath = treeWalk.getPathString();
@@ -282,7 +286,10 @@
 	}
 
 	/**
+	 * Expand a macro
+	 *
 	 * @param attr
+	 *            a {@link org.eclipse.jgit.attributes.Attribute}
 	 * @param result
 	 *            contains the (recursive) expanded and merged macro attributes
 	 *            including the attribute iself
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNode.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNode.java
index 13aeaee..62bf9f2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNode.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNode.java
@@ -63,7 +63,9 @@
 	/** The rules that have been parsed into this node. */
 	private final List<AttributesRule> rules;
 
-	/** Create an empty ignore node with no rules. */
+	/**
+	 * Create an empty ignore node with no rules.
+	 */
 	public AttributesNode() {
 		rules = new ArrayList<>();
 	}
@@ -73,7 +75,7 @@
 	 *
 	 * @param rules
 	 *            list of rules.
-	 **/
+	 */
 	public AttributesNode(List<AttributesRule> rules) {
 		this.rules = rules;
 	}
@@ -84,7 +86,7 @@
 	 * @param in
 	 *            input stream holding the standard ignore format. The caller is
 	 *            responsible for closing the stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             Error thrown when reading an ignore file.
 	 */
 	public void parse(InputStream in) throws IOException {
@@ -116,7 +118,11 @@
 		return new BufferedReader(new InputStreamReader(in, Constants.CHARSET));
 	}
 
-	/** @return list of all ignore rules held by this node. */
+	/**
+	 * Getter for the field <code>rules</code>.
+	 *
+	 * @return list of all ignore rules held by this node
+	 */
 	public List<AttributesRule> getRules() {
 		return Collections.unmodifiableList(rules);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNodeProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNodeProvider.java
index 6f2ebad..f1d7d7b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNodeProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesNodeProvider.java
@@ -47,32 +47,32 @@
 import org.eclipse.jgit.lib.CoreConfig;
 
 /**
- * An interface used to retrieve the global and info {@link AttributesNode}s.
+ * An interface used to retrieve the global and info
+ * {@link org.eclipse.jgit.attributes.AttributesNode}s.
  *
  * @since 4.2
- *
  */
 public interface AttributesNodeProvider {
 
 	/**
-	 * Retrieve the {@link AttributesNode} that holds the information located
-	 * in $GIT_DIR/info/attributes file.
+	 * Retrieve the {@link org.eclipse.jgit.attributes.AttributesNode} that
+	 * holds the information located in $GIT_DIR/info/attributes file.
 	 *
-	 * @return the {@link AttributesNode} that holds the information located in
-	 *         $GIT_DIR/info/attributes file.
-	 * @throws IOException
+	 * @return the {@link org.eclipse.jgit.attributes.AttributesNode} that holds
+	 *         the information located in $GIT_DIR/info/attributes file.
+	 * @throws java.io.IOException
 	 *             if an error is raised while parsing the attributes file
 	 */
 	public AttributesNode getInfoAttributesNode() throws IOException;
 
 	/**
-	 * Retrieve the {@link AttributesNode} that holds the information located
-	 * in the global gitattributes file.
+	 * Retrieve the {@link org.eclipse.jgit.attributes.AttributesNode} that
+	 * holds the information located in the global gitattributes file.
 	 *
-	 * @return the {@link AttributesNode} that holds the information located in
-	 *         the global gitattributes file.
-	 * @throws IOException
-	 *             IOException if an error is raised while parsing the
+	 * @return the {@link org.eclipse.jgit.attributes.AttributesNode} that holds
+	 *         the information located in the global gitattributes file.
+	 * @throws java.io.IOException
+	 *             java.io.IOException if an error is raised while parsing the
 	 *             attributes file
 	 * @see CoreConfig#getAttributesFile()
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesProvider.java
index 1037f69..1545e35 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesProvider.java
@@ -49,6 +49,8 @@
  */
 public interface AttributesProvider {
 	/**
+	 * Get attributes
+	 *
 	 * @return the currently active attributes
 	 */
 	public Attributes getAttributes();
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 3cf5de8..a91d8c2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java
@@ -57,7 +57,7 @@
 /**
  * A single attributes rule corresponding to one line in a .gitattributes file.
  *
- * Inspiration from: {@link FastIgnoreRule}
+ * Inspiration from: {@link org.eclipse.jgit.ignore.FastIgnoreRule}
  *
  * @since 3.7
  */
@@ -162,7 +162,9 @@
 	}
 
 	/**
-	 * @return True if the pattern should match directories only
+	 * Whether to match directories only
+	 *
+	 * @return {@code true} if the pattern should match directories only
 	 * @since 4.3
 	 */
 	public boolean isDirOnly() {
@@ -170,7 +172,7 @@
 	}
 
 	/**
-	 * Returns the attributes.
+	 * Return the attributes.
 	 *
 	 * @return an unmodifiable list of attributes (never returns
 	 *         <code>null</code>)
@@ -180,6 +182,8 @@
 	}
 
 	/**
+	 * Whether the pattern is only a file name and not a path
+	 *
 	 * @return <code>true</code> if the pattern is just a file name and not a
 	 *         path
 	 */
@@ -188,6 +192,8 @@
 	}
 
 	/**
+	 * Get the pattern
+	 *
 	 * @return The blob pattern to be used as a matcher (never returns
 	 *         <code>null</code>)
 	 */
@@ -214,6 +220,7 @@
 		return match;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommand.java
index 10be588..aae0076 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommand.java
@@ -50,7 +50,7 @@
  * An abstraction for JGit's builtin implementations for hooks and filters.
  * Instead of spawning an external processes to start a filter/hook and to pump
  * data from/to stdin/stdout these builtin commmands may be used. They are
- * constructed by {@link FilterCommandFactory}.
+ * constructed by {@link org.eclipse.jgit.attributes.FilterCommandFactory}.
  *
  * @since 4.6
  */
@@ -66,10 +66,12 @@
 	protected OutputStream out;
 
 	/**
+	 * Constructor for FilterCommand
+	 *
 	 * @param in
-	 *            The {@link InputStream} this command should read from
+	 *            The {@link java.io.InputStream} this command should read from
 	 * @param out
-	 *            The {@link OutputStream} this command should write to
+	 *            The {@link java.io.OutputStream} this command should write to
 	 */
 	public FilterCommand(InputStream in, OutputStream out) {
 		this.in = in;
@@ -80,15 +82,15 @@
 	 * Execute the command. The command is supposed to read data from
 	 * {@link #in} and to write the result to {@link #out}. It returns the
 	 * number of bytes it read from {@link #in}. It should be called in a loop
-	 * until it returns -1 signaling that the {@link InputStream} is completely
-	 * processed.
+	 * until it returns -1 signaling that the {@link java.io.InputStream} is
+	 * completely processed.
 	 *
-	 * @return the number of bytes read from the {@link InputStream} or -1. -1
-	 *         means that the {@link InputStream} is completely processed.
-	 * @throws IOException
-	 *             when {@link IOException} occured while reading from
+	 * @return the number of bytes read from the {@link java.io.InputStream} or
+	 *         -1. -1 means that the {@link java.io.InputStream} is completely
+	 *         processed.
+	 * @throws java.io.IOException
+	 *             when {@link java.io.IOException} occured while reading from
 	 *             {@link #in} or writing to {@link #out}
-	 *
 	 */
 	public abstract int run() throws IOException;
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandFactory.java
index 6b973da..11b76b0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandFactory.java
@@ -49,23 +49,25 @@
 import org.eclipse.jgit.lib.Repository;
 
 /**
- * The factory responsible for creating instances of {@link FilterCommand}.
+ * The factory responsible for creating instances of
+ * {@link org.eclipse.jgit.attributes.FilterCommand}.
  *
  * @since 4.6
  */
 public interface FilterCommandFactory {
 	/**
-	 * Create a new {@link FilterCommand}.
+	 * Create a new {@link org.eclipse.jgit.attributes.FilterCommand}.
 	 *
 	 * @param db
 	 *            the repository this command should work on
 	 * @param in
-	 *            the {@link InputStream} this command should read from
+	 *            the {@link java.io.InputStream} this command should read from
 	 * @param out
-	 *            the {@link OutputStream} this command should write to
-	 * @return the created {@link FilterCommand}
-	 * @throws IOException
-	 *             thrown when the command constructor throws an IOException
+	 *            the {@link java.io.OutputStream} this command should write to
+	 * @return the created {@link org.eclipse.jgit.attributes.FilterCommand}
+	 * @throws java.io.IOException
+	 *             thrown when the command constructor throws an
+	 *             java.io.IOException
 	 */
 	public FilterCommand create(Repository db, InputStream in,
 			OutputStream out) throws IOException;
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 3fbaedb..7e511a8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
@@ -59,17 +59,20 @@
 	private static ConcurrentHashMap<String, FilterCommandFactory> filterCommandRegistry = new ConcurrentHashMap<>();
 
 	/**
-	 * Registers a {@link FilterCommandFactory} responsible for creating
-	 * {@link FilterCommand}s for a certain command name. If the factory f1 is
-	 * registered for the name "jgit://builtin/x" then a call to
-	 * <code>getCommand("jgit://builtin/x", ...)</code> will call
-	 * <code>f1(...)</code> to create a new instance of {@link FilterCommand}
+	 * Register a {@link org.eclipse.jgit.attributes.FilterCommandFactory}
+	 * responsible for creating
+	 * {@link org.eclipse.jgit.attributes.FilterCommand}s for a certain command
+	 * name. If the factory f1 is registered for the name "jgit://builtin/x"
+	 * then a call to <code>getCommand("jgit://builtin/x", ...)</code> will call
+	 * <code>f1(...)</code> to create a new instance of
+	 * {@link org.eclipse.jgit.attributes.FilterCommand}
 	 *
 	 * @param filterCommandName
 	 *            the command name for which this factory is registered
 	 * @param factory
-	 *            the factory responsible for creating {@link FilterCommand}s
-	 *            for the specified name
+	 *            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>
 	 */
@@ -79,8 +82,8 @@
 	}
 
 	/**
-	 * Unregisters the {@link FilterCommandFactory} registered for the given
-	 * command name
+	 * Unregister the {@link org.eclipse.jgit.attributes.FilterCommandFactory}
+	 * registered for the given command name
 	 *
 	 * @param filterCommandName
 	 *            the FilterCommandFactory's filter command name
@@ -92,8 +95,9 @@
 	}
 
 	/**
-	 * Checks whether any {@link FilterCommandFactory} is registered for a given
-	 * command name
+	 * Check whether any
+	 * {@link org.eclipse.jgit.attributes.FilterCommandFactory} is registered
+	 * for a given command name
 	 *
 	 * @param filterCommandName
 	 *            the name for which the registry should be checked
@@ -104,7 +108,10 @@
 	}
 
 	/**
-	 * @return Set of commandNames for which a {@link FilterCommandFactory} is
+	 * Get registered filter commands
+	 *
+	 * @return Set of commandNames for which a
+	 *         {@link org.eclipse.jgit.attributes.FilterCommandFactory} is
 	 *         registered
 	 */
 	public static Set<String> getRegisteredFilterCommands() {
@@ -112,23 +119,26 @@
 	}
 
 	/**
-	 * Creates a new {@link FilterCommand} for the given name. A factory must be
-	 * registered for the name in advance.
+	 * Create a new {@link org.eclipse.jgit.attributes.FilterCommand} for the
+	 * given name. A factory must be registered for the name in advance.
 	 *
 	 * @param filterCommandName
-	 *            The name for which a new {@link FilterCommand} should be
+	 *            The name for which a new
+	 *            {@link org.eclipse.jgit.attributes.FilterCommand} should be
 	 *            created
 	 * @param db
 	 *            the repository this command should work on
 	 * @param in
-	 *            the {@link InputStream} this {@link FilterCommand} should read
+	 *            the {@link java.io.InputStream} this
+	 *            {@link org.eclipse.jgit.attributes.FilterCommand} should read
 	 *            from
 	 * @param out
-	 *            the {@link OutputStream} this {@link FilterCommand} should
-	 *            write to
+	 *            the {@link java.io.OutputStream} this
+	 *            {@link org.eclipse.jgit.attributes.FilterCommand} should write
+	 *            to
 	 * @return the command if a command could be created or <code>null</code> if
 	 *         there was no factory registered for that name
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static FilterCommand createFilterCommand(String filterCommandName,
 			Repository db, InputStream in, OutputStream out)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
index 4ad58c3..e2411d6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
@@ -88,8 +88,10 @@
  * <p>
  * Applications that want more incremental update behavior may use either the
  * raw {@link #next()} streaming approach supported by this class, or construct
- * a {@link BlameResult} using {@link BlameResult#create(BlameGenerator)} and
- * incrementally construct the result with {@link BlameResult#computeNext()}.
+ * a {@link org.eclipse.jgit.blame.BlameResult} using
+ * {@link org.eclipse.jgit.blame.BlameResult#create(BlameGenerator)} and
+ * incrementally construct the result with
+ * {@link org.eclipse.jgit.blame.BlameResult#computeNext()}.
  * <p>
  * This class is not thread-safe.
  * <p>
@@ -186,12 +188,20 @@
 		treeWalk.setRecursive(true);
 	}
 
-	/** @return repository being scanned for revision history. */
+	/**
+	 * Get repository
+	 *
+	 * @return repository being scanned for revision history
+	 */
 	public Repository getRepository() {
 		return repository;
 	}
 
-	/** @return path file path being processed. */
+	/**
+	 * Get result path
+	 *
+	 * @return path file path being processed
+	 */
 	public String getResultPath() {
 		return resultPath.getPath();
 	}
@@ -200,6 +210,7 @@
 	 * Difference algorithm to use when comparing revisions.
 	 *
 	 * @param algorithm
+	 *            a {@link org.eclipse.jgit.diff.DiffAlgorithm}
 	 * @return {@code this}
 	 */
 	public BlameGenerator setDiffAlgorithm(DiffAlgorithm algorithm) {
@@ -211,6 +222,7 @@
 	 * Text comparator to use when comparing revisions.
 	 *
 	 * @param comparator
+	 *            a {@link org.eclipse.jgit.diff.RawTextComparator}
 	 * @return {@code this}
 	 */
 	public BlameGenerator setTextComparator(RawTextComparator comparator) {
@@ -255,15 +267,15 @@
 	 * <p>
 	 * Candidates should be pushed in history order from oldest-to-newest.
 	 * Applications should push the starting commit first, then the index
-	 * revision (if the index is interesting), and finally the working tree
-	 * copy (if the working tree is interesting).
+	 * revision (if the index is interesting), and finally the working tree copy
+	 * (if the working tree is interesting).
 	 *
 	 * @param description
 	 *            description of the blob revision, such as "Working Tree".
 	 * @param contents
 	 *            contents of the file.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameGenerator push(String description, byte[] contents)
@@ -284,7 +296,7 @@
 	 * @param contents
 	 *            contents of the file.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameGenerator push(String description, RawText contents)
@@ -312,7 +324,7 @@
 	 * @param id
 	 *            may be a commit or a blob.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameGenerator push(String description, AnyObjectId id)
@@ -357,8 +369,8 @@
 	 * each of these is a descendant commit that removed the line, typically
 	 * this occurs when the same deletion appears in multiple side branches such
 	 * as due to a cherry-pick. Applications relying on reverse should use
-	 * {@link BlameResult} as it filters these duplicate sources and only
-	 * remembers the first (oldest) deletion.
+	 * {@link org.eclipse.jgit.blame.BlameResult} as it filters these duplicate
+	 * sources and only remembers the first (oldest) deletion.
 	 *
 	 * @param start
 	 *            oldest commit to traverse from. The result file will be loaded
@@ -367,7 +379,7 @@
 	 *            most recent commit to stop traversal at. Usually an active
 	 *            branch tip, tag, or HEAD.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameGenerator reverse(AnyObjectId start, AnyObjectId end)
@@ -389,8 +401,8 @@
 	 * each of these is a descendant commit that removed the line, typically
 	 * this occurs when the same deletion appears in multiple side branches such
 	 * as due to a cherry-pick. Applications relying on reverse should use
-	 * {@link BlameResult} as it filters these duplicate sources and only
-	 * remembers the first (oldest) deletion.
+	 * {@link org.eclipse.jgit.blame.BlameResult} as it filters these duplicate
+	 * sources and only remembers the first (oldest) deletion.
 	 *
 	 * @param start
 	 *            oldest commit to traverse from. The result file will be loaded
@@ -399,7 +411,7 @@
 	 *            most recent commits to stop traversal at. Usually an active
 	 *            branch tip, tag, or HEAD.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameGenerator reverse(AnyObjectId start,
@@ -443,7 +455,7 @@
 	 * Execute the generator in a blocking fashion until all data is ready.
 	 *
 	 * @return the complete result. Null if no file exists for the given path.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public BlameResult computeBlameResult() throws IOException {
@@ -464,7 +476,7 @@
 	 *         and {@link #getResultStart()}, {@link #getResultEnd()} methods
 	 *         can be used to inspect the region found. False if there are no
 	 *         more regions to describe.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             repository cannot be read.
 	 */
 	public boolean next() throws IOException {
@@ -842,28 +854,47 @@
 		return outCandidate.sourceCommit;
 	}
 
-	/** @return current author being blamed. */
+	/**
+	 * Get source author
+	 *
+	 * @return current author being blamed
+	 */
 	public PersonIdent getSourceAuthor() {
 		return outCandidate.getAuthor();
 	}
 
-	/** @return current committer being blamed. */
+	/**
+	 * Get source committer
+	 *
+	 * @return current committer being blamed
+	 */
 	public PersonIdent getSourceCommitter() {
 		RevCommit c = getSourceCommit();
 		return c != null ? c.getCommitterIdent() : null;
 	}
 
-	/** @return path of the file being blamed. */
+	/**
+	 * Get source path
+	 *
+	 * @return path of the file being blamed
+	 */
 	public String getSourcePath() {
 		return outCandidate.sourcePath.getPath();
 	}
 
-	/** @return rename score if a rename occurred in {@link #getSourceCommit}. */
+	/**
+	 * Get rename score
+	 *
+	 * @return rename score if a rename occurred in {@link #getSourceCommit}
+	 */
 	public int getRenameScore() {
 		return outCandidate.renameScore;
 	}
 
 	/**
+	 * Get first line of the source data that has been blamed for the current
+	 * region
+	 *
 	 * @return first line of the source data that has been blamed for the
 	 *         current region. This is line number of where the region was added
 	 *         during {@link #getSourceCommit()} in file
@@ -874,6 +905,9 @@
 	}
 
 	/**
+	 * Get one past the range of the source data that has been blamed for the
+	 * current region
+	 *
 	 * @return one past the range of the source data that has been blamed for
 	 *         the current region. This is line number of where the region was
 	 *         added during {@link #getSourceCommit()} in file
@@ -885,6 +919,9 @@
 	}
 
 	/**
+	 * Get first line of the result that {@link #getSourceCommit()} has been
+	 * blamed for providing
+	 *
 	 * @return first line of the result that {@link #getSourceCommit()} has been
 	 *         blamed for providing. Line numbers use 0 based indexing.
 	 */
@@ -893,6 +930,9 @@
 	}
 
 	/**
+	 * Get one past the range of the result that {@link #getSourceCommit()} has
+	 * been blamed for providing
+	 *
 	 * @return one past the range of the result that {@link #getSourceCommit()}
 	 *         has been blamed for providing. Line numbers use 0 based indexing.
 	 *         Because a source cannot be blamed for an empty region of the
@@ -905,6 +945,9 @@
 	}
 
 	/**
+	 * Get number of lines in the current region being blamed to
+	 * {@link #getSourceCommit()}
+	 *
 	 * @return number of lines in the current region being blamed to
 	 *         {@link #getSourceCommit()}. This is always the value of the
 	 *         expression {@code getResultEnd() - getResultStart()}, but also
@@ -915,6 +958,9 @@
 	}
 
 	/**
+	 * Get complete contents of the source file blamed for the current output
+	 * region
+	 *
 	 * @return complete contents of the source file blamed for the current
 	 *         output region. This is the contents of {@link #getSourcePath()}
 	 *         within {@link #getSourceCommit()}. The source contents is
@@ -926,13 +972,15 @@
 	}
 
 	/**
+	 * Get complete file contents of the result file blame is annotating
+	 *
 	 * @return complete file contents of the result file blame is annotating.
 	 *         This value is accessible only after being configured and only
 	 *         immediately before the first call to {@link #next()}. Returns
 	 *         null if the path does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             repository cannot be read.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             {@link #next()} has already been invoked.
 	 */
 	public RawText getResultContents() throws IOException {
@@ -940,6 +988,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release the current blame session.
 	 *
 	 * @since 4.0
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 e34db38..5fb7750 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java
@@ -78,7 +78,7 @@
 	 *            the generator the result will consume records from.
 	 * @return the new result object. null if the generator cannot find the path
 	 *         it starts from.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public static BlameResult create(BlameGenerator gen) throws IOException {
@@ -123,17 +123,27 @@
 		sourcePaths = new String[cnt];
 	}
 
-	/** @return path of the file this result annotates. */
+	/**
+	 * Get result path
+	 *
+	 * @return path of the file this result annotates
+	 */
 	public String getResultPath() {
 		return resultPath;
 	}
 
-	/** @return contents of the result file, available for display. */
+	/**
+	 * Get result contents
+	 *
+	 * @return contents of the result file, available for display
+	 */
 	public RawText getResultContents() {
 		return resultContents;
 	}
 
-	/** Throw away the {@link #getResultContents()}. */
+	/**
+	 * Throw away the {@link #getResultContents()}.
+	 */
 	public void discardResultContents() {
 		resultContents = null;
 	}
@@ -227,7 +237,7 @@
 	/**
 	 * Compute all pending information.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public void computeAll() throws IOException {
@@ -252,7 +262,7 @@
 	 * to determine how many lines of the result were computed.
 	 *
 	 * @return index that is now available. -1 if no more are available.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public int computeNext() throws IOException {
@@ -271,7 +281,11 @@
 		}
 	}
 
-	/** @return length of the last segment found by {@link #computeNext()}. */
+	/**
+	 * Get last length
+	 *
+	 * @return length of the last segment found by {@link #computeNext()}
+	 */
 	public int lastLength() {
 		return lastLength;
 	}
@@ -283,7 +297,7 @@
 	 *            first index to examine (inclusive).
 	 * @param end
 	 *            end index (exclusive).
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be read.
 	 */
 	public void computeRange(int start, int end) throws IOException {
@@ -322,6 +336,7 @@
 		}
 	}
 
+	/** {@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 72d8abe..855ef78 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java
@@ -325,6 +325,7 @@
 		}
 	}
 
+	/** {@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 9ea346b..18281f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/Region.java
@@ -116,6 +116,7 @@
 		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 5b59804..2eb313f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/ReverseWalk.java
@@ -57,6 +57,7 @@
 		super(repo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ReverseCommit next() throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -68,6 +69,7 @@
 		return c;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected RevCommit createCommit(AnyObjectId id) {
 		return new ReverseCommit(id);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/ContentSource.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/ContentSource.java
index 444ab1c..5ede3ea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/ContentSource.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/ContentSource.java
@@ -55,13 +55,13 @@
 import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ObjectStream;
-import org.eclipse.jgit.treewalk.FileTreeIterator;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.WorkingTreeIterator;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 
 /**
- * Supplies the content of a file for {@link DiffFormatter}.
+ * Supplies the content of a file for
+ * {@link org.eclipse.jgit.diff.DiffFormatter}.
  * <p>
  * A content source is not thread-safe. Sources may contain state, including
  * information about the last ObjectLoader they returned. Callers must be
@@ -83,8 +83,9 @@
 	/**
 	 * Construct a content source for a working directory.
 	 *
-	 * If the iterator is a {@link FileTreeIterator} an optimized version is
-	 * used that doesn't require seeking through a TreeWalk.
+	 * If the iterator is a {@link org.eclipse.jgit.treewalk.FileTreeIterator}
+	 * an optimized version is used that doesn't require seeking through a
+	 * TreeWalk.
 	 *
 	 * @param iterator
 	 *            the iterator to obtain source files through.
@@ -102,7 +103,7 @@
 	 * @param id
 	 *            blob id of the file, if known.
 	 * @return the size in bytes.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file cannot be accessed.
 	 */
 	public abstract long size(String path, ObjectId id) throws IOException;
@@ -117,7 +118,7 @@
 	 * @return a loader that can supply the content of the file. The loader must
 	 *         be used before another loader can be obtained from this same
 	 *         source.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file cannot be accessed.
 	 */
 	public abstract ObjectLoader open(String path, ObjectId 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 5f01366..19eb39d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffAlgorithm.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffAlgorithm.java
@@ -44,7 +44,8 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Compares two {@link Sequence}s to create an {@link EditList} of changes.
+ * Compares two {@link org.eclipse.jgit.diff.Sequence}s to create an
+ * {@link org.eclipse.jgit.diff.EditList} of changes.
  * <p>
  * An algorithm's {@code diff} method must be callable from concurrent threads
  * without data collisions. This permits some algorithms to use a singleton
@@ -69,6 +70,8 @@
 	}
 
 	/**
+	 * Get diff algorithm
+	 *
 	 * @param alg
 	 *            the diff algorithm for which an implementation should be
 	 *            returned
@@ -88,18 +91,18 @@
 	/**
 	 * 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
 	 *            the first (also known as old or pre-image) sequence. Edits
 	 *            returned by this algorithm will reference indexes using the
-	 *            'A' side: {@link Edit#getBeginA()}, {@link Edit#getEndA()}.
+	 *            'A' side: {@link org.eclipse.jgit.diff.Edit#getBeginA()},
+	 *            {@link org.eclipse.jgit.diff.Edit#getEndA()}.
 	 * @param b
 	 *            the second (also known as new or post-image) sequence. Edits
 	 *            returned by this algorithm will reference indexes using the
-	 *            'B' side: {@link Edit#getBeginB()}, {@link Edit#getEndB()}.
+	 *            'B' side: {@link org.eclipse.jgit.diff.Edit#getBeginB()},
+	 *            {@link org.eclipse.jgit.diff.Edit#getEndB()}.
 	 * @return a modifiable edit list comparing the two sequences. If empty, the
 	 *         sequences are identical according to {@code cmp}'s rules. The
 	 *         result list is never null.
@@ -244,20 +247,21 @@
 	 * proven to have no common starting or ending elements. The expected
 	 * elimination of common starting and ending elements is automatically
 	 * performed by the {@link #diff(SequenceComparator, Sequence, Sequence)}
-	 * method, which invokes this method using {@link Subsequence}s.
+	 * 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
 	 *            the first (also known as old or pre-image) sequence. Edits
 	 *            returned by this algorithm will reference indexes using the
-	 *            'A' side: {@link Edit#getBeginA()}, {@link Edit#getEndA()}.
+	 *            'A' side: {@link org.eclipse.jgit.diff.Edit#getBeginA()},
+	 *            {@link org.eclipse.jgit.diff.Edit#getEndA()}.
 	 * @param b
 	 *            the second (also known as new or post-image) sequence. Edits
 	 *            returned by this algorithm will reference indexes using the
-	 *            'B' side: {@link Edit#getBeginB()}, {@link Edit#getEndB()}.
+	 *            'B' side: {@link org.eclipse.jgit.diff.Edit#getBeginB()},
+	 *            {@link org.eclipse.jgit.diff.Edit#getEndB()}.
 	 * @return a modifiable edit list comparing the two sequences.
 	 */
 	public abstract <S extends Sequence> EditList diffNonCommon(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java
index ee70949..063ceff 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java
@@ -51,7 +51,9 @@
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.util.StringUtils;
 
-/** Keeps track of diff related configuration options. */
+/**
+ * Keeps track of diff related configuration options.
+ */
 public class DiffConfig {
 	/** Key for {@link Config#get(SectionParser)}. */
 	public static final Config.SectionParser<DiffConfig> KEY = DiffConfig::new;
@@ -83,22 +85,38 @@
 				ConfigConstants.CONFIG_KEY_RENAMELIMIT, 200);
 	}
 
-	/** @return true if the prefix "a/" and "b/" should be suppressed. */
+	/**
+	 * If prefix should be suppressed
+	 *
+	 * @return true if the prefix "a/" and "b/" should be suppressed
+	 */
 	public boolean isNoPrefix() {
 		return noPrefix;
 	}
 
-	/** @return true if rename detection is enabled by default. */
+	/**
+	 * If rename detection is enabled
+	 *
+	 * @return true if rename detection is enabled by default
+	 */
 	public boolean isRenameDetectionEnabled() {
 		return renameDetectionType != RenameDetectionType.FALSE;
 	}
 
-	/** @return type of rename detection to perform. */
+	/**
+	 * Get the rename detection type
+	 *
+	 * @return type of rename detection to perform
+	 */
 	public RenameDetectionType getRenameDetectionType() {
 		return renameDetectionType;
 	}
 
-	/** @return limit on number of paths to perform inexact rename detection. */
+	/**
+	 * Get the rename limit
+	 *
+	 * @return limit on number of paths to perform inexact rename detection
+	 */
 	public int getRenameLimit() {
 		return renameLimit;
 	}
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 5eb1942..0f5ea76 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
@@ -58,7 +58,9 @@
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilterMarker;
 
-/** A value class representing a change to a file */
+/**
+ * A value class representing a change to a file
+ */
 public class DiffEntry {
 	/** Magical SHA1 used for file adds or deletes */
 	static final AbbreviatedObjectId A_ZERO = AbbreviatedObjectId
@@ -107,9 +109,9 @@
 	 * @param walk
 	 *            the TreeWalk to walk through. Must have exactly two trees.
 	 * @return headers describing the changed files.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             When given TreeWalk doesn't have exactly two trees.
 	 */
 	public static List<DiffEntry> scan(TreeWalk walk) throws IOException {
@@ -127,9 +129,9 @@
 	 * @param includeTrees
 	 *            include tree objects.
 	 * @return headers describing the changed files.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             when {@code includeTrees} is true and given TreeWalk is
 	 *             recursive. Or when given TreeWalk doesn't have exactly two
 	 *             trees
@@ -155,9 +157,9 @@
 	 *            queried through {{@link #isMarked(int)} (with the index from
 	 *            this passed array).
 	 * @return headers describing the changed files.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             when {@code includeTrees} is true and given TreeWalk is
 	 *             recursive. Or when given TreeWalk doesn't have exactly two
 	 *             trees
@@ -392,12 +394,20 @@
 		return side == Side.OLD ? getOldPath() : getNewPath();
 	}
 
-	/** @return the old file mode, if described in the patch */
+	/**
+	 * Get the old file mode
+	 *
+	 * @return the old file mode, if described in the patch
+	 */
 	public FileMode getOldMode() {
 		return oldMode;
 	}
 
-	/** @return the new file mode, if described in the patch */
+	/**
+	 * Get the new file mode
+	 *
+	 * @return the new file mode, if described in the patch
+	 */
 	public FileMode getNewMode() {
 		return newMode;
 	}
@@ -413,15 +423,22 @@
 		return side == Side.OLD ? getOldMode() : getNewMode();
 	}
 
-	/** @return the type of change this patch makes on {@link #getNewPath()} */
+	/**
+	 * Get the change type
+	 *
+	 * @return the type of change this patch makes on {@link #getNewPath()}
+	 */
 	public ChangeType getChangeType() {
 		return changeType;
 	}
 
 	/**
+	 * Get similarity score
+	 *
 	 * @return similarity score between {@link #getOldPath()} and
 	 *         {@link #getNewPath()} if {@link #getChangeType()} is
-	 *         {@link ChangeType#COPY} or {@link ChangeType#RENAME}.
+	 *         {@link org.eclipse.jgit.diff.DiffEntry.ChangeType#COPY} or
+	 *         {@link org.eclipse.jgit.diff.DiffEntry.ChangeType#RENAME}.
 	 */
 	public int getScore() {
 		return score;
@@ -466,10 +483,9 @@
 	 *
 	 * @param index
 	 *            the index of the tree filter to check for (must be between 0
-	 *            and {@link Integer#SIZE}).
-	 *
-	 * @return true, if the tree filter matched; false if not
+	 *            and {@link java.lang.Integer#SIZE}).
 	 * @since 2.3
+	 * @return a boolean.
 	 */
 	public boolean isMarked(int index) {
 		return (treeFilterMarks & (1L << index)) != 0;
@@ -498,6 +514,7 @@
 		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 fa7cc0d..bf9a27b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
@@ -66,9 +66,9 @@
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.dircache.DirCacheIterator;
 import org.eclipse.jgit.errors.AmbiguousObjectException;
+import org.eclipse.jgit.errors.BinaryBlobException;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.LargeObjectException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
@@ -84,7 +84,6 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.patch.FileHeader;
 import org.eclipse.jgit.patch.FileHeader.PatchType;
-import org.eclipse.jgit.patch.HunkHeader;
 import org.eclipse.jgit.revwalk.FollowFilter;
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.revwalk.RevWalk;
@@ -100,7 +99,6 @@
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.jgit.util.QuotedString;
-import org.eclipse.jgit.util.io.DisabledOutputStream;
 
 /**
  * Format a Git style patch script.
@@ -113,9 +111,6 @@
 	/** Magic return content indicating it is empty or no content present. */
 	private static final byte[] EMPTY = new byte[] {};
 
-	/** Magic return indicating the content is binary. */
-	private static final byte[] BINARY = new byte[] {};
-
 	private final OutputStream out;
 
 	private ObjectReader reader;
@@ -158,7 +153,11 @@
 		this.out = out;
 	}
 
-	/** @return the stream we are outputting data to. */
+	/**
+	 * Get output stream
+	 *
+	 * @return the stream we are outputting data to
+	 */
 	protected OutputStream getOutputStream() {
 		return out;
 	}
@@ -327,7 +326,11 @@
 		return this.newPrefix;
 	}
 
-	/** @return true if rename detection is enabled. */
+	/**
+	 * Get if rename detection is enabled
+	 *
+	 * @return true if rename detection is enabled
+	 */
 	public boolean isDetectRenames() {
 		return renameDetector != null;
 	}
@@ -351,7 +354,11 @@
 			renameDetector = null;
 	}
 
-	/** @return the rename detector if rename detection is enabled. */
+	/**
+	 * Get rename detector
+	 *
+	 * @return the rename detector if rename detection is enabled
+	 */
 	public RenameDetector getRenameDetector() {
 		return renameDetector;
 	}
@@ -369,9 +376,10 @@
 	/**
 	 * Set the filter to produce only specific paths.
 	 *
-	 * If the filter is an instance of {@link FollowFilter}, the filter path
-	 * will be updated during successive scan or format invocations. The updated
-	 * path can be obtained from {@link #getPathFilter()}.
+	 * If the filter is an instance of
+	 * {@link org.eclipse.jgit.revwalk.FollowFilter}, the filter path will be
+	 * updated during successive scan or format invocations. The updated path
+	 * can be obtained from {@link #getPathFilter()}.
 	 *
 	 * @param filter
 	 *            the tree filter to apply.
@@ -380,7 +388,11 @@
 		pathFilter = filter != null ? filter : TreeFilter.ALL;
 	}
 
-	/** @return the current path filter. */
+	/**
+	 * Get path filter
+	 *
+	 * @return the current path filter
+	 */
 	public TreeFilter getPathFilter() {
 		return pathFilter;
 	}
@@ -388,7 +400,7 @@
 	/**
 	 * Flush the underlying output stream of this formatter.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream's own flush method threw an exception.
 	 */
 	public void flush() throws IOException {
@@ -396,6 +408,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release the internal ObjectReader state.
 	 *
 	 * @since 4.0
@@ -412,8 +426,8 @@
 	 *
 	 * No output is created, instead only the file paths that are different are
 	 * returned. Callers may choose to format these paths themselves, or convert
-	 * them into {@link FileHeader} instances with a complete edit list by
-	 * calling {@link #toFileHeader(DiffEntry)}.
+	 * them into {@link org.eclipse.jgit.patch.FileHeader} instances with a
+	 * complete edit list by calling {@link #toFileHeader(DiffEntry)}.
 	 * <p>
 	 * Either side may be null to indicate that the tree has beed added or
 	 * removed. The diff will be computed against nothing.
@@ -423,7 +437,7 @@
 	 * @param b
 	 *            the new (or updated) side or null
 	 * @return the paths that are different.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             trees cannot be read or file contents cannot be read.
 	 */
 	public List<DiffEntry> scan(AnyObjectId a, AnyObjectId b)
@@ -442,8 +456,8 @@
 	 *
 	 * No output is created, instead only the file paths that are different are
 	 * returned. Callers may choose to format these paths themselves, or convert
-	 * them into {@link FileHeader} instances with a complete edit list by
-	 * calling {@link #toFileHeader(DiffEntry)}.
+	 * them into {@link org.eclipse.jgit.patch.FileHeader} instances with a
+	 * complete edit list by calling {@link #toFileHeader(DiffEntry)}.
 	 * <p>
 	 * Either side may be null to indicate that the tree has beed added or
 	 * removed. The diff will be computed against nothing.
@@ -453,7 +467,7 @@
 	 * @param b
 	 *            the new (or updated) side or null
 	 * @return the paths that are different.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             trees cannot be read or file contents cannot be read.
 	 */
 	public List<DiffEntry> scan(RevTree a, RevTree b) throws IOException {
@@ -479,15 +493,15 @@
 	 *
 	 * No output is created, instead only the file paths that are different are
 	 * returned. Callers may choose to format these paths themselves, or convert
-	 * them into {@link FileHeader} instances with a complete edit list by
-	 * calling {@link #toFileHeader(DiffEntry)}.
+	 * them into {@link org.eclipse.jgit.patch.FileHeader} instances with a
+	 * complete edit list by calling {@link #toFileHeader(DiffEntry)}.
 	 *
 	 * @param a
 	 *            the old (or previous) side.
 	 * @param b
 	 *            the new (or updated) side.
 	 * @return the paths that are different.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             trees cannot be read or file contents cannot be read.
 	 */
 	public List<DiffEntry> scan(AbstractTreeIterator a, AbstractTreeIterator b)
@@ -599,7 +613,7 @@
 	 *            the old (or previous) side or null
 	 * @param b
 	 *            the new (or updated) side or null
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             trees cannot be read, file contents cannot be read, or the
 	 *             patch cannot be output.
 	 */
@@ -621,7 +635,7 @@
 	 *            the old (or previous) side or null
 	 * @param b
 	 *            the new (or updated) side or null
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             trees cannot be read, file contents cannot be read, or the
 	 *             patch cannot be output.
 	 */
@@ -642,7 +656,7 @@
 	 *            the old (or previous) side or null
 	 * @param b
 	 *            the new (or updated) side or null
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             trees cannot be read, file contents cannot be read, or the
 	 *             patch cannot be output.
 	 */
@@ -658,7 +672,7 @@
 	 *
 	 * @param entries
 	 *            entries describing the affected files.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a file's content cannot be read, or the output stream cannot
 	 *             be written to.
 	 */
@@ -672,7 +686,7 @@
 	 *
 	 * @param ent
 	 *            the entry to be formatted.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a file's content cannot be read, or the output stream cannot
 	 *             be written to.
 	 */
@@ -715,11 +729,13 @@
 	 *            existing file header containing the header lines to copy.
 	 * @param a
 	 *            text source for the pre-image version of the content. This
-	 *            must match the content of {@link FileHeader#getOldId()}.
+	 *            must match the content of
+	 *            {@link org.eclipse.jgit.patch.FileHeader#getOldId()}.
 	 * @param b
 	 *            text source for the post-image version of the content. This
-	 *            must match the content of {@link FileHeader#getNewId()}.
-	 * @throws IOException
+	 *            must match the content of
+	 *            {@link org.eclipse.jgit.patch.FileHeader#getNewId()}.
+	 * @throws java.io.IOException
 	 *             writing to the supplied stream failed.
 	 */
 	public void format(final FileHeader head, final RawText a, final RawText b)
@@ -746,7 +762,7 @@
 	 *            the text A which was compared
 	 * @param b
 	 *            the text B which was compared
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void format(final EditList edits, final RawText a, final RawText b)
 			throws IOException {
@@ -794,7 +810,7 @@
 	 *            RawText for accessing raw data
 	 * @param line
 	 *            the line number within text
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void writeContextLine(final RawText text, final int line)
 			throws IOException {
@@ -812,7 +828,7 @@
 	 *            RawText for accessing raw data
 	 * @param line
 	 *            the line number within text
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void writeAddedLine(final RawText text, final int line)
 			throws IOException {
@@ -826,7 +842,7 @@
 	 *            RawText for accessing raw data
 	 * @param line
 	 *            the line number within text
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void writeRemovedLine(final RawText text, final int line)
 			throws IOException {
@@ -844,7 +860,7 @@
 	 *            within second source
 	 * @param bEndLine
 	 *            within second source
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void writeHunkHeader(int aStartLine, int aEndLine,
 			int bStartLine, int bEndLine) throws IOException {
@@ -897,7 +913,7 @@
 	 *            the text object to obtain the line from.
 	 * @param cur
 	 *            line number to output.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream threw an exception while writing to it.
 	 */
 	protected void writeLine(final char prefix, final RawText text,
@@ -908,24 +924,26 @@
 	}
 
 	/**
-	 * Creates a {@link FileHeader} representing the given {@link DiffEntry}
+	 * Creates a {@link org.eclipse.jgit.patch.FileHeader} representing the
+	 * given {@link org.eclipse.jgit.diff.DiffEntry}
 	 * <p>
 	 * This method does not use the OutputStream associated with this
 	 * DiffFormatter instance. It is therefore safe to instantiate this
-	 * DiffFormatter instance with a {@link DisabledOutputStream} if this method
-	 * is the only one that will be used.
+	 * DiffFormatter instance with a
+	 * {@link org.eclipse.jgit.util.io.DisabledOutputStream} if this method is
+	 * the only one that will be used.
 	 *
 	 * @param ent
 	 *            the DiffEntry to create the FileHeader for
 	 * @return a FileHeader representing the DiffEntry. The FileHeader's buffer
 	 *         will contain only the header of the diff output. It will also
-	 *         contain one {@link HunkHeader}.
-	 * @throws IOException
+	 *         contain one {@link org.eclipse.jgit.patch.HunkHeader}.
+	 * @throws java.io.IOException
 	 *             the stream threw an exception while writing to it, or one of
 	 *             the blobs referenced by the DiffEntry could not be read.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             one of the blobs referenced by the DiffEntry is corrupt.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             one of the blobs referenced by the DiffEntry is missing.
 	 */
 	public FileHeader toFileHeader(DiffEntry ent) throws IOException,
@@ -954,47 +972,50 @@
 			// Content not changed (e.g. only mode, pure rename)
 			editList = new EditList();
 			type = PatchType.UNIFIED;
+			res.header = new FileHeader(buf.toByteArray(), editList, type);
+			return res;
+		}
 
+		assertHaveReader();
+
+		RawText aRaw = null;
+		RawText bRaw = null;
+		if (ent.getOldMode() == GITLINK || ent.getNewMode() == GITLINK) {
+			aRaw = new RawText(writeGitLinkText(ent.getOldId()));
+			bRaw = new RawText(writeGitLinkText(ent.getNewId()));
 		} else {
-			assertHaveReader();
-
-			byte[] aRaw, bRaw;
-
-			if (ent.getOldMode() == GITLINK || ent.getNewMode() == GITLINK) {
-				aRaw = writeGitLinkText(ent.getOldId());
-				bRaw = writeGitLinkText(ent.getNewId());
-			} else {
+			try {
 				aRaw = open(OLD, ent);
 				bRaw = open(NEW, ent);
-			}
-
-			if (aRaw == BINARY || bRaw == BINARY //
-					|| RawText.isBinary(aRaw) || RawText.isBinary(bRaw)) {
+			} catch (BinaryBlobException e) {
+				// Do nothing; we check for null below.
 				formatOldNewPaths(buf, ent);
 				buf.write(encodeASCII("Binary files differ\n")); //$NON-NLS-1$
 				editList = new EditList();
 				type = PatchType.BINARY;
-
-			} else {
-				res.a = new RawText(aRaw);
-				res.b = new RawText(bRaw);
-				editList = diff(res.a, res.b);
-				type = PatchType.UNIFIED;
-
-				switch (ent.getChangeType()) {
-				case RENAME:
-				case COPY:
-					if (!editList.isEmpty())
-						formatOldNewPaths(buf, ent);
-					break;
-
-				default:
-					formatOldNewPaths(buf, ent);
-					break;
-				}
+				res.header = new FileHeader(buf.toByteArray(), editList, type);
+				return res;
 			}
 		}
 
+		res.a = aRaw;
+		res.b = bRaw;
+		editList = diff(res.a, res.b);
+		type = PatchType.UNIFIED;
+
+		switch (ent.getChangeType()) {
+			case RENAME:
+			case COPY:
+				if (!editList.isEmpty())
+					formatOldNewPaths(buf, ent);
+				break;
+
+			default:
+				formatOldNewPaths(buf, ent);
+				break;
+		}
+
+
 		res.header = new FileHeader(buf.toByteArray(), editList, type);
 		return res;
 	}
@@ -1009,13 +1030,13 @@
 		}
 	}
 
-	private byte[] open(DiffEntry.Side side, DiffEntry entry)
-			throws IOException {
+	private RawText open(DiffEntry.Side side, DiffEntry entry)
+			throws IOException, BinaryBlobException {
 		if (entry.getMode(side) == FileMode.MISSING)
-			return EMPTY;
+			return RawText.EMPTY_TEXT;
 
 		if (entry.getMode(side).getObjectType() != Constants.OBJ_BLOB)
-			return EMPTY;
+			return RawText.EMPTY_TEXT;
 
 		AbbreviatedObjectId id = entry.getId(side);
 		if (!id.isComplete()) {
@@ -1036,23 +1057,8 @@
 				throw new AmbiguousObjectException(id, ids);
 		}
 
-		try {
-			ObjectLoader ldr = source.open(side, entry);
-			return ldr.getBytes(binaryFileThreshold);
-
-		} catch (LargeObjectException.ExceedsLimit overLimit) {
-			return BINARY;
-
-		} catch (LargeObjectException.ExceedsByteArrayLimit overLimit) {
-			return BINARY;
-
-		} catch (LargeObjectException.OutOfMemory tooBig) {
-			return BINARY;
-
-		} catch (LargeObjectException tooBig) {
-			tooBig.setObjectId(id.toObjectId());
-			throw tooBig;
-		}
+		ObjectLoader ldr = source.open(side, entry);
+		return RawText.load(ldr, binaryFileThreshold);
 	}
 
 	/**
@@ -1061,12 +1067,12 @@
 	 * @param o
 	 *            The stream the formatter will write the first header line to
 	 * @param type
-	 *            The {@link ChangeType}
+	 *            The {@link org.eclipse.jgit.diff.DiffEntry.ChangeType}
 	 * @param oldPath
 	 *            old path to the file
 	 * @param newPath
 	 *            new path to the file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream threw an exception while writing to it.
 	 */
 	protected void formatGitDiffFirstHeaderLine(ByteArrayOutputStream o,
@@ -1151,11 +1157,13 @@
 	}
 
 	/**
+	 * Format index line
+	 *
 	 * @param o
 	 *            the stream the formatter will write line data to
 	 * @param ent
 	 *            the DiffEntry to create the FileHeader for
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             writing to the supplied stream failed.
 	 */
 	protected void formatIndexLine(OutputStream o, DiffEntry ent)
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 a2e167f..775d11a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
@@ -118,7 +118,11 @@
 		endB = be;
 	}
 
-	/** @return the type of this region */
+	/**
+	 * Get type
+	 *
+	 * @return the type of this region
+	 */
 	public final Type getType() {
 		if (beginA < endA) {
 			if (beginB < endB)
@@ -134,37 +138,66 @@
 		}
 	}
 
-	/** @return true if the edit is empty (lengths of both a and b is zero). */
+	/**
+	 * Whether edit is empty
+	 *
+	 * @return {@code true} if the edit is empty (lengths of both a and b is
+	 *         zero)
+	 */
 	public final boolean isEmpty() {
 		return beginA == endA && beginB == endB;
 	}
 
-	/** @return start point in sequence A. */
+	/**
+	 * Get start point in sequence A
+	 *
+	 * @return start point in sequence A
+	 */
 	public final int getBeginA() {
 		return beginA;
 	}
 
-	/** @return end point in sequence A. */
+	/**
+	 * Get end point in sequence A
+	 *
+	 * @return end point in sequence A
+	 */
 	public final int getEndA() {
 		return endA;
 	}
 
-	/** @return start point in sequence B. */
+	/**
+	 * Get start point in sequence B
+	 *
+	 * @return start point in sequence B
+	 */
 	public final int getBeginB() {
 		return beginB;
 	}
 
-	/** @return end point in sequence B. */
+	/**
+	 * Get end point in sequence B
+	 *
+	 * @return end point in sequence B
+	 */
 	public final int getEndB() {
 		return endB;
 	}
 
-	/** @return length of the region in A. */
+	/**
+	 * Get length of the region in A
+	 *
+	 * @return length of the region in A
+	 */
 	public final int getLengthA() {
 		return endA - beginA;
 	}
 
-	/** @return length of the region in B. */
+	/**
+	 * Get length of the region in B
+	 *
+	 * @return return length of the region in B
+	 */
 	public final int getLengthB() {
 		return endB - beginB;
 	}
@@ -210,17 +243,23 @@
 		return new Edit(cut.endA, endA, cut.endB, endB);
 	}
 
-	/** Increase {@link #getEndA()} by 1. */
+	/**
+	 * Increase {@link #getEndA()} by 1.
+	 */
 	public void extendA() {
 		endA++;
 	}
 
-	/** Increase {@link #getEndB()} by 1. */
+	/**
+	 * Increase {@link #getEndB()} by 1.
+	 */
 	public void extendB() {
 		endB++;
 	}
 
-	/** Swap A and B, so the edit goes the other direction. */
+	/**
+	 * Swap A and B, so the edit goes the other direction.
+	 */
 	public void swap() {
 		final int sBegin = beginA;
 		final int sEnd = endA;
@@ -232,11 +271,13 @@
 		endB = sEnd;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return beginA ^ endA;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(final Object o) {
 		if (o instanceof Edit) {
@@ -247,6 +288,7 @@
 		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 14f7b42..617e0d8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/EditList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/EditList.java
@@ -45,7 +45,9 @@
 
 import java.util.ArrayList;
 
-/** Specialized list of {@link Edit}s in a document. */
+/**
+ * Specialized list of {@link org.eclipse.jgit.diff.Edit}s in a document.
+ */
 public class EditList extends ArrayList<Edit> {
 	private static final long serialVersionUID = 1L;
 
@@ -62,7 +64,9 @@
 		return res;
 	}
 
-	/** Create a new, empty edit list. */
+	/**
+	 * Create a new, empty edit list.
+	 */
 	public EditList() {
 		super(16);
 	}
@@ -78,6 +82,7 @@
 		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 cb1def6..0492120 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
@@ -44,13 +44,15 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Wraps a {@link Sequence} to assign hash codes to elements.
+ * Wraps a {@link org.eclipse.jgit.diff.Sequence} to assign hash codes to
+ * elements.
  * <p>
  * This sequence acts as a proxy for the real sequence, caching element hash
  * codes so they don't need to be recomputed each time. Sequences of this type
- * must be used with a {@link HashedSequenceComparator}.
+ * must be used with a {@link org.eclipse.jgit.diff.HashedSequenceComparator}.
  * <p>
- * To construct an instance of this type use {@link HashedSequencePair}.
+ * To construct an instance of this type use
+ * {@link org.eclipse.jgit.diff.HashedSequencePair}.
  *
  * @param <S>
  *            the base sequence type.
@@ -65,6 +67,7 @@
 		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 1ca7fdd..bd9618e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequenceComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequenceComparator.java
@@ -44,13 +44,16 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Wrap another comparator for use with {@link HashedSequence}.
+ * Wrap another comparator for use with
+ * {@link org.eclipse.jgit.diff.HashedSequence}.
  * <p>
  * This comparator acts as a proxy for the real comparator, evaluating the
  * cached hash code before testing the underlying comparator's equality.
- * Comparators of this type must be used with a {@link HashedSequence}.
+ * Comparators of this type must be used with a
+ * {@link org.eclipse.jgit.diff.HashedSequence}.
  * <p>
- * To construct an instance of this type use {@link HashedSequencePair}.
+ * To construct an instance of this type use
+ * {@link org.eclipse.jgit.diff.HashedSequencePair}.
  *
  * @param <S>
  *            the base sequence type.
@@ -63,6 +66,7 @@
 		this.cmp = cmp;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(HashedSequence<S> a, int ai, //
 			HashedSequence<S> b, int bi) {
@@ -70,6 +74,7 @@
 				&& 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/HashedSequencePair.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequencePair.java
index bf6d967..8d12015 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequencePair.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequencePair.java
@@ -44,7 +44,8 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Wraps two {@link Sequence} instances to cache their element hash codes.
+ * Wraps two {@link org.eclipse.jgit.diff.Sequence} instances to cache their
+ * element hash codes.
  * <p>
  * This pair wraps two sequences that contain cached hash codes for the input
  * sequences.
@@ -79,19 +80,31 @@
 		this.baseB = b;
 	}
 
-	/** @return obtain a comparator that uses the cached hash codes. */
+	/**
+	 * Get comparator
+	 *
+	 * @return obtain a comparator that uses the cached hash codes
+	 */
 	public HashedSequenceComparator<S> getComparator() {
 		return new HashedSequenceComparator<>(cmp);
 	}
 
-	/** @return wrapper around A that includes cached hash codes. */
+	/**
+	 * Get A
+	 *
+	 * @return wrapper around A that includes cached hash codes
+	 */
 	public HashedSequence<S> getA() {
 		if (cachedA == null)
 			cachedA = wrap(baseA);
 		return cachedA;
 	}
 
-	/** @return wrapper around B that includes cached hash codes. */
+	/**
+	 * Get B
+	 *
+	 * @return wrapper around B that includes cached hash codes
+	 */
 	public HashedSequence<S> getB() {
 		if (cachedB == null)
 			cachedB = wrap(baseB);
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 4ef5845..c1c6e9a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java
@@ -85,8 +85,9 @@
  * So long as {@link #setMaxChainLength(int)} is a small constant (such as 64),
  * the algorithm runs in O(N * D) time, where N is the sum of the input lengths
  * and D is the number of edits in the resulting EditList. If the supplied
- * {@link SequenceComparator} has a good hash function, this implementation
- * typically out-performs {@link MyersDiff}, even though its theoretical running
+ * {@link org.eclipse.jgit.diff.SequenceComparator} has a good hash function,
+ * this implementation typically out-performs
+ * {@link org.eclipse.jgit.diff.MyersDiff}, even though its theoretical running
  * time is the same.
  * <p>
  * This implementation has an internal limitation that prevents it from handling
@@ -130,6 +131,7 @@
 		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 55ceec8..9e5ff25 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/LowLevelDiffAlgorithm.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/LowLevelDiffAlgorithm.java
@@ -43,8 +43,11 @@
 
 package org.eclipse.jgit.diff;
 
-/** Compares two sequences primarily based upon hash codes. */
+/**
+ * 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) {
@@ -67,10 +70,9 @@
 	 * proven to have no common starting or ending elements. The expected
 	 * elimination of common starting and ending elements is automatically
 	 * performed by the {@link #diff(SequenceComparator, Sequence, Sequence)}
-	 * method, which invokes this method using {@link Subsequence}s.
+	 * method, which invokes this method using
+	 * {@link org.eclipse.jgit.diff.Subsequence}s.
 	 *
-	 * @param <S>
-	 *            type of sequence being compared.
 	 * @param edits
 	 *            result list to append the region's edits onto.
 	 * @param cmp
@@ -78,11 +80,13 @@
 	 * @param a
 	 *            the first (also known as old or pre-image) sequence. Edits
 	 *            returned by this algorithm will reference indexes using the
-	 *            'A' side: {@link Edit#getBeginA()}, {@link Edit#getEndA()}.
+	 *            'A' side: {@link org.eclipse.jgit.diff.Edit#getBeginA()},
+	 *            {@link org.eclipse.jgit.diff.Edit#getEndA()}.
 	 * @param b
 	 *            the second (also known as new or post-image) sequence. Edits
 	 *            returned by this algorithm will reference indexes using the
-	 *            'B' side: {@link Edit#getBeginB()}, {@link Edit#getEndB()}.
+	 *            'B' side: {@link org.eclipse.jgit.diff.Edit#getBeginB()},
+	 *            {@link org.eclipse.jgit.diff.Edit#getEndB()}.
 	 * @param region
 	 *            the region being compared within the two sequences.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/MyersDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/MyersDiff.java
index a3860de..646f264 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/MyersDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/MyersDiff.java
@@ -557,7 +557,10 @@
 	}
 
 	/**
-	 * @param args two filenames specifying the contents to be diffed
+	 * Main method
+	 *
+	 * @param args
+	 *            two filenames specifying the contents to be diffed
 	 */
 	public static void main(String[] args) {
 		if (args.length != 2) {
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 146b910..7f6aa9a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/PatchIdDiffFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/PatchIdDiffFormatter.java
@@ -58,7 +58,9 @@
 
 	private final MessageDigest digest;
 
-	/** Initialize a formatter to compute a patch id. */
+	/**
+	 * Initialize a formatter to compute a patch id.
+	 */
 	public PatchIdDiffFormatter() {
 		super(new DigestOutputStream(NullOutputStream.INSTANCE,
 				Constants.newMessageDigest()));
@@ -74,12 +76,14 @@
 		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 5bfee75..7be1659 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
@@ -44,11 +44,15 @@
 
 package org.eclipse.jgit.diff;
 
+import java.io.EOFException;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
+import org.eclipse.jgit.errors.BinaryBlobException;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.util.IO;
 import org.eclipse.jgit.util.IntList;
 import org.eclipse.jgit.util.RawParseUtils;
@@ -66,7 +70,7 @@
  * they are converting from "line number" to "element index".
  */
 public class RawText extends Sequence {
-	/** A Rawtext of length 0 */
+	/** A RawText of length 0 */
 	public static final RawText EMPTY_TEXT = new RawText(new byte[0]);
 
 	/** Number of bytes to check for heuristics in {@link #isBinary(byte[])} */
@@ -99,7 +103,7 @@
 	 *
 	 * @param file
 	 *            the text file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if Exceptions occur while reading the file
 	 */
 	public RawText(File file) throws IOException {
@@ -107,6 +111,7 @@
 	}
 
 	/** @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
@@ -131,7 +136,7 @@
 	 * @param i
 	 *            index of the line to extract. Note this is 0-based, so line
 	 *            number 1 is actually index 0.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream write operation failed.
 	 */
 	public void writeLine(final OutputStream out, final int i)
@@ -240,7 +245,7 @@
 	 * @param raw
 	 *            input stream containing the raw file content.
 	 * @return true if raw is likely to be a binary file, false otherwise
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if input stream could not be read
 	 */
 	public static boolean isBinary(InputStream raw) throws IOException {
@@ -295,4 +300,68 @@
 		else
 			return "\n"; //$NON-NLS-1$
 	}
+
+	/**
+	 * Read a blob object into RawText, or throw BinaryBlobException if the blob
+	 * is binary.
+	 *
+	 * @param ldr
+	 *            the ObjectLoader for the blob
+	 * @param threshold
+	 *            if the blob is larger than this size, it is always assumed to
+	 *            be binary.
+	 * @since 4.10
+	 * @return the RawText representing the blob.
+	 * @throws org.eclipse.jgit.errors.BinaryBlobException
+	 *             if the blob contains binary data.
+	 * @throws java.io.IOException
+	 *             if the input could not be read.
+	 */
+	public static RawText load(ObjectLoader ldr, int threshold) throws IOException, BinaryBlobException {
+		long sz = ldr.getSize();
+
+		if (sz > threshold) {
+			throw new BinaryBlobException();
+		}
+
+		if (sz <= FIRST_FEW_BYTES) {
+			byte[] data = ldr.getCachedBytes(FIRST_FEW_BYTES);
+			if (isBinary(data)) {
+				throw new BinaryBlobException();
+			}
+			return new RawText(data);
+		}
+
+		byte[] head = new byte[FIRST_FEW_BYTES];
+		try (InputStream stream = ldr.openStream()) {
+			int off = 0;
+			int left = head.length;
+			while (left > 0) {
+				int n = stream.read(head, off, left);
+				if (n < 0) {
+					throw new EOFException();
+				}
+				left -= n;
+
+				while (n > 0) {
+					if (head[off] == '\0') {
+						throw new BinaryBlobException();
+					}
+					off++;
+					n--;
+				}
+			}
+
+			byte data[];
+			try {
+				data = new byte[(int)sz];
+			} catch (OutOfMemoryError e) {
+				throw new LargeObjectException.OutOfMemory(e);
+			}
+
+			System.arraycopy(head, 0, data, 0, head.length);
+			IO.readFully(stream, data, off, (int) (sz-off));
+			return new RawText(data);
+		}
+	}
 }
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 2793fa2..ed2eebb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawTextComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawTextComparator.java
@@ -50,7 +50,9 @@
 
 import org.eclipse.jgit.util.IntList;
 
-/** Equivalence function for {@link RawText}. */
+/**
+ * Equivalence function for {@link org.eclipse.jgit.diff.RawText}.
+ */
 public abstract class RawTextComparator extends SequenceComparator<RawText> {
 	/** No special treatment. */
 	public static final RawTextComparator DEFAULT = new RawTextComparator() {
@@ -134,7 +136,9 @@
 		}
 	};
 
-	/** Ignores leading whitespace. */
+	/**
+	 * Ignore leading whitespace.
+	 **/
 	public static final RawTextComparator WS_IGNORE_LEADING = new RawTextComparator() {
 		@Override
 		public boolean equals(RawText a, int ai, RawText b, int bi) {
@@ -262,6 +266,7 @@
 		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 d899429..7bb217d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
@@ -65,7 +65,9 @@
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
 
-/** Detect and resolve object renames. */
+/**
+ * Detect and resolve object renames.
+ */
 public class RenameDetector {
 	private static final int EXACT_RENAME_SCORE = 100;
 
@@ -156,6 +158,8 @@
 	}
 
 	/**
+	 * Get rename score
+	 *
 	 * @return minimum score required to pair an add/delete as a rename. The
 	 *         score ranges are within the bounds of (0, 100).
 	 */
@@ -173,7 +177,7 @@
 	 *
 	 * @param score
 	 *            new rename score, must be within [0, 100].
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the score was not within [0, 100].
 	 */
 	public void setRenameScore(int score) {
@@ -184,6 +188,8 @@
 	}
 
 	/**
+	 * Get break score
+	 *
 	 * @return the similarity score required to keep modified file pairs
 	 *         together. Any modify pairs that score below this will be broken
 	 *         apart into separate add/deletes. Values less than or equal to
@@ -195,6 +201,8 @@
 	}
 
 	/**
+	 * Set break score
+	 *
 	 * @param breakScore
 	 *            the similarity score required to keep modified file pairs
 	 *            together. Any modify pairs that score below this will be
@@ -206,7 +214,11 @@
 		this.breakScore = breakScore;
 	}
 
-	/** @return limit on number of paths to perform inexact rename detection. */
+	/**
+	 * Get rename limit
+	 *
+	 * @return limit on number of paths to perform inexact rename detection
+	 */
 	public int getRenameLimit() {
 		return renameLimit;
 	}
@@ -250,7 +262,7 @@
 	 *
 	 * @param entriesToAdd
 	 *            one or more entries to add.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if {@code getEntries} was already invoked.
 	 */
 	public void addAll(Collection<DiffEntry> entriesToAdd) {
@@ -290,7 +302,7 @@
 	 *
 	 * @param entry
 	 *            to add.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if {@code getEntries} was already invoked.
 	 */
 	public void add(DiffEntry entry) {
@@ -302,9 +314,9 @@
 	 * <p>
 	 * This convenience function runs without a progress monitor.
 	 *
-	 * @return an unmodifiable list of {@link DiffEntry}s representing all files
-	 *         that have been changed.
-	 * @throws IOException
+	 * @return an unmodifiable list of {@link org.eclipse.jgit.diff.DiffEntry}s
+	 *         representing all files that have been changed.
+	 * @throws java.io.IOException
 	 *             file contents cannot be read from the repository.
 	 */
 	public List<DiffEntry> compute() throws IOException {
@@ -316,9 +328,9 @@
 	 *
 	 * @param pm
 	 *            report progress during the detection phases.
-	 * @return an unmodifiable list of {@link DiffEntry}s representing all files
-	 *         that have been changed.
-	 * @throws IOException
+	 * @return an unmodifiable list of {@link org.eclipse.jgit.diff.DiffEntry}s
+	 *         representing all files that have been changed.
+	 * @throws java.io.IOException
 	 *             file contents cannot be read from the repository.
 	 */
 	public List<DiffEntry> compute(ProgressMonitor pm) throws IOException {
@@ -339,9 +351,9 @@
 	 *            reader to obtain objects from the repository with.
 	 * @param pm
 	 *            report progress during the detection phases.
-	 * @return an unmodifiable list of {@link DiffEntry}s representing all files
-	 *         that have been changed.
-	 * @throws IOException
+	 * @return an unmodifiable list of {@link org.eclipse.jgit.diff.DiffEntry}s
+	 *         representing all files that have been changed.
+	 * @throws java.io.IOException
 	 *             file contents cannot be read from the repository.
 	 */
 	public List<DiffEntry> compute(ObjectReader reader, ProgressMonitor pm)
@@ -357,9 +369,9 @@
 	 *            reader to obtain objects from the repository with.
 	 * @param pm
 	 *            report progress during the detection phases.
-	 * @return an unmodifiable list of {@link DiffEntry}s representing all files
-	 *         that have been changed.
-	 * @throws IOException
+	 * @return an unmodifiable list of {@link org.eclipse.jgit.diff.DiffEntry}s
+	 *         representing all files that have been changed.
+	 * @throws java.io.IOException
 	 *             file contents cannot be read from the repository.
 	 */
 	public List<DiffEntry> compute(ContentSource.Pair reader, ProgressMonitor pm)
@@ -393,7 +405,9 @@
 		return Collections.unmodifiableList(entries);
 	}
 
-	/** Reset this rename detector for another rename detection pass. */
+	/**
+	 * Reset this rename detector for another rename detection pass.
+	 */
 	public void reset() {
 		entries = new ArrayList<>();
 		deleted = new ArrayList<>();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Sequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Sequence.java
index 53ab2f9..c475132 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Sequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Sequence.java
@@ -52,13 +52,19 @@
  * Unlike a List, the members of the sequence are not directly obtainable.
  * <p>
  * Implementations of Sequence are primarily intended for use in content
- * difference detection algorithms, to produce an {@link EditList} of
- * {@link Edit} instances describing how two Sequence instances differ.
+ * difference detection algorithms, to produce an
+ * {@link org.eclipse.jgit.diff.EditList} of {@link org.eclipse.jgit.diff.Edit}
+ * instances describing how two Sequence instances differ.
  * <p>
  * To be compared against another Sequence of the same type, a supporting
- * {@link SequenceComparator} must also be supplied.
+ * {@link org.eclipse.jgit.diff.SequenceComparator} must also be supplied.
  */
 public abstract class Sequence {
 	/** @return total number of items in the sequence. */
+	/**
+	 * Get size
+	 *
+	 * @return size
+	 */
 	public abstract int size();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SequenceComparator.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SequenceComparator.java
index cc38d4b..ccd0055 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SequenceComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SequenceComparator.java
@@ -44,7 +44,8 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Equivalence function for a {@link Sequence} compared by difference algorithm.
+ * Equivalence function for a {@link org.eclipse.jgit.diff.Sequence} compared by
+ * difference algorithm.
  * <p>
  * Difference algorithms can use a comparator to compare portions of two
  * sequences and discover the minimal edits required to transform from one
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java
index 1c40d7f..8b4d2ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java
@@ -56,8 +56,9 @@
  * Index structure of lines/blocks in one file.
  * <p>
  * This structure can be used to compute an approximation of the similarity
- * between two files. The index is used by {@link SimilarityRenameDetector} to
- * compute scores between files.
+ * between two files. The index is used by
+ * {@link org.eclipse.jgit.diff.SimilarityRenameDetector} to compute scores
+ * between files.
  * <p>
  * To save space in memory, this index uses a space efficient encoding which
  * will not exceed 1 MiB per instance. The index starts out at a smaller size
@@ -114,9 +115,9 @@
 	 * @param obj
 	 *            the object to hash
 	 * @return similarity index for this object
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             file contents cannot be read from the repository.
-	 * @throws TableFullException
+	 * @throws org.eclipse.jgit.diff.SimilarityIndex.TableFullException
 	 *             object hashing overflowed the storage capacity of the
 	 *             SimilarityIndex.
 	 */
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 50ca613..aa10f6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java
@@ -44,11 +44,12 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Wraps a {@link Sequence} to have a narrower range of elements.
+ * Wraps a {@link org.eclipse.jgit.diff.Sequence} to have a narrower range of
+ * elements.
  * <p>
  * This sequence acts as a proxy for the real sequence, translating element
  * indexes on the fly by adding {@code begin} to them. Sequences of this type
- * must be used with a {@link SubsequenceComparator}.
+ * must be used with a {@link org.eclipse.jgit.diff.SubsequenceComparator}.
  *
  * @param <S>
  *            the base sequence type.
@@ -57,8 +58,6 @@
 	/**
 	 * Construct a subsequence around the A region/base sequence.
 	 *
-	 * @param <S>
-	 *            the base sequence type.
 	 * @param a
 	 *            the A sequence.
 	 * @param region
@@ -72,8 +71,6 @@
 	/**
 	 * Construct a subsequence around the B region/base sequence.
 	 *
-	 * @param <S>
-	 *            the base sequence type.
 	 * @param b
 	 *            the B sequence.
 	 * @param region
@@ -87,8 +84,6 @@
 	/**
 	 * Adjust the Edit to reflect positions in the base sequence.
 	 *
-	 * @param <S>
-	 *            the base sequence type.
 	 * @param e
 	 *            edit to adjust in-place. Prior to invocation the indexes are
 	 *            in terms of the two subsequences; after invocation the indexes
@@ -110,8 +105,6 @@
 	/**
 	 * Adjust the Edits to reflect positions in the base sequence.
 	 *
-	 * @param <S>
-	 *            the base sequence type.
 	 * @param edits
 	 *            edits to adjust in-place. Prior to invocation the indexes are
 	 *            in terms of the two subsequences; after invocation the indexes
@@ -156,6 +149,7 @@
 		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 dff2a42..9b3889b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java
@@ -44,11 +44,13 @@
 package org.eclipse.jgit.diff;
 
 /**
- * Wrap another comparator for use with {@link Subsequence}.
+ * Wrap another comparator for use with
+ * {@link org.eclipse.jgit.diff.Subsequence}.
  * <p>
  * This comparator acts as a proxy for the real comparator, translating element
  * indexes on the fly by adding the subsequence's begin offset to them.
- * Comparators of this type must be used with a {@link Subsequence}.
+ * Comparators of this type must be used with a
+ * {@link org.eclipse.jgit.diff.Subsequence}.
  *
  * @param <S>
  *            the base sequence type.
@@ -67,11 +69,13 @@
 		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 0fbc1f8..0228f4d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/BaseDirCacheEditor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/BaseDirCacheEditor.java
@@ -91,6 +91,8 @@
 	}
 
 	/**
+	 * Get the {@code DirCache}
+	 *
 	 * @return the cache we will update on {@link #finish()}.
 	 */
 	public DirCache getDirCache() {
@@ -152,7 +154,8 @@
 	}
 
 	/**
-	 * Finish this builder and update the destination {@link DirCache}.
+	 * Finish this builder and update the destination
+	 * {@link org.eclipse.jgit.dircache.DirCache}.
 	 * <p>
 	 * When this method completes this builder instance is no longer usable by
 	 * the calling application. A new builder must be created to make additional
@@ -263,9 +266,9 @@
 	 * @return true if the commit was successful and the file contains the new
 	 *         data; false if the commit failed and the file remains with the
 	 *         old data.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             the lock is not held.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output file could not be created. The caller no longer
 	 *             holds the lock.
 	 */
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 ce52fed..cc431db 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
@@ -158,7 +158,7 @@
 	 *            tree to read. Must identify a tree, not a tree-ish.
 	 * @return a new cache which has no backing store file, but contains the
 	 *         contents of {@code treeId}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             one or more trees not available from the ObjectReader.
 	 * @since 4.2
 	 */
@@ -182,9 +182,9 @@
 	 *            repository containing the index to read
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -209,9 +209,9 @@
 	 *            certain file system operations.
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -237,10 +237,10 @@
 	 *            certain file system operations.
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read, or the lock
 	 *             could not be obtained.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -280,10 +280,10 @@
 	 *            listener to be informed when DirCache is committed
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read, or the lock
 	 *             could not be obtained.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 * @since 2.0
@@ -314,10 +314,10 @@
 	 *            listener to be informed when DirCache is committed
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read, or the lock
 	 *             could not be obtained.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -381,7 +381,8 @@
 	 * Create a new builder to update this cache.
 	 * <p>
 	 * Callers should add all entries to the builder, then use
-	 * {@link DirCacheBuilder#finish()} to update this instance.
+	 * {@link org.eclipse.jgit.dircache.DirCacheBuilder#finish()} to update this
+	 * instance.
 	 *
 	 * @return a new builder instance for this cache.
 	 */
@@ -393,7 +394,8 @@
 	 * Create a new editor to recreate this cache.
 	 * <p>
 	 * Callers should add commands to the editor, then use
-	 * {@link DirCacheEditor#finish()} to update this instance.
+	 * {@link org.eclipse.jgit.dircache.DirCacheEditor#finish()} to update this
+	 * instance.
 	 *
 	 * @return a new builder instance for this cache.
 	 */
@@ -414,10 +416,10 @@
 	 * the last time we consulted it. A missing index file will be treated as
 	 * though it were present but had no file entries in it.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read. This
 	 *             DirCache instance may not be populated correctly.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -456,8 +458,10 @@
 	}
 
 	/**
-	 * @return true if the memory state differs from the index file
-	 * @throws IOException
+	 * Whether the memory state differs from the index file
+	 *
+	 * @return {@code true} if the memory state differs from the index file
+	 * @throws java.io.IOException
 	 */
 	public boolean isOutdated() throws IOException {
 		if (liveFile == null || !liveFile.exists())
@@ -465,7 +469,9 @@
 		return snapshot == null || snapshot.isModified(liveFile);
 	}
 
-	/** Empty this index, removing all entries. */
+	/**
+	 * Empty this index, removing all entries.
+	 */
 	public void clear() {
 		snapshot = null;
 		sortedEntries = NO_ENTRIES;
@@ -601,7 +607,7 @@
 	 *
 	 * @return true if the lock is now held by the caller; false if it is held
 	 *         by someone else.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output file could not be created. The caller does not
 	 *             hold the lock.
 	 */
@@ -628,7 +634,7 @@
 	 * Once written the lock is closed and must be either committed with
 	 * {@link #commit()} or rolled back with {@link #unlock()}.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output file could not be created. The caller no longer
 	 *             holds the lock.
 	 */
@@ -655,8 +661,12 @@
 		final DigestOutputStream dos = new DigestOutputStream(os, foot);
 
 		boolean extended = false;
-		for (int i = 0; i < entryCnt; i++)
-			extended |= sortedEntries[i].isExtended();
+		for (int i = 0; i < entryCnt; i++) {
+			if (sortedEntries[i].isExtended()) {
+				extended = true;
+				break;
+			}
+		}
 
 		// Write the header.
 		//
@@ -726,7 +736,7 @@
 	 * @return true if the commit was successful and the file contains the new
 	 *         data; false if the commit failed and the file remains with the
 	 *         old data.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             the lock is not held.
 	 */
 	public boolean commit() {
@@ -953,13 +963,13 @@
 	 *            responsible for flushing the inserter before trying to use the
 	 *            returned tree identity.
 	 * @return identity for the root tree.
-	 * @throws UnmergedPathException
+	 * @throws org.eclipse.jgit.errors.UnmergedPathException
 	 *             one or more paths contain higher-order stages (stage &gt; 0),
 	 *             which cannot be stored in a tree object.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             one or more paths contain an invalid mode which should never
 	 *             appear in a tree object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an unexpected error occurred writing to the object store.
 	 */
 	public ObjectId writeTree(final ObjectInserter ow)
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 c10e416..6e3682a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuildIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuildIterator.java
@@ -54,12 +54,14 @@
 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
 
 /**
- * Iterate and update a {@link DirCache} as part of a <code>TreeWalk</code>.
+ * Iterate and update a {@link org.eclipse.jgit.dircache.DirCache} as part of a
+ * <code>TreeWalk</code>.
  * <p>
- * Like {@link DirCacheIterator} this iterator allows a DirCache to be used in
- * parallel with other sorts of iterators in a TreeWalk. However any entry which
- * appears in the source DirCache and which is skipped by the TreeFilter is
- * automatically copied into {@link DirCacheBuilder}, thus retaining it in the
+ * Like {@link org.eclipse.jgit.dircache.DirCacheIterator} this iterator allows
+ * a DirCache to be used in parallel with other sorts of iterators in a
+ * TreeWalk. However any entry which appears in the source DirCache and which is
+ * skipped by the TreeFilter is automatically copied into
+ * {@link org.eclipse.jgit.dircache.DirCacheBuilder}, thus retaining it in the
  * newly updated index.
  * <p>
  * This iterator is suitable for update processes, or even a simple delete
@@ -105,6 +107,7 @@
 		builder = p.builder;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(final ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
@@ -114,6 +117,7 @@
 		return new DirCacheBuildIterator(this, currentSubtree);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void skip() throws CorruptObjectException {
 		if (currentSubtree != null)
@@ -123,6 +127,7 @@
 		next(1);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void stopWalk() {
 		final int cur = ptr;
@@ -131,6 +136,7 @@
 			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 676a6ab..2ff7bb9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java
@@ -57,7 +57,8 @@
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 
 /**
- * Updates a {@link DirCache} by adding individual {@link DirCacheEntry}s.
+ * Updates a {@link org.eclipse.jgit.dircache.DirCache} by adding individual
+ * {@link org.eclipse.jgit.dircache.DirCacheEntry}s.
  * <p>
  * A builder always starts from a clean slate and appends in every single
  * <code>DirCacheEntry</code> which the final updated index must have to reflect
@@ -98,7 +99,7 @@
 	 *
 	 * @param newEntry
 	 *            the new entry to add.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             If the FileMode of the entry was not set by the caller.
 	 */
 	public void add(final DirCacheEntry newEntry) {
@@ -161,7 +162,7 @@
 	 *            under <code>pathPrefix</code>. The ObjectId must be that of a
 	 *            tree; the caller is responsible for dereferencing a tag or
 	 *            commit (if necessary).
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a tree cannot be read to iterate through its entries.
 	 */
 	public void addTree(byte[] pathPrefix, int stage, ObjectReader reader,
@@ -218,6 +219,7 @@
 		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 a6ab9c8..d41a1f5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
@@ -42,6 +42,8 @@
 
 package org.eclipse.jgit.dircache;
 
+import static org.eclipse.jgit.treewalk.TreeWalk.OperationType.CHECKOUT_OP;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -157,6 +159,8 @@
 	private boolean performingCheckout;
 
 	/**
+	 * Get list of updated paths and smudgeFilterCommands
+	 *
 	 * @return a list of updated paths and smudgeFilterCommands
 	 */
 	public Map<String, CheckoutMetadata> getUpdated() {
@@ -164,6 +168,8 @@
 	}
 
 	/**
+	 * Get a list of conflicts created by this checkout
+	 *
 	 * @return a list of conflicts created by this checkout
 	 */
 	public List<String> getConflicts() {
@@ -171,19 +177,24 @@
 	}
 
 	/**
+	 * Get list of paths of files which couldn't be deleted during last call to
+	 * {@link #checkout()}
+	 *
 	 * @return a list of paths (relative to the start of the working tree) of
 	 *         files which couldn't be deleted during last call to
 	 *         {@link #checkout()} . {@link #checkout()} detected that these
 	 *         files should be deleted but the deletion in the filesystem failed
 	 *         (e.g. because a file was locked). To have a consistent state of
 	 *         the working tree these files have to be deleted by the callers of
-	 *         {@link DirCacheCheckout}.
+	 *         {@link org.eclipse.jgit.dircache.DirCacheCheckout}.
 	 */
 	public List<String> getToBeDeleted() {
 		return toBeDeleted;
 	}
 
 	/**
+	 * Get list of all files removed by this checkout
+	 *
 	 * @return a list of all files removed by this checkout
 	 */
 	public List<String> getRemoved() {
@@ -204,7 +215,7 @@
 	 *            the id of the tree we want to fast-forward to
 	 * @param workingTree
 	 *            an iterator over the repositories Working Tree
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public DirCacheCheckout(Repository repo, ObjectId headCommitTree, DirCache dc,
 			ObjectId mergeCommitTree, WorkingTreeIterator workingTree)
@@ -220,7 +231,8 @@
 	/**
 	 * Constructs a DirCacheCeckout for merging and checking out two trees (HEAD
 	 * and mergeCommitTree) and the index. As iterator over the working tree
-	 * this constructor creates a standard {@link FileTreeIterator}
+	 * this constructor creates a standard
+	 * {@link org.eclipse.jgit.treewalk.FileTreeIterator}
 	 *
 	 * @param repo
 	 *            the repository in which we do the checkout
@@ -230,7 +242,7 @@
 	 *            the (already locked) Dircache for this repo
 	 * @param mergeCommitTree
 	 *            the id of the tree we want to fast-forward to
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public DirCacheCheckout(Repository repo, ObjectId headCommitTree,
 			DirCache dc, ObjectId mergeCommitTree) throws IOException {
@@ -249,7 +261,7 @@
 	 *            the id of the tree we want to fast-forward to
 	 * @param workingTree
 	 *            an iterator over the repositories Working Tree
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public DirCacheCheckout(Repository repo, DirCache dc,
 			ObjectId mergeCommitTree, WorkingTreeIterator workingTree)
@@ -260,7 +272,7 @@
 	/**
 	 * Constructs a DirCacheCeckout for checking out one tree, merging with the
 	 * index. As iterator over the working tree this constructor creates a
-	 * standard {@link FileTreeIterator}
+	 * standard {@link org.eclipse.jgit.treewalk.FileTreeIterator}
 	 *
 	 * @param repo
 	 *            the repository in which we do the checkout
@@ -268,7 +280,7 @@
 	 *            the (already locked) Dircache for this repo
 	 * @param mergeCommitTree
 	 *            the id of the tree of the
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public DirCacheCheckout(Repository repo, DirCache dc,
 			ObjectId mergeCommitTree) throws IOException {
@@ -279,8 +291,8 @@
 	 * Scan head, index and merge tree. Used during normal checkout or merge
 	 * operations.
 	 *
-	 * @throws CorruptObjectException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 * @throws java.io.IOException
 	 */
 	public void preScanTwoTrees() throws CorruptObjectException, IOException {
 		removed.clear();
@@ -316,10 +328,10 @@
 	 * Scan index and merge tree (no HEAD). Used e.g. for initial checkout when
 	 * there is no head yet.
 	 *
-	 * @throws MissingObjectException
-	 * @throws IncorrectObjectTypeException
-	 * @throws CorruptObjectException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 * @throws java.io.IOException
 	 */
 	public void prescanOneTree()
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -437,7 +449,8 @@
 	}
 
 	/**
-	 * Execute this checkout. A {@link WorkingTreeModifiedEvent} is fired if the
+	 * Execute this checkout. A
+	 * {@link org.eclipse.jgit.events.WorkingTreeModifiedEvent} is fired if the
 	 * working tree was modified; even if the checkout fails.
 	 *
 	 * @return <code>false</code> if this method could not delete all the files
@@ -447,8 +460,7 @@
 	 *         Although <code>false</code> is returned the checkout was
 	 *         successful and the working tree was updated for all other files.
 	 *         <code>true</code> is returned when no such problem occurred
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public boolean checkout() throws IOException {
 		try {
@@ -1148,7 +1160,8 @@
 	private void update(String path, ObjectId mId, FileMode mode)
 			throws IOException {
 		if (!FileMode.TREE.equals(mode)) {
-			updated.put(path, new CheckoutMetadata(walk.getEolStreamType(),
+			updated.put(path, new CheckoutMetadata(
+					walk.getEolStreamType(CHECKOUT_OP),
 					walk.getFilterCommand(Constants.ATTR_FILTER_TYPE_SMUDGE)));
 
 			DirCacheEntry entry = new DirCacheEntry(path, DirCacheEntry.STAGE_0);
@@ -1160,10 +1173,12 @@
 
 	/**
 	 * If <code>true</code>, will scan first to see if it's possible to check
-	 * out, otherwise throw {@link CheckoutConflictException}. If
+	 * out, otherwise throw
+	 * {@link org.eclipse.jgit.errors.CheckoutConflictException}. If
 	 * <code>false</code>, it will silently deal with the problem.
 	 *
 	 * @param failOnConflict
+	 *            a boolean.
 	 */
 	public void setFailOnConflict(boolean failOnConflict) {
 		this.failOnConflict = failOnConflict;
@@ -1283,8 +1298,8 @@
 	 * <p>
 	 * <b>Note:</b> if the entry path on local file system exists as a non-empty
 	 * directory, and the target entry type is a link or file, the checkout will
-	 * fail with {@link IOException} since existing non-empty directory cannot
-	 * be renamed to file or link without deleting it recursively.
+	 * fail with {@link java.io.IOException} since existing non-empty directory
+	 * cannot be renamed to file or link without deleting it recursively.
 	 * </p>
 	 *
 	 * <p>
@@ -1299,7 +1314,7 @@
 	 *            the entry containing new mode and content
 	 * @param or
 	 *            object reader to use for checkout
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.6
 	 */
 	public static void checkoutEntry(Repository repo, DirCacheEntry entry,
@@ -1341,8 +1356,7 @@
 	 *            checked out</li>
 	 *            <li>eolStreamType used for stream conversion</li>
 	 *            </ul>
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	public static void checkoutEntry(Repository repo, DirCacheEntry entry,
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 22bedcf..30e3a3c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java
@@ -60,14 +60,16 @@
 import org.eclipse.jgit.util.Paths;
 
 /**
- * Updates a {@link DirCache} by supplying discrete edit commands.
+ * Updates a {@link org.eclipse.jgit.dircache.DirCache} by supplying discrete
+ * edit commands.
  * <p>
- * An editor updates a DirCache by taking a list of {@link PathEdit} commands
- * and executing them against the entries of the destination cache to produce a
- * new cache. This edit style allows applications to insert a few commands and
- * then have the editor compute the proper entry indexes necessary to perform an
+ * An editor updates a DirCache by taking a list of
+ * {@link org.eclipse.jgit.dircache.DirCacheEditor.PathEdit} commands and
+ * executing them against the entries of the destination cache to produce a new
+ * cache. This edit style allows applications to insert a few commands and then
+ * 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 DirCacheBuilder}.
+ * than {@link org.eclipse.jgit.dircache.DirCacheBuilder}.
  * <p>
  *
  * @see DirCacheBuilder
@@ -113,6 +115,7 @@
 		edits.add(edit);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean commit() throws IOException {
 		if (edits.isEmpty()) {
@@ -124,6 +127,7 @@
 		return super.commit();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void finish() {
 		if (!edits.isEmpty()) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java
index 4ebf2e0..7c03c64 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java
@@ -68,7 +68,8 @@
 import org.eclipse.jgit.util.SystemReader;
 
 /**
- * A single file (or stage of a file) in a {@link DirCache}.
+ * A single file (or stage of a file) in a
+ * {@link org.eclipse.jgit.dircache.DirCache}.
  * <p>
  * An entry represents exactly one stage of a file. If a file path is unmerged
  * then multiple DirCacheEntry instances may appear for the same path name.
@@ -221,7 +222,7 @@
 	 *
 	 * @param newPath
 	 *            name of the cache entry.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             If the path starts or ends with "/", or contains "//" either
 	 *             "\0". These sequences are not permitted in a git tree object
 	 *             or DirCache file.
@@ -237,7 +238,7 @@
 	 *            name of the cache entry.
 	 * @param stage
 	 *            the stage index of the new entry.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             If the path starts or ends with "/", or contains "//" either
 	 *             "\0". These sequences are not permitted in a git tree object
 	 *             or DirCache file.  Or if {@code stage} is outside of the
@@ -252,7 +253,7 @@
 	 *
 	 * @param newPath
 	 *            name of the cache entry, in the standard encoding.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             If the path starts or ends with "/", or contains "//" either
 	 *             "\0". These sequences are not permitted in a git tree object
 	 *             or DirCache file.
@@ -268,7 +269,7 @@
 	 *            name of the cache entry, in the standard encoding.
 	 * @param stage
 	 *            the stage index of the new entry.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             If the path starts or ends with "/", or contains "//" either
 	 *             "\0". These sequences are not permitted in a git tree object
 	 *             or DirCache file.  Or if {@code stage} is outside of the
@@ -378,8 +379,9 @@
 	/**
 	 * Check whether this entry has been smudged or not
 	 * <p>
-	 * If a blob has length 0 we know his id see {@link Constants#EMPTY_BLOB_ID}. If an entry
-	 * has length 0 and an ID different from the one for empty blob we know this
+	 * If a blob has length 0 we know its id, see
+	 * {@link org.eclipse.jgit.lib.Constants#EMPTY_BLOB_ID}. If an entry has
+	 * length 0 and an ID different from the one for empty blob we know this
 	 * entry was smudged.
 	 *
 	 * @return <code>true</code> if the entry is smudged, <code>false</code>
@@ -426,7 +428,9 @@
 	}
 
 	/**
-	 * @return true if this entry should be checked for changes
+	 * Whether this entry should be checked for changes
+	 *
+	 * @return {@code true} if this entry should be checked for changes
 	 */
 	public boolean isUpdateNeeded() {
 		return (inCoreFlags & UPDATE_NEEDED) != 0;
@@ -436,6 +440,7 @@
 	 * Set whether this entry must be checked for changes
 	 *
 	 * @param updateNeeded
+	 *            whether this entry must be checked for changes
 	 */
 	public void setUpdateNeeded(boolean updateNeeded) {
 		if (updateNeeded)
@@ -484,7 +489,7 @@
 	}
 
 	/**
-	 * Obtain the raw {@link FileMode} bits for this entry.
+	 * Obtain the raw {@link org.eclipse.jgit.lib.FileMode} bits for this entry.
 	 *
 	 * @return mode bits for the entry.
 	 * @see FileMode#fromBits(int)
@@ -494,7 +499,7 @@
 	}
 
 	/**
-	 * Obtain the {@link FileMode} for this entry.
+	 * Obtain the {@link org.eclipse.jgit.lib.FileMode} for this entry.
 	 *
 	 * @return the file mode singleton for this entry.
 	 */
@@ -507,10 +512,11 @@
 	 *
 	 * @param mode
 	 *            the new mode constant.
-	 * @throws IllegalArgumentException
-	 *             If {@code mode} is {@link FileMode#MISSING},
-	 *             {@link FileMode#TREE}, or any other type code not permitted
-	 *             in a tree object.
+	 * @throws java.lang.IllegalArgumentException
+	 *             If {@code mode} is
+	 *             {@link org.eclipse.jgit.lib.FileMode#MISSING},
+	 *             {@link org.eclipse.jgit.lib.FileMode#TREE}, or any other type
+	 *             code not permitted in a tree object.
 	 */
 	public void setFileMode(final FileMode mode) {
 		switch (mode.getBits() & FileMode.TYPE_MASK) {
@@ -629,7 +635,8 @@
 	 *
 	 * @param id
 	 *            new object identifier for the entry. May be
-	 *            {@link ObjectId#zeroId()} to remove the current identifier.
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to remove the
+	 *            current identifier.
 	 */
 	public void setObjectId(final AnyObjectId id) {
 		id.copyRawTo(idBuffer(), idOffset());
@@ -676,6 +683,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Use for debugging only !
 	 */
 	@SuppressWarnings("nls")
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 ad93f72..68521d3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheIterator.java
@@ -61,7 +61,8 @@
 import org.eclipse.jgit.util.RawParseUtils;
 
 /**
- * Iterate a {@link DirCache} as part of a <code>TreeWalk</code>.
+ * Iterate a {@link org.eclipse.jgit.dircache.DirCache} as part of a
+ * <code>TreeWalk</code>.
  * <p>
  * This is an iterator to adapt a loaded <code>DirCache</code> instance (such as
  * read from an existing <code>.git/index</code> file) to the tree structure
@@ -134,6 +135,7 @@
 		parseEntry();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(final ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
@@ -143,6 +145,7 @@
 		return new DirCacheIterator(this, currentSubtree);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public EmptyTreeIterator createEmptyTreeIterator() {
 		final byte[] n = new byte[Math.max(pathLen + 1, DEFAULT_PATH_SIZE)];
@@ -151,6 +154,7 @@
 		return new EmptyTreeIterator(this, n, pathLen + 1);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean hasId() {
 		if (currentSubtree != null)
@@ -158,6 +162,7 @@
 		return currentEntry != null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public byte[] idBuffer() {
 		if (currentSubtree != null)
@@ -167,6 +172,7 @@
 		return zeroid;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int idOffset() {
 		if (currentSubtree != null)
@@ -176,6 +182,7 @@
 		return 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		if (!first()) {
@@ -188,16 +195,19 @@
 		}
 	}
 
+	/** {@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) {
@@ -211,6 +221,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void back(int delta) {
 		while (--delta >= 0) {
@@ -282,12 +293,15 @@
 	}
 
 	/**
-	 * Retrieves the {@link AttributesNode} for the current entry.
+	 * Retrieves the {@link org.eclipse.jgit.attributes.AttributesNode} for the
+	 * current entry.
 	 *
 	 * @param reader
-	 *            {@link ObjectReader} used to parse the .gitattributes entry.
-	 * @return {@link AttributesNode} for the current entry.
-	 * @throws IOException
+	 *            {@link org.eclipse.jgit.lib.ObjectReader} used to parse the
+	 *            .gitattributes entry.
+	 * @return {@link org.eclipse.jgit.attributes.AttributesNode} for the
+	 *         current entry.
+	 * @throws java.io.IOException
 	 * @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 a06f9d3..dc825d4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java
@@ -62,13 +62,14 @@
 import org.eclipse.jgit.util.RawParseUtils;
 
 /**
- * Single tree record from the 'TREE' {@link DirCache} extension.
+ * Single tree record from the 'TREE' {@link org.eclipse.jgit.dircache.DirCache}
+ * extension.
  * <p>
  * A valid cache tree record contains the object id of a tree object and the
- * total number of {@link DirCacheEntry} instances (counted recursively) from
- * the DirCache contained within the tree. This information facilitates faster
- * traversal of the index and quicker generation of tree objects prior to
- * creating a new commit.
+ * total number of {@link org.eclipse.jgit.dircache.DirCacheEntry} instances
+ * (counted recursively) from the DirCache contained within the tree. This
+ * information facilitates faster traversal of the index and quicker generation
+ * of tree objects prior to creating a new commit.
  * <p>
  * An invalid cache tree record indicates a known subtree whose file entries
  * have changed in ways that cause the tree to no longer have a known object id.
@@ -205,10 +206,11 @@
 	/**
 	 * Determine if this cache is currently valid.
 	 * <p>
-	 * A valid cache tree knows how many {@link DirCacheEntry} instances from
-	 * the parent {@link DirCache} reside within this tree (recursively
-	 * enumerated). It also knows the object id of the tree, as the tree should
-	 * be readily available from the repository's object database.
+	 * A valid cache tree knows how many
+	 * {@link org.eclipse.jgit.dircache.DirCacheEntry} instances from the parent
+	 * {@link org.eclipse.jgit.dircache.DirCache} reside within this tree
+	 * (recursively enumerated). It also knows the object id of the tree, as the
+	 * tree should be readily available from the repository's object database.
 	 *
 	 * @return true if this tree is knows key details about itself; false if the
 	 *         tree needs to be regenerated.
@@ -563,6 +565,7 @@
 		return -1;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return getNameString();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/InvalidPathException.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/InvalidPathException.java
index 50d1c4c..7e81b8b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/InvalidPathException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/InvalidPathException.java
@@ -57,7 +57,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for InvalidPathException
+	 *
 	 * @param path
+	 *            the invalid path
 	 */
 	public InvalidPathException(String path) {
 		this(JGitText.get().invalidPath, path);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/AmbiguousObjectException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/AmbiguousObjectException.java
index 93d57f0..389ec45 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/AmbiguousObjectException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/AmbiguousObjectException.java
@@ -51,7 +51,9 @@
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 
-/** An {@link AbbreviatedObjectId} cannot be extended. */
+/**
+ * An {@link org.eclipse.jgit.lib.AbbreviatedObjectId} cannot be extended.
+ */
 public class AmbiguousObjectException extends IOException {
 	private static final long serialVersionUID = 1L;
 
@@ -76,12 +78,20 @@
 		this.candidates = candidates;
 	}
 
-	/** @return the AbbreviatedObjectId that has more than one result. */
+	/**
+	 * Get the {@code AbbreviatedObjectId} that has more than one result
+	 *
+	 * @return the {@code AbbreviatedObjectId} that has more than one result
+	 */
 	public AbbreviatedObjectId getAbbreviatedObjectId() {
 		return missing;
 	}
 
-	/** @return the matching candidates (or at least a subset of them). */
+	/**
+	 * Get the matching candidates (or at least a subset of them)
+	 *
+	 * @return the matching candidates (or at least a subset of them)
+	 */
 	public Collection<ObjectId> getCandidates() {
 		return candidates;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/BinaryBlobException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/BinaryBlobException.java
new file mode 100644
index 0000000..a345fe4
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/BinaryBlobException.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.errors;
+
+/**
+ * BinaryBlobException is used to signal that binary data was found
+ * in a context that requires text (eg. for generating textual diffs).
+ *
+ * @since 4.10
+ */
+public class BinaryBlobException extends Exception {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct a BinaryBlobException.
+	 */
+	public BinaryBlobException() {}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CancelledException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CancelledException.java
index c2833a1..d7c553c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CancelledException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CancelledException.java
@@ -54,7 +54,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for CancelledException
+	 *
 	 * @param message
+	 *            error message
 	 */
 	public CancelledException(String message) {
 		super(message);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CheckoutConflictException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CheckoutConflictException.java
index b6010b6..9b7b618 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CheckoutConflictException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CheckoutConflictException.java
@@ -62,6 +62,7 @@
 	 * Construct a CheckoutConflictException for the specified file
 	 *
 	 * @param file
+	 *            relative path of a file
 	 */
 	public CheckoutConflictException(String file) {
 		super(MessageFormat.format(JGitText.get().checkoutConflictWithFile, file));
@@ -72,6 +73,7 @@
 	 * Construct a CheckoutConflictException for the specified set of files
 	 *
 	 * @param files
+	 *            an array of relative file paths
 	 */
 	public CheckoutConflictException(String[] files) {
 		super(MessageFormat.format(JGitText.get().checkoutConflictWithFiles, buildList(files)));
@@ -79,6 +81,8 @@
 	}
 
 	/**
+	 * Get the relative paths of the conflicting files
+	 *
 	 * @return the relative paths of the conflicting files (relative to the
 	 *         working directory root).
 	 * @since 4.4
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CommandFailedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CommandFailedException.java
index 93749f5..5df41c2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CommandFailedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CommandFailedException.java
@@ -54,6 +54,8 @@
 	private int returnCode;
 
 	/**
+	 * Constructor for CommandFailedException
+	 *
 	 * @param returnCode
 	 *            return code returned by the command
 	 * @param message
@@ -65,6 +67,8 @@
 	}
 
 	/**
+	 * Constructor for CommandFailedException
+	 *
 	 * @param returnCode
 	 *            return code returned by the command
 	 * @param message
@@ -79,6 +83,8 @@
 	}
 
 	/**
+	 * Get return code returned by the command
+	 *
 	 * @return return code returned by the command
 	 */
 	public int getReturnCode() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CompoundException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CompoundException.java
index 3a7b2c6..62ff990 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CompoundException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CompoundException.java
@@ -50,7 +50,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** An exception detailing multiple reasons for failure. */
+/**
+ * An exception detailing multiple reasons for failure.
+ */
 public class CompoundException extends Exception {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/ConfigInvalidException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/ConfigInvalidException.java
index 43fb4bc..a7e1d02 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/ConfigInvalidException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/ConfigInvalidException.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.errors;
 
-/** Indicates a text string is not a valid Git style configuration. */
+/**
+ * Indicates a text string is not a valid Git style configuration.
+ */
 public class ConfigInvalidException extends Exception {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CorruptObjectException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CorruptObjectException.java
index e4db40b..4b503a3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CorruptObjectException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CorruptObjectException.java
@@ -86,7 +86,9 @@
 	 * object id
 	 *
 	 * @param id
+	 *            a {@link org.eclipse.jgit.lib.AnyObjectId}
 	 * @param why
+	 *            error message
 	 */
 	public CorruptObjectException(AnyObjectId id, String why) {
 		super(MessageFormat.format(JGitText.get().objectIsCorrupt, id.name(), why));
@@ -97,7 +99,9 @@
 	 * object id
 	 *
 	 * @param id
+	 *            a {@link org.eclipse.jgit.lib.ObjectId}
 	 * @param why
+	 *            error message
 	 */
 	public CorruptObjectException(ObjectId id, String why) {
 		super(MessageFormat.format(JGitText.get().objectIsCorrupt, id.name(), why));
@@ -108,6 +112,7 @@
 	 * with a specific object id.
 	 *
 	 * @param why
+	 *            error message
 	 */
 	public CorruptObjectException(String why) {
 		super(why);
@@ -129,7 +134,8 @@
 	}
 
 	/**
-	 * Specific error condition identified by {@link ObjectChecker}.
+	 * Specific error condition identified by
+	 * {@link org.eclipse.jgit.lib.ObjectChecker}.
 	 *
 	 * @return error condition or null.
 	 * @since 4.2
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/DiffInterruptedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/DiffInterruptedException.java
index 5f9ce35..1df8773 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/DiffInterruptedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/DiffInterruptedException.java
@@ -53,8 +53,12 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for DiffInterruptedException
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable}
 	 * @since 4.1
 	 */
 	public DiffInterruptedException(String message, Throwable cause) {
@@ -62,14 +66,19 @@
 	}
 
 	/**
+	 * Constructor for DiffInterruptedException
+	 *
 	 * @param message
+	 *            error message
 	 * @since 4.1
 	 */
 	public DiffInterruptedException(String message) {
 		super(message);
 	}
 
-	/** Indicates that the thread computing a diff was interrupted. */
+	/**
+	 * Indicates that the thread computing a diff was interrupted.
+	 */
 	public DiffInterruptedException() {
 		super();
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/DirCacheNameConflictException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/DirCacheNameConflictException.java
index 5f67e34..4d08dfd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/DirCacheNameConflictException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/DirCacheNameConflictException.java
@@ -68,12 +68,20 @@
 		this.path2 = path2;
 	}
 
-	/** @return one of the paths that has a conflict. */
+	/**
+	 * Get one of the paths that has a conflict
+	 *
+	 * @return one of the paths that has a conflict
+	 */
 	public String getPath1() {
 		return path1;
 	}
 
-	/** @return another path that has a conflict. */
+	/**
+	 * Get another path that has a conflict
+	 *
+	 * @return another path that has a conflict
+	 */
 	public String getPath2() {
 		return path2;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
index dae150c..a647121 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
@@ -51,7 +51,10 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for IllegalTodoFileModification
+	 *
 	 * @param msg
+	 *            error message
 	 */
 	public IllegalTodoFileModification(final String msg) {
 		super(msg);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidObjectIdException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidObjectIdException.java
index 390545f..4abbf1e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidObjectIdException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidObjectIdException.java
@@ -69,8 +69,10 @@
 	}
 
 	/**
-	 * @param id the invalid id.
+	 * Constructor for InvalidObjectIdException
 	 *
+	 * @param id
+	 *            the invalid id.
 	 * @since 4.1
 	 */
 	public InvalidObjectIdException(String id) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidPatternException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidPatternException.java
index 18e78ff..949c4ff 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidPatternException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/InvalidPatternException.java
@@ -47,7 +47,6 @@
 
 /**
  * Thrown when a pattern passed in an argument was wrong.
- *
  */
 public class InvalidPatternException extends Exception {
 	private static final long serialVersionUID = 1L;
@@ -55,6 +54,8 @@
 	private final String pattern;
 
 	/**
+	 * Constructor for InvalidPatternException
+	 *
 	 * @param message
 	 *            explains what was wrong with the pattern.
 	 * @param pattern
@@ -66,6 +67,25 @@
 	}
 
 	/**
+	 * Constructor for InvalidPatternException
+	 *
+	 * @param message
+	 *            explains what was wrong with the pattern.
+	 * @param pattern
+	 *            the invalid pattern.
+	 * @param cause
+	 *            the cause.
+	 * @since 4.10
+	 */
+	public InvalidPatternException(String message, String pattern,
+			Throwable cause) {
+		this(message, pattern);
+		initCause(cause);
+	}
+
+	/**
+	 * Get the invalid pattern
+	 *
 	 * @return the invalid pattern.
 	 */
 	public String getPattern() {
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 a69bdc4..dfdf50d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/LargeObjectException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/LargeObjectException.java
@@ -49,18 +49,33 @@
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 
-/** An object is too big to load into memory as a single byte array. */
+/**
+ * An object is too big to load into memory as a single byte array.
+ */
 public class LargeObjectException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
 
 	private ObjectId objectId;
 
-	/** Create a large object exception, where the object isn't known. */
+	/**
+	 * Create a large object exception, where the object isn't known.
+	 */
 	public LargeObjectException() {
 		// Do nothing.
 	}
 
 	/**
+	 * Create a large object exception, where the object isn't known.
+	 *
+	 * @param cause
+	 *            the cause
+	 * @since 4.10
+	 */
+	public LargeObjectException(Throwable cause) {
+		initCause(cause);
+	}
+
+	/**
 	 * Create a large object exception, naming the object that is too big.
 	 *
 	 * @param id
@@ -71,12 +86,20 @@
 		setObjectId(id);
 	}
 
-	/** @return identity of the object that is too large; may be null. */
+	/**
+	 * Get identity of the object that is too large; may be null
+	 *
+	 * @return identity of the object that is too large; may be null
+	 */
 	public ObjectId getObjectId() {
 		return objectId;
 	}
 
-	/** @return either the hex encoded name of the object, or 'unknown object'. */
+	/**
+	 * Get the hex encoded name of the object, or 'unknown object'
+	 *
+	 * @return either the hex encoded name of the object, or 'unknown object'
+	 */
 	protected String getObjectName() {
 		if (getObjectId() != null)
 			return getObjectId().name();
@@ -94,6 +117,7 @@
 			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/LockFailedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/LockFailedException.java
index 0142e17..bf958bd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/LockFailedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/LockFailedException.java
@@ -57,12 +57,15 @@
 	private File file;
 
 	/**
+	 * Constructor for LockFailedException
+	 *
 	 * @param file
 	 *            file that could not be locked
 	 * @param message
 	 *            exception message
 	 * @param cause
-	 *            cause, for later retrieval by {@link Throwable#getCause()}
+	 *            cause, for later retrieval by
+	 *            {@link java.lang.Throwable#getCause()}
 	 * @since 4.1
 	 */
 	public LockFailedException(File file, String message, Throwable cause) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/MissingObjectException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/MissingObjectException.java
index d1157c4..f6aa092 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/MissingObjectException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/MissingObjectException.java
@@ -100,7 +100,11 @@
 		missing = null;
 	}
 
-	/** @return the ObjectId that was not found. */
+	/**
+	 * Get the ObjectId that was not found
+	 *
+	 * @return the ObjectId that was not found
+	 */
 	public ObjectId getObjectId() {
 		return missing;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoClosingBracketException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoClosingBracketException.java
index 6601591..1f79c5d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoClosingBracketException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoClosingBracketException.java
@@ -58,6 +58,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for NoClosingBracketException
+	 *
 	 * @param indexOfOpeningBracket
 	 *            the position of the [ character which has no ] character.
 	 * @param openingBracket
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java
index 0c419d7..97214b0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java
@@ -118,6 +118,8 @@
 	}
 
 	/**
+	 * Get the reason why no merge base could be found
+	 *
 	 * @return the reason why no merge base could be found
 	 */
 	public MergeBaseFailureReason getReason() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoWorkTreeException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoWorkTreeException.java
index 6f61806..82ed7ef 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoWorkTreeException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoWorkTreeException.java
@@ -44,15 +44,17 @@
 package org.eclipse.jgit.errors;
 
 import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.lib.Repository;
 
 /**
- * Indicates a {@link Repository} has no working directory, and is thus bare.
+ * Indicates a {@link org.eclipse.jgit.lib.Repository} has no working directory,
+ * and is thus bare.
  */
 public class NoWorkTreeException extends IllegalStateException {
 	private static final long serialVersionUID = 1L;
 
-	/** Creates an exception indicating there is no work tree for a repository. */
+	/**
+	 * Creates an exception indicating there is no work tree for a repository.
+	 */
 	public NoWorkTreeException() {
 		super(JGitText.get().bareRepositoryNoWorkdirAndIndex);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackInvalidException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackInvalidException.java
index 8c216c3..9886e15 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackInvalidException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackInvalidException.java
@@ -49,7 +49,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** Thrown when a PackFile previously failed and is known to be unusable */
+/**
+ * Thrown when a PackFile previously failed and is known to be unusable
+ */
 public class PackInvalidException extends IOException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackMismatchException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackMismatchException.java
index b828465..5b9a4b9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackMismatchException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/PackMismatchException.java
@@ -45,7 +45,9 @@
 
 import java.io.IOException;
 
-/** Thrown when a PackFile no longer matches the PackIndex. */
+/**
+ * Thrown when a PackFile no longer matches the PackIndex.
+ */
 public class PackMismatchException extends IOException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java
index 33429d6..aabb46a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java
@@ -48,7 +48,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** Indicates a local repository does not exist. */
+/**
+ * Indicates a local repository does not exist.
+ */
 public class RepositoryNotFoundException extends TransportException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevWalkException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevWalkException.java
index 757a45b..82654e8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevWalkException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevWalkException.java
@@ -45,16 +45,16 @@
 package org.eclipse.jgit.errors;
 
 import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.revwalk.RevWalk;
 
 /**
- * Indicates a checked exception was thrown inside of {@link RevWalk}.
+ * Indicates a checked exception was thrown inside of
+ * {@link org.eclipse.jgit.revwalk.RevWalk}.
  * <p>
  * Usually this exception is thrown from the Iterator created around a RevWalk
  * instance, as the Iterator API does not allow checked exceptions to be thrown
- * from hasNext() or next(). The {@link Exception#getCause()} of this exception
- * is the original checked exception that we really wanted to throw back to the
- * application for handling and recovery.
+ * from hasNext() or next(). The {@link java.lang.Exception#getCause()} of this
+ * exception is the original checked exception that we really wanted to throw
+ * back to the application for handling and recovery.
  */
 public class RevWalkException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
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 a039c7d..be3ca1b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java
@@ -77,6 +77,7 @@
 		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/errors/StoredObjectRepresentationNotAvailableException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/StoredObjectRepresentationNotAvailableException.java
index 0bd035b..8fa14c7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/StoredObjectRepresentationNotAvailableException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/StoredObjectRepresentationNotAvailableException.java
@@ -45,8 +45,10 @@
 
 import org.eclipse.jgit.internal.storage.pack.ObjectToPack;
 
-/** A previously selected representation is no longer available. */
-public class StoredObjectRepresentationNotAvailableException extends Exception {
+/**
+ * A previously selected representation is no longer available.
+ */
+public class StoredObjectRepresentationNotAvailableException extends Exception { //TODO remove unused ObjectToPack in 5.0
 	private static final long serialVersionUID = 1L;
 
 	/**
@@ -54,9 +56,28 @@
 	 *
 	 * @param otp
 	 *            the object whose current representation is no longer present.
+	 * @deprecated use
+	 *             {@link #StoredObjectRepresentationNotAvailableException(ObjectToPack, Throwable)}
+	 *             instead.
 	 * @since 3.0
 	 */
+	@Deprecated
 	public StoredObjectRepresentationNotAvailableException(ObjectToPack otp) {
 		// Do nothing.
 	}
+
+	/**
+	 * Construct an error for an object.
+	 *
+	 * @param otp
+	 *            the object whose current representation is no longer present.
+	 * @param cause
+	 *            cause
+	 * @since 4.10
+	 */
+	public StoredObjectRepresentationNotAvailableException(ObjectToPack otp,
+			Throwable cause) {
+		super(cause);
+		// Do nothing.
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TooLargeObjectInPackException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TooLargeObjectInPackException.java
index ece76ed..fb413d8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TooLargeObjectInPackException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TooLargeObjectInPackException.java
@@ -48,7 +48,9 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.transport.URIish;
 
-/** Thrown when PackParser finds an object larger than a predefined limit */
+/**
+ * Thrown when PackParser finds an object larger than a predefined limit
+ */
 public class TooLargeObjectInPackException extends TransportException {
 	private static final long serialVersionUID = 1L;
 
@@ -72,7 +74,9 @@
 	 * too large object is known.
 	 *
 	 * @param objectSize
+	 *            a long.
 	 * @param maxObjectSizeLimit
+	 *            a long.
 	 */
 	public TooLargeObjectInPackException(long objectSize,
 			long maxObjectSizeLimit) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java
index dc5f7a4..70760f3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java
@@ -43,7 +43,6 @@
 package org.eclipse.jgit.errors;
 
 import java.util.Locale;
-import java.util.ResourceBundle;
 
 /**
  * Common base class for all translation bundle related exceptions.
@@ -55,7 +54,8 @@
 	private final Locale locale;
 
 	/**
-	 * To construct an instance of {@link TranslationBundleException}
+	 * Construct an instance of
+	 * {@link org.eclipse.jgit.errors.TranslationBundleException}
 	 *
 	 * @param message
 	 *            exception message
@@ -65,7 +65,7 @@
 	 *            locale for which the exception occurred
 	 * @param cause
 	 *            original exception that caused this exception. Usually thrown
-	 *            from the {@link ResourceBundle} class.
+	 *            from the {@link java.util.ResourceBundle} class.
 	 */
 	protected TranslationBundleException(String message, Class bundleClass, Locale locale, Exception cause) {
 		super(message, cause);
@@ -74,6 +74,8 @@
 	}
 
 	/**
+	 * Get bundle class
+	 *
 	 * @return bundle class for which the exception occurred
 	 */
 	final public Class getBundleClass() {
@@ -81,6 +83,8 @@
 	}
 
 	/**
+	 * Get locale for which the exception occurred
+	 *
 	 * @return locale for which the exception occurred
 	 */
 	final public Locale getLocale() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleLoadingException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleLoadingException.java
index 6cb332d..4033ee1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleLoadingException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleLoadingException.java
@@ -43,7 +43,6 @@
 package org.eclipse.jgit.errors;
 
 import java.util.Locale;
-import java.util.ResourceBundle;
 
 /**
  * This exception will be thrown when a translation bundle loading
@@ -53,8 +52,9 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * Construct a {@link TranslationBundleLoadingException} for the specified
-	 * bundle class and locale.
+	 * Construct a
+	 * {@link org.eclipse.jgit.errors.TranslationBundleLoadingException} for the
+	 * specified bundle class and locale.
 	 *
 	 * @param bundleClass
 	 *            the bundle class for which the loading failed
@@ -62,7 +62,8 @@
 	 *            the locale for which the loading failed
 	 * @param cause
 	 *            the original exception thrown from the
-	 *            {@link ResourceBundle#getBundle(String, Locale)} method.
+	 *            {@link java.util.ResourceBundle#getBundle(String, Locale)}
+	 *            method.
 	 */
 	public TranslationBundleLoadingException(Class bundleClass, Locale locale, Exception cause) {
 		super("Loading of translation bundle failed for [" //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationStringMissingException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationStringMissingException.java
index 05c3842..d30c1be 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationStringMissingException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationStringMissingException.java
@@ -43,7 +43,6 @@
 package org.eclipse.jgit.errors;
 
 import java.util.Locale;
-import java.util.ResourceBundle;
 
 /**
  * This exception will be thrown when a translation string for a translation
@@ -55,8 +54,9 @@
 	private final String key;
 
 	/**
-	 * Construct a {@link TranslationStringMissingException} for the specified
-	 * bundle class, locale and translation key
+	 * Construct a
+	 * {@link org.eclipse.jgit.errors.TranslationStringMissingException} for the
+	 * specified bundle class, locale and translation key
 	 *
 	 * @param bundleClass
 	 *            the bundle class for which a translation string was missing
@@ -66,7 +66,7 @@
 	 *            the key of the missing translation string
 	 * @param cause
 	 *            the original exception thrown from the
-	 *            {@link ResourceBundle#getString(String)} method.
+	 *            {@link java.util.ResourceBundle#getString(String)} method.
 	 */
 	public TranslationStringMissingException(Class bundleClass, Locale locale, String key, Exception cause) {
 		super("Translation missing for [" + bundleClass.getName() + ", " //$NON-NLS-1$ //$NON-NLS-2$
@@ -76,6 +76,8 @@
 	}
 
 	/**
+	 * Get the key of the missing translation string
+	 *
 	 * @return the key of the missing translation string
 	 */
 	public String getKey() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnmergedPathException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnmergedPathException.java
index 3dbfb5f..4fc534b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnmergedPathException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnmergedPathException.java
@@ -68,7 +68,11 @@
 		entry = dce;
 	}
 
-	/** @return the first non-zero stage of the unmerged path */
+	/**
+	 * Get the first non-zero stage of the unmerged path
+	 *
+	 * @return the first non-zero stage of the unmerged path
+	 */
 	public DirCacheEntry getDirCacheEntry() {
 		return entry;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnpackException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnpackException.java
index a9b0113..0e0ff58 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnpackException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnpackException.java
@@ -47,7 +47,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** Indicates a ReceivePack failure while scanning the pack stream. */
+/**
+ * Indicates a ReceivePack failure while scanning the pack stream.
+ */
 public class UnpackException extends IOException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnsupportedCredentialItem.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnsupportedCredentialItem.java
index daba576..88c2ef6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnsupportedCredentialItem.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/UnsupportedCredentialItem.java
@@ -43,13 +43,12 @@
  */
 package org.eclipse.jgit.errors;
 
-import org.eclipse.jgit.transport.CredentialItem;
-import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.URIish;
 
 /**
- * An exception thrown when a {@link CredentialItem} is requested from a
- * {@link CredentialsProvider} which is not supported by this provider.
+ * An exception thrown when a {@link org.eclipse.jgit.transport.CredentialItem}
+ * is requested from a {@link org.eclipse.jgit.transport.CredentialsProvider}
+ * which is not supported by this provider.
  */
 public class UnsupportedCredentialItem extends RuntimeException {
 	private static final long serialVersionUID = 1L;
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 79598ea..69f6ff8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedEvent.java
@@ -43,13 +43,17 @@
 
 package org.eclipse.jgit.events;
 
-/** Describes a change to one or more keys in the configuration. */
+/**
+ * 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/ConfigChangedListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedListener.java
index 322cf7f..34fe90a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ConfigChangedListener.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.events;
 
-/** Receives {@link ConfigChangedEvent}s. */
+/**
+ * Receives {@link org.eclipse.jgit.events.ConfigChangedEvent}s.
+ */
 public interface ConfigChangedListener extends RepositoryListener {
 	/**
 	 * Invoked when any change is made to the configuration.
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 a54288e..647ec8a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedEvent.java
@@ -43,13 +43,17 @@
 
 package org.eclipse.jgit.events;
 
-/** Describes a change to one or more paths in the index file. */
+/**
+ * Describes a change to one or more paths in the index file.
+ */
 public class IndexChangedEvent extends RepositoryEvent<IndexChangedListener> {
+	/** {@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/IndexChangedListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedListener.java
index d41ef74..682cea5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/IndexChangedListener.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.events;
 
-/** Receives {@link IndexChangedEvent}s. */
+/**
+ * Receives {@link org.eclipse.jgit.events.IndexChangedEvent}s.
+ */
 public interface IndexChangedListener extends RepositoryListener {
 	/**
 	 * Invoked when any change is made to the index.
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 d8cd756..dcd5374 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerHandle.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerHandle.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.events;
 
-/** Tracks a previously registered {@link RepositoryListener}. */
+/**
+ * Tracks a previously registered {@link org.eclipse.jgit.events.RepositoryListener}.
+ */
 public class ListenerHandle {
 	private final ListenerList parent;
 
@@ -59,11 +61,14 @@
 		this.listener = listener;
 	}
 
-	/** Remove the listener and stop receiving events. */
+	/**
+	 * Remove the listener and stop receiving events.
+	 */
 	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 cea03db..9be1c96 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java
@@ -48,12 +48,14 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-/** Manages a thread-safe list of {@link RepositoryListener}s. */
+/**
+ * Manages a thread-safe list of {@link org.eclipse.jgit.events.RepositoryListener}s.
+ */
 public class ListenerList {
 	private final ConcurrentMap<Class<? extends RepositoryListener>, CopyOnWriteArrayList<ListenerHandle>> lists = new ConcurrentHashMap<>();
 
 	/**
-	 * Register a {@link WorkingTreeModifiedListener}.
+	 * Register a {@link org.eclipse.jgit.events.WorkingTreeModifiedListener}.
 	 *
 	 * @param listener
 	 *            the listener implementation.
@@ -102,8 +104,6 @@
 	/**
 	 * Add a listener to the list.
 	 *
-	 * @param <T>
-	 *            the type of listener being registered.
 	 * @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 36af3f8..f1923af 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedEvent.java
@@ -43,13 +43,17 @@
 
 package org.eclipse.jgit.events;
 
-/** Describes a change to one or more references of a repository. */
+/**
+ * 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/RefsChangedListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedListener.java
index 9c0f4ed..f3cdad1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/RefsChangedListener.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.events;
 
-/** Receives {@link RefsChangedEvent}s. */
+/**
+ * Receives {@link org.eclipse.jgit.events.RefsChangedEvent}s.
+ */
 public interface RefsChangedListener extends RepositoryListener {
 	/**
 	 * Invoked when any reference changes.
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 1b7d28c..576b21b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryEvent.java
@@ -59,7 +59,8 @@
 	 * Set the repository this event occurred on.
 	 * <p>
 	 * This method should only be invoked once on each event object, and is
-	 * automatically set by {@link Repository#fireEvent(RepositoryEvent)}.
+	 * automatically set by
+	 * {@link org.eclipse.jgit.lib.Repository#fireEvent(RepositoryEvent)}.
 	 *
 	 * @param r
 	 *            the repository.
@@ -69,12 +70,20 @@
 			repository = r;
 	}
 
-	/** @return the repository that was changed. */
+	/**
+	 * Get the repository that was changed
+	 *
+	 * @return the repository that was changed
+	 */
 	public Repository getRepository() {
 		return repository;
 	}
 
-	/** @return type of listener this event dispatches to. */
+	/**
+	 * Get type of listener this event dispatches to
+	 *
+	 * @return type of listener this event dispatches to
+	 */
 	public abstract Class<T> getListenerType();
 
 	/**
@@ -85,6 +94,7 @@
 	 */
 	public abstract void dispatch(T listener);
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryListener.java
index 4f951e5..a2cf0cc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/RepositoryListener.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.events;
 
-/** A listener can register for event delivery. */
+/**
+ * A listener can register for event delivery.
+ */
 public interface RepositoryListener {
 	// Empty marker interface; see extensions for actual methods.
 }
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 6517823..9fbcc4d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedEvent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedEvent.java
@@ -48,8 +48,9 @@
 import org.eclipse.jgit.annotations.NonNull;
 
 /**
- * A {@link RepositoryEvent} describing changes to the working tree. It is fired
- * whenever a {@link org.eclipse.jgit.dircache.DirCacheCheckout} modifies
+ * A {@link org.eclipse.jgit.events.RepositoryEvent} describing changes to the
+ * working tree. It is fired whenever a
+ * {@link org.eclipse.jgit.dircache.DirCacheCheckout} modifies
  * (adds/deletes/updates) files in the working tree.
  *
  * @since 4.9
@@ -62,8 +63,8 @@
 	private Collection<String> deleted;
 
 	/**
-	 * Creates a new {@link WorkingTreeModifiedEvent} with the given
-	 * collections.
+	 * Creates a new {@link org.eclipse.jgit.events.WorkingTreeModifiedEvent}
+	 * with the given collections.
 	 *
 	 * @param modified
 	 *            repository-relative paths that were added or updated
@@ -88,8 +89,8 @@
 	}
 
 	/**
-	 * Retrieves the {@link Collection} of repository-relative paths of files
-	 * that were modified (added or updated).
+	 * Retrieves the {@link java.util.Collection} of repository-relative paths
+	 * of files that were modified (added or updated).
 	 *
 	 * @return the set
 	 */
@@ -103,8 +104,8 @@
 	}
 
 	/**
-	 * Retrieves the {@link Collection} of repository-relative paths of files
-	 * that were deleted.
+	 * Retrieves the {@link java.util.Collection} of repository-relative paths
+	 * of files that were deleted.
 	 *
 	 * @return the set
 	 */
@@ -117,11 +118,13 @@
 		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/events/WorkingTreeModifiedListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedListener.java
index 402a900..728ce26 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/events/WorkingTreeModifiedListener.java
@@ -44,8 +44,8 @@
 package org.eclipse.jgit.events;
 
 /**
- * Receives {@link WorkingTreeModifiedEvent}s, which are fired whenever a
- * {@link org.eclipse.jgit.dircache.DirCacheCheckout} modifies
+ * Receives {@link org.eclipse.jgit.events.WorkingTreeModifiedEvent}s, which are
+ * fired whenever a {@link org.eclipse.jgit.dircache.DirCacheCheckout} modifies
  * (adds/deletes/updates) files in the working tree.
  *
  * @since 4.9
@@ -56,6 +56,8 @@
 	 * Respond to working tree modifications.
 	 *
 	 * @param event
+	 *            a {@link org.eclipse.jgit.events.WorkingTreeModifiedEvent}
+	 *            object.
 	 */
 	void onWorkingTreeModified(WorkingTreeModifiedEvent event);
 }
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 10c84c4..60669bb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/AbstractHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/AbstractHead.java
@@ -53,6 +53,13 @@
 
 	private final boolean star;
 
+	/**
+	 * Whether the char matches
+	 *
+	 * @param c
+	 *            a char.
+	 * @return whether the char matches
+	 */
 	protected abstract boolean matches(char c);
 
 	AbstractHead(boolean star) {
@@ -60,9 +67,11 @@
 	}
 
 	/**
+	 * Set {@link org.eclipse.jgit.fnmatch.Head}s which will not be modified.
 	 *
 	 * @param newHeads
-	 *            a list of {@link Head}s which will not be modified.
+	 *            a list of {@link org.eclipse.jgit.fnmatch.Head}s which will
+	 *            not be modified.
 	 */
 	public final void setNewHeads(List<Head> newHeads) {
 		if (this.newHeads != null)
@@ -70,6 +79,7 @@
 		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 6211b24..98aee0e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/CharacterHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/CharacterHead.java
@@ -47,16 +47,24 @@
 final class CharacterHead extends AbstractHead {
 	private final char expectedCharacter;
 
+	/**
+	 * Constructor for CharacterHead
+	 *
+	 * @param expectedCharacter
+	 *            expected {@code char}
+	 */
 	protected CharacterHead(final char expectedCharacter) {
 		super(false);
 		this.expectedCharacter = expectedCharacter;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(final 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/FileNameMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/FileNameMatcher.java
index 856d74e..5663039 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/FileNameMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/FileNameMatcher.java
@@ -126,12 +126,14 @@
 	}
 
 	/**
+	 * Constructor for FileNameMatcher
+	 *
 	 * @param patternString
 	 *            must contain a pattern which fnmatch would accept.
 	 * @param invalidWildgetCharacter
 	 *            if this parameter isn't null then this character will not
 	 *            match at wildcards(* and ? are wildcards).
-	 * @throws InvalidPatternException
+	 * @throws org.eclipse.jgit.errors.InvalidPatternException
 	 *             if the patternString contains a invalid fnmatch pattern.
 	 */
 	public FileNameMatcher(final String patternString,
@@ -141,11 +143,13 @@
 	}
 
 	/**
-	 * A Copy Constructor which creates a new {@link FileNameMatcher} with the
-	 * same state and reset point like <code>other</code>.
+	 * A Copy Constructor which creates a new
+	 * {@link org.eclipse.jgit.fnmatch.FileNameMatcher} with the same state and
+	 * reset point like <code>other</code>.
 	 *
 	 * @param other
-	 *            another {@link FileNameMatcher} instance.
+	 *            another {@link org.eclipse.jgit.fnmatch.FileNameMatcher}
+	 *            instance.
 	 */
 	public FileNameMatcher(FileNameMatcher other) {
 		this(other.headsStartValue, other.heads);
@@ -347,6 +351,7 @@
 	}
 
 	/**
+	 * Append to the string which is matched against the patterns of this class
 	 *
 	 * @param stringToMatch
 	 *            extends the string which is matched against the patterns of
@@ -369,10 +374,13 @@
 	}
 
 	/**
+	 * Create a {@link org.eclipse.jgit.fnmatch.FileNameMatcher} instance which
+	 * uses the same pattern like this matcher, but has the current state of
+	 * this matcher as reset and start point
 	 *
-	 * @return a {@link FileNameMatcher} instance which uses the same pattern
-	 *         like this matcher, but has the current state of this matcher as
-	 *         reset and start point.
+	 * @return a {@link org.eclipse.jgit.fnmatch.FileNameMatcher} instance which
+	 *         uses the same pattern like this matcher, but has the current
+	 *         state of this matcher as reset and start point.
 	 */
 	public FileNameMatcher createMatcherForSuffix() {
 		final List<Head> copyOfHeads = new ArrayList<>(heads.size());
@@ -381,8 +389,9 @@
 	}
 
 	/**
+	 * Whether the matcher matches
 	 *
-	 * @return true, if the string currently being matched does match.
+	 * @return whether the matcher matches
 	 */
 	public boolean isMatch() {
 		if (heads.isEmpty())
@@ -400,9 +409,9 @@
 	}
 
 	/**
+	 * Whether a match can be appended
 	 *
-	 * @return false, if the string being matched will not match when the string
-	 *         gets extended.
+	 * @return a boolean.
 	 */
 	public boolean canAppendMatch() {
 		for (int i = 0; i < heads.size(); i++) {
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 5c18756..965d900 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/GroupHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/GroupHead.java
@@ -130,6 +130,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(final char c) {
 		for (CharacterPattern pattern : characterClasses) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/Head.java b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/Head.java
index 3de18a7..49839f8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/Head.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/Head.java
@@ -48,6 +48,7 @@
 
 interface Head {
 	/**
+	 * Get the character which decides which heads are returned
 	 *
 	 * @param c
 	 *            the character which decides which heads are returned.
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 f9ddd9e..726d1f2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/LastHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/LastHead.java
@@ -56,6 +56,7 @@
 		// 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 4a0a03d..c132e28 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/RestrictedWildCardHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/RestrictedWildCardHead.java
@@ -52,11 +52,13 @@
 		this.excludedCharacter = excludedCharacter;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(final 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 b5173d9..c806e23 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/WildCardHead.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/WildCardHead.java
@@ -49,6 +49,7 @@
 		super(star);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected final boolean matches(final 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 ddc6add..929ffac 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
@@ -113,12 +113,22 @@
 	}
 
 	/**
+	 * Constructor for ManifestParser
+	 *
 	 * @param includedReader
+	 *            a
+	 *            {@link org.eclipse.jgit.gitrepo.ManifestParser.IncludedFileReader}
+	 *            object.
 	 * @param filename
+	 *            a {@link java.lang.String} object.
 	 * @param defaultBranch
+	 *            a {@link java.lang.String} object.
 	 * @param baseUrl
+	 *            a {@link java.lang.String} object.
 	 * @param groups
+	 *            a {@link java.lang.String} object.
 	 * @param rootRepo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public ManifestParser(IncludedFileReader includedReader, String filename,
 			String defaultBranch, String baseUrl, String groups,
@@ -153,7 +163,8 @@
 	 * Read the xml file.
 	 *
 	 * @param inputStream
-	 * @throws IOException
+	 *            a {@link java.io.InputStream} object.
+	 * @throws java.io.IOException
 	 */
 	public void read(InputStream inputStream) throws IOException {
 		xmlInRead++;
@@ -167,13 +178,11 @@
 		try {
 			xr.parse(new InputSource(inputStream));
 		} catch (SAXException e) {
-			IOException error = new IOException(
-						RepoText.get().errorParsingManifestFile);
-			error.initCause(e);
-			throw error;
+			throw new IOException(RepoText.get().errorParsingManifestFile, e);
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void startElement(
 			String uri,
@@ -246,6 +255,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void endElement(
 			String uri,
@@ -257,6 +267,7 @@
 		}
 	}
 
+	/** {@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 219babd..c7bc1b6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
@@ -232,7 +232,10 @@
 	}
 
 	/**
+	 * Constructor for RepoCommand
+	 *
 	 * @param repo
+	 *            the {@link org.eclipse.jgit.lib.Repository}
 	 */
 	public RepoCommand(Repository repo) {
 		super(repo);
@@ -258,7 +261,7 @@
 	 * Setting inputStream will ignore the path set. It will be closed in
 	 * {@link #call}.
 	 *
-	 * @param inputStream
+	 * @param inputStream a {@link java.io.InputStream} object.
 	 * @return this command
 	 * @since 3.5
 	 */
@@ -271,10 +274,11 @@
 	 * Set base URI of the paths inside the XML. This is typically the name of
 	 * the directory holding the manifest repository, eg. for
 	 * https://android.googlesource.com/platform/manifest, this should be
-	 * /platform (if you would run this on android.googlesource.com)
-	 * or https://android.googlesource.com/platform elsewhere.
+	 * /platform (if you would run this on android.googlesource.com) or
+	 * https://android.googlesource.com/platform elsewhere.
 	 *
 	 * @param uri
+	 *            the base URI
 	 * @return this command
 	 */
 	public RepoCommand setURI(String uri) {
@@ -319,6 +323,7 @@
 	 * revision specified in project, this branch will be used.
 	 *
 	 * @param branch
+	 *            a branch name
 	 * @return this command
 	 */
 	public RepoCommand setBranch(String branch) {
@@ -336,6 +341,7 @@
 	 * ignored.
 	 *
 	 * @param branch
+	 *            branch name
 	 * @return this command
 	 * @since 4.1
 	 */
@@ -404,6 +410,7 @@
 	 *
 	 * @see org.eclipse.jgit.lib.NullProgressMonitor
 	 * @param monitor
+	 *            a {@link org.eclipse.jgit.lib.ProgressMonitor}
 	 * @return this command
 	 */
 	public RepoCommand setProgressMonitor(final ProgressMonitor monitor) {
@@ -438,6 +445,7 @@
 	 * ignored.
 	 *
 	 * @param author
+	 *            the author's {@link org.eclipse.jgit.lib.PersonIdent}
 	 * @return this command
 	 */
 	public RepoCommand setAuthor(final PersonIdent author) {
@@ -451,6 +459,8 @@
 	 * This is only used in bare repositories.
 	 *
 	 * @param callback
+	 *            a {@link org.eclipse.jgit.gitrepo.RepoCommand.RemoteReader}
+	 *            object.
 	 * @return this command
 	 */
 	public RepoCommand setRemoteReader(final RemoteReader callback) {
@@ -462,6 +472,9 @@
 	 * Set the IncludedFileReader callback.
 	 *
 	 * @param reader
+	 *            a
+	 *            {@link org.eclipse.jgit.gitrepo.ManifestParser.IncludedFileReader}
+	 *            object.
 	 * @return this command
 	 * @since 4.0
 	 */
@@ -470,6 +483,7 @@
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevCommit call() throws GitAPIException {
 		try {
@@ -534,8 +548,7 @@
 					String path = proj.getPath();
 					String nameUri = proj.getName();
 					ObjectId objectId;
-					if (ObjectId.isId(proj.getRevision())
-							&& !ignoreRemoteFailures) {
+					if (ObjectId.isId(proj.getRevision())) {
 						objectId = ObjectId.fromString(proj.getRevision());
 					} else {
 						objectId = callback.sha1(nameUri, proj.getRevision());
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 00cd38d..e827612 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
@@ -169,6 +169,8 @@
 	}
 
 	/**
+	 * Constructor for RepoProject
+	 *
 	 * @param name
 	 *            the relative path to the {@code remote}
 	 * @param path
@@ -203,6 +205,8 @@
 	}
 
 	/**
+	 * Constructor for RepoProject
+	 *
 	 * @param name
 	 *            the relative path to the {@code remote}
 	 * @param path
@@ -225,6 +229,7 @@
 	 * Set the url of the sub repo.
 	 *
 	 * @param url
+	 *            project url
 	 * @return this for chaining.
 	 */
 	public RepoProject setUrl(String url) {
@@ -250,6 +255,7 @@
 	 * Set the default revision for the sub repo.
 	 *
 	 * @param defaultRevision
+	 *            the name of the default revision
 	 * @return this for chaining.
 	 */
 	public RepoProject setDefaultRevision(String defaultRevision) {
@@ -325,6 +331,7 @@
 	 * Test whether this sub repo belongs to a specified group.
 	 *
 	 * @param group
+	 *            a group
 	 * @return true if {@code group} is present.
 	 */
 	public boolean inGroup(String group) {
@@ -365,7 +372,7 @@
 	/**
 	 * Add a copy file configuration.
 	 *
-	 * @param copyfile
+	 * @param copyfile a {@link org.eclipse.jgit.gitrepo.RepoProject.CopyFile} object.
 	 */
 	public void addCopyFile(CopyFile copyfile) {
 		copyfiles.add(copyfile);
@@ -375,6 +382,8 @@
 	 * Add a bunch of copyfile configurations.
 	 *
 	 * @param copyFiles
+	 *            a collection of
+	 *            {@link org.eclipse.jgit.gitrepo.RepoProject.CopyFile} objects
 	 */
 	public void addCopyFiles(Collection<CopyFile> copyFiles) {
 		this.copyfiles.addAll(copyFiles);
@@ -392,7 +401,7 @@
 	/**
 	 * Add a link file configuration.
 	 *
-	 * @param linkfile
+	 * @param linkfile a {@link org.eclipse.jgit.gitrepo.RepoProject.LinkFile} object.
 	 * @since 4.8
 	 */
 	public void addLinkFile(LinkFile linkfile) {
@@ -403,6 +412,7 @@
 	 * Add a bunch of linkfile configurations.
 	 *
 	 * @param linkFiles
+	 *            a collection of {@link LinkFile}s
 	 * @since 4.8
 	 */
 	public void addLinkFiles(Collection<LinkFile> linkFiles) {
@@ -448,6 +458,7 @@
 		return thatPath.startsWith(getPathWithSlash());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof RepoProject) {
@@ -457,11 +468,13 @@
 		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/gitrepo/internal/RepoText.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java
index 02a2565..ccafff6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java
@@ -52,6 +52,8 @@
 public class RepoText extends TranslationBundle {
 
 	/**
+	 * Get an instance of this translation bundle
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static RepoText get() {
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 fa17075..f33168d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/CommitMsgHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/CommitMsgHook.java
@@ -71,6 +71,8 @@
 	private String commitMessage;
 
 	/**
+	 * Constructor for CommitMsgHook
+	 *
 	 * @param repo
 	 *            The repository
 	 * @param outputStream
@@ -81,6 +83,7 @@
 		super(repo, outputStream);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String call() throws IOException, AbortedByHookException {
 		if (commitMessage == null) {
@@ -103,12 +106,15 @@
 		return getCommitEditMessageFilePath() != null && commitMessage != null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getHookName() {
 		return NAME;
 	}
 
 	/**
+	 * {@inheritDoc}
+	 *
 	 * This hook receives one parameter, which is the path to the file holding
 	 * the current commit-msg, relative to the repository's work tree.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
index b684dd6..fb015c9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
@@ -79,7 +79,10 @@
 	protected final PrintStream outputStream;
 
 	/**
+	 * Constructor for GitHook
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param outputStream
 	 *            The output stream the hook must use. {@code null} is allowed,
 	 *            in which case the hook will use {@code System.out}.
@@ -90,23 +93,23 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Run the hook.
-	 *
-	 * @throws IOException
-	 *             if IO goes wrong.
-	 * @throws AbortedByHookException
-	 *             If the hook has been run and a returned an exit code
-	 *             different from zero.
 	 */
 	@Override
 	public abstract T call() throws IOException, AbortedByHookException;
 
 	/**
+	 * Get name of the hook
+	 *
 	 * @return The name of the hook, which must not be {@code null}.
 	 */
 	public abstract String getHookName();
 
 	/**
+	 * Get the repository
+	 *
 	 * @return The repository.
 	 */
 	protected Repository getRepository() {
@@ -135,6 +138,8 @@
 	}
 
 	/**
+	 * Get output stream
+	 *
 	 * @return The output stream the hook must use. Never {@code null},
 	 *         {@code System.out} is returned by default.
 	 */
@@ -145,7 +150,7 @@
 	/**
 	 * Runs the hook, without performing any validity checks.
 	 *
-	 * @throws AbortedByHookException
+	 * @throws org.eclipse.jgit.api.errors.AbortedByHookException
 	 *             If the underlying hook script exited with non-zero.
 	 */
 	protected void doRun() throws AbortedByHookException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java
index 46e8840..87db36b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java
@@ -54,7 +54,10 @@
 public class Hooks {
 
 	/**
+	 * Create pre-commit hook for the given repository
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param outputStream
 	 *            The output stream, or {@code null} to use {@code System.out}
 	 * @return The pre-commit hook for the given repository.
@@ -65,7 +68,10 @@
 	}
 
 	/**
+	 * Create post-commit hook for the given repository
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param outputStream
 	 *            The output stream, or {@code null} to use {@code System.out}
 	 * @return The post-commit hook for the given repository.
@@ -77,7 +83,10 @@
 	}
 
 	/**
+	 * Create commit-msg hook for the given repository
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param outputStream
 	 *            The output stream, or {@code null} to use {@code System.out}
 	 * @return The commit-msg hook for the given repository.
@@ -88,7 +97,10 @@
 	}
 
 	/**
+	 * Create pre-push hook for the given repository
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param outputStream
 	 *            The output stream, or {@code null} to use {@code System.out}
 	 * @return The pre-push hook for the given repository.
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 70679e0..24bad16 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PostCommitHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PostCommitHook.java
@@ -60,6 +60,8 @@
 	public static final String NAME = "post-commit"; //$NON-NLS-1$
 
 	/**
+	 * Constructor for PostCommitHook
+	 *
 	 * @param repo
 	 *            The repository
 	 * @param outputStream
@@ -70,12 +72,14 @@
 		super(repo, outputStream);
 	}
 
+	/** {@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 1ab32e0..0d9290d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
@@ -60,6 +60,8 @@
 	public static final String NAME = "pre-commit"; //$NON-NLS-1$
 
 	/**
+	 * Constructor for PreCommitHook
+	 *
 	 * @param repo
 	 *            The repository
 	 * @param outputStream
@@ -70,12 +72,14 @@
 		super(repo, outputStream);
 	}
 
+	/** {@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 a501fee..f974eb7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java
@@ -72,6 +72,8 @@
 	private String refs;
 
 	/**
+	 * Constructor for PrePushHook
+	 *
 	 * @param repo
 	 *            The repository
 	 * @param outputStream
@@ -82,11 +84,13 @@
 		super(repo, outputStream);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected String getStdinArgs() {
 		return refs;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String call() throws IOException, AbortedByHookException {
 		if (canRun()) {
@@ -102,12 +106,15 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getHookName() {
 		return NAME;
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * This hook receives two parameters, which is the name and the location of
 	 * the remote repository.
 	 */
@@ -120,21 +127,30 @@
 	}
 
 	/**
+	 * Set remote name
+	 *
 	 * @param name
+	 *            remote name
 	 */
 	public void setRemoteName(String name) {
 		remoteName = name;
 	}
 
 	/**
+	 * Set remote location
+	 *
 	 * @param location
+	 *            a remote location
 	 */
 	public void setRemoteLocation(String location) {
 		remoteLocation = location;
 	}
 
 	/**
+	 * Set Refs
+	 *
 	 * @param toRefs
+	 *            a collection of {@code RemoteRefUpdate}s
 	 */
 	public void setRefs(Collection<RemoteRefUpdate> toRefs) {
 		StringBuilder b = new StringBuilder();
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 7298a08..460f0ed 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java
@@ -55,7 +55,7 @@
 
 /**
  * "Fast" (compared with IgnoreRule) git ignore rule implementation supporting
- * also double star <code>**<code> pattern.
+ * also double star {@code **} pattern.
  * <p>
  * This class is immutable and thread safe.
  *
@@ -77,6 +77,7 @@
 	private final boolean dirOnly;
 
 	/**
+	 * Constructor for FastIgnoreRule
 	 *
 	 * @param pattern
 	 *            ignore pattern as described in <a href=
@@ -160,15 +161,18 @@
 	}
 
 	/**
-	 * @return True if the pattern is just a file name and not a path
+	 * Whether the pattern is just a file name and not a path
+	 *
+	 * @return {@code true} if the pattern is just a file name and not a path
 	 */
 	public boolean getNameOnly() {
 		return !(matcher instanceof PathMatcher);
 	}
 
 	/**
+	 * Whether the pattern should match directories only
 	 *
-	 * @return True if the pattern should match directories only
+	 * @return {@code true} if the pattern should match directories only
 	 */
 	public boolean dirOnly() {
 		return dirOnly;
@@ -193,13 +197,17 @@
 	}
 
 	/**
-	 * @return true if the rule never matches (comment line or broken pattern)
+	 * Whether the rule never matches
+	 *
+	 * @return {@code true} if the rule never matches (comment line or broken
+	 *         pattern)
 	 * @since 4.1
 	 */
 	public boolean isEmpty() {
 		return matcher == NO_MATCH;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
@@ -212,6 +220,7 @@
 
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		final int prime = 31;
@@ -222,6 +231,7 @@
 		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 6314c63..1ad6010 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java
@@ -81,7 +81,9 @@
 	/** The rules that have been parsed into this node. */
 	private final List<FastIgnoreRule> rules;
 
-	/** Create an empty ignore node with no rules. */
+	/**
+	 * Create an empty ignore node with no rules.
+	 */
 	public IgnoreNode() {
 		rules = new ArrayList<>();
 	}
@@ -91,7 +93,7 @@
 	 *
 	 * @param rules
 	 *            list of rules.
-	 **/
+	 */
 	public IgnoreNode(List<FastIgnoreRule> rules) {
 		this.rules = rules;
 	}
@@ -102,7 +104,7 @@
 	 * @param in
 	 *            input stream holding the standard ignore format. The caller is
 	 *            responsible for closing the stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             Error thrown when reading an ignore file.
 	 */
 	public void parse(InputStream in) throws IOException {
@@ -122,7 +124,11 @@
 		return new BufferedReader(new InputStreamReader(in, Constants.CHARSET));
 	}
 
-	/** @return list of all ignore rules held by this node. */
+	/**
+	 * Get list of all ignore rules held by this node
+	 *
+	 * @return list of all ignore rules held by this node
+	 */
 	public List<FastIgnoreRule> getRules() {
 		return Collections.unmodifiableList(rules);
 	}
@@ -194,6 +200,7 @@
 		return MatchResult.CHECK_PARENT;
 	}
 
+	/** {@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 64c2a74..8e8e571 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
@@ -64,16 +64,19 @@
 		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/IMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/IMatcher.java
index 5b184cb..dbf0638 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/IMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/IMatcher.java
@@ -74,9 +74,10 @@
 	 *            with a slash)
 	 * @param pathMatch
 	 *            {@code true} if the match is for the full path: prefix-only
-	 *            matches are not allowed, and {@link NameMatcher}s must match
-	 *            only the last component (if they can -- they may not, if they
-	 *            are anchored at the beginning)
+	 *            matches are not allowed, and
+	 *            {@link org.eclipse.jgit.ignore.internal.NameMatcher}s must
+	 *            match only the last component (if they can -- they may not, if
+	 *            they are anchored at the beginning)
 	 * @return true if this matcher pattern matches given string
 	 */
 	boolean matches(String path, boolean assumeDirectory, boolean pathMatch);
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 cc0fe93..2bae8f2 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
@@ -55,6 +55,7 @@
 					"Pattern must have leading asterisk: " + pattern); //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl,
 			boolean assumeDirectory) {
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 9667837..6a4b2b8 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
@@ -71,6 +71,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String path, boolean assumeDirectory,
 			boolean pathMatch) {
@@ -120,6 +121,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl,
 			boolean assumeDirectory) {
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 9b3a2aa..50e78ae 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
@@ -105,14 +105,17 @@
 	}
 
 	/**
+	 * Create path matcher
 	 *
 	 * @param pattern
+	 *            a pattern
 	 * @param pathSeparator
 	 *            if this parameter isn't null then this character will not
 	 *            match at wildcards(* and ? are wildcards).
 	 * @param dirOnly
+	 *            a boolean.
 	 * @return never null
-	 * @throws InvalidPatternException
+	 * @throws org.eclipse.jgit.errors.InvalidPatternException
 	 */
 	public static IMatcher createPathMatcher(String pattern,
 			Character pathSeparator, boolean dirOnly)
@@ -170,6 +173,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String path, boolean assumeDirectory,
 			boolean pathMatch) {
@@ -212,6 +216,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl,
 			boolean assumeDirectory) {
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 800cdb9..9b255b4 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
@@ -56,8 +56,8 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * Various {@link String} related utility methods, written mostly to avoid
- * generation of new String objects (e.g. via splitting Strings etc).
+ * Various {@link java.lang.String} related utility methods, written mostly to
+ * avoid generation of new String objects (e.g. via splitting Strings etc).
  */
 public class Strings {
 
@@ -67,6 +67,8 @@
 	}
 
 	/**
+	 * Strip trailing characters
+	 *
 	 * @param pattern
 	 *            non null
 	 * @param c
@@ -87,6 +89,8 @@
 	}
 
 	/**
+	 * Strip trailing whitespace characters
+	 *
 	 * @param pattern
 	 *            non null
 	 * @return new string with all trailing whitespace removed
@@ -105,10 +109,12 @@
 	}
 
 	/**
+	 * Check if pattern is a directory pattern ending with a path separator
+	 *
 	 * @param pattern
 	 *            non null
-	 * @return true if the last character, which is not whitespace, is a path
-	 *         separator
+	 * @return {@code true} if the last character, which is not whitespace, is a
+	 *         path separator
 	 */
 	public static boolean isDirectoryPattern(String pattern) {
 		for (int i = pattern.length() - 1; i >= 0; i--) {
@@ -439,12 +445,10 @@
 		try {
 			return Pattern.compile(sb.toString());
 		} catch (PatternSyntaxException e) {
-			InvalidPatternException patternException = new InvalidPatternException(
+			throw new InvalidPatternException(
 					MessageFormat.format(JGitText.get().invalidIgnoreRule,
 							pattern),
-					pattern);
-			patternException.initCause(e);
-			throw patternException;
+					pattern, e);
 		}
 	}
 
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 2e148f4..7df42b7 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
@@ -55,6 +55,7 @@
 					"Pattern must have trailing asterisk: " + pattern); //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl,
 			boolean assumeDirectory) {
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 f64050f..ca8c581 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
@@ -50,7 +50,7 @@
 
 /**
  * Matcher built from path segments containing wildcards. This matcher converts
- * glob wildcards to Java {@link Pattern}'s.
+ * glob wildcards to Java {@link java.util.regex.Pattern}'s.
  * <p>
  * This class is immutable and thread safe.
  */
@@ -64,6 +64,7 @@
 		p = convertGlob(subPattern);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean matches(String segment, int startIncl, int endExcl,
 			boolean assumeDirectory) {
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 363b3ce..ba8015c 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
@@ -61,12 +61,14 @@
 		super(WILDMATCH, false);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final boolean matches(String path, boolean assumeDirectory,
 			boolean pathMatch) {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final boolean matches(String segment, int startIncl, int endExcl,
 			boolean assumeDirectory) {
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 2fc5501..a471228 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -53,6 +53,8 @@
 public class JGitText extends TranslationBundle {
 
 	/**
+	 * Get an instance of this translation bundle
+	 *
 	 * @return an instance of this translation bundle
 	 */
 	public static JGitText get() {
@@ -81,6 +83,7 @@
 	/***/ public String atLeastTwoFiltersNeeded;
 	/***/ public String atomicPushNotSupported;
 	/***/ public String atomicRefUpdatesNotSupported;
+	/***/ public String atomicSymRefNotSupported;
 	/***/ public String authenticationNotSupported;
 	/***/ public String badBase64InputCharacterAt;
 	/***/ public String badEntryDelimiter;
@@ -100,6 +103,7 @@
 	/***/ public String blobNotFound;
 	/***/ public String blobNotFoundForPath;
 	/***/ public String blockSizeNotPowerOf2;
+	/***/ public String bothRefTargetsMustNotBeNull;
 	/***/ public String branchNameInvalid;
 	/***/ public String buildingBitmaps;
 	/***/ public String cachedPacksPreventsIndexCreation;
@@ -189,6 +193,9 @@
 	/***/ public String commitOnRepoWithoutHEADCurrentlyNotSupported;
 	/***/ public String commitAmendOnInitialNotPossible;
 	/***/ public String compressingObjects;
+	/***/ public String configSubsectionContainsNewline;
+	/***/ public String configSubsectionContainsNullByte;
+	/***/ public String configValueContainsNullByte;
 	/***/ public String configHandleIsStale;
 	/***/ public String connectionFailed;
 	/***/ public String connectionTimeOut;
@@ -343,6 +350,7 @@
 	/***/ public String expectedACKNAKGot;
 	/***/ public String expectedBooleanStringValue;
 	/***/ public String expectedCharacterEncodingGuesses;
+	/***/ public String expectedDirectoryNotSubmodule;
 	/***/ public String expectedEOFReceived;
 	/***/ public String expectedGot;
 	/***/ public String expectedLessThanGot;
@@ -501,6 +509,7 @@
 	/***/ public String months;
 	/***/ public String monthsAgo;
 	/***/ public String multipleMergeBasesFor;
+	/***/ public String nameMustNotBeNullOrEmpty;
 	/***/ public String need2Arguments;
 	/***/ public String needPackOut;
 	/***/ public String needsAtLeastOneEntry;
@@ -516,6 +525,7 @@
 	/***/ public String noMergeHeadSpecified;
 	/***/ public String nonBareLinkFilesNotSupported;
 	/***/ public String noSuchRef;
+	/***/ public String noSuchSubmodule;
 	/***/ public String notABoolean;
 	/***/ public String notABundle;
 	/***/ public String notADIRCFile;
@@ -764,6 +774,7 @@
 	/***/ public String unexpectedRefReport;
 	/***/ public String unexpectedReportLine;
 	/***/ public String unexpectedReportLine2;
+	/***/ public String unexpectedSubmoduleStatus;
 	/***/ public String unknownOrUnsupportedCommand;
 	/***/ public String unknownDIRCVersion;
 	/***/ public String unknownHost;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckError.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckError.java
index 588ed9b..131b004 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckError.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckError.java
@@ -51,7 +51,9 @@
 import org.eclipse.jgit.lib.ObjectChecker;
 import org.eclipse.jgit.lib.ObjectId;
 
-/** Holds all fsck errors of a git repository. */
+/**
+ * Holds all fsck errors of a git repository.
+ */
 public class FsckError {
 	/** Represents a corrupt object. */
 	public static class CorruptObject {
@@ -130,22 +132,38 @@
 
 	private final Set<String> nonCommitHeads = new HashSet<>();
 
-	/** @return corrupt objects from all pack files. */
+	/**
+	 * Get corrupt objects from all pack files
+	 *
+	 * @return corrupt objects from all pack files
+	 */
 	public Set<CorruptObject> getCorruptObjects() {
 		return corruptObjects;
 	}
 
-	/** @return missing objects that should present in pack files. */
+	/**
+	 * Get missing objects that should present in pack files
+	 *
+	 * @return missing objects that should present in pack files
+	 */
 	public Set<ObjectId> getMissingObjects() {
 		return missingObjects;
 	}
 
-	/** @return corrupt index files associated with the packs. */
+	/**
+	 * Get corrupt index files associated with the packs
+	 *
+	 * @return corrupt index files associated with the packs
+	 */
 	public Set<CorruptIndex> getCorruptIndices() {
 		return corruptIndices;
 	}
 
-	/** @return refs/heads/* point to non-commit object. */
+	/**
+	 * Get refs/heads/* which point to non-commit object
+	 *
+	 * @return refs/heads/* which point to non-commit object
+	 */
 	public Set<String> getNonCommitHeads() {
 		return nonCommitHeads;
 	}
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 3a678a7..5397ba4 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
@@ -62,13 +62,14 @@
 import org.eclipse.jgit.internal.storage.file.PackIndex;
 import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
 import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectChecker;
 import org.eclipse.jgit.lib.ObjectDatabase;
 import org.eclipse.jgit.lib.ObjectIdOwnerMap;
 import org.eclipse.jgit.transport.PackParser;
 import org.eclipse.jgit.transport.PackedObjectInfo;
 
-/** A read-only pack parser for object validity checking. */
+/**
+ * A read-only pack parser for object validity checking.
+ */
 public class FsckPackParser extends PackParser {
 	private final CRC32 crc;
 
@@ -83,6 +84,8 @@
 	private int blockSize;
 
 	/**
+	 * Constructor for FsckPackParser
+	 *
 	 * @param db
 	 *            the object database which stores repository's data.
 	 * @param channel
@@ -96,6 +99,7 @@
 		this.blockSize = channel.blockSize() > 0 ? channel.blockSize() : 65536;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onPackHeader(long objCnt) throws IOException {
 		if (expectedObjectCount >= 0) {
@@ -107,41 +111,48 @@
 		}
 	}
 
+	/** {@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();
@@ -149,12 +160,14 @@
 		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) {
@@ -170,11 +183,13 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onPackFooter(byte[] hash) throws IOException {
 		// Do nothing.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected boolean onAppendBase(int typeCode, byte[] data,
 			PackedObjectInfo info) throws IOException {
@@ -182,11 +197,13 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onEndThinPack() throws IOException {
 		// Do nothing.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 			ObjectTypeAndSize info) throws IOException {
@@ -195,6 +212,7 @@
 		return readObjectHeader(info);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 			ObjectTypeAndSize info) throws IOException {
@@ -203,6 +221,7 @@
 		return readObjectHeader(info);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int readDatabase(byte[] dst, int pos, int cnt)
 			throws IOException {
@@ -247,11 +266,13 @@
 		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 {
@@ -259,7 +280,11 @@
 	}
 
 	/**
-	 * @return corrupt objects that reported by {@link ObjectChecker}.
+	 * Get corrupt objects reported by
+	 * {@link org.eclipse.jgit.lib.ObjectChecker}
+	 *
+	 * @return corrupt objects that are reported by
+	 *         {@link org.eclipse.jgit.lib.ObjectChecker}.
 	 */
 	public Set<CorruptObject> getCorruptObjects() {
 		return corruptObjects;
@@ -270,7 +295,7 @@
 	 *
 	 * @param idx
 	 *            index file associate with the pack
-	 * @throws CorruptPackIndexException
+	 * @throws org.eclipse.jgit.errors.CorruptPackIndexException
 	 *             when the index file is corrupt.
 	 */
 	public void verifyIndex(PackIndex idx)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchConstants.java
index 171c059..168ab8c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchConstants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchConstants.java
@@ -45,7 +45,9 @@
 
 import org.eclipse.jgit.revwalk.FooterKey;
 
-/** Frequently used constants in a Ketch system. */
+/**
+ * Frequently used constants in a Ketch system.
+ */
 public class KetchConstants {
 	/**
 	 * Default reference namespace holding {@link #ACCEPTED} and
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java
index 3bcd6bc..bc5ba39 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java
@@ -69,11 +69,15 @@
 /**
  * A leader managing consensus across remote followers.
  * <p>
- * A leader instance starts up in {@link State#CANDIDATE} and tries to begin a
- * new term by sending an {@link ElectionRound} to all replicas. Its term starts
- * if a majority of replicas have accepted this leader instance for the term.
+ * A leader instance starts up in
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader.State#CANDIDATE} and tries
+ * to begin a new term by sending an
+ * {@link org.eclipse.jgit.internal.ketch.ElectionRound} to all replicas. Its
+ * term starts if a majority of replicas have accepted this leader instance for
+ * the term.
  * <p>
- * Once elected by a majority the instance enters {@link State#LEADER} and runs
+ * Once elected by a majority the instance enters
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader.State#LEADER} and runs
  * proposals offered to {@link #queueProposal(Proposal)}. This continues until
  * the leader is timed out for inactivity, or is deposed by a competing leader
  * gaining its own majority.
@@ -81,36 +85,42 @@
  * Once timed out or deposed this {@code KetchLeader} instance should be
  * discarded, and a new instance takes over.
  * <p>
- * Each leader instance coordinates a group of {@link KetchReplica}s. Replica
- * instances are owned by the leader instance and must be discarded when the
- * leader is discarded.
+ * Each leader instance coordinates a group of
+ * {@link org.eclipse.jgit.internal.ketch.KetchReplica}s. Replica instances are
+ * owned by the leader instance and must be discarded when the leader is
+ * discarded.
  * <p>
  * In Ketch all push requests are issued through the leader. The steps are as
- * follows (see {@link KetchPreReceive} for an example):
+ * follows (see {@link org.eclipse.jgit.internal.ketch.KetchPreReceive} for an
+ * example):
  * <ul>
- * <li>Create a {@link Proposal} with the
+ * <li>Create a {@link org.eclipse.jgit.internal.ketch.Proposal} with the
  * {@link org.eclipse.jgit.transport.ReceiveCommand}s that represent the push.
  * <li>Invoke {@link #queueProposal(Proposal)} on the leader instance.
- * <li>Wait for consensus with {@link Proposal#await()}.
- * <li>To examine the status of the push, check {@link Proposal#getCommands()},
- * looking at
+ * <li>Wait for consensus with
+ * {@link org.eclipse.jgit.internal.ketch.Proposal#await()}.
+ * <li>To examine the status of the push, check
+ * {@link org.eclipse.jgit.internal.ketch.Proposal#getCommands()}, looking at
  * {@link org.eclipse.jgit.internal.storage.reftree.Command#getResult()}.
  * </ul>
  * <p>
  * The leader gains consensus by first pushing the needed objects and a
- * {@link RefTree} representing the desired target repository state to the
- * {@code refs/txn/accepted} branch on each of the replicas. Once a majority has
- * succeeded, the leader commits the state by either pushing the
- * {@code refs/txn/accepted} value to {@code refs/txn/committed} (for
- * Ketch-aware replicas) or by pushing updates to {@code refs/heads/master},
- * etc. for stock Git replicas.
+ * {@link org.eclipse.jgit.internal.storage.reftree.RefTree} representing the
+ * desired target repository state to the {@code refs/txn/accepted} branch on
+ * each of the replicas. Once a majority has succeeded, the leader commits the
+ * state by either pushing the {@code refs/txn/accepted} value to
+ * {@code refs/txn/committed} (for Ketch-aware replicas) or by pushing updates
+ * to {@code refs/heads/master}, etc. for stock Git replicas.
  * <p>
  * Internally, the actual transport to replicas is performed on background
- * threads via the {@link KetchSystem}'s executor service. For performance, the
- * {@link KetchLeader}, {@link KetchReplica} and {@link Proposal} objects share
- * some state, and may invoke each other's methods on different threads. This
- * access is protected by the leader's {@link #lock} object. Care must be taken
- * to prevent concurrent access by correctly obtaining the leader's lock.
+ * threads via the {@link org.eclipse.jgit.internal.ketch.KetchSystem}'s
+ * executor service. For performance, the
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader},
+ * {@link org.eclipse.jgit.internal.ketch.KetchReplica} and
+ * {@link org.eclipse.jgit.internal.ketch.Proposal} objects share some state,
+ * and may invoke each other's methods on different threads. This access is
+ * protected by the leader's {@link #lock} object. Care must be taken to prevent
+ * concurrent access by correctly obtaining the leader's lock.
  */
 public abstract class KetchLeader {
 	private static final Logger log = LoggerFactory.getLogger(KetchLeader.class);
@@ -295,7 +305,7 @@
 	 * The caller will close the repository.
 	 *
 	 * @return opened repository for use by the leader thread.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             cannot reopen the repository for the leader.
 	 */
 	protected abstract Repository openRepository() throws IOException;
@@ -307,16 +317,17 @@
 	 * checked to look for risks of conflicts, and then submitted into the queue
 	 * for distribution as soon as possible.
 	 * <p>
-	 * Callers must use {@link Proposal#await()} to see if the proposal is done.
+	 * Callers must use {@link org.eclipse.jgit.internal.ketch.Proposal#await()}
+	 * to see if the proposal is done.
 	 *
 	 * @param proposal
 	 *            the proposed reference updates to queue for consideration.
 	 *            Once execution is complete the individual reference result
 	 *            fields will be populated with the outcome.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             current thread was interrupted. The proposal may have been
 	 *             aborted if it was not yet queued for execution.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             unrecoverable error preventing proposals from being attempted
 	 *             by this leader.
 	 */
@@ -577,7 +588,11 @@
 		}
 	}
 
-	/** @return snapshot this leader. */
+	/**
+	 * Snapshot this leader
+	 *
+	 * @return snapshot of this leader
+	 */
 	public LeaderSnapshot snapshot() {
 		lock.lock();
 		try {
@@ -599,7 +614,9 @@
 		}
 	}
 
-	/** Gracefully shutdown this leader and cancel outstanding operations. */
+	/**
+	 * Gracefully shutdown this leader and cancel outstanding operations.
+	 */
 	public void shutdown() {
 		lock.lock();
 		try {
@@ -617,6 +634,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return snapshot().toString();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeaderCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeaderCache.java
index ba033c1..de0da4f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeaderCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeaderCache.java
@@ -82,7 +82,7 @@
 	 * @param repo
 	 *            repository to get the leader for.
 	 * @return the leader instance for the repository.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             remote configuration contains an invalid URL.
 	 */
 	public KetchLeader get(Repository repo)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchPreReceive.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchPreReceive.java
index 1b4307f..53d2865 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchPreReceive.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchPreReceive.java
@@ -64,9 +64,10 @@
 /**
  * PreReceiveHook for handling push traffic in a Ketch system.
  * <p>
- * Install an instance on {@link ReceivePack} to capture the commands and other
- * connection state and relay them through the {@link KetchLeader}, allowing the
- * leader to gain consensus about the new reference state.
+ * Install an instance on {@link org.eclipse.jgit.transport.ReceivePack} to
+ * capture the commands and other connection state and relay them through the
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader}, allowing the leader to
+ * gain consensus about the new reference state.
  */
 public class KetchPreReceive implements PreReceiveHook {
 	private static final Logger log = LoggerFactory.getLogger(KetchPreReceive.class);
@@ -74,7 +75,8 @@
 	private final KetchLeader leader;
 
 	/**
-	 * Construct a hook executing updates through a {@link KetchLeader}.
+	 * Construct a hook executing updates through a
+	 * {@link org.eclipse.jgit.internal.ketch.KetchLeader}.
 	 *
 	 * @param leader
 	 *            leader for this repository.
@@ -83,6 +85,7 @@
 		this.leader = leader;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onPreReceive(ReceivePack rp, Collection<ReceiveCommand> cmds) {
 		cmds = ReceiveCommand.filter(cmds, NOT_ATTEMPTED);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchReplica.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchReplica.java
index a30bbb2..a0176d7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchReplica.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchReplica.java
@@ -82,26 +82,32 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * A Ketch replica, either {@link LocalReplica} or {@link RemoteGitReplica}.
+ * A Ketch replica, either {@link org.eclipse.jgit.internal.ketch.LocalReplica}
+ * or {@link org.eclipse.jgit.internal.ketch.RemoteGitReplica}.
  * <p>
  * Replicas can be either a stock Git replica, or a Ketch-aware replica.
  * <p>
  * A stock Git replica has no special knowledge of Ketch and simply stores
  * objects and references. Ketch communicates with the stock Git replica using
- * the Git push wire protocol. The {@link KetchLeader} commits an agreed upon
+ * the Git push wire protocol. The
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader} commits an agreed upon
  * state by pushing all references to the Git replica, for example
  * {@code "refs/heads/master"} is pushed during commit. Stock Git replicas use
- * {@link CommitMethod#ALL_REFS} to record the final state.
+ * {@link org.eclipse.jgit.internal.ketch.KetchReplica.CommitMethod#ALL_REFS} to
+ * record the final state.
  * <p>
  * Ketch-aware replicas understand the {@code RefTree} sent during the proposal
  * and during commit are able to update their own reference space to match the
  * state represented by the {@code RefTree}. Ketch-aware replicas typically use
  * a {@link org.eclipse.jgit.internal.storage.reftree.RefTreeDatabase} and
- * {@link CommitMethod#TXN_COMMITTED} to record the final state.
+ * {@link org.eclipse.jgit.internal.ketch.KetchReplica.CommitMethod#TXN_COMMITTED}
+ * to record the final state.
  * <p>
- * KetchReplica instances are tightly coupled with a single {@link KetchLeader}.
- * Some state may be accessed by the leader thread and uses the leader's own
- * {@link KetchLeader#lock} to protect shared data.
+ * KetchReplica instances are tightly coupled with a single
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader}. Some state may be
+ * accessed by the leader thread and uses the leader's own
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader#lock} to protect shared
+ * data.
  */
 public abstract class KetchReplica {
 	static final Logger log = LoggerFactory.getLogger(KetchReplica.class);
@@ -223,37 +229,65 @@
 		this.queued = new ArrayList<>(4);
 	}
 
-	/** @return system configuration. */
+	/**
+	 * Get system configuration.
+	 *
+	 * @return system configuration.
+	 */
 	public KetchSystem getSystem() {
 		return getLeader().getSystem();
 	}
 
-	/** @return leader instance this replica follows. */
+	/**
+	 * Get leader instance this replica follows.
+	 *
+	 * @return leader instance this replica follows.
+	 */
 	public KetchLeader getLeader() {
 		return leader;
 	}
 
-	/** @return unique-ish name for debugging. */
+	/**
+	 * Get unique-ish name for debugging.
+	 *
+	 * @return unique-ish name for debugging.
+	 */
 	public String getName() {
 		return replicaName;
 	}
 
-	/** @return description of this replica for error/debug logging purposes. */
+	/**
+	 * Get description of this replica for error/debug logging purposes.
+	 *
+	 * @return description of this replica for error/debug logging purposes.
+	 */
 	protected String describeForLog() {
 		return getName();
 	}
 
-	/** @return how the replica participates in this Ketch system. */
+	/**
+	 * Get how the replica participates in this Ketch system.
+	 *
+	 * @return how the replica participates in this Ketch system.
+	 */
 	public Participation getParticipation() {
 		return participation;
 	}
 
-	/** @return how Ketch will commit to the repository. */
+	/**
+	 * Get how Ketch will commit to the repository.
+	 *
+	 * @return how Ketch will commit to the repository.
+	 */
 	public CommitMethod getCommitMethod() {
 		return commitMethod;
 	}
 
-	/** @return when Ketch will commit to the repository. */
+	/**
+	 * Get when Ketch will commit to the repository.
+	 *
+	 * @return when Ketch will commit to the repository.
+	 */
 	public CommitSpeed getCommitSpeed() {
 		return commitSpeed;
 	}
@@ -264,7 +298,8 @@
 	 * Default implementation cancels any scheduled retry. Subclasses may add
 	 * additional logic before or after calling {@code super.shutdown()}.
 	 * <p>
-	 * Called with {@link KetchLeader#lock} held by caller.
+	 * Called with {@link org.eclipse.jgit.internal.ketch.KetchLeader#lock} held
+	 * by caller.
 	 */
 	protected void shutdown() {
 		Future<?> f = retryFuture;
@@ -541,8 +576,8 @@
 	/**
 	 * Begin executing a single push.
 	 * <p>
-	 * This method must move processing onto another thread.
-	 * Called with {@link KetchLeader#lock} held by caller.
+	 * This method must move processing onto another thread. Called with
+	 * {@link org.eclipse.jgit.internal.ketch.KetchLeader#lock} held by caller.
 	 *
 	 * @param req
 	 *            the request to send to the replica.
@@ -666,20 +701,21 @@
 	/**
 	 * Fetch objects from the remote using the calling thread.
 	 * <p>
-	 * Called without {@link KetchLeader#lock}.
+	 * Called without {@link org.eclipse.jgit.internal.ketch.KetchLeader#lock}.
 	 *
 	 * @param repo
 	 *            local repository to fetch objects into.
 	 * @param req
 	 *            the request to fetch from a replica.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             communication with the replica was not possible.
 	 */
 	protected abstract void blockingFetch(Repository repo,
 			ReplicaFetchRequest req) throws IOException;
 
 	/**
-	 * Build a list of commands to commit {@link CommitMethod#ALL_REFS}.
+	 * Build a list of commands to commit
+	 * {@link org.eclipse.jgit.internal.ketch.KetchReplica.CommitMethod#ALL_REFS}.
 	 *
 	 * @param git
 	 *            local leader repository to read committed state from.
@@ -689,7 +725,7 @@
 	 * @param committed
 	 *            state being pushed to {@code refs/txn/committed}.
 	 * @return commands to update during commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             cannot read the committed state.
 	 */
 	protected Collection<ReceiveCommand> prepareCommit(Repository git,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchSystem.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchSystem.java
index 33f526e..1908d6c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchSystem.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchSystem.java
@@ -81,12 +81,17 @@
  * Full scale installations are expected to subclass and override methods to
  * provide consistent configuration across all managed repositories.
  * <p>
- * Servers should configure their own {@link ScheduledExecutorService}.
+ * Servers should configure their own
+ * {@link java.util.concurrent.ScheduledExecutorService}.
  */
 public class KetchSystem {
 	private static final Random RNG = new Random();
 
-	/** @return default executor, one thread per available processor. */
+	/**
+	 * Get default executor, one thread per available processor.
+	 *
+	 * @return default executor, one thread per available processor.
+	 */
 	public static ScheduledExecutorService defaultExecutor() {
 		return DefaultExecutorHolder.I;
 	}
@@ -98,7 +103,9 @@
 	private final String txnCommitted;
 	private final String txnStage;
 
-	/** Create a default system with a thread pool of 1 thread per CPU. */
+	/**
+	 * Create a default system with a thread pool of 1 thread per CPU.
+	 */
 	public KetchSystem() {
 		this(defaultExecutor(), new MonotonicSystemClock(), DEFAULT_TXN_NAMESPACE);
 	}
@@ -125,17 +132,29 @@
 		this.txnStage = txnNamespace + STAGE;
 	}
 
-	/** @return executor to perform background operations. */
+	/**
+	 * Get executor to perform background operations.
+	 *
+	 * @return executor to perform background operations.
+	 */
 	public ScheduledExecutorService getExecutor() {
 		return executor;
 	}
 
-	/** @return clock to obtain timestamps from. */
+	/**
+	 * Get clock to obtain timestamps from.
+	 *
+	 * @return clock to obtain timestamps from.
+	 */
 	public MonotonicClock getClock() {
 		return clock;
 	}
 
 	/**
+	 * Get how long the leader will wait for the {@link #getClock()}'s
+	 * {@code ProposedTimestamp} used in commits proposed to the RefTree graph
+	 * ({@link #getTxnAccepted()})
+	 *
 	 * @return how long the leader will wait for the {@link #getClock()}'s
 	 *         {@code ProposedTimestamp} used in commits proposed to the RefTree
 	 *         graph ({@link #getTxnAccepted()}). Defaults to 5 seconds.
@@ -145,8 +164,12 @@
 	}
 
 	/**
-	 * @return true if elections should require monotonically increasing commit
-	 *         timestamps. This requires a very good {@link MonotonicClock}.
+	 * Whether elections should require monotonically increasing commit
+	 * timestamps
+	 *
+	 * @return {@code true} if elections should require monotonically increasing
+	 *         commit timestamps. This requires a very good
+	 *         {@link org.eclipse.jgit.util.time.MonotonicClock}.
 	 */
 	public boolean requireMonotonicLeaderElections() {
 		return false;
@@ -161,22 +184,36 @@
 		return txnNamespace;
 	}
 
-	/** @return name of the accepted RefTree graph. */
+	/**
+	 * Get name of the accepted RefTree graph.
+	 *
+	 * @return name of the accepted RefTree graph.
+	 */
 	public String getTxnAccepted() {
 		return txnAccepted;
 	}
 
-	/** @return name of the committed RefTree graph. */
+	/**
+	 * Get name of the committed RefTree graph.
+	 *
+	 * @return name of the committed RefTree graph.
+	 */
 	public String getTxnCommitted() {
 		return txnCommitted;
 	}
 
-	/** @return prefix for staged objects, e.g. {@code "refs/txn/stage/"}. */
+	/**
+	 * Get prefix for staged objects, e.g. {@code "refs/txn/stage/"}.
+	 *
+	 * @return prefix for staged objects, e.g. {@code "refs/txn/stage/"}.
+	 */
 	public String getTxnStage() {
 		return txnStage;
 	}
 
 	/**
+	 * Create new committer {@code PersonIdent} for ketch system
+	 *
 	 * @param time
 	 *            timestamp for the committer.
 	 * @return identity line for the committer header of a RefTreeGraph.
@@ -220,7 +257,7 @@
 	 * @param repo
 	 *            local repository stored by the leader.
 	 * @return leader instance.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             a follower configuration contains an unsupported URI.
 	 */
 	public KetchLeader createLeader(final Repository repo)
@@ -246,7 +283,7 @@
 	 * @param repo
 	 *            repository to get the replicas of.
 	 * @return collection of replicas for the specified repository.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             a configured URI is invalid.
 	 */
 	protected List<KetchReplica> createReplicas(KetchLeader leader,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchText.java
index b6c3bc9..fa34a88 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchText.java
@@ -46,9 +46,15 @@
 import org.eclipse.jgit.nls.NLS;
 import org.eclipse.jgit.nls.TranslationBundle;
 
-/** Translation bundle for the Ketch implementation. */
+/**
+ * Translation bundle for the Ketch implementation.
+ */
 public class KetchText extends TranslationBundle {
-	/** @return instance of this translation bundle. */
+	/**
+	 * Get an instance of this translation bundle.
+	 *
+	 * @return instance of this translation bundle.
+	 */
 	public static KetchText get() {
 		return NLS.getBundleFor(KetchText.class);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LagCheck.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LagCheck.java
index 757c19a..c09d872 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LagCheck.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LagCheck.java
@@ -86,6 +86,7 @@
 		rw.setRetainBody(false);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (rw != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LeaderSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LeaderSnapshot.java
index 28a49df..4c8bd06 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LeaderSnapshot.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LeaderSnapshot.java
@@ -53,7 +53,9 @@
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.lib.ObjectId;
 
-/** A snapshot of a leader and its view of the world. */
+/**
+ * A snapshot of a leader and its view of the world.
+ */
 public class LeaderSnapshot {
 	final List<ReplicaSnapshot> replicas = new ArrayList<>();
 	KetchLeader.State state;
@@ -65,17 +67,28 @@
 	LeaderSnapshot() {
 	}
 
-	/** @return unmodifiable view of configured replicas. */
+	/**
+	 * Get unmodifiable view of configured replicas.
+	 *
+	 * @return unmodifiable view of configured replicas.
+	 */
 	public Collection<ReplicaSnapshot> getReplicas() {
 		return Collections.unmodifiableList(replicas);
 	}
 
-	/** @return current state of the leader. */
+	/**
+	 * Get current state of the leader.
+	 *
+	 * @return current state of the leader.
+	 */
 	public KetchLeader.State getState() {
 		return state;
 	}
 
 	/**
+	 * Whether the leader is not running a round to reach consensus, and has no
+	 * rounds queued.
+	 *
 	 * @return {@code true} if the leader is not running a round to reach
 	 *         consensus, and has no rounds queued.
 	 */
@@ -84,14 +97,19 @@
 	}
 
 	/**
+	 * Get term of this leader
+	 *
 	 * @return term of this leader. Valid only if {@link #getState()} is
-	 *         currently {@link KetchLeader.State#LEADER}.
+	 *         currently
+	 *         {@link org.eclipse.jgit.internal.ketch.KetchLeader.State#LEADER}.
 	 */
 	public long getTerm() {
 		return term;
 	}
 
 	/**
+	 * Get end of the leader's log
+	 *
 	 * @return end of the leader's log; null if leader hasn't started up enough
 	 *         to begin its own election.
 	 */
@@ -101,6 +119,9 @@
 	}
 
 	/**
+	 * Get state the leader knows is committed on a majority of participant
+	 * replicas
+	 *
 	 * @return state the leader knows is committed on a majority of participant
 	 *         replicas. Null until the leader instance has committed a log
 	 *         index within its own term.
@@ -110,6 +131,7 @@
 		return committedIndex;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LocalReplica.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LocalReplica.java
index 907eecb..9c37a90 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LocalReplica.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LocalReplica.java
@@ -67,7 +67,10 @@
 import org.eclipse.jgit.util.time.MonotonicClock;
 import org.eclipse.jgit.util.time.ProposedTimestamp;
 
-/** Ketch replica running on the same system as the {@link KetchLeader}. */
+/**
+ * Ketch replica running on the same system as the
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader}.
+ */
 public class LocalReplica extends KetchReplica {
 	/**
 	 * Configure a local replica.
@@ -83,6 +86,7 @@
 		super(leader, name, cfg);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected String describeForLog() {
 		return String.format("%s (leader)", getName()); //$NON-NLS-1$
@@ -116,6 +120,7 @@
 				getSystem().getTxnCommitted()));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void startPush(final ReplicaPushRequest req) {
 		getSystem().getExecutor().execute(new Runnable() {
@@ -137,6 +142,7 @@
 		});
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void blockingFetch(Repository repo, ReplicaFetchRequest req)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LogIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LogIndex.java
index 350c8ed..eb600bb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LogIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/LogIndex.java
@@ -54,17 +54,18 @@
  * LogIndex provides a performance optimization for Ketch, the same information
  * can be obtained from {@link org.eclipse.jgit.revwalk.RevWalk}.
  * <p>
- * Index values are only valid within a single {@link KetchLeader} instance
- * after it has won an election. By restricting scope to a single leader new
- * leaders do not need to traverse the entire history to determine the next
- * {@code index} for new proposals. This differs from Raft, where leader
- * election uses the log index and the term number to determine which replica
- * holds a sufficiently up-to-date log. Since Ketch uses Git objects for storage
- * of its replicated log, it keeps the term number as Raft does but uses
- * standard Git operations to imply the log index.
+ * Index values are only valid within a single
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader} instance after it has won
+ * an election. By restricting scope to a single leader new leaders do not need
+ * to traverse the entire history to determine the next {@code index} for new
+ * proposals. This differs from Raft, where leader election uses the log index
+ * and the term number to determine which replica holds a sufficiently
+ * up-to-date log. Since Ketch uses Git objects for storage of its replicated
+ * log, it keeps the term number as Raft does but uses standard Git operations
+ * to imply the log index.
  * <p>
- * {@link Round#runAsync(AnyObjectId)} bumps the index as each new round is
- * constructed.
+ * {@link org.eclipse.jgit.internal.ketch.Round#runAsync(AnyObjectId)} bumps the
+ * index as each new round is constructed.
  */
 public class LogIndex extends ObjectId {
 	static LogIndex unknown(AnyObjectId id) {
@@ -82,7 +83,11 @@
 		return new LogIndex(id, index + 1);
 	}
 
-	/** @return index provided by the current leader instance. */
+	/**
+	 * Get index provided by the current leader instance.
+	 *
+	 * @return index provided by the current leader instance.
+	 */
 	public long getIndex() {
 		return index;
 	}
@@ -103,6 +108,9 @@
 	}
 
 	/**
+	 * Create string suitable for debug logging containing the log index and
+	 * abbreviated ObjectId.
+	 *
 	 * @return string suitable for debug logging containing the log index and
 	 *         abbreviated ObjectId.
 	 */
@@ -111,6 +119,7 @@
 		return String.format("%5d/%s", index, abbreviate(6).name()); //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("boxing")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/Proposal.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/Proposal.java
index 12d3f4c..db2ad23 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/Proposal.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/Proposal.java
@@ -78,10 +78,11 @@
  * area under the {@code refs/txn/stage/} namespace. If the proposal succeeds
  * then the changes are durable and the leader can commit the proposal.
  * <p>
- * Proposals are executed by {@link KetchLeader#queueProposal(Proposal)}, which
- * runs them asynchronously in the background. Proposals are thread-safe futures
- * allowing callers to {@link #await()} for results or be notified by callback
- * using {@link #addListener(Runnable)}.
+ * Proposals are executed by
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader#queueProposal(Proposal)},
+ * which runs them asynchronously in the background. Proposals are thread-safe
+ * futures allowing callers to {@link #await()} for results or be notified by
+ * callback using {@link #addListener(Runnable)}.
  */
 public class Proposal {
 	/** Current state of the proposal. */
@@ -146,9 +147,9 @@
 	 *            walker to assist in preparing commands.
 	 * @param cmds
 	 *            list of pending commands.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             newId of a command is not found locally.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             local objects cannot be accessed.
 	 */
 	public Proposal(RevWalk rw, Collection<ReceiveCommand> cmds)
@@ -166,12 +167,20 @@
 		return Collections.unmodifiableList(commands);
 	}
 
-	/** @return commands from this proposal. */
+	/**
+	 * Get commands from this proposal.
+	 *
+	 * @return commands from this proposal.
+	 */
 	public Collection<Command> getCommands() {
 		return commands;
 	}
 
-	/** @return optional author of the proposal. */
+	/**
+	 * Get optional author of the proposal.
+	 *
+	 * @return optional author of the proposal.
+	 */
 	@Nullable
 	public PersonIdent getAuthor() {
 		return author;
@@ -189,7 +198,11 @@
 		return this;
 	}
 
-	/** @return optional message for the commit log of the RefTree. */
+	/**
+	 * Get optional message for the commit log of the RefTree.
+	 *
+	 * @return optional message for the commit log of the RefTree.
+	 */
 	@Nullable
 	public String getMessage() {
 		return message;
@@ -207,7 +220,11 @@
 		return this;
 	}
 
-	/** @return optional certificate signing the references. */
+	/**
+	 * Get optional certificate signing the references.
+	 *
+	 * @return optional certificate signing the references.
+	 */
 	@Nullable
 	public PushCertificate getPushCertificate() {
 		return pushCert;
@@ -226,6 +243,8 @@
 	}
 
 	/**
+	 * Get timestamps that Ketch must block for.
+	 *
 	 * @return timestamps that Ketch must block for. These may have been used as
 	 *         commit times inside the objects involved in the proposal.
 	 */
@@ -240,6 +259,7 @@
 	 * Request the proposal to wait for the affected timestamps to resolve.
 	 *
 	 * @param ts
+	 *            a {@link org.eclipse.jgit.util.time.ProposedTimestamp} object.
 	 * @return {@code this}.
 	 */
 	public Proposal addProposedTimestamp(ProposedTimestamp ts) {
@@ -253,9 +273,11 @@
 	/**
 	 * Add a callback to be invoked when the proposal is done.
 	 * <p>
-	 * A proposal is done when it has entered either {@link State#EXECUTED} or
-	 * {@link State#ABORTED} state. If the proposal is already done
-	 * {@code callback.run()} is immediately invoked on the caller's thread.
+	 * A proposal is done when it has entered either
+	 * {@link org.eclipse.jgit.internal.ketch.Proposal.State#EXECUTED} or
+	 * {@link org.eclipse.jgit.internal.ketch.Proposal.State#ABORTED} state. If
+	 * the proposal is already done {@code callback.run()} is immediately
+	 * invoked on the caller's thread.
 	 *
 	 * @param callback
 	 *            method to run after the proposal is done. The callback may be
@@ -291,12 +313,18 @@
 		notifyState(ABORTED);
 	}
 
-	/** @return read the current state of the proposal. */
+	/**
+	 * Read the current state of the proposal.
+	 *
+	 * @return read the current state of the proposal.
+	 */
 	public State getState() {
 		return state.get();
 	}
 
 	/**
+	 * Whether the proposal was attempted
+	 *
 	 * @return {@code true} if the proposal was attempted. A true value does not
 	 *         mean consensus was reached, only that the proposal was considered
 	 *         and will not be making any more progress beyond its current
@@ -309,7 +337,7 @@
 	/**
 	 * Wait for the proposal to be attempted and {@link #isDone()} to be true.
 	 *
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             caller was interrupted before proposal executed.
 	 */
 	public void await() throws InterruptedException {
@@ -328,7 +356,7 @@
 	 * @param unit
 	 *            unit describing the wait time.
 	 * @return true if the proposal is done; false if the method timed out.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             caller was interrupted before proposal executed.
 	 */
 	public boolean await(long wait, TimeUnit unit) throws InterruptedException {
@@ -351,7 +379,7 @@
 	 * @param unit
 	 *            unit describing the wait time.
 	 * @return true if the proposal exited the state; false on time out.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             caller was interrupted before proposal executed.
 	 */
 	public boolean awaitStateChange(State notIn, long wait, TimeUnit unit)
@@ -378,6 +406,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/RemoteGitReplica.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/RemoteGitReplica.java
index a0ac608..674da1f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/RemoteGitReplica.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/RemoteGitReplica.java
@@ -80,7 +80,8 @@
 /**
  * Representation of a Git repository on a remote replica system.
  * <p>
- * {@link KetchLeader} will contact the replica using the Git wire protocol.
+ * {@link org.eclipse.jgit.internal.ketch.KetchLeader} will contact the replica
+ * using the Git wire protocol.
  * <p>
  * The remote replica may be fully Ketch-aware, or a standard Git server.
  */
@@ -110,22 +111,32 @@
 		this.remoteConfig = rc;
 	}
 
-	/** @return URI to contact the remote peer repository. */
+	/**
+	 * Get URI to contact the remote peer repository.
+	 *
+	 * @return URI to contact the remote peer repository.
+	 */
 	public URIish getURI() {
 		return uri;
 	}
 
-	/** @return optional configuration describing how to contact the peer. */
+	/**
+	 * Get optional configuration describing how to contact the peer.
+	 *
+	 * @return optional configuration describing how to contact the peer.
+	 */
 	@Nullable
 	protected RemoteConfig getRemoteConfig() {
 		return remoteConfig;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected String describeForLog() {
 		return String.format("%s @ %s", getName(), getURI()); //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void startPush(final ReplicaPushRequest req) {
 		getSystem().getExecutor().execute(new Runnable() {
@@ -240,6 +251,7 @@
 		ReceiveCommand.abort(tmp);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void blockingFetch(Repository repo, ReplicaFetchRequest req)
 			throws NotSupportedException, TransportException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaConfig.java
index e16e63a..84261f1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaConfig.java
@@ -65,7 +65,9 @@
 import org.eclipse.jgit.internal.ketch.KetchReplica.Participation;
 import org.eclipse.jgit.lib.Config;
 
-/** Configures a {@link KetchReplica}. */
+/**
+ * Configures a {@link org.eclipse.jgit.internal.ketch.KetchReplica}.
+ */
 public class ReplicaConfig {
 	/**
 	 * Read a configuration from a config block.
@@ -86,17 +88,29 @@
 	private long minRetry = SECONDS.toMillis(5);
 	private long maxRetry = MINUTES.toMillis(1);
 
-	/** @return participation of the replica in the system. */
+	/**
+	 * Get participation of the replica in the system.
+	 *
+	 * @return participation of the replica in the system.
+	 */
 	public Participation getParticipation() {
 		return participation;
 	}
 
-	/** @return how Ketch should apply committed changes. */
+	/**
+	 * Get how Ketch should apply committed changes.
+	 *
+	 * @return how Ketch should apply committed changes.
+	 */
 	public CommitMethod getCommitMethod() {
 		return commitMethod;
 	}
 
-	/** @return how quickly should Ketch commit. */
+	/**
+	 * Get how quickly should Ketch commit.
+	 *
+	 * @return how quickly should Ketch commit.
+	 */
 	public CommitSpeed getCommitSpeed() {
 		return commitSpeed;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaFetchRequest.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaFetchRequest.java
index 201d9e9..11c5b61 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaFetchRequest.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaFetchRequest.java
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
 
-/** A fetch request to obtain objects from a replica, and its result. */
+/**
+ * A fetch request to obtain objects from a replica, and its result.
+ */
 public class ReplicaFetchRequest {
 	private final Set<String> wantRefs;
 	private final Set<ObjectId> wantObjects;
@@ -70,23 +72,37 @@
 		this.wantObjects = wantObjects;
 	}
 
-	/** @return references to be fetched. */
+	/**
+	 * Get references to be fetched.
+	 *
+	 * @return references to be fetched.
+	 */
 	public Set<String> getWantRefs() {
 		return wantRefs;
 	}
 
-	/** @return objects to be fetched. */
+	/**
+	 * Get objects to be fetched.
+	 *
+	 * @return objects to be fetched.
+	 */
 	public Set<ObjectId> getWantObjects() {
 		return wantObjects;
 	}
 
-	/** @return remote references, usually from the advertisement. */
+	/**
+	 * Get remote references, usually from the advertisement.
+	 *
+	 * @return remote references, usually from the advertisement.
+	 */
 	@Nullable
 	public Map<String, Ref> getRefs() {
 		return refs;
 	}
 
 	/**
+	 * Set references observed from the replica.
+	 *
 	 * @param refs
 	 *            references observed from the replica.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaPushRequest.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaPushRequest.java
index 691b142..603288e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaPushRequest.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaPushRequest.java
@@ -54,8 +54,8 @@
 /**
  * A push request sending objects to a replica, and its result.
  * <p>
- * Implementors of {@link KetchReplica} must populate the command result fields,
- * {@link #setRefs(Map)}, and call one of
+ * Implementors of {@link org.eclipse.jgit.internal.ketch.KetchReplica} must
+ * populate the command result fields, {@link #setRefs(Map)}, and call one of
  * {@link #setException(Repository, Throwable)} or {@link #done(Repository)} to
  * finish processing.
  */
@@ -80,18 +80,28 @@
 		this.commands = commands;
 	}
 
-	/** @return commands to be executed, and their results. */
+	/**
+	 * Get commands to be executed, and their results.
+	 *
+	 * @return commands to be executed, and their results.
+	 */
 	public Collection<ReceiveCommand> getCommands() {
 		return commands;
 	}
 
-	/** @return remote references, usually from the advertisement. */
+	/**
+	 * Get remote references, usually from the advertisement.
+	 *
+	 * @return remote references, usually from the advertisement.
+	 */
 	@Nullable
 	public Map<String, Ref> getRefs() {
 		return refs;
 	}
 
 	/**
+	 * Set references observed from the replica.
+	 *
 	 * @param refs
 	 *            references observed from the replica.
 	 */
@@ -99,7 +109,11 @@
 		this.refs = refs;
 	}
 
-	/** @return exception thrown, if any. */
+	/**
+	 * Get exception thrown, if any.
+	 *
+	 * @return exception thrown, if any.
+	 */
 	@Nullable
 	public Throwable getException() {
 		return exception;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaSnapshot.java
index 8c3de02..263be77 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaSnapshot.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/ReplicaSnapshot.java
@@ -65,31 +65,50 @@
 		this.replica = replica;
 	}
 
-	/** @return the replica this snapshot describes the state of. */
+	/**
+	 * Get the replica this snapshot describes the state of
+	 *
+	 * @return the replica this snapshot describes the state of
+	 */
 	public KetchReplica getReplica() {
 		return replica;
 	}
 
-	/** @return current state of the replica. */
+	/**
+	 * Get current state of the replica
+	 *
+	 * @return current state of the replica
+	 */
 	public KetchReplica.State getState() {
 		return state;
 	}
 
-	/** @return last known Git commit at {@code refs/txn/accepted}. */
+	/**
+	 * Get last known Git commit at {@code refs/txn/accepted}
+	 *
+	 * @return last known Git commit at {@code refs/txn/accepted}
+	 */
 	@Nullable
 	public ObjectId getAccepted() {
 		return accepted;
 	}
 
-	/** @return last known Git commit at {@code refs/txn/committed}. */
+	/**
+	 * Get last known Git commit at {@code refs/txn/committed}
+	 *
+	 * @return last known Git commit at {@code refs/txn/committed}
+	 */
 	@Nullable
 	public ObjectId getCommitted() {
 		return committed;
 	}
 
 	/**
-	 * @return if {@link #getState()} == {@link KetchReplica.State#OFFLINE} an
-	 *         optional human-readable message from the transport system
+	 * Get error message
+	 *
+	 * @return if {@link #getState()} ==
+	 *         {@link org.eclipse.jgit.internal.ketch.KetchReplica.State#OFFLINE}
+	 *         an optional human-readable message from the transport system
 	 *         explaining the failure.
 	 */
 	@Nullable
@@ -98,6 +117,9 @@
 	}
 
 	/**
+	 * Get when the leader will retry communication with the offline or lagging
+	 * replica
+	 *
 	 * @return time (usually in the future) when the leader will retry
 	 *         communication with the offline or lagging replica; null if no
 	 *         retry is scheduled or necessary.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/StageBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/StageBuilder.java
index 61871a4..ae82dce 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/StageBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/StageBuilder.java
@@ -66,7 +66,9 @@
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 
-/** Constructs a set of commands to stage content during a proposal. */
+/**
+ * Constructs a set of commands to stage content during a proposal.
+ */
 public class StageBuilder {
 	/**
 	 * Acceptable number of references to send in a single stage transaction.
@@ -119,14 +121,15 @@
 	 *            from.
 	 * @param oldTree
 	 *            accepted RefTree on the replica ({@code refs/txn/accepted}).
-	 *            Use {@link ObjectId#zeroId()} if the remote does not have any
-	 *            ref tree, e.g. a new replica catching up.
+	 *            Use {@link org.eclipse.jgit.lib.ObjectId#zeroId()} if the
+	 *            remote does not have any ref tree, e.g. a new replica catching
+	 *            up.
 	 * @param newTree
 	 *            RefTree being sent to the replica. The trees will be compared.
 	 * @return list of commands to create {@code "refs/txn/stage/..."}
 	 *         references on replicas anchoring new objects into the repository
 	 *         while a transaction gains consensus.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             {@code git} cannot be accessed to compare {@code oldTree} and
 	 *             {@code newTree} to build the object set.
 	 */
@@ -172,7 +175,7 @@
 	 * @return list of commands to create {@code "refs/txn/stage/..."}
 	 *         references on replicas anchoring {@code newObjs} into the
 	 *         repository while a transaction gains consensus.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             {@code git} cannot be accessed to perform minification of
 	 *             {@code newObjs}.
 	 */
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
new file mode 100644
index 0000000..468d930
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddToBitmapFilter.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.internal.revwalk;
+
+import org.eclipse.jgit.lib.BitmapIndex.Bitmap;
+import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.revwalk.filter.RevFilter;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+
+/**
+ * A RevFilter that adds the visited commits to {@code bitmap} as a side
+ * effect.
+ * <p>
+ * When the walk hits a commit that is part of {@code bitmap}'s
+ * BitmapIndex, that entire bitmap is ORed into {@code bitmap} and the
+ * commit and its parents are marked as SEEN so that the walk does not
+ * have to visit its ancestors.  This ensures the walk is very short if
+ * there is good bitmap coverage.
+ */
+public class AddToBitmapFilter extends RevFilter {
+	private final BitmapBuilder bitmap;
+
+	/**
+	 * Create a filter that adds visited commits to the given bitmap.
+	 *
+	 * @param bitmap bitmap to write visited commits to
+	 */
+	public AddToBitmapFilter(BitmapBuilder bitmap) {
+		this.bitmap = bitmap;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public final boolean include(RevWalk walker, RevCommit cmit) {
+		Bitmap visitedBitmap;
+
+		if (bitmap.contains(cmit)) {
+			// already included
+		} else if ((visitedBitmap = bitmap.getBitmapIndex()
+				.getBitmap(cmit)) != null) {
+			bitmap.or(visitedBitmap);
+		} else {
+			bitmap.addObject(cmit, Constants.OBJ_COMMIT);
+			return true;
+		}
+
+		for (RevCommit p : cmit.getParents()) {
+			p.add(RevFlag.SEEN);
+		}
+		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
new file mode 100644
index 0000000..a52c6a2
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/revwalk/AddUnseenToBitmapFilter.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2017, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.internal.revwalk;
+
+import org.eclipse.jgit.lib.BitmapIndex.Bitmap;
+import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.revwalk.filter.RevFilter;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+
+/**
+ * A RevFilter that adds the visited commits to {@code bitmap} as a side
+ * effect.
+ * <p>
+ * When the walk hits a commit that is part of {@code bitmap}'s
+ * BitmapIndex, that entire bitmap is ORed into {@code bitmap} and the
+ * commit and its parents are marked as SEEN so that the walk does not
+ * have to visit its ancestors.  This ensures the walk is very short if
+ * there is good bitmap coverage.
+ * <p>
+ * Commits named in {@code seen} are considered already seen.  If one is
+ * encountered, that commit and its parents will be marked with the SEEN
+ * flag to prevent the walk from visiting its ancestors.
+ */
+public class AddUnseenToBitmapFilter extends RevFilter {
+	private final BitmapBuilder seen;
+	private final BitmapBuilder bitmap;
+
+	/**
+	 * Create a filter that adds visited commits to the given bitmap, but does not walk
+	 * through the objects in {@code seen}.
+	 *
+	 * @param seen objects that are already seen
+	 * @param bitmap bitmap to write visited commits to
+	 */
+	public AddUnseenToBitmapFilter(BitmapBuilder seen, BitmapBuilder bitmap) {
+		this.seen = seen;
+		this.bitmap = bitmap;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public final boolean include(RevWalk walker, RevCommit cmit) {
+		Bitmap visitedBitmap;
+
+		if (seen.contains(cmit) || bitmap.contains(cmit)) {
+			// already seen or included
+		} else if ((visitedBitmap = bitmap.getBitmapIndex()
+				.getBitmap(cmit)) != null) {
+			bitmap.or(visitedBitmap);
+		} else {
+			bitmap.addObject(cmit, Constants.OBJ_COMMIT);
+			return true;
+		}
+
+		for (RevCommit p : cmit.getParents()) {
+			p.add(RevFlag.SEEN);
+		}
+		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/storage/dfs/BeforeDfsPackIndexLoadedEvent.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedEvent.java
index 75ccb07..10d8e89 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
@@ -46,10 +46,10 @@
 import org.eclipse.jgit.events.RepositoryEvent;
 
 /**
- * Describes the {@link DfsPackFile} just before its index is loaded. Currently,
- * DfsPackFile directly dispatches the event on
- * {@link org.eclipse.jgit.lib.Repository#getGlobalListenerList}. Which means
- * the call to {@link #getRepository} will always return null.
+ * Describes the {@link org.eclipse.jgit.internal.storage.dfs.DfsPackFile} just
+ * before its index is loaded. Currently, DfsPackFile directly dispatches the
+ * event on {@link org.eclipse.jgit.lib.Repository#getGlobalListenerList}. Which
+ * means the call to {@link #getRepository} will always return null.
  */
 public class BeforeDfsPackIndexLoadedEvent
 		extends RepositoryEvent<BeforeDfsPackIndexLoadedListener> {
@@ -65,16 +65,22 @@
 		this.pack = pack;
 	}
 
-	/** @return the PackFile containing the index that will be loaded. */
+	/**
+	 * Get the PackFile containing the index that will be loaded.
+	 *
+	 * @return the PackFile containing the index that will be loaded.
+	 */
 	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/BeforeDfsPackIndexLoadedListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedListener.java
index 9f7f350..517e42b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BeforeDfsPackIndexLoadedListener.java
@@ -46,7 +46,8 @@
 import org.eclipse.jgit.events.RepositoryListener;
 
 /**
- * Receives {@link BeforeDfsPackIndexLoadedEvent}s.
+ * Receives
+ * {@link org.eclipse.jgit.internal.storage.dfs.BeforeDfsPackIndexLoadedEvent}s.
  */
 public interface BeforeDfsPackIndexLoadedListener extends RepositoryListener {
 	/**
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 45202b5..14dc80f 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
@@ -46,14 +46,19 @@
 
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.LongStream;
 
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
 
 /**
- * Caches slices of a {@link BlockBasedFile} in memory for faster read access.
+ * Caches slices of a
+ * {@link org.eclipse.jgit.internal.storage.dfs.BlockBasedFile} in memory for
+ * faster read access.
  * <p>
  * The DfsBlockCache serves as a Java based "buffer cache", loading segments of
  * a BlockBasedFile into the JVM heap prior to use. As JGit often wants to do
@@ -61,8 +66,8 @@
  * these tiny reads into larger block-sized IO operations.
  * <p>
  * Whenever a cache miss occurs, loading is invoked by exactly one thread for
- * the given <code>(DfsPackKey,position)</code> key tuple. This is ensured by an
- * array of locks, with the tuple hashed to a lock instance.
+ * the given <code>(DfsStreamKey,position)</code> key tuple. This is ensured by
+ * an array of locks, with the tuple hashed to a lock instance.
  * <p>
  * Its too expensive during object access to be accurate with a least recently
  * used (LRU) algorithm. Strictly ordering every read is a lot of overhead that
@@ -100,7 +105,7 @@
 	 *
 	 * @param cfg
 	 *            the new window cache configuration.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the cache configuration contains one or more invalid
 	 *             settings, usually too low of a limit.
 	 */
@@ -108,7 +113,11 @@
 		cache = new DfsBlockCache(cfg);
 	}
 
-	/** @return the currently active DfsBlockCache. */
+	/**
+	 * Get the currently active DfsBlockCache.
+	 *
+	 * @return the currently active DfsBlockCache.
+	 */
 	public static DfsBlockCache getInstance() {
 		return cache;
 	}
@@ -143,14 +152,27 @@
 	/** As {@link #blockSize} is a power of 2, bits to shift for a / blockSize. */
 	private final int blockSizeShift;
 
-	/** Number of times a block was found in the cache. */
-	private final AtomicLong statHit;
+	/**
+	 * Number of times a block was found in the cache, per pack file extension.
+	 */
+	private final AtomicReference<AtomicLong[]> statHit;
 
-	/** Number of times a block was not found, and had to be loaded. */
-	private final AtomicLong statMiss;
+	/**
+	 * Number of times a block was not found, and had to be loaded, per pack
+	 * file extension.
+	 */
+	private final AtomicReference<AtomicLong[]> statMiss;
 
-	/** Number of blocks evicted due to cache being full. */
-	private volatile long statEvict;
+	/**
+	 * Number of blocks evicted due to cache being full, per pack file
+	 * extension.
+	 */
+	private final AtomicReference<AtomicLong[]> statEvict;
+
+	/**
+	 * Number of bytes currently loaded in the cache, per pack file extension.
+	 */
+	private final AtomicReference<AtomicLong[]> liveBytes;
 
 	/** Protects the clock and its related data. */
 	private final ReentrantLock clockLock;
@@ -158,9 +180,6 @@
 	/** Current position of the clock. */
 	private Ref clockHand;
 
-	/** Number of bytes currently loaded in the cache. */
-	private volatile long liveBytes;
-
 	@SuppressWarnings("unchecked")
 	private DfsBlockCache(final DfsBlockCacheConfig cfg) {
 		tableSize = tableSize(cfg);
@@ -180,56 +199,127 @@
 		clockLock = new ReentrantLock(true /* fair */);
 		String none = ""; //$NON-NLS-1$
 		clockHand = new Ref<>(
-				DfsStreamKey.of(new DfsRepositoryDescription(none), none),
+				DfsStreamKey.of(new DfsRepositoryDescription(none), none, null),
 				-1, 0, null);
 		clockHand.next = clockHand;
 
-		statHit = new AtomicLong();
-		statMiss = new AtomicLong();
+		statHit = new AtomicReference<>(newCounters());
+		statMiss = new AtomicReference<>(newCounters());
+		statEvict = new AtomicReference<>(newCounters());
+		liveBytes = new AtomicReference<>(newCounters());
 	}
 
 	boolean shouldCopyThroughCache(long length) {
 		return length <= maxStreamThroughCache;
 	}
 
-	/** @return total number of bytes in the cache. */
-	public long getCurrentSize() {
-		return liveBytes;
+	/**
+	 * Get total number of bytes in the cache, per pack file extension.
+	 *
+	 * @return total number of bytes in the cache, per pack file extension.
+	 */
+	public long[] getCurrentSize() {
+		return getStatVals(liveBytes);
 	}
 
-	/** @return 0..100, defining how full the cache is. */
+	/**
+	 * Get 0..100, defining how full the cache is.
+	 *
+	 * @return 0..100, defining how full the cache is.
+	 */
 	public long getFillPercentage() {
-		return getCurrentSize() * 100 / maxBytes;
+		return LongStream.of(getCurrentSize()).sum() * 100 / maxBytes;
 	}
 
-	/** @return number of requests for items in the cache. */
-	public long getHitCount() {
-		return statHit.get();
+	/**
+	 * Get number of requests for items in the cache, per pack file extension.
+	 *
+	 * @return number of requests for items in the cache, per pack file
+	 *         extension.
+	 */
+	public long[] getHitCount() {
+		return getStatVals(statHit);
 	}
 
-	/** @return number of requests for items not in the cache. */
-	public long getMissCount() {
-		return statMiss.get();
+	/**
+	 * Get number of requests for items not in the cache, per pack file
+	 * extension.
+	 *
+	 * @return number of requests for items not in the cache, per pack file
+	 *         extension.
+	 */
+	public long[] getMissCount() {
+		return getStatVals(statMiss);
 	}
 
-	/** @return total number of requests (hit + miss). */
-	public long getTotalRequestCount() {
-		return getHitCount() + getMissCount();
+	/**
+	 * Get total number of requests (hit + miss), per pack file extension.
+	 *
+	 * @return total number of requests (hit + miss), per pack file extension.
+	 */
+	public long[] getTotalRequestCount() {
+		AtomicLong[] hit = statHit.get();
+		AtomicLong[] miss = statMiss.get();
+		long[] cnt = new long[Math.max(hit.length, miss.length)];
+		for (int i = 0; i < hit.length; i++) {
+			cnt[i] += hit[i].get();
+		}
+		for (int i = 0; i < miss.length; i++) {
+			cnt[i] += miss[i].get();
+		}
+		return cnt;
 	}
 
-	/** @return 0..100, defining number of cache hits. */
-	public long getHitRatio() {
-		long hits = statHit.get();
-		long miss = statMiss.get();
-		long total = hits + miss;
-		if (total == 0)
-			return 0;
-		return hits * 100 / total;
+	/**
+	 * Get hit ratios
+	 *
+	 * @return hit ratios
+	 */
+	public long[] getHitRatio() {
+		AtomicLong[] hit = statHit.get();
+		AtomicLong[] miss = statMiss.get();
+		long[] ratio = new long[Math.max(hit.length, miss.length)];
+		for (int i = 0; i < ratio.length; i++) {
+			if (i >= hit.length) {
+				ratio[i] = 0;
+			} else if (i >= miss.length) {
+				ratio[i] = 100;
+			} else {
+				long hitVal = hit[i].get();
+				long missVal = miss[i].get();
+				long total = hitVal + missVal;
+				ratio[i] = total == 0 ? 0 : hitVal * 100 / total;
+			}
+		}
+		return ratio;
 	}
 
-	/** @return number of evictions performed due to cache being full. */
-	public long getEvictions() {
-		return statEvict;
+	/**
+	 * Get number of evictions performed due to cache being full, per pack file
+	 * extension.
+	 *
+	 * @return number of evictions performed due to cache being full, per pack
+	 *         file extension.
+	 */
+	public long[] getEvictions() {
+		return getStatVals(statEvict);
+	}
+
+	/**
+	 * Quickly check if the cache contains block 0 of the given stream.
+	 * <p>
+	 * This can be useful for sophisticated pre-read algorithms to quickly
+	 * determine if a file is likely already in cache, especially small
+	 * reftables which may be smaller than a typical DFS block size.
+	 *
+	 * @param key
+	 *            the file to check.
+	 * @return true if block 0 (the first block) is in the cache.
+	 */
+	public boolean hasBlock0(DfsStreamKey key) {
+		HashEntry e1 = table.get(slot(key, 0));
+		DfsBlock v = scan(e1, key, 0);
+		return v != null && v.contains(key, 0);
 	}
 
 	private int hash(int packHash, long off) {
@@ -276,11 +366,11 @@
 		DfsBlock v = scan(e1, key, position);
 		if (v != null && v.contains(key, requestedPosition)) {
 			ctx.stats.blockCacheHit++;
-			statHit.incrementAndGet();
+			getStat(statHit, key).incrementAndGet();
 			return v;
 		}
 
-		reserveSpace(blockSize);
+		reserveSpace(blockSize, key);
 		ReentrantLock regionLock = lockFor(key, position);
 		regionLock.lock();
 		try {
@@ -289,20 +379,20 @@
 				v = scan(e2, key, position);
 				if (v != null) {
 					ctx.stats.blockCacheHit++;
-					statHit.incrementAndGet();
-					creditSpace(blockSize);
+					getStat(statHit, key).incrementAndGet();
+					creditSpace(blockSize, key);
 					return v;
 				}
 			}
 
-			statMiss.incrementAndGet();
+			getStat(statMiss, key).incrementAndGet();
 			boolean credit = true;
 			try {
 				v = file.readOneBlock(requestedPosition, ctx, fileChannel);
 				credit = false;
 			} finally {
 				if (credit)
-					creditSpace(blockSize);
+					creditSpace(blockSize, key);
 			}
 			if (position != v.start) {
 				// The file discovered its blockSize and adjusted.
@@ -332,10 +422,10 @@
 	}
 
 	@SuppressWarnings("unchecked")
-	private void reserveSpace(int reserve) {
+	private void reserveSpace(int reserve, DfsStreamKey key) {
 		clockLock.lock();
 		try {
-			long live = liveBytes + reserve;
+			long live = LongStream.of(getCurrentSize()).sum() + reserve;
 			if (maxBytes < live) {
 				Ref prev = clockHand;
 				Ref hand = clockHand.next;
@@ -358,28 +448,33 @@
 					dead.next = null;
 					dead.value = null;
 					live -= dead.size;
-					statEvict++;
+					getStat(liveBytes, dead.key).addAndGet(-dead.size);
+					getStat(statEvict, dead.key).incrementAndGet();
 				} while (maxBytes < live);
 				clockHand = prev;
 			}
-			liveBytes = live;
+			getStat(liveBytes, key).addAndGet(reserve);
 		} finally {
 			clockLock.unlock();
 		}
 	}
 
-	private void creditSpace(int credit) {
+	private void creditSpace(int credit, DfsStreamKey key) {
 		clockLock.lock();
-		liveBytes -= credit;
-		clockLock.unlock();
+		try {
+			getStat(liveBytes, key).addAndGet(-credit);
+		} finally {
+			clockLock.unlock();
+		}
 	}
 
 	@SuppressWarnings("unchecked")
 	private void addToClock(Ref ref, int credit) {
 		clockLock.lock();
 		try {
-			if (credit != 0)
-				liveBytes -= credit;
+			if (credit != 0) {
+				getStat(liveBytes, ref.key).addAndGet(-credit);
+			}
 			Ref ptr = clockHand;
 			ref.next = ptr.next;
 			ptr.next = ref;
@@ -404,7 +499,7 @@
 		if (ref != null)
 			return ref;
 
-		reserveSpace(size);
+		reserveSpace(size, key);
 		ReentrantLock regionLock = lockFor(key, pos);
 		regionLock.lock();
 		try {
@@ -412,7 +507,7 @@
 			if (e2 != e1) {
 				ref = scanRef(e2, key, pos);
 				if (ref != null) {
-					creditSpace(size);
+					creditSpace(size, key);
 					return ref;
 				}
 			}
@@ -440,9 +535,9 @@
 	<T> T get(DfsStreamKey key, long position) {
 		T val = (T) scan(table.get(slot(key, position)), key, position);
 		if (val == null)
-			statMiss.incrementAndGet();
+			getStat(statMiss, key).incrementAndGet();
 		else
-			statHit.incrementAndGet();
+			getStat(statHit, key).incrementAndGet();
 		return val;
 	}
 
@@ -454,9 +549,9 @@
 	<T> Ref<T> getRef(DfsStreamKey key) {
 		Ref<T> r = scanRef(table.get(slot(key, 0)), key, 0);
 		if (r != null)
-			statHit.incrementAndGet();
+			getStat(statHit, key).incrementAndGet();
 		else
-			statMiss.incrementAndGet();
+			getStat(statMiss, key).incrementAndGet();
 		return r;
 	}
 
@@ -478,6 +573,43 @@
 		return loadLocks[(hash(key.hash, position) >>> 1) % loadLocks.length];
 	}
 
+	private static AtomicLong[] newCounters() {
+		AtomicLong[] ret = new AtomicLong[PackExt.values().length];
+		for (int i = 0; i < ret.length; i++) {
+			ret[i] = new AtomicLong();
+		}
+		return ret;
+	}
+
+	private static AtomicLong getStat(AtomicReference<AtomicLong[]> stats,
+			DfsStreamKey key) {
+		int pos = key.packExtPos;
+		while (true) {
+			AtomicLong[] vals = stats.get();
+			if (pos < vals.length) {
+				return vals[pos];
+			}
+			AtomicLong[] expect = vals;
+			vals = new AtomicLong[Math.max(pos + 1, PackExt.values().length)];
+			System.arraycopy(expect, 0, vals, 0, expect.length);
+			for (int i = expect.length; i < vals.length; i++) {
+				vals[i] = new AtomicLong();
+			}
+			if (stats.compareAndSet(expect, vals)) {
+				return vals[pos];
+			}
+		}
+	}
+
+	private static long[] getStatVals(AtomicReference<AtomicLong[]> stat) {
+		AtomicLong[] stats = stat.get();
+		long[] cnt = new long[stats.length];
+		for (int i = 0; i < stats.length; i++) {
+			cnt[i] = stats[i].get();
+		}
+		return cnt;
+	}
+
 	private static HashEntry clean(HashEntry top) {
 		while (top != null && top.ref.next == null)
 			top = top.next;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java
index feadedb..e558a81 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java
@@ -55,7 +55,10 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.Config;
 
-/** Configuration parameters for {@link DfsBlockCache}. */
+/**
+ * Configuration parameters for
+ * {@link org.eclipse.jgit.internal.storage.dfs.DfsBlockCache}.
+ */
 public class DfsBlockCacheConfig {
 	/** 1024 (number of bytes in one kibibyte/kilobyte) */
 	public static final int KB = 1024;
@@ -68,7 +71,9 @@
 	private double streamRatio;
 	private int concurrencyLevel;
 
-	/** Create a default configuration. */
+	/**
+	 * Create a default configuration.
+	 */
 	public DfsBlockCacheConfig() {
 		setBlockLimit(32 * MB);
 		setBlockSize(64 * KB);
@@ -77,6 +82,9 @@
 	}
 
 	/**
+	 * Get maximum number bytes of heap memory to dedicate to caching pack file
+	 * data.
+	 *
 	 * @return maximum number bytes of heap memory to dedicate to caching pack
 	 *         file data. <b>Default is 32 MB.</b>
 	 */
@@ -85,6 +93,9 @@
 	}
 
 	/**
+	 * Set maximum number bytes of heap memory to dedicate to caching pack file
+	 * data.
+	 *
 	 * @param newLimit
 	 *            maximum number bytes of heap memory to dedicate to caching
 	 *            pack file data.
@@ -96,6 +107,9 @@
 	}
 
 	/**
+	 * Get size in bytes of a single window mapped or read in from the pack
+	 * file.
+	 *
 	 * @return size in bytes of a single window mapped or read in from the pack
 	 *         file. <b>Default is 64 KB.</b>
 	 */
@@ -104,6 +118,8 @@
 	}
 
 	/**
+	 * Set size in bytes of a single window read in from the pack file.
+	 *
 	 * @param newSize
 	 *            size in bytes of a single window read in from the pack file.
 	 *            The value must be a power of 2.
@@ -120,6 +136,8 @@
 	}
 
 	/**
+	 * Get the estimated number of threads concurrently accessing the cache.
+	 *
 	 * @return the estimated number of threads concurrently accessing the cache.
 	 *         <b>Default is 32.</b>
 	 */
@@ -128,6 +146,8 @@
 	}
 
 	/**
+	 * Set the estimated number of threads concurrently accessing the cache.
+	 *
 	 * @param newConcurrencyLevel
 	 *            the estimated number of threads concurrently accessing the
 	 *            cache.
@@ -140,6 +160,9 @@
 	}
 
 	/**
+	 * Get highest percentage of {@link #getBlockLimit()} a single pack can
+	 * occupy while being copied by the pack reuse strategy.
+	 *
 	 * @return highest percentage of {@link #getBlockLimit()} a single pack can
 	 *         occupy while being copied by the pack reuse strategy. <b>Default
 	 *         is 0.30, or 30%</b>.
@@ -149,6 +172,8 @@
 	}
 
 	/**
+	 * Set percentage of cache to occupy with a copied pack.
+	 *
 	 * @param ratio
 	 *            percentage of cache to occupy with a copied pack.
 	 * @return {@code this}
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 a5308f6..3605236e 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
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.internal.storage.pack.PackOutputStream;
 import org.eclipse.jgit.internal.storage.pack.StoredObjectRepresentation;
 
-/** A DfsPackFile available for reuse as-is. */
+/**
+ * A DfsPackFile available for reuse as-is.
+ */
 public class DfsCachedPack extends CachedPack {
 	private final DfsPackFile pack;
 
@@ -58,21 +60,28 @@
 		this.pack = pack;
 	}
 
-	/** @return the description of the pack. */
+	/**
+	 * Get the description of the pack.
+	 *
+	 * @return the description of the pack.
+	 */
 	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 696595c..3e2963a 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
@@ -49,11 +49,13 @@
 import org.eclipse.jgit.lib.StoredConfig;
 
 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/DfsFsck.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsFsck.java
index 75eade2..985393c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsFsck.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsFsck.java
@@ -55,19 +55,24 @@
 import org.eclipse.jgit.internal.fsck.FsckError;
 import org.eclipse.jgit.internal.fsck.FsckError.CorruptIndex;
 import org.eclipse.jgit.internal.fsck.FsckPackParser;
+import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectChecker;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.revwalk.ObjectWalk;
 import org.eclipse.jgit.revwalk.RevObject;
 
-/** Verify the validity and connectivity of a DFS repository. */
+/**
+ * Verify the validity and connectivity of a DFS repository.
+ */
 public class DfsFsck {
 	private final DfsRepository repo;
 	private final DfsObjDatabase objdb;
 	private ObjectChecker objChecker = new ObjectChecker();
+	private boolean connectivityOnly;
 
 	/**
 	 * Initialize DFS fsck.
@@ -87,7 +92,7 @@
 	 * @param pm
 	 *            callback to provide progress feedback during the check.
 	 * @return all errors about the repository.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if encounters IO errors during the process.
 	 */
 	public FsckError check(ProgressMonitor pm) throws IOException {
@@ -96,7 +101,9 @@
 		}
 
 		FsckError errors = new FsckError();
-		checkPacks(pm, errors);
+		if (!connectivityOnly) {
+			checkPacks(pm, errors);
+		}
 		checkConnectivity(pm, errors);
 		return errors;
 	}
@@ -106,6 +113,10 @@
 		try (DfsReader ctx = objdb.newReader()) {
 			for (DfsPackFile pack : objdb.getPacks()) {
 				DfsPackDescription packDesc = pack.getPackDescription();
+				if (packDesc.getPackSource()
+						== PackSource.UNREACHABLE_GARBAGE) {
+					continue;
+				}
 				try (ReadableChannel rc = objdb.openFile(packDesc, PACK)) {
 					verifyPack(pm, errors, ctx, pack, rc);
 				} catch (MissingObjectException e) {
@@ -136,19 +147,24 @@
 		pm.beginTask(JGitText.get().countingObjects, ProgressMonitor.UNKNOWN);
 		try (ObjectWalk ow = new ObjectWalk(repo)) {
 			for (Ref r : repo.getAllRefs().values()) {
+				ObjectId objectId = r.getObjectId();
+				if (objectId == null) {
+					// skip unborn branch
+					continue;
+				}
 				RevObject tip;
 				try {
-					tip = ow.parseAny(r.getObjectId());
+					tip = ow.parseAny(objectId);
 					if (r.getLeaf().getName().startsWith(Constants.R_HEADS)
 							&& tip.getType() != Constants.OBJ_COMMIT) {
 						// heads should only point to a commit object
 						errors.getNonCommitHeads().add(r.getLeaf().getName());
 					}
+					ow.markStart(tip);
 				} catch (MissingObjectException e) {
 					errors.getMissingObjects().add(e.getObjectId());
 					continue;
 				}
-				ow.markStart(tip);
 			}
 			try {
 				ow.checkConnectivity();
@@ -169,4 +185,17 @@
 	public void setObjectChecker(ObjectChecker objChecker) {
 		this.objChecker = objChecker;
 	}
+
+	/**
+	 * Whether fsck should bypass object validity and integrity checks and only
+	 * check connectivity.
+	 *
+	 * @param connectivityOnly
+	 *            whether fsck should bypass object validity and integrity
+	 *            checks and only check connectivity. The default is
+	 *            {@code false}, meaning to run all checks.
+	 */
+	public void setConnectivityOnly(boolean connectivityOnly) {
+		this.connectivityOnly = connectivityOnly;
+	}
 }
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 304a931..69989a4 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
@@ -93,7 +93,9 @@
 import org.eclipse.jgit.util.SystemReader;
 import org.eclipse.jgit.util.io.CountingOutputStream;
 
-/** Repack and garbage collect a repository. */
+/**
+ * Repack and garbage collect a repository.
+ */
 public class DfsGarbageCollector {
 	private final DfsRepository repo;
 	private final RefDatabase refdb;
@@ -108,6 +110,7 @@
 	private PackConfig packConfig;
 	private ReftableConfig reftableConfig;
 	private boolean convertToReftable = true;
+	private boolean includeDeletes;
 	private long reftableInitialMinUpdateIndex = 1;
 	private long reftableInitialMaxUpdateIndex = 1;
 
@@ -146,12 +149,18 @@
 		packConfig.setIndexVersion(2);
 	}
 
-	/** @return configuration used to generate the new pack file. */
+	/**
+	 * Get configuration used to generate the new pack file.
+	 *
+	 * @return configuration used to generate the new pack file.
+	 */
 	public PackConfig getPackConfig() {
 		return packConfig;
 	}
 
 	/**
+	 * Set the new configuration to use when creating the pack file.
+	 *
 	 * @param newConfig
 	 *            the new configuration to use when creating the pack file.
 	 * @return {@code this}
@@ -162,6 +171,8 @@
 	}
 
 	/**
+	 * Set configuration to write a reftable.
+	 *
 	 * @param cfg
 	 *            configuration to write a reftable. Reftable writing is
 	 *            disabled (default) when {@code cfg} is {@code null}.
@@ -173,11 +184,14 @@
 	}
 
 	/**
+	 * Whether the garbage collector should convert references to reftable.
+	 *
 	 * @param convert
-	 *            if true, {@link #setReftableConfig(ReftableConfig)} has been
-	 *            set non-null, and a GC reftable doesn't yet exist, the garbage
-	 *            collector will make one by scanning the existing references,
-	 *            and writing a new reftable. Default is {@code true}.
+	 *            if {@code true}, {@link #setReftableConfig(ReftableConfig)}
+	 *            has been set non-null, and a GC reftable doesn't yet exist,
+	 *            the garbage collector will make one by scanning the existing
+	 *            references, and writing a new reftable. Default is
+	 *            {@code true}.
 	 * @return {@code this}
 	 */
 	public DfsGarbageCollector setConvertToReftable(boolean convert) {
@@ -186,13 +200,29 @@
 	}
 
 	/**
+	 * Whether the garbage collector will include tombstones for deleted
+	 * references in the reftable.
+	 *
+	 * @param include
+	 *            if {@code true}, the garbage collector will include tombstones
+	 *            for deleted references in the reftable. Default is
+	 *            {@code false}.
+	 * @return {@code this}
+	 */
+	public DfsGarbageCollector setIncludeDeletes(boolean include) {
+		includeDeletes = include;
+		return this;
+	}
+
+	/**
 	 * Set minUpdateIndex for the initial reftable created during conversion.
 	 *
 	 * @param u
 	 *            minUpdateIndex for the initial reftable created by scanning
-	 *            {@link DfsRefDatabase#getRefs(String)}. Ignored unless caller
-	 *            has also set {@link #setReftableConfig(ReftableConfig)}.
-	 *            Defaults to {@code 1}. Must be {@code u >= 0}.
+	 *            {@link org.eclipse.jgit.internal.storage.dfs.DfsRefDatabase#getRefs(String)}.
+	 *            Ignored unless caller has also set
+	 *            {@link #setReftableConfig(ReftableConfig)}. Defaults to
+	 *            {@code 1}. Must be {@code u >= 0}.
 	 * @return {@code this}
 	 */
 	public DfsGarbageCollector setReftableInitialMinUpdateIndex(long u) {
@@ -205,9 +235,10 @@
 	 *
 	 * @param u
 	 *            maxUpdateIndex for the initial reftable created by scanning
-	 *            {@link DfsRefDatabase#getRefs(String)}. Ignored unless caller
-	 *            has also set {@link #setReftableConfig(ReftableConfig)}.
-	 *            Defaults to {@code 1}. Must be {@code u >= 0}.
+	 *            {@link org.eclipse.jgit.internal.storage.dfs.DfsRefDatabase#getRefs(String)}.
+	 *            Ignored unless caller has also set
+	 *            {@link #setReftableConfig(ReftableConfig)}. Defaults to
+	 *            {@code 1}. Must be {@code u >= 0}.
 	 * @return {@code this}
 	 */
 	public DfsGarbageCollector setReftableInitialMaxUpdateIndex(long u) {
@@ -215,7 +246,12 @@
 		return this;
 	}
 
-	/** @return garbage packs smaller than this size will be repacked. */
+	/**
+	 * Get coalesce garbage limit
+	 *
+	 * @return coalesce garbage limit, packs smaller than this size will be
+	 *         repacked.
+	 */
 	public long getCoalesceGarbageLimit() {
 		return coalesceGarbageLimit;
 	}
@@ -232,7 +268,8 @@
 	 * reading and copying the objects.
 	 * <p>
 	 * If limit is set to 0 the UNREACHABLE_GARBAGE coalesce is disabled.<br>
-	 * If limit is set to {@link Long#MAX_VALUE}, everything is coalesced.
+	 * If limit is set to {@link java.lang.Long#MAX_VALUE}, everything is
+	 * coalesced.
 	 * <p>
 	 * Keeping unreachable garbage prevents race conditions with repository
 	 * changes that may suddenly need an object whose only copy was stored in
@@ -248,9 +285,11 @@
 	}
 
 	/**
+	 * Get time to live for garbage packs.
+	 *
 	 * @return garbage packs older than this limit (in milliseconds) will be
 	 *         pruned as part of the garbage collection process if the value is
-	 *         > 0, otherwise garbage packs are retained.
+	 *         &gt; 0, otherwise garbage packs are retained.
 	 */
 	public long getGarbageTtlMillis() {
 		return garbageTtlMillis;
@@ -288,7 +327,7 @@
 	 * @return true if the repack was successful without race conditions. False
 	 *         if a race condition was detected and the repack should be run
 	 *         again later.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a new pack cannot be created.
 	 */
 	public boolean pack(ProgressMonitor pm) throws IOException {
@@ -476,17 +515,31 @@
 		return cal.getTimeInMillis();
 	}
 
-	/** @return all of the source packs that fed into this compaction. */
+	/**
+	 * Get all of the source packs that fed into this compaction.
+	 *
+	 * @return all of the source packs that fed into this compaction.
+	 */
 	public Set<DfsPackDescription> getSourcePacks() {
 		return toPrune();
 	}
 
-	/** @return new packs created by this compaction. */
+	/**
+	 * Get new packs created by this compaction.
+	 *
+	 * @return new packs created by this compaction.
+	 */
 	public List<DfsPackDescription> getNewPacks() {
 		return newPackDesc;
 	}
 
-	/** @return statistics corresponding to the {@link #getNewPacks()}. */
+	/**
+	 * Get statistics corresponding to the {@link #getNewPacks()}.
+	 * <p>
+	 * The elements can be null if the stat is not available for the pack file.
+	 *
+	 * @return statistics corresponding to the {@link #getNewPacks()}.
+	 */
 	public List<PackStatistics> getNewPackStatistics() {
 		return newPackStats;
 	}
@@ -637,7 +690,6 @@
 			ProgressMonitor pm, long estimatedPackSize) throws IOException {
 		DfsPackDescription pack = repo.getObjectDatabase().newPack(source,
 				estimatedPackSize);
-		newPackDesc.add(pack);
 
 		if (source == GC && reftableConfig != null) {
 			writeReftable(pack);
@@ -671,6 +723,7 @@
 		PackStatistics stats = pw.getStatistics();
 		pack.setPackStats(stats);
 		pack.setLastModified(startTimeMillis);
+		newPackDesc.add(pack);
 		newPackStats.add(stats);
 		newPackObj.add(pw.getObjectSet());
 		return pack;
@@ -680,6 +733,7 @@
 		if (reftableConfig != null) {
 			DfsPackDescription pack = objdb.newPack(GC);
 			newPackDesc.add(pack);
+			newPackStats.add(null);
 			writeReftable(pack);
 		}
 	}
@@ -693,7 +747,7 @@
 		try (ReftableStack stack = ReftableStack.open(ctx, reftablesBefore)) {
 			ReftableCompactor compact = new ReftableCompactor();
 			compact.addAll(stack.readers());
-			compact.setIncludeDeletes(false);
+			compact.setIncludeDeletes(includeDeletes);
 			compactReftable(pack, compact);
 		}
 	}
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 19e8652..eb0a527 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
@@ -92,7 +92,9 @@
 import org.eclipse.jgit.util.io.CountingOutputStream;
 import org.eclipse.jgit.util.sha1.SHA1;
 
-/** Inserts objects into the DFS. */
+/**
+ * Inserts objects into the DFS.
+ */
 public class DfsInserter extends ObjectInserter {
 	/** Always produce version 2 indexes, to get CRC data. */
 	private static final int INDEX_VERSION = 2;
@@ -121,9 +123,12 @@
 	}
 
 	/**
+	 * Check existence
+	 *
 	 * @param check
-	 *            if false, will write out possibly-duplicate objects without
-	 *            first checking whether they exist in the repo; default is true.
+	 *            if {@code false}, will write out possibly-duplicate objects
+	 *            without first checking whether they exist in the repo; default
+	 *            is true.
 	 */
 	public void checkExisting(boolean check) {
 		checkExisting = check;
@@ -133,16 +138,19 @@
 		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 {
@@ -159,6 +167,7 @@
 		return endObject(id, offset);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, long len, InputStream in)
 			throws IOException {
@@ -201,6 +210,7 @@
 		return buf;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (packDsc == null)
@@ -228,6 +238,7 @@
 		clear();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (packOut != null) {
@@ -605,17 +616,22 @@
 			try {
 				return packOut.inflate(ctx, zpos, sz);
 			} catch (DataFormatException dfe) {
-				CorruptObjectException coe = new CorruptObjectException(
+				throw new CorruptObjectException(
 						MessageFormat.format(
 								JGitText.get().objectAtHasBadZlibStream,
 								Long.valueOf(obj.getOffset()),
-								packDsc.getFileName(PackExt.PACK)));
-				coe.initCause(dfe);
-				throw coe;
+								packDsc.getFileName(PackExt.PACK)),
+						dfe);
 			}
 		}
 
 		@Override
+		public boolean has(AnyObjectId objectId) throws IOException {
+			return (objectMap != null && objectMap.contains(objectId))
+					|| ctx.has(objectId);
+		}
+
+		@Override
 		public Set<ObjectId> getShallowCommits() throws IOException {
 			return ctx.getShallowCommits();
 		}
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 9439822..42b1a47 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
@@ -52,6 +52,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.jgit.internal.storage.pack.PackExt;
@@ -60,7 +61,11 @@
 import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.ObjectReader;
 
-/** Manages objects stored in {@link DfsPackFile} on a storage system. */
+/**
+ * Manages objects stored in
+ * {@link org.eclipse.jgit.internal.storage.dfs.DfsPackFile} on a storage
+ * system.
+ */
 public abstract class DfsObjDatabase extends ObjectDatabase {
 	private static final PackList NO_PACKS = new PackList(
 			new DfsPackFile[0],
@@ -156,7 +161,6 @@
 	 *
 	 * @param repository
 	 *            repository owning this object database.
-	 *
 	 * @param options
 	 *            how readers should access the object database.
 	 */
@@ -167,16 +171,22 @@
 		this.readerOptions = options;
 	}
 
-	/** @return configured reader options, such as read-ahead. */
+	/**
+	 * Get configured reader options, such as read-ahead.
+	 *
+	 * @return configured reader options, such as read-ahead.
+	 */
 	public DfsReaderOptions getReaderOptions() {
 		return readerOptions;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public DfsReader newReader() {
 		return new DfsReader(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectInserter newInserter() {
 		return new DfsInserter(this);
@@ -187,7 +197,7 @@
 	 *
 	 * @return list of available packs. The returned array is shared with the
 	 *         implementation and must not be modified by the caller.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack list cannot be initialized.
 	 */
 	public DfsPackFile[] getPacks() throws IOException {
@@ -199,7 +209,7 @@
 	 *
 	 * @return list of available reftables. The returned array is shared with
 	 *         the implementation and must not be modified by the caller.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack list cannot be initialized.
 	 */
 	public DfsReftable[] getReftables() throws IOException {
@@ -212,14 +222,18 @@
 	 * @return list of available packs, with some additional metadata. The
 	 *         returned array is shared with the implementation and must not be
 	 *         modified by the caller.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack list cannot be initialized.
 	 */
 	public PackList getPackList() throws IOException {
 		return scanPacks(NO_PACKS);
 	}
 
-	/** @return repository owning this object database. */
+	/**
+	 * Get repository owning this object database.
+	 *
+	 * @return repository owning this object database.
+	 */
 	protected DfsRepository getRepository() {
 		return repository;
 	}
@@ -266,7 +280,7 @@
 	 * @param avoidUnreachableObjects
 	 *            if true, ignore objects that are unreachable.
 	 * @return true if the specified object is stored in this database.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public boolean has(AnyObjectId objectId, boolean avoidUnreachableObjects)
@@ -284,7 +298,7 @@
 	 *            where the pack stream is created.
 	 * @return a unique name for the pack file. Must not collide with any other
 	 *         pack file name in the same DFS.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a new unique pack description cannot be generated.
 	 */
 	protected abstract DfsPackDescription newPack(PackSource source)
@@ -298,7 +312,8 @@
 	 * {@code newPack(source).setEstimatedPackSize(estimatedPackSize)}. But the
 	 * clients can override this method to use the given
 	 * {@code estomatedPackSize} value more efficiently in the process of
-	 * creating a new {@link DfsPackDescription} object.
+	 * creating a new
+	 * {@link org.eclipse.jgit.internal.storage.dfs.DfsPackDescription} object.
 	 *
 	 * @param source
 	 *            where the pack stream is created.
@@ -306,7 +321,7 @@
 	 *            the estimated size of the pack.
 	 * @return a unique name for the pack file. Must not collide with any other
 	 *         pack file name in the same DFS.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a new unique pack description cannot be generated.
 	 */
 	protected DfsPackDescription newPack(PackSource source,
@@ -337,7 +352,7 @@
 	 *            description of the new packs.
 	 * @param replaces
 	 *            if not null, list of packs to remove.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packs cannot be committed. On failure a rollback must
 	 *             also be attempted by the caller.
 	 */
@@ -351,12 +366,11 @@
 	 * Implementation of pack commit.
 	 *
 	 * @see #commitPack(Collection, Collection)
-	 *
 	 * @param desc
 	 *            description of the new packs.
 	 * @param replaces
 	 *            if not null, list of packs to remove.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packs cannot be committed.
 	 */
 	protected abstract void commitPackImpl(Collection<DfsPackDescription> desc,
@@ -387,7 +401,7 @@
 	 * DfsPackDescription objects.
 	 *
 	 * @return available packs. May be empty if there are no packs.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packs cannot be listed and the object database is not
 	 *             functional to the caller.
 	 */
@@ -404,9 +418,9 @@
 	 * @param ext
 	 *            file extension that will be read i.e "pack" or "idx".
 	 * @return channel to read the file.
-	 * @throws FileNotFoundException
+	 * @throws java.io.FileNotFoundException
 	 *             the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file cannot be opened.
 	 */
 	protected abstract ReadableChannel openFile(
@@ -423,7 +437,7 @@
 	 * @param ext
 	 *            file extension that will be written i.e "pack" or "idx".
 	 * @return channel to write the file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file cannot be opened.
 	 */
 	protected abstract DfsOutputStream writeFile(
@@ -445,8 +459,9 @@
 				// add, as the pack was already committed via commitPack().
 				// If this is the case return without changing the list.
 				for (DfsPackFile p : o.packs) {
-					if (p == newPack)
+					if (p.key.equals(newPack.key)) {
 						return;
+					}
 				}
 			}
 
@@ -457,6 +472,31 @@
 		} while (!packList.compareAndSet(o, n));
 	}
 
+	void addReftable(DfsPackDescription add, Set<DfsPackDescription> remove)
+			throws IOException {
+		PackList o, n;
+		do {
+			o = packList.get();
+			if (o == NO_PACKS) {
+				o = scanPacks(o);
+				for (DfsReftable t : o.reftables) {
+					if (t.getPackDescription().equals(add)) {
+						return;
+					}
+				}
+			}
+
+			List<DfsReftable> tables = new ArrayList<>(1 + o.reftables.length);
+			for (DfsReftable t : o.reftables) {
+				if (!remove.contains(t.getPackDescription())) {
+					tables.add(t);
+				}
+			}
+			tables.add(new DfsReftable(add));
+			n = new PackListImpl(o.packs, tables.toArray(new DfsReftable[0]));
+		} while (!packList.compareAndSet(o, n));
+	}
+
 	PackList scanPacks(final PackList original) throws IOException {
 		PackList o, n;
 		synchronized (packList) {
@@ -538,7 +578,11 @@
 		return forReuse;
 	}
 
-	/** @return comparator to sort {@link DfsReftable} by priority. */
+	/**
+	 * Get comparator to sort {@link DfsReftable} by priority.
+	 *
+	 * @return comparator to sort {@link DfsReftable} by priority.
+	 */
 	protected Comparator<DfsReftable> reftableComparator() {
 		return (fa, fb) -> {
 			DfsPackDescription a = fa.getPackDescription();
@@ -566,11 +610,14 @@
 		return s != null ? s.category : 0;
 	}
 
-	/** Clears the cached list of packs, forcing them to be scanned again. */
+	/**
+	 * Clears the cached list of packs, forcing them to be scanned again.
+	 */
 	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 ddcfff6..1e388fd 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
@@ -57,21 +57,25 @@
 		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 ff270bf..3a04d70 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
@@ -72,12 +72,14 @@
 		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 ef3173e..c286570 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
@@ -72,11 +72,13 @@
 		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;
 
@@ -91,7 +93,7 @@
 	 *            buffer to populate. Up to {@code buf.remaining()} bytes will
 	 *            be read from {@code position}.
 	 * @return number of bytes actually read.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             reading is not supported, or the read cannot be performed due
 	 *             to DFS errors.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java
index 99663eb..ab76332 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java
@@ -126,6 +126,8 @@
 	}
 
 	/**
+	 * Set configuration to write a reftable.
+	 *
 	 * @param cfg
 	 *            configuration to write a reftable. Reftable compacting is
 	 *            disabled (default) when {@code cfg} is {@code null}.
@@ -172,7 +174,7 @@
 	 * ones are omitted.
 	 *
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             existing packs cannot be read.
 	 */
 	public DfsPackCompactor autoAdd() throws IOException {
@@ -215,7 +217,7 @@
 	 * @param pack
 	 *            objects to not include.
 	 * @return {@code this}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             pack index cannot be loaded.
 	 */
 	public DfsPackCompactor exclude(DfsPackFile pack) throws IOException {
@@ -232,7 +234,7 @@
 	 * @param pm
 	 *            progress monitor to receive updates on as packing may take a
 	 *            while, depending on the size of the repository.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packs cannot be compacted.
 	 */
 	public void compact(ProgressMonitor pm) throws IOException {
@@ -331,7 +333,11 @@
 		}
 	}
 
-	/** @return all of the source packs that fed into this compaction. */
+	/**
+	 * Get all of the source packs that fed into this compaction.
+	 *
+	 * @return all of the source packs that fed into this compaction.
+	 */
 	public Collection<DfsPackDescription> getSourcePacks() {
 		Set<DfsPackDescription> src = new HashSet<>();
 		for (DfsPackFile pack : srcPacks) {
@@ -343,16 +349,26 @@
 		return src;
 	}
 
-	/** @return new packs created by this compaction. */
+	/**
+	 * Get new packs created by this compaction.
+	 *
+	 * @return new packs created by this compaction.
+	 */
 	public List<DfsPackDescription> getNewPacks() {
 		return outDesc != null
 				? Collections.singletonList(outDesc)
 				: Collections.emptyList();
 	}
 
-	/** @return statistics corresponding to the {@link #getNewPacks()}. */
+	/**
+	 * Get statistics corresponding to the {@link #getNewPacks()}.
+	 * May be null if statistics are not available.
+	 *
+	 * @return statistics corresponding to the {@link #getNewPacks()}.
+	 *
+	 */
 	public List<PackStatistics> getNewPackStatistics() {
-		return newStats != null
+		return outDesc != null
 				? Collections.singletonList(newStats)
 				: Collections.emptyList();
 	}
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 e865e6b..45eb7b0 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
@@ -104,7 +104,11 @@
 		blockSizeMap = new int[extCnt];
 	}
 
-	/** @return description of the repository. */
+	/**
+	 * Get description of the repository.
+	 *
+	 * @return description of the repository.
+	 */
 	public DfsRepositoryDescription getRepositoryDescription() {
 		return repoDesc;
 	}
@@ -120,15 +124,19 @@
 	}
 
 	/**
+	 * Whether the pack file extension is known to exist.
+	 *
 	 * @param ext
 	 *            the file extension
-	 * @return whether the pack file extensions is known to exist.
+	 * @return whether the pack file extension is known to exist.
 	 */
 	public boolean hasFileExt(PackExt ext) {
 		return (extensions & ext.getBit()) != 0;
 	}
 
 	/**
+	 * Get file name
+	 *
 	 * @param ext
 	 *            the file extension
 	 * @return name of the file.
@@ -138,20 +146,29 @@
 	}
 
 	/**
+	 * Get cache key for use by the block cache.
+	 *
 	 * @param ext
 	 *            the file extension.
 	 * @return cache key for use by the block cache.
 	 */
 	public DfsStreamKey getStreamKey(PackExt ext) {
-		return DfsStreamKey.of(getRepositoryDescription(), getFileName(ext));
+		return DfsStreamKey.of(getRepositoryDescription(), getFileName(ext),
+				ext);
 	}
 
-	/** @return the source of the pack. */
+	/**
+	 * Get the source of the pack.
+	 *
+	 * @return the source of the pack.
+	 */
 	public PackSource getPackSource() {
 		return packSource;
 	}
 
 	/**
+	 * Set the source of the pack.
+	 *
 	 * @param source
 	 *            the source of the pack.
 	 * @return {@code this}
@@ -161,12 +178,18 @@
 		return this;
 	}
 
-	/** @return time the pack was created, in milliseconds. */
+	/**
+	 * Get time the pack was created, in milliseconds.
+	 *
+	 * @return time the pack was created, in milliseconds.
+	 */
 	public long getLastModified() {
 		return lastModified;
 	}
 
 	/**
+	 * Set time the pack was created, in milliseconds.
+	 *
 	 * @param timeMillis
 	 *            time the pack was created, in milliseconds. 0 if not known.
 	 * @return {@code this}
@@ -176,14 +199,20 @@
 		return this;
 	}
 
-	/** @return minUpdateIndex for the reftable, if present. */
+	/**
+	 * Get minUpdateIndex for the reftable, if present.
+	 *
+	 * @return minUpdateIndex for the reftable, if present.
+	 */
 	public long getMinUpdateIndex() {
 		return minUpdateIndex;
 	}
 
 	/**
+	 * Set minUpdateIndex for the reftable.
+	 *
 	 * @param min
-	 *            minUpdateIndex for the reftable, or 0.
+	 *            minUpdateIndex for the reftable.
 	 * @return {@code this}
 	 */
 	public DfsPackDescription setMinUpdateIndex(long min) {
@@ -191,14 +220,20 @@
 		return this;
 	}
 
-	/** @return maxUpdateIndex for the reftable, if present. */
+	/**
+	 * Get maxUpdateIndex for the reftable, if present.
+	 *
+	 * @return maxUpdateIndex for the reftable, if present.
+	 */
 	public long getMaxUpdateIndex() {
 		return maxUpdateIndex;
 	}
 
 	/**
+	 * Set maxUpdateIndex for the reftable.
+	 *
 	 * @param max
-	 *            maxUpdateIndex for the reftable, or 0.
+	 *            maxUpdateIndex for the reftable.
 	 * @return {@code this}
 	 */
 	public DfsPackDescription setMaxUpdateIndex(long max) {
@@ -207,6 +242,8 @@
 	}
 
 	/**
+	 * Set size of the file in bytes.
+	 *
 	 * @param ext
 	 *            the file extension.
 	 * @param bytes
@@ -224,6 +261,8 @@
 	}
 
 	/**
+	 * Get size of the file, in bytes.
+	 *
 	 * @param ext
 	 *            the file extension.
 	 * @return size of the file, in bytes. If 0 the file size is not yet known.
@@ -234,6 +273,8 @@
 	}
 
 	/**
+	 * Get blockSize of the file, in bytes.
+	 *
 	 * @param ext
 	 *            the file extension.
 	 * @return blockSize of the file, in bytes. If 0 the blockSize size is not
@@ -245,6 +286,8 @@
 	}
 
 	/**
+	 * Set blockSize of the file, in bytes.
+	 *
 	 * @param ext
 	 *            the file extension.
 	 * @param blockSize
@@ -262,6 +305,8 @@
 	}
 
 	/**
+	 * Set estimated size of the .pack file in bytes.
+	 *
 	 * @param estimatedPackSize
 	 *            estimated size of the .pack file in bytes. If 0 the pack file
 	 *            size is unknown.
@@ -273,6 +318,8 @@
 	}
 
 	/**
+	 * Get estimated size of the .pack file in bytes.
+	 *
 	 * @return estimated size of the .pack file in bytes. If 0 the pack file
 	 *         size is unknown.
 	 */
@@ -280,12 +327,18 @@
 		return estimatedPackSize;
 	}
 
-	/** @return number of objects in the pack. */
+	/**
+	 * Get number of objects in the pack.
+	 *
+	 * @return number of objects in the pack.
+	 */
 	public long getObjectCount() {
 		return objectCount;
 	}
 
 	/**
+	 * Set number of objects in the pack.
+	 *
 	 * @param cnt
 	 *            number of objects in the pack.
 	 * @return {@code this}
@@ -295,12 +348,18 @@
 		return this;
 	}
 
-	/** @return number of delta compressed objects in the pack. */
+	/**
+	 * Get number of delta compressed objects in the pack.
+	 *
+	 * @return number of delta compressed objects in the pack.
+	 */
 	public long getDeltaCount() {
 		return deltaCount;
 	}
 
 	/**
+	 * Set number of delta compressed objects in the pack.
+	 *
 	 * @param cnt
 	 *            number of delta compressed objects in the pack.
 	 * @return {@code this}
@@ -311,6 +370,8 @@
 	}
 
 	/**
+	 * Get statistics from PackWriter, if the pack was built with it.
+	 *
 	 * @return statistics from PackWriter, if the pack was built with it.
 	 *         Generally this is only available for packs created by
 	 *         DfsGarbageCollector or DfsPackCompactor, and only when the pack
@@ -328,7 +389,11 @@
 		return this;
 	}
 
-	/** @return stats from the sibling reftable, if created. */
+	/**
+	 * Get stats from the sibling reftable, if created.
+	 *
+	 * @return stats from the sibling reftable, if created.
+	 */
 	public ReftableWriter.Stats getReftableStats() {
 		return refStats;
 	}
@@ -352,12 +417,18 @@
 		return this;
 	}
 
-	/** @return the version of the index file written. */
+	/**
+	 * Get the version of the index file written.
+	 *
+	 * @return the version of the index file written.
+	 */
 	public int getIndexVersion() {
 		return indexVersion;
 	}
 
 	/**
+	 * Set the version of the index file written.
+	 *
 	 * @param version
 	 *            the version of the index file written.
 	 * @return {@code this}
@@ -367,11 +438,13 @@
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return packName.hashCode();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object b) {
 		if (b instanceof DfsPackDescription) {
@@ -383,15 +456,14 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Sort packs according to the optimal lookup ordering.
 	 * <p>
 	 * This method tries to position packs in the order readers should examine
 	 * them when looking for objects by SHA-1. The default tries to sort packs
 	 * with more recent modification dates before older packs, and packs with
 	 * fewer objects before packs with more objects.
-	 *
-	 * @param b
-	 *            the other pack.
 	 */
 	@Override
 	public int compareTo(DfsPackDescription b) {
@@ -437,6 +509,7 @@
 		}
 	}
 
+	/** {@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 dfb41e2..7e36042 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
@@ -133,12 +133,18 @@
 		length = sz > 0 ? sz : -1;
 	}
 
-	/** @return description that was originally used to configure this pack file. */
+	/**
+	 * Get description that was originally used to configure this pack file.
+	 *
+	 * @return description that was originally used to configure this pack file.
+	 */
 	public DfsPackDescription getPackDescription() {
 		return desc;
 	}
 
 	/**
+	 * Whether the pack index file is loaded and cached in memory.
+	 *
 	 * @return whether the pack index file is loaded and cached in memory.
 	 */
 	public boolean isIndexLoaded() {
@@ -160,7 +166,7 @@
 	 *            reader context to support reading from the backing store if
 	 *            the index is not already loaded in memory.
 	 * @return the PackIndex.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack index is not available, or is corrupt.
 	 */
 	public PackIndex getPackIndex(DfsReader ctx) throws IOException {
@@ -350,7 +356,7 @@
 	 * @param id
 	 *            object to be located.
 	 * @return true if the object exists in this pack; false if it does not.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack index is not available, or is corrupt.
 	 */
 	public boolean hasObject(DfsReader ctx, AnyObjectId id) throws IOException {
@@ -533,10 +539,8 @@
 		try {
 			readFully(src.offset, buf, 0, 20, ctx);
 		} catch (IOException ioError) {
-			StoredObjectRepresentationNotAvailableException gone;
-			gone = new StoredObjectRepresentationNotAvailableException(src);
-			gone.initCause(ioError);
-			throw gone;
+			throw new StoredObjectRepresentationNotAvailableException(src,
+					ioError);
 		}
 		int c = buf[0] & 0xff;
 		final int typeCode = (c >> 4) & 7;
@@ -653,19 +657,15 @@
 			CorruptObjectException corruptObject = new CorruptObjectException(
 					MessageFormat.format(
 							JGitText.get().objectAtHasBadZlibStream,
-							Long.valueOf(src.offset), getFileName()));
-			corruptObject.initCause(dataFormat);
+							Long.valueOf(src.offset), getFileName()),
+					dataFormat);
 
-			StoredObjectRepresentationNotAvailableException gone;
-			gone = new StoredObjectRepresentationNotAvailableException(src);
-			gone.initCause(corruptObject);
-			throw gone;
+			throw new StoredObjectRepresentationNotAvailableException(src,
+					corruptObject);
 
 		} catch (IOException ioError) {
-			StoredObjectRepresentationNotAvailableException gone;
-			gone = new StoredObjectRepresentationNotAvailableException(src);
-			gone.initCause(ioError);
-			throw gone;
+			throw new StoredObjectRepresentationNotAvailableException(src,
+					ioError);
 		}
 
 		if (quickCopy != null) {
@@ -866,12 +866,11 @@
 			return new ObjectLoader.SmallObject(type, data);
 
 		} catch (DataFormatException dfe) {
-			CorruptObjectException coe = new CorruptObjectException(
+			throw new CorruptObjectException(
 					MessageFormat.format(
 							JGitText.get().objectAtHasBadZlibStream, Long.valueOf(pos),
-							getFileName()));
-			coe.initCause(dfe);
-			throw coe;
+							getFileName()),
+					dfe);
 		}
 	}
 
@@ -1014,12 +1013,11 @@
 		try {
 			return BinaryDelta.getResultSize(getDeltaHeader(ctx, deltaAt));
 		} catch (DataFormatException dfe) {
-			CorruptObjectException coe = new CorruptObjectException(
+			throw new CorruptObjectException(
 					MessageFormat.format(
 							JGitText.get().objectAtHasBadZlibStream, Long.valueOf(pos),
-							getFileName()));
-			coe.initCause(dfe);
-			throw coe;
+							getFileName()),
+					dfe);
 		}
 	}
 
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 fd99db1..3a30d7d 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
@@ -63,7 +63,9 @@
 import org.eclipse.jgit.transport.PackParser;
 import org.eclipse.jgit.transport.PackedObjectInfo;
 
-/** Parses a pack stream into the DFS, by creating a new pack and index. */
+/**
+ * Parses a pack stream into the DFS, by creating a new pack and index.
+ */
 public class DfsPackParser extends PackParser {
 	private final DfsObjDatabase objdb;
 
@@ -132,6 +134,7 @@
 		this.packDigest = Constants.newMessageDigest();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
 			throws IOException {
@@ -193,11 +196,16 @@
 		}
 	}
 
-	/** @return description of the imported pack, if one was made. */
+	/**
+	 * Get description of the imported pack, if one was made.
+	 *
+	 * @return description of the imported pack, if one was made.
+	 */
 	public DfsPackDescription getPackDescription() {
 		return packDsc;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onPackHeader(long objectCount) throws IOException {
 		if (objectCount == 0) {
@@ -219,29 +227,34 @@
 		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();
@@ -249,24 +262,28 @@
 		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 {
@@ -313,6 +330,7 @@
 		return v;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onPackFooter(byte[] hash) throws IOException {
 		// The base class will validate the original hash matches
@@ -322,6 +340,7 @@
 		packHash = hash;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 			ObjectTypeAndSize info) throws IOException {
@@ -330,6 +349,7 @@
 		return readObjectHeader(info);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 			ObjectTypeAndSize info) throws IOException {
@@ -338,6 +358,7 @@
 		return readObjectHeader(info);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int readDatabase(byte[] dst, int pos, int cnt) throws IOException {
 		if (cnt == 0)
@@ -393,11 +414,13 @@
 		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 {
@@ -437,6 +460,7 @@
 		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 14d67c0..d9fc71f 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
@@ -45,14 +45,19 @@
 
 import org.eclipse.jgit.events.RepositoryEvent;
 
-/** Describes a change to the list of packs in a {@link DfsRepository}. */
+/**
+ * Describes a change to the list of packs in a
+ * {@link org.eclipse.jgit.internal.storage.dfs.DfsRepository}.
+ */
 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/DfsPacksChangedListener.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedListener.java
index 324626c..3ea8213 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedListener.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPacksChangedListener.java
@@ -45,7 +45,9 @@
 
 import org.eclipse.jgit.events.RepositoryListener;
 
-/** Receives {@link DfsPacksChangedEvent}s. */
+/**
+ * Receives {@link org.eclipse.jgit.internal.storage.dfs.DfsPacksChangedEvent}s.
+ */
 public interface DfsPacksChangedListener extends RepositoryListener {
 	/**
 	 * Invoked when all packs in a repository are listed.
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 3c84220..27a7992 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
@@ -92,8 +92,8 @@
 /**
  * Reader to access repository content through.
  * <p>
- * See the base {@link ObjectReader} documentation for details. Notably, a
- * reader is not thread safe.
+ * See the base {@link org.eclipse.jgit.lib.ObjectReader} documentation for
+ * details. Notably, a reader is not thread safe.
  */
 public class DfsReader extends ObjectReader implements ObjectReuseAsIs {
 	private static final int MAX_RESOLVE_MATCHES = 256;
@@ -133,16 +133,19 @@
 		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()) {
@@ -153,6 +156,7 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<CachedPack> getCachedPacksAndUpdate(
 		BitmapBuilder needBitmap) throws IOException {
@@ -165,6 +169,7 @@
 		return Collections.emptyList();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<ObjectId> resolve(AbbreviatedObjectId id)
 			throws IOException {
@@ -193,6 +198,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean has(AnyObjectId objectId) throws IOException {
 		if (last != null
@@ -222,6 +228,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectLoader open(AnyObjectId objectId, int typeHint)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -276,6 +283,7 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Set<ObjectId> getShallowCommits() {
 		return Collections.emptySet();
@@ -385,6 +393,7 @@
 		return avoidUnreachable && pack.isGarbage();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public <T extends ObjectId> AsyncObjectLoaderQueue<T> open(
 			Iterable<T> objectIds, final boolean reportMissing) {
@@ -444,6 +453,7 @@
 		};
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public <T extends ObjectId> AsyncObjectSizeQueue<T> getObjectSize(
 			Iterable<T> objectIds, final boolean reportMissing) {
@@ -505,6 +515,7 @@
 		};
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getObjectSize(AnyObjectId objectId, int typeHint)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -550,6 +561,7 @@
 		return -1;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public DfsObjectToPack newObjectToPack(AnyObjectId objectId, int type) {
 		return new DfsObjectToPack(objectId, type);
@@ -631,6 +643,7 @@
 		return tmp;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
 			boolean validate) throws IOException,
@@ -639,6 +652,7 @@
 		src.pack.copyAsIs(out, src, validate, this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void writeObjects(PackOutputStream out, List<ObjectToPack> list)
 			throws IOException {
@@ -646,6 +660,7 @@
 			out.writeObject(otp);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void copyPackAsIs(PackOutputStream out, CachedPack pack)
 			throws IOException {
@@ -771,12 +786,20 @@
 		block = null;
 	}
 
-	/** @return IO statistics accumulated by this reader. */
+	/**
+	 * Get IO statistics accumulated by this reader.
+	 *
+	 * @return IO statistics accumulated by this reader.
+	 */
 	public DfsReaderIoStats getIoStats() {
 		return new DfsReaderIoStats(stats);
 	}
 
-	/** Release the current window cursor. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Release the current window cursor.
+	 */
 	@Override
 	public void close() {
 		last = null;
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 9a174c8..cf925c9 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
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.internal.storage.dfs;
 
-/** IO statistics for a {@link DfsReader}. */
+/**
+ * IO statistics for a {@link org.eclipse.jgit.internal.storage.dfs.DfsReader}.
+ */
 public class DfsReaderIoStats {
 	/** POJO to accumulate IO statistics. */
 	public static class Accumulator {
@@ -87,52 +89,92 @@
 		this.stats = stats;
 	}
 
-	/** @return number of times the reader explicitly called scanPacks. */
+	/**
+	 * Get number of times the reader explicitly called scanPacks.
+	 *
+	 * @return number of times the reader explicitly called scanPacks.
+	 */
 	public long getScanPacks() {
 		return stats.scanPacks;
 	}
 
-	/** @return total number of complete pack indexes read into memory. */
+	/**
+	 * Get total number of complete pack indexes read into memory.
+	 *
+	 * @return total number of complete pack indexes read into memory.
+	 */
 	public long getReadPackIndexCount() {
 		return stats.readIdx;
 	}
 
-	/** @return total number of complete bitmap indexes read into memory. */
+	/**
+	 * Get total number of complete bitmap indexes read into memory.
+	 *
+	 * @return total number of complete bitmap indexes read into memory.
+	 */
 	public long getReadBitmapIndexCount() {
 		return stats.readBitmap;
 	}
 
-	/** @return total number of bytes read from indexes. */
+	/**
+	 * Get total number of bytes read from indexes.
+	 *
+	 * @return total number of bytes read from indexes.
+	 */
 	public long getReadIndexBytes() {
 		return stats.readIdxBytes;
 	}
 
-	/** @return total microseconds spent reading pack or bitmap indexes. */
+	/**
+	 * Get total microseconds spent reading pack or bitmap indexes.
+	 *
+	 * @return total microseconds spent reading pack or bitmap indexes.
+	 */
 	public long getReadIndexMicros() {
 		return stats.readIdxMicros;
 	}
 
-	/** @return total number of block cache hits. */
+	/**
+	 * Get total number of block cache hits.
+	 *
+	 * @return total number of block cache hits.
+	 */
 	public long getBlockCacheHits() {
 		return stats.blockCacheHit;
 	}
 
-	/** @return total number of discrete blocks read from pack file(s). */
+	/**
+	 * Get total number of discrete blocks read from pack file(s).
+	 *
+	 * @return total number of discrete blocks read from pack file(s).
+	 */
 	public long getReadBlocksCount() {
 		return stats.readBlock;
 	}
 
-	/** @return total number of compressed bytes read as block sized units. */
+	/**
+	 * Get total number of compressed bytes read as block sized units.
+	 *
+	 * @return total number of compressed bytes read as block sized units.
+	 */
 	public long getReadBlocksBytes() {
 		return stats.readBlockBytes;
 	}
 
-	/** @return total microseconds spent reading blocks. */
+	/**
+	 * Get total microseconds spent reading blocks.
+	 *
+	 * @return total microseconds spent reading blocks.
+	 */
 	public long getReadBlocksMicros() {
 		return stats.readBlockMicros;
 	}
 
-	/** @return total number of bytes decompressed. */
+	/**
+	 * Get total number of bytes decompressed.
+	 *
+	 * @return total number of bytes decompressed.
+	 */
 	public long getInflatedBytes() {
 		return stats.inflatedBytes;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java
index d07c13d..bf14d18 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.storage.pack.PackConfig;
 
-/** Options controlling how objects are read from a DFS stored repository. */
+/**
+ * Options controlling how objects are read from a DFS stored repository.
+ */
 public class DfsReaderOptions {
 	/** 1024 (number of bytes in one kibibyte/kilobyte) */
 	public static final int KiB = 1024;
@@ -65,13 +67,19 @@
 
 	private int streamPackBufferSize;
 
-	/** Create a default reader configuration. */
+	/**
+	 * Create a default reader configuration.
+	 */
 	public DfsReaderOptions() {
 		setDeltaBaseCacheLimit(10 * MiB);
 		setStreamFileThreshold(PackConfig.DEFAULT_BIG_FILE_THRESHOLD);
 	}
 
-	/** @return maximum number of bytes to hold in per-reader DeltaBaseCache. */
+	/**
+	 * Get maximum number of bytes to hold in per-reader DeltaBaseCache.
+	 *
+	 * @return maximum number of bytes to hold in per-reader DeltaBaseCache.
+	 */
 	public int getDeltaBaseCacheLimit() {
 		return deltaBaseCacheLimit;
 	}
@@ -88,12 +96,18 @@
 		return this;
 	}
 
-	/** @return the size threshold beyond which objects must be streamed. */
+	/**
+	 * Get the size threshold beyond which objects must be streamed.
+	 *
+	 * @return the size threshold beyond which objects must be streamed.
+	 */
 	public int getStreamFileThreshold() {
 		return streamFileThreshold;
 	}
 
 	/**
+	 * Set new byte limit for objects that must be streamed.
+	 *
 	 * @param newLimit
 	 *            new byte limit for objects that must be streamed. Objects
 	 *            smaller than this size can be obtained as a contiguous byte
@@ -107,6 +121,9 @@
 	}
 
 	/**
+	 * Get number of bytes to use for buffering when streaming a pack file
+	 * during copying.
+	 *
 	 * @return number of bytes to use for buffering when streaming a pack file
 	 *         during copying. If 0 the block size of the pack is used.
 	 */
@@ -115,6 +132,9 @@
 	}
 
 	/**
+	 * Set new buffer size in bytes for buffers used when streaming pack files
+	 * during copying.
+	 *
 	 * @param bufsz
 	 *            new buffer size in bytes for buffers used when streaming pack
 	 *            files during copying.
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 b41c18b..a884346 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
@@ -64,7 +64,10 @@
 import org.eclipse.jgit.util.RefList;
 import org.eclipse.jgit.util.RefMap;
 
-/** */
+/**
+ * Abstract DfsRefDatabase class.
+ *
+ */
 public abstract class DfsRefDatabase extends RefDatabase {
 	private final DfsRepository repository;
 
@@ -81,7 +84,11 @@
 		this.cache = new AtomicReference<>();
 	}
 
-	/** @return the repository the database holds the references of. */
+	/**
+	 * Get the repository the database holds the references of.
+	 *
+	 * @return the repository the database holds the references of.
+	 */
 	protected DfsRepository getRepository() {
 		return repository;
 	}
@@ -90,6 +97,7 @@
 		return 0 < read().size();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		RefCache curr = read();
@@ -97,6 +105,7 @@
 		return ref != null ? resolve(ref, 0, curr.ids) : null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref getRef(String needle) throws IOException {
 		RefCache curr = read();
@@ -110,11 +119,13 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getAdditionalRefs() {
 		return Collections.emptyList();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		RefCache curr = read();
@@ -161,6 +172,7 @@
 		return new SymbolicRef(ref.getName(), dst);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref peel(Ref ref) throws IOException {
 		final Ref oldLeaf = ref.getLeaf();
@@ -180,7 +192,7 @@
 		return recreate(ref, newLeaf);
 	}
 
-	private Ref doPeel(final Ref leaf) throws MissingObjectException,
+	Ref doPeel(Ref leaf) throws MissingObjectException,
 			IOException {
 		try (RevWalk rw = new RevWalk(repository)) {
 			RevObject obj = rw.parseAny(leaf.getObjectId());
@@ -199,7 +211,7 @@
 		}
 	}
 
-	private static Ref recreate(Ref old, Ref leaf) {
+	static Ref recreate(Ref old, Ref leaf) {
 		if (old.isSymbolic()) {
 			Ref dst = recreate(old.getTarget(), leaf);
 			return new SymbolicRef(old.getName(), dst);
@@ -207,6 +219,7 @@
 		return leaf;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefUpdate newUpdate(String refName, boolean detach)
 			throws IOException {
@@ -223,6 +236,7 @@
 		return update;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefRename newRename(String fromName, String toName)
 			throws IOException {
@@ -231,6 +245,7 @@
 		return new DfsRefRename(src, dst);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isNameConflicting(String refName) throws IOException {
 		RefList<Ref> all = read().ids;
@@ -252,16 +267,19 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void create() {
 		// Nothing to do.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void refresh() {
 		clearCache();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		clearCache();
@@ -304,7 +322,7 @@
 	 * Read all known references in the repository.
 	 *
 	 * @return all current references of the repository.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             references cannot be accessed.
 	 */
 	protected abstract RefCache scanAllRefs() throws IOException;
@@ -329,7 +347,7 @@
 	 * @param newRef
 	 *            new reference to store.
 	 * @return true if the put was successful; false otherwise.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference cannot be put due to a system error.
 	 */
 	protected abstract boolean compareAndPut(Ref oldRef, Ref newRef)
@@ -341,7 +359,7 @@
 	 * @param oldRef
 	 *            the old reference information that was previously read.
 	 * @return true if the remove was successful; false otherwise.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference could not be removed due to a system error.
 	 */
 	protected abstract boolean compareAndRemove(Ref oldRef) throws IOException;
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 d9c2bc7..65ef366 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
@@ -55,6 +55,7 @@
 		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 1f26fe3..de65c68 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
@@ -66,16 +66,19 @@
 		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();
@@ -90,11 +93,13 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void unlock() {
 		// No state is held while "locked".
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Result update(RevWalk walk) throws IOException {
 		try {
@@ -105,6 +110,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doUpdate(Result desiredResult) throws IOException {
 		ObjectIdRef newRef;
@@ -129,6 +135,7 @@
 		return Result.LOCK_FAILURE;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doDelete(Result desiredResult) throws IOException {
 		if (getRefDatabase().compareAndRemove(dstRef)) {
@@ -138,6 +145,7 @@
 		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/DfsReftable.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftable.java
index 5a8ea92..7502471 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftable.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftable.java
@@ -51,7 +51,9 @@
 import org.eclipse.jgit.internal.storage.io.BlockSource;
 import org.eclipse.jgit.internal.storage.reftable.ReftableReader;
 
-/** A reftable stored in {@link DfsBlockCache}. */
+/**
+ * A reftable stored in {@link org.eclipse.jgit.internal.storage.dfs.DfsBlockCache}.
+ */
 public class DfsReftable extends BlockBasedFile {
 	/**
 	 * Construct a reader for an existing reftable.
@@ -83,7 +85,11 @@
 		length = sz > 0 ? sz : -1;
 	}
 
-	/** @return description that was originally used to configure this file. */
+	/**
+	 * Get description that was originally used to configure this file.
+	 *
+	 * @return description that was originally used to configure this file.
+	 */
 	public DfsPackDescription getPackDescription() {
 		return desc;
 	}
@@ -96,7 +102,7 @@
 	 * @param ctx
 	 *            reader to access the DFS storage.
 	 * @return cursor to read the table; caller must close.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             table cannot be opened.
 	 */
 	public ReftableReader open(DfsReader ctx) throws IOException {
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
new file mode 100644
index 0000000..9c844eb
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2017, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.internal.storage.dfs;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.internal.storage.reftable.MergedReftable;
+import org.eclipse.jgit.internal.storage.reftable.RefCursor;
+import org.eclipse.jgit.internal.storage.reftable.Reftable;
+import org.eclipse.jgit.internal.storage.reftable.ReftableConfig;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.util.RefList;
+import org.eclipse.jgit.util.RefMap;
+
+/**
+ * A {@link org.eclipse.jgit.internal.storage.dfs.DfsRefDatabase} that uses
+ * reftable for storage.
+ * <p>
+ * A {@code DfsRefDatabase} instance is thread-safe.
+ * <p>
+ * Implementors may wish to use
+ * {@link org.eclipse.jgit.internal.storage.dfs.DfsPackDescription#getMaxUpdateIndex()}
+ * as the primary key identifier for a
+ * {@link org.eclipse.jgit.internal.storage.pack.PackExt#REFTABLE} only pack
+ * description, ensuring that when there are competing transactions one wins,
+ * and one will fail.
+ */
+public class DfsReftableDatabase extends DfsRefDatabase {
+	private final ReentrantLock lock = new ReentrantLock(true);
+
+	private DfsReader ctx;
+
+	private ReftableStack tableStack;
+
+	private MergedReftable mergedTables;
+
+	/**
+	 * Initialize the reference database for a repository.
+	 *
+	 * @param repo
+	 *            the repository this database instance manages references for.
+	 */
+	protected DfsReftableDatabase(DfsRepository repo) {
+		super(repo);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean performsAtomicTransactions() {
+		return true;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public BatchRefUpdate newBatchUpdate() {
+		DfsObjDatabase odb = getRepository().getObjectDatabase();
+		return new ReftableBatchRefUpdate(this, odb);
+	}
+
+	/**
+	 * Get configuration to write new reftables with.
+	 *
+	 * @return configuration to write new reftables with.
+	 */
+	public ReftableConfig getReftableConfig() {
+		return new ReftableConfig(getRepository().getConfig());
+	}
+
+	/**
+	 * Get the lock protecting this instance's state.
+	 *
+	 * @return the lock protecting this instance's state.
+	 */
+	protected ReentrantLock getLock() {
+		return lock;
+	}
+
+	/**
+	 * Whether to compact reftable instead of extending the stack depth.
+	 *
+	 * @return {@code true} if commit of a new small reftable should try to
+	 *         replace a prior small reftable by performing a compaction,
+	 *         instead of extending the stack depth.
+	 */
+	protected boolean compactDuringCommit() {
+		return true;
+	}
+
+	/**
+	 * Obtain a handle to the merged reader.
+	 *
+	 * @return (possibly cached) handle to the merged reader.
+	 * @throws java.io.IOException
+	 *             if tables cannot be opened.
+	 */
+	protected Reftable reader() throws IOException {
+		lock.lock();
+		try {
+			if (mergedTables == null) {
+				mergedTables = new MergedReftable(stack().readers());
+			}
+			return mergedTables;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/**
+	 * Obtain a handle to the stack of reftables.
+	 *
+	 * @return (possibly cached) handle to the stack.
+	 * @throws java.io.IOException
+	 *             if tables cannot be opened.
+	 */
+	protected ReftableStack stack() throws IOException {
+		lock.lock();
+		try {
+			if (tableStack == null) {
+				DfsObjDatabase odb = getRepository().getObjectDatabase();
+				if (ctx == null) {
+					ctx = odb.newReader();
+				}
+				tableStack = ReftableStack.open(ctx,
+						Arrays.asList(odb.getReftables()));
+			}
+			return tableStack;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean isNameConflicting(String refName) throws IOException {
+		lock.lock();
+		try {
+			Reftable table = reader();
+
+			// Cannot be nested within an existing reference.
+			int lastSlash = refName.lastIndexOf('/');
+			while (0 < lastSlash) {
+				if (table.hasRef(refName.substring(0, lastSlash))) {
+					return true;
+				}
+				lastSlash = refName.lastIndexOf('/', lastSlash - 1);
+			}
+
+			// Cannot be the container of an existing reference.
+			return table.hasRef(refName + '/');
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Ref exactRef(String name) throws IOException {
+		lock.lock();
+		try {
+			Reftable table = reader();
+			Ref ref = table.exactRef(name);
+			if (ref != null && ref.isSymbolic()) {
+				return table.resolve(ref);
+			}
+			return ref;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Ref getRef(String needle) throws IOException {
+		for (String prefix : SEARCH_PATH) {
+			Ref ref = exactRef(prefix + needle);
+			if (ref != null) {
+				return ref;
+			}
+		}
+		return null;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Map<String, Ref> getRefs(String prefix) throws IOException {
+		RefList.Builder<Ref> all = new RefList.Builder<>();
+		lock.lock();
+		try {
+			Reftable table = reader();
+			try (RefCursor rc = ALL.equals(prefix) ? table.allRefs()
+					: table.seekRef(prefix)) {
+				while (rc.next()) {
+					Ref ref = table.resolve(rc.getRef());
+					if (ref != null) {
+						all.add(ref);
+					}
+				}
+			}
+		} finally {
+			lock.unlock();
+		}
+
+		RefList<Ref> none = RefList.emptyList();
+		return new RefMap(prefix, all.toRefList(), none, none);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Ref peel(Ref ref) throws IOException {
+		Ref oldLeaf = ref.getLeaf();
+		if (oldLeaf.isPeeled() || oldLeaf.getObjectId() == null) {
+			return ref;
+		}
+		return recreate(ref, doPeel(oldLeaf));
+	}
+
+	@Override
+	boolean exists() throws IOException {
+		DfsObjDatabase odb = getRepository().getObjectDatabase();
+		return odb.getReftables().length > 0;
+	}
+
+	@Override
+	void clearCache() {
+		lock.lock();
+		try {
+			if (tableStack != null) {
+				tableStack.close();
+				tableStack = null;
+			}
+			if (ctx != null) {
+				ctx.close();
+				ctx = null;
+			}
+			mergedTables = null;
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean compareAndPut(Ref oldRef, @Nullable Ref newRef)
+			throws IOException {
+		ReceiveCommand cmd = toCommand(oldRef, newRef);
+		try (RevWalk rw = new RevWalk(getRepository())) {
+			newBatchUpdate().setAllowNonFastForwards(true).addCommand(cmd)
+					.execute(rw, NullProgressMonitor.INSTANCE);
+		}
+		switch (cmd.getResult()) {
+		case OK:
+			return true;
+		case REJECTED_OTHER_REASON:
+			throw new IOException(cmd.getMessage());
+		case LOCK_FAILURE:
+		default:
+			return false;
+		}
+	}
+
+	private static ReceiveCommand toCommand(Ref oldRef, Ref newRef) {
+		ObjectId oldId = toId(oldRef);
+		ObjectId newId = toId(newRef);
+		String name = toName(oldRef, newRef);
+
+		if (oldRef != null && oldRef.isSymbolic()) {
+			if (newRef != null) {
+				if (newRef.isSymbolic()) {
+					return ReceiveCommand.link(oldRef.getTarget().getName(),
+							newRef.getTarget().getName(), name);
+				} else {
+					return ReceiveCommand.unlink(oldRef.getTarget().getName(),
+							newId, name);
+				}
+			} else {
+				return ReceiveCommand.unlink(oldRef.getTarget().getName(),
+						ObjectId.zeroId(), name);
+			}
+		}
+
+		if (newRef != null && newRef.isSymbolic()) {
+			if (oldRef != null) {
+				if (oldRef.isSymbolic()) {
+					return ReceiveCommand.link(oldRef.getTarget().getName(),
+							newRef.getTarget().getName(), name);
+				} else {
+					return ReceiveCommand.link(oldId,
+							newRef.getTarget().getName(), name);
+				}
+			} else {
+				return ReceiveCommand.link(ObjectId.zeroId(),
+						newRef.getTarget().getName(), name);
+			}
+		}
+
+		return new ReceiveCommand(oldId, newId, name);
+	}
+
+	private static ObjectId toId(Ref ref) {
+		if (ref != null) {
+			ObjectId id = ref.getObjectId();
+			if (id != null) {
+				return id;
+			}
+		}
+		return ObjectId.zeroId();
+	}
+
+	private static String toName(Ref oldRef, Ref newRef) {
+		return oldRef != null ? oldRef.getName() : newRef.getName();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean compareAndRemove(Ref oldRef) throws IOException {
+		return compareAndPut(oldRef, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected RefCache scanAllRefs() throws IOException {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	void stored(Ref ref) {
+		// Unnecessary; ReftableBatchRefUpdate calls clearCache().
+	}
+
+	@Override
+	void removed(String refName) {
+		// Unnecessary; ReftableBatchRefUpdate 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/DfsRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsRepository.java
index a5dd514..1976816 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
@@ -58,7 +58,9 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 
-/** A Git repository on a DFS. */
+/**
+ * A Git repository on a DFS.
+ */
 public abstract class DfsRepository extends Repository {
 	private final DfsConfig config;
 
@@ -76,10 +78,15 @@
 		this.description = builder.getRepositoryDescription();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public abstract DfsObjDatabase getObjectDatabase();
 
-	/** @return a description of this repository. */
+	/**
+	 * Get the description of this repository.
+	 *
+	 * @return the description of this repository.
+	 */
 	public DfsRepositoryDescription getDescription() {
 		return description;
 	}
@@ -88,7 +95,7 @@
 	 * Check if the repository already exists.
 	 *
 	 * @return true if the repository exists; false if it is new.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be checked.
 	 */
 	public boolean exists() throws IOException {
@@ -98,6 +105,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void create(boolean bare) throws IOException {
 		if (exists())
@@ -110,28 +118,33 @@
 			throw new IOException(result.name());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public StoredConfig getConfig() {
 		return config;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void scanForRepoChanges() throws IOException {
 		getRefDatabase().refresh();
 		getObjectDatabase().clearCache();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void notifyIndexChanged() {
 		// 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 77e060a..2b67fd9 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
@@ -50,7 +50,7 @@
 import org.eclipse.jgit.lib.BaseRepositoryBuilder;
 
 /**
- * Constructs a {@link DfsRepository}.
+ * Constructs a {@link org.eclipse.jgit.internal.storage.dfs.DfsRepository}.
  *
  * @param <B>
  *            type of the builder class.
@@ -63,7 +63,11 @@
 
 	private DfsRepositoryDescription repoDesc;
 
-	/** @return options used by readers accessing the repository. */
+	/**
+	 * Get options used by readers accessing the repository.
+	 *
+	 * @return options used by readers accessing the repository.
+	 */
 	public DfsReaderOptions getReaderOptions() {
 		return readerOptions;
 	}
@@ -80,7 +84,11 @@
 		return self();
 	}
 
-	/** @return a description of the repository. */
+	/**
+	 * Get the description of the repository.
+	 *
+	 * @return the description of the repository.
+	 */
 	public DfsRepositoryDescription getRepositoryDescription() {
 		return repoDesc;
 	}
@@ -97,6 +105,7 @@
 		return self();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public B setup() throws IllegalArgumentException, IOException {
 		super.setup();
@@ -108,24 +117,20 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Create a repository matching the configuration in this builder.
 	 * <p>
 	 * If an option was not set, the build method will try to default the option
 	 * based on other options. If insufficient information is available, an
 	 * exception is thrown to the caller.
-	 *
-	 * @return a repository matching this configuration.
-	 * @throws IllegalArgumentException
-	 *             insufficient parameters were set.
-	 * @throws IOException
-	 *             the repository could not be accessed to configure the rest of
-	 *             the builder's parameters.
 	 */
 	@Override
 	public abstract R build() throws 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)
@@ -133,6 +138,7 @@
 		return self();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public B setObjectDirectory(File objectDirectory) {
 		if (objectDirectory != null)
@@ -140,12 +146,14 @@
 		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)
@@ -153,6 +161,7 @@
 		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 8afad0e..5e6c7e1 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
@@ -43,11 +43,15 @@
 
 package org.eclipse.jgit.internal.storage.dfs;
 
-/** A description of a Git repository on a DFS. */
+/**
+ * A description of a Git repository on a DFS.
+ */
 public class DfsRepositoryDescription {
 	private final String repositoryName;
 
-	/** Initialize a new, empty repository description. */
+	/**
+	 * Initialize a new, empty repository description.
+	 */
 	public DfsRepositoryDescription() {
 		this(null);
 	}
@@ -62,11 +66,16 @@
 		this.repositoryName = repositoryName;
 	}
 
-	/** @return the name of the repository. */
+	/**
+	 * Get the name of the repository.
+	 *
+	 * @return the name of the repository.
+	 */
 	public String getRepositoryName() {
 		return repositoryName;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		if (getRepositoryName() != null)
@@ -74,6 +83,7 @@
 		return System.identityHashCode(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object b) {
 		if (b instanceof DfsRepositoryDescription){
@@ -84,6 +94,7 @@
 		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 54a7489..8793d83 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
@@ -47,39 +47,59 @@
 
 import java.util.Arrays;
 
-/** Key used by {@link DfsBlockCache} to disambiguate streams. */
+import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
+
+/**
+ * Key used by {@link org.eclipse.jgit.internal.storage.dfs.DfsBlockCache} to disambiguate streams.
+ */
 public abstract class DfsStreamKey {
 	/**
+	 * Create a {@code DfsStreamKey}
+	 *
 	 * @param repo
 	 *            description of the containing repository.
 	 * @param name
 	 *            compute the key from a string name.
+	 * @param ext
+	 *            pack file extension, or {@code null}.
 	 * @return key for {@code name}
 	 */
-	public static DfsStreamKey of(DfsRepositoryDescription repo, String name) {
-		return new ByteArrayDfsStreamKey(repo, name.getBytes(UTF_8));
+	public static DfsStreamKey of(DfsRepositoryDescription repo, String name,
+			@Nullable PackExt ext) {
+		return new ByteArrayDfsStreamKey(repo, name.getBytes(UTF_8), ext);
 	}
 
 	final int hash;
 
+	final int packExtPos;
+
 	/**
+	 * Constructor for DfsStreamKey.
+	 *
 	 * @param hash
 	 *            hash of the other identifying components of the key.
+	 * @param ext
+	 *            pack file extension, or {@code null}.
 	 */
-	protected DfsStreamKey(int hash) {
+	protected DfsStreamKey(int hash, @Nullable PackExt ext) {
 		// Multiply by 31 here so we can more directly combine with another
 		// value without doing the multiply there.
 		this.hash = hash * 31;
+		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() {
@@ -88,10 +108,12 @@
 
 	private static final class ByteArrayDfsStreamKey extends DfsStreamKey {
 		private final DfsRepositoryDescription repo;
+
 		private final byte[] name;
 
-		ByteArrayDfsStreamKey(DfsRepositoryDescription repo, byte[] name) {
-			super(repo.hashCode() * 31 + Arrays.hashCode(name));
+		ByteArrayDfsStreamKey(DfsRepositoryDescription repo, byte[] name,
+				@Nullable PackExt ext) {
+			super(repo.hashCode() * 31 + Arrays.hashCode(name), ext);
 			this.repo = repo;
 			this.name = name;
 		}
@@ -100,8 +122,7 @@
 		public boolean equals(Object o) {
 			if (o instanceof ByteArrayDfsStreamKey) {
 				ByteArrayDfsStreamKey k = (ByteArrayDfsStreamKey) o;
-				return hash == k.hash
-						&& repo.equals(k.repo)
+				return hash == k.hash && repo.equals(k.repo)
 						&& Arrays.equals(name, k.name);
 			}
 			return false;
@@ -112,7 +133,7 @@
 		private final DfsStreamKey idxKey;
 
 		ForReverseIndex(DfsStreamKey idxKey) {
-			super(idxKey.hash + 1);
+			super(idxKey.hash + 1, null);
 			this.idxKey = idxKey;
 		}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsText.java
index dedcab0..9327bd1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsText.java
@@ -46,9 +46,15 @@
 import org.eclipse.jgit.nls.NLS;
 import org.eclipse.jgit.nls.TranslationBundle;
 
-/** Translation bundle for the DFS storage implementation. */
+/**
+ * Translation bundle for the DFS storage implementation.
+ */
 public class DfsText extends TranslationBundle {
-	/** @return instance of this translation bundle */
+	/**
+	 * Get an instance of this translation bundle.
+	 *
+	 * @return instance of this translation bundle.
+	 */
 	public static DfsText get() {
 		return NLS.getBundleFor(DfsText.class);
 	}
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 1e31878..662c3fe 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
@@ -6,30 +6,13 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.internal.storage.pack.PackExt;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectIdRef;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Ref.Storage;
+import org.eclipse.jgit.internal.storage.reftable.ReftableConfig;
 import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.util.RefList;
 
 /**
  * Git repository stored entirely in the local process memory.
@@ -54,9 +37,8 @@
 	static final AtomicInteger packId = new AtomicInteger();
 
 	private final MemObjDatabase objdb;
-	private final RefDatabase refdb;
+	private final MemRefDatabase refdb;
 	private String gitwebDescription;
-	private boolean performsAtomicTransactions = true;
 
 	/**
 	 * Initialize a new in-memory repository.
@@ -74,11 +56,13 @@
 		refdb = new MemRefDatabase();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public MemObjDatabase getObjectDatabase() {
 		return objdb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefDatabase getRefDatabase() {
 		return refdb;
@@ -90,17 +74,20 @@
 	 * Useful for testing atomic support enabled or disabled.
 	 *
 	 * @param atomic
+	 *            whether to use atomic reference transaction support
 	 */
 	public void setPerformsAtomicTransactions(boolean atomic) {
-		performsAtomicTransactions = atomic;
+		refdb.performsAtomicTransactions = atomic;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public String getGitwebDescription() {
 		return gitwebDescription;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setGitwebDescription(@Nullable String d) {
 		gitwebDescription = d;
@@ -148,6 +135,7 @@
 			if (replace != null)
 				n.removeAll(replace);
 			packs = n;
+			clearCache();
 		}
 
 		@Override
@@ -159,37 +147,43 @@
 		protected ReadableChannel openFile(DfsPackDescription desc, PackExt ext)
 				throws FileNotFoundException, IOException {
 			MemPack memPack = (MemPack) desc;
-			byte[] file = memPack.fileMap.get(ext);
+			byte[] file = memPack.get(ext);
 			if (file == null)
 				throw new FileNotFoundException(desc.getFileName(ext));
 			return new ByteArrayReadableChannel(file, blockSize);
 		}
 
 		@Override
-		protected DfsOutputStream writeFile(
-				DfsPackDescription desc, final PackExt ext) throws IOException {
-			final MemPack memPack = (MemPack) desc;
+		protected DfsOutputStream writeFile(DfsPackDescription desc,
+				PackExt ext) throws IOException {
+			MemPack memPack = (MemPack) desc;
 			return new Out() {
 				@Override
 				public void flush() {
-					memPack.fileMap.put(ext, getData());
+					memPack.put(ext, getData());
 				}
 			};
 		}
 	}
 
 	private static class MemPack extends DfsPackDescription {
-		final Map<PackExt, byte[]>
-				fileMap = new HashMap<>();
+		final byte[][] fileMap = new byte[PackExt.values().length][];
 
 		MemPack(String name, DfsRepositoryDescription repoDesc) {
 			super(repoDesc, name);
 		}
+
+		void put(PackExt ext, byte[] data) {
+			fileMap[ext.getPosition()] = data;
+		}
+
+		byte[] get(PackExt ext) {
+			return fileMap[ext.getPosition()];
+		}
 	}
 
 	private abstract static class Out extends DfsOutputStream {
 		private final ByteArrayOutputStream dst = new ByteArrayOutputStream();
-
 		private byte[] data;
 
 		@Override
@@ -221,7 +215,6 @@
 		public void close() {
 			flush();
 		}
-
 	}
 
 	private static class ByteArrayReadableChannel implements ReadableChannel {
@@ -281,193 +274,27 @@
 		}
 	}
 
-	/**
-	 * A ref database storing all refs in-memory.
-	 * <p>
-	 * This class is protected (and not private) to facilitate testing using
-	 * subclasses of InMemoryRepository.
-	 */
-    protected class MemRefDatabase extends DfsRefDatabase {
-		private final ConcurrentMap<String, Ref> refs = new ConcurrentHashMap<>();
-		private final ReadWriteLock lock = new ReentrantReadWriteLock(true /* fair */);
+	/** DfsRefDatabase used by InMemoryRepository. */
+	protected class MemRefDatabase extends DfsReftableDatabase {
+		boolean performsAtomicTransactions = true;
 
-		/**
-		 * Initialize a new in-memory ref database.
-		 */
+		/** Initialize a new in-memory ref database. */
 		protected MemRefDatabase() {
 			super(InMemoryRepository.this);
 		}
 
 		@Override
+		public ReftableConfig getReftableConfig() {
+			ReftableConfig cfg = new ReftableConfig();
+			cfg.setAlignBlocks(false);
+			cfg.setIndexObjects(false);
+			cfg.fromConfig(getRepository().getConfig());
+			return cfg;
+		}
+
+		@Override
 		public boolean performsAtomicTransactions() {
 			return performsAtomicTransactions;
 		}
-
-		@Override
-		public BatchRefUpdate newBatchUpdate() {
-			return new BatchRefUpdate(this) {
-				@Override
-				public void execute(RevWalk walk, ProgressMonitor monitor)
-						throws IOException {
-					if (performsAtomicTransactions() && isAtomic()) {
-						try {
-							lock.writeLock().lock();
-							batch(getCommands());
-						} finally {
-							lock.writeLock().unlock();
-						}
-					} else {
-						super.execute(walk, monitor);
-					}
-				}
-			};
-		}
-
-		@Override
-		protected RefCache scanAllRefs() throws IOException {
-			RefList.Builder<Ref> ids = new RefList.Builder<>();
-			RefList.Builder<Ref> sym = new RefList.Builder<>();
-			try {
-				lock.readLock().lock();
-				for (Ref ref : refs.values()) {
-					if (ref.isSymbolic())
-						sym.add(ref);
-					ids.add(ref);
-				}
-			} finally {
-				lock.readLock().unlock();
-			}
-			ids.sort();
-			sym.sort();
-			objdb.getCurrentPackList().markDirty();
-			return new RefCache(ids.toRefList(), sym.toRefList());
-		}
-
-		private void batch(List<ReceiveCommand> cmds) {
-			// Validate that the target exists in a new RevWalk, as the RevWalk
-			// from the RefUpdate might be reading back unflushed objects.
-			Map<ObjectId, ObjectId> peeled = new HashMap<>();
-			try (RevWalk rw = new RevWalk(getRepository())) {
-				for (ReceiveCommand c : cmds) {
-					if (c.getResult() != ReceiveCommand.Result.NOT_ATTEMPTED) {
-						ReceiveCommand.abort(cmds);
-						return;
-					}
-
-					if (!ObjectId.zeroId().equals(c.getNewId())) {
-						try {
-							RevObject o = rw.parseAny(c.getNewId());
-							if (o instanceof RevTag) {
-								peeled.put(o, rw.peel(o).copy());
-							}
-						} catch (IOException e) {
-							c.setResult(ReceiveCommand.Result.REJECTED_MISSING_OBJECT);
-							ReceiveCommand.abort(cmds);
-							return;
-						}
-					}
-				}
-			}
-
-			// Check all references conform to expected old value.
-			for (ReceiveCommand c : cmds) {
-				Ref r = refs.get(c.getRefName());
-				if (r == null) {
-					if (c.getType() != ReceiveCommand.Type.CREATE) {
-						c.setResult(ReceiveCommand.Result.LOCK_FAILURE);
-						ReceiveCommand.abort(cmds);
-						return;
-					}
-				} else {
-					ObjectId objectId = r.getObjectId();
-					if (r.isSymbolic() || objectId == null
-							|| !objectId.equals(c.getOldId())) {
-						c.setResult(ReceiveCommand.Result.LOCK_FAILURE);
-						ReceiveCommand.abort(cmds);
-						return;
-					}
-				}
-			}
-
-			// Write references.
-			for (ReceiveCommand c : cmds) {
-				if (c.getType() == ReceiveCommand.Type.DELETE) {
-					refs.remove(c.getRefName());
-					c.setResult(ReceiveCommand.Result.OK);
-					continue;
-				}
-
-				ObjectId p = peeled.get(c.getNewId());
-				Ref r;
-				if (p != null) {
-					r = new ObjectIdRef.PeeledTag(Storage.PACKED,
-							c.getRefName(), c.getNewId(), p);
-				} else {
-					r = new ObjectIdRef.PeeledNonTag(Storage.PACKED,
-							c.getRefName(), c.getNewId());
-				}
-				refs.put(r.getName(), r);
-				c.setResult(ReceiveCommand.Result.OK);
-			}
-			clearCache();
-		}
-
-		@Override
-		protected boolean compareAndPut(Ref oldRef, Ref newRef)
-				throws IOException {
-			try {
-				lock.writeLock().lock();
-				ObjectId id = newRef.getObjectId();
-				if (id != null) {
-					try (RevWalk rw = new RevWalk(getRepository())) {
-						// Validate that the target exists in a new RevWalk, as the RevWalk
-						// from the RefUpdate might be reading back unflushed objects.
-						rw.parseAny(id);
-					}
-				}
-				String name = newRef.getName();
-				if (oldRef == null)
-					return refs.putIfAbsent(name, newRef) == null;
-
-				Ref cur = refs.get(name);
-				if (cur != null) {
-					if (eq(cur, oldRef))
-						return refs.replace(name, cur, newRef);
-				}
-
-				if (oldRef.getStorage() == Storage.NEW)
-					return refs.putIfAbsent(name, newRef) == null;
-
-				return false;
-			} finally {
-				lock.writeLock().unlock();
-			}
-		}
-
-		@Override
-		protected boolean compareAndRemove(Ref oldRef) throws IOException {
-			try {
-				lock.writeLock().lock();
-				String name = oldRef.getName();
-				Ref cur = refs.get(name);
-				if (cur != null && eq(cur, oldRef))
-					return refs.remove(name, cur);
-				else
-					return false;
-			} finally {
-				lock.writeLock().unlock();
-			}
-		}
-
-		private boolean eq(Ref a, Ref b) {
-			if (!Objects.equals(a.getName(), b.getName()))
-				return false;
-			if (a.isSymbolic() != b.isSymbolic())
-				return false;
-			if (a.isSymbolic())
-				return Objects.equals(a.getTarget().getName(), b.getTarget().getName());
-			else
-				return Objects.equals(a.getObjectId(), b.getObjectId());
-		}
 	}
 }
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 73a93e6..fa2c529 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
@@ -77,26 +77,31 @@
 		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 {
 		DfsReader ctx = db.newReader();
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 bb8445b..d88011c 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
@@ -64,6 +64,7 @@
 		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);
@@ -71,6 +72,7 @@
 		return n;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		byte[] buf = new byte[1];
@@ -78,6 +80,7 @@
 		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/dfs/ReadableChannel.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java
index 240d552..9b98250 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java
@@ -46,13 +46,15 @@
 import java.io.IOException;
 import java.nio.channels.ReadableByteChannel;
 
-/** Readable random access byte channel from a file. */
+/**
+ * Readable random access byte channel from a file.
+ */
 public interface ReadableChannel extends ReadableByteChannel {
 	/**
 	 * Get the current position of the channel.
 	 *
 	 * @return r current offset.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the channel's current position cannot be obtained.
 	 */
 	public long position() throws IOException;
@@ -63,7 +65,7 @@
 	 * @param newPosition
 	 *            position to move the channel to. The next read will start from
 	 *            here. This should be a multiple of the {@link #blockSize()}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the position cannot be updated. This may be because the
 	 *             channel only supports block aligned IO and the current
 	 *             position is not block aligned.
@@ -78,7 +80,7 @@
 	 * read has been completed, the underlying file size should be available.
 	 *
 	 * @return r total size of the channel; -1 if not yet available.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the size cannot be determined.
 	 */
 	public long size() throws IOException;
@@ -92,9 +94,10 @@
 	 * <p>
 	 * Channels should not recommend large block sizes. Sizes up to 1-4 MiB may
 	 * be reasonable, but sizes above that may be horribly inefficient. The
-	 * {@link DfsBlockCache} favors the alignment suggested by the channel
-	 * rather than the configured size under the assumption that reads are very
-	 * expensive and the channel knows what size is best to access it with.
+	 * {@link org.eclipse.jgit.internal.storage.dfs.DfsBlockCache} favors the
+	 * alignment suggested by the channel rather than the configured size under
+	 * the assumption that reads are very expensive and the channel knows what
+	 * size is best to access it with.
 	 *
 	 * @return recommended alignment size for randomly positioned reads. Does
 	 *         not need to be a power of 2.
@@ -125,7 +128,7 @@
 	 *
 	 * @param bufferSize
 	 *            requested size of the read ahead buffer, in bytes.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the read ahead cannot be adjusted.
 	 */
 	public void setReadAheadBytes(int bufferSize) throws IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableBatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableBatchRefUpdate.java
new file mode 100644
index 0000000..e0c056a
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableBatchRefUpdate.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright (C) 2017, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.internal.storage.dfs;
+
+import static org.eclipse.jgit.internal.storage.pack.PackExt.REFTABLE;
+import static org.eclipse.jgit.lib.Ref.Storage.NEW;
+import static org.eclipse.jgit.lib.Ref.Storage.PACKED;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.LOCK_FAILURE;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.NOT_ATTEMPTED;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.OK;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_MISSING_OBJECT;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_NONFASTFORWARD;
+import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource;
+import org.eclipse.jgit.internal.storage.io.BlockSource;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
+import org.eclipse.jgit.internal.storage.reftable.RefCursor;
+import org.eclipse.jgit.internal.storage.reftable.Reftable;
+import org.eclipse.jgit.internal.storage.reftable.ReftableCompactor;
+import org.eclipse.jgit.internal.storage.reftable.ReftableConfig;
+import org.eclipse.jgit.internal.storage.reftable.ReftableReader;
+import org.eclipse.jgit.internal.storage.reftable.ReftableWriter;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.ReflogEntry;
+import org.eclipse.jgit.lib.SymbolicRef;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * {@link org.eclipse.jgit.lib.BatchRefUpdate} for
+ * {@link org.eclipse.jgit.internal.storage.dfs.DfsReftableDatabase}.
+ */
+public class ReftableBatchRefUpdate extends BatchRefUpdate {
+	private static final int AVG_BYTES = 36;
+
+	private final DfsReftableDatabase refdb;
+
+	private final DfsObjDatabase odb;
+
+	private final ReentrantLock lock;
+
+	private final ReftableConfig reftableConfig;
+
+	/**
+	 * Initialize batch update.
+	 *
+	 * @param refdb
+	 *            database the update will modify.
+	 * @param odb
+	 *            object database to store the reftable.
+	 */
+	protected ReftableBatchRefUpdate(DfsReftableDatabase refdb,
+			DfsObjDatabase odb) {
+		super(refdb);
+		this.refdb = refdb;
+		this.odb = odb;
+		lock = refdb.getLock();
+		reftableConfig = refdb.getReftableConfig();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void execute(RevWalk rw, ProgressMonitor pm, List<String> options) {
+		List<ReceiveCommand> pending = getPending();
+		if (pending.isEmpty()) {
+			return;
+		}
+		if (options != null) {
+			setPushOptions(options);
+		}
+		try {
+			if (!checkObjectExistence(rw, pending)) {
+				return;
+			}
+			if (!checkNonFastForwards(rw, pending)) {
+				return;
+			}
+
+			lock.lock();
+			try {
+				Reftable table = refdb.reader();
+				if (!checkExpected(table, pending)) {
+					return;
+				}
+				if (!checkConflicting(pending)) {
+					return;
+				}
+				if (!blockUntilTimestamps(MAX_WAIT)) {
+					return;
+				}
+				applyUpdates(rw, pending);
+				for (ReceiveCommand cmd : pending) {
+					cmd.setResult(OK);
+				}
+			} finally {
+				lock.unlock();
+			}
+		} catch (IOException e) {
+			pending.get(0).setResult(LOCK_FAILURE, "io error"); //$NON-NLS-1$
+			ReceiveCommand.abort(pending);
+		}
+	}
+
+	private List<ReceiveCommand> getPending() {
+		return ReceiveCommand.filter(getCommands(), NOT_ATTEMPTED);
+	}
+
+	private boolean checkObjectExistence(RevWalk rw,
+			List<ReceiveCommand> pending) throws IOException {
+		for (ReceiveCommand cmd : pending) {
+			try {
+				if (!cmd.getNewId().equals(ObjectId.zeroId())) {
+					rw.parseAny(cmd.getNewId());
+				}
+			} catch (MissingObjectException e) {
+				// ReceiveCommand#setResult(Result) converts REJECTED to
+				// REJECTED_NONFASTFORWARD, even though that result is also
+				// used for a missing object. Eagerly handle this case so we
+				// can set the right result.
+				cmd.setResult(REJECTED_MISSING_OBJECT);
+				ReceiveCommand.abort(pending);
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private boolean checkNonFastForwards(RevWalk rw,
+			List<ReceiveCommand> pending) throws IOException {
+		if (isAllowNonFastForwards()) {
+			return true;
+		}
+		for (ReceiveCommand cmd : pending) {
+			cmd.updateType(rw);
+			if (cmd.getType() == UPDATE_NONFASTFORWARD) {
+				cmd.setResult(REJECTED_NONFASTFORWARD);
+				ReceiveCommand.abort(pending);
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private boolean checkConflicting(List<ReceiveCommand> pending)
+			throws IOException {
+		Set<String> names = new HashSet<>();
+		for (ReceiveCommand cmd : pending) {
+			names.add(cmd.getRefName());
+		}
+
+		boolean ok = true;
+		for (ReceiveCommand cmd : pending) {
+			String name = cmd.getRefName();
+			if (refdb.isNameConflicting(name)) {
+				cmd.setResult(LOCK_FAILURE);
+				ok = false;
+			} else {
+				int s = name.lastIndexOf('/');
+				while (0 < s) {
+					if (names.contains(name.substring(0, s))) {
+						cmd.setResult(LOCK_FAILURE);
+						ok = false;
+						break;
+					}
+					s = name.lastIndexOf('/', s - 1);
+				}
+			}
+		}
+		if (!ok && isAtomic()) {
+			ReceiveCommand.abort(pending);
+			return false;
+		}
+		return ok;
+	}
+
+	private boolean checkExpected(Reftable table, List<ReceiveCommand> pending)
+			throws IOException {
+		for (ReceiveCommand cmd : pending) {
+			Ref ref;
+			try (RefCursor rc = table.seekRef(cmd.getRefName())) {
+				ref = rc.next() ? rc.getRef() : null;
+			}
+			if (!matchOld(cmd, ref)) {
+				cmd.setResult(LOCK_FAILURE);
+				if (isAtomic()) {
+					ReceiveCommand.abort(pending);
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	private static boolean matchOld(ReceiveCommand cmd, @Nullable Ref ref) {
+		if (ref == null) {
+			return AnyObjectId.equals(ObjectId.zeroId(), cmd.getOldId())
+					&& cmd.getOldSymref() == null;
+		} else if (ref.isSymbolic()) {
+			return ref.getTarget().getName().equals(cmd.getOldSymref());
+		}
+		ObjectId id = ref.getObjectId();
+		if (id == null) {
+			id = ObjectId.zeroId();
+		}
+		return cmd.getOldId().equals(id);
+	}
+
+	private void applyUpdates(RevWalk rw, List<ReceiveCommand> pending)
+			throws IOException {
+		List<Ref> newRefs = toNewRefs(rw, pending);
+		long updateIndex = nextUpdateIndex();
+		Set<DfsPackDescription> prune = Collections.emptySet();
+		DfsPackDescription pack = odb.newPack(PackSource.INSERT);
+		try (DfsOutputStream out = odb.writeFile(pack, REFTABLE)) {
+			ReftableConfig cfg = DfsPackCompactor
+					.configureReftable(reftableConfig, out);
+
+			ReftableWriter.Stats stats;
+			if (refdb.compactDuringCommit()
+					&& newRefs.size() * AVG_BYTES <= cfg.getRefBlockSize()
+					&& canCompactTopOfStack(cfg)) {
+				ByteArrayOutputStream tmp = new ByteArrayOutputStream();
+				write(tmp, cfg, updateIndex, newRefs, pending);
+				stats = compactTopOfStack(out, cfg, tmp.toByteArray());
+				prune = toPruneTopOfStack();
+			} else {
+				stats = write(out, cfg, updateIndex, newRefs, pending);
+			}
+			pack.addFileExt(REFTABLE);
+			pack.setReftableStats(stats);
+		}
+
+		odb.commitPack(Collections.singleton(pack), prune);
+		odb.addReftable(pack, prune);
+		refdb.clearCache();
+	}
+
+	private ReftableWriter.Stats write(OutputStream os, ReftableConfig cfg,
+			long updateIndex, List<Ref> newRefs, List<ReceiveCommand> pending)
+			throws IOException {
+		ReftableWriter writer = new ReftableWriter(cfg)
+				.setMinUpdateIndex(updateIndex).setMaxUpdateIndex(updateIndex)
+				.begin(os).sortAndWriteRefs(newRefs);
+		if (!isRefLogDisabled()) {
+			writeLog(writer, updateIndex, pending);
+		}
+		writer.finish();
+		return writer.getStats();
+	}
+
+	private void writeLog(ReftableWriter writer, long updateIndex,
+			List<ReceiveCommand> pending) throws IOException {
+		Map<String, ReceiveCommand> cmds = new HashMap<>();
+		List<String> byName = new ArrayList<>(pending.size());
+		for (ReceiveCommand cmd : pending) {
+			cmds.put(cmd.getRefName(), cmd);
+			byName.add(cmd.getRefName());
+		}
+		Collections.sort(byName);
+
+		PersonIdent ident = getRefLogIdent();
+		if (ident == null) {
+			ident = new PersonIdent(refdb.getRepository());
+		}
+		for (String name : byName) {
+			ReceiveCommand cmd = cmds.get(name);
+			if (isRefLogDisabled(cmd)) {
+				continue;
+			}
+			String msg = getRefLogMessage(cmd);
+			if (isRefLogIncludingResult(cmd)) {
+				String strResult = toResultString(cmd);
+				if (strResult != null) {
+					msg = msg.isEmpty() ? strResult : msg + ": " + strResult; //$NON-NLS-1$
+				}
+			}
+			writer.writeLog(name, updateIndex, ident, cmd.getOldId(),
+					cmd.getNewId(), msg);
+		}
+	}
+
+	private String toResultString(ReceiveCommand cmd) {
+		switch (cmd.getType()) {
+		case CREATE:
+			return ReflogEntry.PREFIX_CREATED;
+		case UPDATE:
+			// Match the behavior of a single RefUpdate. In that case, setting
+			// the force bit completely bypasses the potentially expensive
+			// isMergedInto check, by design, so the reflog message may be
+			// inaccurate.
+			//
+			// Similarly, this class bypasses the isMergedInto checks when the
+			// force bit is set, meaning we can't actually distinguish between
+			// UPDATE and UPDATE_NONFASTFORWARD when isAllowNonFastForwards()
+			// returns true.
+			return isAllowNonFastForwards() ? ReflogEntry.PREFIX_FORCED_UPDATE
+					: ReflogEntry.PREFIX_FAST_FORWARD;
+		case UPDATE_NONFASTFORWARD:
+			return ReflogEntry.PREFIX_FORCED_UPDATE;
+		default:
+			return null;
+		}
+	}
+
+	private static List<Ref> toNewRefs(RevWalk rw, List<ReceiveCommand> pending)
+			throws IOException {
+		List<Ref> refs = new ArrayList<>(pending.size());
+		for (ReceiveCommand cmd : pending) {
+			String name = cmd.getRefName();
+			ObjectId newId = cmd.getNewId();
+			String newSymref = cmd.getNewSymref();
+			if (AnyObjectId.equals(ObjectId.zeroId(), newId)
+					&& newSymref == null) {
+				refs.add(new ObjectIdRef.Unpeeled(NEW, name, null));
+				continue;
+			} else if (newSymref != null) {
+				refs.add(new SymbolicRef(name,
+						new ObjectIdRef.Unpeeled(NEW, newSymref, null)));
+				continue;
+			}
+
+			RevObject obj = rw.parseAny(newId);
+			RevObject peel = null;
+			if (obj instanceof RevTag) {
+				peel = rw.peel(obj);
+			}
+			if (peel != null) {
+				refs.add(new ObjectIdRef.PeeledTag(PACKED, name, newId,
+						peel.copy()));
+			} else {
+				refs.add(new ObjectIdRef.PeeledNonTag(PACKED, name, newId));
+			}
+		}
+		return refs;
+	}
+
+	private long nextUpdateIndex() throws IOException {
+		long updateIndex = 0;
+		for (Reftable r : refdb.stack().readers()) {
+			if (r instanceof ReftableReader) {
+				updateIndex = Math.max(updateIndex,
+						((ReftableReader) r).maxUpdateIndex());
+			}
+		}
+		return updateIndex + 1;
+	}
+
+	private boolean canCompactTopOfStack(ReftableConfig cfg)
+			throws IOException {
+		ReftableStack stack = refdb.stack();
+		List<Reftable> readers = stack.readers();
+		if (readers.isEmpty()) {
+			return false;
+		}
+
+		int lastIdx = readers.size() - 1;
+		DfsReftable last = stack.files().get(lastIdx);
+		DfsPackDescription desc = last.getPackDescription();
+		if (desc.getPackSource() != PackSource.INSERT
+				|| !packOnlyContainsReftable(desc)) {
+			return false;
+		}
+
+		Reftable table = readers.get(lastIdx);
+		int bs = cfg.getRefBlockSize();
+		return table instanceof ReftableReader
+				&& ((ReftableReader) table).size() <= 3 * bs;
+	}
+
+	private ReftableWriter.Stats compactTopOfStack(OutputStream out,
+			ReftableConfig cfg, byte[] newTable) throws IOException {
+		List<Reftable> stack = refdb.stack().readers();
+		Reftable last = stack.get(stack.size() - 1);
+
+		List<Reftable> tables = new ArrayList<>(2);
+		tables.add(last);
+		tables.add(new ReftableReader(BlockSource.from(newTable)));
+
+		ReftableCompactor compactor = new ReftableCompactor();
+		compactor.setConfig(cfg);
+		compactor.setIncludeDeletes(true);
+		compactor.addAll(tables);
+		compactor.compact(out);
+		return compactor.getStats();
+	}
+
+	private Set<DfsPackDescription> toPruneTopOfStack() throws IOException {
+		List<DfsReftable> stack = refdb.stack().files();
+		DfsReftable last = stack.get(stack.size() - 1);
+		return Collections.singleton(last.getPackDescription());
+	}
+
+	private boolean packOnlyContainsReftable(DfsPackDescription desc) {
+		for (PackExt ext : PackExt.values()) {
+			if (ext != REFTABLE && desc.hasFileExt(ext)) {
+				return false;
+			}
+		}
+		return true;
+	}
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableStack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableStack.java
index 8d1cc98..50ba0e0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableStack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReftableStack.java
@@ -50,7 +50,10 @@
 
 import org.eclipse.jgit.internal.storage.reftable.Reftable;
 
-/** Tracks multiple open {@link Reftable} instances. */
+/**
+ * Tracks multiple open
+ * {@link org.eclipse.jgit.internal.storage.reftable.Reftable} instances.
+ */
 public class ReftableStack implements AutoCloseable {
 	/**
 	 * Opens a stack of tables for reading.
@@ -58,18 +61,19 @@
 	 * @param ctx
 	 *            context to read the tables with. This {@code ctx} will be
 	 *            retained by the stack and each of the table readers.
-	 * @param tables
+	 * @param files
 	 *            the tables to open.
 	 * @return stack reference to close the tables.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a table could not be opened
 	 */
-	public static ReftableStack open(DfsReader ctx, List<DfsReftable> tables)
+	public static ReftableStack open(DfsReader ctx, List<DfsReftable> files)
 			throws IOException {
-		ReftableStack stack = new ReftableStack(tables.size());
+		ReftableStack stack = new ReftableStack(files.size());
 		boolean close = true;
 		try {
-			for (DfsReftable t : tables) {
+			for (DfsReftable t : files) {
+				stack.files.add(t);
 				stack.tables.add(t.open(ctx));
 			}
 			close = false;
@@ -81,13 +85,27 @@
 		}
 	}
 
+	private final List<DfsReftable> files;
 	private final List<Reftable> tables;
 
 	private ReftableStack(int tableCnt) {
+		this.files = new ArrayList<>(tableCnt);
 		this.tables = new ArrayList<>(tableCnt);
 	}
 
 	/**
+	 * Get unmodifiable list of DfsRefatble files
+	 *
+	 * @return unmodifiable list of DfsRefatble files, in the same order the
+	 *         files were passed to {@link #open(DfsReader, List)}.
+	 */
+	public List<DfsReftable> files() {
+		return Collections.unmodifiableList(files);
+	}
+
+	/**
+	 * Get unmodifiable list of tables
+	 *
 	 * @return unmodifiable list of tables, in the same order the files were
 	 *         passed to {@link #open(DfsReader, List)}.
 	 */
@@ -95,6 +113,7 @@
 		return Collections.unmodifiableList(tables);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		for (Reftable t : tables) {
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 b78ff2a..407061f 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
@@ -58,6 +58,7 @@
 		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 88eef4c..6ade438 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
@@ -59,7 +59,9 @@
 import com.googlecode.javaewah.EWAHCompressedBitmap;
 import com.googlecode.javaewah.IntIterator;
 
-/** A compressed bitmap representation of the entire object graph. */
+/**
+ * A compressed bitmap representation of the entire object graph.
+ */
 public class BitmapIndexImpl implements BitmapIndex {
 	private static final int EXTRA_BITS = 10 * 1024;
 
@@ -85,6 +87,7 @@
 		return packIndex;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public CompressedBitmap getBitmap(AnyObjectId objectId) {
 		EWAHCompressedBitmap compressed = packIndex.getBitmap(objectId);
@@ -93,6 +96,7 @@
 		return new CompressedBitmap(compressed, this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public CompressedBitmapBuilder newBitmapBuilder() {
 		return new CompressedBitmapBuilder(this);
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 dc720bc..338df4a 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
@@ -63,6 +63,7 @@
 		array = b;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int copy(final int p, final byte[] b, final int o, int n) {
 		n = Math.min(array.length - p, n);
@@ -70,6 +71,7 @@
 		return n;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int setInput(final int pos, final 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 05ddd69..4dcf133 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
@@ -65,6 +65,7 @@
 		buffer = b;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int copy(final int p, final byte[] b, final int o, int n) {
 		final ByteBuffer s = buffer.slice();
@@ -89,6 +90,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected int setInput(final int pos, final Inflater inf)
 			throws DataFormatException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java
index e774a14..7963cea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java
@@ -66,6 +66,16 @@
 
 	protected final long end;
 
+	/**
+	 * Constructor for ByteWindow.
+	 *
+	 * @param p
+	 *            a {@link org.eclipse.jgit.internal.storage.file.PackFile}.
+	 * @param s
+	 *            where the byte window starts in the pack file
+	 * @param n
+	 *            size of the byte window
+	 */
 	protected ByteWindow(final PackFile p, final long s, final int n) {
 		pack = p;
 		start = s;
@@ -127,6 +137,17 @@
 		return setInput((int) (pos - start), inf);
 	}
 
+	/**
+	 * Set the input
+	 *
+	 * @param pos
+	 *            position
+	 * @param inf
+	 *            an {@link java.util.zip.Inflater} object.
+	 * @return size of the byte window
+	 * @throws java.util.zip.DataFormatException
+	 *             if any.
+	 */
 	protected abstract 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 ae8260a..e810ae0 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
@@ -117,11 +117,13 @@
 		return m;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Don't close anything.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectDatabase newCachedDatabase() {
 		return this;
@@ -177,6 +179,7 @@
 		wrapped.resolve(matches, id);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean has(final AnyObjectId objectId) throws IOException {
 		return has(objectId, null);
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 2eacb7a..05cabba 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
@@ -65,11 +65,13 @@
 		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/FileObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java
index 3afc050..1f6b20a 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
@@ -64,11 +64,13 @@
 		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/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
index 646feac..9e2fb55 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
@@ -116,7 +116,6 @@
  * This class is thread-safe.
  * <p>
  * This implementation only handles a subtly undocumented subset of git features.
- *
  */
 public class FileRepository extends Repository {
 	private static final String UNNAMED = "Unnamed repository; edit this file to name it for gitweb."; //$NON-NLS-1$
@@ -133,8 +132,9 @@
 	 * <p>
 	 * The work tree, object directory, alternate object directories and index
 	 * file locations are deduced from the given git directory and the default
-	 * rules by running {@link FileRepositoryBuilder}. This constructor is the
-	 * same as saying:
+	 * rules by running
+	 * {@link org.eclipse.jgit.storage.file.FileRepositoryBuilder}. This
+	 * constructor is the same as saying:
 	 *
 	 * <pre>
 	 * new FileRepositoryBuilder().setGitDir(gitDir).build()
@@ -142,7 +142,7 @@
 	 *
 	 * @param gitDir
 	 *            GIT_DIR (the location of the repository metadata).
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository appears to already exist but cannot be
 	 *             accessed.
 	 * @see FileRepositoryBuilder
@@ -156,7 +156,7 @@
 	 *
 	 * @param gitDir
 	 *            GIT_DIR (the location of the repository metadata).
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository appears to already exist but cannot be
 	 *             accessed.
 	 * @see FileRepositoryBuilder
@@ -170,7 +170,7 @@
 	 *
 	 * @param options
 	 *            description of the repository's important paths.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the user configuration file or repository configuration file
 	 *             cannot be accessed.
 	 */
@@ -247,46 +247,38 @@
 	private void loadSystemConfig() throws IOException {
 		try {
 			systemConfig.load();
-		} catch (ConfigInvalidException e1) {
-			IOException e2 = new IOException(MessageFormat.format(JGitText
+		} catch (ConfigInvalidException e) {
+			throw new IOException(MessageFormat.format(JGitText
 					.get().systemConfigFileInvalid, systemConfig.getFile()
-					.getAbsolutePath(), e1));
-			e2.initCause(e1);
-			throw e2;
+							.getAbsolutePath(),
+					e), e);
 		}
 	}
 
 	private void loadUserConfig() throws IOException {
 		try {
 			userConfig.load();
-		} catch (ConfigInvalidException e1) {
-			IOException e2 = new IOException(MessageFormat.format(JGitText
+		} catch (ConfigInvalidException e) {
+			throw new IOException(MessageFormat.format(JGitText
 					.get().userConfigFileInvalid, userConfig.getFile()
-					.getAbsolutePath(), e1));
-			e2.initCause(e1);
-			throw e2;
+							.getAbsolutePath(),
+					e), e);
 		}
 	}
 
 	private void loadRepoConfig() throws IOException {
 		try {
 			repoConfig.load();
-		} catch (ConfigInvalidException e1) {
-			IOException e2 = new IOException(JGitText.get().unknownRepositoryFormat);
-			e2.initCause(e1);
-			throw e2;
+		} catch (ConfigInvalidException e) {
+			throw new IOException(JGitText.get().unknownRepositoryFormat, e);
 		}
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Create a new Git repository initializing the necessary files and
 	 * directories.
-	 *
-	 * @param bare
-	 *            if true, a bare repository is created.
-	 *
-	 * @throws IOException
-	 *             in case of IO problem
 	 */
 	@Override
 	public void create(boolean bare) throws IOException {
@@ -380,25 +372,27 @@
 	}
 
 	/**
+	 * Get the directory containing the objects owned by this repository
+	 *
 	 * @return the directory containing the objects owned by this repository.
 	 */
 	public File getObjectsDirectory() {
 		return objectDatabase.getDirectory();
 	}
 
-	/** @return the object database storing this repository's data. */
+	/** {@inheritDoc} */
 	@Override
 	public ObjectDirectory getObjectDatabase() {
 		return objectDatabase;
 	}
 
-	/** @return the reference database which stores the reference namespace. */
+	/** {@inheritDoc} */
 	@Override
 	public RefDatabase getRefDatabase() {
 		return refs;
 	}
 
-	/** @return the configuration of this repository. */
+	/** {@inheritDoc} */
 	@Override
 	public FileBasedConfig getConfig() {
 		if (systemConfig.isOutdated()) {
@@ -425,6 +419,7 @@
 		return repoConfig;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public String getGitwebDescription() throws IOException {
@@ -443,6 +438,7 @@
 		return d;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setGitwebDescription(@Nullable String description)
 			throws IOException {
@@ -479,14 +475,14 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Objects known to exist but not expressed by {@link #getAllRefs()}.
 	 * <p>
 	 * When a repository borrows objects from another repository, it can
 	 * advertise that it safely has that other repository's references, without
-	 * exposing any other details about the other repository.  This may help
-	 * a client trying to push changes avoid pushing more than it needs to.
-	 *
-	 * @return unmodifiable collection of other known objects.
+	 * exposing any other details about the other repository. This may help a
+	 * client trying to push changes avoid pushing more than it needs to.
 	 */
 	@Override
 	public Set<ObjectId> getAdditionalHaves() {
@@ -531,7 +527,7 @@
 	 *
 	 * @param pack
 	 *            path of the pack file to open.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             index file could not be opened, read, or is not recognized as
 	 *             a Git pack file index.
 	 */
@@ -539,6 +535,7 @@
 		objectDatabase.openPack(pack);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void scanForRepoChanges() throws IOException {
 		getRefDatabase().getRefs(ALL); // This will look for changes to refs
@@ -557,18 +554,14 @@
 			notifyIndexChanged();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void notifyIndexChanged() {
 		snapshot = FileSnapshot.save(getIndexFile());
 		fireEvent(new IndexChangedEvent());
 	}
 
-	/**
-	 * @param refName
-	 * @return a {@link ReflogReader} for the supplied refname, or null if the
-	 *         named ref does not exist.
-	 * @throws IOException the ref could not be accessed.
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ReflogReader getReflogReader(String refName) throws IOException {
 		Ref ref = findRef(refName);
@@ -577,6 +570,7 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public AttributesNodeProvider createAttributesNodeProvider() {
 		return new AttributesNodeProviderImpl(this);
@@ -642,6 +636,7 @@
 				ConfigConstants.CONFIG_KEY_AUTODETACH, true);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void autoGC(ProgressMonitor monitor) {
 		GC gc = new GC(this);
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 97f3b57..2165aa2 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
@@ -121,7 +121,6 @@
 	 *
 	 * @param modified
 	 *            the last modification time of the file
-	 *
 	 * @return the snapshot.
 	 */
 	public static FileSnapshot save(long modified) {
@@ -145,6 +144,8 @@
 	}
 
 	/**
+	 * Get time of last snapshot update
+	 *
 	 * @return time of last snapshot update
 	 */
 	public long lastModified() {
@@ -208,6 +209,7 @@
 		return lastModified == other.lastModified;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object other) {
 		if (other instanceof FileSnapshot)
@@ -215,6 +217,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		// This is pretty pointless, but override hashCode to ensure that
@@ -223,6 +226,7 @@
 		return (int) lastModified;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		if (this == DIRTY)
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 1b62c14..45089fe 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
@@ -58,7 +58,6 @@
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 import java.text.MessageFormat;
 import java.text.ParseException;
@@ -123,8 +122,10 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * A garbage collector for git {@link FileRepository}. Instances of this class
- * are not thread-safe. Don't use the same instance from multiple threads.
+ * A garbage collector for git
+ * {@link org.eclipse.jgit.internal.storage.file.FileRepository}. Instances of
+ * this class are not thread-safe. Don't use the same instance from multiple
+ * threads.
  *
  * This class started as a copy of DfsGarbageCollector from Shawn O. Pearce
  * adapted to FileRepositories.
@@ -217,7 +218,8 @@
 	}
 
 	/**
-	 * Runs a garbage collector on a {@link FileRepository}. It will
+	 * Runs a garbage collector on a
+	 * {@link org.eclipse.jgit.internal.storage.file.FileRepository}. It will
 	 * <ul>
 	 * <li>pack loose references into packed-refs</li>
 	 * <li>repack all reachable objects into new pack files and delete the old
@@ -234,9 +236,11 @@
 	 * return immediately. In this case, errors will not be reported except in
 	 * gc.log.
 	 *
-	 * @return the collection of {@link PackFile}'s which are newly created
-	 * @throws IOException
-	 * @throws ParseException
+	 * @return the collection of
+	 *         {@link org.eclipse.jgit.internal.storage.file.PackFile}'s which
+	 *         are newly created
+	 * @throws java.io.IOException
+	 * @throws java.text.ParseException
 	 *             If the configuration parameter "gc.pruneexpire" couldn't be
 	 *             parsed
 	 */
@@ -460,7 +464,7 @@
 	 * which can be found in packs. If certain objects can't be pruned (e.g.
 	 * because the filesystem delete operation fails) this is silently ignored.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void prunePacked() throws IOException {
 		ObjectDirectory objdb = repo.getObjectDatabase();
@@ -518,9 +522,8 @@
 	 *
 	 * @param objectsToKeep
 	 *            a set of objects which should explicitly not be pruned
-	 *
-	 * @throws IOException
-	 * @throws ParseException
+	 * @throws java.io.IOException
+	 * @throws java.text.ParseException
 	 *             If the configuration parameter "gc.pruneexpire" couldn't be
 	 *             parsed
 	 */
@@ -767,7 +770,7 @@
 	/**
 	 * Packs all non-symbolic, loose refs into packed-refs.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void packRefs() throws IOException {
 		Collection<Ref> refs = repo.getRefDatabase().getRefs(Constants.R_REFS).values();
@@ -795,10 +798,10 @@
 	 * repacked. All old pack files which existed before are deleted.
 	 *
 	 * @return a collection of the newly created pack files
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when during reading of refs, index, packfiles, objects,
 	 *             reflog-entries or during writing to the packfiles
-	 *             {@link IOException} occurs
+	 *             {@link java.io.IOException} occurs
 	 */
 	public Collection<PackFile> repack() throws IOException {
 		Collection<PackFile> toBeDeleted = repo.getObjectDatabase().getPacks();
@@ -964,8 +967,7 @@
 	 * </p>
 	 */
 	private void deleteOrphans() {
-		Path packDir = Paths.get(repo.getObjectsDirectory().getAbsolutePath(),
-				"pack"); //$NON-NLS-1$
+		Path packDir = repo.getObjectDatabase().getPackDirectory().toPath();
 		List<String> fileNames = null;
 		try (Stream<Path> files = Files.list(packDir)) {
 			fileNames = files.map(path -> path.getFileName().toString())
@@ -989,7 +991,7 @@
 			} else {
 				if (base == null || !n.startsWith(base)) {
 					try {
-						Files.delete(new File(packDir.toFile(), n).toPath());
+						Files.delete(FileUtils.toPath(new File(packDir.toFile(), n)));
 					} catch (IOException e) {
 						LOG.error(e.getMessage(), e);
 					}
@@ -999,8 +1001,7 @@
 	}
 
 	private void deleteTempPacksIdx() {
-		Path packDir = Paths.get(repo.getObjectsDirectory().getAbsolutePath(),
-				"pack"); //$NON-NLS-1$
+		Path packDir = repo.getObjectDatabase().getPackDirectory().toPath();
 		Instant threshold = Instant.now().minus(1, ChronoUnit.DAYS);
 		try (DirectoryStream<Path> stream =
 				Files.newDirectoryStream(packDir, "gc_*_tmp")) { //$NON-NLS-1$
@@ -1175,7 +1176,7 @@
 
 			// create temporary files
 			String id = pw.computeName().getName();
-			File packdir = new File(repo.getObjectsDirectory(), "pack"); //$NON-NLS-1$
+			File packdir = repo.getObjectDatabase().getPackDirectory();
 			tmpPack = File.createTempFile("gc_", ".pack_tmp", packdir); //$NON-NLS-1$ //$NON-NLS-2$
 			final String tmpBase = tmpPack.getName()
 					.substring(0, tmpPack.getName().lastIndexOf('.'));
@@ -1275,7 +1276,7 @@
 	}
 
 	private File nameFor(String name, String ext) {
-		File packdir = new File(repo.getObjectsDirectory(), "pack"); //$NON-NLS-1$
+		File packdir = repo.getObjectDatabase().getPackDirectory();
 		return new File(packdir, "pack-" + name + ext); //$NON-NLS-1$
 	}
 
@@ -1351,7 +1352,7 @@
 	 * Returns information about objects and pack files for a FileRepository.
 	 *
 	 * @return information about objects and pack files for a FileRepository
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public RepoStatistics getStatistics() throws IOException {
 		RepoStatistics ret = new RepoStatistics();
@@ -1396,7 +1397,7 @@
 	/**
 	 * Set the progress monitor used for garbage collection methods.
 	 *
-	 * @param pm
+	 * @param pm a {@link org.eclipse.jgit.lib.ProgressMonitor} object.
 	 * @return this
 	 */
 	public GC setProgressMonitor(ProgressMonitor pm) {
@@ -1438,7 +1439,8 @@
 	 * "git gc --aggressive"
 	 *
 	 * @param pconfig
-	 *            the {@link PackConfig} used when writing packs
+	 *            the {@link org.eclipse.jgit.storage.pack.PackConfig} used when
+	 *            writing packs
 	 */
 	public void setPackConfig(PackConfig pconfig) {
 		this.pconfig = pconfig;
@@ -1482,7 +1484,7 @@
 	 * it exits without performing any work. Some JGit commands run
 	 * {@code gc --auto} after performing operations that could create many
 	 * loose objects.
-	 * <p/>
+	 * <p>
 	 * Housekeeping is required if there are too many loose objects or too many
 	 * packs in the repository. If the number of loose objects exceeds the value
 	 * of the gc.auto option JGit GC consolidates all existing packs into a
@@ -1490,13 +1492,13 @@
 	 * combine all loose objects into a single pack using {@code repack -d -l}.
 	 * Setting the value of {@code gc.auto} to 0 disables automatic packing of
 	 * loose objects.
-	 * <p/>
+	 * <p>
 	 * If the number of packs exceeds the value of {@code gc.autoPackLimit},
 	 * then existing packs (except those marked with a .keep file) are
 	 * consolidated into a single pack by using the {@code -A} option of repack.
 	 * Setting {@code gc.autoPackLimit} to 0 disables automatic consolidation of
 	 * packs.
-	 * <p/>
+	 * <p>
 	 * Like git the following jgit commands run auto gc:
 	 * <ul>
 	 * <li>fetch</li>
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 e5fc0c5..82458c1 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
@@ -55,6 +55,7 @@
 
 import org.eclipse.jgit.api.errors.JGitInternalException;
 import org.eclipse.jgit.lib.ConfigConstants;
+import org.eclipse.jgit.util.FileUtils;
 import org.eclipse.jgit.util.GitDateParser;
 import org.eclipse.jgit.util.SystemReader;
 
@@ -102,7 +103,7 @@
 
 	private boolean autoGcBlockedByOldLockFile() {
 		try {
-			FileTime lastModified = Files.getLastModifiedTime(logFile.toPath());
+			FileTime lastModified = Files.getLastModifiedTime(FileUtils.toPath(logFile));
 			if (lastModified.toInstant().compareTo(getLogExpiry()) > 0) {
 				// There is an existing log file, which is too recent to ignore
 				return true;
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 454d3bf..2f5de04 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
@@ -51,20 +51,27 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.util.FS;
 
-/** Attribute node loaded from global system-wide file. */
+/**
+ * Attribute node loaded from global system-wide file.
+ */
 public class GlobalAttributesNode extends AttributesNode {
 	final Repository repository;
 
 	/**
+	 * Constructor for GlobalAttributesNode.
+	 *
 	 * @param repository
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 */
 	public GlobalAttributesNode(Repository repository) {
 		this.repository = repository;
 	}
 
 	/**
+	 * Load the attributes node
+	 *
 	 * @return the attributes node
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	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 3f82e2a..cd093741 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
@@ -51,20 +51,27 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.util.FS;
 
-/** Attribute node loaded from the $GIT_DIR/info/attributes file. */
+/**
+ * Attribute node loaded from the $GIT_DIR/info/attributes file.
+ */
 public class InfoAttributesNode extends AttributesNode {
 	final Repository repository;
 
 	/**
+	 * Constructor for InfoAttributesNode.
+	 *
 	 * @param repository
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 */
 	public InfoAttributesNode(Repository repository) {
 		this.repository = repository;
 	}
 
 	/**
+	 * Load the attributes node
+	 *
 	 * @return the attributes node
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	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 4d6e4dd..8c42aaa 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
@@ -77,32 +77,35 @@
 		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 {
 			throw new LargeObjectException(getObjectId());
 		} catch (IOException cannotObtainId) {
-			LargeObjectException err = new LargeObjectException();
-			err.initCause(cannotObtainId);
-			throw err;
+			throw new LargeObjectException(cannotObtainId);
 		}
 	}
 
+	/** {@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 1e2617c..3d0e9c7 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
@@ -57,7 +57,9 @@
 import org.eclipse.jgit.lib.ObjectIdOwnerMap;
 import org.eclipse.jgit.lib.ObjectIdSet;
 
-/** Lazily loads a set of ObjectIds, one per line. */
+/**
+ * Lazily loads a set of ObjectIds, one per line.
+ */
 public class LazyObjectIdSetFile implements ObjectIdSet {
 	private final File src;
 	private ObjectIdOwnerMap<Entry> set;
@@ -72,6 +74,7 @@
 		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 fd9dcda..289d89d 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
@@ -71,6 +71,7 @@
 		this.packs = packs.toArray(new PackFile[packs.size()]);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() throws IOException {
 		long cnt = 0;
@@ -85,6 +86,7 @@
 			pack.copyPackAsIs(out, wc);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) {
 		try {
@@ -118,7 +120,7 @@
 	}
 
 	private String getPackFilePath(String packName) {
-		final File packDir = new File(odb.getDirectory(), "pack"); //$NON-NLS-1$
+		final File packDir = odb.getPackDirectory();
 		return new File(packDir, "pack-" + packName + ".pack").getPath(); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 }
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 a42e679..35f9773 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
@@ -92,11 +92,13 @@
 
 	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 fafe132..55eeb95 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
@@ -62,12 +62,14 @@
 		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 56f42b3..b382785 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
@@ -59,7 +59,6 @@
 import java.nio.file.StandardCopyOption;
 import java.text.MessageFormat;
 
-import org.eclipse.jgit.errors.LockFailedException;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -86,10 +85,12 @@
 	 * Unlock the given file.
 	 * <p>
 	 * This method can be used for recovering from a thrown
-	 * {@link LockFailedException} . This method does not validate that the lock
-	 * is or is not currently held before attempting to unlock it.
+	 * {@link org.eclipse.jgit.errors.LockFailedException} . This method does
+	 * not validate that the lock is or is not currently held before attempting
+	 * to unlock it.
 	 *
 	 * @param file
+	 *            a {@link java.io.File} object.
 	 * @return true if unlocked, false if unlocking failed
 	 */
 	public static boolean unlock(final File file) {
@@ -146,7 +147,9 @@
 	 * @param fs
 	 *            the file system abstraction which will be necessary to perform
 	 *            certain file system operations.
-	 * @deprecated use {@link LockFile#LockFile(File)} instead
+	 * @deprecated use
+	 *             {@link org.eclipse.jgit.internal.storage.file.LockFile#LockFile(File)}
+	 *             instead
 	 */
 	@Deprecated
 	public LockFile(final File f, final FS fs) {
@@ -170,7 +173,7 @@
 	 *
 	 * @return true if the lock is now held by the caller; false if it is held
 	 *         by someone else.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the temporary output file could not be created. The caller
 	 *             does not hold the lock.
 	 */
@@ -196,7 +199,7 @@
 	 *
 	 * @return true if the lock is now held by the caller; false if it is held
 	 *         by someone else.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the temporary output file could not be created. The caller
 	 *             does not hold the lock.
 	 */
@@ -217,12 +220,12 @@
 	 * This method does nothing if the current file does not exist, or exists
 	 * but is empty.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the temporary file could not be written, or a read error
 	 *             occurred while reading from the current file. The lock is
 	 *             released before throwing the underlying IO exception to the
 	 *             caller.
-	 * @throws RuntimeException
+	 * @throws java.lang.RuntimeException
 	 *             the temporary file could not be written. The lock is released
 	 *             before throwing the underlying exception to the caller.
 	 */
@@ -275,10 +278,10 @@
 	 * @param id
 	 *            the id to store in the file. The id will be written in hex,
 	 *            followed by a sole LF.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the temporary file could not be written. The lock is released
 	 *             before throwing the underlying IO exception to the caller.
-	 * @throws RuntimeException
+	 * @throws java.lang.RuntimeException
 	 *             the temporary file could not be written. The lock is released
 	 *             before throwing the underlying exception to the caller.
 	 */
@@ -296,10 +299,10 @@
 	 *            the bytes to store in the temporary file. No additional bytes
 	 *            are added, so if the file must end with an LF it must appear
 	 *            at the end of the byte array.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the temporary file could not be written. The lock is released
 	 *             before throwing the underlying IO exception to the caller.
-	 * @throws RuntimeException
+	 * @throws java.lang.RuntimeException
 	 *             the temporary file could not be written. The lock is released
 	 *             before throwing the underlying exception to the caller.
 	 */
@@ -405,7 +408,8 @@
 	}
 
 	/**
-	 * Request that {@link #commit()} remember the {@link FileSnapshot}.
+	 * Request that {@link #commit()} remember the
+	 * {@link org.eclipse.jgit.internal.storage.file.FileSnapshot}.
 	 *
 	 * @param on
 	 *            true if the commit method must remember the FileSnapshot.
@@ -431,7 +435,7 @@
 	 * method sleeps until it can force the new lock file's modification date to
 	 * be later than the target file.
 	 *
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             the thread was interrupted before the last modified date of
 	 *             the lock file was different from the last modified date of
 	 *             the target file.
@@ -454,7 +458,7 @@
 	 * @return true if the commit was successful and the file contains the new
 	 *         data; false if the commit failed and the file remains with the
 	 *         old data.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             the lock is not held.
 	 */
 	public boolean commit() {
@@ -496,7 +500,11 @@
 		return commitSnapshot.lastModified();
 	}
 
-	/** @return get the {@link FileSnapshot} just before commit. */
+	/**
+	 * Get the {@link FileSnapshot} just before commit.
+	 *
+	 * @return get the {@link FileSnapshot} just before commit.
+	 */
 	public FileSnapshot getCommitSnapshot() {
 		return commitSnapshot;
 	}
@@ -540,6 +548,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
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 200b60d..e210a68 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
@@ -91,12 +91,12 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * Traditional file system based {@link ObjectDatabase}.
+ * Traditional file system based {@link org.eclipse.jgit.lib.ObjectDatabase}.
  * <p>
  * This is the classical object database representation for a Git repository,
  * where objects are stored loose by hashing them into directories by their
- * {@link ObjectId}, or are stored in compressed containers known as
- * {@link PackFile}s.
+ * {@link org.eclipse.jgit.lib.ObjectId}, or are stored in compressed containers
+ * known as {@link org.eclipse.jgit.internal.storage.file.PackFile}s.
  * <p>
  * Optionally an object database can reference one or more alternates; other
  * ObjectDatabase instances that are searched in addition to the current
@@ -161,7 +161,7 @@
 	 * @param shallowFile
 	 *            file which contains IDs of shallow commits, null if shallow
 	 *            commits handling should be turned off
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an alternate object cannot be opened.
 	 */
 	public ObjectDirectory(final Config cfg, final File dir,
@@ -188,26 +188,38 @@
 		}
 	}
 
-	/**
-	 * @return the location of the <code>objects</code> directory.
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public final File getDirectory() {
 		return objects;
 	}
 
 	/**
+	 * <p>Getter for the field <code>packDirectory</code>.</p>
+	 *
+	 * @return the location of the <code>pack</code> directory.
+	 * @since 4.10
+	 */
+	public final File getPackDirectory() {
+		return packDirectory;
+	}
+
+	/**
+	 * <p>Getter for the field <code>preservedDirectory</code>.</p>
+	 *
 	 * @return the location of the <code>preserved</code> directory.
 	 */
 	public final File getPreservedDirectory() {
 		return preservedDirectory;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean exists() {
 		return fs.exists(objects);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void create() throws IOException {
 		FileUtils.mkdirs(objects);
@@ -215,6 +227,7 @@
 		FileUtils.mkdir(packDirectory);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectDirectoryInserter newInserter() {
 		return new ObjectDirectoryInserter(this, config);
@@ -230,6 +243,7 @@
 		return new PackInserter(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		unpackedObjectCache.clear();
@@ -248,13 +262,7 @@
 		}
 	}
 
-	/**
-	 * @return unmodifiable collection of all known pack files local to this
-	 *         directory. Most recent packs are presented first. Packs most
-	 *         likely to contain more recent objects appear before packs
-	 *         containing objects referenced by commits further back in the
-	 *         history of the repository.
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Collection<PackFile> getPacks() {
 		PackList list = packList.get();
@@ -265,14 +273,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Add a single existing pack to the list of available pack files.
-	 *
-	 * @param pack
-	 *            path of the pack file to open.
-	 * @return the pack that was opened and added to the database.
-	 * @throws IOException
-	 *             index file could not be opened, read, or is not recognized as
-	 *             a Git pack file index.
 	 */
 	@Override
 	public PackFile openPack(final File pack)
@@ -299,11 +302,13 @@
 		return res;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "ObjectDirectory[" + getDirectory() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean has(AnyObjectId objectId) {
 		return unpackedObjectCache.isUnpacked(objectId)
@@ -720,7 +725,7 @@
 			return InsertLooseObjectResult.EXISTS_LOOSE;
 		}
 		try {
-			Files.move(tmp.toPath(), dst.toPath(),
+			Files.move(FileUtils.toPath(tmp), FileUtils.toPath(dst),
 					StandardCopyOption.ATOMIC_MOVE);
 			dst.setReadOnly();
 			unpackedObjectCache.add(id);
@@ -737,7 +742,7 @@
 		//
 		FileUtils.mkdir(dst.getParentFile(), true);
 		try {
-			Files.move(tmp.toPath(), dst.toPath(),
+			Files.move(FileUtils.toPath(tmp), FileUtils.toPath(dst),
 					StandardCopyOption.ATOMIC_MOVE);
 			dst.setReadOnly();
 			unpackedObjectCache.add(id);
@@ -1063,11 +1068,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Compute the location of a loose object file.
-	 *
-	 * @param objectId
-	 *            identity of the loose object to map to the directory.
-	 * @return location of the object, if it were to exist as a loose object.
 	 */
 	@Override
 	public File fileFor(AnyObjectId objectId) {
@@ -1152,6 +1155,7 @@
 		}
 	}
 
+	/** {@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 aa435bf..e06f721 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
@@ -83,6 +83,7 @@
 		config = cfg.get(WriteConfig.KEY);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, byte[] data, int off, int len)
 			throws IOException {
@@ -114,6 +115,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(final int type, long len, final InputStream is)
 			throws IOException {
@@ -166,21 +168,25 @@
 				.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 2e6c245..5dcba60 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
@@ -64,7 +64,6 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.CoreConfig;
 import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.transport.PackParser;
 import org.eclipse.jgit.transport.PackedObjectInfo;
@@ -72,10 +71,11 @@
 import org.eclipse.jgit.util.NB;
 
 /**
- * Consumes a pack stream and stores as a pack file in {@link ObjectDirectory}.
+ * Consumes a pack stream and stores as a pack file in
+ * {@link org.eclipse.jgit.internal.storage.file.ObjectDirectory}.
  * <p>
  * To obtain an instance of a parser, applications should use
- * {@link ObjectInserter#newPackParser(InputStream)}.
+ * {@link org.eclipse.jgit.lib.ObjectInserter#newPackParser(InputStream)}.
  */
 public class ObjectDirectoryPackParser extends PackParser {
 	private final FileObjectDatabase db;
@@ -158,7 +158,7 @@
 	}
 
 	/**
-	 * Get the imported {@link PackFile}.
+	 * Get the imported {@link org.eclipse.jgit.internal.storage.file.PackFile}.
 	 * <p>
 	 * This method is supplied only to support testing; applications shouldn't
 	 * be using it directly to access the imported data.
@@ -169,6 +169,7 @@
 		return newPack;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getPackSize() {
 		if (newPack == null)
@@ -184,6 +185,7 @@
 		return size;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
 			throws IOException {
@@ -218,34 +220,40 @@
 		}
 	}
 
+	/** {@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();
@@ -253,30 +261,35 @@
 		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();
@@ -285,6 +298,7 @@
 		packHash = hash;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
 			ObjectTypeAndSize info) throws IOException {
@@ -293,6 +307,7 @@
 		return readObjectHeader(info);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
 			ObjectTypeAndSize info) throws IOException {
@@ -301,11 +316,13 @@
 		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();
@@ -323,6 +340,7 @@
 			tmpPack.deleteOnExit();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected boolean onAppendBase(final int typeCode, final byte[] data,
 			final PackedObjectInfo info) throws IOException {
@@ -365,6 +383,7 @@
 		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/PackBitmapIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndex.java
index 7fb8e6d..21a1c7f 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
@@ -58,11 +58,11 @@
 
 /**
  * Logical representation of the bitmap data stored in the pack index.
- * {@link ObjectId}s are encoded as a single integer in the range [0,
- * {@link #getObjectCount()}). Compressed bitmaps are available at certain
- * {@code ObjectId}s, which represent all of the objects reachable from that
- * {@code ObjectId} (include the {@code ObjectId} itself). The meaning of the
- * positions in the bitmaps can be decoded using {@link #getObject(int)} and
+ * {@link org.eclipse.jgit.lib.ObjectId}s are encoded as a single integer in the
+ * range [0, {@link #getObjectCount()}). Compressed bitmaps are available at
+ * certain {@code ObjectId}s, which represent all of the objects reachable from
+ * that {@code ObjectId} (include the {@code ObjectId} itself). The meaning of
+ * the positions in the bitmaps can be decoded using {@link #getObject(int)} and
  * {@link #ofObjectType(EWAHCompressedBitmap, int)}. Furthermore,
  * {@link #findPosition(AnyObjectId)} can be used to build other bitmaps that a
  * compatible with the encoded bitmaps available from the index.
@@ -85,7 +85,7 @@
 	 * @param reverseIndex
 	 *            the pack reverse index for the corresponding pack file.
 	 * @return a copy of the index in-memory.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be read.
 	 * @throws CorruptObjectException
 	 *             the stream does not contain a valid pack bitmap index.
@@ -97,12 +97,10 @@
 		try {
 			return read(fd, packIndex, reverseIndex);
 		} catch (IOException ioe) {
-			final String path = idxFile.getAbsolutePath();
-			final IOException err;
-			err = new IOException(MessageFormat.format(
-					JGitText.get().unreadablePackIndex, path));
-			err.initCause(ioe);
-			throw err;
+			throw new IOException(MessageFormat
+					.format(JGitText.get().unreadablePackIndex,
+							idxFile.getAbsolutePath()),
+					ioe);
 		} finally {
 			try {
 				fd.close();
@@ -128,7 +126,7 @@
 	 * @param reverseIndex
 	 *            the pack reverse index for the corresponding pack file.
 	 * @return a copy of the index in-memory.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be read.
 	 * @throws CorruptObjectException
 	 *             the stream does not contain a valid pack bitmap index.
@@ -157,7 +155,7 @@
 	 * @param position
 	 *            the id for which the object will be found.
 	 * @return the ObjectId.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             when the item is not found.
 	 */
 	public abstract ObjectId getObject(int position) throws IllegalArgumentException;
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 bfd60fc..70eb10e 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
@@ -64,7 +64,8 @@
 import com.googlecode.javaewah.EWAHCompressedBitmap;
 
 /**
- * Helper for constructing {@link PackBitmapIndex}es.
+ * Helper for constructing
+ * {@link org.eclipse.jgit.internal.storage.file.PackBitmapIndex}es.
  */
 public class PackBitmapIndexBuilder extends BasePackBitmapIndex {
 	private static final int MAX_XOR_OFFSET_SEARCH = 10;
@@ -145,7 +146,11 @@
 		}
 	}
 
-	/** @return set of objects included in the pack. */
+	/**
+	 * Get set of objects included in the pack.
+	 *
+	 * @return set of objects included in the pack.
+	 */
 	public ObjectIdOwnerMap<ObjectIdOwnerMap.Entry> getObjectSet() {
 		ObjectIdOwnerMap<ObjectIdOwnerMap.Entry> r = new ObjectIdOwnerMap<>();
 		for (PositionEntry e : byOffset) {
@@ -197,6 +202,7 @@
 		byAddOrder.add(result);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap ofObjectType(
 			EWAHCompressedBitmap bitmap, int type) {
@@ -213,6 +219,7 @@
 		throw new IllegalArgumentException();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objectId) {
 		PositionEntry entry = positionEntries.get(objectId);
@@ -221,6 +228,7 @@
 		return entry.offsetPosition;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObject(int position) throws IllegalArgumentException {
 		ObjectId objectId = byOffset.get(position);
@@ -229,48 +237,76 @@
 		return objectId;
 	}
 
-	/** @return the commit object bitmap. */
+	/**
+	 * Get the commit object bitmap.
+	 *
+	 * @return the commit object bitmap.
+	 */
 	public EWAHCompressedBitmap getCommits() {
 		return commits;
 	}
 
-	/** @return the tree object bitmap. */
+	/**
+	 * Get the tree object bitmap.
+	 *
+	 * @return the tree object bitmap.
+	 */
 	public EWAHCompressedBitmap getTrees() {
 		return trees;
 	}
 
-	/** @return the blob object bitmap. */
+	/**
+	 * Get the blob object bitmap.
+	 *
+	 * @return the blob object bitmap.
+	 */
 	public EWAHCompressedBitmap getBlobs() {
 		return blobs;
 	}
 
-	/** @return the tag object bitmap. */
+	/**
+	 * Get the tag object bitmap.
+	 *
+	 * @return the tag object bitmap.
+	 */
 	public EWAHCompressedBitmap getTags() {
 		return tags;
 	}
 
-	/** @return the index storage options. */
+	/**
+	 * Get the index storage options.
+	 *
+	 * @return the index storage options.
+	 */
 	public int getOptions() {
 		return PackBitmapIndexV1.OPT_FULL;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int getBitmapCount() {
 		return getBitmaps().size();
 	}
 
-	/** Removes all the bitmaps entries added. */
+	/**
+	 * Remove all the bitmaps entries added.
+	 */
 	public void clearBitmaps() {
 		byAddOrder.clear();
 		getBitmaps().clear();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int getObjectCount() {
 		return byOffset.size();
 	}
 
-	/** @return an iterator over the xor compressed entries. */
+	/**
+	 * Get an iterator over the xor compressed entries.
+	 *
+	 * @return an iterator over the xor compressed entries.
+	 */
 	public Iterable<StoredEntry> getCompressedBitmaps() {
 		// Add order is from oldest to newest. The reverse add order is the
 		// output order.
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 9a8c275..c04c90f 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
@@ -116,27 +116,32 @@
 					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)
@@ -173,6 +178,7 @@
 		};
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap getBitmap(AnyObjectId objectId) {
 		EWAHCompressedBitmap bitmap = newPackIndex.getBitmap(objectId);
@@ -214,6 +220,7 @@
 		}
 	}
 
+	/** {@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 9d2c70b..b172ca4 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
@@ -175,6 +175,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int findPosition(AnyObjectId objectId) {
 		long offset = packIndex.findOffset(objectId);
@@ -183,6 +184,7 @@
 		return reverseIndex.findPostion(offset);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObject(int position) throws IllegalArgumentException {
 		ObjectId objectId = reverseIndex.findObjectByPosition(position);
@@ -191,11 +193,13 @@
 		return objectId;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int getObjectCount() {
 		return (int) packIndex.getObjectCount();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public EWAHCompressedBitmap ofObjectType(
 			EWAHCompressedBitmap bitmap, int type) {
@@ -212,11 +216,13 @@
 		throw new IllegalArgumentException();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int getBitmapCount() {
 		return bitmaps.size();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		// TODO(cranger): compare the pack checksum?
@@ -225,6 +231,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return getPackIndex().hashCode();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexWriterV1.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexWriterV1.java
index f8f02e9..d0c84da 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexWriterV1.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexWriterV1.java
@@ -89,7 +89,7 @@
 	 * @param packDataChecksum
 	 *            checksum signature of the entire pack data content. This is
 	 *            traditionally the last 20 bytes of the pack file's own stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred while writing to the output stream, or this
 	 *             index format cannot store the object data supplied.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
index 3e5ef21..4a96b6e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
@@ -212,20 +212,30 @@
 		}
 		return idx;
 	}
-	/** @return the File object which locates this pack on disk. */
+	/**
+	 * Get the File object which locates this pack on disk.
+	 *
+	 * @return the File object which locates this pack on disk.
+	 */
 	public File getPackFile() {
 		return packFile;
 	}
 
 	/**
+	 * Get the index for this pack file.
+	 *
 	 * @return the index for this pack file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public PackIndex getIndex() throws IOException {
 		return idx();
 	}
 
-	/** @return name extracted from {@code pack-*.pack} pattern. */
+	/**
+	 * Get name extracted from {@code pack-*.pack} pattern.
+	 *
+	 * @return name extracted from {@code pack-*.pack} pattern.
+	 */
 	public String getPackName() {
 		String name = packName;
 		if (name == null) {
@@ -249,7 +259,7 @@
 	 * @param id
 	 *            the object to look for. Must not be null.
 	 * @return true if the object is in this pack; false otherwise.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file cannot be loaded into memory.
 	 */
 	public boolean hasObject(final AnyObjectId id) throws IOException {
@@ -303,6 +313,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Provide iterator over entries in associated pack index, that should also
 	 * exist in this pack file. Objects returned by such iterator are mutable
 	 * during iteration.
@@ -310,8 +322,6 @@
 	 * Iterator returns objects in SHA-1 lexicographical order.
 	 * </p>
 	 *
-	 * @return iterator over entries of associated pack index
-	 *
 	 * @see PackIndex#iterator()
 	 */
 	@Override
@@ -516,19 +526,15 @@
 			CorruptObjectException corruptObject = new CorruptObjectException(
 					MessageFormat.format(
 							JGitText.get().objectAtHasBadZlibStream,
-							Long.valueOf(src.offset), getPackFile()));
-			corruptObject.initCause(dataFormat);
+							Long.valueOf(src.offset), getPackFile()),
+					dataFormat);
 
-			StoredObjectRepresentationNotAvailableException gone;
-			gone = new StoredObjectRepresentationNotAvailableException(src);
-			gone.initCause(corruptObject);
-			throw gone;
+			throw new StoredObjectRepresentationNotAvailableException(src,
+					corruptObject);
 
 		} catch (IOException ioError) {
-			StoredObjectRepresentationNotAvailableException gone;
-			gone = new StoredObjectRepresentationNotAvailableException(src);
-			gone.initCause(ioError);
-			throw gone;
+			throw new StoredObjectRepresentationNotAvailableException(src,
+					ioError);
 		}
 
 		if (quickCopy != null) {
@@ -613,11 +619,8 @@
 			try {
 				doOpen();
 			} catch (IOException thisPackNotValid) {
-				StoredObjectRepresentationNotAvailableException gone;
-
-				gone = new StoredObjectRepresentationNotAvailableException(otp);
-				gone.initCause(thisPackNotValid);
-				throw gone;
+				throw new StoredObjectRepresentationNotAvailableException(otp,
+						thisPackNotValid);
 			}
 		}
 	}
@@ -903,12 +906,11 @@
 			return new ObjectLoader.SmallObject(type, data);
 
 		} catch (DataFormatException dfe) {
-			CorruptObjectException coe = new CorruptObjectException(
+			throw new CorruptObjectException(
 					MessageFormat.format(
 							JGitText.get().objectAtHasBadZlibStream,
-							Long.valueOf(pos), getPackFile()));
-			coe.initCause(dfe);
-			throw coe;
+							Long.valueOf(pos), getPackFile()),
+					dfe);
 		}
 	}
 
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 2252778..acfd9c4 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
@@ -66,7 +66,8 @@
 import org.eclipse.jgit.util.NB;
 
 /**
- * Access path to locate objects by {@link ObjectId} in a {@link PackFile}.
+ * Access path to locate objects by {@link org.eclipse.jgit.lib.ObjectId} in a
+ * {@link org.eclipse.jgit.internal.storage.file.PackFile}.
  * <p>
  * Indexes are strictly redundant information in that we can rebuild all of the
  * data held in the index file from the on disk representation of the pack file
@@ -89,7 +90,7 @@
 	 * @return access implementation for the requested file.
 	 * @throws FileNotFoundException
 	 *             the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file exists but could not be read due to security errors,
 	 *             unrecognized data version, or unexpected data corruption.
 	 */
@@ -98,11 +99,10 @@
 		try {
 			return read(fd);
 		} catch (IOException ioe) {
-			final String path = idxFile.getAbsolutePath();
-			final IOException err;
-			err = new IOException(MessageFormat.format(JGitText.get().unreadablePackIndex, path));
-			err.initCause(ioe);
-			throw err;
+			throw new IOException(MessageFormat
+					.format(JGitText.get().unreadablePackIndex,
+							idxFile.getAbsolutePath()),
+					ioe);
 		} finally {
 			try {
 				fd.close();
@@ -124,9 +124,9 @@
 	 *            buffered as some small IOs are performed against the stream.
 	 *            The caller is responsible for closing the stream.
 	 * @return a copy of the index in-memory.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be read.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the stream does not contain a valid pack index.
 	 */
 	public static PackIndex read(InputStream fd) throws IOException,
@@ -167,12 +167,15 @@
 		return findOffset(id) != -1;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean contains(AnyObjectId id) {
 		return findOffset(id) != -1;
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Provide iterator that gives access to index entries. Note, that iterator
 	 * returns reference to mutable object, the same reference in each call -
 	 * for performance reason. If client needs immutable objects, it must copy
@@ -180,8 +183,6 @@
 	 * <p>
 	 * Iterator returns objects in SHA-1 lexicographical order.
 	 * </p>
-	 *
-	 * @return iterator over pack index entries
 	 */
 	@Override
 	public abstract Iterator<MutableEntry> iterator();
@@ -218,7 +219,8 @@
 	 * @param nthPosition
 	 *            position within the traversal of {@link #iterator()} that the
 	 *            caller needs the object for. The first returned
-	 *            {@link MutableEntry} is 0, the second is 1, etc.
+	 *            {@link org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry}
+	 *            is 0, the second is 1, etc.
 	 * @return the ObjectId for the corresponding entry.
 	 */
 	public abstract ObjectId getObjectId(long nthPosition);
@@ -239,8 +241,10 @@
 	 * @param nthPosition
 	 *            unsigned 32 bit position within the traversal of
 	 *            {@link #iterator()} that the caller needs the object for. The
-	 *            first returned {@link MutableEntry} is 0, the second is 1,
-	 *            etc. Positions past 2**31-1 are negative, but still valid.
+	 *            first returned
+	 *            {@link org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry}
+	 *            is 0, the second is 1, etc. Positions past 2**31-1 are
+	 *            negative, but still valid.
 	 * @return the ObjectId for the corresponding entry.
 	 */
 	public final ObjectId getObjectId(final int nthPosition) {
@@ -282,9 +286,9 @@
 	 * @param objId
 	 *            id of object to look for
 	 * @return CRC32 checksum of specified object (at 32 less significant bits)
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             when requested ObjectId was not found in this index
-	 * @throws UnsupportedOperationException
+	 * @throws java.lang.UnsupportedOperationException
 	 *             when this index doesn't support CRC32 checksum
 	 */
 	public abstract long findCRC32(AnyObjectId objId)
@@ -308,7 +312,7 @@
 	 * @param matchLimit
 	 *            maximum number of results to return. At most this many
 	 *            ObjectIds should be added to matches before returning.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index cannot be read.
 	 */
 	public abstract void resolve(Set<ObjectId> matches, AbbreviatedObjectId id,
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 8a08456..8ea31e4 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
@@ -103,11 +103,13 @@
 		IO.readFully(fd, packChecksum, 0, packChecksum.length);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() {
 		return objectCnt;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getOffset64Count() {
 		long n64 = 0;
@@ -140,6 +142,7 @@
 		return (int) (nthPosition - base);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObjectId(final long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
@@ -156,6 +159,7 @@
 		return NB.decodeUInt32(idxdata[levelOne], p);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long findOffset(final AnyObjectId objId) {
 		final int levelOne = objId.getFirstByte();
@@ -182,21 +186,25 @@
 		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 5c2986a..9f6201f 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
@@ -164,11 +164,13 @@
 		IO.readFully(fd, packChecksum, 0, packChecksum.length);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getObjectCount() {
 		return objectCnt;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getOffset64Count() {
 		return offset64.length / 8;
@@ -196,6 +198,7 @@
 		return (int) (nthPosition - base);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getObjectId(final long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
@@ -204,6 +207,7 @@
 		return ObjectId.fromRaw(names[levelOne], p4 + p); // p * 5
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getOffset(final long nthPosition) {
 		final int levelOne = findLevelOne(nthPosition);
@@ -211,6 +215,7 @@
 		return getOffset(levelOne, levelTwo);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long findOffset(final AnyObjectId objId) {
 		final int levelOne = objId.getFirstByte();
@@ -227,6 +232,7 @@
 		return p;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long findCRC32(AnyObjectId objId) throws MissingObjectException {
 		final int levelOne = objId.getFirstByte();
@@ -236,16 +242,19 @@
 		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/PackIndexWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriter.java
index 5153911..b92f7b2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexWriter.java
@@ -53,16 +53,16 @@
 
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.transport.PackedObjectInfo;
 import org.eclipse.jgit.util.NB;
 
 /**
- * Creates a table of contents to support random access by {@link PackFile}.
+ * Creates a table of contents to support random access by
+ * {@link org.eclipse.jgit.internal.storage.file.PackFile}.
  * <p>
- * Pack index files (the <code>.idx</code> suffix in a pack file pair)
- * provides random access to any object in the pack by associating an ObjectId
- * to the byte offset within the pack where the object's data can be read.
+ * Pack index files (the <code>.idx</code> suffix in a pack file pair) provides
+ * random access to any object in the pack by associating an ObjectId to the
+ * byte offset within the pack where the object's data can be read.
  */
 public abstract class PackIndexWriter {
 	/** Magic constant indicating post-version 1 format. */
@@ -90,7 +90,7 @@
 	 *            will be examined until a format can be conclusively selected.
 	 * @return a new writer to output an index file of the requested format to
 	 *         the supplied stream.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             no recognized pack index version can support the supplied
 	 *             objects. This is likely a bug in the implementation.
 	 * @see #oldestPossibleFormat(List)
@@ -117,7 +117,7 @@
 	 *            the objects the caller needs to store in the index. Entries
 	 *            will be examined until a format can be conclusively selected.
 	 * @return the index format.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             no recognized pack index version can support the supplied
 	 *             objects. This is likely a bug in the implementation.
 	 */
@@ -143,7 +143,7 @@
 	 *            this formatted version will be written.
 	 * @return a new writer to output an index file of the requested format to
 	 *         the supplied stream.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the version requested is not supported by this
 	 *             implementation.
 	 */
@@ -195,12 +195,13 @@
 	 *
 	 * @param toStore
 	 *            sorted list of objects to store in the index. The caller must
-	 *            have previously sorted the list using {@link PackedObjectInfo}'s
-	 *            native {@link Comparable} implementation.
+	 *            have previously sorted the list using
+	 *            {@link org.eclipse.jgit.transport.PackedObjectInfo}'s native
+	 *            {@link java.lang.Comparable} implementation.
 	 * @param packDataChecksum
 	 *            checksum signature of the entire pack data content. This is
 	 *            traditionally the last 20 bytes of the pack file's own stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred while writing to the output stream, or this
 	 *             index format cannot store the object data supplied.
 	 */
@@ -230,7 +231,7 @@
 	 * the {@link #entries} collection may be iterated over more than once if
 	 * necessary. Implementors therefore have complete control over the data.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred while writing to the output stream, or this
 	 *             index format cannot store the object data supplied.
 	 */
@@ -246,7 +247,7 @@
 	 *
 	 * @param version
 	 *            version number of this index format being written.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred while writing to the output stream.
 	 */
 	protected void writeTOC(final int version) throws IOException {
@@ -260,10 +261,10 @@
 	 * <p>
 	 * The fan-out table is 4 KB in size, holding 256 32-bit unsigned integer
 	 * counts. Each count represents the number of objects within this index
-	 * whose {@link ObjectId#getFirstByte()} matches the count's position in the
-	 * fan-out table.
+	 * whose {@link org.eclipse.jgit.lib.ObjectId#getFirstByte()} matches the
+	 * count's position in the fan-out table.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred while writing to the output stream.
 	 */
 	protected void writeFanOutTable() throws IOException {
@@ -288,7 +289,7 @@
 	 * the pack data checksum above.</li>
 	 * </ol>
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred while writing to the output stream.
 	 */
 	protected void writeChecksumFooter() 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 6017b99..f220e7a 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
@@ -68,6 +68,7 @@
 		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 770549d..a18ccaf 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
@@ -63,6 +63,7 @@
 		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 962f765..8a4104a 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
@@ -64,6 +64,7 @@
 		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);
@@ -71,6 +72,7 @@
 		return n;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		byte[] buf = new byte[1];
@@ -78,6 +80,7 @@
 		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 ff959e8..7ff2696 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
@@ -120,15 +120,20 @@
 	}
 
 	/**
+	 * Whether to check if objects exist in the repo
+	 *
 	 * @param check
-	 *            if false, will write out possibly-duplicate objects without
-	 *            first checking whether they exist in the repo; default is true.
+	 *            if {@code false}, will write out possibly-duplicate objects
+	 *            without first checking whether they exist in the repo; default
+	 *            is true.
 	 */
 	public void checkExisting(boolean check) {
 		checkExisting = check;
 	}
 
 	/**
+	 * Set compression level for zlib deflater.
+	 *
 	 * @param compression
 	 *            compression level for zlib deflater.
 	 */
@@ -140,6 +145,7 @@
 		return buffer().length;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, byte[] data, int off, int len)
 			throws IOException {
@@ -158,6 +164,7 @@
 		return endObject(id, offset);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId insert(int type, long len, InputStream in)
 			throws IOException {
@@ -231,16 +238,19 @@
 		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) {
@@ -262,8 +272,7 @@
 		File tmpIdx = idxFor(tmpPack);
 		writePackIndex(tmpIdx, packHash, objectList);
 
-		File realPack = new File(
-				new File(db.getDirectory(), "pack"), //$NON-NLS-1$
+		File realPack = new File(db.getPackDirectory(),
 				"pack-" + computeName(objectList).name() + ".pack"); //$NON-NLS-1$ //$NON-NLS-2$
 		db.closeAllPackHandles(realPack);
 		tmpPack.setReadOnly();
@@ -310,6 +319,7 @@
 		return ObjectId.fromRaw(md.digest());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		try {
@@ -613,13 +623,12 @@
 			try {
 				return packOut.inflate(zpos, sz);
 			} catch (DataFormatException dfe) {
-				CorruptObjectException coe = new CorruptObjectException(
+				throw new CorruptObjectException(
 						MessageFormat.format(
 								JGitText.get().objectAtHasBadZlibStream,
 								Long.valueOf(obj.getOffset()),
-								tmpPack.getAbsolutePath()));
-				coe.initCause(dfe);
-				throw coe;
+								tmpPack.getAbsolutePath()),
+						dfe);
 			}
 		}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackLock.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackLock.java
index a433dec..82f0da1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackLock.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackLock.java
@@ -50,7 +50,10 @@
 import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.FileUtils;
 
-/** Keeps track of a {@link PackFile}'s associated <code>.keep</code> file. */
+/**
+ * Keeps track of a {@link org.eclipse.jgit.internal.storage.file.PackFile}'s
+ * associated <code>.keep</code> file.
+ */
 public class PackLock {
 	private final File keepFile;
 
@@ -74,7 +77,7 @@
 	 * @param msg
 	 *            message to store in the file.
 	 * @return true if the keep file was successfully written; false otherwise.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the keep file could not be written.
 	 */
 	public boolean lock(String msg) throws IOException {
@@ -92,7 +95,7 @@
 	/**
 	 * Remove the <code>.keep</code> file that holds this pack in place.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if deletion of .keep file failed
 	 */
 	public void unlock() throws IOException {
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 fe9f700..944af26 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
@@ -174,7 +174,7 @@
 	 *            offset).
 	 * @return offset of the next object in a pack or maxOffset if provided
 	 *         offset was the last one.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             when there is no object with the provided offset.
 	 */
 	public long findNextOffset(final long offset, final long maxOffset)
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 c1f5476..200c63c 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
@@ -47,6 +47,7 @@
 import static org.eclipse.jgit.transport.ReceiveCommand.Result.LOCK_FAILURE;
 import static org.eclipse.jgit.transport.ReceiveCommand.Result.NOT_ATTEMPTED;
 import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_NONFASTFORWARD;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_OTHER_REASON;
 
 import java.io.IOException;
 import java.text.MessageFormat;
@@ -124,6 +125,7 @@
 		this.refdb = refdb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void execute(RevWalk walk, ProgressMonitor monitor,
 			List<String> options) throws IOException {
@@ -142,6 +144,12 @@
 			super.execute(walk, monitor, options);
 			return;
 		}
+		if (containsSymrefs(pending)) {
+			// packed-refs file cannot store symrefs
+			reject(pending.get(0), REJECTED_OTHER_REASON,
+					JGitText.get().atomicSymRefNotSupported, pending);
+			return;
+		}
 
 		// Required implementation details copied from super.execute.
 		if (!blockUntilTimestamps(MAX_WAIT)) {
@@ -217,6 +225,15 @@
 		writeReflog(pending);
 	}
 
+	private static boolean containsSymrefs(List<ReceiveCommand> commands) {
+		for (ReceiveCommand cmd : commands) {
+			if (cmd.getOldSymref() != null || cmd.getNewSymref() != null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 	private boolean checkConflictingNames(List<ReceiveCommand> commands)
 			throws IOException {
 		Set<String> takenNames = new HashSet<>();
@@ -518,7 +535,12 @@
 
 	private static void reject(ReceiveCommand cmd, ReceiveCommand.Result result,
 			List<ReceiveCommand> commands) {
-		cmd.setResult(result);
+		reject(cmd, result, null, commands);
+	}
+
+	private static void reject(ReceiveCommand cmd, ReceiveCommand.Result result,
+			String why, List<ReceiveCommand> commands) {
+		cmd.setResult(result, why);
 		for (ReceiveCommand c2 : commands) {
 			if (c2.getResult() == ReceiveCommand.Result.OK) {
 				// Undo OK status so ReceiveCommand#abort aborts it. Assumes this method
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 4003b27..68c6dbe 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
@@ -112,14 +112,14 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * Traditional file system based {@link RefDatabase}.
+ * Traditional file system based {@link org.eclipse.jgit.lib.RefDatabase}.
  * <p>
  * This is the classical reference database representation for a Git repository.
  * References are stored in two formats: loose, and packed.
  * <p>
  * Loose references are stored as individual files within the {@code refs/}
  * directory. The file name matches the reference name and the file contents is
- * the current {@link ObjectId} in string form.
+ * the current {@link org.eclipse.jgit.lib.ObjectId} in string form.
  * <p>
  * Packed references are stored in a single text file named {@code packed-refs}.
  * In the packed format, each reference is stored on its own line. This file
@@ -244,6 +244,7 @@
 		return new File(logsDir, name);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void create() throws IOException {
 		FileUtils.mkdir(refsDir);
@@ -252,6 +253,7 @@
 		newLogWriter(false).create();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		clearReferences();
@@ -262,12 +264,14 @@
 		packedRefs.set(NO_PACKED_REFS);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void refresh() {
 		super.refresh();
 		clearReferences();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isNameConflicting(String name) throws IOException {
 		RefList<Ref> packed = getPackedRefs();
@@ -313,6 +317,7 @@
 		return loose;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		RefList<Ref> packed = getPackedRefs();
@@ -337,6 +342,7 @@
 		return ref;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref getRef(final String needle) throws IOException {
 		final RefList<Ref> packed = getPackedRefs();
@@ -361,6 +367,7 @@
 		return ref;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		final RefList<LooseRef> oldLoose = looseRefs.get();
@@ -400,6 +407,7 @@
 		return new RefMap(prefix, packed, upcast(loose), symbolic.toRefList());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getAdditionalRefs() throws IOException {
 		List<Ref> ret = new LinkedList<>();
@@ -534,6 +542,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref peel(final Ref ref) throws IOException {
 		final Ref leaf = ref.getLeaf();
@@ -585,6 +594,7 @@
 		fireRefsChanged();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefDirectoryUpdate newUpdate(String name, boolean detach)
 			throws IOException {
@@ -604,6 +614,7 @@
 		return refDirUpdate;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefDirectoryRename newRename(String fromName, String toName)
 			throws IOException {
@@ -612,11 +623,13 @@
 		return new RefDirectoryRename(from, to);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PackedBatchRefUpdate newBatchUpdate() {
 		return new PackedBatchRefUpdate(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean performsAtomicTransactions() {
 		return true;
@@ -696,7 +709,7 @@
 	 *
 	 * @param refs
 	 *            the refs to be added. Must be fully qualified.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void pack(List<String> refs) throws IOException {
 		pack(refs, Collections.emptyMap());
@@ -1172,10 +1185,8 @@
 				n--;
 			String content = RawParseUtils.decode(buf, 0, n);
 
-			IOException ioException = new IOException(MessageFormat.format(JGitText.get().notARef,
-					name, content));
-			ioException.initCause(notRef);
-			throw ioException;
+			throw new IOException(MessageFormat.format(JGitText.get().notARef,
+					name, content), notRef);
 		}
 		return new LooseUnpeeled(otherSnapshot, name, id);
 	}
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 09456c8..202e51f 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
@@ -95,6 +95,7 @@
 		refdb = src.getRefDatabase();
 	}
 
+	/** {@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 7ab30fa..4d6b245 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
@@ -65,16 +65,19 @@
 		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;
@@ -92,6 +95,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void unlock() {
 		if (lock != null) {
@@ -100,6 +104,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doUpdate(final Result status) throws IOException {
 		WriteConfig wc = database.getRepository().getConfig()
@@ -141,6 +146,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doDelete(final Result status) throws IOException {
 		if (getRef().getStorage() != Ref.Storage.NEW)
@@ -148,6 +154,7 @@
 		return status;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doLink(final 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 8723a8b..08a14b2 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
@@ -93,6 +93,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getOldId()
 	 */
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getOldId() {
 		return oldId;
@@ -101,6 +102,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getNewId()
 	 */
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getNewId() {
 		return newId;
@@ -109,6 +111,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogEntry#getWho()
 	 */
+	/** {@inheritDoc} */
 	@Override
 	public PersonIdent getWho() {
 		return who;
@@ -117,11 +120,13 @@
 	/* (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() {
@@ -132,6 +137,7 @@
 	/* (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 c3702fe..e95e1c2 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
@@ -74,6 +74,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getLastEntry()
 	 */
+	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getLastEntry() throws IOException {
 		return getReverseEntry(0);
@@ -82,6 +83,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries()
 	 */
+	/** {@inheritDoc} */
 	@Override
 	public List<ReflogEntry> getReverseEntries() throws IOException {
 		return getReverseEntries(Integer.MAX_VALUE);
@@ -90,6 +92,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntry(int)
 	 */
+	/** {@inheritDoc} */
 	@Override
 	public ReflogEntry getReverseEntry(int number) throws IOException {
 		if (number < 0)
@@ -119,6 +122,7 @@
 	/* (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 f0bb9c5..fd6b427 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
@@ -96,6 +96,8 @@
 	 * Create writer for ref directory.
 	 *
 	 * @param refdb
+	 *            a {@link org.eclipse.jgit.internal.storage.file.RefDirectory}
+	 *            object.
 	 */
 	public ReflogWriter(RefDirectory refdb) {
 		this(refdb, false);
@@ -105,6 +107,8 @@
 	 * Create writer for ref directory.
 	 *
 	 * @param refdb
+	 *            a {@link org.eclipse.jgit.internal.storage.file.RefDirectory}
+	 *            object.
 	 * @param forceWrite
 	 *            true to write to disk all entries logged, false to respect the
 	 *            repository's config and current log file status.
@@ -117,7 +121,7 @@
 	/**
 	 * Create the log directories.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @return this writer.
 	 */
 	public ReflogWriter create() throws IOException {
@@ -132,9 +136,11 @@
 	 * Write the given entry to the ref's log.
 	 *
 	 * @param refName
+	 *            a {@link java.lang.String} object.
 	 * @param entry
+	 *            a {@link org.eclipse.jgit.lib.ReflogEntry} object.
 	 * @return this writer
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public ReflogWriter log(String refName, ReflogEntry entry)
 			throws IOException {
@@ -146,12 +152,17 @@
 	 * Write the given entry information to the ref's log
 	 *
 	 * @param refName
+	 *            ref name
 	 * @param oldId
+	 *            old object id
 	 * @param newId
+	 *            new object id
 	 * @param ident
+	 *            a {@link org.eclipse.jgit.lib.PersonIdent}
 	 * @param message
+	 *            reflog message
 	 * @return this writer
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public ReflogWriter log(String refName, ObjectId oldId,
 			ObjectId newId, PersonIdent ident, String message) throws IOException {
@@ -163,10 +174,13 @@
 	 * Write the given ref update to the ref's log.
 	 *
 	 * @param update
+	 *            a {@link org.eclipse.jgit.lib.RefUpdate}
 	 * @param msg
+	 *            reflog message
 	 * @param deref
+	 *            whether to dereference symbolic refs
 	 * @return this writer
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	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 452636d..3b815b5 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
@@ -64,83 +64,105 @@
 		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);
 		return NB.decodeInt64(buf, 0);
 	}
 
+	/**
+	 * Read unsigned int
+	 *
+	 * @return a long.
+	 * @throws java.io.IOException
+	 *             if any.
+	 */
 	public long readUnsignedInt() throws IOException {
 		readFully(buf, 0, 4);
 		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 5fe0429..7825b84 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
@@ -64,74 +64,88 @@
 		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/UnpackedObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java
index a027437..adb05e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java
@@ -86,7 +86,7 @@
 	 *            expected ObjectId of the object, used only for error reporting
 	 *            in exceptions.
 	 * @return loader to read the inflated contents.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be parsed.
 	 */
 	public static ObjectLoader parse(byte[] raw, AnyObjectId id)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
index 6196006..213caca 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
@@ -57,7 +57,8 @@
 import org.eclipse.jgit.storage.file.WindowCacheConfig;
 
 /**
- * Caches slices of a {@link PackFile} in memory for faster read access.
+ * Caches slices of a {@link org.eclipse.jgit.internal.storage.file.PackFile} in
+ * memory for faster read access.
  * <p>
  * The WindowCache serves as a Java based "buffer cache", loading segments of a
  * PackFile into the JVM heap prior to use. As JGit often wants to do reads of
@@ -111,8 +112,9 @@
  * {@link #createRef(PackFile, long, ByteWindow)} methods, and matching
  * decrements during {@link #clear(Ref)}. Implementors may need to override
  * {@link #createRef(PackFile, long, ByteWindow)} in order to embed additional
- * accounting information into an implementation specific {@link Ref} subclass,
- * as the cached entity may have already been evicted by the JRE's garbage
+ * accounting information into an implementation specific
+ * {@link org.eclipse.jgit.internal.storage.file.WindowCache.Ref} subclass, as
+ * the cached entity may have already been evicted by the JRE's garbage
  * collector.
  * <p>
  * To maintain higher concurrency workloads, during eviction only one thread
@@ -150,7 +152,7 @@
 	 * @deprecated use {@code cfg.install()} to avoid internal reference.
 	 * @param cfg
 	 *            the new window cache configuration.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the cache configuration contains one or more invalid
 	 *             settings, usually too low of a limit.
 	 */
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 83b236e..569bfe8 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
@@ -110,11 +110,13 @@
 		return baseCache;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectReader newReader() {
 		return new WindowCursor(db);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public BitmapIndex getBitmapIndex() throws IOException {
 		for (PackFile pack : db.getPacks()) {
@@ -125,6 +127,7 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<CachedPack> getCachedPacksAndUpdate(
 			BitmapBuilder needBitmap) throws IOException {
@@ -137,6 +140,7 @@
 		return Collections.emptyList();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<ObjectId> resolve(AbbreviatedObjectId id)
 			throws IOException {
@@ -147,11 +151,13 @@
 		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,
@@ -168,11 +174,13 @@
 		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,
@@ -187,11 +195,13 @@
 		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)
@@ -202,6 +212,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
 			boolean validate) throws IOException,
@@ -210,6 +221,7 @@
 		src.pack.copyAsIs(out, src, validate, this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void writeObjects(PackOutputStream out, List<ObjectToPack> list)
 			throws IOException {
@@ -253,6 +265,7 @@
 		return cnt - need;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void copyPackAsIs(PackOutputStream out, CachedPack pack)
 			throws IOException {
@@ -348,13 +361,18 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@Nullable
 	public ObjectInserter getCreatedFromInserter() {
 		return createdFromInserter;
 	}
 
-	/** Release the current window cursor. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Release the current window cursor.
+	 */
 	@Override
 	public void close() {
 		window = null;
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 0a5f9c1..5677298 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
@@ -153,7 +153,7 @@
 	 * @param blockSize
 	 *            size to read.
 	 * @return buffer containing the block content.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if block cannot be read.
 	 */
 	public abstract ByteBuffer read(long position, int blockSize)
@@ -163,7 +163,7 @@
 	 * Determine the size of the file.
 	 *
 	 * @return total number of bytes in the file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if size cannot be obtained.
 	 */
 	public abstract long size() throws IOException;
@@ -180,6 +180,7 @@
 		// Do nothing by default.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public abstract void close();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/CachedPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/CachedPack.java
index 6498ea3..81f4055 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/CachedPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/CachedPack.java
@@ -45,13 +45,17 @@
 
 import java.io.IOException;
 
-/** Describes a pack file {@link ObjectReuseAsIs} can append onto a stream. */
+/**
+ * Describes a pack file
+ * {@link org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs} can append
+ * onto a stream.
+ */
 public abstract class CachedPack {
 	/**
 	 * Get the number of objects in this pack.
 	 *
 	 * @return the total object count for the pack.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the object count cannot be read.
 	 */
 	public abstract long getObjectCount() throws IOException;
@@ -70,7 +74,7 @@
 	 *
 	 * @return the number of deltas; 0 if the number is not known or there are
 	 *         no deltas.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the delta count cannot be read.
 	 */
 	public long getDeltaCount() throws IOException {
@@ -88,15 +92,16 @@
 	 * only and using its internal state to decide if this object is within this
 	 * pack. Implementors should ensure a representation from this cached pack
 	 * is tested as part of
-	 * {@link ObjectReuseAsIs#selectObjectRepresentation(PackWriter, org.eclipse.jgit.lib.ProgressMonitor, Iterable)}
+	 * {@link org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs#selectObjectRepresentation(PackWriter, org.eclipse.jgit.lib.ProgressMonitor, Iterable)}
 	 * , ensuring this method would eventually return true if the object would
 	 * be included by this cached pack.
 	 *
 	 * @param obj
 	 *            the object being packed. Can be used as an ObjectId.
 	 * @param rep
-	 *            representation from the {@link ObjectReuseAsIs} instance that
-	 *            originally supplied this CachedPack.
+	 *            representation from the
+	 *            {@link org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs}
+	 *            instance that originally supplied this CachedPack.
 	 * @return true if this pack contains this object.
 	 */
 	public abstract boolean hasObject(ObjectToPack obj,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaEncoder.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaEncoder.java
index cccbc59..343faf4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaEncoder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaEncoder.java
@@ -48,7 +48,10 @@
 
 import org.eclipse.jgit.lib.Constants;
 
-/** Encodes an instruction stream for {@link BinaryDelta}. */
+/**
+ * Encodes an instruction stream for
+ * {@link org.eclipse.jgit.internal.storage.pack.BinaryDelta}.
+ */
 public class DeltaEncoder {
 	/**
 	 * Maximum number of bytes to be copied in pack v2 format.
@@ -91,7 +94,7 @@
 	 * @param resultSize
 	 *            size of the resulting object, after applying this instruction
 	 *            stream to the base object, in bytes.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output buffer cannot store the instruction stream's
 	 *             header with the size fields.
 	 */
@@ -114,7 +117,7 @@
 	 *            maximum number of bytes to write to the out buffer declaring
 	 *            the stream is over limit and should be discarded. May be 0 to
 	 *            specify an infinite limit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output buffer cannot store the instruction stream's
 	 *             header with the size fields.
 	 */
@@ -138,7 +141,11 @@
 			out.write(buf, 0, p);
 	}
 
-	/** @return current size of the delta stream, in bytes. */
+	/**
+	 * Get current size of the delta stream, in bytes.
+	 *
+	 * @return current size of the delta stream, in bytes.
+	 */
 	public int getSize() {
 		return size;
 	}
@@ -150,7 +157,7 @@
 	 *            the string to insert.
 	 * @return true if the insert fits within the limit; false if the insert
 	 *         would cause the instruction stream to exceed the limit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the instruction buffer can't store the instructions.
 	 */
 	public boolean insert(String text) throws IOException {
@@ -164,7 +171,7 @@
 	 *            the binary to insert.
 	 * @return true if the insert fits within the limit; false if the insert
 	 *         would cause the instruction stream to exceed the limit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the instruction buffer can't store the instructions.
 	 */
 	public boolean insert(byte[] text) throws IOException {
@@ -182,7 +189,7 @@
 	 *            number of bytes to insert.
 	 * @return true if the insert fits within the limit; false if the insert
 	 *         would cause the instruction stream to exceed the limit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the instruction buffer can't store the instructions.
 	 */
 	public boolean insert(byte[] text, int off, int cnt)
@@ -217,7 +224,7 @@
 	 *            number of bytes to copy.
 	 * @return true if the copy fits within the limit; false if the copy
 	 *         would cause the instruction stream to exceed the limit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the instruction buffer cannot store the instructions.
 	 */
 	public boolean copy(long offset, int cnt) throws IOException {
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 0f22de0..6f3e2ac 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
@@ -51,8 +51,9 @@
  * <p>
  * The index can be passed a result buffer, and output an instruction sequence
  * that transforms the source buffer used by the index into the result buffer.
- * The instruction sequence can be executed by {@link BinaryDelta} to recreate
- * the result buffer.
+ * The instruction sequence can be executed by
+ * {@link org.eclipse.jgit.internal.storage.pack.BinaryDelta} to recreate the
+ * result buffer.
  * <p>
  * An index stores the entire contents of the source buffer, but also a table of
  * block identities mapped to locations where the block appears in the source
@@ -191,7 +192,11 @@
 		}
 	}
 
-	/** @return size of the source buffer this index has scanned. */
+	/**
+	 * Get size of the source buffer this index has scanned.
+	 *
+	 * @return size of the source buffer this index has scanned.
+	 */
 	public long getSourceSize() {
 		return src.length;
 	}
@@ -244,7 +249,7 @@
 	 *            the desired result buffer. The generated instructions will
 	 *            recreate this buffer when applied to the source buffer stored
 	 *            within this index.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output stream refused to write the instructions.
 	 */
 	public void encode(OutputStream out, byte[] res) throws IOException {
@@ -274,7 +279,7 @@
 	 * @return true if the delta is smaller than deltaSizeLimit; false if the
 	 *         encoder aborted because the encoded delta instructions would be
 	 *         longer than deltaSizeLimit bytes.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the output stream refused to write the instructions.
 	 */
 	public boolean encode(OutputStream out, byte[] res, int deltaSizeLimit)
@@ -421,6 +426,7 @@
 		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 0c4e444..0347644 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
@@ -292,6 +292,7 @@
 		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/ObjectReuseAsIs.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java
index 2e5d599..f759e23 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java
@@ -51,26 +51,27 @@
 import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
-import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
 
 /**
- * Extension of {@link ObjectReader} that supports reusing objects in packs.
+ * Extension of {@link org.eclipse.jgit.lib.ObjectReader} that supports reusing
+ * objects in packs.
  * <p>
  * {@code ObjectReader} implementations may also optionally implement this
- * interface to support {@link PackWriter} with a means of copying an object
- * that is already in pack encoding format directly into the output stream,
- * without incurring decompression and recompression overheads.
+ * interface to support
+ * {@link org.eclipse.jgit.internal.storage.pack.PackWriter} with a means of
+ * copying an object that is already in pack encoding format directly into the
+ * output stream, without incurring decompression and recompression overheads.
  */
 public interface ObjectReuseAsIs {
 	/**
 	 * Allocate a new {@code PackWriter} state structure for an object.
 	 * <p>
-	 * {@link PackWriter} allocates these objects to keep track of the
-	 * per-object state, and how to load the objects efficiently into the
-	 * generated stream. Implementers may subclass this type with additional
-	 * object state, such as to remember what file and offset contains the
-	 * object's pack encoded data.
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackWriter} allocates these
+	 * objects to keep track of the per-object state, and how to load the
+	 * objects efficiently into the generated stream. Implementers may subclass
+	 * this type with additional object state, such as to remember what file and
+	 * offset contains the object's pack encoded data.
 	 *
 	 * @param objectId
 	 *            the id of the object that will be packed.
@@ -85,15 +86,16 @@
 	 * <p>
 	 * Implementations should iterate through all available representations of
 	 * an object, and pass them in turn to the PackWriter though
-	 * {@link PackWriter#select(ObjectToPack, StoredObjectRepresentation)} so
-	 * the writer can select the most suitable representation to reuse into the
-	 * output stream.
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackWriter#select(ObjectToPack, StoredObjectRepresentation)}
+	 * so the writer can select the most suitable representation to reuse into
+	 * the output stream.
 	 * <p>
-	 * If the implementation returns CachedPack from {@link #getCachedPacksAndUpdate(BitmapBuilder)}
-	 * it must consider the representation of any object that is stored in any
-	 * of the offered CachedPacks. PackWriter relies on this behavior to prune
-	 * duplicate objects out of the pack stream when it selects a CachedPack and
-	 * the object was also reached through the thin-pack enumeration.
+	 * If the implementation returns CachedPack from
+	 * {@link #getCachedPacksAndUpdate(BitmapBuilder)} it must consider the
+	 * representation of any object that is stored in any of the offered
+	 * CachedPacks. PackWriter relies on this behavior to prune duplicate
+	 * objects out of the pack stream when it selects a CachedPack and the
+	 * object was also reached through the thin-pack enumeration.
 	 * <p>
 	 * The implementation may choose to consider multiple objects at once on
 	 * concurrent threads, but must evaluate all representations of an object
@@ -106,10 +108,10 @@
 	 *            once for each item in the iteration when selection is done.
 	 * @param objects
 	 *            the objects that are being packed.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             there is no representation available for the object, as it is
 	 *             no longer in the repository. Packing will abort.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed. Packing will abort.
 	 */
 	public void selectObjectRepresentation(PackWriter packer,
@@ -136,7 +138,9 @@
 	 * format to reach a delta base that is later in the stream. It may also
 	 * reduce data locality for the reader, slowing down data access.
 	 *
-	 * Invoking {@link PackOutputStream#writeObject(ObjectToPack)} will cause
+	 * Invoking
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackOutputStream#writeObject(ObjectToPack)}
+	 * will cause
 	 * {@link #copyObjectAsIs(PackOutputStream, ObjectToPack, boolean)} to be
 	 * invoked recursively on {@code this} if the current object is scheduled
 	 * for reuse.
@@ -147,7 +151,7 @@
 	 *            the list of objects to write. Objects should be written in
 	 *            approximately this order. Implementors may resort the list
 	 *            elements in-place during writing if desired.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be written to, or one or more required
 	 *             objects cannot be accessed from the object database.
 	 */
@@ -186,13 +190,13 @@
 	 *            corrupt before being reused. If false, validation may be
 	 *            skipped as it will be performed elsewhere in the processing
 	 *            pipeline.
-	 * @throws StoredObjectRepresentationNotAvailableException
+	 * @throws org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException
 	 *             the previously selected representation is no longer
 	 *             available. If thrown before {@code out.writeHeader} the pack
 	 *             writer will try to find another representation, and write
 	 *             that one instead. If throw after {@code out.writeHeader},
 	 *             packing will abort.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream's write method threw an exception. Packing will
 	 *             abort.
 	 */
@@ -209,7 +213,7 @@
 	 *            stream to append the pack onto.
 	 * @param pack
 	 *            the cached pack to send.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack cannot be read, or stream did not accept a write.
 	 */
 	public abstract void copyPackAsIs(PackOutputStream out, CachedPack pack)
@@ -225,7 +229,7 @@
 	 * @param needBitmap
 	 *            the bitmap that contains all of the objects the client wants.
 	 * @return the available cached packs.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the cached packs cannot be listed from the repository.
 	 *             Callers may choose to ignore this and continue as-if there
 	 *             were no cached packs.
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 bc7a603..e8c7510 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
@@ -50,7 +50,8 @@
 import org.eclipse.jgit.transport.PackedObjectInfo;
 
 /**
- * Per-object state used by {@link PackWriter}.
+ * Per-object state used by
+ * {@link org.eclipse.jgit.internal.storage.pack.PackWriter}.
  * <p>
  * {@code PackWriter} uses this class to track the things it needs to include in
  * the newly generated pack file, and how to efficiently obtain the raw data for
@@ -108,19 +109,25 @@
 	}
 
 	/**
+	 * Get delta base object id if object is going to be packed in delta
+	 * representation
+	 *
 	 * @return delta base object id if object is going to be packed in delta
-	 *         representation; null otherwise - if going to be packed as a
-	 *         whole object.
+	 *         representation; null otherwise - if going to be packed as a whole
+	 *         object.
 	 */
 	public final ObjectId getDeltaBaseId() {
 		return deltaBase;
 	}
 
 	/**
+	 * Get delta base object to pack if object is going to be packed in delta
+	 * representation and delta is specified as object to pack
+	 *
 	 * @return delta base object to pack if object is going to be packed in
-	 *         delta representation and delta is specified as object to
-	 *         pack; null otherwise - if going to be packed as a whole
-	 *         object or delta base is specified only as id.
+	 *         delta representation and delta is specified as object to pack;
+	 *         null otherwise - if going to be packed as a whole object or delta
+	 *         base is specified only as id.
 	 */
 	public final ObjectToPack getDeltaBase() {
 		if (deltaBase instanceof ObjectToPack)
@@ -164,8 +171,9 @@
 	}
 
 	/**
-	 * @return true if object is going to be written as delta; false
-	 *         otherwise.
+	 * Whether object is going to be written as delta
+	 *
+	 * @return true if object is going to be written as delta; false otherwise.
 	 */
 	public final boolean isDeltaRepresentation() {
 		return deltaBase != null;
@@ -181,7 +189,7 @@
 		return 1 < getOffset(); // markWantWrite sets 1.
 	}
 
-	/** @return the type of this object. */
+	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return (flags >> TYPE_SHIFT) & 0x7;
@@ -216,6 +224,9 @@
 	}
 
 	/**
+	 * Whether an existing representation was selected to be reused as-is into
+	 * the pack stream.
+	 *
 	 * @return true if an existing representation was selected to be reused
 	 *         as-is into the pack stream.
 	 */
@@ -266,7 +277,11 @@
 			flags &= ~DELTA_ATTEMPTED;
 	}
 
-	/** @return the extended flags on this object, in the range [0x0, 0xf]. */
+	/**
+	 * Get the extended flags on this object, in the range [0x0, 0xf].
+	 *
+	 * @return the extended flags on this object, in the range [0x0, 0xf].
+	 */
 	protected final int getExtendedFlags() {
 		return (flags >>> EXT_SHIFT) & EXT_MASK;
 	}
@@ -363,9 +378,10 @@
 	 * Remember a specific representation for reuse at a later time.
 	 * <p>
 	 * Implementers should remember the representation chosen, so it can be
-	 * reused at a later time. {@link PackWriter} may invoke this method
-	 * multiple times for the same object, each time saving the current best
-	 * representation found.
+	 * reused at a later time.
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackWriter} may invoke this
+	 * method multiple times for the same object, each time saving the current
+	 * best representation found.
 	 *
 	 * @param ref
 	 *            the object representation.
@@ -374,6 +390,7 @@
 		// 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 e8bbf78..292fd36 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
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.internal.storage.pack;
 
-/** A pack file extension. */
+/**
+ * A pack file extension.
+ */
 public class PackExt {
 	private static volatile PackExt[] VALUES = new PackExt[] {};
 
@@ -62,7 +64,11 @@
 	/** A reftable file. */
 	public static final PackExt REFTABLE = newPackExt("ref"); //$NON-NLS-1$
 
-	/** @return all of the PackExt values. */
+	/**
+	 * Get all of the PackExt values.
+	 *
+	 * @return all of the PackExt values.
+	 */
 	public static PackExt[] values() {
 		return VALUES;
 	}
@@ -102,21 +108,34 @@
 		this.pos = pos;
 	}
 
-	/** @return the file extension. */
+	/**
+	 * Get the file extension.
+	 *
+	 * @return the file extension.
+	 */
 	public String getExtension() {
 		return ext;
 	}
 
-	/** @return the position of the extension in the values array. */
+	/**
+	 * Get the position of the extension in the values array.
+	 *
+	 * @return the position of the extension in the values array.
+	 */
 	public int getPosition() {
 		return pos;
 	}
 
-	/** @return the bit mask of the extension e.g {@code 1 << getPosition()}. */
+	/**
+	 * Get the bit mask of the extension e.g {@code 1 << getPosition()}.
+	 *
+	 * @return the bit mask of the extension e.g {@code 1 << getPosition()}.
+	 */
 	public int getBit() {
 		return 1 << getPosition();
 	}
 
+	/** {@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/PackOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java
index 59166e6..fd9c1a0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java
@@ -57,7 +57,10 @@
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.util.NB;
 
-/** Custom output stream to support {@link PackWriter}. */
+/**
+ * Custom output stream to support
+ * {@link org.eclipse.jgit.internal.storage.pack.PackWriter}.
+ */
 public final class PackOutputStream extends OutputStream {
 	private static final int BYTES_TO_WRITE_BEFORE_CANCEL_CHECK = 128 * 1024;
 
@@ -84,7 +87,8 @@
 	 * <p>
 	 * This constructor is exposed to support debugging the JGit library only.
 	 * Application or storage level code should not create a PackOutputStream,
-	 * instead use {@link PackWriter}, and let the writer create the stream.
+	 * instead use {@link org.eclipse.jgit.internal.storage.pack.PackWriter},
+	 * and let the writer create the stream.
 	 *
 	 * @param writeMonitor
 	 *            monitor to update on object output progress.
@@ -101,6 +105,7 @@
 		this.checkCancelAt = BYTES_TO_WRITE_BEFORE_CANCEL_CHECK;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final void write(final int b) throws IOException {
 		count++;
@@ -108,6 +113,7 @@
 		md.update((byte) b);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final void write(final byte[] b, int off, int len)
 			throws IOException {
@@ -131,6 +137,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		out.flush();
@@ -154,7 +161,7 @@
 	 *
 	 * @param otp
 	 *            the object to write.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be read from the object reader, or the
 	 *             output stream is no longer accepting output. Caller must
 	 *             examine the type of exception and possibly its message to
@@ -177,7 +184,7 @@
 	 *            in whole object format, this is the same as the object size.
 	 *            For an object that is in a delta format, this is the size of
 	 *            the inflated delta instruction stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying stream refused to accept the header.
 	 */
 	public final void writeHeader(ObjectToPack otp, long rawLength)
@@ -224,7 +231,11 @@
 		return n;
 	}
 
-	/** @return a temporary buffer writers can use to copy data with. */
+	/**
+	 * Get a temporary buffer writers can use to copy data with.
+	 *
+	 * @return a temporary buffer writers can use to copy data with.
+	 */
 	public final byte[] getCopyBuffer() {
 		return copyBuffer;
 	}
@@ -233,7 +244,11 @@
 		writeMonitor.update(1);
 	}
 
-	/** @return total number of bytes written since stream start. */
+	/**
+	 * Get total number of bytes written since stream start.
+	 *
+	 * @return total number of bytes written since stream start.
+	 */
 	public final long length() {
 		return count;
 	}
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 7271560..71d10ac 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
@@ -107,6 +107,7 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.ThreadSafeProgressMonitor;
 import org.eclipse.jgit.revwalk.AsyncRevObjectQueue;
+import org.eclipse.jgit.revwalk.BitmapWalker;
 import org.eclipse.jgit.revwalk.DepthWalk;
 import org.eclipse.jgit.revwalk.ObjectWalk;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -134,8 +135,8 @@
  * <li>(usually) by providing sets of interesting and uninteresting objects in
  * repository - all interesting objects and their ancestors except uninteresting
  * objects and their ancestors will be included in pack, or</li>
- * <li>by providing iterator of {@link RevObject} specifying exact list and
- * order of objects in pack</li>
+ * <li>by providing iterator of {@link org.eclipse.jgit.revwalk.RevObject}
+ * specifying exact list and order of objects in pack</li>
  * </ul>
  * <p>
  * Typical usage consists of creating an instance, configuring options,
@@ -148,10 +149,11 @@
  * followed by {@link #writeBitmapIndex(OutputStream)}.
  * </p>
  * <p>
- * Class provide set of configurable options and {@link ProgressMonitor}
- * support, as operations may take a long time for big repositories. Deltas
- * searching algorithm is <b>NOT IMPLEMENTED</b> yet - this implementation
- * relies only on deltas and objects reuse.
+ * Class provide set of configurable options and
+ * {@link org.eclipse.jgit.lib.ProgressMonitor} support, as operations may take
+ * a long time for big repositories. Deltas searching algorithm is <b>NOT
+ * IMPLEMENTED</b> yet - this implementation relies only on deltas and objects
+ * reuse.
  * </p>
  * <p>
  * This class is not thread safe. It is intended to be used in one thread as a
@@ -209,7 +211,11 @@
 		}
 	};
 
-	/** @return all allocated, non-released PackWriters instances. */
+	/**
+	 * Get all allocated, non-released PackWriters instances.
+	 *
+	 * @return all allocated, non-released PackWriters instances.
+	 */
 	public static Iterable<PackWriter> getInstances() {
 		return instancesIterable;
 	}
@@ -373,7 +379,6 @@
 	 *
 	 * @param callback
 	 *            the callback to set
-	 *
 	 * @return this object for chaining.
 	 */
 	public PackWriter setObjectCountCallback(ObjectCountCallback callback) {
@@ -465,12 +470,19 @@
 		reuseValidate = validate;
 	}
 
-	/** @return true if this writer is producing a thin pack. */
+	/**
+	 * Whether this writer is producing a thin pack.
+	 *
+	 * @return true if this writer is producing a thin pack.
+	 */
 	public boolean isThin() {
 		return thin;
 	}
 
 	/**
+	 * Whether writer may pack objects with delta base object not within set of
+	 * objects to pack
+	 *
 	 * @param packthin
 	 *            a boolean indicating whether writer may pack objects with
 	 *            delta base object not within set of objects to pack, but
@@ -482,16 +494,23 @@
 		thin = packthin;
 	}
 
-	/** @return true to reuse cached packs. If true index creation isn't available. */
+	/**
+	 * Whether to reuse cached packs.
+	 *
+	 * @return {@code true} to reuse cached packs. If true index creation isn't
+	 *         available.
+	 */
 	public boolean isUseCachedPacks() {
 		return useCachedPacks;
 	}
 
 	/**
+	 * Whether to use cached packs
+	 *
 	 * @param useCached
-	 *            if set to true and a cached pack is present, it will be
-	 *            appended onto the end of a thin-pack, reducing the amount of
-	 *            working set space and CPU used by PackWriter. Enabling this
+	 *            if set to {@code true} and a cached pack is present, it will
+	 *            be appended onto the end of a thin-pack, reducing the amount
+	 *            of working set space and CPU used by PackWriter. Enabling this
 	 *            feature prevents PackWriter from creating an index for the
 	 *            newly created pack, so its only suitable for writing to a
 	 *            network client, where the client will make the index.
@@ -500,12 +519,18 @@
 		useCachedPacks = useCached;
 	}
 
-	/** @return true to use bitmaps for ObjectWalks, if available. */
+	/**
+	 * Whether to use bitmaps
+	 *
+	 * @return {@code true} to use bitmaps for ObjectWalks, if available.
+	 */
 	public boolean isUseBitmaps() {
 		return useBitmaps;
 	}
 
 	/**
+	 * Whether to use bitmaps
+	 *
 	 * @param useBitmaps
 	 *            if set to true, bitmaps will be used when preparing a pack.
 	 */
@@ -513,23 +538,33 @@
 		this.useBitmaps = useBitmaps;
 	}
 
-	/** @return true if the index file cannot be created by this PackWriter. */
+	/**
+	 * Whether the index file cannot be created by this PackWriter.
+	 *
+	 * @return {@code true} if the index file cannot be created by this
+	 *         PackWriter.
+	 */
 	public boolean isIndexDisabled() {
 		return indexDisabled || !cachedPacks.isEmpty();
 	}
 
 	/**
+	 * Whether to disable creation of the index file.
+	 *
 	 * @param noIndex
-	 *            true to disable creation of the index file.
+	 *            {@code true} to disable creation of the index file.
 	 */
 	public void setIndexDisabled(boolean noIndex) {
 		this.indexDisabled = noIndex;
 	}
 
 	/**
-	 * @return true to ignore objects that are uninteresting and also not found
-	 *         on local disk; false to throw a {@link MissingObjectException}
-	 *         out of {@link #preparePack(ProgressMonitor, Set, Set)} if an
+	 * Whether to ignore missing uninteresting objects
+	 *
+	 * @return {@code true} to ignore objects that are uninteresting and also
+	 *         not found on local disk; false to throw a
+	 *         {@link org.eclipse.jgit.errors.MissingObjectException} out of
+	 *         {@link #preparePack(ProgressMonitor, Set, Set)} if an
 	 *         uninteresting object is not in the source repository. By default,
 	 *         true, permitting gracefully ignoring of uninteresting objects.
 	 */
@@ -538,11 +573,13 @@
 	}
 
 	/**
+	 * Whether writer should ignore non existing uninteresting objects
+	 *
 	 * @param ignore
-	 *            true if writer should ignore non existing uninteresting
-	 *            objects during construction set of objects to pack; false
-	 *            otherwise - non existing uninteresting objects may cause
-	 *            {@link MissingObjectException}
+	 *            {@code true} if writer should ignore non existing
+	 *            uninteresting objects during construction set of objects to
+	 *            pack; false otherwise - non existing uninteresting objects may
+	 *            cause {@link org.eclipse.jgit.errors.MissingObjectException}
 	 */
 	public void setIgnoreMissingUninteresting(final boolean ignore) {
 		ignoreMissingUninteresting = ignore;
@@ -585,7 +622,7 @@
 	 * Returns objects number in a pack file that was created by this writer.
 	 *
 	 * @return number of objects in pack.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a cached pack cannot supply its object count.
 	 */
 	public long getObjectCount() throws IOException {
@@ -612,7 +649,7 @@
 	 * been invoked and completed successfully.
 	 *
 	 * @return set of objects in pack.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a cached pack cannot supply its object ids.
 	 */
 	public ObjectIdOwnerMap<ObjectIdOwnerMap.Entry> getObjectSet()
@@ -671,12 +708,14 @@
 	 * @param objectsSource
 	 *            iterator of object to store in a pack; order of objects within
 	 *            each type is important, ordering by type is not needed;
-	 *            allowed types for objects are {@link Constants#OBJ_COMMIT},
-	 *            {@link Constants#OBJ_TREE}, {@link Constants#OBJ_BLOB} and
-	 *            {@link Constants#OBJ_TAG}; objects returned by iterator may be
-	 *            later reused by caller as object id and type are internally
-	 *            copied in each iteration.
-	 * @throws IOException
+	 *            allowed types for objects are
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_COMMIT},
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_TREE},
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB} and
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_TAG}; objects
+	 *            returned by iterator may be later reused by caller as object
+	 *            id and type are internally copied in each iteration.
+	 * @throws java.io.IOException
 	 *             when some I/O problem occur during reading objects.
 	 */
 	public void preparePack(@NonNull Iterator<RevObject> objectsSource)
@@ -692,10 +731,10 @@
 	 * Basing on these 2 sets, another set of objects to put in a pack file is
 	 * created: this set consists of all objects reachable (ancestors) from
 	 * interesting objects, except uninteresting objects and their ancestors.
-	 * This method uses class {@link ObjectWalk} extensively to find out that
-	 * appropriate set of output objects and their optimal order in output pack.
-	 * Order is consistent with general git in-pack rules: sort by object type,
-	 * recency, path and delta-base first.
+	 * This method uses class {@link org.eclipse.jgit.revwalk.ObjectWalk}
+	 * extensively to find out that appropriate set of output objects and their
+	 * optimal order in output pack. Order is consistent with general git
+	 * in-pack rules: sort by object type, recency, path and delta-base first.
 	 * </p>
 	 *
 	 * @param countingMonitor
@@ -708,7 +747,7 @@
 	 *            points of graph traversal). Pass {@link #NONE} if all objects
 	 *            reachable from {@code want} are desired, such as when serving
 	 *            a clone.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when some I/O problem occur during reading objects.
 	 */
 	public void preparePack(ProgressMonitor countingMonitor,
@@ -743,7 +782,7 @@
 	 *            {@code shallow} commits and earlier generations will be
 	 *            included in the pack if requested by {@code want}. Must not be
 	 *            {@code null}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an I/O problem occurred while reading objects.
 	 */
 	public void preparePack(ProgressMonitor countingMonitor,
@@ -782,7 +821,7 @@
 	 * @param noBitmaps
 	 *            collection of objects to be excluded from bitmap commit
 	 *            selection.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an I/O problem occurred while reading objects.
 	 */
 	public void preparePack(ProgressMonitor countingMonitor,
@@ -807,10 +846,10 @@
 	 * Basing on these 2 sets, another set of objects to put in a pack file is
 	 * created: this set consists of all objects reachable (ancestors) from
 	 * interesting objects, except uninteresting objects and their ancestors.
-	 * This method uses class {@link ObjectWalk} extensively to find out that
-	 * appropriate set of output objects and their optimal order in output pack.
-	 * Order is consistent with general git in-pack rules: sort by object type,
-	 * recency, path and delta-base first.
+	 * This method uses class {@link org.eclipse.jgit.revwalk.ObjectWalk}
+	 * extensively to find out that appropriate set of output objects and their
+	 * optimal order in output pack. Order is consistent with general git
+	 * in-pack rules: sort by object type, recency, path and delta-base first.
 	 * </p>
 	 *
 	 * @param countingMonitor
@@ -828,7 +867,7 @@
 	 * @param noBitmaps
 	 *            collection of objects to be excluded from bitmap commit
 	 *            selection.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when some I/O problem occur during reading objects.
 	 */
 	public void preparePack(ProgressMonitor countingMonitor,
@@ -852,7 +891,7 @@
 	 * @param id
 	 *            the object to test the existence of.
 	 * @return true if the object will appear in the output pack file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a cached pack cannot be examined.
 	 */
 	public boolean willInclude(final AnyObjectId id) throws IOException {
@@ -919,7 +958,7 @@
 	 * @param indexStream
 	 *            output for the index data. Caller is responsible for closing
 	 *            this stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index data could not be written to the supplied stream.
 	 */
 	public void writeIndex(final OutputStream indexStream) throws IOException {
@@ -941,7 +980,7 @@
 	 * @param bitmapIndexStream
 	 *            output for the bitmap index data. Caller is responsible for
 	 *            closing this stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index data could not be written to the supplied stream.
 	 */
 	public void writeBitmapIndex(final OutputStream bitmapIndexStream)
@@ -1026,13 +1065,13 @@
 	 * @param packStream
 	 *            output stream of pack data. The stream should be buffered by
 	 *            the caller. The caller is responsible for closing the stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred reading a local object's data to include in
 	 *             the pack, or writing compressed object data to the output
 	 *             stream.
 	 * @throws WriteAbortedException
-	 *             the write operation is aborted by {@link ObjectCountCallback}
-	 *             .
+	 *             the write operation is aborted by
+	 *             {@link org.eclipse.jgit.transport.ObjectCountCallback} .
 	 */
 	public void writePack(ProgressMonitor compressMonitor,
 			ProgressMonitor writeMonitor, OutputStream packStream)
@@ -1121,6 +1160,9 @@
 	}
 
 	/**
+	 * Get statistics of what this PackWriter did in order to create the final
+	 * pack stream.
+	 *
 	 * @return description of what this PackWriter did in order to create the
 	 *         final pack stream. This should only be invoked after the calls to
 	 *         create the pack/index/bitmap have completed.
@@ -1129,12 +1171,18 @@
 		return new PackStatistics(stats);
 	}
 
-	/** @return snapshot of the current state of this PackWriter. */
+	/**
+	 * Get snapshot of the current state of this PackWriter.
+	 *
+	 * @return snapshot of the current state of this PackWriter.
+	 */
 	public State getState() {
 		return state.snapshot();
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release all resources used by this writer.
 	 */
 	@Override
@@ -1483,9 +1531,7 @@
 			if (err instanceof IOException)
 				throw (IOException) err;
 
-			IOException fail = new IOException(err.getMessage());
-			fail.initCause(err);
-			throw fail;
+			throw new IOException(err.getMessage(), err);
 		}
 		endPhase(monitor);
 	}
@@ -1714,7 +1760,7 @@
 		if (!shallowPack && useBitmaps) {
 			BitmapIndex bitmapIndex = reader.getBitmapIndex();
 			if (bitmapIndex != null) {
-				PackWriterBitmapWalker bitmapWalker = new PackWriterBitmapWalker(
+				BitmapWalker bitmapWalker = new BitmapWalker(
 						walker, bitmapIndex, countingMonitor);
 				findObjectsToPackUsingBitmaps(bitmapWalker, want, have);
 				endPhase(countingMonitor);
@@ -1917,7 +1963,7 @@
 	}
 
 	private void findObjectsToPackUsingBitmaps(
-			PackWriterBitmapWalker bitmapWalker, Set<? extends ObjectId> want,
+			BitmapWalker bitmapWalker, Set<? extends ObjectId> want,
 			Set<? extends ObjectId> have)
 			throws MissingObjectException, IncorrectObjectTypeException,
 			IOException {
@@ -1971,7 +2017,7 @@
 	 *
 	 * @param object
 	 *            the object to add.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object is an unsupported type.
 	 */
 	public void addObject(final RevObject object)
@@ -2013,9 +2059,9 @@
 	/**
 	 * Select an object representation for this writer.
 	 * <p>
-	 * An {@link ObjectReader} implementation should invoke this method once for
-	 * each representation available for an object, to allow the writer to find
-	 * the most suitable one for the output.
+	 * An {@link org.eclipse.jgit.lib.ObjectReader} implementation should invoke
+	 * this method once for each representation available for an object, to
+	 * allow the writer to find the most suitable one for the output.
 	 *
 	 * @param otp
 	 *            the object being packed.
@@ -2096,7 +2142,7 @@
 	 * @param pm
 	 *            progress monitor to report bitmap building work.
 	 * @return whether a bitmap index may be written.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when some I/O problem occur during reading objects.
 	 */
 	public boolean prepareBitmapIndex(ProgressMonitor pm) throws IOException {
@@ -2123,7 +2169,7 @@
 
 		beginPhase(PackingPhase.BUILDING_BITMAPS, pm, selectedCommits.size());
 
-		PackWriterBitmapWalker walker = bitmapPreparer.newBitmapWalker();
+		BitmapWalker walker = bitmapPreparer.newBitmapWalker();
 		AnyObjectId last = null;
 		for (PackWriterBitmapPreparer.BitmapCommit cmit : selectedCommits) {
 			if (!cmit.isReuseWalker()) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java
index 8bedddb..38d3458 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapPreparer.java
@@ -59,18 +59,19 @@
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.revwalk.AddUnseenToBitmapFilter;
 import org.eclipse.jgit.internal.storage.file.BitmapIndexImpl;
 import org.eclipse.jgit.internal.storage.file.BitmapIndexImpl.CompressedBitmap;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndex;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndexBuilder;
 import org.eclipse.jgit.internal.storage.file.PackBitmapIndexRemapper;
-import org.eclipse.jgit.internal.storage.pack.PackWriterBitmapWalker.AddUnseenToBitmapFilter;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.revwalk.BitmapWalker;
 import org.eclipse.jgit.revwalk.ObjectWalk;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -508,8 +509,8 @@
 		return Math.max(next, recentCommitSpan);
 	}
 
-	PackWriterBitmapWalker newBitmapWalker() {
-		return new PackWriterBitmapWalker(
+	BitmapWalker newBitmapWalker() {
+		return new BitmapWalker(
 				new ObjectWalk(reader), bitmapIndex, null);
 	}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/StoredObjectRepresentation.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/StoredObjectRepresentation.java
index c48b1bb..2377820 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/StoredObjectRepresentation.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/StoredObjectRepresentation.java
@@ -46,7 +46,9 @@
 import org.eclipse.jgit.lib.ObjectId;
 
 /**
- * An object representation {@link PackWriter} can consider for packing.
+ * An object representation
+ * {@link org.eclipse.jgit.internal.storage.pack.PackWriter} can consider for
+ * packing.
  */
 public class StoredObjectRepresentation {
 	/** Special unknown value for {@link #getWeight()}. */
@@ -62,6 +64,8 @@
 	public static final int FORMAT_OTHER = 2;
 
 	/**
+	 * Get relative size of this object's packed form.
+	 *
 	 * @return relative size of this object's packed form. The special value
 	 *         {@link #WEIGHT_UNKNOWN} can be returned to indicate the
 	 *         implementation doesn't know, or cannot supply the weight up
@@ -72,6 +76,8 @@
 	}
 
 	/**
+	 * Get the storage format type
+	 *
 	 * @return the storage format type, which must be one of
 	 *         {@link #PACK_DELTA}, {@link #PACK_WHOLE}, or
 	 *         {@link #FORMAT_OTHER}.
@@ -81,6 +87,9 @@
 	}
 
 	/**
+	 * Get identity of the object this delta applies to in order to recover the
+	 * original object content.
+	 *
 	 * @return identity of the object this delta applies to in order to recover
 	 *         the original object content. This method should only be called if
 	 *         {@link #getFormat()} returned {@link #PACK_DELTA}.
@@ -90,6 +99,9 @@
 	}
 
 	/**
+	 * Whether the current representation of the object has had delta
+	 * compression attempted on it.
+	 *
 	 * @return whether the current representation of the object has had delta
 	 *         compression attempted on it.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockSizeTooSmallException.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockSizeTooSmallException.java
index cb0f988..991306e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockSizeTooSmallException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockSizeTooSmallException.java
@@ -45,7 +45,10 @@
 
 import java.io.IOException;
 
-/** Thrown if {@link ReftableWriter} cannot fit a reference. */
+/**
+ * Thrown if {@link org.eclipse.jgit.internal.storage.reftable.ReftableWriter}
+ * cannot fit a reference.
+ */
 public class BlockSizeTooSmallException extends IOException {
 	private static final long serialVersionUID = 1L;
 
@@ -55,7 +58,11 @@
 		minBlockSize = b;
 	}
 
-	/** @return minimum block size in bytes reftable requires to write a ref. */
+	/**
+	 * Get minimum block size in bytes reftable requires to write a ref.
+	 *
+	 * @return minimum block size in bytes reftable requires to write a ref.
+	 */
 	public int getMinimumBlockSize() {
 		return minBlockSize;
 	}
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 d774589..de5baa1 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
@@ -49,26 +49,31 @@
 
 /** 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 c19968c..486fd28 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
@@ -47,26 +47,42 @@
 
 import org.eclipse.jgit.lib.ReflogEntry;
 
-/** Iterator over logs inside a {@link Reftable}. */
+/**
+ * Iterator over logs inside a
+ * {@link org.eclipse.jgit.internal.storage.reftable.Reftable}.
+ */
 public abstract class LogCursor implements AutoCloseable {
 	/**
 	 * Check if another log record is available.
 	 *
 	 * @return {@code true} if there is another result.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             logs cannot be read.
 	 */
 	public abstract boolean next() throws IOException;
 
-	/** @return name of the current reference. */
+	/**
+	 * Get name of the current reference.
+	 *
+	 * @return name of the current reference.
+	 */
 	public abstract String getRefName();
 
-	/** @return identifier of the transaction that created the log record. */
+	/**
+	 * Get identifier of the transaction that created the log record.
+	 *
+	 * @return identifier of the transaction that created the log record.
+	 */
 	public abstract long getUpdateIndex();
 
-	/** @return current log entry. */
+	/**
+	 * Get current log entry.
+	 *
+	 * @return current log entry.
+	 */
 	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 9fc6ae2..baebde2 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
@@ -54,8 +54,10 @@
 /**
  * Merges multiple reference tables together.
  * <p>
- * A {@link MergedReftable} merge-joins multiple {@link ReftableReader} on the
- * fly. Tables higher/later in the stack shadow lower/earlier tables, hiding
+ * A {@link org.eclipse.jgit.internal.storage.reftable.MergedReftable}
+ * merge-joins multiple
+ * {@link org.eclipse.jgit.internal.storage.reftable.ReftableReader} on the fly.
+ * Tables higher/later in the stack shadow lower/earlier tables, hiding
  * references that been updated/replaced.
  * <p>
  * By default deleted references are skipped and not returned to the caller.
@@ -89,6 +91,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefCursor allRefs() throws IOException {
 		MergedRefCursor m = new MergedRefCursor();
@@ -98,6 +101,7 @@
 		return m;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefCursor seekRef(String name) throws IOException {
 		MergedRefCursor m = new MergedRefCursor();
@@ -107,6 +111,7 @@
 		return m;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefCursor byObjectId(AnyObjectId name) throws IOException {
 		MergedRefCursor m = new MergedRefCursor();
@@ -116,6 +121,7 @@
 		return m;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public LogCursor allLogs() throws IOException {
 		MergedLogCursor m = new MergedLogCursor();
@@ -125,6 +131,7 @@
 		return m;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public LogCursor seekLog(String refName, long updateIdx)
 			throws IOException {
@@ -135,6 +142,7 @@
 		return m;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		for (Reftable t : tables) {
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 d8e9c60..5d4af30 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
@@ -47,29 +47,45 @@
 
 import org.eclipse.jgit.lib.Ref;
 
-/** Iterator over references inside a {@link Reftable}. */
+/**
+ * Iterator over references inside a
+ * {@link org.eclipse.jgit.internal.storage.reftable.Reftable}.
+ */
 public abstract class RefCursor implements AutoCloseable {
 	/**
 	 * Check if another reference is available.
 	 *
 	 * @return {@code true} if there is another result.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             references cannot be read.
 	 */
 	public abstract boolean next() throws IOException;
 
-	/** @return reference at the current position. */
+	/**
+	 * Get reference at the current position.
+	 *
+	 * @return reference at the current position.
+	 */
 	public abstract Ref getRef();
 
-	/** @return updateIndex that last modified the current reference, */
+	/**
+	 * Get updateIndex that last modified the current reference.
+	 *
+	 * @return updateIndex that last modified the current reference.
+	 */
 	public abstract long getUpdateIndex();
 
-	/** @return {@code true} if the current reference was deleted. */
+	/**
+	 * Whether the current reference was deleted.
+	 *
+	 * @return {@code true} if the current reference was deleted.
+	 */
 	public boolean wasDeleted() {
 		Ref r = getRef();
 		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 1189ed3..510c1a1 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
@@ -55,9 +55,13 @@
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.SymbolicRef;
 
-/** Abstract table of references. */
+/**
+ * Abstract table of references.
+ */
 public abstract class Reftable implements AutoCloseable {
 	/**
+	 * References to convert into a reftable
+	 *
 	 * @param refs
 	 *            references to convert into a reftable; may be empty.
 	 * @return a reader for the supplied references.
@@ -83,6 +87,8 @@
 	protected boolean includeDeletes;
 
 	/**
+	 * Whether deleted references will be returned.
+	 *
 	 * @param deletes
 	 *            if {@code true} deleted references will be returned. If
 	 *            {@code false} (default behavior), deleted references will be
@@ -96,7 +102,7 @@
 	 * Seek to the first reference, to iterate in order.
 	 *
 	 * @return cursor to iterate.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	public abstract RefCursor allRefs() throws IOException;
@@ -115,7 +121,7 @@
 	 * @param refName
 	 *            reference name or subtree to find.
 	 * @return cursor to iterate; empty cursor if no references match.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	public abstract RefCursor seekRef(String refName) throws IOException;
@@ -126,7 +132,7 @@
 	 * @param id
 	 *            object to find.
 	 * @return cursor to iterate; empty cursor if no references match.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	public abstract RefCursor byObjectId(AnyObjectId id) throws IOException;
@@ -135,7 +141,7 @@
 	 * Seek reader to read log records.
 	 *
 	 * @return cursor to iterate; empty cursor if no logs are present.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if logs cannot be read.
 	 */
 	public abstract LogCursor allLogs() throws IOException;
@@ -146,7 +152,7 @@
 	 * @param refName
 	 *            exact name of the reference whose log to read.
 	 * @return cursor to iterate; empty cursor if no logs match.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if logs cannot be read.
 	 */
 	public LogCursor seekLog(String refName) throws IOException {
@@ -162,7 +168,7 @@
 	 *            most recent index to return first in the log cursor. Log
 	 *            records at or before {@code updateIndex} will be returned.
 	 * @return cursor to iterate; empty cursor if no logs match.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if logs cannot be read.
 	 */
 	public abstract LogCursor seekLog(String refName, long updateIndex)
@@ -174,7 +180,7 @@
 	 * @param refName
 	 *            reference name to find.
 	 * @return the reference, or {@code null} if not found.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	@Nullable
@@ -196,7 +202,7 @@
 	 *            reference name or subtree to find.
 	 * @return {@code true} if the reference exists, or at least one reference
 	 *         exists in the subtree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	public boolean hasRef(String refName) throws IOException {
@@ -212,7 +218,7 @@
 	 *            ObjectId to find.
 	 * @return {@code true} if any reference exists directly referencing
 	 *         {@code id}, or a annotated tag that peels to {@code id}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	public boolean hasId(AnyObjectId id) throws IOException {
@@ -227,7 +233,7 @@
 	 * @param symref
 	 *            reference to resolve.
 	 * @return resolved {@code symref}, or {@code null}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if references cannot be read.
 	 */
 	@Nullable
@@ -257,6 +263,7 @@
 		return new SymbolicRef(ref.getName(), dst);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public abstract void close() throws IOException;
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java
index c221577..ed73a9e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java
@@ -74,12 +74,14 @@
 	private long compactBytesLimit;
 	private long bytesToCompact;
 	private boolean includeDeletes;
-	private long minUpdateIndex;
+	private long minUpdateIndex = -1;
 	private long maxUpdateIndex;
 	private long oldestReflogTimeMillis;
 	private Stats stats;
 
 	/**
+	 * Set configuration for the reftable.
+	 *
 	 * @param cfg
 	 *            configuration for the reftable.
 	 * @return {@code this}
@@ -90,6 +92,8 @@
 	}
 
 	/**
+	 * Set limit on number of bytes from source tables to compact.
+	 *
 	 * @param bytes
 	 *            limit on number of bytes from source tables to compact.
 	 * @return {@code this}
@@ -100,6 +104,9 @@
 	}
 
 	/**
+	 * Whether to include deletions in the output, which may be necessary for
+	 * partial compaction.
+	 *
 	 * @param deletes
 	 *            {@code true} to include deletions in the output, which may be
 	 *            necessary for partial compaction.
@@ -111,6 +118,9 @@
 	}
 
 	/**
+	 * Set the minimum update index for log entries that appear in the compacted
+	 * reftable.
+	 *
 	 * @param min
 	 *            the minimum update index for log entries that appear in the
 	 *            compacted reftable. This should be 1 higher than the prior
@@ -124,6 +134,9 @@
 	}
 
 	/**
+	 * Set the maximum update index for log entries that appear in the compacted
+	 * reftable.
+	 *
 	 * @param max
 	 *            the maximum update index for log entries that appear in the
 	 *            compacted reftable. This should be at least 1 higher than the
@@ -137,6 +150,8 @@
 	}
 
 	/**
+	 * Set oldest reflog time to preserve.
+	 *
 	 * @param timeMillis
 	 *            oldest log time to preserve. Entries whose timestamps are
 	 *            {@code >= timeMillis} will be copied into the output file. Log
@@ -159,7 +174,7 @@
 	 *            tables to compact. Tables should be ordered oldest first/most
 	 *            recent last so that the more recent tables can shadow the
 	 *            older results. Caller is responsible for closing the readers.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             update indexes of a reader cannot be accessed.
 	 */
 	public void addAll(List<? extends Reftable> readers) throws IOException {
@@ -184,7 +199,7 @@
 	 *            responsible for closing the reader.
 	 * @return {@code true} if the compactor accepted this table; {@code false}
 	 *         if the compactor has reached its limit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if size of {@code reader}, or its update indexes cannot be read.
 	 */
 	public boolean tryAddFirst(ReftableReader reader) throws IOException {
@@ -199,7 +214,7 @@
 	}
 
 	private void adjustUpdateIndexes(ReftableReader reader) throws IOException {
-		if (minUpdateIndex == 0) {
+		if (minUpdateIndex == -1) {
 			minUpdateIndex = reader.minUpdateIndex();
 		} else {
 			minUpdateIndex = Math.min(minUpdateIndex, reader.minUpdateIndex());
@@ -213,14 +228,14 @@
 	 * @param out
 	 *            stream to write the compacted tables to. Caller is responsible
 	 *            for closing {@code out}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if tables cannot be read, or cannot be written.
 	 */
 	public void compact(OutputStream out) throws IOException {
 		MergedReftable mr = new MergedReftable(new ArrayList<>(tables));
 		mr.setIncludeDeletes(includeDeletes);
 
-		writer.setMinUpdateIndex(minUpdateIndex);
+		writer.setMinUpdateIndex(Math.max(minUpdateIndex, 0));
 		writer.setMaxUpdateIndex(maxUpdateIndex);
 		writer.begin(out);
 		mergeRefs(mr);
@@ -229,7 +244,11 @@
 		stats = writer.getStats();
 	}
 
-	/** @return statistics of the last written reftable. */
+	/**
+	 * Get statistics of the last written reftable.
+	 *
+	 * @return statistics of the last written reftable.
+	 */
 	public Stats getStats() {
 		return stats;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableConfig.java
index f7a1fbe..66c113d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableConfig.java
@@ -48,7 +48,9 @@
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Repository;
 
-/** Configuration used by a reftable writer when constructing the stream. */
+/**
+ * Configuration used by a reftable writer when constructing the stream.
+ */
 public class ReftableConfig {
 	private int refBlockSize = 4 << 10;
 	private int logBlockSize;
@@ -57,7 +59,9 @@
 	private boolean alignBlocks = true;
 	private boolean indexObjects = true;
 
-	/** Create a default configuration. */
+	/**
+	 * Create a default configuration.
+	 */
 	public ReftableConfig() {
 	}
 
@@ -74,7 +78,8 @@
 	}
 
 	/**
-	 * Create a configuration honoring settings in a {@link Config}.
+	 * Create a configuration honoring settings in a
+	 * {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param cfg
 	 *            the source to read settings from. The source is not retained
@@ -100,12 +105,18 @@
 		this.indexObjects = cfg.indexObjects;
 	}
 
-	/** @return desired output block size for references, in bytes */
+	/**
+	 * Get desired output block size for references, in bytes.
+	 *
+	 * @return desired output block size for references, in bytes.
+	 */
 	public int getRefBlockSize() {
 		return refBlockSize;
 	}
 
 	/**
+	 * Set desired output block size for references, in bytes.
+	 *
 	 * @param szBytes
 	 *            desired output block size for references, in bytes.
 	 */
@@ -117,6 +128,8 @@
 	}
 
 	/**
+	 * Get desired output block size for log entries, in bytes.
+	 *
 	 * @return desired output block size for log entries, in bytes. If 0 the
 	 *         writer will default to {@code 2 * getRefBlockSize()}.
 	 */
@@ -125,6 +138,8 @@
 	}
 
 	/**
+	 * Set desired output block size for log entries, in bytes.
+	 *
 	 * @param szBytes
 	 *            desired output block size for log entries, in bytes. If 0 will
 	 *            default to {@code 2 * getRefBlockSize()}.
@@ -136,12 +151,18 @@
 		logBlockSize = Math.max(0, szBytes);
 	}
 
-	/** @return number of references between binary search markers. */
+	/**
+	 * Get number of references between binary search markers.
+	 *
+	 * @return number of references between binary search markers.
+	 */
 	public int getRestartInterval() {
 		return restartInterval;
 	}
 
 	/**
+	 * <p>Setter for the field <code>restartInterval</code>.</p>
+	 *
 	 * @param interval
 	 *            number of references between binary search markers. If
 	 *            {@code interval} is 0 (default), the writer will select a
@@ -151,12 +172,18 @@
 		restartInterval = Math.max(0, interval);
 	}
 
-	/** @return maximum depth of the index; 0 for unlimited. */
+	/**
+	 * Get maximum depth of the index; 0 for unlimited.
+	 *
+	 * @return maximum depth of the index; 0 for unlimited.
+	 */
 	public int getMaxIndexLevels() {
 		return maxIndexLevels;
 	}
 
 	/**
+	 * Set maximum number of levels to use in indexes.
+	 *
 	 * @param levels
 	 *            maximum number of levels to use in indexes. Lower levels of
 	 *            the index respect {@link #getRefBlockSize()}, and the highest
@@ -166,12 +193,19 @@
 		maxIndexLevels = Math.max(0, levels);
 	}
 
-	/** @return {@code true} if the writer should align blocks. */
+	/**
+	 * Whether the writer should align blocks.
+	 *
+	 * @return {@code true} if the writer should align blocks.
+	 */
 	public boolean isAlignBlocks() {
 		return alignBlocks;
 	}
 
 	/**
+	 * Whether blocks are written aligned to multiples of
+	 * {@link #getRefBlockSize()}.
+	 *
 	 * @param align
 	 *            if {@code true} blocks are written aligned to multiples of
 	 *            {@link #getRefBlockSize()}. May increase file size due to NUL
@@ -181,12 +215,19 @@
 		alignBlocks = align;
 	}
 
-	/** @return {@code true} if the writer should index object to ref. */
+	/**
+	 * Whether the writer should index object to ref.
+	 *
+	 * @return {@code true} if the writer should index object to ref.
+	 */
 	public boolean isIndexObjects() {
 		return indexObjects;
 	}
 
 	/**
+	 * Whether the reftable may include additional storage to efficiently map
+	 * from {@code ObjectId} to reference names.
+	 *
 	 * @param index
 	 *            if {@code true} the reftable may include additional storage to
 	 *            efficiently map from {@code ObjectId} to reference names. By
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 a24619b..1fc43c9 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
@@ -92,12 +92,14 @@
 		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 407a77c..7487719 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
@@ -112,10 +112,13 @@
 	}
 
 	/**
+	 * Get the block size in bytes chosen for this file by the writer.
+	 *
 	 * @return the block size in bytes chosen for this file by the writer. Most
-	 *         reads from the {@link BlockSource} will be aligned to the block
-	 *         size.
-	 * @throws IOException
+	 *         reads from the
+	 *         {@link org.eclipse.jgit.internal.storage.io.BlockSource} will be
+	 *         aligned to the block size.
+	 * @throws java.io.IOException
 	 *             file cannot be read.
 	 */
 	public int blockSize() throws IOException {
@@ -126,10 +129,13 @@
 	}
 
 	/**
+	 * Get the minimum update index for log entries that appear in this
+	 * reftable.
+	 *
 	 * @return the minimum update index for log entries that appear in this
 	 *         reftable. This should be 1 higher than the prior reftable's
 	 *         {@code maxUpdateIndex} if this table is used in a stack.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             file cannot be read.
 	 */
 	public long minUpdateIndex() throws IOException {
@@ -140,10 +146,13 @@
 	}
 
 	/**
+	 * Get the maximum update index for log entries that appear in this
+	 * reftable.
+	 *
 	 * @return the maximum update index for log entries that appear in this
 	 *         reftable. This should be 1 higher than the prior reftable's
 	 *         {@code maxUpdateIndex} if this table is used in a stack.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             file cannot be read.
 	 */
 	public long maxUpdateIndex() throws IOException {
@@ -153,6 +162,7 @@
 		return maxUpdateIndex;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefCursor allRefs() throws IOException {
 		if (blockSize == -1) {
@@ -167,6 +177,7 @@
 		return i;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefCursor seekRef(String refName) throws IOException {
 		initRefIndex();
@@ -179,6 +190,7 @@
 		return i;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefCursor byObjectId(AnyObjectId id) throws IOException {
 		initObjIndex();
@@ -191,6 +203,7 @@
 		return i;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public LogCursor allLogs() throws IOException {
 		initLogIndex();
@@ -203,6 +216,7 @@
 		return new EmptyLogCursor();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public LogCursor seekLog(String refName, long updateIndex)
 			throws IOException {
@@ -437,13 +451,14 @@
 	 * Get size of the reftable, in bytes.
 	 *
 	 * @return size of the reftable, in bytes.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             size cannot be obtained.
 	 */
 	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/ReftableWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableWriter.java
index 0ac2445..f8b9ffd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableWriter.java
@@ -89,7 +89,9 @@
  * Writes a reftable formatted file.
  * <p>
  * A reftable can be written in a streaming fashion, provided the caller sorts
- * all references. A {@link ReftableWriter} is single-use, and not thread-safe.
+ * all references. A
+ * {@link org.eclipse.jgit.internal.storage.reftable.ReftableWriter} is
+ * single-use, and not thread-safe.
  */
 public class ReftableWriter {
 	private ReftableConfig config;
@@ -113,7 +115,9 @@
 	private int objIdLen;
 	private Stats stats;
 
-	/** Initialize a writer with a default configuration. */
+	/**
+	 * Initialize a writer with a default configuration.
+	 */
 	public ReftableWriter() {
 		this(new ReftableConfig());
 	}
@@ -129,6 +133,8 @@
 	}
 
 	/**
+	 * Set configuration for the writer.
+	 *
 	 * @param cfg
 	 *            configuration for the writer.
 	 * @return {@code this}
@@ -139,6 +145,9 @@
 	}
 
 	/**
+	 * Set the minimum update index for log entries that appear in this
+	 * reftable.
+	 *
 	 * @param min
 	 *            the minimum update index for log entries that appear in this
 	 *            reftable. This should be 1 higher than the prior reftable's
@@ -151,6 +160,9 @@
 	}
 
 	/**
+	 * Set the maximum update index for log entries that appear in this
+	 * reftable.
+	 *
 	 * @param max
 	 *            the maximum update index for log entries that appear in this
 	 *            reftable. This should be at least 1 higher than the prior
@@ -170,7 +182,7 @@
 	 *            stream to write the table to. Caller is responsible for
 	 *            closing the stream after invoking {@link #finish()}.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable header cannot be written.
 	 */
 	public ReftableWriter begin(OutputStream os) throws IOException {
@@ -208,7 +220,7 @@
 	 * @param refsToPack
 	 *            references to sort and write.
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable cannot be written.
 	 */
 	public ReftableWriter sortAndWriteRefs(Collection<Ref> refsToPack)
@@ -232,7 +244,7 @@
 	 *
 	 * @param ref
 	 *            the reference to store.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable cannot be written.
 	 */
 	public void writeRef(Ref ref) throws IOException {
@@ -249,7 +261,7 @@
 	 * @param updateIndex
 	 *            the updateIndex that modified this reference. Must be
 	 *            {@code >= minUpdateIndex} for this file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable cannot be written.
 	 */
 	public void writeRef(Ref ref, long updateIndex) throws IOException {
@@ -295,12 +307,14 @@
 	 * @param who
 	 *            committer of the reflog entry.
 	 * @param oldId
-	 *            prior id; pass {@link ObjectId#zeroId()} for creations.
+	 *            prior id; pass {@link org.eclipse.jgit.lib.ObjectId#zeroId()}
+	 *            for creations.
 	 * @param newId
-	 *            new id; pass {@link ObjectId#zeroId()} for deletions.
+	 *            new id; pass {@link org.eclipse.jgit.lib.ObjectId#zeroId()}
+	 *            for deletions.
 	 * @param message
 	 *            optional message (may be null).
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable cannot be written.
 	 */
 	public void writeLog(String ref, long updateIndex, PersonIdent who,
@@ -327,7 +341,7 @@
 	 *            the ref to delete (hide) a reflog entry from.
 	 * @param updateIndex
 	 *            the update index that must be hidden.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable cannot be written.
 	 */
 	public void deleteLog(String ref, long updateIndex) throws IOException {
@@ -345,10 +359,14 @@
 	}
 
 	/**
+	 * Get an estimate of the current size in bytes of the reftable
+	 *
 	 * @return an estimate of the current size in bytes of the reftable, if it
 	 *         was finished right now. Estimate is only accurate if
-	 *         {@link ReftableConfig#setIndexObjects(boolean)} is {@code false}
-	 *         and {@link ReftableConfig#setMaxIndexLevels(int)} is {@code 1}.
+	 *         {@link org.eclipse.jgit.internal.storage.reftable.ReftableConfig#setIndexObjects(boolean)}
+	 *         is {@code false} and
+	 *         {@link org.eclipse.jgit.internal.storage.reftable.ReftableConfig#setMaxIndexLevels(int)}
+	 *         is {@code 1}.
 	 */
 	public long estimateTotalBytes() {
 		long bytes = out.size();
@@ -381,7 +399,7 @@
 	 * Finish writing the reftable by writing its trailer.
 	 *
 	 * @return {@code this}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if reftable cannot be written.
 	 */
 	public ReftableWriter finish() throws IOException {
@@ -480,7 +498,11 @@
 		return s != null && s.idx != null ? s.idx.rootPosition : 0;
 	}
 
-	/** @return statistics of the last written reftable. */
+	/**
+	 * Get statistics of the last written reftable.
+	 *
+	 * @return statistics of the last written reftable.
+	 */
 	public Stats getStats() {
 		return stats;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/AlwaysFailUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/AlwaysFailUpdate.java
index 12ef873..9d673e5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/AlwaysFailUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/AlwaysFailUpdate.java
@@ -61,36 +61,43 @@
 		setCheckConflicting(false);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected RefDatabase getRefDatabase() {
 		return refdb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Repository getRepository() {
 		return refdb.getRepository();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected boolean tryLock(boolean deref) throws IOException {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void unlock() {
 		// No locks are held here.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doUpdate(Result desiredResult) {
 		return Result.LOCK_FAILURE;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doDelete(Result desiredResult) {
 		return Result.LOCK_FAILURE;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doLink(String target) {
 		return Result.LOCK_FAILURE;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Command.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Command.java
index dd08375..11837fd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Command.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Command.java
@@ -61,6 +61,7 @@
 import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.SymbolicRef;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
@@ -68,25 +69,31 @@
 import org.eclipse.jgit.transport.ReceiveCommand.Result;
 
 /**
- * Command to create, update or delete an entry inside a {@link RefTree}.
+ * Command to create, update or delete an entry inside a
+ * {@link org.eclipse.jgit.internal.storage.reftree.RefTree}.
  * <p>
- * Unlike {@link ReceiveCommand} (which can only update a reference to an
- * {@link ObjectId}), a RefTree Command can also create, modify or delete
- * symbolic references to a target reference.
+ * Unlike {@link org.eclipse.jgit.transport.ReceiveCommand} (which can only
+ * update a reference to an {@link org.eclipse.jgit.lib.ObjectId}), a RefTree
+ * Command can also create, modify or delete symbolic references to a target
+ * reference.
  * <p>
  * RefTree Commands may wrap a {@code ReceiveCommand} to allow callers to
  * process an existing ReceiveCommand against a RefTree.
  * <p>
- * Commands should be passed into {@link RefTree#apply(java.util.Collection)}
+ * Commands should be passed into
+ * {@link org.eclipse.jgit.internal.storage.reftree.RefTree#apply(java.util.Collection)}
  * for processing.
  */
 public class Command {
 	/**
 	 * Set unprocessed commands as failed due to transaction aborted.
 	 * <p>
-	 * If a command is still {@link Result#NOT_ATTEMPTED} it will be set to
-	 * {@link Result#REJECTED_OTHER_REASON}. If {@code why} is non-null its
-	 * contents will be used as the message for the first command status.
+	 * If a command is still
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#NOT_ATTEMPTED} it
+	 * will be set to
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#REJECTED_OTHER_REASON}.
+	 * If {@code why} is non-null its contents will be used as the message for
+	 * the first command status.
 	 *
 	 * @param commands
 	 *            commands to mark as failed.
@@ -146,21 +153,27 @@
 	 *            walk instance to peel the {@code newId}.
 	 * @param cmd
 	 *            command received from a push client.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             {@code oldId} or {@code newId} is missing.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             {@code oldId} or {@code newId} cannot be peeled.
 	 */
 	public Command(RevWalk rw, ReceiveCommand cmd)
 			throws MissingObjectException, IOException {
-		this.oldRef = toRef(rw, cmd.getOldId(), cmd.getRefName(), false);
-		this.newRef = toRef(rw, cmd.getNewId(), cmd.getRefName(), true);
+		this.oldRef = toRef(rw, cmd.getOldId(), cmd.getOldSymref(),
+				cmd.getRefName(), false);
+		this.newRef = toRef(rw, cmd.getNewId(), cmd.getNewSymref(),
+				cmd.getRefName(), true);
 		this.cmd = cmd;
 	}
 
-	static Ref toRef(RevWalk rw, ObjectId id, String name,
-			boolean mustExist) throws MissingObjectException, IOException {
-		if (ObjectId.zeroId().equals(id)) {
+	static Ref toRef(RevWalk rw, ObjectId id, @Nullable String target,
+			String name, boolean mustExist)
+			throws MissingObjectException, IOException {
+		if (target != null) {
+			return new SymbolicRef(name,
+					new ObjectIdRef.Unpeeled(NETWORK, target, id));
+		} else if (ObjectId.zeroId().equals(id)) {
 			return null;
 		}
 
@@ -179,7 +192,11 @@
 		}
 	}
 
-	/** @return name of the reference affected by this command. */
+	/**
+	 * Get name of the reference affected by this command.
+	 *
+	 * @return name of the reference affected by this command.
+	 */
 	public String getRefName() {
 		if (cmd != null) {
 			return cmd.getRefName();
@@ -215,12 +232,20 @@
 		}
 	}
 
-	/** @return result of executing this command. */
+	/**
+	 * Get result of executing this command.
+	 *
+	 * @return result of executing this command.
+	 */
 	public Result getResult() {
 		return cmd != null ? cmd.getResult() : result;
 	}
 
-	/** @return optional message explaining command failure. */
+	/**
+	 * Get optional message explaining command failure.
+	 *
+	 * @return optional message explaining command failure.
+	 */
 	@Nullable
 	public String getMessage() {
 		return cmd != null ? cmd.getMessage() : null;
@@ -246,6 +271,7 @@
 		return newRef;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java
index 85690c8..e9aa110 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java
@@ -74,7 +74,6 @@
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.ObjectInserter;
@@ -92,11 +91,13 @@
  * default reference {@code "refs/heads/master"} is stored at path
  * {@code "heads/master"} in a {@code RefTree}.
  * <p>
- * Normal references are stored as {@link FileMode#GITLINK} tree entries. The
- * ObjectId in the tree entry is the ObjectId the reference refers to.
+ * Normal references are stored as {@link org.eclipse.jgit.lib.FileMode#GITLINK}
+ * tree entries. The ObjectId in the tree entry is the ObjectId the reference
+ * refers to.
  * <p>
- * Symbolic references are stored as {@link FileMode#SYMLINK} entries, with the
- * blob storing the name of the target reference.
+ * Symbolic references are stored as
+ * {@link org.eclipse.jgit.lib.FileMode#SYMLINK} entries, with the blob storing
+ * the name of the target reference.
  * <p>
  * Annotated tags also store the peeled object using a {@code GITLINK} entry
  * with the suffix <code>" ^"</code> (space carrot), for example
@@ -127,13 +128,13 @@
 	 * @param tree
 	 *            the tree to read.
 	 * @return the ref tree read from the commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed through the reader.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             a tree object is corrupt and cannot be read.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             a tree object wasn't actually a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a reference tree object doesn't exist.
 	 */
 	public static RefTree read(ObjectReader reader, RevTree tree)
@@ -152,9 +153,10 @@
 	/**
 	 * Read one reference.
 	 * <p>
-	 * References are always returned peeled ({@link Ref#isPeeled()} is true).
-	 * If the reference points to an annotated tag, the returned reference will
-	 * be peeled and contain {@link Ref#getPeeledObjectId()}.
+	 * References are always returned peeled
+	 * ({@link org.eclipse.jgit.lib.Ref#isPeeled()} is true). If the reference
+	 * points to an annotated tag, the returned reference will be peeled and
+	 * contain {@link org.eclipse.jgit.lib.Ref#getPeeledObjectId()}.
 	 * <p>
 	 * If the reference is a symbolic reference and the chain depth is less than
 	 * {@link org.eclipse.jgit.lib.RefDatabase#MAX_SYMBOLIC_REF_DEPTH} the
@@ -166,7 +168,7 @@
 	 * @param name
 	 *            name of the reference to read.
 	 * @return the reference; null if it does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             cannot read a symbolic reference target.
 	 */
 	@Nullable
@@ -378,7 +380,7 @@
 	 *            Caller is responsible for flushing the inserter before trying
 	 *            to read the objects, or exposing them through a reference.
 	 * @return the top level tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a tree could not be written.
 	 */
 	public ObjectId writeTree(ObjectInserter inserter) throws IOException {
@@ -391,7 +393,11 @@
 		return contents.writeTree(inserter);
 	}
 
-	/** @return a deep copy of this RefTree. */
+	/**
+	 * Create a deep copy of this RefTree.
+	 *
+	 * @return a deep copy of this RefTree.
+	 */
 	public RefTree copy() {
 		RefTree r = new RefTree(DirCache.newInCore());
 		DirCacheBuilder b = r.contents.builder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeBatch.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeBatch.java
index 1cccd79..da98e3f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeBatch.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeBatch.java
@@ -87,6 +87,7 @@
 		this.refdb = refdb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void execute(RevWalk rw, ProgressMonitor monitor)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabase.java
index df93ce8..183468f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeDatabase.java
@@ -74,13 +74,15 @@
 import org.eclipse.jgit.util.RefMap;
 
 /**
- * Reference database backed by a {@link RefTree}.
+ * Reference database backed by a
+ * {@link org.eclipse.jgit.internal.storage.reftree.RefTree}.
  * <p>
  * The storage for RefTreeDatabase has two parts. The main part is a native Git
  * tree object stored under the {@code refs/txn} namespace. To avoid cycles,
  * references to {@code refs/txn} are not stored in that tree object, but
- * instead in a "bootstrap" layer, which is a separate {@link RefDatabase} such
- * as {@link org.eclipse.jgit.internal.storage.file.RefDirectory} using local
+ * instead in a "bootstrap" layer, which is a separate
+ * {@link org.eclipse.jgit.lib.RefDatabase} such as
+ * {@link org.eclipse.jgit.internal.storage.file.RefDirectory} using local
  * reference files inside of {@code $GIT_DIR/refs}.
  */
 public class RefTreeDatabase extends RefDatabase {
@@ -99,7 +101,8 @@
 	 *            the repository using references in this database.
 	 * @param bootstrap
 	 *            bootstrap reference database storing the references that
-	 *            anchor the {@link RefTree}.
+	 *            anchor the
+	 *            {@link org.eclipse.jgit.internal.storage.reftree.RefTree}.
 	 */
 	public RefTreeDatabase(Repository repo, RefDatabase bootstrap) {
 		Config cfg = repo.getConfig();
@@ -121,7 +124,8 @@
 	 *            the repository using references in this database.
 	 * @param bootstrap
 	 *            bootstrap reference database storing the references that
-	 *            anchor the {@link RefTree}.
+	 *            anchor the
+	 *            {@link org.eclipse.jgit.internal.storage.reftree.RefTree}.
 	 * @param txnCommitted
 	 *            name of the bootstrap reference holding the committed RefTree.
 	 */
@@ -146,6 +150,8 @@
 	}
 
 	/**
+	 * Get the bootstrap reference database
+	 *
 	 * @return the bootstrap reference database, which must be used to access
 	 *         {@link #getTxnCommitted()}, {@link #getTxnNamespace()}.
 	 */
@@ -153,41 +159,52 @@
 		return bootstrap;
 	}
 
-	/** @return name of bootstrap reference anchoring committed RefTree. */
+	/**
+	 * Get name of bootstrap reference anchoring committed RefTree.
+	 *
+	 * @return name of bootstrap reference anchoring committed RefTree.
+	 */
 	public String getTxnCommitted() {
 		return txnCommitted;
 	}
 
 	/**
-	 * @return namespace used by bootstrap layer, e.g. {@code refs/txn/}.
-	 *         Always ends in {@code '/'}.
+	 * Get namespace used by bootstrap layer.
+	 *
+	 * @return namespace used by bootstrap layer, e.g. {@code refs/txn/}. Always
+	 *         ends in {@code '/'}.
 	 */
 	@Nullable
 	public String getTxnNamespace() {
 		return txnNamespace;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void create() throws IOException {
 		bootstrap.create();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean performsAtomicTransactions() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void refresh() {
 		bootstrap.refresh();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		refs = null;
 		bootstrap.close();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref getRef(String name) throws IOException {
 		String[] needle = new String[SEARCH_PATH.length];
@@ -197,6 +214,7 @@
 		return firstExactRef(needle);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref exactRef(String name) throws IOException {
 		if (!repo.isBare() && name.indexOf('/') < 0 && !HEAD.equals(name)) {
@@ -235,6 +253,7 @@
 		return ""; //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Map<String, Ref> getRefs(String prefix) throws IOException {
 		if (!prefix.isEmpty() && prefix.charAt(prefix.length() - 1) != '/') {
@@ -258,6 +277,7 @@
 				: ObjectId.zeroId();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public List<Ref> getAdditionalRefs() throws IOException {
 		Collection<Ref> txnRefs;
@@ -279,6 +299,7 @@
 		return all;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref peel(Ref ref) throws IOException {
 		Ref i = ref.getLeaf();
@@ -306,17 +327,20 @@
 		return leaf;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isNameConflicting(String name) throws IOException {
 		return conflictsWithBootstrap(name)
 				|| !getConflictingNames(name).isEmpty();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public BatchRefUpdate newBatchUpdate() {
 		return new RefTreeBatch(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefUpdate newUpdate(String name, boolean detach) throws IOException {
 		if (!repo.isBare() && name.indexOf('/') < 0 && !HEAD.equals(name)) {
@@ -343,6 +367,7 @@
 		return u;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RefRename newRename(String fromName, String toName)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeNames.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeNames.java
index c53d6de..080304d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeNames.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeNames.java
@@ -45,7 +45,9 @@
 
 import org.eclipse.jgit.lib.RefDatabase;
 
-/** Magic reference name logic for RefTrees. */
+/**
+ * Magic reference name logic for RefTrees.
+ */
 public class RefTreeNames {
 	/**
 	 * Suffix used on a {@link RefTreeDatabase#getTxnNamespace()} for user data.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeRename.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeRename.java
index 5fd7ecd..4faf96b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeRename.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeRename.java
@@ -69,6 +69,7 @@
 		this.refdb = refdb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doRename() throws IOException {
 		try (RevWalk rw = new RevWalk(refdb.getRepository())) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeUpdate.java
index 8829c11..dda2be4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTreeUpdate.java
@@ -76,16 +76,19 @@
 		setCheckConflicting(false); // Done automatically by doUpdate.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected RefDatabase getRefDatabase() {
 		return refdb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Repository getRepository() {
 		return refdb.getRepository();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected boolean tryLock(boolean deref) throws IOException {
 		rw = new RevWalk(getRepository());
@@ -100,6 +103,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void unlock() {
 		batch = null;
@@ -109,6 +113,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doUpdate(Result desiredResult) throws IOException {
 		return run(newRef(getName(), getNewObjectId()), desiredResult);
@@ -124,11 +129,13 @@
 		return new ObjectIdRef.PeeledNonTag(LOOSE, name, id);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doDelete(Result desiredResult) throws IOException {
 		return run(null, desiredResult);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected Result doLink(String target) throws IOException {
 		Ref dst = new ObjectIdRef.Unpeeled(NEW, target, null);
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 0567051..425f7f6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
@@ -52,7 +52,7 @@
 import org.eclipse.jgit.util.RawParseUtils;
 
 /**
- * A prefix abbreviation of an {@link ObjectId}.
+ * A prefix abbreviation of an {@link org.eclipse.jgit.lib.ObjectId}.
  * <p>
  * Sometimes Git produces abbreviated SHA-1 strings, using sufficient leading
  * digits from the ObjectId name to still be unique within the repository the
@@ -109,13 +109,14 @@
 	}
 
 	/**
-	 * Convert an AbbreviatedObjectId from an {@link AnyObjectId}.
+	 * Convert an AbbreviatedObjectId from an
+	 * {@link org.eclipse.jgit.lib.AnyObjectId}.
 	 * <p>
 	 * This method copies over all bits of the Id, and is therefore complete
 	 * (see {@link #isComplete()}).
 	 *
 	 * @param id
-	 *            the {@link ObjectId} to convert from.
+	 *            the {@link org.eclipse.jgit.lib.ObjectId} to convert from.
 	 * @return the converted object id.
 	 */
 	public static final AbbreviatedObjectId fromObjectId(AnyObjectId id) {
@@ -205,17 +206,29 @@
 		w5 = new_5;
 	}
 
-	/** @return number of hex digits appearing in this id */
+	/**
+	 * Get number of hex digits appearing in this id.
+	 *
+	 * @return number of hex digits appearing in this id.
+	 */
 	public int length() {
 		return nibbles;
 	}
 
-	/** @return true if this ObjectId is actually a complete id. */
+	/**
+	 * Whether this ObjectId is actually a complete id.
+	 *
+	 * @return true if this ObjectId is actually a complete id.
+	 */
 	public boolean isComplete() {
 		return length() == Constants.OBJECT_ID_STRING_LENGTH;
 	}
 
-	/** @return a complete ObjectId; null if {@link #isComplete()} is false */
+	/**
+	 * A complete ObjectId; null if {@link #isComplete()} is false
+	 *
+	 * @return a complete ObjectId; null if {@link #isComplete()} is false
+	 */
 	public ObjectId toObjectId() {
 		return isComplete() ? new ObjectId(w1, w2, w3, w4, w5) : null;
 	}
@@ -325,7 +338,11 @@
 		return NB.compareUInt32(w5, mask(5, bs[p + 4]));
 	}
 
-	/** @return value for a fan-out style map, only valid of length &gt;= 2. */
+	/**
+	 * Get value for a fan-out style map, only valid of length &gt;= 2.
+	 *
+	 * @return value for a fan-out style map, only valid of length &gt;= 2.
+	 */
 	public final int getFirstByte() {
 		return w1 >>> 24;
 	}
@@ -334,11 +351,13 @@
 		return mask(nibbles, word, v);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return w1;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(final Object o) {
 		if (o instanceof AbbreviatedObjectId) {
@@ -350,6 +369,8 @@
 	}
 
 	/**
+	 * Get string form of the abbreviation, in lower case hexadecimal.
+	 *
 	 * @return string form of the abbreviation, in lower case hexadecimal.
 	 */
 	public final String name() {
@@ -375,6 +396,7 @@
 		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 f964bf2..5847765 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
@@ -53,9 +53,9 @@
 /**
  * A (possibly mutable) SHA-1 abstraction.
  * <p>
- * If this is an instance of {@link MutableObjectId} the concept of equality
- * with this instance can alter at any time, if this instance is modified to
- * represent a different object name.
+ * If this is an instance of {@link org.eclipse.jgit.lib.MutableObjectId} the
+ * concept of equality with this instance can alter at any time, if this
+ * instance is modified to represent a different object name.
  */
 public abstract class AnyObjectId implements Comparable<AnyObjectId> {
 
@@ -117,14 +117,16 @@
 	 *
 	 * @param index
 	 *            index of the byte to obtain from the raw form of the ObjectId.
-	 *            Must be in range [0, {@link Constants#OBJECT_ID_LENGTH}).
+	 *            Must be in range [0,
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJECT_ID_LENGTH}).
 	 * @return the value of the requested byte at {@code index}. Returned values
 	 *         are unsigned and thus are in the range [0,255] rather than the
 	 *         signed byte range of [-128, 127].
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             {@code index} is less than 0, equal to
-	 *             {@link Constants#OBJECT_ID_LENGTH}, or greater than
-	 *             {@link Constants#OBJECT_ID_LENGTH}.
+	 *             {@link org.eclipse.jgit.lib.Constants#OBJECT_ID_LENGTH}, or
+	 *             greater than
+	 *             {@link org.eclipse.jgit.lib.Constants#OBJECT_ID_LENGTH}.
 	 */
 	public final int getByte(int index) {
 		int w;
@@ -152,12 +154,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Compare this ObjectId to another and obtain a sort ordering.
-	 *
-	 * @param other
-	 *            the other id to compare to. Must not be null.
-	 * @return &lt; 0 if this id comes before other; 0 if this id is equal to
-	 *         other; &gt; 0 if this id comes after other.
 	 */
 	@Override
 	public final int compareTo(final AnyObjectId other) {
@@ -262,6 +261,7 @@
 		return abbr.prefixCompare(this) == 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final int hashCode() {
 		return w2;
@@ -278,6 +278,7 @@
 		return other != null ? equals(this, other) : false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final boolean equals(final Object o) {
 		if (o instanceof AnyObjectId)
@@ -337,7 +338,7 @@
 	 *
 	 * @param w
 	 *            the stream to write to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyRawTo(final OutputStream w) throws IOException {
@@ -361,7 +362,7 @@
 	 *
 	 * @param w
 	 *            the stream to copy to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyTo(final OutputStream w) throws IOException {
@@ -422,7 +423,7 @@
 	 *
 	 * @param w
 	 *            the stream to copy to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyTo(final Writer w) throws IOException {
@@ -438,7 +439,7 @@
 	 *            of object id (40 characters or larger).
 	 * @param w
 	 *            the stream to copy to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream writing failed.
 	 */
 	public void copyTo(final char[] tmp, final Writer w) throws IOException {
@@ -488,6 +489,7 @@
 			dst[o--] = '0';
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -495,6 +497,8 @@
 	}
 
 	/**
+	 * <p>name.</p>
+	 *
 	 * @return string form of the SHA-1, in lower case hexadecimal.
 	 */
 	public final String name() {
@@ -502,6 +506,8 @@
 	}
 
 	/**
+	 * Get string form of the SHA-1, in lower case hexadecimal.
+	 *
 	 * @return string form of the SHA-1, in lower case hexadecimal.
 	 */
 	public final String getName() {
@@ -511,9 +517,11 @@
 	/**
 	 * Return an abbreviation (prefix) of this object SHA-1.
 	 * <p>
-	 * This implementation does not guarantee uniqueness. Callers should
-	 * instead use {@link ObjectReader#abbreviate(AnyObjectId, int)} to obtain a
-	 * unique abbreviation within the scope of a particular object database.
+	 * This implementation does not guarantee uniqueness. Callers should instead
+	 * use
+	 * {@link org.eclipse.jgit.lib.ObjectReader#abbreviate(AnyObjectId, int)} to
+	 * obtain a unique abbreviation within the scope of a particular object
+	 * database.
 	 *
 	 * @param len
 	 *            length of the abbreviated string.
@@ -532,8 +540,8 @@
 	 * Obtain an immutable copy of this current object name value.
 	 * <p>
 	 * Only returns <code>this</code> if this instance is an unsubclassed
-	 * instance of {@link ObjectId}; otherwise a new instance is returned
-	 * holding the same value.
+	 * instance of {@link org.eclipse.jgit.lib.ObjectId}; otherwise a new
+	 * instance is returned holding the same value.
 	 * <p>
 	 * This method is useful to shed any additional memory that may be tied to
 	 * the subclass, yet retain the unique identity of the object id for future
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectLoaderQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectLoaderQueue.java
index a3732ea..b4ea0e9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectLoaderQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectLoaderQueue.java
@@ -63,30 +63,37 @@
 	 * Position this queue onto the next available result.
 	 *
 	 * Even if this method returns true, {@link #open()} may still throw
-	 * {@link MissingObjectException} if the underlying object database was
-	 * concurrently modified and the current object is no longer available.
+	 * {@link org.eclipse.jgit.errors.MissingObjectException} if the underlying
+	 * object database was concurrently modified and the current object is no
+	 * longer available.
 	 *
 	 * @return true if there is a result available; false if the queue has
 	 *         finished its input iteration.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist. If the implementation is retaining
 	 *             the application's objects {@link #getCurrent()} will be the
 	 *             current object that is missing. There may be more results
 	 *             still available, so the caller should continue invoking next
 	 *             to examine another result.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public boolean next() throws MissingObjectException, IOException;
 
 	/**
+	 * Get the current object, null if the implementation lost track.
+	 *
 	 * @return the current object, null if the implementation lost track.
 	 *         Implementations may for performance reasons discard the caller's
 	 *         ObjectId and provider their own through {@link #getObjectId()}.
 	 */
 	public T getCurrent();
 
-	/** @return the ObjectId of the current object. Never null. */
+	/**
+	 * Get the ObjectId of the current object. Never null.
+	 *
+	 * @return the ObjectId of the current object. Never null.
+	 */
 	public ObjectId getObjectId();
 
 	/**
@@ -105,7 +112,7 @@
 	 *             current object that is missing. There may be more results
 	 *             still available, so the caller should continue invoking next
 	 *             to examine another result.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public ObjectLoader open() throws IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectSizeQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectSizeQueue.java
index c966724..03efcd2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectSizeQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncObjectSizeQueue.java
@@ -64,27 +64,37 @@
 	 *
 	 * @return true if there is a result available; false if the queue has
 	 *         finished its input iteration.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist. If the implementation is retaining
 	 *             the application's objects {@link #getCurrent()} will be the
 	 *             current object that is missing. There may be more results
 	 *             still available, so the caller should continue invoking next
 	 *             to examine another result.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public boolean next() throws MissingObjectException, IOException;
 
 	/**
+	 * <p>getCurrent.</p>
+	 *
 	 * @return the current object, null if the implementation lost track.
 	 *         Implementations may for performance reasons discard the caller's
 	 *         ObjectId and provider their own through {@link #getObjectId()}.
 	 */
 	public T getCurrent();
 
-	/** @return the ObjectId of the current object. Never null. */
+	/**
+	 * Get the ObjectId of the current object. Never null.
+	 *
+	 * @return the ObjectId of the current object. Never null.
+	 */
 	public ObjectId getObjectId();
 
-	/** @return the size of the current object. */
+	/**
+	 * Get the size of the current object.
+	 *
+	 * @return the size of the current object.
+	 */
 	public long getSize();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncOperation.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncOperation.java
index fb73dc1..00555b0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncOperation.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AsyncOperation.java
@@ -70,6 +70,8 @@
 	 */
 	public boolean cancel(boolean mayInterruptIfRunning);
 
-	/** Release resources used by the operation, including cancellation. */
+	/**
+	 * Release resources used by the operation, including cancellation.
+	 */
 	public void release();
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java
index 825c1f7..2c7c6cb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java
@@ -160,7 +160,11 @@
 		return self();
 	}
 
-	/** @return the file system abstraction, or null if not set. */
+	/**
+	 * Get the file system abstraction, or null if not set.
+	 *
+	 * @return the file system abstraction, or null if not set.
+	 */
 	public FS getFS() {
 		return fs;
 	}
@@ -182,7 +186,11 @@
 		return self();
 	}
 
-	/** @return the meta data directory; null if not set. */
+	/**
+	 * Get the meta data directory; null if not set.
+	 *
+	 * @return the meta data directory; null if not set.
+	 */
 	public File getGitDir() {
 		return gitDir;
 	}
@@ -200,7 +208,11 @@
 		return self();
 	}
 
-	/** @return the object directory; null if not set. */
+	/**
+	 * Get the object directory; null if not set.
+	 *
+	 * @return the object directory; null if not set.
+	 */
 	public File getObjectDirectory() {
 		return objectDirectory;
 	}
@@ -262,7 +274,11 @@
 		return self();
 	}
 
-	/** @return ordered array of alternate directories; null if non were set. */
+	/**
+	 * Get ordered array of alternate directories; null if non were set.
+	 *
+	 * @return ordered array of alternate directories; null if non were set.
+	 */
 	public File[] getAlternateObjectDirectories() {
 		final List<File> alts = alternateObjectDirectories;
 		if (alts == null)
@@ -285,7 +301,11 @@
 		return self();
 	}
 
-	/** @return true if this repository was forced bare by {@link #setBare()}. */
+	/**
+	 * Whether this repository was forced bare by {@link #setBare()}.
+	 *
+	 * @return true if this repository was forced bare by {@link #setBare()}.
+	 */
 	public boolean isBare() {
 		return bare;
 	}
@@ -303,7 +323,11 @@
 		return self();
 	}
 
-	/** @return true if the repository must exist before being opened. */
+	/**
+	 * Whether the repository must exist before being opened.
+	 *
+	 * @return true if the repository must exist before being opened.
+	 */
 	public boolean isMustExist() {
 		return mustExist;
 	}
@@ -320,7 +344,11 @@
 		return self();
 	}
 
-	/** @return the work tree directory, or null if not set. */
+	/**
+	 * Get the work tree directory, or null if not set.
+	 *
+	 * @return the work tree directory, or null if not set.
+	 */
 	public File getWorkTree() {
 		return workTree;
 	}
@@ -341,7 +369,11 @@
 		return self();
 	}
 
-	/** @return the index file location, or null if not set. */
+	/**
+	 * Get the index file location, or null if not set.
+	 *
+	 * @return the index file location, or null if not set.
+	 */
 	public File getIndexFile() {
 		return indexFile;
 	}
@@ -544,10 +576,10 @@
 	 * exception is thrown to the caller.
 	 *
 	 * @return {@code this}
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             insufficient parameters were set, or some parameters are
 	 *             incompatible with one another.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be accessed to configure the rest of
 	 *             the builder's parameters.
 	 */
@@ -569,9 +601,9 @@
 	 * @return a repository matching this configuration. The caller is
 	 *         responsible to close the repository instance when it is no longer
 	 *         needed.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             insufficient parameters were set.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be accessed to configure the rest of
 	 *             the builder's parameters.
 	 */
@@ -583,7 +615,9 @@
 		return repo;
 	}
 
-	/** Require either {@code gitDir} or {@code workTree} to be set. */
+	/**
+	 * Require either {@code gitDir} or {@code workTree} to be set.
+	 */
 	protected void requireGitDirOrWorkTree() {
 		if (getGitDir() == null && getWorkTree() == null)
 			throw new IllegalArgumentException(
@@ -593,7 +627,7 @@
 	/**
 	 * Perform standard gitDir initialization.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be accessed
 	 */
 	protected void setupGitDir() throws IOException {
@@ -615,7 +649,7 @@
 	 * end after the repository has been identified and its configuration is
 	 * available for inspection.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository configuration could not be read.
 	 */
 	protected void setupWorkTree() throws IOException {
@@ -642,7 +676,7 @@
 	/**
 	 * Configure the internal implementation details of the repository.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be accessed
 	 */
 	protected void setupInternals() throws IOException {
@@ -654,7 +688,7 @@
 	 * Get the cached repository configuration, loading if not yet available.
 	 *
 	 * @return the configuration of the repository.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the configuration is not available, or is badly formed.
 	 */
 	protected Config getConfig() throws IOException {
@@ -670,7 +704,7 @@
 	 * empty configuration if gitDir was not set.
 	 *
 	 * @return the repository's configuration.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the configuration is not available.
 	 */
 	protected Config loadConfig() throws IOException {
@@ -728,12 +762,20 @@
 		return null;
 	}
 
-	/** @return the configured FS, or {@link FS#DETECTED}. */
+	/**
+	 * Get the configured FS, or {@link FS#DETECTED}.
+	 *
+	 * @return the configured FS, or {@link FS#DETECTED}.
+	 */
 	protected FS safeFS() {
 		return getFS() != null ? getFS() : FS.DETECTED;
 	}
 
-	/** @return {@code this} */
+	/**
+	 * Get this object
+	 *
+	 * @return {@code this}
+	 */
 	@SuppressWarnings("unchecked")
 	protected final B self() {
 		return (B) this;
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 bcf9065..6919f7e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
@@ -135,6 +135,9 @@
 	}
 
 	/**
+	 * Whether the batch update will permit a non-fast-forward update to an
+	 * existing reference.
+	 *
 	 * @return true if the batch update will permit a non-fast-forward update to
 	 *         an existing reference.
 	 */
@@ -154,7 +157,11 @@
 		return this;
 	}
 
-	/** @return identity of the user making the change in the reflog. */
+	/**
+	 * Get identity of the user making the change in the reflog.
+	 *
+	 * @return identity of the user making the change in the reflog.
+	 */
 	public PersonIdent getRefLogIdent() {
 		return refLogIdent;
 	}
@@ -193,7 +200,8 @@
 	 * such as fast-forward or force-update.
 	 * <p>
 	 * Describes the default for commands in this batch that do not override it
-	 * with {@link ReceiveCommand#setRefLogMessage(String, boolean)}.
+	 * with
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand#setRefLogMessage(String, boolean)}.
 	 *
 	 * @return true if the message should include the result.
 	 */
@@ -204,21 +212,23 @@
 	/**
 	 * Set the message to include in the reflog.
 	 * <p>
-	 * Repository implementations may limit which reflogs are written by default,
-	 * based on the project configuration. If a repo is not configured to write
-	 * logs for this ref by default, setting the message alone may have no effect.
-	 * To indicate that the repo should write logs for this update in spite of
-	 * configured defaults, use {@link #setForceRefLog(boolean)}.
+	 * Repository implementations may limit which reflogs are written by
+	 * default, based on the project configuration. If a repo is not configured
+	 * to write logs for this ref by default, setting the message alone may have
+	 * no effect. To indicate that the repo should write logs for this update in
+	 * spite of configured defaults, use {@link #setForceRefLog(boolean)}.
 	 * <p>
 	 * Describes the default for commands in this batch that do not override it
-	 * with {@link ReceiveCommand#setRefLogMessage(String, boolean)}.
+	 * with
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand#setRefLogMessage(String, boolean)}.
 	 *
 	 * @param msg
-	 *            the message to describe this change. If null and appendStatus is
-	 *            false, the reflog will not be updated.
+	 *            the message to describe this change. If null and appendStatus
+	 *            is false, the reflog will not be updated.
 	 * @param appendStatus
 	 *            true if the status of the ref change (fast-forward or
-	 *            forced-update) should be appended to the user supplied message.
+	 *            forced-update) should be appended to the user supplied
+	 *            message.
 	 * @return {@code this}.
 	 */
 	public BatchRefUpdate setRefLogMessage(String msg, boolean appendStatus) {
@@ -286,12 +296,15 @@
 	 * {@code REJECTED_OTHER_REASON}.
 	 * <p>
 	 * This method only works if the underlying ref database supports atomic
-	 * transactions, i.e. {@link RefDatabase#performsAtomicTransactions()} returns
-	 * true. Calling this method with true if the underlying ref database does not
-	 * support atomic transactions will cause all commands to fail with {@code
+	 * transactions, i.e.
+	 * {@link org.eclipse.jgit.lib.RefDatabase#performsAtomicTransactions()}
+	 * returns true. Calling this method with true if the underlying ref
+	 * database does not support atomic transactions will cause all commands to
+	 * fail with {@code
 	 * REJECTED_OTHER_REASON}.
 	 *
-	 * @param atomic whether updates should be atomic.
+	 * @param atomic
+	 *            whether updates should be atomic.
 	 * @return {@code this}
 	 * @since 4.4
 	 */
@@ -301,6 +314,8 @@
 	}
 
 	/**
+	 * Whether updates should be atomic.
+	 *
 	 * @return atomic whether updates should be atomic.
 	 * @since 4.4
 	 */
@@ -335,7 +350,11 @@
 		return pushCert;
 	}
 
-	/** @return commands this update will process. */
+	/**
+	 * Get commands this update will process.
+	 *
+	 * @return commands this update will process.
+	 */
 	public List<ReceiveCommand> getCommands() {
 		return Collections.unmodifiableList(commands);
 	}
@@ -401,6 +420,8 @@
 	}
 
 	/**
+	 * Get list of timestamps the batch must wait for.
+	 *
 	 * @return list of timestamps the batch must wait for.
 	 * @since 4.6
 	 */
@@ -415,6 +436,7 @@
 	 * Request the batch to wait for the affected timestamps to resolve.
 	 *
 	 * @param ts
+	 *            a {@link org.eclipse.jgit.util.time.ProposedTimestamp} object.
 	 * @return {@code this}.
 	 * @since 4.6
 	 */
@@ -434,7 +456,7 @@
 	 * <p>
 	 * Implementations must respect the atomicity requirements of the underlying
 	 * database as described in {@link #setAtomic(boolean)} and
-	 * {@link RefDatabase#performsAtomicTransactions()}.
+	 * {@link org.eclipse.jgit.lib.RefDatabase#performsAtomicTransactions()}.
 	 *
 	 * @param walk
 	 *            a RevWalk to parse tags in case the storage system wants to
@@ -443,7 +465,7 @@
 	 *            progress monitor to receive update status on.
 	 * @param options
 	 *            a list of option strings; set null to execute without
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database is unable to accept the update. Individual
 	 *             command status must be tested to determine if there is a
 	 *             partial failure, or a total failure.
@@ -601,7 +623,7 @@
 	 *            store them pre-peeled, a common performance optimization.
 	 * @param monitor
 	 *            progress monitor to receive update status on.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database is unable to accept the update. Individual
 	 *             command status must be tested to determine if there is a
 	 *             partial failure, or a total failure.
@@ -658,7 +680,7 @@
 	 * @param cmd
 	 *            specific command the update should be created to copy.
 	 * @return a single reference update command.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference database cannot make a new update object for
 	 *             the given reference.
 	 */
@@ -746,6 +768,7 @@
 				: 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 a75293d..4eb7b7f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchingProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchingProgressMonitor.java
@@ -48,7 +48,9 @@
 
 import org.eclipse.jgit.lib.internal.WorkQueue;
 
-/** ProgressMonitor that batches update events. */
+/**
+ * ProgressMonitor that batches update events.
+ */
 public abstract class BatchingProgressMonitor implements ProgressMonitor {
 	private long delayStartTime;
 
@@ -70,11 +72,13 @@
 		delayStartUnit = unit;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		// Ignore the number of tasks.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int work) {
 		endTask();
@@ -83,12 +87,14 @@
 			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) {
@@ -97,6 +103,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapIndex.java
index 00f42a4..fc354db 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapIndex.java
@@ -63,7 +63,11 @@
 	 */
 	Bitmap getBitmap(AnyObjectId objectId);
 
-	/** @return a new {@code BitmapBuilder} based on the values in the index. */
+	/**
+	 * Create a new {@code BitmapBuilder} based on the values in the index.
+	 *
+	 * @return a new {@code BitmapBuilder} based on the values in the index.
+	 */
 	BitmapBuilder newBitmapBuilder();
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapObject.java
index 4e0dc2c..f2917dc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapObject.java
@@ -50,7 +50,7 @@
  */
 public abstract class BitmapObject {
 	/**
-	 * Get Git object type. See {@link Constants}.
+	 * Get Git object type. See {@link org.eclipse.jgit.lib.Constants}.
 	 *
 	 * @return object type
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java
index 8958ce7..3ff92dc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java
@@ -73,7 +73,7 @@
 	 *            the base configuration file
 	 * @param blob
 	 *            the byte array, should be UTF-8 encoded text.
-	 * @throws ConfigInvalidException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 *             the byte array is not a valid configuration format.
 	 */
 	public BlobBasedConfig(Config base, final byte[] blob)
@@ -98,9 +98,9 @@
 	 *            the repository
 	 * @param objectId
 	 *            the object identifier
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the blob cannot be read from the repository.
-	 * @throws ConfigInvalidException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 *             the blob is not a valid configuration format.
 	 */
 	public BlobBasedConfig(Config base, Repository db, AnyObjectId objectId)
@@ -134,11 +134,11 @@
 	 *            the tree (or commit) that contains the object
 	 * @param path
 	 *            the path within the tree
-	 * @throws FileNotFoundException
+	 * @throws java.io.FileNotFoundException
 	 *             the path does not exist in the commit's tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the tree and/or blob cannot be accessed.
-	 * @throws ConfigInvalidException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 *             the blob is not a valid configuration format.
 	 */
 	public BlobBasedConfig(Config base, Repository db, AnyObjectId treeish,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobObjectChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobObjectChecker.java
index 0fe63ae..3fa3168 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobObjectChecker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobObjectChecker.java
@@ -85,7 +85,7 @@
 	 *
 	 * @param id
 	 *            identity of the object being checked.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 */
 	void endBlob(AnyObjectId id) throws CorruptObjectException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
index f1b7fb2..596da03 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
@@ -113,6 +113,8 @@
 	}
 
 	/**
+	 * Get the full tracking branch name
+	 *
 	 * @return the full tracking branch name or <code>null</code> if it could
 	 *         not be determined
 	 */
@@ -129,6 +131,8 @@
 	}
 
 	/**
+	 * Get the full remote-tracking branch name
+	 *
 	 * @return the full remote-tracking branch name or {@code null} if it could
 	 *         not be determined. If you also want local tracked branches use
 	 *         {@link #getTrackingBranch()} instead.
@@ -143,6 +147,9 @@
 	}
 
 	/**
+	 * Whether the "remote" setting points to the local repository (with
+	 * {@value #LOCAL_REPOSITORY})
+	 *
 	 * @return {@code true} if the "remote" setting points to the local
 	 *         repository (with {@value #LOCAL_REPOSITORY}), false otherwise
 	 * @since 3.5
@@ -152,6 +159,8 @@
 	}
 
 	/**
+	 * Get the remote this branch is configured to fetch from/push to
+	 *
 	 * @return the remote this branch is configured to fetch from/push to, or
 	 *         {@code null} if not defined
 	 * @since 3.5
@@ -162,6 +171,8 @@
 	}
 
 	/**
+	 * Get the name of the upstream branch as it is called on the remote
+	 *
 	 * @return the name of the upstream branch as it is called on the remote, or
 	 *         {@code null} if not defined
 	 * @since 3.5
@@ -172,6 +183,8 @@
 	}
 
 	/**
+	 * Whether the branch is configured to be rebased
+	 *
 	 * @return {@code true} if the branch is configured to be rebased
 	 * @since 3.5
 	 */
@@ -182,7 +195,7 @@
 	/**
 	 * Retrieves the config value of branch.[name].rebase.
 	 *
-	 * @return the {@link BranchRebaseMode}
+	 * @return the {@link org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode}
 	 * @since 4.5
 	 */
 	public BranchRebaseMode getRebaseMode() {
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 d4fccf9..ac1529f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java
@@ -65,7 +65,7 @@
 	 * @param branchName
 	 *            the local branch
 	 * @return the tracking status, or null if it is not known
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static BranchTrackingStatus of(Repository repository, String branchName)
 			throws IOException {
@@ -119,6 +119,8 @@
 	}
 
 	/**
+	 * Get full remote-tracking branch name
+	 *
 	 * @return full remote-tracking branch name
 	 */
 	public String getRemoteTrackingBranch() {
@@ -126,6 +128,9 @@
 	}
 
 	/**
+	 * Get number of commits that the local branch is ahead of the
+	 * remote-tracking branch
+	 *
 	 * @return number of commits that the local branch is ahead of the
 	 *         remote-tracking branch
 	 */
@@ -134,6 +139,9 @@
 	}
 
 	/**
+	 * Get number of commits that the local branch is behind of the
+	 * remote-tracking branch
+	 *
 	 * @return number of commits that the local branch is behind of the
 	 *         remote-tracking branch
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CheckoutEntry.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CheckoutEntry.java
index 34d0b14..cfc0cc8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CheckoutEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CheckoutEntry.java
@@ -8,11 +8,15 @@
 public interface CheckoutEntry {
 
 	/**
+	 * Get the name of the branch before checkout
+	 *
 	 * @return the name of the branch before checkout
 	 */
 	public abstract String getFromBranch();
 
 	/**
+	 * Get the name of the branch after checkout
+	 *
 	 * @return the name of the branch after checkout
 	 */
 	public abstract String getToBranch();
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 c5c488d..2217fde 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitBuilder.java
@@ -88,13 +88,19 @@
 
 	private Charset encoding;
 
-	/** Initialize an empty commit. */
+	/**
+	 * Initialize an empty commit.
+	 */
 	public CommitBuilder() {
 		parentIds = EMPTY_OBJECTID_LIST;
 		encoding = Constants.CHARSET;
 	}
 
-	/** @return id of the root tree listing this commit's snapshot. */
+	/**
+	 * Get id of the root tree listing this commit's snapshot.
+	 *
+	 * @return id of the root tree listing this commit's snapshot.
+	 */
 	public ObjectId getTreeId() {
 		return treeId;
 	}
@@ -109,7 +115,11 @@
 		treeId = id.copy();
 	}
 
-	/** @return the author of this commit (who wrote it). */
+	/**
+	 * Get the author of this commit (who wrote it).
+	 *
+	 * @return the author of this commit (who wrote it).
+	 */
 	public PersonIdent getAuthor() {
 		return author;
 	}
@@ -124,7 +134,11 @@
 		author = newAuthor;
 	}
 
-	/** @return the committer and commit time for this object. */
+	/**
+	 * Get the committer and commit time for this object.
+	 *
+	 * @return the committer and commit time for this object.
+	 */
 	public PersonIdent getCommitter() {
 		return committer;
 	}
@@ -139,7 +153,11 @@
 		committer = newCommitter;
 	}
 
-	/** @return the ancestors of this commit. Never null. */
+	/**
+	 * Get the ancestors of this commit.
+	 *
+	 * @return the ancestors of this commit. Never null.
+	 */
 	public ObjectId[] getParentIds() {
 		return parentIds;
 	}
@@ -210,7 +228,11 @@
 		}
 	}
 
-	/** @return the complete commit message. */
+	/**
+	 * Get the complete commit message.
+	 *
+	 * @return the complete commit message.
+	 */
 	public String getMessage() {
 		return message;
 	}
@@ -229,7 +251,8 @@
 	 * Set the encoding for the commit information
 	 *
 	 * @param encodingName
-	 *            the encoding name. See {@link Charset#forName(String)}.
+	 *            the encoding name. See
+	 *            {@link java.nio.charset.Charset#forName(String)}.
 	 */
 	public void setEncoding(String encodingName) {
 		encoding = Charset.forName(encodingName);
@@ -245,7 +268,11 @@
 		encoding = enc;
 	}
 
-	/** @return the encoding that should be used for the commit message text. */
+	/**
+	 * Get the encoding that should be used for the commit message text.
+	 *
+	 * @return the encoding that should be used for the commit message text.
+	 */
 	public Charset getEncoding() {
 		return encoding;
 	}
@@ -255,7 +282,7 @@
 	 *
 	 * @return this object in the canonical commit format, suitable for storage
 	 *         in a repository.
-	 * @throws UnsupportedEncodingException
+	 * @throws java.io.UnsupportedEncodingException
 	 *             the encoding specified by {@link #getEncoding()} is not
 	 *             supported by this Java runtime.
 	 */
@@ -314,7 +341,7 @@
 	 *
 	 * @return this object in the canonical commit format, suitable for storage
 	 *         in a repository.
-	 * @throws UnsupportedEncodingException
+	 * @throws java.io.UnsupportedEncodingException
 	 *             the encoding specified by {@link #getEncoding()} is not
 	 *             supported by this Java runtime.
 	 */
@@ -322,6 +349,7 @@
 		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 b0f5c2c..a6313f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java
@@ -60,6 +60,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.events.ConfigChangedEvent;
 import org.eclipse.jgit.events.ConfigChangedListener;
@@ -67,6 +68,7 @@
 import org.eclipse.jgit.events.ListenerList;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.util.RawParseUtils;
 
 /**
  * Git style {@code .config}, {@code .gitconfig}, {@code .gitmodules} file.
@@ -106,7 +108,9 @@
 	 */
 	static final String MAGIC_EMPTY_VALUE = new String();
 
-	/** Create a configuration with no default fallback. */
+	/**
+	 * Create a configuration with no default fallback.
+	 */
 	public Config() {
 		this(null);
 	}
@@ -124,8 +128,8 @@
 	}
 
 	/**
-	 * Globally sets a {@link TypedConfigGetter} that is subsequently used to
-	 * read typed values from all git configs.
+	 * Globally sets a {@link org.eclipse.jgit.lib.TypedConfigGetter} that is
+	 * subsequently used to read typed values from all git configs.
 	 *
 	 * @param getter
 	 *            to use; if {@code null} use the default getter.
@@ -142,65 +146,105 @@
 	 *            the value to escape
 	 * @return the escaped value
 	 */
-	private static String escapeValue(final String x) {
-		boolean inquote = false;
-		int lineStart = 0;
-		final StringBuilder r = new StringBuilder(x.length());
+	static String escapeValue(String x) {
+		if (x.isEmpty()) {
+			return ""; //$NON-NLS-1$
+		}
+
+		boolean needQuote = x.charAt(0) == ' ' || x.charAt(x.length() - 1) == ' ';
+		StringBuilder r = new StringBuilder(x.length());
 		for (int k = 0; k < x.length(); k++) {
-			final char c = x.charAt(k);
+			char c = x.charAt(k);
+			// git-config(1) lists the limited set of supported escape sequences, but
+			// the documentation is otherwise not especially normative. In particular,
+			// which ones of these produce and/or require escaping and/or quoting
+			// around them is not documented and was discovered by trial and error.
+			// In summary:
+			//
+			// * Quotes are only required if there is leading/trailing whitespace or a
+			//   comment character.
+			// * Bytes that have a supported escape sequence are escaped, except for
+			//   \b for some reason which isn't.
+			// * Needing an escape sequence is not sufficient reason to quote the
+			//   value.
 			switch (c) {
+			case '\0':
+				// Unix command line calling convention cannot pass a '\0' as an
+				// argument, so there is no equivalent way in C git to store a null byte
+				// in a config value.
+				throw new IllegalArgumentException(
+						JGitText.get().configValueContainsNullByte);
+
 			case '\n':
-				if (inquote) {
-					r.append('"');
-					inquote = false;
-				}
-				r.append("\\n\\\n"); //$NON-NLS-1$
-				lineStart = r.length();
+				r.append('\\').append('n');
 				break;
 
 			case '\t':
-				r.append("\\t"); //$NON-NLS-1$
+				r.append('\\').append('t');
 				break;
 
 			case '\b':
-				r.append("\\b"); //$NON-NLS-1$
+				// Doesn't match `git config foo.bar $'x\by'`, which doesn't escape the
+				// \x08, but since both escaped and unescaped forms are readable, we'll
+				// prefer internal consistency here.
+				r.append('\\').append('b');
 				break;
 
 			case '\\':
-				r.append("\\\\"); //$NON-NLS-1$
+				r.append('\\').append('\\');
 				break;
 
 			case '"':
-				r.append("\\\""); //$NON-NLS-1$
+				r.append('\\').append('"');
 				break;
 
-			case ';':
 			case '#':
-				if (!inquote) {
-					r.insert(lineStart, '"');
-					inquote = true;
-				}
+			case ';':
+				needQuote = true;
 				r.append(c);
 				break;
 
-			case ' ':
-				if (!inquote && r.length() > 0
-						&& r.charAt(r.length() - 1) == ' ') {
-					r.insert(lineStart, '"');
-					inquote = true;
-				}
-				r.append(' ');
-				break;
-
 			default:
 				r.append(c);
 				break;
 			}
 		}
-		if (inquote) {
-			r.append('"');
+
+		return needQuote ? '"' + r.toString() + '"' : r.toString();
+	}
+
+	static String escapeSubsection(String x) {
+		if (x.isEmpty()) {
+			return "\"\""; //$NON-NLS-1$
 		}
-		return r.toString();
+
+		StringBuilder r = new StringBuilder(x.length() + 2).append('"');
+		for (int k = 0; k < x.length(); k++) {
+			char c = x.charAt(k);
+
+			// git-config(1) lists the limited set of supported escape sequences
+			// (which is even more limited for subsection names than for values).
+			switch (c) {
+			case '\0':
+				throw new IllegalArgumentException(
+						JGitText.get().configSubsectionContainsNullByte);
+
+			case '\n':
+				throw new IllegalArgumentException(
+						JGitText.get().configSubsectionContainsNewline);
+
+			case '\\':
+			case '"':
+				r.append('\\').append(c);
+				break;
+
+			default:
+				r.append(c);
+				break;
+			}
+		}
+
+		return r.append('"').toString();
 	}
 
 	/**
@@ -312,8 +356,6 @@
 	/**
 	 * Parse an enumeration from the configuration.
 	 *
-	 * @param <T>
-	 *            type of the enumeration object.
 	 * @param section
 	 *            section the key is grouped within.
 	 * @param subsection
@@ -346,8 +388,6 @@
 	/**
 	 * Parse an enumeration from the configuration.
 	 *
-	 * @param <T>
-	 *            type of the enumeration object.
 	 * @param all
 	 *            all possible values in the enumeration which should be
 	 *            recognized. Typically {@code EnumType.values()}.
@@ -443,7 +483,8 @@
 	}
 
 	/**
-	 * Parse a list of {@link RefSpec}s from the configuration.
+	 * Parse a list of {@link org.eclipse.jgit.transport.RefSpec}s from the
+	 * configuration.
 	 *
 	 * @param section
 	 *            section the key is in.
@@ -451,7 +492,8 @@
 	 *            subsection the key is in, or null if not in a subsection.
 	 * @param name
 	 *            the key name.
-	 * @return a possibly empty list of {@link RefSpec}s
+	 * @return a possibly empty list of
+	 *         {@link org.eclipse.jgit.transport.RefSpec}s
 	 * @since 4.9
 	 */
 	public List<RefSpec> getRefSpecs(String section, String subsection,
@@ -460,6 +502,9 @@
 	}
 
 	/**
+	 * Get set of all subsections of specified section within this configuration
+	 * and its base configuration
+	 *
 	 * @param section
 	 *            section to search for.
 	 * @return set of all subsections of specified section within this
@@ -473,16 +518,20 @@
 	}
 
 	/**
-	 * @return the sections defined in this {@link Config}. The set's iterator
-	 *         returns sections in the order they are declared by the
-	 *         configuration starting from this instance and progressing through
-	 *         the base.
+	 * Get the sections defined in this {@link org.eclipse.jgit.lib.Config}.
+	 *
+	 * @return the sections defined in this {@link org.eclipse.jgit.lib.Config}.
+	 *         The set's iterator returns sections in the order they are
+	 *         declared by the configuration starting from this instance and
+	 *         progressing through the base.
 	 */
 	public Set<String> getSections() {
 		return getState().getSections();
 	}
 
 	/**
+	 * Get the list of names defined for this section
+	 *
 	 * @param section
 	 *            the section
 	 * @return the list of names defined for this section
@@ -492,6 +541,8 @@
 	}
 
 	/**
+	 * Get the list of names defined for this subsection
+	 *
 	 * @param section
 	 *            the section
 	 * @param subsection
@@ -503,6 +554,8 @@
 	}
 
 	/**
+	 * Get the list of names defined for this section
+	 *
 	 * @param section
 	 *            the section
 	 * @param recursive
@@ -516,6 +569,8 @@
 	}
 
 	/**
+	 * Get the list of names defined for this section
+	 *
 	 * @param section
 	 *            the section
 	 * @param subsection
@@ -572,7 +627,8 @@
 	 * Adds a listener to be notified about changes.
 	 * <p>
 	 * Clients are supposed to remove the listeners after they are done with
-	 * them using the {@link ListenerHandle#remove()} method
+	 * them using the {@link org.eclipse.jgit.events.ListenerHandle#remove()}
+	 * method
 	 *
 	 * @param listener
 	 *            the listener
@@ -727,8 +783,6 @@
 	 *         name = value
 	 * </pre>
 	 *
-	 * @param <T>
-	 *            type of the enumeration object.
 	 * @param section
 	 *            section name, e.g "branch"
 	 * @param subsection
@@ -948,6 +1002,8 @@
 	}
 
 	/**
+	 * Get this configuration, formatted as a Git style text file.
+	 *
 	 * @return this configuration, formatted as a Git style text file.
 	 */
 	public String toText() {
@@ -997,7 +1053,7 @@
 	 *
 	 * @param text
 	 *            Git style text file listing configuration properties.
-	 * @throws ConfigInvalidException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 *             the text supplied is not formatted correctly. No changes were
 	 *             made to {@code this}.
 	 */
@@ -1050,7 +1106,7 @@
 				e.section = readSectionName(in);
 				input = in.read();
 				if ('"' == input) {
-					e.subsection = readValue(in, true, '"');
+					e.subsection = readSubsectionName(in);
 					input = in.read();
 				}
 				if (']' != input)
@@ -1067,7 +1123,11 @@
 					e.name = e.name.substring(0, e.name.length() - 1);
 					e.value = MAGIC_EMPTY_VALUE;
 				} else
-					e.value = readValue(in, false, -1);
+					e.value = readValue(in);
+
+				if (e.section.equals("include")) { //$NON-NLS-1$
+					addIncludedConfig(newEntries, e, depth);
+				}
 			} else
 				throw new ConfigInvalidException(JGitText.get().invalidLineInConfigFile);
 		}
@@ -1075,6 +1135,45 @@
 		return newEntries;
 	}
 
+	/**
+	 * Read the included config from the specified (possibly) relative path
+	 *
+	 * @param relPath
+	 *            possibly relative path to the included config, as specified in
+	 *            this config
+	 * @return the read bytes, or null if the included config should be ignored
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 *             if something went wrong while reading the config
+	 * @since 4.10
+	 */
+	@Nullable
+	protected byte[] readIncludedConfig(String relPath)
+			throws ConfigInvalidException {
+		return null;
+	}
+
+	private void addIncludedConfig(final List<ConfigLine> newEntries,
+			ConfigLine line, int depth) throws ConfigInvalidException {
+		if (!line.name.equals("path") || //$NON-NLS-1$
+				line.value == null || line.value.equals(MAGIC_EMPTY_VALUE)) {
+			throw new ConfigInvalidException(
+					JGitText.get().invalidLineInConfigFile);
+		}
+		byte[] bytes = readIncludedConfig(line.value);
+		if (bytes == null) {
+			return;
+		}
+
+		String decoded;
+		if (isUtf8(bytes)) {
+			decoded = RawParseUtils.decode(RawParseUtils.UTF8_CHARSET, bytes, 3,
+					bytes.length);
+		} else {
+			decoded = RawParseUtils.decode(bytes);
+		}
+		newEntries.addAll(fromTextRecurse(decoded, depth + 1));
+	}
+
 	private ConfigSnapshot newState() {
 		return new ConfigSnapshot(Collections.<ConfigLine> emptyList(),
 				getBaseState());
@@ -1191,10 +1290,9 @@
 		return name.toString();
 	}
 
-	private static String readValue(final StringReader in, boolean quote,
-			final int eol) throws ConfigInvalidException {
-		final StringBuilder value = new StringBuilder();
-		boolean space = false;
+	private static String readSubsectionName(StringReader in)
+			throws ConfigInvalidException {
+		StringBuilder r = new StringBuilder();
 		for (;;) {
 			int c = in.read();
 			if (c < 0) {
@@ -1202,30 +1300,81 @@
 			}
 
 			if ('\n' == c) {
-				if (quote)
-					throw new ConfigInvalidException(JGitText.get().newlineInQuotesNotAllowed);
+				throw new ConfigInvalidException(
+						JGitText.get().newlineInQuotesNotAllowed);
+			}
+			if ('\\' == c) {
+				c = in.read();
+				switch (c) {
+				case -1:
+					throw new ConfigInvalidException(JGitText.get().endOfFileInEscape);
+
+				case '\\':
+				case '"':
+					r.append((char) c);
+					continue;
+
+				default:
+					// C git simply drops backslashes if the escape sequence is not
+					// recognized.
+					r.append((char) c);
+					continue;
+				}
+			}
+			if ('"' == c) {
+				break;
+			}
+
+			r.append((char) c);
+		}
+		return r.toString();
+	}
+
+	private static String readValue(final StringReader in)
+			throws ConfigInvalidException {
+		StringBuilder value = new StringBuilder();
+		StringBuilder trailingSpaces = null;
+		boolean quote = false;
+		boolean inLeadingSpace = true;
+
+		for (;;) {
+			int c = in.read();
+			if (c < 0) {
+				break;
+			}
+			if ('\n' == c) {
+				if (quote) {
+					throw new ConfigInvalidException(
+							JGitText.get().newlineInQuotesNotAllowed);
+				}
 				in.reset();
 				break;
 			}
 
-			if (eol == c)
+			if (!quote && (';' == c || '#' == c)) {
+				if (trailingSpaces != null) {
+					trailingSpaces.setLength(0);
+				}
+				in.reset();
 				break;
-
-			if (!quote) {
-				if (Character.isWhitespace((char) c)) {
-					space = true;
-					continue;
-				}
-				if (';' == c || '#' == c) {
-					in.reset();
-					break;
-				}
 			}
 
-			if (space) {
-				if (value.length() > 0)
-					value.append(' ');
-				space = false;
+			char cc = (char) c;
+			if (Character.isWhitespace(cc)) {
+				if (inLeadingSpace) {
+					continue;
+				}
+				if (trailingSpaces == null) {
+					trailingSpaces = new StringBuilder();
+				}
+				trailingSpaces.append(cc);
+				continue;
+			} else {
+				inLeadingSpace = false;
+				if (trailingSpaces != null) {
+					value.append(trailingSpaces);
+					trailingSpaces.setLength(0);
+				}
 			}
 
 			if ('\\' == c) {
@@ -1262,7 +1411,7 @@
 				continue;
 			}
 
-			value.append((char) c);
+			value.append(cc);
 		}
 		return value.length() > 0 ? value.toString() : null;
 	}
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 8a49bdb..d5f1d8f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigLine.java
@@ -112,6 +112,7 @@
 		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 5bfccda..dad5871 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
@@ -55,7 +55,9 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.util.MutableInteger;
 
-/** Misc. constants used throughout JGit. */
+/**
+ * Misc. constants used throughout JGit.
+ */
 @SuppressWarnings("nls")
 public final class Constants {
 	/** Hash function used natively by Git for all objects. */
@@ -446,7 +448,7 @@
 	 * Create a new digest function for objects.
 	 *
 	 * @return a new digest object.
-	 * @throws RuntimeException
+	 * @throws java.lang.RuntimeException
 	 *             this Java virtual machine does not support the required hash
 	 *             function. Very unlikely given that JGit uses a hash function
 	 *             that is in the Java reference specification.
@@ -524,7 +526,7 @@
 	 *            <code>endMark</code> when the parse is successful.
 	 * @return a type code constant (one of {@link #OBJ_BLOB},
 	 *         {@link #OBJ_COMMIT}, {@link #OBJ_TAG}, {@link #OBJ_TREE}.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             there is no valid type identified by <code>typeString</code>.
 	 */
 	public static int decodeTypeString(final AnyObjectId id,
@@ -602,7 +604,7 @@
 	 *            127 (outside of 7-bit ASCII).
 	 * @return a byte array of the same length as the input string, holding the
 	 *         same characters, in the same order.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the input string contains one or more characters outside of
 	 *             the 7-bit ASCII character space.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java
index fdbbe39..32a894f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java
@@ -180,6 +180,8 @@
 	}
 
 	/**
+	 * Get the compression level to use when storing loose objects
+	 *
 	 * @return The compression level to use when storing loose objects
 	 */
 	public int getCompression() {
@@ -187,6 +189,8 @@
 	}
 
 	/**
+	 * Get the preferred pack index file format; 0 for oldest possible.
+	 *
 	 * @return the preferred pack index file format; 0 for oldest possible.
 	 */
 	public int getPackIndexVersion() {
@@ -194,6 +198,8 @@
 	}
 
 	/**
+	 * Whether to log all refUpdates
+	 *
 	 * @return whether to log all refUpdates
 	 */
 	public boolean isLogAllRefUpdates() {
@@ -201,6 +207,8 @@
 	}
 
 	/**
+	 * Get path of excludesfile
+	 *
 	 * @return path of excludesfile
 	 */
 	public String getExcludesFile() {
@@ -208,6 +216,8 @@
 	}
 
 	/**
+	 * Get path of attributesfile
+	 *
 	 * @return path of attributesfile
 	 * @since 3.7
 	 */
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 fd37747..68f881d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
@@ -57,13 +57,14 @@
 import org.eclipse.jgit.util.StringUtils;
 
 /**
- * An {@link TypedConfigGetter} that throws {@link IllegalArgumentException} on
- * invalid values.
+ * An {@link org.eclipse.jgit.lib.TypedConfigGetter} that throws
+ * {@link java.lang.IllegalArgumentException} on invalid values.
  *
  * @since 4.9
  */
 public class DefaultTypedConfigGetter implements TypedConfigGetter {
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean getBoolean(Config config, String section, String subsection,
 			String name, boolean defaultValue) {
@@ -82,6 +83,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public <T extends Enum<?>> T getEnum(Config config, T[] all, String section,
 			String subsection, String name, T defaultValue) {
@@ -139,6 +141,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int getInt(Config config, String section, String subsection,
 			String name, int defaultValue) {
@@ -150,6 +153,7 @@
 				.format(JGitText.get().integerValueOutOfRange, section, name));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getLong(Config config, String section, String subsection,
 			String name, long defaultValue) {
@@ -187,6 +191,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getTimeUnit(Config config, String section, String subsection,
 			String name, long defaultValue, TimeUnit wantUnit) {
@@ -286,6 +291,7 @@
 						section, name, valueString));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public @NonNull List<RefSpec> getRefSpecs(Config config, String section,
 			String subsection, String name) {
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 c236c35..8ae90c6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/EmptyProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/EmptyProgressMonitor.java
@@ -51,26 +51,31 @@
  */
 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/FileMode.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileMode.java
index edbc709..7852371 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileMode.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileMode.java
@@ -82,7 +82,9 @@
 	/** Bit pattern for {@link #TYPE_MASK} matching {@link #MISSING}. */
 	public static final int TYPE_MISSING = 0000000;
 
-	/** Mode indicating an entry is a tree (aka directory). */
+	/**
+	 * Mode indicating an entry is a tree (aka directory).
+	 */
 	public static final FileMode TREE = new FileMode(TYPE_TREE,
 			Constants.OBJ_TREE) {
 		@Override
@@ -197,9 +199,11 @@
 	}
 
 	/**
-	 * Test a file mode for equality with this {@link FileMode} object.
+	 * Test a file mode for equality with this
+	 * {@link org.eclipse.jgit.lib.FileMode} object.
 	 *
 	 * @param modebits
+	 *            a int.
 	 * @return true if the mode bits represent the same mode as this object
 	 */
 	public abstract boolean equals(final int modebits);
@@ -215,7 +219,7 @@
 	 *
 	 * @param os
 	 *            stream to copy the mode to.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream encountered an error during the copy.
 	 */
 	public void copyTo(final OutputStream os) throws IOException {
@@ -240,6 +244,8 @@
 	}
 
 	/**
+	 * Copy the number of bytes written by {@link #copyTo(OutputStream)}.
+	 *
 	 * @return the number of bytes written by {@link #copyTo(OutputStream)}.
 	 */
 	public int copyToLength() {
@@ -249,7 +255,7 @@
 	/**
 	 * Get the object type that should appear for this type of mode.
 	 * <p>
-	 * See the object type constants in {@link Constants}.
+	 * See the object type constants in {@link org.eclipse.jgit.lib.Constants}.
 	 *
 	 * @return one of the well known object type constants.
 	 */
@@ -257,13 +263,19 @@
 		return objectType;
 	}
 
-	/** Format this mode as an octal string (for debugging only). */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Format this mode as an octal string (for debugging only).
+	 */
 	@Override
 	public String toString() {
 		return Integer.toOctalString(modeBits);
 	}
 
 	/**
+	 * Get the mode bits as an integer.
+	 *
 	 * @return The mode bits as an integer.
 	 */
 	public int getBits() {
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 ea573a4..87086cb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
@@ -285,12 +285,13 @@
 	 * Construct an IndexDiff
 	 *
 	 * @param repository
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param revstr
-	 *            symbolic name e.g. HEAD
-	 *            An EmptyTreeIterator is used if <code>revstr</code> cannot be resolved.
+	 *            symbolic name e.g. HEAD An EmptyTreeIterator is used if
+	 *            <code>revstr</code> cannot be resolved.
 	 * @param workingTreeIterator
 	 *            iterator for working directory
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public IndexDiff(Repository repository, String revstr,
 			WorkingTreeIterator workingTreeIterator) throws IOException {
@@ -301,11 +302,12 @@
 	 * Construct an Indexdiff
 	 *
 	 * @param repository
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param objectId
 	 *            tree id. If null, an EmptyTreeIterator is used.
 	 * @param workingTreeIterator
 	 *            iterator for working directory
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public IndexDiff(Repository repository, ObjectId objectId,
 			WorkingTreeIterator workingTreeIterator) throws IOException {
@@ -321,6 +323,8 @@
 	}
 
 	/**
+	 * Defines how modifications in submodules are treated
+	 *
 	 * @param mode
 	 *            defines how modifications in submodules are treated
 	 * @since 3.6
@@ -336,7 +340,8 @@
 	public interface WorkingTreeIteratorFactory {
 		/**
 		 * @param repo
-		 * @return a WorkingTreeIterator for repo
+		 *            the repository
+		 * @return working tree iterator
 		 */
 		public WorkingTreeIterator getWorkingTreeIterator(Repository repo);
 	}
@@ -363,6 +368,7 @@
 	 * files.
 	 *
 	 * @param filter
+	 *            a {@link org.eclipse.jgit.treewalk.filter.TreeFilter} object.
 	 */
 	public void setFilter(TreeFilter filter) {
 		this.filter = filter;
@@ -374,7 +380,7 @@
 	 * monitor is required.
 	 *
 	 * @return if anything is different between index, tree, and workdir
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public boolean diff() throws IOException {
 		return diff(null, 0, 0, ""); //$NON-NLS-1$
@@ -396,10 +402,9 @@
 	 *            number or estimated files in the working tree
 	 * @param estIndexSize
 	 *            number of estimated entries in the cache
-	 * @param title
-	 *
+	 * @param title a {@link java.lang.String} object.
 	 * @return if anything is different between index, tree, and workdir
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize,
 			int estIndexSize, final String title)
@@ -533,11 +538,9 @@
 							.equals(localIgnoreSubmoduleMode))
 						continue;
 				} catch (ConfigInvalidException e) {
-					IOException e1 = new IOException(MessageFormat.format(
+					throw new IOException(MessageFormat.format(
 							JGitText.get().invalidIgnoreParamSubmodule,
-							smw.getPath()));
-					e1.initCause(e);
-					throw e1;
+							smw.getPath()), e);
 				}
 				Repository subRepo = smw.getRepository();
 				if (subRepo != null) {
@@ -621,6 +624,8 @@
 	}
 
 	/**
+	 * Get list of files added to the index, not in the tree
+	 *
 	 * @return list of files added to the index, not in the tree
 	 */
 	public Set<String> getAdded() {
@@ -628,6 +633,8 @@
 	}
 
 	/**
+	 * Get list of files changed from tree to index
+	 *
 	 * @return list of files changed from tree to index
 	 */
 	public Set<String> getChanged() {
@@ -635,6 +642,8 @@
 	}
 
 	/**
+	 * Get list of files removed from index, but in tree
+	 *
 	 * @return list of files removed from index, but in tree
 	 */
 	public Set<String> getRemoved() {
@@ -642,6 +651,8 @@
 	}
 
 	/**
+	 * Get list of files in index, but not filesystem
+	 *
 	 * @return list of files in index, but not filesystem
 	 */
 	public Set<String> getMissing() {
@@ -649,6 +660,8 @@
 	}
 
 	/**
+	 * Get list of files modified on disk relative to the index
+	 *
 	 * @return list of files modified on disk relative to the index
 	 */
 	public Set<String> getModified() {
@@ -656,6 +669,8 @@
 	}
 
 	/**
+	 * Get list of files that are not ignored, and not in the index.
+	 *
 	 * @return list of files that are not ignored, and not in the index.
 	 */
 	public Set<String> getUntracked() {
@@ -663,6 +678,9 @@
 	}
 
 	/**
+	 * Get list of files that are in conflict, corresponds to the keys of
+	 * {@link #getConflictingStageStates()}
+	 *
 	 * @return list of files that are in conflict, corresponds to the keys of
 	 *         {@link #getConflictingStageStates()}
 	 */
@@ -671,8 +689,11 @@
 	}
 
 	/**
+	 * Get the map from each path of {@link #getConflicting()} to its
+	 * corresponding {@link org.eclipse.jgit.lib.IndexDiff.StageState}
+	 *
 	 * @return the map from each path of {@link #getConflicting()} to its
-	 *         corresponding {@link StageState}
+	 *         corresponding {@link org.eclipse.jgit.lib.IndexDiff.StageState}
 	 * @since 3.0
 	 */
 	public Map<String, StageState> getConflictingStageStates() {
@@ -693,6 +714,8 @@
 	}
 
 	/**
+	 * Get list of files with the flag assume-unchanged
+	 *
 	 * @return list of files with the flag assume-unchanged
 	 */
 	public Set<String> getAssumeUnchanged() {
@@ -707,6 +730,8 @@
 	}
 
 	/**
+	 * Get list of folders containing only untracked files/folders
+	 *
 	 * @return list of folders containing only untracked files/folders
 	 */
 	public Set<String> getUntrackedFolders() {
@@ -717,7 +742,7 @@
 	/**
 	 * Get the file mode of the given path in the index
 	 *
-	 * @param path
+	 * @param path a {@link java.lang.String} object.
 	 * @return file mode
 	 */
 	public FileMode getIndexMode(final String path) {
@@ -729,7 +754,7 @@
 	 * Get the list of paths that IndexDiff has detected to differ and have the
 	 * given file mode
 	 *
-	 * @param mode
+	 * @param mode a {@link org.eclipse.jgit.lib.FileMode} object.
 	 * @return the list of paths that IndexDiff has detected to differ and have
 	 *         the given file mode
 	 * @since 3.6
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java
index f9517a0..a97721c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java
@@ -46,7 +46,9 @@
 
 import java.util.zip.Inflater;
 
-/** Creates zlib based inflaters as necessary for object decompression. */
+/**
+ * Creates zlib based inflaters as necessary for object decompression.
+ */
 public class InflaterCache {
 	private static final int SZ = 4;
 
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 4b14d12..e492af9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/MutableObjectId.java
@@ -79,15 +79,17 @@
 	 *
 	 * @param index
 	 *            index of the byte to set in the raw form of the ObjectId. Must
-	 *            be in range [0, {@link Constants#OBJECT_ID_LENGTH}).
+	 *            be in range [0,
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJECT_ID_LENGTH}).
 	 * @param value
 	 *            the value of the specified byte at {@code index}. Values are
 	 *            unsigned and thus are in the range [0,255] rather than the
 	 *            signed byte range of [-128, 127].
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             {@code index} is less than 0, equal to
-	 *             {@link Constants#OBJECT_ID_LENGTH}, or greater than
-	 *             {@link Constants#OBJECT_ID_LENGTH}.
+	 *             {@link org.eclipse.jgit.lib.Constants#OBJECT_ID_LENGTH}, or
+	 *             greater than
+	 *             {@link org.eclipse.jgit.lib.Constants#OBJECT_ID_LENGTH}.
 	 */
 	public void setByte(int index, int value) {
 		switch (index >> 2) {
@@ -128,7 +130,9 @@
 		}
 	}
 
-	/** Make this id match {@link ObjectId#zeroId()}. */
+	/**
+	 * Make this id match {@link org.eclipse.jgit.lib.ObjectId#zeroId()}.
+	 */
 	public void clear() {
 		w1 = 0;
 		w2 = 0;
@@ -198,7 +202,6 @@
 	 *            must be available within this integers array.
 	 * @param p
 	 *            position to read the first integer of data from.
-	 *
 	 */
 	public void fromRaw(final int[] ints, final int p) {
 		w1 = ints[p];
@@ -212,10 +215,15 @@
 	 * Convert an ObjectId from binary representation expressed in integers.
 	 *
 	 * @param a
+	 *            an int.
 	 * @param b
+	 *            an int.
 	 * @param c
+	 *            an int.
 	 * @param d
+	 *            an int.
 	 * @param e
+	 *            an int.
 	 * @since 4.7
 	 */
 	public void set(int a, int b, int c, int d, int e) {
@@ -265,6 +273,7 @@
 		}
 	}
 
+	/** {@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 497beb0..37fcd78 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/NullProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/NullProgressMonitor.java
@@ -56,26 +56,31 @@
 		// 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/ObjectChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
index 6cc2afa..5c14754 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
@@ -325,12 +325,12 @@
 	 *
 	 * @param objType
 	 *            type of the object. Must be a valid object type code in
-	 *            {@link Constants}.
+	 *            {@link org.eclipse.jgit.lib.Constants}.
 	 * @param raw
 	 *            the raw data which comprises the object. This should be in the
 	 *            canonical format (that is the format used to generate the
 	 *            ObjectId of the object). The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if an error is identified.
 	 */
 	public void check(int objType, byte[] raw)
@@ -345,12 +345,12 @@
 	 *            identify of the object being checked.
 	 * @param objType
 	 *            type of the object. Must be a valid object type code in
-	 *            {@link Constants}.
+	 *            {@link org.eclipse.jgit.lib.Constants}.
 	 * @param raw
 	 *            the raw data which comprises the object. This should be in the
 	 *            canonical format (that is the format used to generate the
 	 *            ObjectId of the object). The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if an error is identified.
 	 * @since 4.2
 	 */
@@ -457,7 +457,7 @@
 	 *
 	 * @param raw
 	 *            the commit data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 */
 	public void checkCommit(byte[] raw) throws CorruptObjectException {
@@ -471,7 +471,7 @@
 	 *            identity of the object being checked.
 	 * @param raw
 	 *            the commit data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 * @since 4.2
 	 */
@@ -511,7 +511,7 @@
 	 *
 	 * @param raw
 	 *            the tag data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 */
 	public void checkTag(byte[] raw) throws CorruptObjectException {
@@ -525,7 +525,7 @@
 	 *            identity of the object being checked.
 	 * @param raw
 	 *            the tag data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 * @since 4.2
 	 */
@@ -601,7 +601,7 @@
 	 *
 	 * @param raw
 	 *            the raw tree data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 */
 	public void checkTree(byte[] raw) throws CorruptObjectException {
@@ -615,7 +615,7 @@
 	 *            identity of the object being checked.
 	 * @param raw
 	 *            the raw tree data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 * @since 4.2
 	 */
@@ -753,11 +753,13 @@
 	/**
 	 * Check tree path entry for validity.
 	 * <p>
-	 * Unlike {@link #checkPathSegment(byte[], int, int)}, this version
-	 * scans a multi-directory path string such as {@code "src/main.c"}.
+	 * Unlike {@link #checkPathSegment(byte[], int, int)}, this version scans a
+	 * multi-directory path string such as {@code "src/main.c"}.
 	 *
-	 * @param path path string to scan.
-	 * @throws CorruptObjectException path is invalid.
+	 * @param path
+	 *            path string to scan.
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             path is invalid.
 	 * @since 3.6
 	 */
 	public void checkPath(String path) throws CorruptObjectException {
@@ -768,13 +770,17 @@
 	/**
 	 * Check tree path entry for validity.
 	 * <p>
-	 * Unlike {@link #checkPathSegment(byte[], int, int)}, this version
-	 * scans a multi-directory path string such as {@code "src/main.c"}.
+	 * Unlike {@link #checkPathSegment(byte[], int, int)}, this version scans a
+	 * multi-directory path string such as {@code "src/main.c"}.
 	 *
-	 * @param raw buffer to scan.
-	 * @param ptr offset to first byte of the name.
-	 * @param end offset to one past last byte of name.
-	 * @throws CorruptObjectException path is invalid.
+	 * @param raw
+	 *            buffer to scan.
+	 * @param ptr
+	 *            offset to first byte of the name.
+	 * @param end
+	 *            offset to one past last byte of name.
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             path is invalid.
 	 * @since 3.6
 	 */
 	public void checkPath(byte[] raw, int ptr, int end)
@@ -792,10 +798,14 @@
 	/**
 	 * Check tree path entry for validity.
 	 *
-	 * @param raw buffer to scan.
-	 * @param ptr offset to first byte of the name.
-	 * @param end offset to one past last byte of name.
-	 * @throws CorruptObjectException name is invalid.
+	 * @param raw
+	 *            buffer to scan.
+	 * @param ptr
+	 *            offset to first byte of the name.
+	 * @param end
+	 *            offset to one past last byte of name.
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 *             name is invalid.
 	 * @since 3.4
 	 */
 	public void checkPathSegment(byte[] raw, int ptr, int end)
@@ -1198,7 +1208,7 @@
 	}
 
 	/**
-	 * Create a new {@link BlobObjectChecker}.
+	 * Create a new {@link org.eclipse.jgit.lib.BlobObjectChecker}.
 	 *
 	 * @return new BlobObjectChecker or null if it's not provided.
 	 * @since 4.9
@@ -1211,12 +1221,13 @@
 	/**
 	 * Check a blob for errors.
 	 *
-	 * <p>This may not be called from PackParser in some cases. Use {@link
-	 * #newBlobObjectChecker} instead.
+	 * <p>
+	 * This may not be called from PackParser in some cases. Use
+	 * {@link #newBlobObjectChecker} instead.
 	 *
 	 * @param raw
 	 *            the blob data. The array is never modified.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             if any error was detected.
 	 */
 	public void checkBlob(final byte[] raw) throws CorruptObjectException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java
index 2abd6da..bbef51d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java
@@ -52,10 +52,12 @@
  * Abstraction of arbitrary object storage.
  * <p>
  * An object database stores one or more Git objects, indexed by their unique
- * {@link ObjectId}.
+ * {@link org.eclipse.jgit.lib.ObjectId}.
  */
 public abstract class ObjectDatabase {
-	/** Initialize a new database instance for access. */
+	/**
+	 * Initialize a new database instance for access.
+	 */
 	protected ObjectDatabase() {
 		// Protected to force extension.
 	}
@@ -73,7 +75,7 @@
 	/**
 	 * Initialize a new object database at this location.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database could not be created.
 	 */
 	public void create() throws IOException {
@@ -116,7 +118,7 @@
 	 * @param objectId
 	 *            identity of the object to test for existence of.
 	 * @return true if the specified object is stored in this database.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public boolean has(final AnyObjectId objectId) throws IOException {
@@ -133,10 +135,10 @@
 	 *
 	 * @param objectId
 	 *            identity of the object to open.
-	 * @return a {@link ObjectLoader} for accessing the object.
+	 * @return a {@link org.eclipse.jgit.lib.ObjectLoader} for accessing the object.
 	 * @throws MissingObjectException
 	 *             the object does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public ObjectLoader open(final AnyObjectId objectId)
@@ -154,16 +156,17 @@
 	 *            identity of the object to open.
 	 * @param typeHint
 	 *            hint about the type of object being requested, e.g.
-	 *            {@link Constants#OBJ_BLOB}; {@link ObjectReader#OBJ_ANY} if
-	 *            the object type is not known, or does not matter to the
-	 *            caller.
-	 * @return a {@link ObjectLoader} for accessing the object.
-	 * @throws MissingObjectException
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB};
+	 *            {@link org.eclipse.jgit.lib.ObjectReader#OBJ_ANY} if the
+	 *            object type is not known, or does not matter to the caller.
+	 * @return a {@link org.eclipse.jgit.lib.ObjectLoader} for accessing the
+	 *         object.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             typeHint was not OBJ_ANY, and the object's actual type does
 	 *             not match typeHint.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public ObjectLoader open(AnyObjectId objectId, int typeHint)
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 991f03f..0e85545 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
@@ -252,10 +252,15 @@
 	 * Construct an ObjectId from 160 bits provided in 5 words.
 	 *
 	 * @param new_1
+	 *            an int
 	 * @param new_2
+	 *            an int
 	 * @param new_3
+	 *            an int
 	 * @param new_4
+	 *            an int
 	 * @param new_5
+	 *            an int
 	 * @since 4.7
 	 */
 	public ObjectId(int new_1, int new_2, int new_3, int new_4, int new_5) {
@@ -284,6 +289,7 @@
 		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 95cb976..03a430c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java
@@ -48,10 +48,12 @@
 import java.util.NoSuchElementException;
 
 /**
- * Fast, efficient map for {@link ObjectId} subclasses in only one map.
+ * Fast, efficient map for {@link org.eclipse.jgit.lib.ObjectId} subclasses in
+ * only one map.
  * <p>
  * To use this map type, applications must have their entry value type extend
- * from {@link ObjectIdOwnerMap.Entry}, which itself extends from ObjectId.
+ * from {@link org.eclipse.jgit.lib.ObjectIdOwnerMap.Entry}, which itself
+ * extends from ObjectId.
  * <p>
  * Object instances may only be stored in <b>ONE</b> ObjectIdOwnerMap. This
  * restriction exists because the map stores internal map state within each
@@ -59,10 +61,11 @@
  * could corrupt one or both map's internal state.
  * <p>
  * If an object instance must be in more than one map, applications may use
- * ObjectIdOwnerMap for one of the maps, and {@link ObjectIdSubclassMap} for the
- * other map(s). It is encouraged to use ObjectIdOwnerMap for the map that is
- * accessed most often, as this implementation runs faster than the more general
- * ObjectIdSubclassMap implementation.
+ * ObjectIdOwnerMap for one of the maps, and
+ * {@link org.eclipse.jgit.lib.ObjectIdSubclassMap} for the other map(s). It is
+ * encouraged to use ObjectIdOwnerMap for the map that is accessed most often,
+ * as this implementation runs faster than the more general ObjectIdSubclassMap
+ * implementation.
  *
  * @param <V>
  *            type of subclass of ObjectId that will be stored in the map.
@@ -97,7 +100,9 @@
 	/** Low bit mask to index into {@link #directory}, {@code 2^bits-1}. */
 	private int mask;
 
-	/** Create an empty map. */
+	/**
+	 * Create an empty map.
+	 */
 	@SuppressWarnings("unchecked")
 	public ObjectIdOwnerMap() {
 		bits = 0;
@@ -108,7 +113,9 @@
 		directory[0] = newSegment();
 	}
 
-	/** Remove all entries from this map. */
+	/**
+	 * Remove all entries from this map.
+	 */
 	public void clear() {
 		size = 0;
 
@@ -137,11 +144,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Returns true if this map contains the specified object.
-	 *
-	 * @param toFind
-	 *            object to find.
-	 * @return true if the mapping exists for this object; false otherwise.
 	 */
 	@Override
 	public boolean contains(final AnyObjectId toFind) {
@@ -157,8 +162,6 @@
 	 *
 	 * @param newValue
 	 *            the object to store.
-	 * @param <Q>
-	 *            type of instance to store.
 	 */
 	public <Q extends V> void add(final Q newValue) {
 		if (++size == grow)
@@ -189,8 +192,6 @@
 	 * @return {@code newValue} if stored, or the prior value already stored and
 	 *         that would have been returned had the caller used
 	 *         {@code get(newValue)} first.
-	 * @param <Q>
-	 *            type of instance to store.
 	 */
 	@SuppressWarnings("unchecked")
 	public <Q extends V> V addIfAbsent(final Q newValue) {
@@ -210,16 +211,25 @@
 		return newValue;
 	}
 
-	/** @return number of objects in this map. */
+	/**
+	 * Get number of objects in this map.
+	 *
+	 * @return number of objects in this map.
+	 */
 	public int size() {
 		return size;
 	}
 
-	/** @return true if {@link #size()} is 0. */
+	/**
+	 * Whether this map is empty
+	 *
+	 * @return true if {@link #size()} is 0.
+	 */
 	public boolean isEmpty() {
 		return size == 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Iterator<V> iterator() {
 		return new Iterator<V>() {
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 636716b..22aaa3a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
@@ -47,7 +47,10 @@
 import org.eclipse.jgit.annotations.NonNull;
 import org.eclipse.jgit.annotations.Nullable;
 
-/** A {@link Ref} that points directly at an {@link ObjectId}. */
+/**
+ * A {@link org.eclipse.jgit.lib.Ref} that points directly at an
+ * {@link org.eclipse.jgit.lib.ObjectId}.
+ */
 public abstract class ObjectIdRef implements Ref {
 	/** Any reference whose peeled value is not yet known. */
 	public static class Unpeeled extends ObjectIdRef {
@@ -167,41 +170,48 @@
 		this.objectId = id;
 	}
 
+	/** {@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() {
 		return storage;
 	}
 
+	/** {@inheritDoc} */
 	@NonNull
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSet.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSet.java
index 0b58484..51bd902 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSet.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSet.java
@@ -48,7 +48,8 @@
  * <p>
  * Usually backed by a read-only data structure such as
  * {@link org.eclipse.jgit.internal.storage.file.PackIndex}. Mutable types like
- * {@link ObjectIdOwnerMap} also implement the interface by checking keys.
+ * {@link org.eclipse.jgit.lib.ObjectIdOwnerMap} also implement the interface by
+ * checking keys.
  *
  * @since 4.2
  */
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 43fc7bf..001aa9c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
@@ -49,13 +49,15 @@
 import java.util.NoSuchElementException;
 
 /**
- * Fast, efficient map specifically for {@link ObjectId} subclasses.
+ * Fast, efficient map specifically for {@link org.eclipse.jgit.lib.ObjectId}
+ * subclasses.
  * <p>
  * This map provides an efficient translation from any ObjectId instance to a
  * cached subclass of ObjectId that has the same value.
  * <p>
- * If object instances are stored in only one map, {@link ObjectIdOwnerMap} is a
- * more efficient implementation.
+ * If object instances are stored in only one map,
+ * {@link org.eclipse.jgit.lib.ObjectIdOwnerMap} is a more efficient
+ * implementation.
  *
  * @param <V>
  *            type of subclass of ObjectId that will be stored in the map.
@@ -72,12 +74,16 @@
 
 	V[] table;
 
-	/** Create an empty map. */
+	/**
+	 * Create an empty map.
+	 */
 	public ObjectIdSubclassMap() {
 		initTable(INITIAL_TABLE_SIZE);
 	}
 
-	/** Remove all entries from this map. */
+	/**
+	 * Remove all entries from this map.
+	 */
 	public void clear() {
 		size = 0;
 		initTable(INITIAL_TABLE_SIZE);
@@ -105,11 +111,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Returns true if this map contains the specified object.
-	 *
-	 * @param toFind
-	 *            object to find.
-	 * @return true if the mapping exists for this object; false otherwise.
 	 */
 	@Override
 	public boolean contains(final AnyObjectId toFind) {
@@ -126,8 +130,6 @@
 	 *
 	 * @param newValue
 	 *            the object to store.
-	 * @param <Q>
-	 *            type of instance to store.
 	 */
 	public <Q extends V> void add(final Q newValue) {
 		if (++size == grow)
@@ -152,8 +154,6 @@
 	 * @return {@code newValue} if stored, or the prior value already stored and
 	 *         that would have been returned had the caller used
 	 *         {@code get(newValue)} first.
-	 * @param <Q>
-	 *            type of instance to store.
 	 */
 	public <Q extends V> V addIfAbsent(final Q newValue) {
 		final int msk = mask;
@@ -177,17 +177,24 @@
 	}
 
 	/**
+	 * Get number of objects in map
+	 *
 	 * @return number of objects in map
 	 */
 	public int size() {
 		return size;
 	}
 
-	/** @return true if {@link #size()} is 0. */
+	/**
+	 * Whether {@link #size()} is 0.
+	 *
+	 * @return true if {@link #size()} is 0.
+	 */
 	public boolean isEmpty() {
 		return size == 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Iterator<V> iterator() {
 		return new Iterator<V>() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
index b2ffbe6..40522ba 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
@@ -182,7 +182,9 @@
 	/** Temporary working buffer for streaming data through. */
 	private byte[] tempBuffer;
 
-	/** Create a new inserter for a database. */
+	/**
+	 * Create a new inserter for a database.
+	 */
 	protected ObjectInserter() {
 	}
 
@@ -218,6 +220,8 @@
 	}
 
 	/**
+	 * Compute digest to help compute an ObjectId
+	 *
 	 * @return digest to help compute an ObjectId
 	 * @since 4.7
 	 */
@@ -272,7 +276,7 @@
 	 *            stream providing the object content. The caller is responsible
 	 *            for closing the stream.
 	 * @return the name of the object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the source stream could not be read.
 	 */
 	public ObjectId idFor(int objectType, long length, InputStream in)
@@ -297,6 +301,7 @@
 	 * Compute the ObjectId for the given tree without inserting it.
 	 *
 	 * @param formatter
+	 *            a {@link org.eclipse.jgit.lib.TreeFormatter} object.
 	 * @return the computed ObjectId
 	 */
 	public ObjectId idFor(TreeFormatter formatter) {
@@ -309,7 +314,7 @@
 	 * @param formatter
 	 *            the formatter containing the proposed tree's data.
 	 * @return the name of the tree object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be stored.
 	 */
 	public final ObjectId insert(TreeFormatter formatter) throws IOException {
@@ -325,7 +330,7 @@
 	 * @param builder
 	 *            the builder containing the proposed commit's data.
 	 * @return the name of the commit object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be stored.
 	 */
 	public final ObjectId insert(CommitBuilder builder) throws IOException {
@@ -338,7 +343,7 @@
 	 * @param builder
 	 *            the builder containing the proposed tag's data.
 	 * @return the name of the tag object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be stored.
 	 */
 	public final ObjectId insert(TagBuilder builder) throws IOException {
@@ -353,7 +358,7 @@
 	 * @param data
 	 *            complete content of the object.
 	 * @return the name of the object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be stored.
 	 */
 	public ObjectId insert(final int type, final byte[] data)
@@ -373,7 +378,7 @@
 	 * @param len
 	 *            number of bytes to copy from {@code data}.
 	 * @return the name of the object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be stored.
 	 */
 	public ObjectId insert(int type, byte[] data, int off, int len)
@@ -392,7 +397,7 @@
 	 *            stream providing the object content. The caller is responsible
 	 *            for closing the stream.
 	 * @return the name of the object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be stored, or the source stream could
 	 *             not be read.
 	 */
@@ -406,7 +411,7 @@
 	 *            the input stream. The stream is not closed by the parser, and
 	 *            must instead be closed by the caller once parsing is complete.
 	 * @return the pack parser.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the parser instance, which can be configured and then used to
 	 *             parse objects into the ObjectDatabase.
 	 */
@@ -443,13 +448,15 @@
 	 * The flush may take some period of time to make the objects available to
 	 * other threads.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the flush could not be completed; objects inserted thus far
 	 *             are in an indeterminate state.
 	 */
 	public abstract void flush() throws IOException;
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release any resources used by this inserter.
 	 * <p>
 	 * An inserter that has been released can be used again, but may need to be
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java
index b2cc294..432f5a6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java
@@ -61,16 +61,23 @@
  */
 public abstract class ObjectLoader {
 	/**
-	 * @return Git in pack object type, see {@link Constants}.
+	 * Get Git in pack object type
+	 *
+	 * @return Git in pack object type, see
+	 *         {@link org.eclipse.jgit.lib.Constants}.
 	 */
 	public abstract int getType();
 
 	/**
+	 * Get size of object in bytes
+	 *
 	 * @return size of object in bytes
 	 */
 	public abstract long getSize();
 
 	/**
+	 * Whether this object is too large to obtain as a byte array.
+	 *
 	 * @return true if this object is too large to obtain as a byte array.
 	 *         Objects over a certain threshold should be accessed only by their
 	 *         {@link #openStream()} to prevent overflowing the JVM heap.
@@ -91,7 +98,7 @@
 	 * be modified by the caller.
 	 *
 	 * @return the bytes of this object.
-	 * @throws LargeObjectException
+	 * @throws org.eclipse.jgit.errors.LargeObjectException
 	 *             if the object won't fit into a byte array, because
 	 *             {@link #isLarge()} returns true. Callers should use
 	 *             {@link #openStream()} instead to access the contents.
@@ -113,16 +120,18 @@
 	 *
 	 * @param sizeLimit
 	 *            maximum number of bytes to return. If the object is larger
-	 *            than this limit, {@link LargeObjectException} will be thrown.
+	 *            than this limit,
+	 *            {@link org.eclipse.jgit.errors.LargeObjectException} will be
+	 *            thrown.
 	 * @return the bytes of this object.
-	 * @throws LargeObjectException
+	 * @throws org.eclipse.jgit.errors.LargeObjectException
 	 *             if the object is bigger than {@code sizeLimit}, or if
-	 *             {@link OutOfMemoryError} occurs during allocation of the
-	 *             result array. Callers should use {@link #openStream()}
+	 *             {@link java.lang.OutOfMemoryError} occurs during allocation
+	 *             of the result array. Callers should use {@link #openStream()}
 	 *             instead to access the contents.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object is large, and it no longer exists.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public final byte[] getBytes(int sizeLimit) throws LargeObjectException,
@@ -144,7 +153,7 @@
 	 * Changes (if made) will affect the cache but not the repository itself.
 	 *
 	 * @return the cached bytes of this object. Do not modify it.
-	 * @throws LargeObjectException
+	 * @throws org.eclipse.jgit.errors.LargeObjectException
 	 *             if the object won't fit into a byte array, because
 	 *             {@link #isLarge()} returns true. Callers should use
 	 *             {@link #openStream()} instead to access the contents.
@@ -167,16 +176,17 @@
 	 * @param sizeLimit
 	 *            maximum number of bytes to return. If the object size is
 	 *            larger than this limit and {@link #isLarge()} is true,
-	 *            {@link LargeObjectException} will be thrown.
+	 *            {@link org.eclipse.jgit.errors.LargeObjectException} will be
+	 *            thrown.
 	 * @return the cached bytes of this object. Do not modify it.
-	 * @throws LargeObjectException
+	 * @throws org.eclipse.jgit.errors.LargeObjectException
 	 *             if the object is bigger than {@code sizeLimit}, or if
-	 *             {@link OutOfMemoryError} occurs during allocation of the
-	 *             result array. Callers should use {@link #openStream()}
+	 *             {@link java.lang.OutOfMemoryError} occurs during allocation
+	 *             of the result array. Callers should use {@link #openStream()}
 	 *             instead to access the contents.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object is large, and it no longer exists.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public byte[] getCachedBytes(int sizeLimit) throws LargeObjectException,
@@ -213,9 +223,9 @@
 	 * @return a stream of this object's data. Caller must close the stream when
 	 *         through with it. The returned stream is buffered with a
 	 *         reasonable buffer size.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object no longer exists.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public abstract ObjectStream openStream() throws MissingObjectException,
@@ -236,9 +246,9 @@
 	 *            stream to receive the complete copy of this object's data.
 	 *            Caller is responsible for flushing or closing this stream
 	 *            after this method returns.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object no longer exists.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed, or the stream cannot be
 	 *             written to.
 	 */
@@ -323,4 +333,42 @@
 			return new ObjectStream.SmallStream(this);
 		}
 	}
+
+	/**
+	 * Wraps a delegate ObjectLoader.
+	 *
+	 * @since 4.10
+	 */
+	public static abstract class Filter extends ObjectLoader {
+		/**
+		 * @return delegate ObjectLoader to handle all processing.
+		 * @since 4.10
+		 */
+		protected abstract ObjectLoader delegate();
+
+		@Override
+		public int getType() {
+			return delegate().getType();
+		}
+
+		@Override
+		public long getSize() {
+			return delegate().getSize();
+		}
+
+		@Override
+		public boolean isLarge() {
+			return delegate().isLarge();
+		}
+
+		@Override
+		public byte[] getCachedBytes() {
+			return delegate().getCachedBytes();
+		}
+
+		@Override
+		public ObjectStream openStream() throws IOException {
+			return delegate().openStream();
+		}
+	}
 }
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 f39f291..700b9db 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java
@@ -53,13 +53,13 @@
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs;
 
 /**
- * Reads an {@link ObjectDatabase} for a single thread.
+ * Reads an {@link org.eclipse.jgit.lib.ObjectDatabase} for a single thread.
  * <p>
  * Readers that can support efficient reuse of pack encoded objects should also
- * implement the companion interface {@link ObjectReuseAsIs}.
+ * implement the companion interface
+ * {@link org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs}.
  */
 public abstract class ObjectReader implements AutoCloseable {
 	/** Type hint indicating the caller doesn't know the type. */
@@ -95,7 +95,7 @@
 	 * @param objectId
 	 *            object identity that needs to be abbreviated.
 	 * @return SHA-1 abbreviation.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be read.
 	 */
 	public AbbreviatedObjectId abbreviate(AnyObjectId objectId)
@@ -122,7 +122,7 @@
 	 *            [2, {@value Constants#OBJECT_ID_STRING_LENGTH}].
 	 * @return SHA-1 abbreviation. If no matching objects exist in the
 	 *         repository, the abbreviation will match the minimum length.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be read.
 	 */
 	public AbbreviatedObjectId abbreviate(AnyObjectId objectId, int len)
@@ -174,7 +174,7 @@
 	 *            abbreviated id to resolve to a complete identity. The
 	 *            abbreviation must have a length of at least 2.
 	 * @return candidates that begin with the abbreviated identity.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be read.
 	 */
 	public abstract Collection<ObjectId> resolve(AbbreviatedObjectId id)
@@ -186,7 +186,7 @@
 	 * @param objectId
 	 *            identity of the object to test for existence of.
 	 * @return true if the specified object is stored in this database.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public boolean has(AnyObjectId objectId) throws IOException {
@@ -200,13 +200,14 @@
 	 *            identity of the object to test for existence of.
 	 * @param typeHint
 	 *            hint about the type of object being requested, e.g.
-	 *            {@link Constants#OBJ_BLOB}; {@link #OBJ_ANY} if the object
-	 *            type is not known, or does not matter to the caller.
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB};
+	 *            {@link #OBJ_ANY} if the object type is not known, or does not
+	 *            matter to the caller.
 	 * @return true if the specified object is stored in this database.
 	 * @throws IncorrectObjectTypeException
 	 *             typeHint was not OBJ_ANY, and the object's actual type does
 	 *             not match typeHint.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public boolean has(AnyObjectId objectId, int typeHint) throws IOException {
@@ -223,10 +224,11 @@
 	 *
 	 * @param objectId
 	 *            identity of the object to open.
-	 * @return a {@link ObjectLoader} for accessing the object.
-	 * @throws MissingObjectException
+	 * @return a {@link org.eclipse.jgit.lib.ObjectLoader} for accessing the
+	 *         object.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public ObjectLoader open(AnyObjectId objectId)
@@ -241,15 +243,17 @@
 	 *            identity of the object to open.
 	 * @param typeHint
 	 *            hint about the type of object being requested, e.g.
-	 *            {@link Constants#OBJ_BLOB}; {@link #OBJ_ANY} if the object
-	 *            type is not known, or does not matter to the caller.
-	 * @return a {@link ObjectLoader} for accessing the object.
-	 * @throws MissingObjectException
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB};
+	 *            {@link #OBJ_ANY} if the object type is not known, or does not
+	 *            matter to the caller.
+	 * @return a {@link org.eclipse.jgit.lib.ObjectLoader} for accessing the
+	 *         object.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             typeHint was not OBJ_ANY, and the object's actual type does
 	 *             not match typeHint.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public abstract ObjectLoader open(AnyObjectId objectId, int typeHint)
@@ -260,15 +264,13 @@
 	 * Returns IDs for those commits which should be considered as shallow.
 	 *
 	 * @return IDs of shallow commits
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public abstract Set<ObjectId> getShallowCommits() throws IOException;
 
 	/**
 	 * Asynchronous object opening.
 	 *
-	 * @param <T>
-	 *            type of identifier being supplied.
 	 * @param objectIds
 	 *            objects to open from the object store. The supplied collection
 	 *            must not be modified until the queue has finished.
@@ -335,15 +337,16 @@
 	 *            identity of the object to open.
 	 * @param typeHint
 	 *            hint about the type of object being requested, e.g.
-	 *            {@link Constants#OBJ_BLOB}; {@link #OBJ_ANY} if the object
-	 *            type is not known, or does not matter to the caller.
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB};
+	 *            {@link #OBJ_ANY} if the object type is not known, or does not
+	 *            matter to the caller.
 	 * @return size of object in bytes.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             typeHint was not OBJ_ANY, and the object's actual type does
 	 *             not match typeHint.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public long getObjectSize(AnyObjectId objectId, int typeHint)
@@ -355,8 +358,6 @@
 	/**
 	 * Asynchronous object size lookup.
 	 *
-	 * @param <T>
-	 *            type of identifier being supplied.
 	 * @param objectIds
 	 *            objects to get the size of from the object store. The supplied
 	 *            collection must not be modified until the queue has finished.
@@ -433,7 +434,7 @@
 	 * An index that can be used to speed up ObjectWalks.
 	 *
 	 * @return the index or null if one does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when the index fails to load
 	 * @since 3.0
 	 */
@@ -442,9 +443,12 @@
 	}
 
 	/**
-	 * @return the {@link ObjectInserter} from which this reader was created
-	 *         using {@code inserter.newReader()}, or null if this reader was not
-	 *         created from an inserter.
+	 * Get the {@link org.eclipse.jgit.lib.ObjectInserter} from which this
+	 * reader was created using {@code inserter.newReader()}
+	 *
+	 * @return the {@link org.eclipse.jgit.lib.ObjectInserter} from which this
+	 *         reader was created using {@code inserter.newReader()}, or null if
+	 *         this reader was not created from an inserter.
 	 * @since 4.4
 	 */
 	@Nullable
@@ -453,6 +457,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release any resources used by this reader.
 	 * <p>
 	 * A reader that has been released can be used again, but may need to be
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectStream.java
index 4b3fe6a..ad123c4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectStream.java
@@ -46,12 +46,22 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-/** Stream of data coming from an object loaded by {@link ObjectLoader}. */
+/**
+ * Stream of data coming from an object loaded by {@link org.eclipse.jgit.lib.ObjectLoader}.
+ */
 public abstract class ObjectStream extends InputStream {
-	/** @return Git object type, see {@link Constants}. */
+	/**
+	 * Get Git object type, see {@link Constants}.
+	 *
+	 * @return Git object type, see {@link Constants}.
+	 */
 	public abstract int getType();
 
-	/** @return total size of object in bytes */
+	/**
+	 * Get total size of object in bytes
+	 *
+	 * @return total size of object in bytes
+	 */
 	public abstract long getSize();
 
 	/**
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 45757e4..18a11f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PersonIdent.java
@@ -65,6 +65,8 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Get timezone object for the given offset.
+	 *
 	 * @param tzOffset
 	 *            timezone offset as in {@link #getTimeZoneOffset()}.
 	 * @return time zone object for the given offset.
@@ -163,38 +165,45 @@
 	 * This new PersonIdent gets the info from the default committer as available
 	 * from the configuration.
 	 *
-	 * @param repo
+	 * @param repo a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public PersonIdent(final Repository repo) {
 		this(repo.getConfig().get(UserConfig.KEY));
 	}
 
 	/**
-	 * Copy a {@link PersonIdent}.
+	 * Copy a {@link org.eclipse.jgit.lib.PersonIdent}.
 	 *
 	 * @param pi
-	 *            Original {@link PersonIdent}
+	 *            Original {@link org.eclipse.jgit.lib.PersonIdent}
 	 */
 	public PersonIdent(final PersonIdent pi) {
 		this(pi.getName(), pi.getEmailAddress());
 	}
 
 	/**
-	 * Construct a new {@link PersonIdent} with current time.
+	 * Construct a new {@link org.eclipse.jgit.lib.PersonIdent} with current
+	 * time.
 	 *
 	 * @param aName
+	 *            a {@link java.lang.String} object.
 	 * @param aEmailAddress
+	 *            a {@link java.lang.String} object.
 	 */
 	public PersonIdent(final String aName, final String aEmailAddress) {
 		this(aName, aEmailAddress, SystemReader.getInstance().getCurrentTime());
 	}
 
 	/**
-	 * Construct a new {@link PersonIdent} with current time.
+	 * Construct a new {@link org.eclipse.jgit.lib.PersonIdent} with current
+	 * time.
 	 *
 	 * @param aName
+	 *            a {@link java.lang.String} object.
 	 * @param aEmailAddress
+	 *            a {@link java.lang.String} object.
 	 * @param when
+	 *            a {@link org.eclipse.jgit.util.time.ProposedTimestamp} object.
 	 * @since 4.6
 	 */
 	public PersonIdent(String aName, String aEmailAddress,
@@ -206,7 +215,7 @@
 	 * Copy a PersonIdent, but alter the clone's time stamp
 	 *
 	 * @param pi
-	 *            original {@link PersonIdent}
+	 *            original {@link org.eclipse.jgit.lib.PersonIdent}
 	 * @param when
 	 *            local time
 	 * @param tz
@@ -217,10 +226,11 @@
 	}
 
 	/**
-	 * Copy a {@link PersonIdent}, but alter the clone's time stamp
+	 * Copy a {@link org.eclipse.jgit.lib.PersonIdent}, but alter the clone's
+	 * time stamp
 	 *
 	 * @param pi
-	 *            original {@link PersonIdent}
+	 *            original {@link org.eclipse.jgit.lib.PersonIdent}
 	 * @param aWhen
 	 *            local time
 	 */
@@ -231,8 +241,8 @@
 	/**
 	 * Construct a PersonIdent from simple data
 	 *
-	 * @param aName
-	 * @param aEmailAddress
+	 * @param aName a {@link java.lang.String} object.
+	 * @param aEmailAddress a {@link java.lang.String} object.
 	 * @param aWhen
 	 *            local time stamp
 	 * @param aTZ
@@ -248,7 +258,7 @@
 	 * Copy a PersonIdent, but alter the clone's time stamp
 	 *
 	 * @param pi
-	 *            original {@link PersonIdent}
+	 *            original {@link org.eclipse.jgit.lib.PersonIdent}
 	 * @param aWhen
 	 *            local time stamp
 	 * @param aTZ
@@ -269,7 +279,7 @@
 	}
 
 	/**
-	 * Construct a {@link PersonIdent}.
+	 * Construct a {@link org.eclipse.jgit.lib.PersonIdent}.
 	 * <p>
 	 * Whitespace in the name and email is preserved for the lifetime of this
 	 * object, but are trimmed by {@link #toExternalString()}. This means that
@@ -277,7 +287,9 @@
 	 * equivalent instance.
 	 *
 	 * @param aName
+	 *            a {@link java.lang.String} object.
 	 * @param aEmailAddress
+	 *            a {@link java.lang.String} object.
 	 * @param aWhen
 	 *            local time stamp
 	 * @param aTZ
@@ -298,6 +310,8 @@
 	}
 
 	/**
+	 * Get name of person
+	 *
 	 * @return Name of person
 	 */
 	public String getName() {
@@ -305,6 +319,8 @@
 	}
 
 	/**
+	 * Get email address of person
+	 *
 	 * @return email address of person
 	 */
 	public String getEmailAddress() {
@@ -312,6 +328,8 @@
 	}
 
 	/**
+	 * Get timestamp
+	 *
 	 * @return timestamp
 	 */
 	public Date getWhen() {
@@ -319,6 +337,8 @@
 	}
 
 	/**
+	 * Get this person's declared time zone
+	 *
 	 * @return this person's declared time zone; null if time zone is unknown.
 	 */
 	public TimeZone getTimeZone() {
@@ -326,6 +346,8 @@
 	}
 
 	/**
+	 * Get this person's declared time zone as minutes east of UTC.
+	 *
 	 * @return this person's declared time zone as minutes east of UTC. If the
 	 *         timezone is to the west of UTC it is negative.
 	 */
@@ -334,6 +356,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Hashcode is based only on the email address and timestamp.
 	 */
 	@Override
@@ -344,6 +368,7 @@
 		return hc;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(final Object o) {
 		if (o instanceof PersonIdent) {
@@ -372,6 +397,7 @@
 		return r.toString();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ProgressMonitor.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ProgressMonitor.java
index 7748140..d81ee45 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ProgressMonitor.java
@@ -44,7 +44,9 @@
 
 package org.eclipse.jgit.lib;
 
-/** A progress reporting interface. */
+/**
+ * A progress reporting interface.
+ */
 public interface ProgressMonitor {
 	/** Constant indicating the total work units cannot be predicted. */
 	public static final int UNKNOWN = 0;
@@ -85,7 +87,9 @@
 	 */
 	void update(int completed);
 
-	/** Finish the current task, so the next can begin. */
+	/**
+	 * Finish the current task, so the next can begin.
+	 */
 	void endTask();
 
 	/**
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 c4923a3..06b4b22 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoFile.java
@@ -67,7 +67,10 @@
 	private Repository repo;
 
 	/**
+	 * Constructor for RebaseTodoFile.
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	public RebaseTodoFile(Repository repo) {
 		this.repo = repo;
@@ -84,7 +87,7 @@
 	 * @param includeComments
 	 *            <code>true</code> if also comments should be reported
 	 * @return the list of steps
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public List<RebaseTodoLine> readRebaseTodo(String path,
 			boolean includeComments) throws IOException {
@@ -214,7 +217,7 @@
 	 *            the steps to be written
 	 * @param append
 	 *            whether to append to an existing file or to write a new file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	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 9af8d76..4e235b0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java
@@ -142,8 +142,11 @@
 	 * Create a new non-comment line
 	 *
 	 * @param action
+	 *            a {@link org.eclipse.jgit.lib.RebaseTodoLine.Action} object.
 	 * @param commit
+	 *            a {@link org.eclipse.jgit.lib.AbbreviatedObjectId} object.
 	 * @param shortMessage
+	 *            a {@link java.lang.String} object.
 	 */
 	public RebaseTodoLine(Action action, AbbreviatedObjectId commit,
 			String shortMessage) {
@@ -154,6 +157,8 @@
 	}
 
 	/**
+	 * Get rebase action type
+	 *
 	 * @return rebase action type
 	 */
 	public Action getAction() {
@@ -167,7 +172,8 @@
 	 * non-comment.
 	 *
 	 * @param newAction
-	 * @throws IllegalTodoFileModification
+	 *            a {@link org.eclipse.jgit.lib.RebaseTodoLine.Action} object.
+	 * @throws org.eclipse.jgit.errors.IllegalTodoFileModification
 	 *             on attempt to set a non-comment action on a line which was a
 	 *             comment line before.
 	 */
@@ -193,7 +199,7 @@
 	/**
 	 * <p>
 	 * Set a comment for this line that is used if this line's
-	 * {@link RebaseTodoLine#action} is a {@link Action#COMMENT}
+	 * {@link org.eclipse.jgit.lib.RebaseTodoLine#action} is a {@link org.eclipse.jgit.lib.RebaseTodoLine.Action#COMMENT}
 	 * </p>
 	 * It's allowed to unset the comment by calling
 	 * <code>setComment(null)</code> <br>
@@ -230,6 +236,8 @@
 	}
 
 	/**
+	 * Get abbreviated commit SHA-1 of commit that action will be performed on
+	 *
 	 * @return abbreviated commit SHA-1 of commit that action will be performed
 	 *         on
 	 */
@@ -238,6 +246,9 @@
 	}
 
 	/**
+	 * Get the first line of the commit message of the commit the action will be
+	 * performed on.
+	 *
 	 * @return the first line of the commit message of the commit the action
 	 *         will be performed on.
 	 */
@@ -246,13 +257,18 @@
 	}
 
 	/**
+	 * Set short message
+	 *
 	 * @param shortMessage
+	 *            a short message.
 	 */
 	public void setShortMessage(String shortMessage) {
 		this.shortMessage = shortMessage;
 	}
 
 	/**
+	 * Get a comment
+	 *
 	 * @return a comment. If the line is a comment line then the comment is
 	 *         returned. Lines starting with # or blank lines or lines
 	 *         containing only spaces and tabs are considered as comment lines.
@@ -262,6 +278,7 @@
 		return comment;
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java
index a78a90f..395bb32 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java
@@ -47,7 +47,8 @@
 import org.eclipse.jgit.annotations.Nullable;
 
 /**
- * Pairing of a name and the {@link ObjectId} it currently has.
+ * Pairing of a name and the {@link org.eclipse.jgit.lib.ObjectId} it currently
+ * has.
  * <p>
  * A ref in Git is (more or less) a variable that holds a single object
  * identifier. The object identifier can be any valid Git object (blob, tree,
@@ -135,9 +136,10 @@
 	/**
 	 * Test if this reference is a symbolic reference.
 	 * <p>
-	 * A symbolic reference does not have its own {@link ObjectId} value, but
-	 * instead points to another {@code Ref} in the same database and always
-	 * uses that other reference's value as its own.
+	 * A symbolic reference does not have its own
+	 * {@link org.eclipse.jgit.lib.ObjectId} value, but instead points to
+	 * another {@code Ref} in the same database and always uses that other
+	 * reference's value as its own.
 	 *
 	 * @return true if this is a symbolic reference; false if this reference
 	 *         contains its own ObjectId.
@@ -199,7 +201,9 @@
 	public abstract ObjectId getPeeledObjectId();
 
 	/**
-	 * @return whether the Ref represents a peeled tag
+	 * Whether the Ref represents a peeled tag.
+	 *
+	 * @return whether the Ref represents a peeled tag.
 	 */
 	public abstract boolean isPeeled();
 
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 95e3386..43d2f37 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
@@ -60,6 +60,7 @@
 	/** Singleton instance of RefComparator */
 	public static final RefComparator INSTANCE = new RefComparator();
 
+	/** {@inheritDoc} */
 	@Override
 	public int compare(final Ref o1, final 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 59a104b..557bdb9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
@@ -55,11 +55,13 @@
 import org.eclipse.jgit.annotations.Nullable;
 
 /**
- * Abstraction of name to {@link ObjectId} mapping.
+ * Abstraction of name to {@link org.eclipse.jgit.lib.ObjectId} mapping.
  * <p>
- * A reference database stores a mapping of reference names to {@link ObjectId}.
- * Every {@link Repository} has a single reference database, mapping names to
- * the tips of the object graph contained by the {@link ObjectDatabase}.
+ * A reference database stores a mapping of reference names to
+ * {@link org.eclipse.jgit.lib.ObjectId}. Every
+ * {@link org.eclipse.jgit.lib.Repository} has a single reference database,
+ * mapping names to the tips of the object graph contained by the
+ * {@link org.eclipse.jgit.lib.ObjectDatabase}.
  */
 public abstract class RefDatabase {
 	/**
@@ -93,12 +95,14 @@
 	/**
 	 * Initialize a new reference database at this location.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database could not be created.
 	 */
 	public abstract void create() throws IOException;
 
-	/** Close any resources held by this database. */
+	/**
+	 * Close any resources held by this database.
+	 */
 	public abstract void close();
 
 	/**
@@ -118,7 +122,7 @@
 	 *            proposed name.
 	 * @return true if the name overlaps with an existing reference; false if
 	 *         using this name right now would be safe.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database could not be read to check for conflicts.
 	 * @see #getConflictingNames(String)
 	 */
@@ -133,7 +137,7 @@
 	 * @return a collection of full names of existing refs which would conflict
 	 *         with the passed ref name; empty collection when there are no
 	 *         conflicts
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 2.3
 	 * @see #isNameConflicting(String)
 	 */
@@ -167,12 +171,13 @@
 	 *            the name of the reference.
 	 * @param detach
 	 *            if {@code true} and {@code name} is currently a
-	 *            {@link SymbolicRef}, the update will replace it with an
-	 *            {@link ObjectIdRef}. Otherwise, the update will recursively
-	 *            traverse {@link SymbolicRef}s and operate on the leaf
-	 *            {@link ObjectIdRef}.
+	 *            {@link org.eclipse.jgit.lib.SymbolicRef}, the update will
+	 *            replace it with an {@link org.eclipse.jgit.lib.ObjectIdRef}.
+	 *            Otherwise, the update will recursively traverse
+	 *            {@link org.eclipse.jgit.lib.SymbolicRef}s and operate on the
+	 *            leaf {@link org.eclipse.jgit.lib.ObjectIdRef}.
 	 * @return a new update for the requested name; never null.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 */
 	@NonNull
@@ -187,7 +192,7 @@
 	 * @param toName
 	 *            name of reference to rename to
 	 * @return an update command that knows how to rename a branch to another.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 */
 	@NonNull
@@ -210,20 +215,21 @@
 	 * Whether the database is capable of performing batch updates as atomic
 	 * transactions.
 	 * <p>
-	 * If true, by default {@link BatchRefUpdate} instances will perform updates
-	 * atomically, meaning either all updates will succeed, or all updates will
-	 * fail. It is still possible to turn off this behavior on a per-batch basis
-	 * by calling {@code update.setAtomic(false)}.
+	 * If true, by default {@link org.eclipse.jgit.lib.BatchRefUpdate} instances
+	 * will perform updates atomically, meaning either all updates will succeed,
+	 * or all updates will fail. It is still possible to turn off this behavior
+	 * on a per-batch basis by calling {@code update.setAtomic(false)}.
 	 * <p>
-	 * If false, {@link BatchRefUpdate} instances will never perform updates
-	 * atomically, and calling {@code update.setAtomic(true)} will cause the
-	 * entire batch to fail with {@code REJECTED_OTHER_REASON}.
+	 * If false, {@link org.eclipse.jgit.lib.BatchRefUpdate} instances will
+	 * never perform updates atomically, and calling
+	 * {@code update.setAtomic(true)} will cause the entire batch to fail with
+	 * {@code REJECTED_OTHER_REASON}.
 	 * <p>
 	 * This definition of atomicity is stronger than what is provided by
 	 * {@link org.eclipse.jgit.transport.ReceivePack}. {@code ReceivePack} will
 	 * attempt to reject all commands if it knows in advance some commands may
-	 * fail, even if the storage layer does not support atomic transactions. Here,
-	 * atomicity applies even in the case of unforeseeable errors.
+	 * fail, even if the storage layer does not support atomic transactions.
+	 * Here, atomicity applies even in the case of unforeseeable errors.
 	 *
 	 * @return whether transactions are atomic by default.
 	 * @since 3.6
@@ -246,7 +252,7 @@
 	 *            the name of the reference. May be a short name which must be
 	 *            searched for using the standard {@link #SEARCH_PATH}.
 	 * @return the reference (if it exists); else {@code null}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 */
 	@Nullable
@@ -261,7 +267,7 @@
 	 * @param name
 	 *             the unabbreviated name of the reference.
 	 * @return the reference (if it exists); else {@code null}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 * @since 4.1
 	 */
@@ -285,7 +291,7 @@
 	 *             the unabbreviated names of references to look up.
 	 * @return modifiable map describing any refs that exist among the ref
 	 *         ref names supplied. The map can be an unsorted map.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 * @since 4.1
 	 */
@@ -310,7 +316,7 @@
 	 * @param refs
 	 *             the unabbreviated names of references to look up.
 	 * @return the first named reference that exists (if any); else {@code null}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 * @since 4.1
 	 */
@@ -335,7 +341,7 @@
 	 * @return modifiable map that is a complete snapshot of the current
 	 *         reference namespace, with {@code prefix} removed from the start
 	 *         of each key. The map can be an unsorted map.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 */
 	@NonNull
@@ -350,7 +356,7 @@
 	 * and {@link #exactRef(String)}.
 	 *
 	 * @return a list of additional refs
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space cannot be accessed.
 	 */
 	@NonNull
@@ -360,10 +366,11 @@
 	 * Peel a possibly unpeeled reference by traversing the annotated tags.
 	 * <p>
 	 * If the reference cannot be peeled (as it does not refer to an annotated
-	 * tag) the peeled id stays null, but {@link Ref#isPeeled()} will be true.
+	 * tag) the peeled id stays null, but
+	 * {@link org.eclipse.jgit.lib.Ref#isPeeled()} will be true.
 	 * <p>
-	 * Implementors should check {@link Ref#isPeeled()} before performing any
-	 * additional work effort.
+	 * Implementors should check {@link org.eclipse.jgit.lib.Ref#isPeeled()}
+	 * before performing any additional work effort.
 	 *
 	 * @param ref
 	 *            The reference to peel
@@ -371,7 +378,7 @@
 	 *         Ref object representing the same data as Ref, but isPeeled() will
 	 *         be true and getPeeledObjectId() will contain the peeled object
 	 *         (or {@code null}).
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the reference space or object space cannot be accessed.
 	 */
 	@NonNull
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 59f852b..3d22bb0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefRename.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefRename.java
@@ -86,7 +86,11 @@
 				+ Repository.shortenRefName(destination.getName()));
 	}
 
-	/** @return identity of the user making the change in the reflog. */
+	/**
+	 * Get identity of the user making the change in the reflog.
+	 *
+	 * @return identity of the user making the change in the reflog.
+	 */
 	public PersonIdent getRefLogIdent() {
 		return destination.getRefLogIdent();
 	}
@@ -130,12 +134,16 @@
 			destination.setRefLogMessage(msg, false);
 	}
 
-	/** Don't record this rename in the ref's associated reflog. */
+	/**
+	 * Don't record this rename in the ref's associated reflog.
+	 */
 	public void disableRefLog() {
 		destination.setRefLogMessage("", false); //$NON-NLS-1$
 	}
 
 	/**
+	 * Get result of rename operation
+	 *
 	 * @return result of rename operation
 	 */
 	public Result getResult() {
@@ -143,8 +151,10 @@
 	}
 
 	/**
+	 * Rename
+	 *
 	 * @return the result of the new ref update
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public Result rename() throws IOException {
 		try {
@@ -157,15 +167,20 @@
 	}
 
 	/**
+	 * Do the actual rename
+	 *
 	 * @return the result of the rename operation.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected abstract Result doRename() throws IOException;
 
 	/**
+	 * Whether the {@code Constants#HEAD} reference needs to be linked to the
+	 * new destination name.
+	 *
 	 * @return true if the {@code Constants#HEAD} reference needs to be linked
 	 *         to the new destination name.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the current value of {@code HEAD} cannot be read.
 	 */
 	protected boolean needToUpdateHEAD() 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 766b21d..06a7576 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
@@ -233,10 +233,18 @@
 		refLogMessage = ""; //$NON-NLS-1$
 	}
 
-	/** @return the reference database this update modifies. */
+	/**
+	 * Get the reference database this update modifies.
+	 *
+	 * @return the reference database this update modifies.
+	 */
 	protected abstract RefDatabase getRefDatabase();
 
-	/** @return the repository storing the database's objects. */
+	/**
+	 * Get the repository storing the database's objects.
+	 *
+	 * @return the repository storing the database's objects.
+	 */
 	protected abstract Repository getRepository();
 
 	/**
@@ -251,33 +259,44 @@
 	 *            current reference.
 	 * @return true if the lock was acquired and the reference is likely
 	 *         protected from concurrent modification; false if it failed.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the lock couldn't be taken due to an unexpected storage
 	 *             failure, and not because of a concurrent update.
 	 */
 	protected abstract boolean tryLock(boolean deref) throws IOException;
 
-	/** Releases the lock taken by {@link #tryLock} if it succeeded. */
+	/**
+	 * Releases the lock taken by {@link #tryLock} if it succeeded.
+	 */
 	protected abstract void unlock();
 
 	/**
+	 * Do update
+	 *
 	 * @param desiredResult
+	 *            a {@link org.eclipse.jgit.lib.RefUpdate.Result} object.
 	 * @return {@code result}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected abstract Result doUpdate(Result desiredResult) throws IOException;
 
 	/**
+	 * Do delete
+	 *
 	 * @param desiredResult
+	 *            a {@link org.eclipse.jgit.lib.RefUpdate.Result} object.
 	 * @return {@code result}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected abstract Result doDelete(Result desiredResult) throws IOException;
 
 	/**
+	 * Do link
+	 *
 	 * @param target
-	 * @return {@link Result#NEW} on success.
-	 * @throws IOException
+	 *            a {@link java.lang.String} object.
+	 * @return {@link org.eclipse.jgit.lib.RefUpdate.Result#NEW} on success.
+	 * @throws java.io.IOException
 	 */
 	protected abstract Result doLink(String target) throws IOException;
 
@@ -290,7 +309,11 @@
 		return getRef().getName();
 	}
 
-	/** @return the reference this update will create or modify. */
+	/**
+	 * Get the reference this update will create or modify.
+	 *
+	 * @return the reference this update will create or modify.
+	 */
 	public Ref getRef() {
 		return ref;
 	}
@@ -332,21 +355,27 @@
 	}
 
 	/**
+	 * Get the expected value of the ref after the lock is taken, but before
+	 * update occurs.
+	 *
 	 * @return the expected value of the ref after the lock is taken, but before
 	 *         update occurs. Null to avoid the compare and swap test. Use
-	 *         {@link ObjectId#zeroId()} to indicate expectation of a
-	 *         non-existant ref.
+	 *         {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to indicate
+	 *         expectation of a non-existant ref.
 	 */
 	public ObjectId getExpectedOldObjectId() {
 		return expValue;
 	}
 
 	/**
+	 * Set the expected value of the ref after the lock is taken, but before
+	 * update occurs.
+	 *
 	 * @param id
 	 *            the expected value of the ref after the lock is taken, but
 	 *            before update occurs. Null to avoid the compare and swap test.
-	 *            Use {@link ObjectId#zeroId()} to indicate expectation of a
-	 *            non-existant ref.
+	 *            Use {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to indicate
+	 *            expectation of a non-existant ref.
 	 */
 	public void setExpectedOldObjectId(final AnyObjectId id) {
 		expValue = id != null ? id.toObjectId() : null;
@@ -371,7 +400,11 @@
 		force = b;
 	}
 
-	/** @return identity of the user making the change in the reflog. */
+	/**
+	 * Get identity of the user making the change in the reflog.
+	 *
+	 * @return identity of the user making the change in the reflog.
+	 */
 	public PersonIdent getRefLogIdent() {
 		return refLogIdent;
 	}
@@ -402,7 +435,11 @@
 		return refLogMessage;
 	}
 
-	/** @return {@code true} if the ref log message should show the result. */
+	/**
+	 * Whether the ref log message should show the result.
+	 *
+	 * @return {@code true} if the ref log message should show the result.
+	 */
 	protected boolean isRefLogIncludingResult() {
 		return refLogIncludeResult;
 	}
@@ -436,7 +473,9 @@
 		}
 	}
 
-	/** Don't record this update in the ref's associated reflog. */
+	/**
+	 * Don't record this update in the ref's associated reflog.
+	 */
 	public void disableRefLog() {
 		refLogMessage = null;
 		refLogIncludeResult = false;
@@ -535,7 +574,7 @@
 	 * the merge test is performed.
 	 *
 	 * @return the result status of the update.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an unexpected IO error occurred while writing changes.
 	 */
 	public Result forceUpdate() throws IOException {
@@ -555,7 +594,7 @@
 	 * </pre>
 	 *
 	 * @return the result status of the update.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an unexpected IO error occurred while writing changes.
 	 */
 	public Result update() throws IOException {
@@ -573,7 +612,7 @@
 	 *            a RevWalk instance this update command can borrow to perform
 	 *            the merge test. The walk will be reset to perform the test.
 	 * @return the result status of the update.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an unexpected IO error occurred while writing changes.
 	 */
 	public Result update(final RevWalk walk) throws IOException {
@@ -603,7 +642,7 @@
 	 * </pre>
 	 *
 	 * @return the result status of the delete.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public Result delete() throws IOException {
 		try (RevWalk rw = new RevWalk(getRepository())) {
@@ -618,7 +657,7 @@
 	 *            a RevWalk instance this delete command can borrow to perform
 	 *            the merge test. The walk will be reset to perform the test.
 	 * @return the result status of the delete.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public Result delete(final RevWalk walk) throws IOException {
 		final String myName = detachingSymbolicRef
@@ -656,8 +695,9 @@
 	 * @param target
 	 *            name of the new target for this reference. The new target name
 	 *            must be absolute, so it must begin with {@code refs/}.
-	 * @return {@link Result#NEW} or {@link Result#FORCED} on success.
-	 * @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
 	 */
 	public Result link(String target) throws IOException {
 		if (!target.startsWith(Constants.R_REFS))
@@ -751,6 +791,7 @@
 	 * are checked explicitly.
 	 *
 	 * @param check
+	 *            whether to enable the check for conflicting ref names.
 	 * @since 3.0
 	 */
 	public void setCheckConflicting(boolean check) {
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 3a02b22..90a0350 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java
@@ -56,8 +56,8 @@
 import org.eclipse.jgit.util.RefMap;
 
 /**
- * Writes out refs to the {@link Constants#INFO_REFS} and
- * {@link Constants#PACKED_REFS} files.
+ * Writes out refs to the {@link org.eclipse.jgit.lib.Constants#INFO_REFS} and
+ * {@link org.eclipse.jgit.lib.Constants#PACKED_REFS} files.
  *
  * This class is abstract as the writing of the files must be handled by the
  * caller. This is because it is used by transport classes as well.
@@ -67,6 +67,8 @@
 	private final Collection<Ref> refs;
 
 	/**
+	 * <p>Constructor for RefWriter.</p>
+	 *
 	 * @param refs
 	 *            the complete set of references. This should have been computed
 	 *            by applying updates to the advertised refs already discovered.
@@ -76,6 +78,8 @@
 	}
 
 	/**
+	 * <p>Constructor for RefWriter.</p>
+	 *
 	 * @param refs
 	 *            the complete set of references. This should have been computed
 	 *            by applying updates to the advertised refs already discovered.
@@ -88,6 +92,8 @@
 	}
 
 	/**
+	 * <p>Constructor for RefWriter.</p>
+	 *
 	 * @param refs
 	 *            the complete set of references. This should have been computed
 	 *            by applying updates to the advertised refs already discovered.
@@ -97,13 +103,13 @@
 	}
 
 	/**
-	 * Rebuild the {@link Constants#INFO_REFS}.
+	 * Rebuild the {@link org.eclipse.jgit.lib.Constants#INFO_REFS}.
 	 * <p>
-	 * This method rebuilds the contents of the {@link Constants#INFO_REFS} file
-	 * to match the passed list of references.
+	 * This method rebuilds the contents of the
+	 * {@link org.eclipse.jgit.lib.Constants#INFO_REFS} file to match the passed
+	 * list of references.
 	 *
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             writing is not supported, or attempting to write the file
 	 *             failed, possibly due to permissions or remote disk full, etc.
 	 */
@@ -142,13 +148,14 @@
 	}
 
 	/**
-	 * Rebuild the {@link Constants#PACKED_REFS} file.
+	 * Rebuild the {@link org.eclipse.jgit.lib.Constants#PACKED_REFS} file.
 	 * <p>
-	 * This method rebuilds the contents of the {@link Constants#PACKED_REFS}
-	 * file to match the passed list of references, including only those refs
-	 * that have a storage type of {@link Ref.Storage#PACKED}.
+	 * This method rebuilds the contents of the
+	 * {@link org.eclipse.jgit.lib.Constants#PACKED_REFS} file to match the
+	 * passed list of references, including only those refs that have a storage
+	 * type of {@link org.eclipse.jgit.lib.Ref.Storage#PACKED}.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             writing is not supported, or attempting to write the file
 	 *             failed, possibly due to permissions or remote disk full, etc.
 	 */
@@ -203,7 +210,7 @@
 	 *            path to ref file.
 	 * @param content
 	 *            byte content of file to be written.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected abstract void writeFile(String file, byte[] content)
 			throws IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogEntry.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogEntry.java
index afa6521..51f2ea0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogEntry.java
@@ -83,28 +83,39 @@
 	public static final String PREFIX_FORCED_UPDATE = "forced-update"; //$NON-NLS-1$
 
 	/**
+	 * Get the commit id before the change
+	 *
 	 * @return the commit id before the change
 	 */
 	public abstract ObjectId getOldId();
 
 	/**
+	 * Get the commit id after the change
+	 *
 	 * @return the commit id after the change
 	 */
 	public abstract ObjectId getNewId();
 
 	/**
+	 * Get user performing the change
+	 *
 	 * @return user performing the change
 	 */
 	public abstract PersonIdent getWho();
 
 	/**
+	 * Get textual description of the change
+	 *
 	 * @return textual description of the change
 	 */
 	public abstract String getComment();
 
 	/**
-	 * @return a {@link CheckoutEntry} with parsed information about a branch
-	 *         switch, or null if the entry is not a checkout
+	 * Parse checkout
+	 *
+	 * @return a {@link org.eclipse.jgit.lib.CheckoutEntry} with parsed
+	 *         information about a branch switch, or null if the entry is not a
+	 *         checkout
 	 */
 	public abstract CheckoutEntry parseCheckout();
 
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 d3f2536..f97b07e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ReflogReader.java
@@ -57,13 +57,15 @@
 	 * Get the last entry in the reflog
 	 *
 	 * @return the latest reflog entry, or null if no log
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public abstract ReflogEntry getLastEntry() throws IOException;
 
 	/**
+	 * Get all reflog entries in reverse order
+	 *
 	 * @return all reflog entries in reverse order
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public abstract List<ReflogEntry> getReverseEntries() throws IOException;
 
@@ -71,17 +73,19 @@
 	 * Get specific entry in the reflog relative to the last entry which is
 	 * considered entry zero.
 	 *
-	 * @param number
+	 * @param number a int.
 	 * @return reflog entry or null if not found
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public abstract ReflogEntry getReverseEntry(int number) throws IOException;
 
 	/**
+	 * Get all reflog entries in reverse order
+	 *
 	 * @param max
 	 *            max number of entries to read
 	 * @return all reflog entries in reverse order
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public abstract 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 fdf5966..fae7f1c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -85,7 +85,6 @@
 import org.eclipse.jgit.events.ListenerList;
 import org.eclipse.jgit.events.RepositoryEvent;
 import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.internal.storage.file.GC;
 import org.eclipse.jgit.revwalk.RevBlob;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -108,9 +107,9 @@
  * A repository holds all objects and refs used for managing source code (could
  * be any type of file, but source code is what SCM's are typically used for).
  * <p>
- * The thread-safety of a {@link Repository} very much depends on the concrete
- * implementation. Applications working with a generic {@code Repository} type
- * must not assume the instance is thread-safe.
+ * The thread-safety of a {@link org.eclipse.jgit.lib.Repository} very much
+ * depends on the concrete implementation. Applications working with a generic
+ * {@code Repository} type must not assume the instance is thread-safe.
  * <ul>
  * <li>{@code FileRepository} is thread-safe.
  * <li>{@code DfsRepository} thread-safety is determined by its subclass.
@@ -131,7 +130,11 @@
 					"(^|/)(aux|com[1-9]|con|lpt[1-9]|nul|prn)(\\.[^/]*)?", //$NON-NLS-1$
 					Pattern.CASE_INSENSITIVE);
 
-	/** @return the global listener list observing all events in this JVM. */
+	/**
+	 * Get the global listener list observing all events in this JVM.
+	 *
+	 * @return the global listener list observing all events in this JVM.
+	 */
 	public static ListenerList getGlobalListenerList() {
 		return globalListeners;
 	}
@@ -168,7 +171,11 @@
 		indexFile = options.getIndexFile();
 	}
 
-	/** @return listeners observing only events on this repository. */
+	/**
+	 * Get listeners observing only events on this repository.
+	 *
+	 * @return listeners observing only events on this repository.
+	 */
 	@NonNull
 	public ListenerList getListenerList() {
 		return myListeners;
@@ -195,7 +202,7 @@
 	 * Repository with working tree is created using this method. This method is
 	 * the same as {@code create(false)}.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @see #create(boolean)
 	 */
 	public void create() throws IOException {
@@ -209,12 +216,14 @@
 	 * @param bare
 	 *            if true, a bare repository (a repository without a working
 	 *            directory) is created.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             in case of IO problem
 	 */
 	public abstract void create(boolean bare) throws IOException;
 
 	/**
+	 * Get local metadata directory
+	 *
 	 * @return local metadata directory; {@code null} if repository isn't local.
 	 */
 	/*
@@ -229,44 +238,64 @@
 	}
 
 	/**
+	 * Get the object database which stores this repository's data.
+	 *
 	 * @return the object database which stores this repository's data.
 	 */
 	@NonNull
 	public abstract ObjectDatabase getObjectDatabase();
 
-	/** @return a new inserter to create objects in {@link #getObjectDatabase()} */
+	/**
+	 * Create a new inserter to create objects in {@link #getObjectDatabase()}.
+	 *
+	 * @return a new inserter to create objects in {@link #getObjectDatabase()}.
+	 */
 	@NonNull
 	public ObjectInserter newObjectInserter() {
 		return getObjectDatabase().newInserter();
 	}
 
-	/** @return a new reader to read objects from {@link #getObjectDatabase()} */
+	/**
+	 * Create a new reader to read objects from {@link #getObjectDatabase()}.
+	 *
+	 * @return a new reader to read objects from {@link #getObjectDatabase()}.
+	 */
 	@NonNull
 	public ObjectReader newObjectReader() {
 		return getObjectDatabase().newReader();
 	}
 
-	/** @return the reference database which stores the reference namespace. */
+	/**
+	 * Get the reference database which stores the reference namespace.
+	 *
+	 * @return the reference database which stores the reference namespace.
+	 */
 	@NonNull
 	public abstract RefDatabase getRefDatabase();
 
 	/**
-	 * @return the configuration of this repository
+	 * Get the configuration of this repository.
+	 *
+	 * @return the configuration of this repository.
 	 */
 	@NonNull
 	public abstract StoredConfig getConfig();
 
 	/**
-	 * @return a new {@link AttributesNodeProvider}. This
-	 *         {@link AttributesNodeProvider} is lazy loaded only once. It means
-	 *         that it will not be updated after loading. Prefer creating new
-	 *         instance for each use.
+	 * Create a new {@link org.eclipse.jgit.attributes.AttributesNodeProvider}.
+	 *
+	 * @return a new {@link org.eclipse.jgit.attributes.AttributesNodeProvider}.
+	 *         This {@link org.eclipse.jgit.attributes.AttributesNodeProvider}
+	 *         is lazy loaded only once. It means that it will not be updated
+	 *         after loading. Prefer creating new instance for each use.
 	 * @since 4.2
 	 */
 	@NonNull
 	public abstract AttributesNodeProvider createAttributesNodeProvider();
 
 	/**
+	 * Get the used file system abstraction.
+	 *
 	 * @return the used file system abstraction, or or {@code null} if
 	 *         repository isn't local.
 	 */
@@ -282,7 +311,11 @@
 	}
 
 	/**
+	 * Whether the specified object is stored in this repo or any of the known
+	 * shared repositories.
+	 *
 	 * @param objectId
+	 *            a {@link org.eclipse.jgit.lib.AnyObjectId} object.
 	 * @return true if the specified object is stored in this repo or any of the
 	 *         known shared repositories.
 	 */
@@ -303,10 +336,11 @@
 	 *
 	 * @param objectId
 	 *            identity of the object to open.
-	 * @return a {@link ObjectLoader} for accessing the object.
-	 * @throws MissingObjectException
+	 * @return a {@link org.eclipse.jgit.lib.ObjectLoader} for accessing the
+	 *         object.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	@NonNull
@@ -325,16 +359,17 @@
 	 *            identity of the object to open.
 	 * @param typeHint
 	 *            hint about the type of object being requested, e.g.
-	 *            {@link Constants#OBJ_BLOB}; {@link ObjectReader#OBJ_ANY} if
-	 *            the object type is not known, or does not matter to the
-	 *            caller.
-	 * @return a {@link ObjectLoader} for accessing the object.
-	 * @throws MissingObjectException
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB};
+	 *            {@link org.eclipse.jgit.lib.ObjectReader#OBJ_ANY} if the
+	 *            object type is not known, or does not matter to the caller.
+	 * @return a {@link org.eclipse.jgit.lib.ObjectLoader} for accessing the
+	 *         object.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             typeHint was not OBJ_ANY, and the object's actual type does
 	 *             not match typeHint.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	@NonNull
@@ -352,7 +387,7 @@
 	 * @return an update command. The caller must finish populating this command
 	 *         and then invoke one of the update methods to actually make a
 	 *         change.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a symbolic ref was passed in and could not be resolved back
 	 *             to the base ref, as the symbolic ref could not be read.
 	 */
@@ -371,7 +406,7 @@
 	 * @return an update command. The caller must finish populating this command
 	 *         and then invoke one of the update methods to actually make a
 	 *         change.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a symbolic ref was passed in and could not be resolved back
 	 *             to the base ref, as the symbolic ref could not be read.
 	 */
@@ -388,9 +423,8 @@
 	 * @param toRef
 	 *            name of ref to rename to
 	 * @return an update command that knows how to rename a branch to another.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the rename could not be performed.
-	 *
 	 */
 	@NonNull
 	public RefRename renameRef(final String fromRef, final String toRef) throws IOException {
@@ -434,17 +468,17 @@
 	 *            A git object references expression
 	 * @return an ObjectId or {@code null} if revstr can't be resolved to any
 	 *         ObjectId
-	 * @throws AmbiguousObjectException
+	 * @throws org.eclipse.jgit.errors.AmbiguousObjectException
 	 *             {@code revstr} contains an abbreviated ObjectId and this
 	 *             repository contains more than one object which match to the
 	 *             input abbreviation.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the id parsed does not meet the type required to finish
 	 *             applying the operators in the expression.
-	 * @throws RevisionSyntaxException
+	 * @throws org.eclipse.jgit.errors.RevisionSyntaxException
 	 *             the expression is not supported by this implementation, or
 	 *             does not meet the standard syntax.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             on serious errors
 	 */
 	@Nullable
@@ -468,11 +502,11 @@
 	 * Thus this method can be used to process an expression to a method that
 	 * expects a branch or revision id.
 	 *
-	 * @param revstr
+	 * @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 AmbiguousObjectException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.AmbiguousObjectException
+	 * @throws java.io.IOException
 	 */
 	@Nullable
 	public String simplify(final String revstr)
@@ -891,12 +925,18 @@
 		}
 	}
 
-	/** Increment the use counter by one, requiring a matched {@link #close()}. */
+	/**
+	 * Increment the use counter by one, requiring a matched {@link #close()}.
+	 */
 	public void incrementOpen() {
 		useCnt.incrementAndGet();
 	}
 
-	/** Decrement the use count, and maybe close resources. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Decrement the use count, and maybe close resources.
+	 */
 	@Override
 	public void close() {
 		int newCount = useCnt.decrementAndGet();
@@ -932,6 +972,7 @@
 		getRefDatabase().close();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public String toString() {
@@ -961,7 +1002,7 @@
 	 *         an ObjectId in hex format if the current branch is detached, or
 	 *         {@code null} if the repository is corrupt and has no HEAD
 	 *         reference.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	@Nullable
 	public String getFullBranch() throws IOException {
@@ -989,7 +1030,7 @@
 	 * @return name of current branch (for example {@code master}), an ObjectId
 	 *         in hex format if the current branch is detached, or {@code null}
 	 *         if the repository is corrupt and has no HEAD reference.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	@Nullable
 	public String getBranch() throws IOException {
@@ -1022,7 +1063,7 @@
 	 *            "master" which is is automatically expanded to
 	 *            "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 IOException
+	 * @throws java.io.IOException
 	 * @deprecated Use {@link #exactRef(String)} or {@link #findRef(String)}
 	 * instead.
 	 */
@@ -1040,7 +1081,7 @@
 	 *            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 IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	@Nullable
@@ -1056,7 +1097,7 @@
 	 *            "master" which is is automatically expanded to
 	 *            "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 IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	@Nullable
@@ -1065,6 +1106,8 @@
 	}
 
 	/**
+	 * Get mutable map of all known refs
+	 *
 	 * @return mutable map of all known refs (heads, tags, remotes).
 	 */
 	@NonNull
@@ -1077,6 +1120,8 @@
 	}
 
 	/**
+	 * Get mutable map of all tags
+	 *
 	 * @return mutable map of all tags; key is short tag name ("v1.0") and value
 	 *         of the entry contains the ref with the full tag name
 	 *         ("refs/tags/v1.0").
@@ -1094,7 +1139,8 @@
 	 * Peel a possibly unpeeled reference to an annotated tag.
 	 * <p>
 	 * If the ref cannot be peeled (as it does not refer to an annotated tag)
-	 * the peeled id stays null, but {@link Ref#isPeeled()} will be true.
+	 * the peeled id stays null, but {@link org.eclipse.jgit.lib.Ref#isPeeled()}
+	 * will be true.
 	 *
 	 * @param ref
 	 *            The ref to peel
@@ -1116,6 +1162,8 @@
 	}
 
 	/**
+	 * Get a map with all objects referenced by a peeled ref.
+	 *
 	 * @return a map with all objects referenced by a peeled ref.
 	 */
 	@NonNull
@@ -1143,9 +1191,11 @@
 	}
 
 	/**
+	 * Get the index file location or {@code null} if repository isn't local.
+	 *
 	 * @return the index file location or {@code null} if repository isn't
 	 *         local.
-	 * @throws NoWorkTreeException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1165,11 +1215,11 @@
 	 * @param id
 	 *            name of the commit object.
 	 * @return reference to the commit object. Never null.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied commit does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the supplied id is not a commit or an annotated tag.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 * @since 4.8
 	 */
@@ -1192,12 +1242,12 @@
 	 *
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws NoWorkTreeException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -1216,13 +1266,13 @@
 	 *
 	 * @return a cache representing the contents of the specified index file (if
 	 *         it exists) or an empty cache if the file does not exist.
-	 * @throws NoWorkTreeException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the index file is present but could not be read, or the lock
 	 *             could not be obtained.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the index file is using a format or extension that this
 	 *             library does not support.
 	 */
@@ -1241,7 +1291,9 @@
 	}
 
 	/**
-	 * @return an important state
+	 * Get the repository state
+	 *
+	 * @return the repository state
 	 */
 	@NonNull
 	public RepositoryState getRepositoryState() {
@@ -1322,8 +1374,7 @@
 	 *
 	 * For portability reasons '\' is excluded
 	 *
-	 * @param refName
-	 *
+	 * @param refName a {@link java.lang.String} object.
 	 * @return true if refName is a valid ref name
 	 */
 	public static boolean isValidRefName(final String refName) {
@@ -1384,10 +1435,10 @@
 	 * Normalizes the passed branch name into a possible valid branch name. The
 	 * validity of the returned name should be checked by a subsequent call to
 	 * {@link #isValidRefName(String)}.
-	 * <p/>
+	 * <p>
 	 * Future implementations of this method could be more restrictive or more
 	 * lenient about the validity of specific characters in the returned name.
-	 * <p/>
+	 * <p>
 	 * The current implementation returns the trimmed input string if this is
 	 * already a valid branch name. Otherwise it returns a trimmed string with
 	 * special characters not allowed by {@link #isValidRefName(String)}
@@ -1396,7 +1447,6 @@
 	 *
 	 * @param name
 	 *            to normalize
-	 *
 	 * @return The normalized name or an empty String if it is {@code null} or
 	 *         empty.
 	 * @since 4.7
@@ -1503,6 +1553,8 @@
 	}
 
 	/**
+	 * Whether this repository is bare
+	 *
 	 * @return true if this is bare, which implies it has no working directory.
 	 */
 	public boolean isBare() {
@@ -1510,9 +1562,12 @@
 	}
 
 	/**
+	 * Get the root directory of the working tree, where files are checked out
+	 * for viewing and editing.
+	 *
 	 * @return the root directory of the working tree, where files are checked
 	 *         out for viewing and editing.
-	 * @throws NoWorkTreeException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1526,7 +1581,7 @@
 	/**
 	 * Force a scan for changed refs.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public abstract void scanForRepoChanges() throws IOException;
 
@@ -1536,8 +1591,10 @@
 	public abstract void notifyIndexChanged();
 
 	/**
-	 * @param refName
+	 * Get a shortened more user friendly ref name
 	 *
+	 * @param refName
+	 *            a {@link java.lang.String} object.
 	 * @return a more user friendly ref name
 	 */
 	@NonNull
@@ -1552,7 +1609,10 @@
 	}
 
 	/**
+	 * Get a shortened more user friendly remote tracking branch name
+	 *
 	 * @param refName
+	 *            a {@link java.lang.String} object.
 	 * @return the remote branch name part of <code>refName</code>, i.e. without
 	 *         the <code>refs/remotes/&lt;remote&gt;</code> prefix, if
 	 *         <code>refName</code> represents a remote tracking branch;
@@ -1570,7 +1630,10 @@
 	}
 
 	/**
+	 * Get remote name
+	 *
 	 * @param refName
+	 *            a {@link java.lang.String} object.
 	 * @return the remote name part of <code>refName</code>, i.e. without the
 	 *         <code>refs/remotes/&lt;remote&gt;</code> prefix, if
 	 *         <code>refName</code> represents a remote tracking branch;
@@ -1591,7 +1654,7 @@
 	 * Read the {@code GIT_DIR/description} file for gitweb.
 	 *
 	 * @return description text; null if no description has been configured.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             description cannot be accessed.
 	 * @since 4.6
 	 */
@@ -1605,7 +1668,7 @@
 	 *
 	 * @param description
 	 *            new description; null to clear the description.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             description cannot be persisted.
 	 * @since 4.6
 	 */
@@ -1615,10 +1678,13 @@
 	}
 
 	/**
+	 * Get the reflog reader
+	 *
 	 * @param refName
-	 * @return a {@link ReflogReader} for the supplied refname, or {@code null}
-	 *         if the named ref does not exist.
-	 * @throws IOException
+	 *            a {@link java.lang.String} object.
+	 * @return a {@link org.eclipse.jgit.lib.ReflogReader} for the supplied
+	 *         refname, or {@code null} if the named ref does not exist.
+	 * @throws java.io.IOException
 	 *             the ref could not be accessed.
 	 * @since 3.0
 	 */
@@ -1633,8 +1699,8 @@
 	 *
 	 * @return a String containing the content of the MERGE_MSG file or
 	 *         {@code null} if this file doesn't exist
-	 * @throws IOException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1652,8 +1718,7 @@
 	 * @param msg
 	 *            the message which should be written or <code>null</code> to
 	 *            delete the file
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void writeMergeCommitMsg(String msg) throws IOException {
 		File mergeMsgFile = new File(gitDir, Constants.MERGE_MSG);
@@ -1667,8 +1732,8 @@
 	 *
 	 * @return a String containing the content of the COMMIT_EDITMSG file or
 	 *         {@code null} if this file doesn't exist
-	 * @throws IOException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 * @since 4.0
@@ -1686,8 +1751,7 @@
 	 * @param msg
 	 *            the message which should be written or {@code null} to delete
 	 *            the file
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.0
 	 */
 	public void writeCommitEditMsg(String msg) throws IOException {
@@ -1703,8 +1767,8 @@
 	 * @return a list of commits which IDs are listed in the MERGE_HEAD file or
 	 *         {@code null} if this file doesn't exist. Also if the file exists
 	 *         but is empty {@code null} will be returned
-	 * @throws IOException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1735,7 +1799,7 @@
 	 * @param heads
 	 *            a list of commits which IDs should be written to
 	 *            $GIT_DIR/MERGE_HEAD or <code>null</code> to delete the file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void writeMergeHeads(List<? extends ObjectId> heads) throws IOException {
 		writeHeadsFile(heads, Constants.MERGE_HEAD);
@@ -1747,8 +1811,8 @@
 	 * @return object id from CHERRY_PICK_HEAD file or {@code null} if this file
 	 *         doesn't exist. Also if the file exists but is empty {@code null}
 	 *         will be returned
-	 * @throws IOException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1771,8 +1835,8 @@
 	 * @return object id from REVERT_HEAD file or {@code null} if this file
 	 *         doesn't exist. Also if the file exists but is empty {@code null}
 	 *         will be returned
-	 * @throws IOException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1794,7 +1858,7 @@
 	 * @param head
 	 *            an object id of the cherry commit or <code>null</code> to
 	 *            delete the file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void writeCherryPickHead(ObjectId head) throws IOException {
 		List<ObjectId> heads = (head != null) ? Collections.singletonList(head)
@@ -1809,7 +1873,7 @@
 	 * @param head
 	 *            an object id of the revert commit or <code>null</code> to
 	 *            delete the file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void writeRevertHead(ObjectId head) throws IOException {
 		List<ObjectId> heads = (head != null) ? Collections.singletonList(head)
@@ -1823,7 +1887,7 @@
 	 * @param head
 	 *            an object id of the original HEAD commit or <code>null</code>
 	 *            to delete the file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void writeOrigHead(ObjectId head) throws IOException {
 		List<ObjectId> heads = head != null ? Collections.singletonList(head)
@@ -1837,8 +1901,8 @@
 	 * @return object id from ORIG_HEAD file or {@code null} if this file
 	 *         doesn't exist. Also if the file exists but is empty {@code null}
 	 *         will be returned
-	 * @throws IOException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
 	 */
@@ -1858,7 +1922,7 @@
 	 *
 	 * @return a String containing the content of the SQUASH_MSG file or
 	 *         {@code null} if this file doesn't exist
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @throws NoWorkTreeException
 	 *             if this is bare, which implies it has no working directory.
 	 *             See {@link #isBare()}.
@@ -1877,8 +1941,7 @@
 	 * @param msg
 	 *            the message which should be written or <code>null</code> to
 	 *            delete the file
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void writeSquashCommitMsg(String msg) throws IOException {
 		File squashMsgFile = new File(gitDir, Constants.SQUASH_MSG);
@@ -1974,7 +2037,7 @@
 	 * @param includeComments
 	 *            <code>true</code> if also comments should be reported
 	 * @return the list of steps
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.2
 	 */
 	@NonNull
@@ -1994,7 +2057,7 @@
 	 *            the steps to be written
 	 * @param append
 	 *            whether to append to an existing file or to write a new file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.2
 	 */
 	public void writeRebaseTodoFile(String path, List<RebaseTodoLine> steps,
@@ -2004,6 +2067,8 @@
 	}
 
 	/**
+	 * Get the names of all known remotes
+	 *
 	 * @return the names of all known remotes
 	 * @since 3.4
 	 */
@@ -2018,9 +2083,10 @@
 	 * collection; if not, exit without performing any work. Some JGit commands
 	 * run autoGC after performing operations that could create many loose
 	 * objects.
-	 * <p/>
+	 * <p>
 	 * Currently this option is supported for repositories of type
-	 * {@code FileRepository} only. See {@link GC#setAuto(boolean)} for
+	 * {@code FileRepository} only. See
+	 * {@link org.eclipse.jgit.internal.storage.file.GC#setAuto(boolean)} for
 	 * configuration details.
 	 *
 	 * @param monitor
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryBuilder.java
index 95be2d1..65196a8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryBuilder.java
@@ -46,7 +46,7 @@
 import java.io.File;
 
 /**
- * Base class to support constructing a {@link Repository}.
+ * Base class to support constructing a {@link org.eclipse.jgit.lib.Repository}.
  * <p>
  * Applications must set one of {@link #setGitDir(File)} or
  * {@link #setWorkTree(File)}, or use {@link #readEnvironment()} or
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java
index 53e9fe3..ce7ce8c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java
@@ -62,26 +62,30 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** Cache of active {@link Repository} instances. */
+/**
+ * Cache of active {@link org.eclipse.jgit.lib.Repository} instances.
+ */
 public class RepositoryCache {
-	private static final RepositoryCache cache = new RepositoryCache();
-
 	private final static Logger LOG = LoggerFactory
 			.getLogger(RepositoryCache.class);
 
+	private static final RepositoryCache cache = new RepositoryCache();
+
 	/**
 	 * Open an existing repository, reusing a cached instance if possible.
 	 * <p>
 	 * When done with the repository, the caller must call
-	 * {@link Repository#close()} to decrement the repository's usage counter.
+	 * {@link org.eclipse.jgit.lib.Repository#close()} to decrement the
+	 * repository's usage counter.
 	 *
 	 * @param location
-	 *            where the local repository is. Typically a {@link FileKey}.
+	 *            where the local repository is. Typically a
+	 *            {@link org.eclipse.jgit.lib.RepositoryCache.FileKey}.
 	 * @return the repository instance requested; caller must close when done.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be read (likely its core.version
 	 *             property is not supported).
-	 * @throws RepositoryNotFoundException
+	 * @throws org.eclipse.jgit.errors.RepositoryNotFoundException
 	 *             there is no repository at the given location.
 	 */
 	public static Repository open(final Key location) throws IOException,
@@ -93,16 +97,18 @@
 	 * Open a repository, reusing a cached instance if possible.
 	 * <p>
 	 * When done with the repository, the caller must call
-	 * {@link Repository#close()} to decrement the repository's usage counter.
+	 * {@link org.eclipse.jgit.lib.Repository#close()} to decrement the
+	 * repository's usage counter.
 	 *
 	 * @param location
-	 *            where the local repository is. Typically a {@link FileKey}.
+	 *            where the local repository is. Typically a
+	 *            {@link org.eclipse.jgit.lib.RepositoryCache.FileKey}.
 	 * @param mustExist
 	 *            If true, and the repository is not found, throws {@code
 	 *            RepositoryNotFoundException}. If false, a repository instance
 	 *            is created and registered anyway.
 	 * @return the repository instance requested; caller must close when done.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be read (likely its core.version
 	 *             property is not supported).
 	 * @throws RepositoryNotFoundException
@@ -118,9 +124,10 @@
 	 * Register one repository into the cache.
 	 * <p>
 	 * During registration the cache automatically increments the usage counter,
-	 * permitting it to retain the reference. A {@link FileKey} for the
-	 * repository's {@link Repository#getDirectory()} is used to index the
-	 * repository in the cache.
+	 * permitting it to retain the reference. A
+	 * {@link org.eclipse.jgit.lib.RepositoryCache.FileKey} for the repository's
+	 * {@link org.eclipse.jgit.lib.Repository#getDirectory()} is used to index
+	 * the repository in the cache.
 	 * <p>
 	 * If another repository already is registered in the cache at this
 	 * location, the other instance is closed.
@@ -156,8 +163,8 @@
 	 * <p>
 	 * Removes a repository from the cache, if it is still registered here. This
 	 * method will not close the repository, only remove it from the cache. See
-	 * {@link RepositoryCache#close(Repository)} to remove and close the
-	 * repository.
+	 * {@link org.eclipse.jgit.lib.RepositoryCache#close(Repository)} to remove
+	 * and close the repository.
 	 *
 	 * @param db
 	 *            repository to unregister.
@@ -174,8 +181,8 @@
 	 * <p>
 	 * Removes a repository from the cache, if it is still registered here. This
 	 * method will not close the repository, only remove it from the cache. See
-	 * {@link RepositoryCache#close(Repository)} to remove and close the
-	 * repository.
+	 * {@link org.eclipse.jgit.lib.RepositoryCache#close(Repository)} to remove
+	 * and close the repository.
 	 *
 	 * @param location
 	 *            location of the repository to remove.
@@ -186,6 +193,8 @@
 	}
 
 	/**
+	 * Get the locations of all repositories registered in the cache.
+	 *
 	 * @return the locations of all repositories registered in the cache.
 	 * @since 4.1
 	 */
@@ -202,7 +211,9 @@
 		return cache.cacheMap.get(key) == repo;
 	}
 
-	/** Unregister all repositories from the cache. */
+	/**
+	 * Unregister all repositories from the cache.
+	 */
 	public static void clear() {
 		cache.clearAll();
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCacheConfig.java
index 28cdaae..3680dee 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCacheConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCacheConfig.java
@@ -68,23 +68,32 @@
 
 	private long cleanupDelayMillis;
 
-	/** Create a default configuration. */
+	/**
+	 * Create a default configuration.
+	 */
 	public RepositoryCacheConfig() {
 		expireAfterMillis = TimeUnit.HOURS.toMillis(1);
 		cleanupDelayMillis = AUTO_CLEANUP_DELAY;
 	}
 
 	/**
-	 * @return the time an unused repository should expired and be evicted from
-	 *         the RepositoryCache in milliseconds. <b>Default is 1 hour.</b>
+	 * Get the time an unused repository should be expired and be evicted from
+	 * the RepositoryCache in milliseconds.
+	 *
+	 * @return the time an unused repository should be expired and be evicted
+	 *         from the RepositoryCache in milliseconds. <b>Default is 1
+	 *         hour.</b>
 	 */
 	public long getExpireAfter() {
 		return expireAfterMillis;
 	}
 
 	/**
+	 * Set the time an unused repository should be expired and be evicted from
+	 * the RepositoryCache in milliseconds.
+	 *
 	 * @param expireAfterMillis
-	 *            the time an unused repository should expired and be evicted
+	 *            the time an unused repository should be expired and be evicted
 	 *            from the RepositoryCache in milliseconds.
 	 */
 	public void setExpireAfter(long expireAfterMillis) {
@@ -92,6 +101,9 @@
 	}
 
 	/**
+	 * Get the delay between the periodic cleanup of expired repository in
+	 * milliseconds.
+	 *
 	 * @return the delay between the periodic cleanup of expired repository in
 	 *         milliseconds. <b>Default is minimum of 1/10 of expireAfterMillis
 	 *         and 10 minutes</b>
@@ -105,6 +117,9 @@
 	}
 
 	/**
+	 * Set the delay between the periodic cleanup of expired repository in
+	 * milliseconds.
+	 *
 	 * @param cleanupDelayMillis
 	 *            the delay between the periodic cleanup of expired repository
 	 *            in milliseconds. Set it to {@link #AUTO_CLEANUP_DELAY} to
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java
index 9b7234b..c5d81b3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java
@@ -381,7 +381,9 @@
 	};
 
 	/**
-	 * @return true if changing HEAD is sane.
+	 * Whether checkout can be done.
+	 *
+	 * @return whether checkout can be done.
 	 */
 	public abstract boolean canCheckout();
 
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 344d520..42ab891 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/StoredConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/StoredConfig.java
@@ -51,7 +51,9 @@
  * Persistent configuration that can be stored and loaded from a location.
  */
 public abstract class StoredConfig extends Config {
-	/** Create a configuration with no default fallback. */
+	/**
+	 * Create a configuration with no default fallback.
+	 */
 	public StoredConfig() {
 		super();
 	}
@@ -73,9 +75,9 @@
 	 * If the configuration does not exist, this configuration is cleared, and
 	 * thus behaves the same as though the backing store exists, but is empty.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the configuration could not be read (but does exist).
-	 * @throws ConfigInvalidException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 *             the configuration is not properly formatted.
 	 */
 	public abstract void load() throws IOException, ConfigInvalidException;
@@ -83,11 +85,12 @@
 	/**
 	 * Save the configuration to the persistent store.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the configuration could not be written.
 	 */
 	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 71d5cd7..d4b83b0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
@@ -47,7 +47,8 @@
 import org.eclipse.jgit.annotations.Nullable;
 
 /**
- * A reference that indirectly points at another {@link Ref}.
+ * A reference that indirectly points at another
+ * {@link org.eclipse.jgit.lib.Ref}.
  * <p>
  * A symbolic reference always derives its current value from the target
  * reference.
@@ -70,17 +71,20 @@
 		this.target = target;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public String getName() {
 		return name;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isSymbolic() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@NonNull
 	public Ref getLeaf() {
@@ -90,35 +94,41 @@
 		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();
 	}
 
+	/** {@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 3490a5b..90ef5c7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TagBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TagBuilder.java
@@ -72,12 +72,20 @@
 
 	private String message;
 
-	/** @return the type of object this tag refers to. */
+	/**
+	 * Get the type of object this tag refers to.
+	 *
+	 * @return the type of object this tag refers to.
+	 */
 	public int getObjectType() {
 		return type;
 	}
 
-	/** @return the object this tag refers to. */
+	/**
+	 * Get the object this tag refers to.
+	 *
+	 * @return the object this tag refers to.
+	 */
 	public ObjectId getObjectId() {
 		return object;
 	}
@@ -105,7 +113,11 @@
 		setObjectId(obj, obj.getType());
 	}
 
-	/** @return short name of the tag (no {@code refs/tags/} prefix). */
+	/**
+	 * Get short name of the tag (no {@code refs/tags/} prefix).
+	 *
+	 * @return short name of the tag (no {@code refs/tags/} prefix).
+	 */
 	public String getTag() {
 		return tag;
 	}
@@ -122,7 +134,11 @@
 		this.tag = shortName;
 	}
 
-	/** @return creator of this tag. May be null. */
+	/**
+	 * Get creator of this tag.
+	 *
+	 * @return creator of this tag. May be null.
+	 */
 	public PersonIdent getTagger() {
 		return tagger;
 	}
@@ -137,7 +153,11 @@
 		tagger = taggerIdent;
 	}
 
-	/** @return the complete commit message. */
+	/**
+	 * Get the complete commit message.
+	 *
+	 * @return the complete commit message.
+	 */
 	public String getMessage() {
 		return message;
 	}
@@ -203,6 +223,7 @@
 		return build();
 	}
 
+	/** {@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 c31c3c6..936ce3d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TextProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TextProgressMonitor.java
@@ -51,13 +51,17 @@
 import java.io.PrintWriter;
 import java.io.Writer;
 
-/** A simple progress reporter printing on a stream. */
+/**
+ * A simple progress reporter printing on a stream.
+ */
 public class TextProgressMonitor extends BatchingProgressMonitor {
 	private final Writer out;
 
 	private boolean write;
 
-	/** Initialize a new progress monitor. */
+	/**
+	 * Initialize a new progress monitor.
+	 */
 	public TextProgressMonitor() {
 		this(new PrintWriter(new OutputStreamWriter(System.err, UTF_8)));
 	}
@@ -73,6 +77,7 @@
 		this.write = true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int workCurr) {
 		StringBuilder s = new StringBuilder();
@@ -80,6 +85,7 @@
 		send(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int workCurr) {
 		StringBuilder s = new StringBuilder();
@@ -97,6 +103,7 @@
 		s.append(workCurr);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt) {
 		StringBuilder s = new StringBuilder();
@@ -104,6 +111,7 @@
 		send(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int cmp, int totalWork, int pcnt) {
 		StringBuilder s = new StringBuilder();
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 5824a55..7e7d45d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ThreadSafeProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ThreadSafeProgressMonitor.java
@@ -48,7 +48,8 @@
 import java.util.concurrent.locks.ReentrantLock;
 
 /**
- * Wrapper around the general {@link ProgressMonitor} to make it thread safe.
+ * Wrapper around the general {@link org.eclipse.jgit.lib.ProgressMonitor} to
+ * make it thread safe.
  *
  * Updates to the underlying ProgressMonitor are made only from the thread that
  * allocated this wrapper. Callers are responsible for ensuring the allocating
@@ -87,6 +88,7 @@
 		this.process = new Semaphore(0);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void start(int totalTasks) {
 		if (!isMainThread())
@@ -94,6 +96,7 @@
 		pm.start(totalTasks);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void beginTask(String title, int totalWork) {
 		if (!isMainThread())
@@ -101,7 +104,9 @@
 		pm.beginTask(title, totalWork);
 	}
 
-	/** Notify the monitor a worker is starting. */
+	/**
+	 * Notify the monitor a worker is starting.
+	 */
 	public void startWorker() {
 		startWorkers(1);
 	}
@@ -116,7 +121,9 @@
 		workers.addAndGet(count);
 	}
 
-	/** Notify the monitor a worker is finished. */
+	/**
+	 * Notify the monitor a worker is finished.
+	 */
 	public void endWorker() {
 		if (workers.decrementAndGet() == 0)
 			process.release();
@@ -139,7 +146,7 @@
 	 * This method can only be invoked by the same thread that allocated this
 	 * ThreadSafeProgressMonior.
 	 *
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             if the main thread is interrupted while waiting for
 	 *             completion of workers.
 	 */
@@ -158,12 +165,14 @@
 			pm.update(cnt);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void update(int completed) {
 		if (0 == pendingUpdates.getAndAdd(completed))
 			process.release();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isCancelled() {
 		lock.lock();
@@ -174,6 +183,7 @@
 		}
 	}
 
+	/** {@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 777ce94..0d78d59 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
@@ -94,7 +94,9 @@
 
 	private TemporaryBuffer.Heap overflowBuffer;
 
-	/** Create an empty formatter with a default buffer size. */
+	/**
+	 * Create an empty formatter with a default buffer size.
+	 */
 	public TreeFormatter() {
 		this(8192);
 	}
@@ -112,7 +114,7 @@
 	}
 
 	/**
-	 * Add a link to a submodule commit, mode is {@link FileMode#GITLINK}.
+	 * Add a link to a submodule commit, mode is {@link org.eclipse.jgit.lib.FileMode#GITLINK}.
 	 *
 	 * @param name
 	 *            name of the entry.
@@ -124,7 +126,7 @@
 	}
 
 	/**
-	 * Add a subtree, mode is {@link FileMode#TREE}.
+	 * Add a subtree, mode is {@link org.eclipse.jgit.lib.FileMode#TREE}.
 	 *
 	 * @param name
 	 *            name of the entry.
@@ -136,7 +138,7 @@
 	}
 
 	/**
-	 * Add a regular file, mode is {@link FileMode#REGULAR_FILE}.
+	 * Add a regular file, mode is {@link org.eclipse.jgit.lib.FileMode#REGULAR_FILE}.
 	 *
 	 * @param name
 	 *            name of the entry.
@@ -307,7 +309,7 @@
 	 * @param ins
 	 *            the inserter to store the tree.
 	 * @return computed ObjectId of the tree
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the tree could not be stored.
 	 */
 	public ObjectId insertTo(ObjectInserter ins) throws IOException {
@@ -321,7 +323,7 @@
 	/**
 	 * Compute the ObjectId for this tree
 	 *
-	 * @param ins
+	 * @param ins a {@link org.eclipse.jgit.lib.ObjectInserter} object.
 	 * @return ObjectId for this tree
 	 */
 	public ObjectId computeId(ObjectInserter ins) {
@@ -343,7 +345,8 @@
 	 * This method is not efficient, as it needs to create a copy of the
 	 * internal buffer in order to supply an array of the correct size to the
 	 * caller. If the buffer is just to pass to an ObjectInserter, consider
-	 * using {@link ObjectInserter#insert(TreeFormatter)} instead.
+	 * using {@link org.eclipse.jgit.lib.ObjectInserter#insert(TreeFormatter)}
+	 * instead.
 	 *
 	 * @return a copy of this formatter's buffer.
 	 */
@@ -362,6 +365,7 @@
 		}
 	}
 
+	/** {@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 594edef..aca2ad2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TypedConfigGetter.java
@@ -50,15 +50,15 @@
 import org.eclipse.jgit.transport.RefSpec;
 
 /**
- * Something that knows how to convert plain strings from a git {@link Config}
- * to typed values.
+ * Something that knows how to convert plain strings from a git
+ * {@link org.eclipse.jgit.lib.Config} to typed values.
  *
  * @since 4.9
  */
 public interface TypedConfigGetter {
 
 	/**
-	 * Get a boolean value from a git {@link Config}.
+	 * Get a boolean value from a git {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param config
 	 *            to get the value from
@@ -77,10 +77,8 @@
 			String name, boolean defaultValue);
 
 	/**
-	 * Parse an enumeration from a git {@link Config}.
+	 * Parse an enumeration from a git {@link org.eclipse.jgit.lib.Config}.
 	 *
-	 * @param <T>
-	 *            type of the enumeration object.
 	 * @param config
 	 *            to get the value from
 	 * @param all
@@ -100,7 +98,7 @@
 			String subsection, String name, T defaultValue);
 
 	/**
-	 * Obtain an integer value from a git {@link Config}.
+	 * Obtain an integer value from a git {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param config
 	 *            to get the value from
@@ -118,7 +116,7 @@
 			int defaultValue);
 
 	/**
-	 * Obtain a long value from a git {@link Config}.
+	 * Obtain a long value from a git {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param config
 	 *            to get the value from
@@ -137,7 +135,7 @@
 
 	/**
 	 * Parse a numerical time unit, such as "1 minute", from a git
-	 * {@link Config}.
+	 * {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param config
 	 *            to get the value from
@@ -161,7 +159,8 @@
 
 
 	/**
-	 * Parse a list of {@link RefSpec}s from a git {@link Config}.
+	 * Parse a list of {@link org.eclipse.jgit.transport.RefSpec}s from a git
+	 * {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param config
 	 *            to get the list from
@@ -171,7 +170,8 @@
 	 *            subsection the key is in, or null if not in a subsection.
 	 * @param name
 	 *            the key name.
-	 * @return a possibly empty list of {@link RefSpec}s
+	 * @return a possibly empty list of
+	 *         {@link org.eclipse.jgit.transport.RefSpec}s
 	 */
 	@NonNull
 	List<RefSpec> getRefSpecs(Config config, String section, String subsection,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/UserConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/UserConfig.java
index 102a451..1a3c6f6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/UserConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/UserConfig.java
@@ -48,7 +48,9 @@
 import org.eclipse.jgit.lib.Config.SectionParser;
 import org.eclipse.jgit.util.SystemReader;
 
-/** The standard "user" configuration parameters. */
+/**
+ * The standard "user" configuration parameters.
+ */
 public class UserConfig {
 	/** Key for {@link Config#get(SectionParser)}. */
 	public static final Config.SectionParser<UserConfig> KEY = UserConfig::new;
@@ -94,6 +96,8 @@
 	}
 
 	/**
+	 * Get the author name as defined in the git variables and configurations.
+	 *
 	 * @return the author name as defined in the git variables and
 	 *         configurations. If no name could be found, try to use the system
 	 *         user name instead.
@@ -103,6 +107,9 @@
 	}
 
 	/**
+	 * Get the committer name as defined in the git variables and
+	 * configurations.
+	 *
 	 * @return the committer name as defined in the git variables and
 	 *         configurations. If no name could be found, try to use the system
 	 *         user name instead.
@@ -112,26 +119,31 @@
 	}
 
 	/**
-	 * @return the author email as defined in git variables and
-	 *         configurations. If no email could be found, try to
-	 *         propose one default with the user name and the
-	 *         host name.
+	 * Get the author email as defined in git variables and configurations.
+	 *
+	 * @return the author email as defined in git variables and configurations.
+	 *         If no email could be found, try to propose one default with the
+	 *         user name and the host name.
 	 */
 	public String getAuthorEmail() {
 		return authorEmail;
 	}
 
 	/**
+	 * Get the committer email as defined in git variables and configurations.
+	 *
 	 * @return the committer email as defined in git variables and
-	 *         configurations. If no email could be found, try to
-	 *         propose one default with the user name and the
-	 *         host name.
+	 *         configurations. If no email could be found, try to propose one
+	 *         default with the user name and the host name.
 	 */
 	public String getCommitterEmail() {
 		return committerEmail;
 	}
 
 	/**
+	 * Whether the author name was not explicitly configured but constructed
+	 * from information the system has about the logged on user
+	 *
 	 * @return true if the author name was not explicitly configured but
 	 *         constructed from information the system has about the logged on
 	 *         user
@@ -141,6 +153,9 @@
 	}
 
 	/**
+	 * Whether the author email was not explicitly configured but constructed
+	 * from information the system has about the logged on user
+	 *
 	 * @return true if the author email was not explicitly configured but
 	 *         constructed from information the system has about the logged on
 	 *         user
@@ -150,6 +165,9 @@
 	}
 
 	/**
+	 * Whether the committer name was not explicitly configured but constructed
+	 * from information the system has about the logged on user
+	 *
 	 * @return true if the committer name was not explicitly configured but
 	 *         constructed from information the system has about the logged on
 	 *         user
@@ -159,6 +177,9 @@
 	}
 
 	/**
+	 * Whether the author email was not explicitly configured but constructed
+	 * from information the system has about the logged on user
+	 *
 	 * @return true if the author email was not explicitly configured but
 	 *         constructed from information the system has about the logged on
 	 *         user
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/internal/WorkQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/internal/WorkQueue.java
index 3303f47..8f8aad5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/internal/WorkQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/internal/WorkQueue.java
@@ -71,6 +71,7 @@
 					public Thread newThread(Runnable taskBody) {
 						Thread thr = baseFactory.newThread(taskBody);
 						thr.setName("JGit-WorkQueue"); //$NON-NLS-1$
+						thr.setContextClassLoader(null);
 						thr.setDaemon(true);
 						return thr;
 					}
@@ -95,6 +96,8 @@
 	}
 
 	/**
+	 * Get the WorkQueue's executor
+	 *
 	 * @return the WorkQueue's executor
 	 */
 	public static ScheduledThreadPoolExecutor getExecutor() {
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 1ddac18..e44970a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java
@@ -79,12 +79,14 @@
 		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 04c65ef..dd42e43 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java
@@ -57,14 +57,15 @@
 
 /**
  * Provides the merge algorithm which does a three-way merge on content provided
- * as RawText. By default {@link HistogramDiff} is used as diff algorithm.
+ * as RawText. By default {@link org.eclipse.jgit.diff.HistogramDiff} is used as
+ * diff algorithm.
  */
 public final class MergeAlgorithm {
 	private final DiffAlgorithm diffAlg;
 
 	/**
-	 * Creates a new MergeAlgorithm which uses {@link HistogramDiff} as diff
-	 * algorithm
+	 * Creates a new MergeAlgorithm which uses
+	 * {@link org.eclipse.jgit.diff.HistogramDiff} as diff algorithm
 	 */
 	public MergeAlgorithm() {
 		this(new HistogramDiff());
@@ -88,8 +89,6 @@
 	/**
 	 * Does the three way merge between a common base and two sequences.
 	 *
-	 * @param <S>
-	 *            type of sequence.
 	 * @param cmp comparison method for this execution.
 	 * @param base the common base sequence
 	 * @param ours the first sequence to be merged
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 72857ff..3867eea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeChunk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeChunk.java
@@ -97,7 +97,8 @@
 	 *            merge result. All elements between begin (including begin) and
 	 *            this element are added.
 	 * @param conflictState
-	 *            the state of this chunk. See {@link ConflictState}
+	 *            the state of this chunk. See
+	 *            {@link org.eclipse.jgit.merge.MergeChunk.ConflictState}
 	 */
 	protected MergeChunk(int sequenceIndex, int begin, int end,
 			ConflictState conflictState) {
@@ -108,7 +109,9 @@
 	}
 
 	/**
-	 * @return the index of the sequence to which sequence this chunks belongs
+	 * Get the index of the sequence to which this sequence chunks belongs to.
+	 *
+	 * @return the index of the sequence to which this sequence chunks belongs
 	 *         to. Same as in {@link org.eclipse.jgit.merge.MergeResult#add}
 	 */
 	public int getSequenceIndex() {
@@ -116,6 +119,9 @@
 	}
 
 	/**
+	 * Get the first element from the specified sequence which should be
+	 * included in the merge result.
+	 *
 	 * @return the first element from the specified sequence which should be
 	 *         included in the merge result. Indexes start with 0.
 	 */
@@ -124,17 +130,22 @@
 	}
 
 	/**
-	 * @return the end of the range of this chunk. The element this index
-	 *         points to is the first element which not added to the merge
-	 *         result. All elements between begin (including begin) and this
-	 *         element are added.
+	 * Get the end of the range of this chunk.
+	 *
+	 * @return the end of the range of this chunk. The element this index points
+	 *         to is the first element which not added to the merge result. All
+	 *         elements between begin (including begin) and this element are
+	 *         added.
 	 */
 	public int getEnd() {
 		return end;
 	}
 
 	/**
-	 * @return the state of this chunk. See {@link ConflictState}
+	 * Get the state of this chunk.
+	 *
+	 * @return the state of this chunk. See
+	 *         {@link org.eclipse.jgit.merge.MergeChunk.ConflictState}
 	 */
 	public ConflictState getConflictState() {
 		return conflictState;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java
index d059391..cdbe3cd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeConfig.java
@@ -58,7 +58,10 @@
 public class MergeConfig {
 
 	/**
+	 * Get merge configuration for the current branch of the repository
+	 *
 	 * @param repo
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @return merge configuration for the current branch of the repository
 	 */
 	public static MergeConfig getConfigForCurrentBranch(Repository repo) {
@@ -74,10 +77,14 @@
 	}
 
 	/**
+	 * Get a parser for use with
+	 * {@link org.eclipse.jgit.lib.Config#get(SectionParser)}
+	 *
 	 * @param branch
 	 *            short branch name to get the configuration for, as returned
-	 *            e.g. by {@link Repository#getBranch()}
-	 * @return a parser for use with {@link Config#get(SectionParser)}
+	 *            e.g. by {@link org.eclipse.jgit.lib.Repository#getBranch()}
+	 * @return a parser for use with
+	 *         {@link org.eclipse.jgit.lib.Config#get(SectionParser)}
 	 */
 	public static final SectionParser<MergeConfig> getParser(
 			final String branch) {
@@ -104,6 +111,8 @@
 	}
 
 	/**
+	 * Get the fast forward mode configured for this branch
+	 *
 	 * @return the fast forward mode configured for this branch
 	 */
 	public FastForwardMode getFastForwardMode() {
@@ -111,6 +120,9 @@
 	}
 
 	/**
+	 * Whether merges into this branch are configured to be squash merges, false
+	 * otherwise
+	 *
 	 * @return true if merges into this branch are configured to be squash
 	 *         merges, false otherwise
 	 */
@@ -119,8 +131,10 @@
 	}
 
 	/**
-	 * @return false if --no-commit is configured for this branch, true
-	 *         otherwise (event if --squash is configured)
+	 * Whether {@code --no-commit} option is not set.
+	 *
+	 * @return {@code false} if --no-commit is configured for this branch,
+	 *         {@code true} otherwise (even if --squash is configured)
 	 */
 	public boolean isCommit() {
 		return commit;
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 43876a6..036917e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
@@ -55,11 +55,12 @@
  */
 public class MergeFormatter {
 	/**
-	 * Formats the results of a merge of {@link RawText} objects in a Git
-	 * conformant way. This method also assumes that the {@link 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.
+	 * Formats the results of a merge of {@link org.eclipse.jgit.diff.RawText}
+	 * objects in a Git conformant way. 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 outputstream where to write the textual presentation
@@ -67,13 +68,13 @@
 	 *            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
+	 *            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 charsetName
 	 *            the name of the characterSet used when writing conflict
 	 *            metadata
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void formatMerge(OutputStream out, MergeResult<RawText> res,
 			List<String> seqName, String charsetName) throws IOException {
@@ -81,13 +82,14 @@
 	}
 
 	/**
-	 * Formats the results of a merge of exactly two {@link RawText} objects in
-	 * a Git conformant way. 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
+	 * 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
+	 * and the two merged sequences) as explicit parameters and doesn't require
+	 * the caller to specify a List
 	 *
 	 * @param out
-	 *            the {@link OutputStream} where to write the textual
+	 *            the {@link java.io.OutputStream} where to write the textual
 	 *            presentation
 	 * @param res
 	 *            the merge result which should be presented
@@ -100,7 +102,7 @@
 	 * @param charsetName
 	 *            the name of the characterSet used when writing conflict
 	 *            metadata
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	@SuppressWarnings("unchecked")
 	public void formatMerge(OutputStream out, MergeResult res, String baseName,
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 ff3c8ab..062d86f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java
@@ -51,14 +51,14 @@
 import org.eclipse.jgit.util.IntList;
 
 /**
- * The result of merging a number of {@link Sequence} objects. These sequences
- * have one common predecessor sequence. The result of a merge is a list of
- * MergeChunks. Each MergeChunk contains either a range (a subsequence) from
- * one of the merged sequences, a range from the common predecessor or a
- * conflicting range from one of the merged sequences. A conflict will be
- * reported as multiple chunks, one for each conflicting range. The first chunk
- * for a conflict is marked specially to distinguish the border between two
- * consecutive conflicts.
+ * The result of merging a number of {@link org.eclipse.jgit.diff.Sequence}
+ * objects. These sequences have one common predecessor sequence. The result of
+ * a merge is a list of MergeChunks. Each MergeChunk contains either a range (a
+ * subsequence) from one of the merged sequences, a range from the common
+ * predecessor or a conflicting range from one of the merged sequences. A
+ * conflict will be reported as multiple chunks, one for each conflicting range.
+ * The first chunk for a conflict is marked specially to distinguish the border
+ * between two consecutive conflicts.
  * <p>
  * This class does not know anything about how to present the merge result to
  * the end-user. MergeFormatters have to be used to construct something human
@@ -80,7 +80,8 @@
 	 * @param sequences
 	 *            contains the common predecessor sequence at position 0
 	 *            followed by the merged sequences. This list should not be
-	 *            modified anymore during the lifetime of this {@link MergeResult}.
+	 *            modified anymore during the lifetime of this
+	 *            {@link org.eclipse.jgit.merge.MergeResult}.
 	 */
 	public MergeResult(List<S> sequences) {
 		this.sequences = sequences;
@@ -129,10 +130,7 @@
 
 	static final ConflictState[] states = ConflictState.values();
 
-	/**
-	 * @return an iterator over the MergeChunks. The iterator does not support
-	 * the remove operation
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Iterator<MergeChunk> iterator() {
 		return new Iterator<MergeChunk>() {
@@ -160,6 +158,8 @@
 	}
 
 	/**
+	 * Whether this merge result contains conflicts
+	 *
 	 * @return true if this merge result contains conflicts
 	 */
 	public boolean containsConflicts() {
@@ -173,6 +173,8 @@
 	 * markers!) as new conflict-free content
 	 *
 	 * @param containsConflicts
+	 *            whether this merge should be seen as containing a conflict or
+	 *            not.
 	 * @since 3.5
 	 */
 	protected void setContainsConflicts(boolean containsConflicts) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeStrategy.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeStrategy.java
index af3d5ca..520ea6e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeStrategy.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeStrategy.java
@@ -97,7 +97,7 @@
 	 *
 	 * @param imp
 	 *            the strategy to register.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             a strategy by the same name has already been registered.
 	 */
 	public static void register(final MergeStrategy imp) {
@@ -111,7 +111,7 @@
 	 *            name the strategy can be looked up under.
 	 * @param imp
 	 *            the strategy to register.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             a strategy by the same name has already been registered.
 	 */
 	public static synchronized void register(final String name,
@@ -146,7 +146,11 @@
 		return r;
 	}
 
-	/** @return default name of this strategy implementation. */
+	/**
+	 * Get default name of this strategy implementation.
+	 *
+	 * @return default name of this strategy implementation.
+	 */
 	public abstract String getName();
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java
index 0c4488c..cd19d69 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java
@@ -68,7 +68,8 @@
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 
 /**
- * Instance of a specific {@link MergeStrategy} for a single {@link Repository}.
+ * Instance of a specific {@link org.eclipse.jgit.merge.MergeStrategy} for a
+ * single {@link org.eclipse.jgit.lib.Repository}.
  */
 public abstract class Merger {
 	/**
@@ -138,6 +139,8 @@
 	}
 
 	/**
+	 * Get the repository this merger operates on.
+	 *
 	 * @return the repository this merger operates on.
 	 */
 	@Nullable
@@ -146,8 +149,10 @@
 	}
 
 	/**
+	 * Get non-null repository instance
+	 *
 	 * @return non-null repository instance
-	 * @throws NullPointerException
+	 * @throws java.lang.NullPointerException
 	 *             if the merger was constructed without a repository.
 	 * @since 4.8
 	 */
@@ -159,8 +164,11 @@
 	}
 
 	/**
-	 * @return an object writer to create objects, writing objects to {@link
-	 * #getRepository()} (if a repository was provided).
+	 * Get an object writer to create objects, writing objects to
+	 * {@link #getRepository()}
+	 *
+	 * @return an object writer to create objects, writing objects to
+	 *         {@link #getRepository()} (if a repository was provided).
 	 */
 	public ObjectInserter getObjectInserter() {
 		return inserter;
@@ -203,7 +211,7 @@
 	 * @throws IncorrectObjectTypeException
 	 *             one of the input objects is not a commit, but the strategy
 	 *             requires it to be a commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             one or more sources could not be read, or outputs could not
 	 *             be written to the Repository.
 	 */
@@ -231,7 +239,7 @@
 	 * @throws IncorrectObjectTypeException
 	 *             one of the input objects is not a commit, but the strategy
 	 *             requires it to be a commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             one or more sources could not be read, or outputs could not
 	 *             be written to the Repository.
 	 */
@@ -267,6 +275,8 @@
 	}
 
 	/**
+	 * Get the ID of the commit that was used as merge base for merging
+	 *
 	 * @return the ID of the commit that was used as merge base for merging, or
 	 *         null if no merge base was used or it was set manually
 	 * @since 3.2
@@ -281,9 +291,9 @@
 	 * @param b
 	 *            the second commit in {@link #sourceObjects}.
 	 * @return the merge base of two commits
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             one of the input objects is not a commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             objects are missing or multiple merge bases were found.
 	 * @since 3.0
 	 */
@@ -313,9 +323,9 @@
 	 * @param treeId
 	 *            the tree to scan; must be a tree (not a treeish).
 	 * @return an iterator for the tree.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the input object is not a tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the tree object is not found or cannot be read.
 	 */
 	protected AbstractTreeIterator openTree(final AnyObjectId treeId)
@@ -336,13 +346,15 @@
 	 * @throws IncorrectObjectTypeException
 	 *             one of the input objects is not a commit, but the strategy
 	 *             requires it to be a commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             one or more sources could not be read, or outputs could not
 	 *             be written to the Repository.
 	 */
 	protected abstract boolean mergeImpl() throws IOException;
 
 	/**
+	 * Get resulting tree.
+	 *
 	 * @return resulting tree, if {@link #merge(AnyObjectId[])} returned true.
 	 */
 	public abstract ObjectId getResultTreeId();
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 1375cd3..a621a05 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java
@@ -83,6 +83,7 @@
  * - uses "Lists" instead of Arrays for chained types
  *
  * - recursively merges the merge bases together to compute a usable base
+ *
  * @since 3.0
  */
 public class RecursiveMerger extends ResolveMerger {
@@ -97,7 +98,9 @@
 	 * inCore
 	 *
 	 * @param local
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param inCore
+	 *            a boolean.
 	 */
 	protected RecursiveMerger(Repository local, boolean inCore) {
 		super(local, inCore);
@@ -106,7 +109,7 @@
 	/**
 	 * Normal recursive merge, implies not inCore
 	 *
-	 * @param local
+	 * @param local a {@link org.eclipse.jgit.lib.Repository} object.
 	 */
 	protected RecursiveMerger(Repository local) {
 		this(local, false);
@@ -116,7 +119,9 @@
 	 * Normal recursive merge, implies inCore.
 	 *
 	 * @param inserter
+	 *            an {@link org.eclipse.jgit.lib.ObjectInserter} object.
 	 * @param config
+	 *            the repository configuration
 	 * @since 4.8
 	 */
 	protected RecursiveMerger(ObjectInserter inserter, Config config) {
@@ -124,12 +129,11 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Get a single base commit for two given commits. If the two source commits
 	 * have more than one base commit recursively merge the base commits
 	 * together until you end up with a single base commit.
-	 *
-	 * @throws IOException
-	 * @throws IncorrectObjectTypeException
 	 */
 	@Override
 	protected RevCommit getBaseCommit(RevCommit a, RevCommit b)
@@ -151,7 +155,7 @@
 	 * @return the merge base of two commits. If a criss-cross merge required a
 	 *         synthetic merge base this commit is visible only the merger's
 	 *         RevWalk and will not be in the repository.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @throws IncorrectObjectTypeException
 	 *             one of the input objects is not a commit.
 	 * @throws NoMergeBaseException
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 246121b..6d43f09 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java
@@ -79,6 +79,7 @@
 import org.eclipse.jgit.dircache.DirCacheBuilder;
 import org.eclipse.jgit.dircache.DirCacheCheckout;
 import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.BinaryBlobException;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.IndexWriteException;
@@ -89,9 +90,11 @@
 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.Repository;
 import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.storage.pack.PackConfig;
 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.NameConflictTreeWalk;
@@ -296,8 +299,12 @@
 	}
 
 	/**
+	 * Constructor for ResolveMerger.
+	 *
 	 * @param local
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 * @param inCore
+	 *            a boolean.
 	 */
 	protected ResolveMerger(Repository local, boolean inCore) {
 		super(local);
@@ -316,15 +323,22 @@
 	}
 
 	/**
+	 * Constructor for ResolveMerger.
+	 *
 	 * @param local
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 */
 	protected ResolveMerger(Repository local) {
 		this(local, false);
 	}
 
 	/**
+	 * Constructor for ResolveMerger.
+	 *
 	 * @param inserter
+	 *            an {@link org.eclipse.jgit.lib.ObjectInserter} object.
 	 * @param config
+	 *            the repository configuration
 	 * @since 4.8
 	 */
 	protected ResolveMerger(ObjectInserter inserter, Config config) {
@@ -336,6 +350,7 @@
 		dircache = DirCache.newInCore();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected boolean mergeImpl() throws IOException {
 		if (implicitDirCache)
@@ -376,9 +391,9 @@
 	 * contained only stage 0. In case if inCore operation just clear the
 	 * history of modified files.
 	 *
-	 * @throws IOException
-	 * @throws CorruptObjectException
-	 * @throws NoWorkTreeException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.NoWorkTreeException
 	 * @since 3.4
 	 */
 	protected void cleanUp() throws NoWorkTreeException,
@@ -479,16 +494,15 @@
 	 *            the file in the working tree
 	 * @param ignoreConflicts
 	 *            see
-	 *            {@link ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
 	 * @return <code>false</code> if the merge will fail because the index entry
 	 *         didn't match ours or the working-dir file was dirty and a
 	 *         conflict occurred
-	 * @throws MissingObjectException
-	 * @throws IncorrectObjectTypeException
-	 * @throws CorruptObjectException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 * @throws java.io.IOException
 	 * @since 3.5
-	 * @deprecated
 	 */
 	@Deprecated
 	protected boolean processEntry(CanonicalTreeParser base,
@@ -535,16 +549,16 @@
 	 *            the file in the working tree
 	 * @param ignoreConflicts
 	 *            see
-	 *            {@link ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
 	 * @param attributes
 	 *            the attributes defined for this entry
 	 * @return <code>false</code> if the merge will fail because the index entry
 	 *         didn't match ours or the working-dir file was dirty and a
 	 *         conflict occurred
-	 * @throws MissingObjectException
-	 * @throws IncorrectObjectTypeException
-	 * @throws CorruptObjectException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
+	 * @throws java.io.IOException
 	 * @since 4.9
 	 */
 	protected boolean processEntry(CanonicalTreeParser base,
@@ -723,6 +737,7 @@
 			// OURS or THEIRS has been deleted
 			if (((modeO != 0 && !tw.idEqual(T_BASE, T_OURS)) || (modeT != 0 && !tw
 					.idEqual(T_BASE, T_THEIRS)))) {
+				MergeResult<RawText> result = contentMerge(base, ours, theirs);
 
 				add(tw.getRawPath(), base, DirCacheEntry.STAGE_1, 0, 0);
 				add(tw.getRawPath(), ours, DirCacheEntry.STAGE_2, 0, 0);
@@ -743,8 +758,7 @@
 				unmergedPaths.add(tw.getPathString());
 
 				// generate a MergeResult for the deleted file
-				mergeResults.put(tw.getPathString(),
-						contentMerge(base, ours, theirs));
+				mergeResults.put(tw.getPathString(), result);
 			}
 		}
 		return true;
@@ -765,12 +779,22 @@
 	private MergeResult<RawText> contentMerge(CanonicalTreeParser base,
 			CanonicalTreeParser ours, CanonicalTreeParser theirs)
 			throws IOException {
-		RawText baseText = base == null ? RawText.EMPTY_TEXT : getRawText(
+		RawText baseText;
+		RawText ourText;
+		RawText theirsText;
+
+		try {
+			baseText = base == null ? RawText.EMPTY_TEXT : getRawText(
 				base.getEntryObjectId(), reader);
-		RawText ourText = ours == null ? RawText.EMPTY_TEXT : getRawText(
+			ourText = ours == null ? RawText.EMPTY_TEXT : getRawText(
 				ours.getEntryObjectId(), reader);
-		RawText theirsText = theirs == null ? RawText.EMPTY_TEXT : getRawText(
+			theirsText = theirs == null ? RawText.EMPTY_TEXT : getRawText(
 				theirs.getEntryObjectId(), reader);
+		} catch (BinaryBlobException e) {
+			MergeResult<RawText> r = new MergeResult<>(Collections.<RawText>emptyList());
+			r.setContainsConflicts(true);
+			return r;
+		}
 		return (mergeAlgorithm.merge(RawTextComparator.DEFAULT, baseText,
 				ourText, theirsText));
 	}
@@ -947,10 +971,13 @@
 	}
 
 	private static RawText getRawText(ObjectId id, ObjectReader reader)
-			throws IOException {
+			throws IOException, BinaryBlobException {
 		if (id.equals(ObjectId.zeroId()))
 			return new RawText(new byte[] {});
-		return new RawText(reader.open(id, OBJ_BLOB).getCachedBytes());
+
+		ObjectLoader loader = reader.open(id, OBJ_BLOB);
+		int threshold = PackConfig.DEFAULT_BIG_FILE_THRESHOLD;
+		return RawText.load(loader, threshold);
 	}
 
 	private static boolean nonTree(final int mode) {
@@ -961,12 +988,15 @@
 		return FileMode.GITLINK.equals(mode);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getResultTreeId() {
 		return (resultTree == null) ? null : resultTree.toObjectId();
 	}
 
 	/**
+	 * Set the names of the commits as they would appear in conflict markers
+	 *
 	 * @param commitNames
 	 *            the names of the commits as they would appear in conflict
 	 *            markers
@@ -976,6 +1006,8 @@
 	}
 
 	/**
+	 * Get the names of the commits as they would appear in conflict markers.
+	 *
 	 * @return the names of the commits as they would appear in conflict
 	 *         markers.
 	 */
@@ -984,17 +1016,22 @@
 	}
 
 	/**
-	 * @return the paths with conflicts. This is a subset of the files listed
-	 *         by {@link #getModifiedFiles()}
+	 * Get the paths with conflicts. This is a subset of the files listed by
+	 * {@link #getModifiedFiles()}
+	 *
+	 * @return the paths with conflicts. This is a subset of the files listed by
+	 *         {@link #getModifiedFiles()}
 	 */
 	public List<String> getUnmergedPaths() {
 		return unmergedPaths;
 	}
 
 	/**
-	 * @return the paths of files which have been modified by this merge. A
-	 *         file will be modified if a content-merge works on this path or if
-	 *         the merge algorithm decides to take the theirs-version. This is a
+	 * Get the paths of files which have been modified by this merge.
+	 *
+	 * @return the paths of files which have been modified by this merge. A file
+	 *         will be modified if a content-merge works on this path or if the
+	 *         merge algorithm decides to take the theirs-version. This is a
 	 *         superset of the files listed by {@link #getUnmergedPaths()}.
 	 */
 	public List<String> getModifiedFiles() {
@@ -1002,6 +1039,10 @@
 	}
 
 	/**
+	 * Get a map which maps the paths of files which have to be checked out
+	 * because the merge created new fully-merged content for this file into the
+	 * index.
+	 *
 	 * @return a map which maps the paths of files which have to be checked out
 	 *         because the merge created new fully-merged content for this file
 	 *         into the index. This means: the merge wrote a new stage 0 entry
@@ -1012,6 +1053,8 @@
 	}
 
 	/**
+	 * Get the mergeResults
+	 *
 	 * @return the mergeResults
 	 */
 	public Map<String, MergeResult<? extends Sequence>> getMergeResults() {
@@ -1019,6 +1062,9 @@
 	}
 
 	/**
+	 * Get list of paths causing this merge to fail (not stopped because of a
+	 * conflict).
+	 *
 	 * @return lists paths causing this merge to fail (not stopped because of a
 	 *         conflict). <code>null</code> is returned if this merge didn't
 	 *         fail.
@@ -1043,10 +1089,10 @@
 	 * not set explicitly and if this merger doesn't work in-core, this merger
 	 * will implicitly get and lock a default DirCache. If the DirCache is
 	 * explicitly set the caller is responsible to lock it in advance. Finally
-	 * the merger will call {@link DirCache#commit()} which requires that the
-	 * DirCache is locked. If the {@link #mergeImpl()} returns without throwing
-	 * an exception the lock will be released. In case of exceptions the caller
-	 * is responsible to release the lock.
+	 * the merger will call {@link org.eclipse.jgit.dircache.DirCache#commit()}
+	 * which requires that the DirCache is locked. If the {@link #mergeImpl()}
+	 * returns without throwing an exception the lock will be released. In case
+	 * of exceptions the caller is responsible to release the lock.
 	 *
 	 * @param dc
 	 *            the DirCache to set
@@ -1076,8 +1122,12 @@
 	 * The resolve conflict way of three way merging
 	 *
 	 * @param baseTree
+	 *            a {@link org.eclipse.jgit.treewalk.AbstractTreeIterator}
+	 *            object.
 	 * @param headTree
+	 *            a {@link org.eclipse.jgit.revwalk.RevTree} object.
 	 * @param mergeTree
+	 *            a {@link org.eclipse.jgit.revwalk.RevTree} object.
 	 * @param ignoreConflicts
 	 *            Controls what to do in case a content-merge is done and a
 	 *            conflict is detected. The default setting for this should be
@@ -1094,11 +1144,11 @@
 	 *            other stages are filled. Means: there is no conflict on that
 	 *            path but the new content (including conflict markers) is
 	 *            stored as successful merge result. This is needed in the
-	 *            context of {@link RecursiveMerger} where when determining
-	 *            merge bases we don't want to deal with content-merge
-	 *            conflicts.
+	 *            context of {@link org.eclipse.jgit.merge.RecursiveMerger}
+	 *            where when determining merge bases we don't want to deal with
+	 *            content-merge conflicts.
 	 * @return whether the trees merged cleanly
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.5
 	 */
 	protected boolean mergeTrees(AbstractTreeIterator baseTree,
@@ -1161,9 +1211,9 @@
 	 *            The walk to iterate over.
 	 * @param ignoreConflicts
 	 *            see
-	 *            {@link ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
+	 *            {@link org.eclipse.jgit.merge.ResolveMerger#mergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)}
 	 * @return Whether the trees merged cleanly.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @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 2224dbc..979685c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyOneSided.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyOneSided.java
@@ -76,21 +76,25 @@
 		treeIndex = index;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return strategyName;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Merger newMerger(final Repository db) {
 		return new OneSide(db, treeIndex);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Merger newMerger(final Repository db, boolean inCore) {
 		return new OneSide(db, treeIndex);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Merger newMerger(final ObjectInserter inserter, final 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 56128dd..716b136 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyRecursive.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyRecursive.java
@@ -54,21 +54,25 @@
  */
 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 17044b5..e836719 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyResolve.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategyResolve.java
@@ -52,24 +52,25 @@
  */
 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);
 	}
 
-	/**
-	 * @since 4.8
-	 */
+	/** {@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 cd427bd..5739d58 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java
@@ -69,30 +69,33 @@
  * file contents.
  */
 public class StrategySimpleTwoWayInCore extends ThreeWayMergeStrategy {
-	/** Create a new instance of the strategy. */
+	/**
+	 * Create a new instance of the strategy.
+	 */
 	protected StrategySimpleTwoWayInCore() {
 		//
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getName() {
 		return "simple-two-way-in-core"; //$NON-NLS-1$
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ThreeWayMerger newMerger(final 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);
 	}
 
-	/**
-	 * @since 4.8
-	 */
+	/** {@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 c71590b..7d185ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMergeStrategy.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMergeStrategy.java
@@ -45,11 +45,15 @@
 
 import org.eclipse.jgit.lib.Repository;
 
-/** A merge strategy to merge 2 trees, using a common base ancestor tree. */
+/**
+ * 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 b3ef0fb..3f28820 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ThreeWayMerger.java
@@ -57,7 +57,9 @@
 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 
-/** A merge of 2 trees, using a common base ancestor tree. */
+/**
+ * A merge of 2 trees, using a common base ancestor tree.
+ */
 public abstract class ThreeWayMerger extends Merger {
 	private RevTree baseTree;
 
@@ -103,11 +105,11 @@
 	 *            common base treeish; null to automatically compute the common
 	 *            base from the input commits during
 	 *            {@link #merge(AnyObjectId...)}.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object is not a treeish.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object could not be read.
 	 */
 	public void setBase(final AnyObjectId id) throws MissingObjectException,
@@ -119,6 +121,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean merge(final AnyObjectId... tips) throws IOException {
 		if (tips.length != 2)
@@ -126,6 +129,7 @@
 		return super.merge(tips);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ObjectId getBaseCommitId() {
 		return baseCommitId;
@@ -136,7 +140,7 @@
 	 *
 	 * @return an iterator over the caller-specified merge base, or the natural
 	 *         merge base of the two input commits.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	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 5e7beed..89a87af 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
@@ -68,15 +68,13 @@
  * </pre>
  */
 public class NLS {
-	/** The root locale constant. It is defined here because the Locale.ROOT is not defined in Java 5 */
+	/**
+	 * The root locale constant. It is defined here because the Locale.ROOT is
+	 * not defined in Java 5
+	 */
 	public static final Locale ROOT_LOCALE = new Locale("", "", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 
-	private static final InheritableThreadLocal<NLS> local = new InheritableThreadLocal<NLS>() {
-		@Override
-		protected NLS initialValue() {
-			return new NLS(Locale.getDefault());
-		}
-	};
+	private static final InheritableThreadLocal<NLS> local = new InheritableThreadLocal<>();
 
 	/**
 	 * Sets the locale for the calling thread.
@@ -96,27 +94,43 @@
 	/**
 	 * Sets the JVM default locale as the locale for the calling thread.
 	 * <p>
-	 * Semantically this is equivalent to <code>NLS.setLocale(Locale.getDefault())</code>.
+	 * Semantically this is equivalent to
+	 * <code>NLS.setLocale(Locale.getDefault())</code>.
 	 */
 	public static void useJVMDefaultLocale() {
-		local.set(new NLS(Locale.getDefault()));
+		useJVMDefaultInternal();
+	}
+
+	// TODO(ms): change signature of public useJVMDefaultLocale() in 5.0 to get
+	// rid of this internal method
+	private static NLS useJVMDefaultInternal() {
+		NLS b = new NLS(Locale.getDefault());
+		local.set(b);
+		return b;
 	}
 
 	/**
 	 * Returns an instance of the translation bundle of the required type. All
 	 * public String fields of the bundle instance will get their values
-	 * injected as described in the {@link TranslationBundle}.
+	 * injected as described in the
+	 * {@link org.eclipse.jgit.nls.TranslationBundle}.
 	 *
-	 * @param <T>
-	 *            required bundle type
 	 * @param type
 	 *            required bundle type
 	 * @return an instance of the required bundle type
-	 * @exception TranslationBundleLoadingException see {@link TranslationBundleLoadingException}
-	 * @exception TranslationStringMissingException see {@link TranslationStringMissingException}
+	 * @exception TranslationBundleLoadingException
+	 *                see
+	 *                {@link org.eclipse.jgit.errors.TranslationBundleLoadingException}
+	 * @exception TranslationStringMissingException
+	 *                see
+	 *                {@link org.eclipse.jgit.errors.TranslationStringMissingException}
 	 */
 	public static <T extends TranslationBundle> T getBundleFor(Class<T> type) {
-		return local.get().get(type);
+		NLS b = local.get();
+		if (b == null) {
+			b = useJVMDefaultInternal();
+		}
+		return b.get(type);
 	}
 
 	final private Locale locale;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/TranslationBundle.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/TranslationBundle.java
index bde69c0..cdd7be2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/TranslationBundle.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/TranslationBundle.java
@@ -92,21 +92,22 @@
  * </pre>
  *
  * The translated text is automatically injected into the public String fields
- * according to the locale set with {@link NLS#setLocale(Locale)}. However, the
- * {@link NLS#setLocale(Locale)} method defines only prefered locale which will
- * be honored only if it is supported by the provided resource bundle property
- * files. Basically, this class will use
- * {@link ResourceBundle#getBundle(String, Locale)} method to load a resource
- * bundle. See the documentation of this method for a detailed explanation of
- * resource bundle loading strategy. After a bundle is created the
- * {@link #effectiveLocale()} method can be used to determine whether the bundle
- * really corresponds to the requested locale or is a fallback.
+ * according to the locale set with
+ * {@link org.eclipse.jgit.nls.NLS#setLocale(Locale)}. However, the
+ * {@link org.eclipse.jgit.nls.NLS#setLocale(Locale)} method defines only
+ * prefered locale which will be honored only if it is supported by the provided
+ * resource bundle property files. Basically, this class will use
+ * {@link java.util.ResourceBundle#getBundle(String, Locale)} method to load a
+ * resource bundle. See the documentation of this method for a detailed
+ * explanation of resource bundle loading strategy. After a bundle is created
+ * the {@link #effectiveLocale()} method can be used to determine whether the
+ * bundle really corresponds to the requested locale or is a fallback.
  *
  * <p>
  * To load a String from a resource bundle property file this class uses the
- * {@link ResourceBundle#getString(String)}. This method can throw the
- * {@link MissingResourceException} and this class is not making any effort to
- * catch and/or translate this exception.
+ * {@link java.util.ResourceBundle#getString(String)}. This method can throw the
+ * {@link java.util.MissingResourceException} and this class is not making any
+ * effort to catch and/or translate this exception.
  *
  * <p>
  * To define a concrete translation bundle one has to:
@@ -125,15 +126,20 @@
 	private ResourceBundle resourceBundle;
 
 	/**
-	 * @return the locale locale used for loading the resource bundle from which
-	 *         the field values were taken
+	 * Get the locale used for loading the resource bundle from which the field
+	 * values were taken.
+	 *
+	 * @return the locale used for loading the resource bundle from which the
+	 *         field values were taken.
 	 */
 	public Locale effectiveLocale() {
 		return effectiveLocale;
 	}
 
 	/**
-	 * @return the resource bundle on which this translation bundle is based
+	 * Get the resource bundle on which this translation bundle is based.
+	 *
+	 * @return the resource bundle on which this translation bundle is based.
 	 */
 	public ResourceBundle resourceBundle() {
 		return resourceBundle;
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 2e7327c..87bd4b5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
@@ -53,7 +53,7 @@
 import org.eclipse.jgit.util.io.UnionInputStream;
 
 /**
- * Default implementation of the {@link NoteMerger}.
+ * Default implementation of the {@link org.eclipse.jgit.notes.NoteMerger}.
  * <p>
  * If ours and theirs are both non-null, which means they are either both edits
  * or both adds, then this merger will simply join the content of ours and
@@ -67,6 +67,7 @@
  */
 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 41e9bbe..7cf40dd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/Note.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/Note.java
@@ -46,7 +46,9 @@
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 
-/** In-memory representation of a single note attached to one object. */
+/**
+ * In-memory representation of a single note attached to one object.
+ */
 public class Note extends ObjectId {
 	private ObjectId data;
 
@@ -63,7 +65,11 @@
 		data = noteData;
 	}
 
-	/** @return the note content */
+	/**
+	 * Get the note content.
+	 *
+	 * @return the note content.
+	 */
 	public ObjectId getData() {
 		return data;
 	}
@@ -72,6 +78,7 @@
 		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 44c5926..cbef613 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMap.java
@@ -63,10 +63,11 @@
 /**
  * Index of notes from a note branch.
  *
- * This class is not thread-safe, and relies on an {@link ObjectReader} that it
- * borrows/shares with the caller. The reader can be used during any call, and
- * is not released by this class. The caller should arrange for releasing the
- * shared {@code ObjectReader} at the proper times.
+ * This class is not thread-safe, and relies on an
+ * {@link org.eclipse.jgit.lib.ObjectReader} that it borrows/shares with the
+ * caller. The reader can be used during any call, and is not released by this
+ * class. The caller should arrange for releasing the shared
+ * {@code ObjectReader} at the proper times.
  */
 public class NoteMap implements Iterable<Note> {
 	/**
@@ -81,10 +82,11 @@
 	}
 
 	/**
-	 * Shorten the note ref name by trimming off the {@link Constants#R_NOTES}
-	 * prefix if it exists.
+	 * Shorten the note ref name by trimming off the
+	 * {@link org.eclipse.jgit.lib.Constants#R_NOTES} prefix if it exists.
 	 *
 	 * @param noteRefName
+	 *            a {@link java.lang.String} object.
 	 * @return a more user friendly note name
 	 */
 	public static String shortenRefName(String noteRefName) {
@@ -103,13 +105,13 @@
 	 * @param commit
 	 *            the revision of the note branch to read.
 	 * @return the note map read from the commit.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed through the reader.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             a tree object is corrupt and cannot be read.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             a tree object wasn't actually a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a reference tree object doesn't exist.
 	 */
 	public static NoteMap read(ObjectReader reader, RevCommit commit)
@@ -128,13 +130,13 @@
 	 * @param tree
 	 *            the note tree to read.
 	 * @return the note map read from the tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed through the reader.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             a tree object is corrupt and cannot be read.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             a tree object wasn't actually a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a reference tree object doesn't exist.
 	 */
 	public static NoteMap read(ObjectReader reader, RevTree tree)
@@ -153,13 +155,13 @@
 	 * @param treeId
 	 *            the note tree to read.
 	 * @return the note map read from the tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository cannot be accessed through the reader.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             a tree object is corrupt and cannot be read.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             a tree object wasn't actually a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a reference tree object doesn't exist.
 	 */
 	public static NoteMap readTree(ObjectReader reader, ObjectId treeId)
@@ -197,10 +199,7 @@
 		this.reader = reader;
 	}
 
-	/**
-	 * @return an iterator that iterates over notes of this NoteMap. Non note
-	 *         entries are ignored by this iterator.
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Iterator<Note> iterator() {
 		try {
@@ -216,7 +215,7 @@
 	 * @param id
 	 *            the object to look for.
 	 * @return the note's blob ObjectId, or null if no note exists.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a portion of the note space is not accessible.
 	 */
 	public ObjectId get(AnyObjectId id) throws IOException {
@@ -230,7 +229,7 @@
 	 * @param id
 	 *            the object to look for.
 	 * @return the note for the given object id, or null if no note exists.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a portion of the note space is not accessible.
 	 */
 	public Note getNote(AnyObjectId id) throws IOException {
@@ -243,7 +242,7 @@
 	 * @param id
 	 *            the object to look for.
 	 * @return true if a note exists; false if there is no note.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a portion of the note space is not accessible.
 	 */
 	public boolean contains(AnyObjectId id) throws IOException {
@@ -269,11 +268,11 @@
 	 *            larger than this limit, LargeObjectException will be thrown.
 	 * @return if a note is defined for {@code id}, the note content. If no note
 	 *         is defined, null.
-	 * @throws LargeObjectException
+	 * @throws org.eclipse.jgit.errors.LargeObjectException
 	 *             the note data is larger than {@code sizeLimit}.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the note's blob does not exist in the repository.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the note's blob cannot be read from the repository
 	 */
 	public byte[] getCachedBytes(AnyObjectId id, int sizeLimit)
@@ -306,7 +305,7 @@
 	 *            data to associate with the note. This must be the ObjectId of
 	 *            a blob that already exists in the repository. If null the note
 	 *            will be deleted, if present.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a portion of the note space is not accessible.
 	 */
 	public void set(AnyObjectId noteOn, ObjectId noteData) throws IOException {
@@ -337,7 +336,7 @@
 	 *            inserter to write the encoded {@code noteData} out as a blob.
 	 *            The caller must ensure the inserter is flushed before the
 	 *            updated note map is made available for reading.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the note data could not be stored in the repository.
 	 */
 	public void set(AnyObjectId noteOn, String noteData, ObjectInserter ins)
@@ -361,7 +360,7 @@
 	 *
 	 * @param noteOn
 	 *            the object to remove the note from.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a portion of the note space is not accessible.
 	 */
 	public void remove(AnyObjectId noteOn) throws IOException {
@@ -376,7 +375,7 @@
 	 *            Caller is responsible for flushing the inserter before trying
 	 *            to read the objects, or exposing them through a reference.
 	 * @return the top level tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a tree could not be written.
 	 */
 	public ObjectId writeTree(ObjectInserter inserter) throws IOException {
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 19ec1a1..325ff4f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
@@ -56,14 +56,13 @@
 import org.eclipse.jgit.merge.MergeStrategy;
 import org.eclipse.jgit.merge.Merger;
 import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.treewalk.AbstractTreeIterator;
-import org.eclipse.jgit.treewalk.TreeWalk;
 
 /**
  * Three-way note tree merge.
  * <p>
- * Direct implementation of NoteMap merger without using {@link TreeWalk} and
- * {@link AbstractTreeIterator}
+ * Direct implementation of NoteMap merger without using
+ * {@link org.eclipse.jgit.treewalk.TreeWalk} and
+ * {@link org.eclipse.jgit.treewalk.AbstractTreeIterator}
  */
 public class NoteMapMerger {
 	private static final FanoutBucket EMPTY_FANOUT = new FanoutBucket(0);
@@ -83,8 +82,9 @@
 	private final MutableObjectId objectIdPrefix;
 
 	/**
-	 * Constructs a NoteMapMerger with custom {@link NoteMerger} and custom
-	 * {@link MergeStrategy}.
+	 * Constructs a NoteMapMerger with custom
+	 * {@link org.eclipse.jgit.notes.NoteMerger} and custom
+	 * {@link org.eclipse.jgit.merge.MergeStrategy}.
 	 *
 	 * @param db
 	 *            Git repository
@@ -104,9 +104,10 @@
 	}
 
 	/**
-	 * Constructs a NoteMapMerger with {@link DefaultNoteMerger} as the merger
-	 * for notes and the {@link MergeStrategy#RESOLVE} as the strategy for
-	 * resolving conflicts on non-notes
+	 * Constructs a NoteMapMerger with
+	 * {@link org.eclipse.jgit.notes.DefaultNoteMerger} as the merger for notes
+	 * and the {@link org.eclipse.jgit.merge.MergeStrategy#RESOLVE} as the
+	 * strategy for resolving conflicts on non-notes
 	 *
 	 * @param db
 	 *            Git repository
@@ -125,7 +126,7 @@
 	 * @param theirs
 	 *            theirs version of the note tree
 	 * @return merge result as a new NoteMap
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public NoteMap merge(NoteMap base, NoteMap ours, NoteMap theirs)
 			throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMerger.java
index c70211d..8df4998 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMerger.java
@@ -72,13 +72,13 @@
 	 * @param inserter
 	 *            the object inserter that must be used to insert Git objects
 	 * @return the merge result
-	 * @throws NotesMergeConflictException
+	 * @throws org.eclipse.jgit.notes.NotesMergeConflictException
 	 *             in case there was a merge conflict which this note merger
 	 *             couldn't resolve
-	 * @throws IOException
-	 *             in case the reader or the inserter would throw an IOException
-	 *             the implementor will most likely want to propagate it as it
-	 *             can't do much to recover from it
+	 * @throws java.io.IOException
+	 *             in case the reader or the inserter would throw an
+	 *             java.io.IOException the implementor will most likely want to
+	 *             propagate it as it can't do much to recover from it
 	 */
 	Note merge(Note base, Note ours, Note their, ObjectReader reader,
 			ObjectInserter inserter) throws NotesMergeConflictException,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NotesMergeConflictException.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NotesMergeConflictException.java
index 94fba0f..796f1d1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NotesMergeConflictException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NotesMergeConflictException.java
@@ -49,8 +49,9 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * This exception will be thrown from the {@link NoteMerger} when a conflict on
- * Notes content is found during merge.
+ * This exception will be thrown from the
+ * {@link org.eclipse.jgit.notes.NoteMerger} when a conflict on Notes content is
+ * found during merge.
  */
 public class NotesMergeConflictException extends IOException {
 	private static final long serialVersionUID = 1L;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java
index d0a6b1f..079d6f6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java
@@ -49,7 +49,9 @@
 import static org.eclipse.jgit.util.RawParseUtils.nextLF;
 import static org.eclipse.jgit.util.RawParseUtils.parseBase10;
 
-/** Part of a "GIT binary patch" to describe the pre-image or post-image */
+/**
+ * Part of a "GIT binary patch" to describe the pre-image or post-image
+ */
 public class BinaryHunk {
 	private static final byte[] LITERAL = encodeASCII("literal "); //$NON-NLS-1$
 
@@ -83,32 +85,56 @@
 		startOffset = offset;
 	}
 
-	/** @return header for the file this hunk applies to */
+	/**
+	 * Get header for the file this hunk applies to.
+	 *
+	 * @return header for the file this hunk applies to.
+	 */
 	public FileHeader getFileHeader() {
 		return file;
 	}
 
-	/** @return the byte array holding this hunk's patch script. */
+	/**
+	 * Get the byte array holding this hunk's patch script.
+	 *
+	 * @return the byte array holding this hunk's patch script.
+	 */
 	public byte[] getBuffer() {
 		return file.buf;
 	}
 
-	/** @return offset the start of this hunk in {@link #getBuffer()}. */
+	/**
+	 * Get offset the start of this hunk in {@link #getBuffer()}.
+	 *
+	 * @return offset the start of this hunk in {@link #getBuffer()}.
+	 */
 	public int getStartOffset() {
 		return startOffset;
 	}
 
-	/** @return offset one past the end of the hunk in {@link #getBuffer()}. */
+	/**
+	 * Get offset one past the end of the hunk in {@link #getBuffer()}.
+	 *
+	 * @return offset one past the end of the hunk in {@link #getBuffer()}.
+	 */
 	public int getEndOffset() {
 		return endOffset;
 	}
 
-	/** @return type of this binary hunk */
+	/**
+	 * Get type of this binary hunk.
+	 *
+	 * @return type of this binary hunk.
+	 */
 	public Type getType() {
 		return type;
 	}
 
-	/** @return inflated size of this hunk's data */
+	/**
+	 * Get inflated size of this hunk's data.
+	 *
+	 * @return inflated size of this hunk's data.
+	 */
 	public int getSize() {
 		return length;
 	}
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 2c8f34e..1afb53d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedFileHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedFileHeader.java
@@ -73,19 +73,29 @@
 		super(b, offset);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("unchecked")
 	public List<? extends CombinedHunkHeader> getHunks() {
 		return (List<CombinedHunkHeader>) super.getHunks();
 	}
 
-	/** @return number of ancestor revisions mentioned in this diff. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 *
+	 * @return number of ancestor revisions mentioned in this diff.
+	 */
 	@Override
 	public int getParentCount() {
 		return oldIds.length;
 	}
 
-	/** @return get the file mode of the first parent. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * @return get the file mode of the first parent.
+	 */
 	@Override
 	public FileMode getOldMode() {
 		return getOldMode(0);
@@ -102,7 +112,12 @@
 		return oldModes[nthParent];
 	}
 
-	/** @return get the object id of the first parent. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 *
+	 * @return get the object id of the first parent.
+	 */
 	@Override
 	public AbbreviatedObjectId getOldId() {
 		return getOldId(0);
@@ -119,6 +134,7 @@
 		return oldIds[nthParent];
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getScriptText(final Charset ocs, final Charset ncs) {
 		final Charset[] cs = new Charset[getParentCount() + 1];
@@ -128,15 +144,9 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Convert the patch script for this file into a string.
-	 *
-	 * @param charsetGuess
-	 *            optional array to suggest the character set to use when
-	 *            decoding each file's line. If supplied the array must have a
-	 *            length of <code>{@link #getParentCount()} + 1</code>
-	 *            representing the old revision character sets and the new
-	 *            revision character set.
-	 * @return the patch script, as a Unicode string.
 	 */
 	@Override
 	public String getScriptText(final Charset[] charsetGuess) {
@@ -179,6 +189,7 @@
 		return ptr;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void parseIndexLine(int ptr, final int eol) {
 		// "index $asha1,$bsha1..$csha1"
@@ -200,6 +211,7 @@
 		oldModes = new FileMode[oldIds.length];
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void parseNewFileMode(final int ptr, final 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 ed79787..bbf8023 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java
@@ -54,7 +54,9 @@
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.util.MutableInteger;
 
-/** Hunk header for a hunk appearing in a "diff --cc" style patch. */
+/**
+ * Hunk header for a hunk appearing in a "diff --cc" style patch.
+ */
 public class CombinedHunkHeader extends HunkHeader {
 	private static abstract class CombinedOldImage extends OldImage {
 		int nContext;
@@ -76,11 +78,13 @@
 		}
 	}
 
+	/** {@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 eb28a0e..5cfbbb2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java
@@ -69,7 +69,9 @@
 import org.eclipse.jgit.util.RawParseUtils;
 import org.eclipse.jgit.util.TemporaryBuffer;
 
-/** Patch header describing an action for a single file path. */
+/**
+ * Patch header describing an action for a single file path.
+ */
 public class FileHeader extends DiffEntry {
 	private static final byte[] OLD_MODE = encodeASCII("old mode "); //$NON-NLS-1$
 
@@ -164,17 +166,30 @@
 		return 1;
 	}
 
-	/** @return the byte array holding this file's patch script. */
+	/**
+	 * Get the byte array holding this file's patch script.
+	 *
+	 * @return the byte array holding this file's patch script.
+	 */
 	public byte[] getBuffer() {
 		return buf;
 	}
 
-	/** @return offset the start of this file's script in {@link #getBuffer()}. */
+	/**
+	 * Get offset of the start of this file's script in {@link #getBuffer()}.
+	 *
+	 * @return offset of the start of this file's script in
+	 *         {@link #getBuffer()}.
+	 */
 	public int getStartOffset() {
 		return startOffset;
 	}
 
-	/** @return offset one past the end of the file script. */
+	/**
+	 * Get offset one past the end of the file script.
+	 *
+	 * @return offset one past the end of the file script.
+	 */
 	public int getEndOffset() {
 		return endOffset;
 	}
@@ -182,8 +197,9 @@
 	/**
 	 * Convert the patch script for this file into a string.
 	 * <p>
-	 * The default character encoding ({@link Constants#CHARSET}) is assumed for
-	 * both the old and new files.
+	 * The default character encoding
+	 * ({@link org.eclipse.jgit.lib.Constants#CHARSET}) is assumed for both the
+	 * old and new files.
 	 *
 	 * @return the patch script, as a Unicode string.
 	 */
@@ -284,17 +300,29 @@
 		}
 	}
 
-	/** @return style of patch used to modify this file */
+	/**
+	 * Get style of patch used to modify this file.
+	 *
+	 * @return style of patch used to modify this file.
+	 */
 	public PatchType getPatchType() {
 		return patchType;
 	}
 
-	/** @return true if this patch modifies metadata about a file */
+	/**
+	 * Whether this patch modifies metadata about a file
+	 *
+	 * @return {@code true} if this patch modifies metadata about a file .
+	 */
 	public boolean hasMetaDataChanges() {
 		return changeType != ChangeType.MODIFY || newMode != oldMode;
 	}
 
-	/** @return hunks altering this file; in order of appearance in patch */
+	/**
+	 * Get hunks altering this file; in order of appearance in patch
+	 *
+	 * @return hunks altering this file; in order of appearance in patch.
+	 */
 	public List<? extends HunkHeader> getHunks() {
 		if (hunks == null)
 			return Collections.emptyList();
@@ -313,17 +341,33 @@
 		return new HunkHeader(this, offset);
 	}
 
-	/** @return if a {@link PatchType#GIT_BINARY}, the new-image delta/literal */
+	/**
+	 * Get the new-image delta/literal if this is a
+	 * {@link PatchType#GIT_BINARY}.
+	 *
+	 * @return the new-image delta/literal if this is a
+	 *         {@link PatchType#GIT_BINARY}.
+	 */
 	public BinaryHunk getForwardBinaryHunk() {
 		return forwardBinaryHunk;
 	}
 
-	/** @return if a {@link PatchType#GIT_BINARY}, the old-image delta/literal */
+	/**
+	 * Get the old-image delta/literal if this is a
+	 * {@link PatchType#GIT_BINARY}.
+	 *
+	 * @return the old-image delta/literal if this is a
+	 *         {@link PatchType#GIT_BINARY}.
+	 */
 	public BinaryHunk getReverseBinaryHunk() {
 		return reverseBinaryHunk;
 	}
 
-	/** @return a list describing the content edits performed on this file. */
+	/**
+	 * Convert to a list describing the content edits performed on this file.
+	 *
+	 * @return a list describing the content edits performed on this file.
+	 */
 	public EditList toEditList() {
 		final EditList r = new EditList();
 		for (final HunkHeader hunk : hunks)
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 767cb24..1dd24d7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java
@@ -48,7 +48,9 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.util.RawParseUtils;
 
-/** An error in a patch script */
+/**
+ * An error in a patch script
+ */
 public class FormatError {
 	/** Classification of an error. */
 	public static enum Severity {
@@ -75,32 +77,53 @@
 		message = msg;
 	}
 
-	/** @return the severity of the error. */
+	/**
+	 * Get the severity of the error.
+	 *
+	 * @return the severity of the error.
+	 */
 	public Severity getSeverity() {
 		return severity;
 	}
 
-	/** @return a message describing the error. */
+	/**
+	 * Get a message describing the error.
+	 *
+	 * @return a message describing the error.
+	 */
 	public String getMessage() {
 		return message;
 	}
 
-	/** @return the byte buffer holding the patch script. */
+	/**
+	 * Get the byte buffer holding the patch script.
+	 *
+	 * @return the byte buffer holding the patch script.
+	 */
 	public byte[] getBuffer() {
 		return buf;
 	}
 
-	/** @return byte offset within {@link #getBuffer()} where the error is */
+	/**
+	 * Get byte offset within {@link #getBuffer()} where the error is.
+	 *
+	 * @return byte offset within {@link #getBuffer()} where the error is.
+	 */
 	public int getOffset() {
 		return offset;
 	}
 
-	/** @return line of the patch script the error appears on. */
+	/**
+	 * Get line of the patch script the error appears on.
+	 *
+	 * @return line of the patch script the error appears on.
+	 */
 	public String getLineText() {
 		final int eol = RawParseUtils.nextLF(buf, offset);
 		return RawParseUtils.decode(Constants.CHARSET, 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 d72b9bb..d022d47 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/HunkHeader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/HunkHeader.java
@@ -57,7 +57,9 @@
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.util.MutableInteger;
 
-/** Hunk header describing the layout of a single block of lines */
+/**
+ * Hunk header describing the layout of a single block of lines
+ */
 public class HunkHeader {
 	/** Details about an old image of the file. */
 	public abstract static class OldImage {
@@ -148,47 +150,83 @@
 		}
 	}
 
-	/** @return header for the file this hunk applies to */
+	/**
+	 * Get header for the file this hunk applies to.
+	 *
+	 * @return header for the file this hunk applies to.
+	 */
 	public FileHeader getFileHeader() {
 		return file;
 	}
 
-	/** @return the byte array holding this hunk's patch script. */
+	/**
+	 * Get the byte array holding this hunk's patch script.
+	 *
+	 * @return the byte array holding this hunk's patch script.
+	 */
 	public byte[] getBuffer() {
 		return file.buf;
 	}
 
-	/** @return offset the start of this hunk in {@link #getBuffer()}. */
+	/**
+	 * Get offset of the start of this hunk in {@link #getBuffer()}.
+	 *
+	 * @return offset of the start of this hunk in {@link #getBuffer()}.
+	 */
 	public int getStartOffset() {
 		return startOffset;
 	}
 
-	/** @return offset one past the end of the hunk in {@link #getBuffer()}. */
+	/**
+	 * Get offset one past the end of the hunk in {@link #getBuffer()}.
+	 *
+	 * @return offset one past the end of the hunk in {@link #getBuffer()}.
+	 */
 	public int getEndOffset() {
 		return endOffset;
 	}
 
-	/** @return information about the old image mentioned in this hunk. */
+	/**
+	 * Get information about the old image mentioned in this hunk.
+	 *
+	 * @return information about the old image mentioned in this hunk.
+	 */
 	public OldImage getOldImage() {
 		return old;
 	}
 
-	/** @return first line number in the post-image file where the hunk starts */
+	/**
+	 * Get first line number in the post-image file where the hunk starts.
+	 *
+	 * @return first line number in the post-image file where the hunk starts.
+	 */
 	public int getNewStartLine() {
 		return newStartLine;
 	}
 
-	/** @return Total number of post-image lines this hunk covers */
+	/**
+	 * Get total number of post-image lines this hunk covers.
+	 *
+	 * @return total number of post-image lines this hunk covers.
+	 */
 	public int getNewLineCount() {
 		return newLineCount;
 	}
 
-	/** @return total number of lines of context appearing in this hunk */
+	/**
+	 * Get total number of lines of context appearing in this hunk.
+	 *
+	 * @return total number of lines of context appearing in this hunk.
+	 */
 	public int getLinesContext() {
 		return nContext;
 	}
 
-	/** @return a list describing the content edits performed within the hunk. */
+	/**
+	 * Convert to a list describing the content edits performed within the hunk.
+	 *
+	 * @return a list describing the content edits performed within the hunk.
+	 */
 	public EditList toEditList() {
 		if (editList == null) {
 			editList = new EditList();
@@ -404,6 +442,7 @@
 		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/Patch.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/Patch.java
index 10ac449d..05fab92 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/Patch.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/Patch.java
@@ -58,7 +58,10 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.util.TemporaryBuffer;
 
-/** A parsed collection of {@link FileHeader}s from a unified diff patch file */
+/**
+ * A parsed collection of {@link org.eclipse.jgit.patch.FileHeader}s from a
+ * unified diff patch file
+ */
 public class Patch {
 	static final byte[] DIFF_GIT = encodeASCII("diff --git "); //$NON-NLS-1$
 
@@ -81,7 +84,9 @@
 	/** Formatting errors, if any were identified. */
 	private final List<FormatError> errors;
 
-	/** Create an empty patch. */
+	/**
+	 * Create an empty patch.
+	 */
 	public Patch() {
 		files = new ArrayList<>();
 		errors = new ArrayList<>(0);
@@ -100,7 +105,11 @@
 		files.add(fh);
 	}
 
-	/** @return list of files described in the patch, in occurrence order. */
+	/**
+	 * Get list of files described in the patch, in occurrence order.
+	 *
+	 * @return list of files described in the patch, in occurrence order.
+	 */
 	public List<? extends FileHeader> getFiles() {
 		return files;
 	}
@@ -115,7 +124,11 @@
 		errors.add(err);
 	}
 
-	/** @return collection of formatting errors, if any. */
+	/**
+	 * Get collection of formatting errors.
+	 *
+	 * @return collection of formatting errors, if any.
+	 */
 	public List<FormatError> getErrors() {
 		return errors;
 	}
@@ -130,7 +143,7 @@
 	 * @param is
 	 *            the stream to read the patch data from. The stream is read
 	 *            until EOF is reached.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the input stream.
 	 */
 	public void parse(final InputStream is) throws IOException {
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 98bcd1a..091bf68 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
@@ -149,7 +149,7 @@
 	 *            child index to obtain. Must be in the range 0 through
 	 *            {@link #getChildCount()}-1.
 	 * @return the specified child.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             an invalid child index was specified.
 	 */
 	public final PlotCommit getChild(final int nth) {
@@ -186,7 +186,7 @@
 	 *            ref index to obtain. Must be in the range 0 through
 	 *            {@link #getRefCount()}-1.
 	 * @return the specified ref.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             an invalid ref index was specified.
 	 */
 	public final Ref getRef(final int nth) {
@@ -203,6 +203,7 @@
 		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 a8eb86e..6a0ba66 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java
@@ -57,13 +57,13 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 
 /**
- * An ordered list of {@link PlotCommit} subclasses.
+ * An ordered list of {@link org.eclipse.jgit.revplot.PlotCommit} subclasses.
  * <p>
  * Commits are allocated into lanes as they enter the list, based upon their
  * connections between descendant (child) commits and ancestor (parent) commits.
  * <p>
- * The source of the list must be a {@link PlotWalk} and {@link #fillTo(int)}
- * must be used to populate the list.
+ * The source of the list must be a {@link org.eclipse.jgit.revplot.PlotWalk}
+ * and {@link #fillTo(int)} must be used to populate the list.
  *
  * @param <L>
  *            type of lane used by the application.
@@ -82,6 +82,7 @@
 	private final HashMap<PlotLane, Integer> laneLength = new HashMap<>(
 			32);
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		super.clear();
@@ -91,6 +92,7 @@
 		laneLength.clear();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void source(final RevWalk w) {
 		if (!(w instanceof PlotWalk))
@@ -122,6 +124,7 @@
 			result.add((L) p);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void enter(final int index, final PlotCommit<L> currCommit) {
 		setupChildren(currCommit);
@@ -395,7 +398,11 @@
 	}
 
 	/**
-	 * @return a new Lane appropriate for this particular PlotList.
+	 * Create a new {@link PlotLane} appropriate for this particular
+	 * {@link PlotCommitList}.
+	 *
+	 * @return a new {@link PlotLane} appropriate for this particular
+	 *         {@link PlotCommitList}.
 	 */
 	@SuppressWarnings("unchecked")
 	protected L createLane() {
@@ -407,6 +414,7 @@
 	 * is no longer needed.
 	 *
 	 * @param lane
+	 *            a lane
 	 */
 	protected void recycleLane(final L lane) {
 		// Nothing.
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 be1f07a..8ba8d6e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotWalk.java
@@ -70,11 +70,14 @@
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-/** Specialized RevWalk for visualization of a commit graph. */
+/**
+ * Specialized RevWalk for visualization of a commit graph.
+ */
 public class PlotWalk extends RevWalk {
 
 	private Map<AnyObjectId, Set<Ref>> reverseRefMap;
 
+	/** {@inheritDoc} */
 	@Override
 	public void dispose() {
 		super.dispose();
@@ -98,8 +101,7 @@
 	 *
 	 * @param refs
 	 *            additional refs
-	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void addAdditionalRefs(Iterable<Ref> refs) throws IOException {
 		for (Ref ref : refs) {
@@ -114,6 +116,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void sort(final RevSort s, final boolean use) {
 		if (s == RevSort.TOPO && !use)
@@ -121,11 +124,13 @@
 		super.sort(s, use);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected RevCommit createCommit(final 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 4923d0f..b948adb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AbstractRevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AbstractRevQueue.java
@@ -103,14 +103,16 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Remove the first commit from the queue.
-	 *
-	 * @return the first commit of this queue.
 	 */
 	@Override
 	public abstract RevCommit next();
 
-	/** Remove all entries from this queue. */
+	/**
+	 * Remove all entries from this queue.
+	 */
 	public abstract void clear();
 
 	abstract boolean everbodyHasFlag(int f);
@@ -122,6 +124,14 @@
 		return outputType;
 	}
 
+	/**
+	 * Describe this queue
+	 *
+	 * @param s
+	 *            a StringBuilder
+	 * @param c
+	 *            a {@link org.eclipse.jgit.revwalk.RevCommit}
+	 */
 	protected static void describe(final StringBuilder s, final RevCommit c) {
 		s.append(c.toString());
 		s.append('\n');
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AsyncRevObjectQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AsyncRevObjectQueue.java
index 1c0438a..d263184 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AsyncRevObjectQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/AsyncRevObjectQueue.java
@@ -59,11 +59,11 @@
 	 * Obtain the next object.
 	 *
 	 * @return the object; null if there are no more objects remaining.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object does not exist. There may be more objects
 	 *             remaining in the iteration, the application should call
 	 *             {@link #next()} again.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object store cannot be accessed.
 	 */
 	public RevObject next() throws MissingObjectException, IOException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapWalker.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BitmapWalker.java
similarity index 64%
rename from org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapWalker.java
rename to org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BitmapWalker.java
index a5c3b71..b07de5f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriterBitmapWalker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BitmapWalker.java
@@ -41,29 +41,30 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-package org.eclipse.jgit.internal.storage.pack;
+package org.eclipse.jgit.revwalk;
 
 import java.io.IOException;
 import java.util.Arrays;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.revwalk.AddToBitmapFilter;
+import org.eclipse.jgit.internal.revwalk.AddUnseenToBitmapFilter;
+import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.BitmapIndex;
 import org.eclipse.jgit.lib.BitmapIndex.Bitmap;
 import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
-import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.revwalk.ObjectWalk;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.revwalk.filter.RevFilter;
+import org.eclipse.jgit.revwalk.filter.ObjectFilter;
 
-/** Helper class for PackWriter to do ObjectWalks with pack index bitmaps. */
-final class PackWriterBitmapWalker {
+/**
+ * Helper class to do ObjectWalks with pack index bitmaps.
+ *
+ * @since 4.10
+ */
+public final class BitmapWalker {
 
 	private final ObjectWalk walker;
 
@@ -73,18 +74,58 @@
 
 	private long countOfBitmapIndexMisses;
 
-	PackWriterBitmapWalker(
+	/**
+	 * Create a BitmapWalker.
+	 *
+	 * @param walker walker to use when traversing the object graph.
+	 * @param bitmapIndex index to obtain bitmaps from.
+	 * @param pm progress monitor to report progress on.
+	 */
+	public BitmapWalker(
 			ObjectWalk walker, BitmapIndex bitmapIndex, ProgressMonitor pm) {
 		this.walker = walker;
 		this.bitmapIndex = bitmapIndex;
 		this.pm = (pm == null) ? NullProgressMonitor.INSTANCE : pm;
 	}
 
-	long getCountOfBitmapIndexMisses() {
+	/**
+	 * Return the number of objects that had to be walked because they were not covered by a
+	 * bitmap.
+	 *
+	 * @return the number of objects that had to be walked because they were not covered by a
+	 *     bitmap.
+	 */
+	public long getCountOfBitmapIndexMisses() {
 		return countOfBitmapIndexMisses;
 	}
 
-	BitmapBuilder findObjects(Iterable<? extends ObjectId> start, BitmapBuilder seen,
+	/**
+	 * Return, as a bitmap, the objects reachable from the objects in start.
+	 *
+	 * @param start
+	 *            the objects to start the object traversal from.
+	 * @param seen
+	 *            the objects to skip if encountered during traversal.
+	 * @param ignoreMissing
+	 *            true to ignore missing objects, false otherwise.
+	 * @return as a bitmap, the objects reachable from the objects in start.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             the object supplied is not available from the object
+	 *             database. This usually indicates the supplied object is
+	 *             invalid, but the reference was constructed during an earlier
+	 *             invocation to
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}.
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             the object was not parsed yet and it was discovered during
+	 *             parsing that it is not actually the type of the instance
+	 *             passed in. This usually indicates the caller used the wrong
+	 *             type in a
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}
+	 *             call.
+	 * @throws java.io.IOException
+	 *             a pack file or loose object could not be read.
+	 */
+	public BitmapBuilder findObjects(Iterable<? extends ObjectId> start, BitmapBuilder seen,
 			boolean ignoreMissing)
 			throws MissingObjectException, IncorrectObjectTypeException,
 				   IOException {
@@ -167,6 +208,7 @@
 				walker.setRevFilter(
 						new AddUnseenToBitmapFilter(seen, bitmapResult));
 			}
+			walker.setObjectFilter(new BitmapObjectFilter(bitmapResult));
 
 			while (walker.next() != null) {
 				// Iterate through all of the commits. The BitmapRevFilter does
@@ -193,104 +235,20 @@
 	}
 
 	/**
-	 * A RevFilter that adds the visited commits to {@code bitmap} as a side
-	 * effect.
-	 * <p>
-	 * When the walk hits a commit that is part of {@code bitmap}'s
-	 * BitmapIndex, that entire bitmap is ORed into {@code bitmap} and the
-	 * commit and its parents are marked as SEEN so that the walk does not
-	 * have to visit its ancestors.  This ensures the walk is very short if
-	 * there is good bitmap coverage.
+	 * Filter that excludes objects already in the given bitmap.
 	 */
-	static class AddToBitmapFilter extends RevFilter {
+	static class BitmapObjectFilter extends ObjectFilter {
 		private final BitmapBuilder bitmap;
 
-		AddToBitmapFilter(BitmapBuilder bitmap) {
+		BitmapObjectFilter(BitmapBuilder bitmap) {
 			this.bitmap = bitmap;
 		}
 
 		@Override
-		public final boolean include(RevWalk walker, RevCommit cmit) {
-			Bitmap visitedBitmap;
-
-			if (bitmap.contains(cmit)) {
-				// already included
-			} else if ((visitedBitmap = bitmap.getBitmapIndex()
-					.getBitmap(cmit)) != null) {
-				bitmap.or(visitedBitmap);
-			} else {
-				bitmap.addObject(cmit, Constants.OBJ_COMMIT);
-				return true;
-			}
-
-			for (RevCommit p : cmit.getParents()) {
-				p.add(RevFlag.SEEN);
-			}
-			return false;
-		}
-
-		@Override
-		public final RevFilter clone() {
-			throw new UnsupportedOperationException();
-		}
-
-		@Override
-		public final boolean requiresCommitBody() {
-			return false;
-		}
-	}
-
-	/**
-	 * A RevFilter that adds the visited commits to {@code bitmap} as a side
-	 * effect.
-	 * <p>
-	 * When the walk hits a commit that is part of {@code bitmap}'s
-	 * BitmapIndex, that entire bitmap is ORed into {@code bitmap} and the
-	 * commit and its parents are marked as SEEN so that the walk does not
-	 * have to visit its ancestors.  This ensures the walk is very short if
-	 * there is good bitmap coverage.
-	 * <p>
-	 * Commits named in {@code seen} are considered already seen.  If one is
-	 * encountered, that commit and its parents will be marked with the SEEN
-	 * flag to prevent the walk from visiting its ancestors.
-	 */
-	static class AddUnseenToBitmapFilter extends RevFilter {
-		private final BitmapBuilder seen;
-		private final BitmapBuilder bitmap;
-
-		AddUnseenToBitmapFilter(BitmapBuilder seen, BitmapBuilder bitmapResult) {
-			this.seen = seen;
-			this.bitmap = bitmapResult;
-		}
-
-		@Override
-		public final boolean include(RevWalk walker, RevCommit cmit) {
-			Bitmap visitedBitmap;
-
-			if (seen.contains(cmit) || bitmap.contains(cmit)) {
-				// already seen or included
-			} else if ((visitedBitmap = bitmap.getBitmapIndex()
-					.getBitmap(cmit)) != null) {
-				bitmap.or(visitedBitmap);
-			} else {
-				bitmap.addObject(cmit, Constants.OBJ_COMMIT);
-				return true;
-			}
-
-			for (RevCommit p : cmit.getParents()) {
-				p.add(RevFlag.SEEN);
-			}
-			return false;
-		}
-
-		@Override
-		public final RevFilter clone() {
-			throw new UnsupportedOperationException();
-		}
-
-		@Override
-		public final boolean requiresCommitBody() {
-			return false;
+		public final boolean include(ObjectWalk walker, AnyObjectId objid)
+			throws MissingObjectException, IncorrectObjectTypeException,
+			       IOException {
+			return !bitmap.contains(objid);
 		}
 	}
 }
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 db5379e..74a3511 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BlockRevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/BlockRevQueue.java
@@ -51,7 +51,9 @@
 abstract class BlockRevQueue extends AbstractRevQueue {
 	protected BlockFreeList free;
 
-	/** Create an empty revision queue. */
+	/**
+	 * Create an empty revision queue.
+	 */
 	protected BlockRevQueue() {
 		free = new BlockFreeList();
 	}
@@ -70,6 +72,8 @@
 	}
 
 	/**
+	 * {@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
@@ -79,9 +83,6 @@
 	 * <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
-	 *            the other queue we will steal entries from.
 	 */
 	@Override
 	public void shareFreeList(final 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 cd7c074..c993fe5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DateRevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DateRevQueue.java
@@ -49,7 +49,9 @@
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 
-/** A queue of commits sorted by commit time order. */
+/**
+ * A queue of commits sorted by commit time order.
+ */
 public class DateRevQueue extends AbstractRevQueue {
 	private static final int REBUILD_INDEX_COUNT = 1000;
 
@@ -67,7 +69,9 @@
 
 	private int last = -1;
 
-	/** Create an empty date queue. */
+	/**
+	 * Create an empty date queue.
+	 */
 	public DateRevQueue() {
 		super();
 	}
@@ -82,6 +86,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void add(final RevCommit c) {
 		sinceLastIndex++;
@@ -127,6 +132,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() {
 		final Entry q = head;
@@ -163,6 +169,7 @@
 		return head != null ? head.commit : null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		head = null;
@@ -196,6 +203,7 @@
 		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/DepthWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java
index f932593..06a5272 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/DepthWalk.java
@@ -52,15 +52,30 @@
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.Repository;
 
-/** Interface for revision walkers that perform depth filtering. */
+/**
+ * Interface for revision walkers that perform depth filtering.
+ */
 public interface DepthWalk {
-	/** @return Depth to filter to. */
+	/**
+	 * Get depth to filter to.
+	 *
+	 * @return Depth to filter to.
+	 */
 	public int getDepth();
 
 	/** @return flag marking commits that should become unshallow. */
+	/**
+	 * Get flag marking commits that should become unshallow.
+	 *
+	 * @return flag marking commits that should become unshallow.
+	 */
 	public RevFlag getUnshallowFlag();
 
-	/** @return flag marking commits that are interesting again. */
+	/**
+	 * Get flag marking commits that are interesting again.
+	 *
+	 * @return flag marking commits that are interesting again.
+	 */
 	public RevFlag getReinterestingFlag();
 
 	/** RevCommit with a depth (in commits) from a root. */
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 1415604..63b7990 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FIFORevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FIFORevQueue.java
@@ -48,13 +48,17 @@
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 
-/** A queue of commits in FIFO order. */
+/**
+ * A queue of commits in FIFO order.
+ */
 public class FIFORevQueue extends BlockRevQueue {
 	private Block head;
 
 	private Block tail;
 
-	/** Create an empty FIFO queue. */
+	/**
+	 * Create an empty FIFO queue.
+	 */
 	public FIFORevQueue() {
 		super();
 	}
@@ -64,6 +68,7 @@
 		super(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void add(final RevCommit c) {
 		Block b = tail;
@@ -108,6 +113,7 @@
 		head = b;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() {
 		final Block b = head;
@@ -124,6 +130,7 @@
 		return c;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		head = null;
@@ -159,6 +166,7 @@
 		}
 	}
 
+	/** {@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 9928286..2da97c8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FollowFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FollowFilter.java
@@ -59,7 +59,8 @@
  * triggers rename detection so that the path node is updated to include a prior
  * file name as the RevWalk traverses history.
  *
- * The renames found will be reported to a {@link RenameCallback} if one is set.
+ * The renames found will be reported to a
+ * {@link org.eclipse.jgit.revwalk.RenameCallback} if one is set.
  * <p>
  * Results with this filter are unpredictable if the path being followed is a
  * subdirectory.
@@ -81,7 +82,7 @@
 	 * @param cfg
 	 *            diff config specifying rename detection options.
 	 * @return a new filter for the requested path.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the path supplied was the empty string.
 	 * @since 3.0
 	 */
@@ -100,10 +101,16 @@
 	}
 
 	/** @return the path this filter matches. */
+	/**
+	 * Get the path this filter matches.
+	 *
+	 * @return the path this filter matches.
+	 */
 	public String getPath() {
 		return path.getPath();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final TreeWalk walker)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -111,16 +118,19 @@
 		return path.include(walker) && ANY_DIFF.include(walker);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		return path.shouldBeRecursive() || ANY_DIFF.shouldBeRecursive();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return new FollowFilter(path.clone(), cfg);
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -130,6 +140,8 @@
 	}
 
 	/**
+	 * Get the callback to which renames are reported.
+	 *
 	 * @return the callback to which renames are reported, or <code>null</code>
 	 *         if none
 	 */
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 36965f4..360be29 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterKey.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterKey.java
@@ -47,7 +47,9 @@
 
 import org.eclipse.jgit.lib.Constants;
 
-/** Case insensitive key for a {@link FooterLine}. */
+/**
+ * Case insensitive key for a {@link org.eclipse.jgit.revwalk.FooterLine}.
+ */
 public final class FooterKey {
 	/** Standard {@code Signed-off-by} */
 	public static final FooterKey SIGNED_OFF_BY = new FooterKey("Signed-off-by"); //$NON-NLS-1$
@@ -73,11 +75,16 @@
 		raw = Constants.encode(keyName.toLowerCase(Locale.ROOT));
 	}
 
-	/** @return name of this footer line. */
+	/**
+	 * Get name of this footer line.
+	 *
+	 * @return name of this footer line.
+	 */
 	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 b061d6a..074ce82 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
@@ -80,6 +80,8 @@
 	}
 
 	/**
+	 * Whether keys match
+	 *
 	 * @param key
 	 *            key to test this line's key name against.
 	 * @return true if {@code key.getName().equalsIgnorecase(getKey())}.
@@ -101,6 +103,8 @@
 	}
 
 	/**
+	 * Get key name of this footer.
+	 *
 	 * @return key name of this footer; that is the text before the ":" on the
 	 *         line footer's line. The text is decoded according to the commit's
 	 *         specified (or assumed) character encoding.
@@ -110,6 +114,8 @@
 	}
 
 	/**
+	 * Get value of this footer.
+	 *
 	 * @return value of this footer; that is the text after the ":" and any
 	 *         leading whitespace has been skipped. May be the empty string if
 	 *         the footer has no value (line ended with ":"). The text is
@@ -144,6 +150,7 @@
 		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/LIFORevQueue.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java
index f9da5b1..f734b69 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/LIFORevQueue.java
@@ -49,11 +49,15 @@
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 
-/** A queue of commits in LIFO order. */
+/**
+ * A queue of commits in LIFO order.
+ */
 public class LIFORevQueue extends BlockRevQueue {
 	private Block head;
 
-	/** Create an empty LIFO queue. */
+	/**
+	 * Create an empty LIFO queue.
+	 */
 	public LIFORevQueue() {
 		super();
 	}
@@ -63,6 +67,7 @@
 		super(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void add(final RevCommit c) {
 		Block b = head;
@@ -75,6 +80,7 @@
 		b.unpop(c);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() {
 		final Block b = head;
@@ -89,6 +95,7 @@
 		return c;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		head = null;
@@ -115,6 +122,7 @@
 		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 5868998..25c3e12 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
@@ -76,8 +76,9 @@
  * scheduled for inclusion in the results of {@link #nextObject()}, returning
  * each object exactly once. Objects are sorted and returned according to the
  * the commits that reference them and the order they appear within a tree.
- * Ordering can be affected by changing the {@link RevSort} used to order the
- * commits that are returned first.
+ * Ordering can be affected by changing the
+ * {@link org.eclipse.jgit.revwalk.RevSort} used to order the commits that are
+ * returned first.
  */
 public class ObjectWalk extends RevWalk {
 	private static final int ID_SZ = 20;
@@ -142,34 +143,39 @@
 	/**
 	 * Mark an object or commit to start graph traversal from.
 	 * <p>
-	 * Callers are encouraged to use {@link RevWalk#parseAny(AnyObjectId)}
-	 * instead of {@link RevWalk#lookupAny(AnyObjectId, int)}, as this method
-	 * requires the object to be parsed before it can be added as a root for the
-	 * traversal.
+	 * Callers are encouraged to use
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseAny(AnyObjectId)} instead of
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}, as
+	 * this method requires the object to be parsed before it can be added as a
+	 * root for the traversal.
 	 * <p>
 	 * The method will automatically parse an unparsed object, but error
 	 * handling may be more difficult for the application to explain why a
 	 * RevObject is not actually valid. The object pool of this walker would
 	 * also be 'poisoned' by the invalid RevObject.
 	 * <p>
-	 * This method will automatically call {@link RevWalk#markStart(RevCommit)}
-	 * if passed RevCommit instance, or a RevTag that directly (or indirectly)
-	 * references a RevCommit.
+	 * This method will automatically call
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#markStart(RevCommit)} if passed
+	 * RevCommit instance, or a RevTag that directly (or indirectly) references
+	 * a RevCommit.
 	 *
 	 * @param o
 	 *            the object to start traversing from. The object passed must be
 	 *            from this same revision walker.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object supplied is not available from the object
 	 *             database. This usually indicates the supplied object is
 	 *             invalid, but the reference was constructed during an earlier
-	 *             invocation to {@link RevWalk#lookupAny(AnyObjectId, int)}.
-	 * @throws IncorrectObjectTypeException
+	 *             invocation to
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}.
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually the type of the instance
 	 *             passed in. This usually indicates the caller used the wrong
-	 *             type in a {@link RevWalk#lookupAny(AnyObjectId, int)} call.
-	 * @throws IOException
+	 *             type in a
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}
+	 *             call.
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void markStart(RevObject o) throws MissingObjectException,
@@ -193,33 +199,38 @@
 	 * reachable chain, back until the merge base of an uninteresting commit and
 	 * an otherwise interesting commit.
 	 * <p>
-	 * Callers are encouraged to use {@link RevWalk#parseAny(AnyObjectId)}
-	 * instead of {@link RevWalk#lookupAny(AnyObjectId, int)}, as this method
-	 * requires the object to be parsed before it can be added as a root for the
-	 * traversal.
+	 * Callers are encouraged to use
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseAny(AnyObjectId)} instead of
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}, as
+	 * this method requires the object to be parsed before it can be added as a
+	 * root for the traversal.
 	 * <p>
 	 * The method will automatically parse an unparsed object, but error
 	 * handling may be more difficult for the application to explain why a
 	 * RevObject is not actually valid. The object pool of this walker would
 	 * also be 'poisoned' by the invalid RevObject.
 	 * <p>
-	 * This method will automatically call {@link RevWalk#markStart(RevCommit)}
-	 * if passed RevCommit instance, or a RevTag that directly (or indirectly)
-	 * references a RevCommit.
+	 * This method will automatically call
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#markStart(RevCommit)} if passed
+	 * RevCommit instance, or a RevTag that directly (or indirectly) references
+	 * a RevCommit.
 	 *
 	 * @param o
 	 *            the object to start traversing from. The object passed must be
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the object supplied is not available from the object
 	 *             database. This usually indicates the supplied object is
 	 *             invalid, but the reference was constructed during an earlier
-	 *             invocation to {@link RevWalk#lookupAny(AnyObjectId, int)}.
-	 * @throws IncorrectObjectTypeException
+	 *             invocation to
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}.
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually the type of the instance
 	 *             passed in. This usually indicates the caller used the wrong
-	 *             type in a {@link RevWalk#lookupAny(AnyObjectId, int)} call.
-	 * @throws IOException
+	 *             type in a
+	 *             {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}
+	 *             call.
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void markUninteresting(RevObject o) throws MissingObjectException,
@@ -243,12 +254,14 @@
 			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);
@@ -259,7 +272,6 @@
 	 * Get the currently configured object filter.
 	 *
 	 * @return the current filter. Never null as a filter is always needed.
-	 *
 	 * @since 4.0
 	 */
 	public ObjectFilter getObjectFilter() {
@@ -267,9 +279,9 @@
 	}
 
 	/**
-	 * Set the object filter for this walker.  This filter affects the objects
-	 * visited by {@link #nextObject()}.  It does not affect the commits
-	 * listed by {@link #next()}.
+	 * Set the object filter for this walker. This filter affects the objects
+	 * visited by {@link #nextObject()}. It does not affect the commits listed
+	 * by {@link #next()}.
 	 * <p>
 	 * If the filter returns false for an object, then that object is skipped
 	 * and objects reachable from it are not enqueued to be walked recursively.
@@ -277,9 +289,9 @@
 	 * are known to be uninteresting.
 	 *
 	 * @param newFilter
-	 *            the new filter. If null the special {@link ObjectFilter#ALL}
+	 *            the new filter. If null the special
+	 *            {@link org.eclipse.jgit.revwalk.filter.ObjectFilter#ALL}
 	 *            filter will be used instead, as it matches every object.
-	 *
 	 * @since 4.0
 	 */
 	public void setObjectFilter(ObjectFilter newFilter) {
@@ -287,6 +299,7 @@
 		objectFilter = newFilter != null ? newFilter : ObjectFilter.ALL;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevCommit next() throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -316,14 +329,14 @@
 	 * Pop the next most recent object.
 	 *
 	 * @return next most recent object; null if traversal is over.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             one or or more of the next objects are not available from the
 	 *             object database, but were thought to be candidates for
 	 *             traversal. This usually indicates a broken link.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             one or or more of the objects in a tree do not match the type
 	 *             indicated.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevObject nextObject() throws MissingObjectException,
@@ -520,14 +533,14 @@
 	 * exception if there is a connectivity problem. The exception message
 	 * provides some detail about the connectivity failure.
 	 *
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             one or or more of the next objects are not available from the
 	 *             object database, but were thought to be candidates for
 	 *             traversal. This usually indicates a broken link.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             one or or more of the objects in a tree do not match the type
 	 *             indicated.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void checkConnectivity() throws MissingObjectException,
@@ -618,14 +631,22 @@
 		return hash;
 	}
 
-	/** @return the internal buffer holding the current path. */
+	/**
+	 * Get the internal buffer holding the current path.
+	 *
+	 * @return the internal buffer holding the current path.
+	 */
 	public byte[] getPathBuffer() {
 		if (pathLen == 0)
 			pathLen = updatePathBuf(currVisit);
 		return pathBuf;
 	}
 
-	/** @return length of the path in {@link #getPathBuffer()}. */
+	/**
+	 * Get length of the path in {@link #getPathBuffer()}.
+	 *
+	 * @return length of the path in {@link #getPathBuffer()}.
+	 */
 	public int getPathLength() {
 		if (pathLen == 0)
 			pathLen = updatePathBuf(currVisit);
@@ -667,6 +688,7 @@
 		pathBuf = newBuf;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void dispose() {
 		super.dispose();
@@ -675,6 +697,7 @@
 		freeVisit = null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void reset(final 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 3778355..7754f18 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RenameCallback.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RenameCallback.java
@@ -46,8 +46,9 @@
 
 /**
  * An instance of this class can be used in conjunction with a
- * {@link FollowFilter}. Whenever a rename has been detected during a revision
- * walk, it will be reported here.
+ * {@link org.eclipse.jgit.revwalk.FollowFilter}. Whenever a rename has been
+ * detected during a revision walk, it will be reported here.
+ *
  * @see FollowFilter#setRenameCallback(RenameCallback)
  */
 public abstract class RenameCallback {
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 4245fca..d352929 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevBlob.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevBlob.java
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
 
-/** A binary file, or a symbolic link. */
+/**
+ * A binary file, or a symbolic link.
+ */
 public class RevBlob extends RevObject {
 	/**
 	 * Create a new blob reference.
@@ -64,6 +66,7 @@
 		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 c641a13..9db1467 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java
@@ -66,7 +66,9 @@
 import org.eclipse.jgit.util.RawParseUtils;
 import org.eclipse.jgit.util.StringUtils;
 
-/** A commit reference to a commit in the DAG. */
+/**
+ * A commit reference to a commit in the DAG.
+ */
 public class RevCommit extends RevObject {
 	private static final int STACK_DEPTH = 500;
 
@@ -79,7 +81,8 @@
 	 * will not have their headers loaded.
 	 *
 	 * Applications are discouraged from using this API. Callers usually need
-	 * more than one commit. Use {@link RevWalk#parseCommit(AnyObjectId)} to
+	 * more than one commit. Use
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseCommit(AnyObjectId)} to
 	 * obtain a RevCommit from an existing repository.
 	 *
 	 * @param raw
@@ -115,7 +118,7 @@
 	 *            modified by the caller.
 	 * @return the parsed commit, in an isolated revision pool that is not
 	 *         available to the caller.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             in case of RevWalk initialization fails
 	 */
 	public static RevCommit parse(RevWalk rw, byte[] raw) throws IOException {
@@ -220,6 +223,7 @@
 		flags |= PARSED;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return Constants.OBJ_COMMIT;
@@ -315,7 +319,7 @@
 	/**
 	 * Time from the "committer " line of the buffer.
 	 *
-	 * @return time, expressed as seconds since the epoch.
+	 * @return commit time
 	 */
 	public final int getCommitTime() {
 		return commitTime;
@@ -346,7 +350,7 @@
 	 *            parent index to obtain. Must be in the range 0 through
 	 *            {@link #getParentCount()}-1.
 	 * @return the specified parent.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             an invalid parent index was specified.
 	 */
 	public final RevCommit getParent(final int nth) {
@@ -394,9 +398,10 @@
 	 * should cache the return value for as long as necessary to use all
 	 * information from it.
 	 * <p>
-	 * RevFilter implementations should try to use {@link RawParseUtils} to scan
-	 * the {@link #getRawBuffer()} instead, as this will allow faster evaluation
-	 * of commits.
+	 * RevFilter implementations should try to use
+	 * {@link org.eclipse.jgit.util.RawParseUtils} to scan the
+	 * {@link #getRawBuffer()} instead, as this will allow faster evaluation of
+	 * commits.
 	 *
 	 * @return identity of the author (name, email) and the time the commit was
 	 *         made by the author; null if no author line was found.
@@ -420,9 +425,10 @@
 	 * should cache the return value for as long as necessary to use all
 	 * information from it.
 	 * <p>
-	 * RevFilter implementations should try to use {@link RawParseUtils} to scan
-	 * the {@link #getRawBuffer()} instead, as this will allow faster evaluation
-	 * of commits.
+	 * RevFilter implementations should try to use
+	 * {@link org.eclipse.jgit.util.RawParseUtils} to scan the
+	 * {@link #getRawBuffer()} instead, as this will allow faster evaluation of
+	 * commits.
 	 *
 	 * @return identity of the committer (name, email) and the time the commit
 	 *         was made by the committer; null if no committer line was found.
@@ -654,7 +660,7 @@
 	 * time in {@link #getCommitTime()}. Accessing other properties such as
 	 * {@link #getAuthorIdent()}, {@link #getCommitterIdent()} or either message
 	 * function requires reloading the buffer by invoking
-	 * {@link RevWalk#parseBody(RevObject)}.
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseBody(RevObject)}.
 	 *
 	 * @since 4.0
 	 */
@@ -662,6 +668,7 @@
 		buffer = null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
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 64f99bb..38cf3f5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
@@ -50,7 +50,7 @@
 import org.eclipse.jgit.revwalk.filter.RevFilter;
 
 /**
- * An ordered list of {@link RevCommit} subclasses.
+ * An ordered list of {@link org.eclipse.jgit.revwalk.RevCommit} subclasses.
  *
  * @param <E>
  *            type of subclass of RevCommit the list is storing.
@@ -58,6 +58,7 @@
 public class RevCommitList<E extends RevCommit> extends RevObjectList<E> {
 	private RevWalk walker;
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		super.clear();
@@ -77,15 +78,15 @@
 	 * @param flag
 	 *            the flag to apply (or remove). Applications are responsible
 	 *            for allocating this flag from the source RevWalk.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             revision filter needed to read additional objects, but an
 	 *             error occurred while reading the pack files or loose objects
 	 *             of the repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             revision filter needed to read additional objects, but an
 	 *             object was not of the correct type. Repository corruption may
 	 *             have occurred.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             revision filter needed to read additional objects, but an
 	 *             object that should be present was not found. Repository
 	 *             corruption may have occurred.
@@ -117,15 +118,15 @@
 	 *            last commit within the list to end testing at, exclusive. If
 	 *            smaller than or equal to <code>rangeBegin</code> then no
 	 *            commits will be tested.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             revision filter needed to read additional objects, but an
 	 *             error occurred while reading the pack files or loose objects
 	 *             of the repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             revision filter needed to read additional objects, but an
 	 *             object was not of the correct type. Repository corruption may
 	 *             have occurred.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             revision filter needed to read additional objects, but an
 	 *             object that should be present was not found. Repository
 	 *             corruption may have occurred.
@@ -290,12 +291,12 @@
 	 * @param highMark
 	 *            number of commits the caller wants this list to contain when
 	 *            the fill operation is complete.
-	 * @throws IOException
-	 *             see {@link RevWalk#next()}
-	 * @throws IncorrectObjectTypeException
-	 *             see {@link RevWalk#next()}
-	 * @throws MissingObjectException
-	 *             see {@link RevWalk#next()}
+	 * @throws java.io.IOException
+	 *             see {@link org.eclipse.jgit.revwalk.RevWalk#next()}
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             see {@link org.eclipse.jgit.revwalk.RevWalk#next()}
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             see {@link org.eclipse.jgit.revwalk.RevWalk#next()}
 	 */
 	@SuppressWarnings("unchecked")
 	public void fillTo(final int highMark) throws MissingObjectException,
@@ -355,12 +356,12 @@
 	 *            contain when the fill operation is complete. If highMark is 0
 	 *            the walk is pumped until the specified commit or the end of
 	 *            the walk is reached.
-	 * @throws IOException
-	 *             see {@link RevWalk#next()}
-	 * @throws IncorrectObjectTypeException
-	 *             see {@link RevWalk#next()}
-	 * @throws MissingObjectException
-	 *             see {@link RevWalk#next()}
+	 * @throws java.io.IOException
+	 *             see {@link org.eclipse.jgit.revwalk.RevWalk#next()}
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             see {@link org.eclipse.jgit.revwalk.RevWalk#next()}
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             see {@link org.eclipse.jgit.revwalk.RevWalk#next()}
 	 */
 	@SuppressWarnings("unchecked")
 	public void fillTo(final RevCommit commitToLoad, int highMark)
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 dae52f8..1e79867 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlag.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlag.java
@@ -48,9 +48,10 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * Application level mark bit for {@link RevObject}s.
+ * Application level mark bit for {@link org.eclipse.jgit.revwalk.RevObject}s.
  * <p>
- * To create a flag use {@link RevWalk#newFlag(String)}.
+ * To create a flag use
+ * {@link org.eclipse.jgit.revwalk.RevWalk#newFlag(String)}.
  */
 public class RevFlag {
 	/**
@@ -99,6 +100,7 @@
 		return walker;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return name;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlagSet.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlagSet.java
index bb699e0..9740d14 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlagSet.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevFlagSet.java
@@ -50,7 +50,8 @@
 import java.util.List;
 
 /**
- * Multiple application level mark bits for {@link RevObject}s.
+ * Multiple application level mark bits for
+ * {@link org.eclipse.jgit.revwalk.RevObject}s.
  *
  * @see RevFlag
  */
@@ -59,7 +60,9 @@
 
 	private final List<RevFlag> active;
 
-	/** Create an empty set of flags. */
+	/**
+	 * Create an empty set of flags.
+	 */
 	public RevFlagSet() {
 		active = new ArrayList<>();
 	}
@@ -86,6 +89,7 @@
 		addAll(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean contains(final Object o) {
 		if (o instanceof RevFlag)
@@ -93,6 +97,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean containsAll(final Collection<?> c) {
 		if (c instanceof RevFlagSet) {
@@ -102,6 +107,7 @@
 		return super.containsAll(c);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean add(final RevFlag flag) {
 		if ((mask & flag.mask) != 0)
@@ -114,6 +120,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean remove(final Object o) {
 		final RevFlag flag = (RevFlag) o;
@@ -126,6 +133,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Iterator<RevFlag> iterator() {
 		final Iterator<RevFlag> i = active.iterator();
@@ -150,6 +158,7 @@
 		};
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		return active.size();
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 7561927..4a88105 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdOwnerMap;
 
-/** Base object type accessed during revision walking. */
+/**
+ * Base object type accessed during revision walking.
+ */
 public abstract class RevObject extends ObjectIdOwnerMap.Entry {
 	static final int PARSED = 1;
 
@@ -69,7 +71,7 @@
 			IncorrectObjectTypeException, IOException;
 
 	/**
-	 * Get Git object type. See {@link Constants}.
+	 * Get Git object type. See {@link org.eclipse.jgit.lib.Constants}.
 	 *
 	 * @return object type
 	 */
@@ -163,6 +165,7 @@
 		flags &= ~set.mask;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder s = new StringBuilder();
@@ -175,6 +178,8 @@
 	}
 
 	/**
+	 * Append a debug description of core RevFlags to a buffer.
+	 *
 	 * @param s
 	 *            buffer to append a debug description of core RevFlags onto.
 	 */
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 9598678..2bb4427 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObjectList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObjectList.java
@@ -51,7 +51,7 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * An ordered list of {@link RevObject} subclasses.
+ * An ordered list of {@link org.eclipse.jgit.revwalk.RevObject} subclasses.
  *
  * @param <E>
  *            type of subclass of RevObject the list is storing.
@@ -73,11 +73,14 @@
 	/** Current number of elements in the list. */
 	protected int size = 0;
 
-	/** Create an empty object list. */
+	/**
+	 * Create an empty object list.
+	 */
 	public RevObjectList() {
 		// Initialized above.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void add(final int index, final E element) {
 		if (index != size)
@@ -88,6 +91,7 @@
 		size++;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("unchecked")
 	public E set(int index, E element) {
@@ -109,6 +113,7 @@
 		return (E) old;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("unchecked")
 	public E get(int index) {
@@ -123,11 +128,13 @@
 		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/RevSort.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevSort.java
index 238af12..a3b31a1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevSort.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevSort.java
@@ -44,7 +44,10 @@
 
 package org.eclipse.jgit.revwalk;
 
-/** Sorting strategies supported by {@link RevWalk} and {@link ObjectWalk}. */
+/**
+ * Sorting strategies supported by {@link org.eclipse.jgit.revwalk.RevWalk} and
+ * {@link org.eclipse.jgit.revwalk.ObjectWalk}.
+ */
 public enum RevSort {
 	/**
 	 * No specific sorting is requested.
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 81a54bf..d74837e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
@@ -64,7 +64,9 @@
 import org.eclipse.jgit.util.RawParseUtils;
 import org.eclipse.jgit.util.StringUtils;
 
-/** An annotated tag. */
+/**
+ * An annotated tag.
+ */
 public class RevTag extends RevObject {
 	/**
 	 * Parse an annotated tag from its canonical format.
@@ -75,14 +77,15 @@
 	 * not have its headers loaded.
 	 *
 	 * Applications are discouraged from using this API. Callers usually need
-	 * more than one object. Use {@link RevWalk#parseTag(AnyObjectId)} to obtain
+	 * more than one object. Use
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseTag(AnyObjectId)} to obtain
 	 * a RevTag from an existing repository.
 	 *
 	 * @param raw
 	 *            the canonical formatted tag to be parsed.
 	 * @return the parsed tag, in an isolated revision pool that is not
 	 *         available to the caller.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the tag contains a malformed header that cannot be handled.
 	 */
 	public static RevTag parse(byte[] raw) throws CorruptObjectException {
@@ -109,7 +112,7 @@
 	 *            modified by the caller.
 	 * @return the parsed tag, in an isolated revision pool that is not
 	 *         available to the caller.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the tag contains a malformed header that cannot be handled.
 	 */
 	public static RevTag parse(RevWalk rw, byte[] raw)
@@ -173,6 +176,7 @@
 		flags |= PARSED;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final int getType() {
 		return Constants.OBJ_TAG;
@@ -261,12 +265,15 @@
 	 * Get a reference to the object this tag was placed on.
 	 * <p>
 	 * Note that the returned object has only been looked up (see
-	 * {@link RevWalk#lookupAny(AnyObjectId, int)}. To access the contents it
-	 * needs to be parsed, see {@link RevWalk#parseHeaders(RevObject)} and
-	 * {@link RevWalk#parseBody(RevObject)}.
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#lookupAny(AnyObjectId, int)}. To
+	 * access the contents it needs to be parsed, see
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseHeaders(RevObject)} and
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseBody(RevObject)}.
 	 * <p>
-	 * As an alternative, use {@link RevWalk#peel(RevObject)} and pass this
-	 * {@link RevTag} to peel it until the first non-tag object.
+	 * As an alternative, use
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#peel(RevObject)} and pass this
+	 * {@link org.eclipse.jgit.revwalk.RevTag} to peel it until the first
+	 * non-tag object.
 	 *
 	 * @return object this tag refers to (only looked up, not parsed)
 	 */
@@ -290,7 +297,7 @@
 	 * only the {@link #getObject()} pointer and {@link #getTagName()}.
 	 * Accessing other properties such as {@link #getTaggerIdent()} or either
 	 * message function requires reloading the buffer by invoking
-	 * {@link RevWalk#parseBody(RevObject)}.
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#parseBody(RevObject)}.
 	 *
 	 * @since 4.0
 	 */
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 d370409..92b81a1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTree.java
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
 
-/** A reference to a tree of subtrees/files. */
+/**
+ * A reference to a tree of subtrees/files.
+ */
 public class RevTree extends RevObject {
 	/**
 	 * Create a new tree reference.
@@ -64,6 +66,7 @@
 		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 320f05f..5568241 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
@@ -84,10 +84,12 @@
  * usage of a RevWalk instance to a single thread, or implement their own
  * synchronization at a higher level.
  * <p>
- * Multiple simultaneous RevWalk instances per {@link Repository} are permitted,
- * even from concurrent threads. Equality of {@link RevCommit}s from two
- * different RevWalk instances is never true, even if their {@link ObjectId}s
- * are equal (and thus they describe the same commit).
+ * Multiple simultaneous RevWalk instances per
+ * {@link org.eclipse.jgit.lib.Repository} are permitted, even from concurrent
+ * threads. Equality of {@link org.eclipse.jgit.revwalk.RevCommit}s from two
+ * different RevWalk instances is never true, even if their
+ * {@link org.eclipse.jgit.lib.ObjectId}s are equal (and thus they describe the
+ * same commit).
  * <p>
  * The offered iterator is over the list of RevCommits described by the
  * configuration of this instance. Applications should restrict themselves to
@@ -236,12 +238,18 @@
 		this.closeReader = closeReader;
 	}
 
-	/** @return the reader this walker is using to load objects. */
+	/**
+	 * Get the reader this walker is using to load objects.
+	 *
+	 * @return the reader this walker is using to load objects.
+	 */
 	public ObjectReader getObjectReader() {
 		return reader;
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release any resources used by this walker's reader.
 	 * <p>
 	 * A walker that has been released can be used again, but may need to be
@@ -272,17 +280,17 @@
 	 * @param c
 	 *            the commit to start traversing from. The commit passed must be
 	 *            from this same revision walker.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the commit supplied is not available from the object
 	 *             database. This usually indicates the supplied commit is
 	 *             invalid, but the reference was constructed during an earlier
 	 *             invocation to {@link #lookupCommit(AnyObjectId)}.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually a commit. This usually
 	 *             indicates the caller supplied a non-commit SHA-1 to
 	 *             {@link #lookupCommit(AnyObjectId)}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void markStart(final RevCommit c) throws MissingObjectException,
@@ -302,17 +310,17 @@
 	 * @param list
 	 *            commits to start traversing from. The commits passed must be
 	 *            from this same revision walker.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             one of the commits supplied is not available from the object
 	 *             database. This usually indicates the supplied commit is
 	 *             invalid, but the reference was constructed during an earlier
 	 *             invocation to {@link #lookupCommit(AnyObjectId)}.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually a commit. This usually
 	 *             indicates the caller supplied a non-commit SHA-1 to
 	 *             {@link #lookupCommit(AnyObjectId)}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void markStart(final Collection<RevCommit> list)
@@ -342,17 +350,17 @@
 	 * @param c
 	 *            the commit to start traversing from. The commit passed must be
 	 *            from this same revision walker.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the commit supplied is not available from the object
 	 *             database. This usually indicates the supplied commit is
 	 *             invalid, but the reference was constructed during an earlier
 	 *             invocation to {@link #lookupCommit(AnyObjectId)}.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object was not parsed yet and it was discovered during
 	 *             parsing that it is not actually a commit. This usually
 	 *             indicates the caller supplied a non-commit SHA-1 to
 	 *             {@link #lookupCommit(AnyObjectId)}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void markUninteresting(final RevCommit c)
@@ -383,14 +391,14 @@
 	 * @return true if there is a path directly from <code>tip</code> to
 	 *         <code>base</code> (and thus <code>base</code> is fully merged
 	 *         into <code>tip</code>); false otherwise.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             one or or more of the next commit's parents are not available
 	 *             from the object database, but were thought to be candidates
 	 *             for traversal. This usually indicates a broken link.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             one or or more of the next commit's parents are not actually
 	 *             commit objects.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public boolean isMergedInto(final RevCommit base, final RevCommit tip)
@@ -420,14 +428,14 @@
 	 * Pop the next most recent commit.
 	 *
 	 * @return next most recent commit; null if traversal is over.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             one or or more of the next commit's parents are not available
 	 *             from the object database, but were thought to be candidates
 	 *             for traversal. This usually indicates a broken link.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             one or or more of the next commit's parents are not actually
 	 *             commit objects.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevCommit next() throws MissingObjectException,
@@ -439,7 +447,8 @@
 	 * Obtain the sort types applied to the commits returned.
 	 *
 	 * @return the sorting strategies employed. At least one strategy is always
-	 *         used, but that strategy may be {@link RevSort#NONE}.
+	 *         used, but that strategy may be
+	 *         {@link org.eclipse.jgit.revwalk.RevSort#NONE}.
 	 */
 	public EnumSet<RevSort> getRevSort() {
 		return sorting.clone();
@@ -475,8 +484,9 @@
 	 * Add or remove a sorting strategy for the returned commits.
 	 * <p>
 	 * Multiple strategies can be applied at once, in which case some strategies
-	 * may take precedence over others. As an example, {@link RevSort#TOPO} must
-	 * take precedence over {@link RevSort#COMMIT_TIME_DESC}, otherwise it
+	 * may take precedence over others. As an example,
+	 * {@link org.eclipse.jgit.revwalk.RevSort#TOPO} must take precedence over
+	 * {@link org.eclipse.jgit.revwalk.RevSort#COMMIT_TIME_DESC}, otherwise it
 	 * cannot enforce its ordering.
 	 *
 	 * @param s
@@ -518,12 +528,14 @@
 	 * Note that filters are not thread-safe and may not be shared by concurrent
 	 * RevWalk instances. Every RevWalk must be supplied its own unique filter,
 	 * unless the filter implementation specifically states it is (and always
-	 * will be) thread-safe. Callers may use {@link RevFilter#clone()} to create
-	 * a unique filter tree for this RevWalk instance.
+	 * will be) thread-safe. Callers may use
+	 * {@link org.eclipse.jgit.revwalk.filter.RevFilter#clone()} to create a
+	 * unique filter tree for this RevWalk instance.
 	 *
 	 * @param newFilter
-	 *            the new filter. If null the special {@link RevFilter#ALL}
-	 *            filter will be used instead, as it matches every commit.
+	 *            the new filter. If null the special
+	 *            {@link org.eclipse.jgit.revwalk.filter.RevFilter#ALL} filter
+	 *            will be used instead, as it matches every commit.
 	 * @see org.eclipse.jgit.revwalk.filter.AndRevFilter
 	 * @see org.eclipse.jgit.revwalk.filter.OrRevFilter
 	 */
@@ -536,7 +548,9 @@
 	 * Get the tree filter used to simplify commits by modified paths.
 	 *
 	 * @return the current filter. Never null as a filter is always needed. If
-	 *         no filter is being applied {@link TreeFilter#ALL} is returned.
+	 *         no filter is being applied
+	 *         {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ALL} is
+	 *         returned.
 	 */
 	public TreeFilter getTreeFilter() {
 		return treeFilter;
@@ -545,20 +559,23 @@
 	/**
 	 * Set the tree filter used to simplify commits by modified paths.
 	 * <p>
-	 * If null or {@link TreeFilter#ALL} the path limiter is removed. Commits
-	 * will not be simplified.
+	 * If null or {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ALL} the
+	 * path limiter is removed. Commits will not be simplified.
 	 * <p>
-	 * If non-null and not {@link TreeFilter#ALL} then the tree filter will be
-	 * installed. Commits will have their ancestry simplified to hide commits that
-	 * do not contain tree entries matched by the filter, unless
-	 * {@code setRewriteParents(false)} is called.
+	 * If non-null and not
+	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ALL} then the tree
+	 * filter will be installed. Commits will have their ancestry simplified to
+	 * hide commits that do not contain tree entries matched by the filter,
+	 * unless {@code setRewriteParents(false)} is called.
 	 * <p>
 	 * Usually callers should be inserting a filter graph including
-	 * {@link TreeFilter#ANY_DIFF} along with one or more
-	 * {@link org.eclipse.jgit.treewalk.filter.PathFilter} instances.
+	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ANY_DIFF} along with
+	 * one or more {@link org.eclipse.jgit.treewalk.filter.PathFilter}
+	 * instances.
 	 *
 	 * @param newFilter
-	 *            new filter. If null the special {@link TreeFilter#ALL} filter
+	 *            new filter. If null the special
+	 *            {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ALL} filter
 	 *            will be used instead, as it matches everything.
 	 * @see org.eclipse.jgit.treewalk.filter.PathFilter
 	 */
@@ -571,9 +588,9 @@
 	 * Set whether to rewrite parent pointers when filtering by modified paths.
 	 * <p>
 	 * By default, when {@link #setTreeFilter(TreeFilter)} is called with non-
-	 * null and non-{@link TreeFilter#ALL} filter, commits will have their
-	 * ancestry simplified and parents rewritten to hide commits that do not match
-	 * the filter.
+	 * null and non-{@link org.eclipse.jgit.treewalk.filter.TreeFilter#ALL}
+	 * filter, commits will have their ancestry simplified and parents rewritten
+	 * to hide commits that do not match the filter.
 	 * <p>
 	 * This behavior can be bypassed by passing false to this method.
 	 *
@@ -596,8 +613,8 @@
 	 * care and would prefer to discard the body of a commit as early as
 	 * possible, to reduce memory usage.
 	 * <p>
-	 * True by default on {@link RevWalk} and false by default for
-	 * {@link ObjectWalk}.
+	 * True by default on {@link org.eclipse.jgit.revwalk.RevWalk} and false by
+	 * default for {@link org.eclipse.jgit.revwalk.ObjectWalk}.
 	 *
 	 * @return true if the body should be retained; false it is discarded.
 	 */
@@ -608,14 +625,15 @@
 	/**
 	 * Set whether or not the body of a commit or tag is retained.
 	 * <p>
-	 * If a body of a commit or tag is not retained, the application must
-	 * call {@link #parseBody(RevObject)} before the body can be safely
-	 * accessed through the type specific access methods.
+	 * If a body of a commit or tag is not retained, the application must call
+	 * {@link #parseBody(RevObject)} before the body can be safely accessed
+	 * through the type specific access methods.
 	 * <p>
-	 * True by default on {@link RevWalk} and false by default for
-	 * {@link ObjectWalk}.
+	 * True by default on {@link org.eclipse.jgit.revwalk.RevWalk} and false by
+	 * default for {@link org.eclipse.jgit.revwalk.ObjectWalk}.
 	 *
-	 * @param retain true to retain bodies; false to discard them early.
+	 * @param retain
+	 *            true to retain bodies; false to discard them early.
 	 */
 	public void setRetainBody(final boolean retain) {
 		retainBody = retain;
@@ -759,11 +777,11 @@
 	 * @param id
 	 *            name of the commit object.
 	 * @return reference to the commit object. Never null.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied commit does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the supplied id is not a commit or an annotated tag.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevCommit parseCommit(final AnyObjectId id)
@@ -786,11 +804,11 @@
 	 *            name of the tree object, or a commit or annotated tag that may
 	 *            reference a tree.
 	 * @return reference to the tree object. Never null.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied tree does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the supplied id is not a tree, a commit or an annotated tag.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevTree parseTree(final AnyObjectId id)
@@ -820,11 +838,11 @@
 	 * @param id
 	 *            name of the tag object.
 	 * @return reference to the tag object. Never null.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied tag does not exist.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the supplied id is not a tag or an annotated tag.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevTag parseTag(final AnyObjectId id) throws MissingObjectException,
@@ -847,9 +865,9 @@
 	 * @param id
 	 *            name of the object.
 	 * @return reference to the object. Never null.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevObject parseAny(final AnyObjectId id)
@@ -916,8 +934,6 @@
 	/**
 	 * Asynchronous object parsing.
 	 *
-	 * @param <T>
-	 *            any ObjectId type.
 	 * @param objectIds
 	 *            objects to open from the object store. The supplied collection
 	 *            must not be modified until the queue has finished.
@@ -1007,9 +1023,9 @@
 	 *
 	 * @param obj
 	 *            the object the caller needs to be parsed.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void parseHeaders(final RevObject obj)
@@ -1026,9 +1042,9 @@
 	 *
 	 * @param obj
 	 *            the object the caller needs to be parsed.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the supplied does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public void parseBody(final RevObject obj)
@@ -1044,9 +1060,9 @@
 	 * @return If {@code obj} is not an annotated tag, {@code obj}. Otherwise
 	 *         the first non-tag object that {@code obj} references. The
 	 *         returned object's headers have been parsed.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a referenced object cannot be found.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a pack file or loose object could not be read.
 	 */
 	public RevObject peel(RevObject obj) throws MissingObjectException,
@@ -1069,7 +1085,7 @@
 	 * @param name
 	 *            description of the flag, primarily useful for debugging.
 	 * @return newly constructed flag instance.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             too many flags have been reserved on this revision walker.
 	 */
 	public RevFlag newFlag(final String name) {
@@ -1308,6 +1324,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Returns an Iterator over the commits of this walker.
 	 * <p>
 	 * The returned iterator is only useful for one walk. If this RevWalk gets
@@ -1316,10 +1334,9 @@
 	 * Applications must not use both the Iterator and the {@link #next()} API
 	 * at the same time. Pick one API and use that for the entire walk.
 	 * <p>
-	 * If a checked exception is thrown during the walk (see {@link #next()})
-	 * it is rethrown from the Iterator as a {@link RevWalkException}.
+	 * If a checked exception is thrown during the walk (see {@link #next()}) it
+	 * is rethrown from the Iterator as a {@link RevWalkException}.
 	 *
-	 * @return an iterator over this walker's commits.
 	 * @see RevWalkException
 	 */
 	@Override
@@ -1365,7 +1382,9 @@
 		};
 	}
 
-	/** Throws an exception if we have started producing output. */
+	/**
+	 * Throws an exception if we have started producing output.
+	 */
 	protected void assertNotStarted() {
 		if (isNotStarted())
 			return;
@@ -1377,7 +1396,8 @@
 	}
 
 	/**
-	 * Create and return an {@link ObjectWalk} using the same objects.
+	 * Create and return an {@link org.eclipse.jgit.revwalk.ObjectWalk} using
+	 * the same objects.
 	 * <p>
 	 * Prior to using this method, the caller must reset this RevWalk to clean
 	 * any flags that were used during the last traversal.
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 e751d77..f1252a4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java
@@ -53,7 +53,7 @@
 import org.eclipse.jgit.lib.Ref;
 
 /**
- * Utility methods for {@link RevWalk}.
+ * Utility methods for {@link org.eclipse.jgit.revwalk.RevWalk}.
  */
 public final class RevWalkUtils {
 
@@ -67,9 +67,10 @@
 	 * other words, count the number of commits that are in <code>start</code>,
 	 * but not in <code>end</code>.
 	 * <p>
-	 * Note that this method calls {@link RevWalk#reset()} at the beginning.
-	 * Also note that the existing rev filter on the walk is left as-is, so be
-	 * sure to set the right rev filter before calling this method.
+	 * Note that this method calls
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#reset()} at the beginning. Also
+	 * note that the existing rev filter on the walk is left as-is, so be sure
+	 * to set the right rev filter before calling this method.
 	 *
 	 * @param walk
 	 *            the rev walk to use
@@ -78,11 +79,10 @@
 	 * @param end
 	 *            the commit where counting should end, or null if counting
 	 *            should be done until there are no more commits
-	 *
 	 * @return the number of commits
-	 * @throws MissingObjectException
-	 * @throws IncorrectObjectTypeException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 * @throws java.io.IOException
 	 */
 	public static int count(final RevWalk walk, final RevCommit start,
 			final RevCommit end) throws MissingObjectException,
@@ -96,9 +96,10 @@
 	 * Find of commits that are in <code>start</code>, but not in
 	 * <code>end</code>.
 	 * <p>
-	 * Note that this method calls {@link RevWalk#reset()} at the beginning.
-	 * Also note that the existing rev filter on the walk is left as-is, so be
-	 * sure to set the right rev filter before calling this method.
+	 * Note that this method calls
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#reset()} at the beginning. Also
+	 * note that the existing rev filter on the walk is left as-is, so be sure
+	 * to set the right rev filter before calling this method.
 	 *
 	 * @param walk
 	 *            the rev walk to use
@@ -108,9 +109,9 @@
 	 *            the commit where counting should end, or null if counting
 	 *            should be done until there are no more commits
 	 * @return the commits found
-	 * @throws MissingObjectException
-	 * @throws IncorrectObjectTypeException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 * @throws java.io.IOException
 	 */
 	public static List<RevCommit> find(final RevWalk walk,
 			final RevCommit start, final RevCommit end)
@@ -131,7 +132,8 @@
 	 * Find the list of branches a given commit is reachable from when following
 	 * parent.s
 	 * <p>
-	 * Note that this method calls {@link RevWalk#reset()} at the beginning.
+	 * Note that this method calls
+	 * {@link org.eclipse.jgit.revwalk.RevWalk#reset()} at the beginning.
 	 * <p>
 	 * In order to improve performance this method assumes clock skew among
 	 * committers is never larger than 24 hours.
@@ -143,9 +145,9 @@
 	 * @param refs
 	 *            the set of branches we want to see reachability from
 	 * @return the list of branches a given commit is reachable from
-	 * @throws MissingObjectException
-	 * @throws IncorrectObjectTypeException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 * @throws java.io.IOException
 	 */
 	public static List<Ref> findBranchesReachableFrom(RevCommit commit,
 			RevWalk revWalk, Collection<Ref> refs)
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 b2c0fcd..99c5d59 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TreeRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TreeRevFilter.java
@@ -60,10 +60,12 @@
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 
 /**
- * Filter applying a {@link TreeFilter} against changed paths in each commit.
+ * Filter applying a {@link org.eclipse.jgit.treewalk.filter.TreeFilter} against
+ * changed paths in each commit.
  * <p>
  * Each commit is differenced concurrently against all of its parents to look
- * for tree entries that are interesting to the {@link TreeFilter}.
+ * for tree entries that are interesting to the
+ * {@link org.eclipse.jgit.treewalk.filter.TreeFilter}.
  *
  * @since 3.5
  */
@@ -76,14 +78,15 @@
 	private final TreeWalk pathFilter;
 
 	/**
-	 * Create a {@link RevFilter} from a {@link TreeFilter}.
+	 * Create a {@link org.eclipse.jgit.revwalk.filter.RevFilter} from a
+	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter}.
 	 *
 	 * @param walker
 	 *            walker used for reading trees.
 	 * @param t
-	 *            filter to compare against any changed paths in each commit. If a
-	 *            {@link FollowFilter}, will be replaced with a new filter
-	 *            following new paths after a rename.
+	 *            filter to compare against any changed paths in each commit. If
+	 *            a {@link org.eclipse.jgit.revwalk.FollowFilter}, will be
+	 *            replaced with a new filter following new paths after a rename.
 	 * @since 3.5
 	 */
 	public TreeRevFilter(final RevWalk walker, final TreeFilter t) {
@@ -121,11 +124,13 @@
 		this.rewriteFlag = rewriteFlag;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		throw new UnsupportedOperationException();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final RevWalk walker, final RevCommit c)
 			throws StopWalkException, MissingObjectException,
@@ -260,6 +265,7 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return false;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AndRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AndRevFilter.java
index 4a91493..0019e0c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AndRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AndRevFilter.java
@@ -57,9 +57,10 @@
  * Includes a commit only if all subfilters include the same commit.
  * <p>
  * Classic shortcut behavior is used, so evaluation of the
- * {@link RevFilter#include(RevWalk, RevCommit)} method stops as soon as a false
- * result is obtained. Applications can improve filtering performance by placing
- * faster filters that are more likely to reject a result earlier in the list.
+ * {@link org.eclipse.jgit.revwalk.filter.RevFilter#include(RevWalk, RevCommit)}
+ * method stops as soon as a false result is obtained. Applications can improve
+ * filtering performance by placing faster filters that are more likely to
+ * reject a result earlier in the list.
  */
 public abstract class AndRevFilter extends RevFilter {
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AuthorRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AuthorRevFilter.java
index ef0064b..e00feaf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AuthorRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/AuthorRevFilter.java
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.util.RawCharSequence;
 import org.eclipse.jgit.util.RawParseUtils;
 
-/** Matches only commits whose author name matches the pattern. */
+/**
+ * Matches only commits whose author name matches the pattern.
+ */
 public class AuthorRevFilter {
 	/**
 	 * Create a new author filter.
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 5bf9366..9f4f10f 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
@@ -53,7 +53,9 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-/** Selects commits based upon the commit time field. */
+/**
+ * Selects commits based upon the commit time field.
+ */
 public abstract class CommitTimeRevFilter extends RevFilter {
 	/**
 	 * Create a new filter to select commits before a given date/time.
@@ -129,11 +131,13 @@
 		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/CommitterRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitterRevFilter.java
index eedfef2..4a1b3a6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitterRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/CommitterRevFilter.java
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.util.RawCharSequence;
 import org.eclipse.jgit.util.RawParseUtils;
 
-/** Matches only commits whose committer name matches the pattern. */
+/**
+ * Matches only commits whose committer name matches the pattern.
+ */
 public class CommitterRevFilter {
 	/**
 	 * Create a new committer filter.
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 38b0da5..02c6670 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
@@ -79,6 +79,7 @@
 		this.maxCount = maxCount;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit cmit)
 			throws StopWalkException, MissingObjectException,
@@ -89,6 +90,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevFilter clone() {
 		return new MaxCountRevFilter(maxCount);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MessageRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MessageRevFilter.java
index a7cc5bd..f1f4065 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MessageRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/MessageRevFilter.java
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.util.RawCharSequence;
 import org.eclipse.jgit.util.RawParseUtils;
 
-/** Matches only commits whose message matches the pattern. */
+/**
+ * Matches only commits whose message matches the pattern.
+ */
 public class MessageRevFilter {
 	/**
 	 * Create a message filter.
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 d338802..84b7f6b 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
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-/** Includes a commit only if the subfilter does not include the commit. */
+/**
+ * Includes a commit only if the subfilter does not include the commit.
+ */
 public class NotRevFilter extends RevFilter {
 	/**
 	 * Create a filter that negates the result of another filter.
@@ -69,11 +71,13 @@
 		a = one;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public RevFilter negate() {
 		return a;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final RevWalk walker, final RevCommit c)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -81,16 +85,19 @@
 		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/ObjectFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/ObjectFilter.java
index 2ad273d..777e4e0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/ObjectFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/ObjectFilter.java
@@ -54,7 +54,8 @@
  * Selects interesting objects when walking.
  * <p>
  * Applications should install the filter on an ObjectWalk by
- * {@link ObjectWalk#setObjectFilter(ObjectFilter)} prior to starting traversal.
+ * {@link org.eclipse.jgit.revwalk.ObjectWalk#setObjectFilter(ObjectFilter)}
+ * prior to starting traversal.
  *
  * @since 4.0
  */
@@ -77,13 +78,13 @@
 	 * @param objid
 	 *            the object currently being tested.
 	 * @return {@code true} if the named object should be included in the walk.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             an object the filter needed to consult to determine its
 	 *             answer was missing
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object the filter needed to consult to determine its
 	 *             answer was of the wrong type
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an object the filter needed to consult to determine its
 	 *             answer could not be read.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/OrRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/OrRevFilter.java
index 4c7b3bf..a14764a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/OrRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/OrRevFilter.java
@@ -57,9 +57,10 @@
  * Includes a commit if any subfilters include the same commit.
  * <p>
  * Classic shortcut behavior is used, so evaluation of the
- * {@link RevFilter#include(RevWalk, RevCommit)} method stops as soon as a true
- * result is obtained. Applications can improve filtering performance by placing
- * faster filters that are more likely to accept a result earlier in the list.
+ * {@link org.eclipse.jgit.revwalk.filter.RevFilter#include(RevWalk, RevCommit)}
+ * method stops as soon as a true result is obtained. Applications can improve
+ * filtering performance by placing faster filters that are more likely to
+ * accept a result earlier in the list.
  */
 public abstract class OrRevFilter extends RevFilter {
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/PatternMatchRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/PatternMatchRevFilter.java
index 1dd4555..edce224 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/PatternMatchRevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/PatternMatchRevFilter.java
@@ -54,9 +54,10 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.RawCharSequence;
 
-/** Abstract filter that searches text using extended regular expressions. */
+/**
+ * Abstract filter that searches text using extended regular expressions.
+ */
 public abstract class PatternMatchRevFilter extends RevFilter {
 	/**
 	 * Encode a string pattern for faster matching on byte arrays.
@@ -69,7 +70,7 @@
 	 *            original pattern string supplied by the user or the
 	 *            application.
 	 * @return same pattern, but re-encoded to match our funny raw UTF-8
-	 *         character sequence {@link RawCharSequence}.
+	 *         character sequence {@link org.eclipse.jgit.util.RawCharSequence}.
 	 */
 	protected static final String forceToRaw(final String patternText) {
 		final byte[] b = Constants.encode(patternText);
@@ -97,7 +98,8 @@
 	 *            should {@link #forceToRaw(String)} be applied to the pattern
 	 *            before compiling it?
 	 * @param flags
-	 *            flags from {@link Pattern} to control how matching performs.
+	 *            flags from {@link java.util.regex.Pattern} to control how
+	 *            matching performs.
 	 */
 	protected PatternMatchRevFilter(String pattern, final boolean innerString,
 			final boolean rawEncoding, final int flags) {
@@ -124,6 +126,7 @@
 		return patternText;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final RevWalk walker, final RevCommit cmit)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -131,6 +134,7 @@
 		return compiledPattern.reset(text(cmit)).matches();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return true;
@@ -145,6 +149,7 @@
 	 */
 	protected abstract CharSequence text(RevCommit cmit);
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
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 6b90d29..9068c57 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
@@ -61,7 +61,8 @@
  * <code>OrRevFilter</code> to create complex boolean expressions.
  * <p>
  * Applications should install the filter on a RevWalk by
- * {@link RevWalk#setRevFilter(RevFilter)} prior to starting traversal.
+ * {@link org.eclipse.jgit.revwalk.RevWalk#setRevFilter(RevFilter)} prior to
+ * starting traversal.
  * <p>
  * Unless specifically noted otherwise a RevFilter implementation is not thread
  * safe and may not be shared by different RevWalk instances at the same time.
@@ -73,9 +74,12 @@
  * <p>
  * <b>Message filters:</b>
  * <ul>
- * <li>Author name/email: {@link AuthorRevFilter}</li>
- * <li>Committer name/email: {@link CommitterRevFilter}</li>
- * <li>Message body: {@link MessageRevFilter}</li>
+ * <li>Author name/email:
+ * {@link org.eclipse.jgit.revwalk.filter.AuthorRevFilter}</li>
+ * <li>Committer name/email:
+ * {@link org.eclipse.jgit.revwalk.filter.CommitterRevFilter}</li>
+ * <li>Message body:
+ * {@link org.eclipse.jgit.revwalk.filter.MessageRevFilter}</li>
  * </ul>
  *
  * <p>
@@ -88,9 +92,9 @@
  * <p>
  * <b>Boolean modifiers:</b>
  * <ul>
- * <li>AND: {@link AndRevFilter}</li>
- * <li>OR: {@link OrRevFilter}</li>
- * <li>NOT: {@link NotRevFilter}</li>
+ * <li>AND: {@link org.eclipse.jgit.revwalk.filter.AndRevFilter}</li>
+ * <li>OR: {@link org.eclipse.jgit.revwalk.filter.OrRevFilter}</li>
+ * <li>NOT: {@link org.eclipse.jgit.revwalk.filter.NotRevFilter}</li>
  * </ul>
  */
 public abstract class RevFilter {
@@ -241,7 +245,11 @@
 		return NotRevFilter.create(this);
 	}
 
-	/** @return true if the filter needs the commit body to be parsed. */
+	/**
+	 * Whether the filter needs the commit body to be parsed.
+	 *
+	 * @return true if the filter needs the commit body to be parsed.
+	 */
 	public boolean requiresCommitBody() {
 		// Assume true to be backward compatible with prior behavior.
 		return true;
@@ -258,19 +266,19 @@
 	 *            returns true from {@link #requiresCommitBody()}.
 	 * @return true to include this commit in the results; false to have this
 	 *         commit be omitted entirely from the results.
-	 * @throws StopWalkException
+	 * @throws org.eclipse.jgit.errors.StopWalkException
 	 *             the filter knows for certain that no additional commits can
 	 *             ever match, and the current commit doesn't match either. The
 	 *             walk is halted and no more results are provided.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             an object the filter needs to consult to determine its answer
 	 *             does not exist in the Git repository the walker is operating
 	 *             on. Filtering this commit is impossible without the object.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object the filter needed to consult was not of the
 	 *             expected object type. This usually indicates a corrupt
 	 *             repository, as an object link is referencing the wrong type.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read to obtain data
 	 *             necessary for the filter to make its decision.
 	 */
@@ -279,16 +287,17 @@
 			IncorrectObjectTypeException, IOException;
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Clone this revision filter, including its parameters.
 	 * <p>
 	 * This is a deep clone. If this filter embeds objects or other filters it
 	 * must also clone those, to ensure the instances do not share mutable data.
-	 *
-	 * @return another copy of this filter, suitable for another thread.
 	 */
 	@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 1fbf746..8225e4d 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
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.revwalk.RevFlagSet;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-/** Matches only commits with some/all RevFlags already set. */
+/**
+ * Matches only commits with some/all RevFlags already set.
+ */
 public abstract class RevFlagFilter extends RevFilter {
 	/**
 	 * Create a new filter that tests for a single flag.
@@ -123,11 +125,13 @@
 		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 51dd2ed..79af5a3 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
@@ -78,6 +78,7 @@
 		this.skip = skip;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(RevWalk walker, RevCommit cmit)
 			throws StopWalkException, MissingObjectException,
@@ -87,6 +88,7 @@
 		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 ce3a022..3e6b148 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
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.util.RawCharSequence;
 import org.eclipse.jgit.util.RawSubStringPattern;
 
-/** Abstract filter that searches text using only substring search. */
+/**
+ * Abstract filter that searches text using only substring search.
+ */
 public abstract class SubStringRevFilter extends RevFilter {
 	/**
 	 * Can this string be safely handled by a substring filter?
@@ -60,7 +62,8 @@
 	 * @param pattern
 	 *            the pattern text proposed by the user.
 	 * @return true if a substring filter can perform this pattern match; false
-	 *         if {@link PatternMatchRevFilter} must be used instead.
+	 *         if {@link org.eclipse.jgit.revwalk.filter.PatternMatchRevFilter}
+	 *         must be used instead.
 	 */
 	public static boolean safe(final String pattern) {
 		for (int i = 0; i < pattern.length(); i++) {
@@ -97,6 +100,7 @@
 		pattern = new RawSubStringPattern(patternText);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final RevWalk walker, final RevCommit cmit)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -104,6 +108,7 @@
 		return pattern.match(text(cmit)) >= 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean requiresCommitBody() {
 		return true;
@@ -118,11 +123,13 @@
 	 */
 	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 b268979..3f064e3 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
@@ -55,6 +55,7 @@
 import java.io.IOException;
 import java.text.MessageFormat;
 
+import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.LockFailedException;
 import org.eclipse.jgit.internal.JGitText;
@@ -80,6 +81,8 @@
 
 	private final File configFile;
 
+	private final FS fs;
+
 	private boolean utf8Bom;
 
 	private volatile FileSnapshot snapshot;
@@ -113,31 +116,34 @@
 	public FileBasedConfig(Config base, File cfgLocation, FS fs) {
 		super(base);
 		configFile = cfgLocation;
+		this.fs = fs;
 		this.snapshot = FileSnapshot.DIRTY;
 		this.hash = ObjectId.zeroId();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected boolean notifyUponTransientChanges() {
 		// we will notify listeners upon save()
 		return false;
 	}
 
-	/** @return location of the configuration file on disk */
+	/**
+	 * Get location of the configuration file on disk
+	 *
+	 * @return location of the configuration file on disk
+	 */
 	public final File getFile() {
 		return configFile;
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Load the configuration as a Git text style configuration file.
 	 * <p>
 	 * If the file does not exist, this configuration is cleared, and thus
 	 * behaves the same as though the file exists, but is empty.
-	 *
-	 * @throws IOException
-	 *             the file could not be read (but does exist).
-	 * @throws ConfigInvalidException
-	 *             the file is not a properly formatted configuration file.
 	 */
 	@Override
 	public void load() throws IOException, ConfigInvalidException {
@@ -197,6 +203,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Save the configuration as a Git text style configuration file.
 	 * <p>
 	 * <b>Warning:</b> Although this method uses the traditional Git file
@@ -204,9 +212,6 @@
 	 * configuration file, it does not ensure that the file has not been
 	 * modified since the last read, which means updates performed by other
 	 * objects accessing the same backing file may be lost.
-	 *
-	 * @throws IOException
-	 *             the file could not be written.
 	 */
 	@Override
 	public void save() throws IOException {
@@ -240,6 +245,7 @@
 		fireConfigChangedEvent();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		hash = hash(new byte[0]);
@@ -250,6 +256,7 @@
 		return ObjectId.fromRaw(Constants.newMessageDigest().digest(rawText));
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -257,10 +264,40 @@
 	}
 
 	/**
+	 * Whether the currently loaded configuration file is outdated
+	 *
 	 * @return returns true if the currently loaded configuration file is older
-	 * than the file on disk
+	 *         than the file on disk
 	 */
 	public boolean isOutdated() {
 		return snapshot.isModified(getFile());
 	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @since 4.10
+	 */
+	@Override
+	@Nullable
+	protected byte[] readIncludedConfig(String relPath)
+			throws ConfigInvalidException {
+		final File file;
+		if (relPath.startsWith("~/")) { //$NON-NLS-1$
+			file = fs.resolve(fs.userHome(), relPath.substring(2));
+		} else {
+			file = fs.resolve(configFile.getParentFile(), relPath);
+		}
+
+		if (!file.exists()) {
+			return null;
+		}
+
+		try {
+			return IO.readFully(file);
+		} catch (IOException ioe) {
+			throw new ConfigInvalidException(MessageFormat
+					.format(JGitText.get().cannotReadFile, relPath), ioe);
+		}
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepositoryBuilder.java
index 944fb4f..3e45bd5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepositoryBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepositoryBuilder.java
@@ -52,7 +52,7 @@
 import org.eclipse.jgit.lib.Repository;
 
 /**
- * Constructs a {@link FileRepository}.
+ * Constructs a {@link org.eclipse.jgit.internal.storage.file.FileRepository}.
  * <p>
  * Applications must set one of {@link #setGitDir(File)} or
  * {@link #setWorkTree(File)}, or use {@link #readEnvironment()} or
@@ -73,18 +73,14 @@
 public class FileRepositoryBuilder extends
 		BaseRepositoryBuilder<FileRepositoryBuilder, Repository> {
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Create a repository matching the configuration in this builder.
 	 * <p>
 	 * If an option was not set, the build method will try to default the option
 	 * based on other options. If insufficient information is available, an
 	 * exception is thrown to the caller.
 	 *
-	 * @return a repository matching this configuration.
-	 * @throws IllegalArgumentException
-	 *             insufficient parameters were set.
-	 * @throws IOException
-	 *             the repository could not be accessed to configure the rest of
-	 *             the builder's parameters.
 	 * @since 3.0
 	 */
 	@Override
@@ -96,12 +92,13 @@
 	}
 
 	/**
-	 * Convenience factory method to construct a {@link FileRepository}.
+	 * Convenience factory method to construct a
+	 * {@link org.eclipse.jgit.internal.storage.file.FileRepository}.
 	 *
 	 * @param gitDir
 	 *            {@code GIT_DIR}, the repository meta directory.
 	 * @return a repository matching this configuration.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be accessed to configure the rest of
 	 *             the builder's parameters.
 	 * @since 3.0
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
index 4205fc4..19fc63e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
@@ -47,7 +47,9 @@
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.storage.pack.PackConfig;
 
-/** Configuration parameters for JVM-wide buffer cache used by JGit. */
+/**
+ * Configuration parameters for JVM-wide buffer cache used by JGit.
+ */
 public class WindowCacheConfig {
 	/** 1024 (number of bytes in one kibibyte/kilobyte) */
 	public static final int KB = 1024;
@@ -67,7 +69,9 @@
 
 	private int streamFileThreshold;
 
-	/** Create a default configuration. */
+	/**
+	 * Create a default configuration.
+	 */
 	public WindowCacheConfig() {
 		packedGitOpenFiles = 128;
 		packedGitLimit = 10 * MB;
@@ -78,6 +82,8 @@
 	}
 
 	/**
+	 * Get maximum number of streams to open at a time.
+	 *
 	 * @return maximum number of streams to open at a time. Open packs count
 	 *         against the process limits. <b>Default is 128.</b>
 	 */
@@ -86,6 +92,8 @@
 	}
 
 	/**
+	 * Set maximum number of streams to open at a time.
+	 *
 	 * @param fdLimit
 	 *            maximum number of streams to open at a time. Open packs count
 	 *            against the process limits
@@ -95,6 +103,9 @@
 	}
 
 	/**
+	 * Get maximum number bytes of heap memory to dedicate to caching pack file
+	 * data.
+	 *
 	 * @return maximum number bytes of heap memory to dedicate to caching pack
 	 *         file data. <b>Default is 10 MB.</b>
 	 */
@@ -103,6 +114,9 @@
 	}
 
 	/**
+	 * Set maximum number bytes of heap memory to dedicate to caching pack file
+	 * data.
+	 *
 	 * @param newLimit
 	 *            maximum number bytes of heap memory to dedicate to caching
 	 *            pack file data.
@@ -112,6 +126,9 @@
 	}
 
 	/**
+	 * Get size in bytes of a single window mapped or read in from the pack
+	 * file.
+	 *
 	 * @return size in bytes of a single window mapped or read in from the pack
 	 *         file. <b>Default is 8 KB.</b>
 	 */
@@ -120,6 +137,8 @@
 	}
 
 	/**
+	 * Set size in bytes of a single window read in from the pack file.
+	 *
 	 * @param newSize
 	 *            size in bytes of a single window read in from the pack file.
 	 */
@@ -128,25 +147,32 @@
 	}
 
 	/**
-	 * @return true enables use of Java NIO virtual memory mapping for windows;
-	 *         false reads entire window into a byte[] with standard read calls.
-	 *         <b>Default false.</b>
+	 * Whether to use Java NIO virtual memory mapping for windows
+	 *
+	 * @return {@code true} enables use of Java NIO virtual memory mapping for
+	 *         windows; false reads entire window into a byte[] with standard
+	 *         read calls. <b>Default false.</b>
 	 */
 	public boolean isPackedGitMMAP() {
 		return packedGitMMAP;
 	}
 
 	/**
+	 * Set whether to enable use of Java NIO virtual memory mapping for windows
+	 *
 	 * @param usemmap
-	 *            true enables use of Java NIO virtual memory mapping for
-	 *            windows; false reads entire window into a byte[] with standard
-	 *            read calls.
+	 *            {@code true} enables use of Java NIO virtual memory mapping
+	 *            for windows; false reads entire window into a byte[] with
+	 *            standard read calls.
 	 */
 	public void setPackedGitMMAP(final boolean usemmap) {
 		packedGitMMAP = usemmap;
 	}
 
 	/**
+	 * Get maximum number of bytes to cache in delta base cache for inflated,
+	 * recently accessed objects, without delta chains.
+	 *
 	 * @return maximum number of bytes to cache in delta base cache for
 	 *         inflated, recently accessed objects, without delta chains.
 	 *         <b>Default 10 MB.</b>
@@ -156,6 +182,9 @@
 	}
 
 	/**
+	 * Set maximum number of bytes to cache in delta base cache for inflated,
+	 * recently accessed objects, without delta chains.
+	 *
 	 * @param newLimit
 	 *            maximum number of bytes to cache in delta base cache for
 	 *            inflated, recently accessed objects, without delta chains.
@@ -164,12 +193,18 @@
 		deltaBaseCacheLimit = newLimit;
 	}
 
-	/** @return the size threshold beyond which objects must be streamed. */
+	/**
+	 * Get the size threshold beyond which objects must be streamed.
+	 *
+	 * @return the size threshold beyond which objects must be streamed.
+	 */
 	public int getStreamFileThreshold() {
 		return streamFileThreshold;
 	}
 
 	/**
+	 * Set new byte limit for objects that must be streamed.
+	 *
 	 * @param newLimit
 	 *            new byte limit for objects that must be streamed. Objects
 	 *            smaller than this size can be obtained as a contiguous byte
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 4f2374f..484cde2 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
@@ -262,7 +262,9 @@
 
 	private boolean singlePack;
 
-	/** Create a default configuration. */
+	/**
+	 * Create a default configuration.
+	 */
 	public PackConfig() {
 		// Fields are initialized to defaults.
 	}
@@ -280,7 +282,8 @@
 	}
 
 	/**
-	 * Create a configuration honoring settings in a {@link Config}.
+	 * Create a configuration honoring settings in a
+	 * {@link org.eclipse.jgit.lib.Config}.
 	 *
 	 * @param cfg
 	 *            the source to read settings from. The source is not retained
@@ -531,6 +534,9 @@
 	}
 
 	/**
+	 * Whether existing delta chains should be cut at
+	 * {@link #getMaxDeltaDepth()}.
+	 *
 	 * @return true if existing delta chains should be cut at
 	 *         {@link #getMaxDeltaDepth()}. Default is false, allowing existing
 	 *         chains to be of any length.
@@ -558,9 +564,11 @@
 	}
 
 	/**
+	 * Whether all of refs/* should be packed in a single pack.
+	 *
 	 * @return true if all of refs/* should be packed in a single pack. Default
-	 *        is false, packing a separate GC_REST pack for references outside
-	 *        of refs/heads/* and refs/tags/*.
+	 *         is false, packing a separate GC_REST pack for references outside
+	 *         of refs/heads/* and refs/tags/*.
 	 * @since 4.9
 	 */
 	public boolean getSinglePack() {
@@ -785,7 +793,11 @@
 		this.threads = threads;
 	}
 
-	/** @return the preferred thread pool to execute delta search on. */
+	/**
+	 * Get the preferred thread pool to execute delta search on.
+	 *
+	 * @return the preferred thread pool to execute delta search on.
+	 */
 	public Executor getExecutor() {
 		return executor;
 	}
@@ -1073,6 +1085,7 @@
 						getBitmapInactiveBranchAgeInDays()));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder b = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java
index a811fe3..68cffd5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java
@@ -254,7 +254,8 @@
 	private Accumulator statistics;
 
 	/**
-	 * Creates a new {@link PackStatistics} object from the accumulator.
+	 * Creates a new {@link org.eclipse.jgit.storage.pack.PackStatistics} object
+	 * from the accumulator.
 	 *
 	 * @param accumulator
 	 *            the accumulator of the statistics
@@ -270,6 +271,8 @@
 	}
 
 	/**
+	 * Get unmodifiable collection of objects to be included in the pack.
+	 *
 	 * @return unmodifiable collection of objects to be included in the pack.
 	 *         May be {@code null} if the pack was hand-crafted in a unit test.
 	 */
@@ -278,6 +281,9 @@
 	}
 
 	/**
+	 * Get unmodifiable collection of objects that should be excluded from the
+	 * pack
+	 *
 	 * @return unmodifiable collection of objects that should be excluded from
 	 *         the pack, as the peer that will receive the pack already has
 	 *         these objects.
@@ -287,6 +293,9 @@
 	}
 
 	/**
+	 * Get unmodifiable collection of objects that were shallow commits on the
+	 * client.
+	 *
 	 * @return unmodifiable collection of objects that were shallow commits on
 	 *         the client.
 	 */
@@ -295,6 +304,8 @@
 	}
 
 	/**
+	 * Get unmodifiable list of the cached packs that were reused in the output
+	 *
 	 * @return unmodifiable list of the cached packs that were reused in the
 	 *         output, if any were selected for reuse.
 	 */
@@ -302,12 +313,19 @@
 		return statistics.reusedPacks;
 	}
 
-	/** @return unmodifiable collection of the root commits of the history. */
+	/**
+	 * Get unmodifiable collection of the root commits of the history.
+	 *
+	 * @return unmodifiable collection of the root commits of the history.
+	 */
 	public Set<ObjectId> getRootCommits() {
 		return statistics.rootCommits;
 	}
 
 	/**
+	 * Get number of objects in the output pack that went through the delta
+	 * search process in order to find a potential delta base.
+	 *
 	 * @return number of objects in the output pack that went through the delta
 	 *         search process in order to find a potential delta base.
 	 */
@@ -316,6 +334,9 @@
 	}
 
 	/**
+	 * Get number of objects in the output pack that went through delta base
+	 * search and found a suitable base.
+	 *
 	 * @return number of objects in the output pack that went through delta base
 	 *         search and found a suitable base. This is a subset of
 	 *         {@link #getDeltaSearchNonEdgeObjects()}.
@@ -325,6 +346,8 @@
 	}
 
 	/**
+	 * Get total number of objects output.
+	 *
 	 * @return total number of objects output. This total includes the value of
 	 *         {@link #getTotalDeltas()}.
 	 */
@@ -333,6 +356,9 @@
 	}
 
 	/**
+	 * Get the count of objects that needed to be discovered through an object
+	 * walk because they were not found in bitmap indices.
+	 *
 	 * @return the count of objects that needed to be discovered through an
 	 *         object walk because they were not found in bitmap indices.
 	 *         Returns -1 if no bitmap indices were found.
@@ -342,6 +368,8 @@
 	}
 
 	/**
+	 * Get total number of deltas output.
+	 *
 	 * @return total number of deltas output. This may be lower than the actual
 	 *         number of deltas if a cached pack was reused.
 	 */
@@ -350,6 +378,9 @@
 	}
 
 	/**
+	 * Get number of objects whose existing representation was reused in the
+	 * output.
+	 *
 	 * @return number of objects whose existing representation was reused in the
 	 *         output. This count includes {@link #getReusedDeltas()}.
 	 */
@@ -358,6 +389,9 @@
 	}
 
 	/**
+	 * Get number of deltas whose existing representation was reused in the
+	 * output.
+	 *
 	 * @return number of deltas whose existing representation was reused in the
 	 *         output, as their base object was also output or was assumed
 	 *         present for a thin pack. This may be lower than the actual number
@@ -368,6 +402,8 @@
 	}
 
 	/**
+	 * Get total number of bytes written.
+	 *
 	 * @return total number of bytes written. This size includes the pack
 	 *         header, trailer, thin pack, and reused cached pack(s).
 	 */
@@ -376,6 +412,8 @@
 	}
 
 	/**
+	 * Get size of the thin pack in bytes.
+	 *
 	 * @return size of the thin pack in bytes, if a thin pack was generated. A
 	 *         thin pack is created when the client already has objects and some
 	 *         deltas are created against those objects, or if a cached pack is
@@ -387,6 +425,8 @@
 	}
 
 	/**
+	 * Get information about this type of object in the pack.
+	 *
 	 * @param typeCode
 	 *            object type code, e.g. OBJ_COMMIT or OBJ_TREE.
 	 * @return information about this type of object in the pack.
@@ -395,17 +435,28 @@
 		return new ObjectType(statistics.objectTypes[typeCode]);
 	}
 
-	/** @return true if the resulting pack file was a shallow pack. */
+	/**
+	 * Whether the resulting pack file was a shallow pack.
+	 *
+	 * @return {@code true} if the resulting pack file was a shallow pack.
+	 */
 	public boolean isShallow() {
 		return statistics.depth > 0;
 	}
 
-	/** @return depth (in commits) the pack includes if shallow. */
+	/**
+	 * Get depth (in commits) the pack includes if shallow.
+	 *
+	 * @return depth (in commits) the pack includes if shallow.
+	 */
 	public int getDepth() {
 		return statistics.depth;
 	}
 
 	/**
+	 * Get time in milliseconds spent enumerating the objects that need to be
+	 * included in the output.
+	 *
 	 * @return time in milliseconds spent enumerating the objects that need to
 	 *         be included in the output. This time includes any restarts that
 	 *         occur when a cached pack is selected for reuse.
@@ -415,6 +466,9 @@
 	}
 
 	/**
+	 * Get time in milliseconds spent matching existing representations against
+	 * objects that will be transmitted.
+	 *
 	 * @return time in milliseconds spent matching existing representations
 	 *         against objects that will be transmitted, or that the client can
 	 *         be assumed to already have.
@@ -424,6 +478,9 @@
 	}
 
 	/**
+	 * Get time in milliseconds spent finding the sizes of all objects that will
+	 * enter the delta compression search window.
+	 *
 	 * @return time in milliseconds spent finding the sizes of all objects that
 	 *         will enter the delta compression search window. The sizes need to
 	 *         be known to better match similar objects together and improve
@@ -434,6 +491,8 @@
 	}
 
 	/**
+	 * Get time in milliseconds spent on delta compression.
+	 *
 	 * @return time in milliseconds spent on delta compression. This is observed
 	 *         wall-clock time and does not accurately track CPU time used when
 	 *         multiple threads were used to perform the delta compression.
@@ -443,6 +502,9 @@
 	}
 
 	/**
+	 * Get time in milliseconds spent writing the pack output, from start of
+	 * header until end of trailer.
+	 *
 	 * @return time in milliseconds spent writing the pack output, from start of
 	 *         header until end of trailer. The transfer speed can be
 	 *         approximated by dividing {@link #getTotalBytes()} by this value.
@@ -451,7 +513,11 @@
 		return statistics.timeWriting;
 	}
 
-	/** @return total time spent processing this pack. */
+	/**
+	 * Get total time spent processing this pack.
+	 *
+	 * @return total time spent processing this pack.
+	 */
 	public long getTimeTotal() {
 		return statistics.timeCounting + statistics.timeSearchingForReuse
 				+ statistics.timeSearchingForSizes + statistics.timeCompressing
@@ -459,14 +525,20 @@
 	}
 
 	/**
-	 * @return get the average output speed in terms of bytes-per-second.
+	 * Get the average output speed in terms of bytes-per-second.
+	 *
+	 * @return the average output speed in terms of bytes-per-second.
 	 *         {@code getTotalBytes() / (getTimeWriting() / 1000.0)}.
 	 */
 	public double getTransferRate() {
 		return getTotalBytes() / (getTimeWriting() / 1000.0);
 	}
 
-	/** @return formatted message string for display to clients. */
+	/**
+	 * Get formatted message string for display to clients.
+	 *
+	 * @return formatted message string for display to clients.
+	 */
 	public String getMessage() {
 		return MessageFormat.format(JGitText.get().packWriterStatistics,
 				Long.valueOf(statistics.totalObjects),
@@ -475,7 +547,11 @@
 				Long.valueOf(statistics.reusedDeltas));
 	}
 
-	/** @return a map containing ObjectType statistics. */
+	/**
+	 * Get a map containing ObjectType statistics.
+	 *
+	 * @return a map containing ObjectType statistics.
+	 */
 	public Map<Integer, ObjectType> getObjectTypes() {
 		HashMap<Integer, ObjectType> map = new HashMap<>();
 		map.put(Integer.valueOf(OBJ_BLOB), new ObjectType(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleStatus.java b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleStatus.java
index 2298f4b..884f2ac 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleStatus.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleStatus.java
@@ -61,8 +61,12 @@
 	 * Create submodule status
 	 *
 	 * @param type
+	 *            a {@link org.eclipse.jgit.submodule.SubmoduleStatusType}
+	 *            object.
 	 * @param path
+	 *            submodule path
 	 * @param indexId
+	 *            an {@link org.eclipse.jgit.lib.ObjectId} object.
 	 */
 	public SubmoduleStatus(final SubmoduleStatusType type, final String path,
 			final ObjectId indexId) {
@@ -73,9 +77,14 @@
 	 * Create submodule status
 	 *
 	 * @param type
+	 *            a {@link org.eclipse.jgit.submodule.SubmoduleStatusType}
+	 *            object.
 	 * @param path
+	 *            submodule path
 	 * @param indexId
+	 *            index id
 	 * @param headId
+	 *            head id
 	 */
 	public SubmoduleStatus(final SubmoduleStatusType type, final String path,
 			final ObjectId indexId, final ObjectId headId) {
@@ -86,6 +95,8 @@
 	}
 
 	/**
+	 * Get type
+	 *
 	 * @return type
 	 */
 	public SubmoduleStatusType getType() {
@@ -93,13 +104,17 @@
 	}
 
 	/**
-	 * @return path
+	 * Get submodule path
+	 *
+	 * @return path submodule path
 	 */
 	public String getPath() {
 		return path;
 	}
 
 	/**
+	 * Get index object id
+	 *
 	 * @return index object id
 	 */
 	public ObjectId getIndexId() {
@@ -107,6 +122,8 @@
 	}
 
 	/**
+	 * Get HEAD object id
+	 *
 	 * @return HEAD object id
 	 */
 	public ObjectId getHeadId() {
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 56784f7..2314cf1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
@@ -81,7 +81,7 @@
 public class SubmoduleWalk implements AutoCloseable {
 
 	/**
-	 * The values for the config param submodule.<name>.ignore
+	 * The values for the config parameter submodule.&lt;name&gt;.ignore
 	 *
 	 * @since 3.6
 	 */
@@ -114,8 +114,9 @@
 	 * The {@code .gitmodules} file is read from the index.
 	 *
 	 * @param repository
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @return generator over submodule index entries
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static SubmoduleWalk forIndex(Repository repository)
 			throws IOException {
@@ -135,12 +136,14 @@
 	 * path
 	 *
 	 * @param repository
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param treeId
-	 *            the root of a tree containing both a submodule at the given path
-	 *            and .gitmodules at the root.
+	 *            the root of a tree containing both a submodule at the given
+	 *            path and .gitmodules at the root.
 	 * @param path
+	 *            a {@link java.lang.String} object.
 	 * @return generator at given path, null if no submodule at given path
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static SubmoduleWalk forPath(Repository repository,
 			AnyObjectId treeId, String path) throws IOException {
@@ -166,12 +169,14 @@
 	 * path
 	 *
 	 * @param repository
+	 *            a {@link org.eclipse.jgit.lib.Repository} object.
 	 * @param iterator
-	 *            the root of a tree containing both a submodule at the given path
-	 *            and .gitmodules at the root.
+	 *            the root of a tree containing both a submodule at the given
+	 *            path and .gitmodules at the root.
 	 * @param path
+	 *            a {@link java.lang.String} object.
 	 * @return generator at given path, null if no submodule at given path
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static SubmoduleWalk forPath(Repository repository,
 			AbstractTreeIterator iterator, String path) throws IOException {
@@ -196,7 +201,9 @@
 	 * Get submodule directory
 	 *
 	 * @param parent
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 * @param path
+	 *            submodule path
 	 * @return directory
 	 */
 	public static File getSubmoduleDirectory(final Repository parent,
@@ -208,25 +215,47 @@
 	 * Get submodule repository
 	 *
 	 * @param parent
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
 	 * @param path
+	 *            submodule path
 	 * @return repository or null if repository doesn't exist
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static Repository getSubmoduleRepository(final Repository parent,
 			final String path) throws IOException {
-		return getSubmoduleRepository(parent.getWorkTree(), path);
+		return getSubmoduleRepository(parent.getWorkTree(), path,
+				parent.getFS());
 	}
 
 	/**
 	 * Get submodule repository at path
 	 *
 	 * @param parent
+	 *            the parent
 	 * @param path
+	 *            submodule path
 	 * @return repository or null if repository doesn't exist
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static Repository getSubmoduleRepository(final File parent,
 			final String path) throws IOException {
+		return getSubmoduleRepository(parent, path, FS.DETECTED);
+	}
+
+	/**
+	 * Get submodule repository at path, using the specified file system
+	 * abstraction
+	 *
+	 * @param parent
+	 * @param path
+	 * @param fs
+	 *            the file system abstraction to be used
+	 * @return repository or null if repository doesn't exist
+	 * @throws IOException
+	 * @since 4.10
+	 */
+	public static Repository getSubmoduleRepository(final File parent,
+			final String path, FS fs) throws IOException {
 		File subWorkTree = new File(parent, path);
 		if (!subWorkTree.isDirectory())
 			return null;
@@ -234,7 +263,7 @@
 		try {
 			return new RepositoryBuilder() //
 					.setMustExist(true) //
-					.setFS(FS.DETECTED) //
+					.setFS(fs) //
 					.setWorkTree(workTree) //
 					.build();
 		} catch (RepositoryNotFoundException e) {
@@ -257,7 +286,7 @@
 	 * @param url
 	 *            absolute or relative URL of the submodule repository
 	 * @return resolved URL
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public static String getSubmoduleRemoteUrl(final Repository parent,
 			final String url) throws IOException {
@@ -337,7 +366,8 @@
 	 * Create submodule generator
 	 *
 	 * @param repository
-	 * @throws IOException
+	 *            the {@link org.eclipse.jgit.lib.Repository}.
+	 * @throws java.io.IOException
 	 */
 	public SubmoduleWalk(final Repository repository) throws IOException {
 		this.repository = repository;
@@ -394,7 +424,7 @@
 	 * @param id
 	 *            ID of a tree containing .gitmodules
 	 * @return this generator
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public SubmoduleWalk setRootTree(final AnyObjectId id) throws IOException {
 		final CanonicalTreeParser p = new CanonicalTreeParser();
@@ -414,8 +444,9 @@
 	 * If no submodule config is found, loads an empty config.
 	 *
 	 * @return this generator
-	 * @throws IOException if an error occurred, or if the repository is bare
-	 * @throws ConfigInvalidException
+	 * @throws java.io.IOException
+	 *             if an error occurred, or if the repository is bare
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 */
 	public SubmoduleWalk loadModulesConfig() throws IOException, ConfigInvalidException {
 		if (rootTree == null) {
@@ -483,8 +514,8 @@
 	 * @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 IOException
-	 * @throws CorruptObjectException
+	 * @throws java.io.IOException
+	 * @throws CorruptObjectException if any.
 	 * @since 3.6
 	 */
 	public static boolean containsGitModulesFile(Repository repository)
@@ -512,6 +543,7 @@
 	 * Set tree filter
 	 *
 	 * @param filter
+	 *            a {@link org.eclipse.jgit.treewalk.filter.TreeFilter} object.
 	 * @return this generator
 	 */
 	public SubmoduleWalk setFilter(TreeFilter filter) {
@@ -523,8 +555,10 @@
 	 * Set the tree iterator used for finding submodule entries
 	 *
 	 * @param iterator
+	 *            an {@link org.eclipse.jgit.treewalk.AbstractTreeIterator}
+	 *            object.
 	 * @return this generator
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 */
 	public SubmoduleWalk setTree(final AbstractTreeIterator iterator)
 			throws CorruptObjectException {
@@ -536,10 +570,13 @@
 	 * Set the tree used for finding submodule entries
 	 *
 	 * @param treeId
+	 *            an {@link org.eclipse.jgit.lib.AnyObjectId} object.
 	 * @return this generator
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @throws IncorrectObjectTypeException
+	 *             if any.
 	 * @throws MissingObjectException
+	 *             if any.
 	 */
 	public SubmoduleWalk setTree(final AnyObjectId treeId) throws IOException {
 		walk.addTree(treeId);
@@ -575,7 +612,7 @@
 	 * {@link #getObjectId()} and {@link #getPath()}.
 	 *
 	 * @return true if entry found, false otherwise
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public boolean next() throws IOException {
 		while (walk.next()) {
@@ -598,6 +635,15 @@
 	}
 
 	/**
+	 * The module name for the current submodule entry (used for the section name of .git/config)
+	 * @since 4.10
+	 * @return name
+	 */
+	public String getModuleName() {
+		return getModuleName(path);
+	}
+
+	/**
 	 * Get object id of current submodule entry
 	 *
 	 * @return object id
@@ -611,13 +657,13 @@
 	 * the .gitmodules file in the current repository's working tree.
 	 *
 	 * @return configured path
-	 * @throws ConfigInvalidException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 * @throws java.io.IOException
 	 */
 	public String getModulesPath() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
 		return modulesConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-				getModuleName(path), ConfigConstants.CONFIG_KEY_PATH);
+				getModuleName(), ConfigConstants.CONFIG_KEY_PATH);
 	}
 
 	/**
@@ -625,16 +671,12 @@
 	 * from the repository's config.
 	 *
 	 * @return configured URL
-	 * @throws ConfigInvalidException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 * @throws java.io.IOException
 	 */
 	public String getConfigUrl() throws IOException, ConfigInvalidException {
-		// SubmoduleInitCommand copies the submodules.*.url and
-		// submodules.*.update values from .gitmodules to the config, and
-		// does so using the path defined in .gitmodules as the subsection
-		// name. So no path-to-name translation is necessary here.
 		return repoConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-				path, ConfigConstants.CONFIG_KEY_URL);
+				getModuleName(), ConfigConstants.CONFIG_KEY_URL);
 	}
 
 	/**
@@ -642,13 +684,13 @@
 	 * from the .gitmodules file in the current repository's working tree.
 	 *
 	 * @return configured URL
-	 * @throws ConfigInvalidException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 * @throws java.io.IOException
 	 */
 	public String getModulesUrl() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
 		return modulesConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-				getModuleName(path), ConfigConstants.CONFIG_KEY_URL);
+				getModuleName(), ConfigConstants.CONFIG_KEY_URL);
 	}
 
 	/**
@@ -656,12 +698,12 @@
 	 * from the repository's config.
 	 *
 	 * @return update value
-	 * @throws ConfigInvalidException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 * @throws java.io.IOException
 	 */
 	public String getConfigUpdate() throws IOException, ConfigInvalidException {
 		return repoConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-				path, ConfigConstants.CONFIG_KEY_UPDATE);
+				getModuleName(), ConfigConstants.CONFIG_KEY_UPDATE);
 	}
 
 	/**
@@ -669,13 +711,13 @@
 	 * from the .gitmodules file in the current repository's working tree.
 	 *
 	 * @return update value
-	 * @throws ConfigInvalidException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 * @throws java.io.IOException
 	 */
 	public String getModulesUpdate() throws IOException, ConfigInvalidException {
 		lazyLoadModulesConfig();
 		return modulesConfig.getString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
-				getModuleName(path), ConfigConstants.CONFIG_KEY_UPDATE);
+				getModuleName(), ConfigConstants.CONFIG_KEY_UPDATE);
 	}
 
 	/**
@@ -683,15 +725,15 @@
 	 * value from the .gitmodules file in the current repository's working tree.
 	 *
 	 * @return ignore value
-	 * @throws ConfigInvalidException
-	 * @throws IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
+	 * @throws java.io.IOException
 	 * @since 3.6
 	 */
 	public IgnoreSubmoduleMode getModulesIgnore() throws IOException,
 			ConfigInvalidException {
 		lazyLoadModulesConfig();
 		return modulesConfig.getEnum(IgnoreSubmoduleMode.values(),
-				ConfigConstants.CONFIG_SUBMODULE_SECTION, getModuleName(path),
+				ConfigConstants.CONFIG_SUBMODULE_SECTION, getModuleName(),
 				ConfigConstants.CONFIG_KEY_IGNORE, IgnoreSubmoduleMode.NONE);
 	}
 
@@ -699,7 +741,7 @@
 	 * Get repository for current submodule entry
 	 *
 	 * @return repository or null if non-existent
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public Repository getRepository() throws IOException {
 		return getSubmoduleRepository(repository, path);
@@ -709,7 +751,7 @@
 	 * Get commit id that HEAD points to in the current submodule's repository
 	 *
 	 * @return object id of HEAD reference
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public ObjectId getHead() throws IOException {
 		Repository subRepo = getRepository();
@@ -726,7 +768,7 @@
 	 * Get ref that HEAD points to in the current submodule's repository
 	 *
 	 * @return ref name, null on failures
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public String getHeadRef() throws IOException {
 		Repository subRepo = getRepository();
@@ -747,8 +789,8 @@
 	 * URL
 	 *
 	 * @return resolved remote URL
-	 * @throws IOException
-	 * @throws ConfigInvalidException
+	 * @throws java.io.IOException
+	 * @throws org.eclipse.jgit.errors.ConfigInvalidException
 	 */
 	public String getRemoteUrl() throws IOException, ConfigInvalidException {
 		String url = getModulesUrl();
@@ -756,6 +798,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release any resources used by this walker's reader.
 	 *
 	 * @since 4.0
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 6f13694..4bf0d26 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AbstractAdvertiseRefsHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AbstractAdvertiseRefsHook.java
@@ -51,12 +51,13 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 
 /**
- * Implementation of {@link AdvertiseRefsHook} that advertises the same refs for
+ * Implementation of {@link org.eclipse.jgit.transport.AdvertiseRefsHook} that advertises the same refs for
  * upload-pack and receive-pack.
  *
  * @since 2.0
  */
 public abstract class AbstractAdvertiseRefsHook implements AdvertiseRefsHook {
+	/** {@inheritDoc} */
 	@Override
 	public void advertiseRefs(UploadPack uploadPack)
 			throws ServiceMayNotContinueException {
@@ -64,6 +65,7 @@
 				uploadPack.getRepository(), uploadPack.getRevWalk()));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void advertiseRefs(BaseReceivePack receivePack)
 			throws ServiceMayNotContinueException {
@@ -82,7 +84,7 @@
 	 * @param revWalk
 	 *            open rev walk on the repository.
 	 * @return set of refs to advertise.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	protected abstract Map<String, Ref> getAdvertisedRefs(
@@ -97,8 +99,8 @@
 	 * @param revWalk
 	 *            open rev walk on the repository.
 	 * @return set of additional haves; see
-	 *         {@link ReceivePack#getAdvertisedObjects()}.
-	 * @throws ServiceMayNotContinueException
+	 *         {@link org.eclipse.jgit.transport.ReceivePack#getAdvertisedObjects()}.
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	protected Set<ObjectId> getAdvertisedHaves(
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 96d7c24..ed05c73 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHook.java
@@ -70,10 +70,11 @@
 	/**
 	 * Advertise refs for upload-pack.
 	 *
-	 * @param uploadPack instance on which to call
-	 *            {@link UploadPack#setAdvertisedRefs(java.util.Map)}
+	 * @param uploadPack
+	 *            instance on which to call
+	 *            {@link org.eclipse.jgit.transport.UploadPack#setAdvertisedRefs(java.util.Map)}
 	 *            if necessary.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	public void advertiseRefs(UploadPack uploadPack)
@@ -82,10 +83,11 @@
 	/**
 	 * Advertise refs for receive-pack.
 	 *
-	 * @param receivePack instance on which to call
-	 *            {@link BaseReceivePack#setAdvertisedRefs(java.util.Map,java.util.Set)}
+	 * @param receivePack
+	 *            instance on which to call
+	 *            {@link org.eclipse.jgit.transport.BaseReceivePack#setAdvertisedRefs(java.util.Map,java.util.Set)}
 	 *            if necessary.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	public void advertiseRefs(BaseReceivePack 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 22ea5cb..4ef3e1a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AdvertiseRefsHookChain.java
@@ -46,13 +46,14 @@
 import java.util.List;
 
 /**
- * {@link AdvertiseRefsHook} that delegates to a list of other hooks.
+ * {@link org.eclipse.jgit.transport.AdvertiseRefsHook} that delegates to a list
+ * of other hooks.
  * <p>
  * Hooks are run in the order passed to the constructor. A hook may inspect or
  * modify the results of the previous hooks in the chain by calling
- * {@link UploadPack#getAdvertisedRefs()}, or
- * {@link BaseReceivePack#getAdvertisedRefs()} or
- * {@link BaseReceivePack#getAdvertisedObjects()}.
+ * {@link org.eclipse.jgit.transport.UploadPack#getAdvertisedRefs()}, or
+ * {@link org.eclipse.jgit.transport.BaseReceivePack#getAdvertisedRefs()} or
+ * {@link org.eclipse.jgit.transport.BaseReceivePack#getAdvertisedObjects()}.
  */
 public class AdvertiseRefsHookChain implements AdvertiseRefsHook {
 	private final AdvertiseRefsHook[] hooks;
@@ -79,6 +80,7 @@
 			return new AdvertiseRefsHookChain(newHooks, i);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void advertiseRefs(BaseReceivePack rp)
 			throws ServiceMayNotContinueException {
@@ -86,6 +88,7 @@
 			hooks[i].advertiseRefs(rp);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void advertiseRefs(UploadPack rp)
 			throws ServiceMayNotContinueException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java
index 64cb4dd..fee71eb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/AmazonS3.java
@@ -43,6 +43,8 @@
 
 package org.eclipse.jgit.transport;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -229,7 +231,6 @@
 	 *
 	 * @param props
 	 *            connection properties.
-	 *
 	 */
 	public AmazonS3(final Properties props) {
 		domain = props.getProperty(Keys.DOMAIN, "s3.amazonaws.com"); //$NON-NLS-1$
@@ -279,7 +280,7 @@
 	 * @return connection to stream the content of the object. The request
 	 *         properties of the connection may not be modified by the caller as
 	 *         the request parameters have already been signed.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             sending the request was not possible.
 	 */
 	public URLConnection get(final String bucket, final String key)
@@ -308,7 +309,7 @@
 	 * @param u
 	 *            connection previously created by {@link #get(String, String)}}.
 	 * @return stream to read plain text from.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             decryption could not be configured.
 	 */
 	public InputStream decrypt(final URLConnection u) throws IOException {
@@ -331,7 +332,7 @@
 	 * @return list of keys starting with <code>prefix</code>, after removing
 	 *         <code>prefix</code> (or <code>prefix + "/"</code>)from all
 	 *         of them.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             sending the request was not possible, or the response XML
 	 *             document could not be parsed properly.
 	 */
@@ -355,7 +356,7 @@
 	 *            name of the bucket storing the object.
 	 * @param key
 	 *            key of the object within its bucket.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             deletion failed due to communications error.
 	 */
 	public void delete(final String bucket, final String key)
@@ -392,7 +393,7 @@
 	 * @param data
 	 *            new data content for the object. Must not be null. Zero length
 	 *            array will create a zero length object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             creation/updating failed due to communications error.
 	 */
 	public void put(final String bucket, final String key, final byte[] data)
@@ -461,7 +462,7 @@
 	 * @param monitorTask
 	 *            (optional) task name to display during the close method.
 	 * @return a stream which accepts the new data, and transmits once closed.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if encryption was enabled it could not be configured.
 	 */
 	public OutputStream beginPut(final String bucket, final String key,
@@ -642,7 +643,7 @@
 		try {
 			final Mac m = Mac.getInstance(HMAC);
 			m.init(privateKey);
-			sec = Base64.encodeBytes(m.doFinal(s.toString().getBytes("UTF-8"))); //$NON-NLS-1$
+			sec = Base64.encodeBytes(m.doFinal(s.toString().getBytes(UTF_8)));
 		} catch (NoSuchAlgorithmException e) {
 			throw new IOException(MessageFormat.format(JGitText.get().noHMACsupport, HMAC, e.getMessage()));
 		} catch (InvalidKeyException e) {
@@ -705,10 +706,10 @@
 					try {
 						xr.parse(new InputSource(in));
 					} catch (SAXException parsingError) {
-						final IOException p;
-						p = new IOException(MessageFormat.format(JGitText.get().errorListing, prefix));
-						p.initCause(parsingError);
-						throw p;
+						throw new IOException(
+								MessageFormat.format(
+										JGitText.get().errorListing, prefix),
+								parsingError);
 					} finally {
 						in.close();
 					}
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 69028fa..c8d1d22 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java
@@ -71,31 +71,34 @@
 
 	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(final String name) {
 		return advertisedRefs.get(name);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getMessages() {
 		return messageWriter != null ? messageWriter.toString() : ""; //$NON-NLS-1$
 	}
 
 	/**
-	 * User agent advertised by the remote server.
+	 * {@inheritDoc}
 	 *
-	 * @return agent (version of Git) running on the remote server. Null if the
-	 *         server does not advertise this version.
+	 * User agent advertised by the remote server.
 	 * @since 4.0
 	 */
 	@Override
@@ -114,6 +117,7 @@
 		peerUserAgent = agent;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public abstract void close();
 
@@ -136,7 +140,7 @@
 	 * Helper method for ensuring one-operation per connection. Check whether
 	 * operation was already marked as started, and mark it as started.
 	 *
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             if operation was already marked as started.
 	 */
 	protected void markStartedOperation() throws TransportException {
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 41b8c2d..6f46025 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseFetchConnection.java
@@ -64,6 +64,7 @@
  */
 abstract class BaseFetchConnection extends BaseConnection implements
 		FetchConnection {
+	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have)
@@ -71,6 +72,7 @@
 		fetch(monitor, want, have, null);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have,
@@ -80,6 +82,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 *
 	 * Default implementation of {@link FetchConnection#didFetchIncludeTags()} -
 	 * returning false.
 	 */
@@ -98,7 +102,7 @@
 	 *            as in {@link #fetch(ProgressMonitor, Collection, Set)}
 	 * @param have
 	 *            as in {@link #fetch(ProgressMonitor, Collection, Set)}
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             as in {@link #fetch(ProgressMonitor, Collection, Set)}, but
 	 *             implementation doesn't have to care about multiple
 	 *             {@link #fetch(ProgressMonitor, Collection, Set)} calls, as it
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 c695449..e9227e3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java
@@ -170,9 +170,9 @@
 	 * <p>
 	 * If any errors occur, this connection is automatically closed by invoking
 	 * {@link #close()} and the exception is wrapped (if necessary) and thrown
-	 * as a {@link TransportException}.
+	 * as a {@link org.eclipse.jgit.errors.TransportException}.
 	 *
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the reference list could not be scanned.
 	 */
 	protected void readAdvertisedRefs() throws TransportException {
@@ -267,10 +267,26 @@
 		return new NoRemoteRepositoryException(uri, JGitText.get().notFound);
 	}
 
+	/**
+	 * Whether this option is supported
+	 *
+	 * @param option
+	 *            option string
+	 * @return whether this option is supported
+	 */
 	protected boolean isCapableOf(final String option) {
 		return remoteCapablities.contains(option);
 	}
 
+	/**
+	 * Request capability
+	 *
+	 * @param b
+	 *            buffer
+	 * @param option
+	 *            option we want
+	 * @return {@code true} if the requested option is supported
+	 */
 	protected boolean wantCapability(final StringBuilder b, final String option) {
 		if (!isCapableOf(option))
 			return false;
@@ -279,6 +295,12 @@
 		return true;
 	}
 
+	/**
+	 * Add user agent capability
+	 *
+	 * @param b
+	 *            a {@link java.lang.StringBuilder} object.
+	 */
 	protected void addUserAgentCapability(StringBuilder b) {
 		String a = UserAgent.get();
 		if (a != null && UserAgent.hasAgent(remoteCapablities)) {
@@ -286,6 +308,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getPeerUserAgent() {
 		return UserAgent.getAgent(remoteCapablities, super.getPeerUserAgent());
@@ -295,6 +318,7 @@
 		return new PackProtocolException(uri, MessageFormat.format(JGitText.get().duplicateAdvertisementsOf, name));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (out != null) {
@@ -334,7 +358,9 @@
 		}
 	}
 
-	/** Tell the peer we are disconnecting, if it cares to know. */
+	/**
+	 * Tell the peer we are disconnecting, if it cares to know.
+	 */
 	protected void endOut() {
 		if (outNeedsEnd && out != null) {
 			try {
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 61c4c4b..19d8abe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java
@@ -94,10 +94,10 @@
  * easily wrapped up into a local process pipe, anonymous TCP socket, or a
  * command executed through an SSH tunnel.
  * <p>
- * If {@link BasePackConnection#statelessRPC} is {@code true}, this connection
- * can be tunneled over a request-response style RPC system like HTTP.  The RPC
- * call boundary is determined by this class switching from writing to the
- * OutputStream to reading from the InputStream.
+ * If {@link org.eclipse.jgit.transport.BasePackConnection#statelessRPC} is
+ * {@code true}, this connection can be tunneled over a request-response style
+ * RPC system like HTTP. The RPC call boundary is determined by this class
+ * switching from writing to the OutputStream to reading from the InputStream.
  * <p>
  * Concrete implementations should just call
  * {@link #init(java.io.InputStream, java.io.OutputStream)} and
@@ -285,6 +285,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have)
@@ -292,9 +293,7 @@
 		fetch(monitor, want, have, null);
 	}
 
-	/**
-	 * @since 3.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public final void fetch(final ProgressMonitor monitor,
 			final Collection<Ref> want, final Set<ObjectId> have,
@@ -303,21 +302,25 @@
 		doFetch(monitor, want, have, outputStream);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean didFetchIncludeTags() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean didFetchTestConnectivity() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setPackLockMessage(final String message) {
 		lockMessage = message;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<PackLock> getPackLocks() {
 		if (packLock != null)
@@ -330,7 +333,7 @@
 	 *
 	 * @param monitor
 	 *            progress monitor to receive status updates. If the monitor is
-	 *            the {@link NullProgressMonitor#INSTANCE}, then the no-progress
+	 *            the {@link org.eclipse.jgit.lib.NullProgressMonitor#INSTANCE}, then the no-progress
 	 *            option enabled.
 	 * @param want
 	 *            the advertised remote references the caller wants to fetch.
@@ -340,7 +343,7 @@
 	 *            destination repository's references.
 	 * @param outputStream
 	 *            ouputStream to write sideband messages to
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             if any exception occurs.
 	 * @since 3.0
 	 */
@@ -380,6 +383,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (walk != null)
@@ -776,7 +780,7 @@
 
 	/**
 	 * Notification event delivered just before the pack is received from the
-	 * network. This event can be used by RPC such as {@link TransportHttp} to
+	 * network. This event can be used by RPC such as {@link org.eclipse.jgit.transport.TransportHttp} to
 	 * disable its request magic and ensure the pack stream is read correctly.
 	 *
 	 * @since 2.0
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 679ea0c..ee6f29e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java
@@ -81,7 +81,8 @@
  * easily wrapped up into a local process pipe, anonymous TCP socket, or a
  * command executed through an SSH tunnel.
  * <p>
- * This implementation honors {@link Transport#isPushThin()} option.
+ * This implementation honors
+ * {@link org.eclipse.jgit.transport.Transport#isPushThin()} option.
  * <p>
  * Concrete implementations should just call
  * {@link #init(java.io.InputStream, java.io.OutputStream)} and
@@ -152,6 +153,7 @@
 		pushOptions = transport.getPushOptions();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates)
@@ -159,9 +161,7 @@
 		push(monitor, refUpdates, null);
 	}
 
-	/**
-	 * @since 3.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates, OutputStream outputStream)
@@ -170,6 +170,7 @@
 		doPush(monitor, refUpdates, outputStream);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected TransportException noRepository() {
 		// Sadly we cannot tell the "invalid URI" case from "push not allowed".
@@ -202,7 +203,7 @@
 	 *            update commands to be applied to the remote repository.
 	 * @param outputStream
 	 *            output stream to write sideband messages to
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             if any exception occurs.
 	 * @since 3.0
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
index 72c8664..8f365fc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
@@ -411,15 +411,27 @@
 		}
 	}
 
-	/** @return the process name used for pack lock messages. */
+	/**
+	 * Get the process name used for pack lock messages.
+	 *
+	 * @return the process name used for pack lock messages.
+	 */
 	protected abstract String getLockMessageProcessName();
 
-	/** @return the repository this receive completes into. */
+	/**
+	 * Get the repository this receive completes into.
+	 *
+	 * @return the repository this receive completes into.
+	 */
 	public final Repository getRepository() {
 		return db;
 	}
 
-	/** @return the RevWalk instance used by this connection. */
+	/**
+	 * Get the RevWalk instance used by this connection.
+	 *
+	 * @return the RevWalk instance used by this connection.
+	 */
 	public final RevWalk getRevWalk() {
 		return walk;
 	}
@@ -437,14 +449,15 @@
 	/**
 	 * Set the refs advertised by this ReceivePack.
 	 * <p>
-	 * Intended to be called from a {@link PreReceiveHook}.
+	 * Intended to be called from a
+	 * {@link org.eclipse.jgit.transport.PreReceiveHook}.
 	 *
 	 * @param allRefs
 	 *            explicit set of references to claim as advertised by this
-	 *            ReceivePack instance. This overrides any references that
-	 *            may exist in the source repository. The map is passed
-	 *            to the configured {@link #getRefFilter()}. If null, assumes
-	 *            all refs were advertised.
+	 *            ReceivePack instance. This overrides any references that may
+	 *            exist in the source repository. The map is passed to the
+	 *            configured {@link #getRefFilter()}. If null, assumes all refs
+	 *            were advertised.
 	 * @param additionalHaves
 	 *            explicit set of additional haves to claim as advertised. If
 	 *            null, assumes the default set of additional haves from the
@@ -481,6 +494,9 @@
 	}
 
 	/**
+	 * Whether this instance will validate all referenced, but not supplied by
+	 * the client, objects are reachable from another reference.
+	 *
 	 * @return true if this instance will validate all referenced, but not
 	 *         supplied by the client, objects are reachable from another
 	 *         reference.
@@ -499,8 +515,9 @@
 	 * This feature is useful when the application doesn't trust the client to
 	 * not provide a forged SHA-1 reference to an object, in an attempt to
 	 * access parts of the DAG that they aren't allowed to see and which have
-	 * been hidden from them via the configured {@link AdvertiseRefsHook} or
-	 * {@link RefFilter}.
+	 * been hidden from them via the configured
+	 * {@link org.eclipse.jgit.transport.AdvertiseRefsHook} or
+	 * {@link org.eclipse.jgit.transport.RefFilter}.
 	 * <p>
 	 * Enabling this feature may imply at least some, if not all, of the same
 	 * functionality performed by {@link #setCheckReceivedObjects(boolean)}.
@@ -514,6 +531,9 @@
 	}
 
 	/**
+	 * Whether this class expects a bi-directional pipe opened between the
+	 * client and itself.
+	 *
 	 * @return true if this class expects a bi-directional pipe opened between
 	 *         the client and itself. The default is true.
 	 */
@@ -522,6 +542,10 @@
 	}
 
 	/**
+	 * Whether this class will assume the socket is a fully bidirectional pipe
+	 * between the two peers and takes advantage of that by first transmitting
+	 * the known refs, then waiting to read commands.
+	 *
 	 * @param twoWay
 	 *            if true, this class will assume the socket is a fully
 	 *            bidirectional pipe between the two peers and takes advantage
@@ -534,32 +558,44 @@
 		biDirectionalPipe = twoWay;
 	}
 
-	/** @return true if there is data expected after the pack footer. */
+	/**
+	 * Whether there is data expected after the pack footer.
+	 *
+	 * @return {@code true} if there is data expected after the pack footer.
+	 */
 	public boolean isExpectDataAfterPackFooter() {
 		return expectDataAfterPackFooter;
 	}
 
 	/**
+	 * Whether there is additional data in InputStream after pack.
+	 *
 	 * @param e
-	 *            true if there is additional data in InputStream after pack.
+	 *            {@code true} if there is additional data in InputStream after
+	 *            pack.
 	 */
 	public void setExpectDataAfterPackFooter(boolean e) {
 		expectDataAfterPackFooter = e;
 	}
 
 	/**
-	 * @return true if this instance will verify received objects are formatted
-	 *         correctly. Validating objects requires more CPU time on this side
-	 *         of the connection.
+	 * Whether this instance will verify received objects are formatted
+	 * correctly.
+	 *
+	 * @return {@code true} if this instance will verify received objects are
+	 *         formatted correctly. Validating objects requires more CPU time on
+	 *         this side of the connection.
 	 */
 	public boolean isCheckReceivedObjects() {
 		return objectChecker != null;
 	}
 
 	/**
+	 * Whether to enable checking received objects
+	 *
 	 * @param check
-	 *            true to enable checking received objects; false to assume all
-	 *            received objects are valid.
+	 *            {@code true} to enable checking received objects; false to
+	 *            assume all received objects are valid.
 	 * @see #setObjectChecker(ObjectChecker)
 	 */
 	public void setCheckReceivedObjects(final boolean check) {
@@ -570,42 +606,59 @@
 	}
 
 	/**
-	 * @param impl if non-null the object checking instance to verify each
-	 *        received object with; null to disable object checking.
+	 * Set the object checking instance to verify each received object with
+	 *
+	 * @param impl
+	 *            if non-null the object checking instance to verify each
+	 *            received object with; null to disable object checking.
 	 * @since 3.4
 	 */
 	public void setObjectChecker(ObjectChecker impl) {
 		objectChecker = impl;
 	}
 
-	/** @return true if the client can request refs to be created. */
+	/**
+	 * Whether the client can request refs to be created.
+	 *
+	 * @return {@code true} if the client can request refs to be created.
+	 */
 	public boolean isAllowCreates() {
 		return allowCreates;
 	}
 
 	/**
+	 * Whether to permit create ref commands to be processed.
+	 *
 	 * @param canCreate
-	 *            true to permit create ref commands to be processed.
+	 *            {@code true} to permit create ref commands to be processed.
 	 */
 	public void setAllowCreates(final boolean canCreate) {
 		allowCreates = canCreate;
 	}
 
-	/** @return true if the client can request refs to be deleted. */
+	/**
+	 * Whether the client can request refs to be deleted.
+	 *
+	 * @return {@code true} if the client can request refs to be deleted.
+	 */
 	public boolean isAllowDeletes() {
 		return allowAnyDeletes;
 	}
 
 	/**
+	 * Whether to permit delete ref commands to be processed.
+	 *
 	 * @param canDelete
-	 *            true to permit delete ref commands to be processed.
+	 *            {@code true} to permit delete ref commands to be processed.
 	 */
 	public void setAllowDeletes(final boolean canDelete) {
 		allowAnyDeletes = canDelete;
 	}
 
 	/**
-	 * @return true if the client can delete from {@code refs/heads/}.
+	 * Whether the client can delete from {@code refs/heads/}.
+	 *
+	 * @return {@code true} if the client can delete from {@code refs/heads/}.
 	 * @since 3.6
 	 */
 	public boolean isAllowBranchDeletes() {
@@ -613,8 +666,11 @@
 	}
 
 	/**
+	 * Configure whether to permit deletion of branches from the
+	 * {@code refs/heads/} namespace.
+	 *
 	 * @param canDelete
-	 *            true to permit deletion of branches from the
+	 *            {@code true} to permit deletion of branches from the
 	 *            {@code refs/heads/} namespace.
 	 * @since 3.6
 	 */
@@ -623,25 +679,34 @@
 	}
 
 	/**
-	 * @return true if the client can request non-fast-forward updates of a ref,
-	 *         possibly making objects unreachable.
+	 * Whether the client can request non-fast-forward updates of a ref,
+	 * possibly making objects unreachable.
+	 *
+	 * @return {@code true} if the client can request non-fast-forward updates
+	 *         of a ref, possibly making objects unreachable.
 	 */
 	public boolean isAllowNonFastForwards() {
 		return allowNonFastForwards;
 	}
 
 	/**
+	 * Configure whether to permit the client to ask for non-fast-forward
+	 * updates of an existing ref.
+	 *
 	 * @param canRewind
-	 *            true to permit the client to ask for non-fast-forward updates
-	 *            of an existing ref.
+	 *            {@code true} to permit the client to ask for non-fast-forward
+	 *            updates of an existing ref.
 	 */
 	public void setAllowNonFastForwards(final boolean canRewind) {
 		allowNonFastForwards = canRewind;
 	}
 
 	/**
-	 * @return true if the client's commands should be performed as a single
-	 *         atomic transaction.
+	 * Whether the client's commands should be performed as a single atomic
+	 * transaction.
+	 *
+	 * @return {@code true} if the client's commands should be performed as a
+	 *         single atomic transaction.
 	 * @since 4.4
 	 */
 	public boolean isAtomic() {
@@ -649,16 +714,23 @@
 	}
 
 	/**
+	 * Configure whether to perform the client's commands as a single atomic
+	 * transaction.
+	 *
 	 * @param atomic
-	 *            true to perform the client's commands as a single atomic
-	 *            transaction.
+	 *            {@code true} to perform the client's commands as a single
+	 *            atomic transaction.
 	 * @since 4.4
 	 */
 	public void setAtomic(boolean atomic) {
 		this.atomic = atomic;
 	}
 
-	/** @return identity of the user making the changes in the reflog. */
+	/**
+	 * Get identity of the user making the changes in the reflog.
+	 *
+	 * @return identity of the user making the changes in the reflog.
+	 */
 	public PersonIdent getRefLogIdent() {
 		return refLogIdent;
 	}
@@ -679,12 +751,20 @@
 		refLogIdent = pi;
 	}
 
-	/** @return the hook used while advertising the refs to the client */
+	/**
+	 * Get the hook used while advertising the refs to the client
+	 *
+	 * @return the hook used while advertising the refs to the client
+	 */
 	public AdvertiseRefsHook getAdvertiseRefsHook() {
 		return advertiseRefsHook;
 	}
 
-	/** @return the filter used while advertising the refs to the client */
+	/**
+	 * Get the filter used while advertising the refs to the client
+	 *
+	 * @return the filter used while advertising the refs to the client
+	 */
 	public RefFilter getRefFilter() {
 		return refFilter;
 	}
@@ -692,12 +772,14 @@
 	/**
 	 * Set the hook used while advertising the refs to the client.
 	 * <p>
-	 * If the {@link AdvertiseRefsHook} chooses to call
-	 * {@link #setAdvertisedRefs(Map,Set)}, only refs set by this hook
-	 * <em>and</em> selected by the {@link RefFilter} will be shown to the client.
-	 * Clients may still attempt to create or update a reference not advertised by
-	 * the configured {@link AdvertiseRefsHook}. These attempts should be rejected
-	 * by a matching {@link PreReceiveHook}.
+	 * If the {@link org.eclipse.jgit.transport.AdvertiseRefsHook} chooses to
+	 * call {@link #setAdvertisedRefs(Map,Set)}, only refs set by this hook
+	 * <em>and</em> selected by the {@link org.eclipse.jgit.transport.RefFilter}
+	 * will be shown to the client. Clients may still attempt to create or
+	 * update a reference not advertised by the configured
+	 * {@link org.eclipse.jgit.transport.AdvertiseRefsHook}. These attempts
+	 * should be rejected by a matching
+	 * {@link org.eclipse.jgit.transport.PreReceiveHook}.
 	 *
 	 * @param advertiseRefsHook
 	 *            the hook; may be null to show all refs.
@@ -712,9 +794,9 @@
 	/**
 	 * Set the filter used while advertising the refs to the client.
 	 * <p>
-	 * Only refs allowed by this filter will be shown to the client.
-	 * The filter is run against the refs specified by the
-	 * {@link AdvertiseRefsHook} (if applicable).
+	 * Only refs allowed by this filter will be shown to the client. The filter
+	 * is run against the refs specified by the
+	 * {@link org.eclipse.jgit.transport.AdvertiseRefsHook} (if applicable).
 	 *
 	 * @param refFilter
 	 *            the filter; may be null to show all refs.
@@ -723,7 +805,11 @@
 		this.refFilter = refFilter != null ? refFilter : RefFilter.DEFAULT;
 	}
 
-	/** @return timeout (in seconds) before aborting an IO operation. */
+	/**
+	 * Get timeout (in seconds) before aborting an IO operation.
+	 *
+	 * @return timeout (in seconds) before aborting an IO operation.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
@@ -792,7 +878,6 @@
 	 *
 	 * @param limit
 	 *            the pack size limit, in bytes
-	 *
 	 * @since 3.3
 	 */
 	public void setMaxPackSizeLimit(final long limit) {
@@ -807,7 +892,7 @@
 	 *
 	 * @return true if the client has advertised a side-band capability, false
 	 *     otherwise.
-	 * @throws RequestNotYetReadException
+	 * @throws org.eclipse.jgit.transport.RequestNotYetReadException
 	 *             if the client's request has not yet been read from the wire, so
 	 *             we do not know if they expect side-band. Note that the client
 	 *             may have already written the request, it just has not been
@@ -819,6 +904,8 @@
 	}
 
 	/**
+	 * Whether clients may request avoiding noisy progress messages.
+	 *
 	 * @return true if clients may request avoiding noisy progress messages.
 	 * @since 4.0
 	 */
@@ -841,6 +928,8 @@
 	}
 
 	/**
+	 * Whether the server supports receiving push options.
+	 *
 	 * @return true if the server supports receiving push options.
 	 * @since 4.5
 	 */
@@ -863,7 +952,7 @@
 	 * True if the client wants less verbose output.
 	 *
 	 * @return true if the client has requested the server to be less verbose.
-	 * @throws RequestNotYetReadException
+	 * @throws org.eclipse.jgit.transport.RequestNotYetReadException
 	 *             if the client's request has not yet been read from the wire,
 	 *             so we do not know if they expect side-band. Note that the
 	 *             client may have already written the request, it just has not
@@ -914,7 +1003,11 @@
 		return UserAgent.getAgent(enabledCapabilities, userAgent);
 	}
 
-	/** @return all of the command received by the current request. */
+	/**
+	 * Get all of the command received by the current request.
+	 *
+	 * @return all of the command received by the current request.
+	 */
 	public List<ReceiveCommand> getAllCommands() {
 		return Collections.unmodifiableList(commands);
 	}
@@ -932,11 +1025,13 @@
 	 * message will be discarded, with no other indication to the caller or to
 	 * the client.
 	 * <p>
-	 * {@link PreReceiveHook}s should always try to use
-	 * {@link ReceiveCommand#setResult(Result, String)} with a result status of
-	 * {@link Result#REJECTED_OTHER_REASON} to indicate any reasons for
-	 * rejecting an update. Messages attached to a command are much more likely
-	 * to be returned to the client.
+	 * {@link org.eclipse.jgit.transport.PreReceiveHook}s should always try to
+	 * use
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand#setResult(Result, String)}
+	 * with a result status of
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#REJECTED_OTHER_REASON}
+	 * to indicate any reasons for rejecting an update. Messages attached to a
+	 * command are much more likely to be returned to the client.
 	 *
 	 * @param what
 	 *            string describing the problem identified by the hook. The
@@ -979,7 +1074,11 @@
 		msgOutWrapper.write(Constants.encode(what + "\n")); //$NON-NLS-1$
 	}
 
-	/** @return an underlying stream for sending messages to the client. */
+	/**
+	 * Get an underlying stream for sending messages to the client.
+	 *
+	 * @return an underlying stream for sending messages to the client.
+	 */
 	public OutputStream getMessageOutputStream() {
 		return msgOutWrapper;
 	}
@@ -990,7 +1089,7 @@
 	 * This can only be called if the pack is already received.
 	 *
 	 * @return the size of the received pack including index size
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if called before the pack has been received
 	 * @since 3.3
 	 */
@@ -1012,12 +1111,20 @@
 		return clientShallowCommits;
 	}
 
-	/** @return true if any commands to be executed have been read. */
+	/**
+	 * Whether any commands to be executed have been read.
+	 *
+	 * @return {@code true} if any commands to be executed have been read.
+	 */
 	protected boolean hasCommands() {
 		return !commands.isEmpty();
 	}
 
-	/** @return true if an error occurred that should be advertised. */
+	/**
+	 * Whether an error occurred that should be advertised.
+	 *
+	 * @return true if an error occurred that should be advertised.
+	 */
 	protected boolean hasError() {
 		return advertiseError != null;
 	}
@@ -1065,7 +1172,11 @@
 		commands = new ArrayList<>();
 	}
 
-	/** @return advertised refs, or the default if not explicitly advertised. */
+	/**
+	 * Get advertised refs, or the default if not explicitly advertised.
+	 *
+	 * @return advertised refs, or the default if not explicitly advertised.
+	 */
 	protected Map<String, Ref> getAdvertisedOrDefaultRefs() {
 		if (refs == null)
 			setAdvertisedRefs(null, null);
@@ -1075,7 +1186,7 @@
 	/**
 	 * Receive a pack from the stream and check connectivity if necessary.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred during unpacking or connectivity checking.
 	 */
 	protected void receivePackAndCheckConnectivity() throws IOException {
@@ -1090,7 +1201,7 @@
 	/**
 	 * Unlock the pack written by this object.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack could not be unlocked.
 	 */
 	protected void unlockPack() throws IOException {
@@ -1105,9 +1216,9 @@
 	 *
 	 * @param adv
 	 *            the advertisement formatter.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the formatter failed to write an advertisement.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             the hook denied advertisement.
 	 */
 	public void sendAdvertisedRefs(final RefAdvertiser adv)
@@ -1168,7 +1279,7 @@
 	/**
 	 * Receive a list of commands from the input.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void recvCommands() throws IOException {
 		PacketLineIn pck = maxCommandBytes > 0
@@ -1297,7 +1408,9 @@
 		// Do nothing by default.
 	}
 
-	/** Enable capabilities based on a previously read capabilities line. */
+	/**
+	 * Enable capabilities based on a previously read capabilities line.
+	 */
 	protected void enableCapabilities() {
 		sideBand = isCapabilityEnabled(CAPABILITY_SIDE_BAND_64K);
 		quiet = allowQuiet && isCapabilityEnabled(CAPABILITY_QUIET);
@@ -1329,7 +1442,11 @@
 			throw new RequestNotYetReadException();
 	}
 
-	/** @return true if a pack is expected based on the list of commands. */
+	/**
+	 * Whether a pack is expected based on the list of commands.
+	 *
+	 * @return {@code true} if a pack is expected based on the list of commands.
+	 */
 	protected boolean needPack() {
 		for (final ReceiveCommand cmd : commands) {
 			if (cmd.getType() != ReceiveCommand.Type.DELETE)
@@ -1498,7 +1615,9 @@
 		}
 	}
 
-	/** Validate the command list. */
+	/**
+	 * Validate the command list.
+	 */
 	protected void validateCommands() {
 		for (final ReceiveCommand cmd : commands) {
 			final Ref ref = cmd.getRef();
@@ -1635,6 +1754,8 @@
 	}
 
 	/**
+	 * Whether any commands have been rejected so far.
+	 *
 	 * @return if any commands have been rejected so far.
 	 * @since 3.6
 	 */
@@ -1648,6 +1769,7 @@
 
 	/**
 	 * Set the result to fail for any command that was not processed yet.
+	 *
 	 * @since 3.6
 	 */
 	protected void failPendingCommands() {
@@ -1666,7 +1788,9 @@
 		return ReceiveCommand.filter(commands, want);
 	}
 
-	/** Execute commands to update references. */
+	/**
+	 * Execute commands to update references.
+	 */
 	protected void executeCommands() {
 		List<ReceiveCommand> toApply = filterCommands(Result.NOT_ATTEMPTED);
 		if (toApply.isEmpty())
@@ -1706,7 +1830,7 @@
 	 *            an error that occurred during unpacking, or {@code null}
 	 * @param out
 	 *            the reporter for sending the status strings.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred writing the status report.
 	 */
 	protected void sendStatusReport(final boolean forClient,
@@ -1793,7 +1917,7 @@
 	/**
 	 * Close and flush (if necessary) the underlying streams.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	protected void close() throws IOException {
 		if (sideBand) {
@@ -1825,7 +1949,7 @@
 	/**
 	 * Release any resources used by this object.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack could not be unlocked.
 	 */
 	protected void release() throws IOException {
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 f37ba01..39efabf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java
@@ -180,11 +180,13 @@
 		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)
@@ -208,11 +210,13 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setPackLockMessage(final String message) {
 		lockMessage = message;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<PackLock> getPackLocks() {
 		if (packLock != null)
@@ -290,6 +294,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (bin != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java
index 0920f21..35ac779 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java
@@ -70,7 +70,7 @@
  * <p>
  * Bundles generated by this class can be later read in from a file URI using
  * the bundle transport, or from an application controlled buffer by the more
- * generic {@link TransportBundleStream}.
+ * generic {@link org.eclipse.jgit.transport.TransportBundleStream}.
  * <p>
  * Applications creating bundles need to call one or more <code>include</code>
  * calls to reflect which objects should be available as refs in the bundle for
@@ -208,13 +208,10 @@
 	 *            the stream the bundle is written to. The stream should be
 	 *            buffered by the caller. The caller is responsible for closing
 	 *            the stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred reading a local object's data to include in
 	 *             the bundle, or writing compressed object data to the output
 	 *             stream.
-	 * @throws WriteAbortedException
-	 *             the write operation is aborted by
-	 *             {@link ObjectCountCallback}.
 	 */
 	public void writeBundle(ProgressMonitor monitor, OutputStream os)
 			throws IOException {
@@ -270,17 +267,16 @@
 	}
 
 	/**
-	 * Set the {@link ObjectCountCallback}.
+	 * Set the {@link org.eclipse.jgit.transport.ObjectCountCallback}.
 	 * <p>
 	 * It should be set before calling
 	 * {@link #writeBundle(ProgressMonitor, OutputStream)}.
 	 * <p>
 	 * This callback will be passed on to
-	 * {@link PackWriter#setObjectCountCallback}.
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackWriter#setObjectCountCallback}.
 	 *
 	 * @param callback
 	 *            the callback to set
-	 *
 	 * @return this object for chaining.
 	 * @since 4.1
 	 */
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 8cb3d60..9f05d5a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ChainingCredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ChainingCredentialsProvider.java
@@ -72,11 +72,7 @@
 				Arrays.asList(providers));
 	}
 
-	/**
-	 * @return {@code true} if any of the credential providers in the list is
-	 *         interactive, otherwise {@code false}
-	 * @see org.eclipse.jgit.transport.CredentialsProvider#isInteractive()
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		for (CredentialsProvider p : credentialProviders)
@@ -85,11 +81,7 @@
 		return false;
 	}
 
-	/**
-	 * @return {@code true} if any of the credential providers in the list
-	 *         supports the requested items, otherwise {@code false}
-	 * @see org.eclipse.jgit.transport.CredentialsProvider#supports(org.eclipse.jgit.transport.CredentialItem[])
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialsProvider p : credentialProviders)
@@ -99,11 +91,11 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Populates the credential items with the credentials provided by the first
 	 * credential provider in the list which populates them with non-null values
 	 *
-	 * @return {@code true} if any of the credential providers in the list
-	 *         supports the requested items, otherwise {@code false}
 	 * @see org.eclipse.jgit.transport.CredentialsProvider#supports(org.eclipse.jgit.transport.CredentialItem[])
 	 */
 	@Override
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java
index 9a272a4..bcc5110 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java
@@ -98,6 +98,8 @@
 	public Ref getRef(final String name);
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Close any resources used by this connection.
 	 * <p>
 	 * If the remote repository is contacted by a network socket this method
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 88e075a..3a74f1d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialItem.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialItem.java
@@ -48,14 +48,19 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * A credential requested from a {@link CredentialsProvider}.
+ * A credential requested from a
+ * {@link org.eclipse.jgit.transport.CredentialsProvider}.
  *
  * Most users should work with the specialized subclasses:
  * <ul>
- * <li>{@link Username} for usernames</li>
- * <li>{@link Password} for passwords</li>
- * <li>{@link StringType} for other general string information</li>
- * <li>{@link CharArrayType} for other general secret information</li>
+ * <li>{@link org.eclipse.jgit.transport.CredentialItem.Username} for
+ * usernames</li>
+ * <li>{@link org.eclipse.jgit.transport.CredentialItem.Password} for
+ * passwords</li>
+ * <li>{@link org.eclipse.jgit.transport.CredentialItem.StringType} for other
+ * general string information</li>
+ * <li>{@link org.eclipse.jgit.transport.CredentialItem.CharArrayType} for other
+ * general secret information</li>
  * </ul>
  *
  * This class is not thread-safe. Applications should construct their own
@@ -83,17 +88,27 @@
 		this.valueSecure = maskValue;
 	}
 
-	/** @return prompt to display to the user. */
+	/**
+	 * Get prompt to display to the user.
+	 *
+	 * @return prompt to display to the user.
+	 */
 	public String getPromptText() {
 		return promptText;
 	}
 
-	/** @return true if the value should be masked when entered. */
+	/**
+	 * Whether the value should be masked when entered.
+	 *
+	 * @return true if the value should be masked when entered.
+	 */
 	public boolean isValueSecure() {
 		return valueSecure;
 	}
 
-	/** Clear the stored value, destroying it as much as possible. */
+	/**
+	 * Clear the stored value, destroying it as much as possible.
+	 */
 	public abstract void clear();
 
 	/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java
index 4800f68..8115946 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java
@@ -52,9 +52,10 @@
  * Provide credentials for use in connecting to Git repositories.
  *
  * Implementors are strongly encouraged to support at least the minimal
- * {@link CredentialItem.Username} and {@link CredentialItem.Password} items.
- * More sophisticated implementors may implement additional types, such as
- * {@link CredentialItem.StringType}.
+ * {@link org.eclipse.jgit.transport.CredentialItem.Username} and
+ * {@link org.eclipse.jgit.transport.CredentialItem.Password} items. More
+ * sophisticated implementors may implement additional types, such as
+ * {@link org.eclipse.jgit.transport.CredentialItem.StringType}.
  *
  * CredentialItems are usually presented in bulk, allowing implementors to
  * combine them into a single UI widget and streamline the authentication
@@ -65,7 +66,11 @@
 public abstract class CredentialsProvider {
 	private static volatile CredentialsProvider defaultProvider;
 
-	/** @return the default credentials provider, or null. */
+	/**
+	 * Get the default credentials provider, or null.
+	 *
+	 * @return the default credentials provider, or null.
+	 */
 	public static CredentialsProvider getDefault() {
 		return defaultProvider;
 	}
@@ -81,6 +86,8 @@
 	}
 
 	/**
+	 * Whether any of the passed items is null
+	 *
 	 * @param items
 	 *            credential items to check
 	 * @return {@code true} if any of the passed items is null, {@code false}
@@ -106,12 +113,14 @@
 	public abstract boolean isInteractive();
 
 	/**
-	 * Check if the provider can supply the necessary {@link CredentialItem}s.
+	 * Check if the provider can supply the necessary
+	 * {@link org.eclipse.jgit.transport.CredentialItem}s.
 	 *
 	 * @param items
 	 *            the items the application requires to complete authentication.
-	 * @return {@code true} if this {@link CredentialsProvider} supports all of
-	 *         the items supplied.
+	 * @return {@code true} if this
+	 *         {@link org.eclipse.jgit.transport.CredentialsProvider} supports
+	 *         all of the items supplied.
 	 */
 	public abstract boolean supports(CredentialItem... items);
 
@@ -125,7 +134,7 @@
 	 * @return {@code true} if the request was successful and values were
 	 *         supplied; {@code false} if the user canceled the request and did
 	 *         not supply all requested values.
-	 * @throws UnsupportedCredentialItem
+	 * @throws org.eclipse.jgit.errors.UnsupportedCredentialItem
 	 *             if one of the items supplied is not supported.
 	 */
 	public abstract boolean get(URIish uri, CredentialItem... items)
@@ -141,7 +150,7 @@
 	 * @return {@code true} if the request was successful and values were
 	 *         supplied; {@code false} if the user canceled the request and did
 	 *         not supply all requested values.
-	 * @throws UnsupportedCredentialItem
+	 * @throws org.eclipse.jgit.errors.UnsupportedCredentialItem
 	 *             if one of the items supplied is not supported.
 	 */
 	public boolean get(URIish uri, List<CredentialItem> items)
@@ -153,6 +162,7 @@
 	 * Reset the credentials provider for the given URI
 	 *
 	 * @param uri
+	 *            a {@link org.eclipse.jgit.transport.URIish} object.
 	 */
 	public void reset(URIish uri) {
 		// default does nothing
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProviderUserInfo.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProviderUserInfo.java
index 8358635..d901021 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProviderUserInfo.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProviderUserInfo.java
@@ -51,7 +51,10 @@
 import com.jcraft.jsch.UIKeyboardInteractive;
 import com.jcraft.jsch.UserInfo;
 
-/** A JSch {@link UserInfo} adapter for a {@link CredentialsProvider}. */
+/**
+ * A JSch {@link com.jcraft.jsch.UserInfo} adapter for a
+ * {@link org.eclipse.jgit.transport.CredentialsProvider}.
+ */
 public class CredentialsProviderUserInfo implements UserInfo,
 		UIKeyboardInteractive {
 	private final URIish uri;
@@ -85,16 +88,19 @@
 		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);
@@ -107,6 +113,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean promptPassword(String msg) {
 		CredentialItem.Password p = new CredentialItem.Password(msg);
@@ -123,17 +130,20 @@
 		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/src/org/eclipse/jgit/transport/Daemon.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java
index 896b10a..2fc5eb2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java
@@ -65,7 +65,9 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 import org.eclipse.jgit.transport.resolver.UploadPackFactory;
 
-/** Basic daemon for the anonymous <code>git://</code> transport protocol. */
+/**
+ * Basic daemon for the anonymous <code>git://</code> transport protocol.
+ */
 public class Daemon {
 	/** 9418: IANA assigned port number for Git. */
 	public static final int DEFAULT_PORT = 9418;
@@ -90,7 +92,9 @@
 
 	volatile ReceivePackFactory<DaemonClient> receivePackFactory;
 
-	/** Configure a daemon to listen on any available network port. */
+	/**
+	 * Configure a daemon to listen on any available network port.
+	 */
 	public Daemon() {
 		this(null);
 	}
@@ -175,7 +179,11 @@
 				} };
 	}
 
-	/** @return the address connections are received on. */
+	/**
+	 * Get the address connections are received on.
+	 *
+	 * @return the address connections are received on.
+	 */
 	public synchronized InetSocketAddress getAddress() {
 		return myAddress;
 	}
@@ -199,7 +207,11 @@
 		return null;
 	}
 
-	/** @return timeout (in seconds) before aborting an IO operation. */
+	/**
+	 * Get timeout (in seconds) before aborting an IO operation.
+	 *
+	 * @return timeout (in seconds) before aborting an IO operation.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
@@ -216,7 +228,11 @@
 		timeout = seconds;
 	}
 
-	/** @return configuration controlling packing, may be null. */
+	/**
+	 * Get configuration controlling packing, may be null.
+	 *
+	 * @return configuration controlling packing, may be null.
+	 */
 	public PackConfig getPackConfig() {
 		return packConfig;
 	}
@@ -333,9 +349,9 @@
 	/**
 	 * Start this daemon on a background thread.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the server socket could not be opened.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             the daemon is already running.
 	 */
 	public synchronized void start() throws IOException {
@@ -359,7 +375,11 @@
 		acceptThread = null;
 	}
 
-	/** @return true if this daemon is receiving connections. */
+	/**
+	 * Whether this daemon is receiving connections.
+	 *
+	 * @return {@code true} if this daemon is receiving connections.
+	 */
 	public synchronized boolean isRunning() {
 		return acceptThread != null && acceptThread.isRunning();
 	}
@@ -376,9 +396,8 @@
 	/**
 	 * Stops this daemon and waits until it's acceptor thread has finished.
 	 *
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             if waiting for the acceptor thread is interrupted
-	 *
 	 * @since 4.9
 	 */
 	public void stopAndWait() throws InterruptedException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonClient.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonClient.java
index 23e3379..a9731ac 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonClient.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonClient.java
@@ -54,7 +54,9 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
-/** Active network client of {@link Daemon}. */
+/**
+ * Active network client of {@link org.eclipse.jgit.transport.Daemon}.
+ */
 public class DaemonClient {
 	private final Daemon daemon;
 
@@ -72,22 +74,38 @@
 		peer = ia;
 	}
 
-	/** @return the daemon which spawned this client. */
+	/**
+	 * Get the daemon which spawned this client.
+	 *
+	 * @return the daemon which spawned this client.
+	 */
 	public Daemon getDaemon() {
 		return daemon;
 	}
 
-	/** @return Internet address of the remote client. */
+	/**
+	 * Get Internet address of the remote client.
+	 *
+	 * @return Internet address of the remote client.
+	 */
 	public InetAddress getRemoteAddress() {
 		return peer;
 	}
 
-	/** @return input stream to read from the connected client. */
+	/**
+	 * Get input stream to read from the connected client.
+	 *
+	 * @return input stream to read from the connected client.
+	 */
 	public InputStream getInputStream() {
 		return rawIn;
 	}
 
-	/** @return output stream to send data to the connected client. */
+	/**
+	 * Get output stream to send data to the connected client.
+	 *
+	 * @return output stream to send data to the connected client.
+	 */
 	public OutputStream getOutputStream() {
 		return rawOut;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java
index 566153a..e0ec775 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java
@@ -52,7 +52,10 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
-/** A service exposed by {@link Daemon} over anonymous <code>git://</code>. */
+/**
+ * A service exposed by {@link org.eclipse.jgit.transport.Daemon} over anonymous
+ * <code>git://</code>.
+ */
 public abstract class DaemonService {
 	private final String command;
 
@@ -77,34 +80,55 @@
 		}
 	}
 
-	/** @return is this service enabled for invocation? */
+	/**
+	 * Whether this service is enabled for invocation.
+	 *
+	 * @return whether this service is enabled for invocation.
+	 */
 	public boolean isEnabled() {
 		return enabled;
 	}
 
 	/**
+	 * Set if it is allowed to use this service
+	 *
 	 * @param on
-	 *            true to allow this service to be used; false to deny it.
+	 *            {@code true} to allow this service to be used; {@code false}
+	 *            to deny it.
 	 */
 	public void setEnabled(final boolean on) {
 		enabled = on;
 	}
 
 	/** @return can this service be configured in the repository config file? */
+	/**
+	 * Whether this service can be configured in the repository config file
+	 *
+	 * @return whether this service can be configured in the repository config
+	 *         file
+	 */
 	public boolean isOverridable() {
 		return overridable;
 	}
 
 	/**
+	 * Whether to permit repositories to override this service's enabled state
+	 * with the <code>daemon.servicename</code> config setting.
+	 *
 	 * @param on
-	 *            true to permit repositories to override this service's enabled
-	 *            state with the <code>daemon.servicename</code> config setting.
+	 *            {@code true} to permit repositories to override this service's
+	 *            enabled state with the <code>daemon.servicename</code> config
+	 *            setting.
 	 */
 	public void setOverridable(final boolean on) {
 		overridable = on;
 	}
 
-	/** @return name of the command requested by clients. */
+	/**
+	 * Get name of the command requested by clients.
+	 *
+	 * @return name of the command requested by clients.
+	 */
 	public String getCommandName() {
 		return command;
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java
index 23fd7e3..a749fbc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DefaultSshSessionFactory.java
@@ -59,6 +59,7 @@
  * connection will immediately fail.
  */
 class DefaultSshSessionFactory extends JschConfigSessionFactory {
+	/** {@inheritDoc} */
 	@Override
 	protected void configure(final OpenSshConfig.Host hc, final Session session) {
 		// No additional configuration required.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchConnection.java
index 2d04240..f0c45d5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchConnection.java
@@ -64,9 +64,9 @@
  * one-way object transfer service to copy objects from the remote repository
  * into this local repository.
  * <p>
- * Instances of a FetchConnection must be created by a {@link Transport} that
- * implements a specific object transfer protocol that both sides of the
- * connection understand.
+ * Instances of a FetchConnection must be created by a
+ * {@link org.eclipse.jgit.transport.Transport} that implements a specific
+ * object transfer protocol that both sides of the connection understand.
  * <p>
  * FetchConnection instances are not thread safe and may be accessed by only one
  * thread at a time.
@@ -78,7 +78,7 @@
 	 * Fetch objects we don't have but that are reachable from advertised refs.
 	 * <p>
 	 * Only one call per connection is allowed. Subsequent calls will result in
-	 * {@link TransportException}.
+	 * {@link org.eclipse.jgit.errors.TransportException}.
 	 * </p>
 	 * <p>
 	 * Implementations are free to use network connections as necessary to
@@ -87,7 +87,8 @@
 	 * avoid replacing/overwriting/duplicating an object already available in
 	 * the local destination repository. Locally available objects and packs
 	 * should always be preferred over remotely available objects and packs.
-	 * {@link Transport#isFetchThin()} should be honored if applicable.
+	 * {@link org.eclipse.jgit.transport.Transport#isFetchThin()} should be
+	 * honored if applicable.
 	 * </p>
 	 *
 	 * @param monitor
@@ -103,7 +104,7 @@
 	 *            repository, especially if they aren't yet reachable by the ref
 	 *            database. Connections should take this set as an addition to
 	 *            what is reachable through all Refs, not in replace of it.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             objects could not be copied due to a network failure,
 	 *             protocol error, or error on remote side, or connection was
 	 *             already used for fetch.
@@ -116,7 +117,7 @@
 	 * Fetch objects we don't have but that are reachable from advertised refs.
 	 * <p>
 	 * Only one call per connection is allowed. Subsequent calls will result in
-	 * {@link TransportException}.
+	 * {@link org.eclipse.jgit.errors.TransportException}.
 	 * </p>
 	 * <p>
 	 * Implementations are free to use network connections as necessary to
@@ -125,7 +126,8 @@
 	 * avoid replacing/overwriting/duplicating an object already available in
 	 * the local destination repository. Locally available objects and packs
 	 * should always be preferred over remotely available objects and packs.
-	 * {@link Transport#isFetchThin()} should be honored if applicable.
+	 * {@link org.eclipse.jgit.transport.Transport#isFetchThin()} should be
+	 * honored if applicable.
 	 * </p>
 	 *
 	 * @param monitor
@@ -143,7 +145,7 @@
 	 *            what is reachable through all Refs, not in replace of it.
 	 * @param out
 	 *            OutputStream to write sideband messages to
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             objects could not be copied due to a network failure,
 	 *             protocol error, or error on remote side, or connection was
 	 *             already used for fetch.
@@ -157,11 +159,12 @@
 	 * Did the last {@link #fetch(ProgressMonitor, Collection, Set)} get tags?
 	 * <p>
 	 * Some Git aware transports are able to implicitly grab an annotated tag if
-	 * {@link TagOpt#AUTO_FOLLOW} or {@link TagOpt#FETCH_TAGS} was selected and
-	 * the object the tag peels to (references) was transferred as part of the
-	 * last {@link #fetch(ProgressMonitor, Collection, Set)} call. If it is
-	 * possible for such tags to have been included in the transfer this method
-	 * returns true, allowing the caller to attempt tag discovery.
+	 * {@link org.eclipse.jgit.transport.TagOpt#AUTO_FOLLOW} or
+	 * {@link org.eclipse.jgit.transport.TagOpt#FETCH_TAGS} was selected and the
+	 * object the tag peels to (references) was transferred as part of the last
+	 * {@link #fetch(ProgressMonitor, Collection, Set)} call. If it is possible
+	 * for such tags to have been included in the transfer this method returns
+	 * true, allowing the caller to attempt tag discovery.
 	 * <p>
 	 * By returning only true/false (and not the actual list of tags obtained)
 	 * the transport itself does not need to be aware of whether or not tags
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 d43be89..6c26b70 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HMACSHA1NonceGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HMACSHA1NonceGenerator.java
@@ -42,8 +42,10 @@
  */
 package org.eclipse.jgit.transport;
 
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.io.File;
-import java.io.UnsupportedEncodingException;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 
@@ -64,12 +66,15 @@
 	private Mac mac;
 
 	/**
+	 * Constructor for HMACSHA1NonceGenerator.
+	 *
 	 * @param seed
-	 * @throws IllegalStateException
+	 *            seed the generator
+	 * @throws java.lang.IllegalStateException
 	 */
 	public HMACSHA1NonceGenerator(String seed) throws IllegalStateException {
 		try {
-			byte[] keyBytes = seed.getBytes("ISO-8859-1"); //$NON-NLS-1$
+			byte[] keyBytes = seed.getBytes(ISO_8859_1);
 			SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); //$NON-NLS-1$
 			mac = Mac.getInstance("HmacSHA1"); //$NON-NLS-1$
 			mac.init(signingKey);
@@ -77,11 +82,10 @@
 			throw new IllegalStateException(e);
 		} catch (NoSuchAlgorithmException e) {
 			throw new IllegalStateException(e);
-		} catch (UnsupportedEncodingException e) {
-			throw new IllegalStateException(e);
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public synchronized String createNonce(Repository repo, long timestamp)
 			throws IllegalStateException {
@@ -98,15 +102,11 @@
 		}
 
 		String input = path + ":" + String.valueOf(timestamp); //$NON-NLS-1$
-		byte[] rawHmac;
-		try {
-			rawHmac = mac.doFinal(input.getBytes("UTF-8")); //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			throw new IllegalStateException(e);
-		}
+		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 c97daa9..c40d963 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java
@@ -43,11 +43,11 @@
 
 package org.eclipse.jgit.transport;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.eclipse.jgit.util.HttpSupport.HDR_AUTHORIZATION;
 import static org.eclipse.jgit.util.HttpSupport.HDR_WWW_AUTHENTICATE;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.net.URL;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
@@ -204,6 +204,12 @@
 
 	protected final Type type;
 
+	/**
+	 * Constructor for HttpAuthMethod.
+	 *
+	 * @param type
+	 *            authentication method type
+	 */
 	protected HttpAuthMethod(Type type) {
 		this.type = type;
 	}
@@ -309,7 +315,7 @@
 		@Override
 		void configureRequest(final HttpConnection conn) throws IOException {
 			String ident = user + ":" + pass; //$NON-NLS-1$
-			String enc = Base64.encodeBytes(ident.getBytes("UTF-8")); //$NON-NLS-1$
+			String enc = Base64.encodeBytes(ident.getBytes(UTF_8));
 			conn.setRequestProperty(HDR_AUTHORIZATION, type.getSchemeName()
 					+ " " + enc); //$NON-NLS-1$
 		}
@@ -423,25 +429,17 @@
 		}
 
 		private static String H(String data) {
-			try {
-				MessageDigest md = newMD5();
-				md.update(data.getBytes("UTF-8")); //$NON-NLS-1$
-				return LHEX(md.digest());
-			} catch (UnsupportedEncodingException e) {
-				throw new RuntimeException("UTF-8 encoding not available", e); //$NON-NLS-1$
-			}
+			MessageDigest md = newMD5();
+			md.update(data.getBytes(UTF_8));
+			return LHEX(md.digest());
 		}
 
 		private static String KD(String secret, String data) {
-			try {
-				MessageDigest md = newMD5();
-				md.update(secret.getBytes("UTF-8")); //$NON-NLS-1$
-				md.update((byte) ':');
-				md.update(data.getBytes("UTF-8")); //$NON-NLS-1$
-				return LHEX(md.digest());
-			} catch (UnsupportedEncodingException e) {
-				throw new RuntimeException("UTF-8 encoding not available", e); //$NON-NLS-1$
-			}
+			MessageDigest md = newMD5();
+			md.update(secret.getBytes(UTF_8));
+			md.update((byte) ':');
+			md.update(data.getBytes(UTF_8));
+			return LHEX(md.digest());
 		}
 
 		private static MessageDigest newMD5() {
@@ -557,9 +555,7 @@
 				conn.setRequestProperty(HDR_AUTHORIZATION, getType().getSchemeName()
 						+ " " + Base64.encodeBytes(token)); //$NON-NLS-1$
 			} catch (GSSException e) {
-				IOException ioe = new IOException();
-				ioe.initCause(e);
-				throw ioe;
+				throw new IOException(e);
 			}
 		}
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java
index db59a54..101ce35 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java
@@ -61,10 +61,10 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * A representation of the "http.*" config values in a git {@link Config}. git
- * provides for setting values for specific URLs through "http.<url>.*
- * subsections. git always considers only the initial original URL for such
- * settings, not any redirected URL.
+ * A representation of the "http.*" config values in a git
+ * {@link org.eclipse.jgit.lib.Config}. git provides for setting values for
+ * specific URLs through "http.&lt;url&gt;.*" subsections. git always considers
+ * only the initial original URL for such settings, not any redirected URL.
  *
  * @since 4.9
  */
@@ -154,6 +154,8 @@
 	private int maxRedirects;
 
 	/**
+	 * Get the "http.postBuffer" setting
+	 *
 	 * @return the value of the "http.postBuffer" setting
 	 */
 	public int getPostBuffer() {
@@ -161,6 +163,8 @@
 	}
 
 	/**
+	 * Get the "http.sslVerify" setting
+	 *
 	 * @return the value of the "http.sslVerify" setting
 	 */
 	public boolean isSslVerify() {
@@ -168,6 +172,8 @@
 	}
 
 	/**
+	 * Get the "http.followRedirects" setting
+	 *
 	 * @return the value of the "http.followRedirects" setting
 	 */
 	public HttpRedirectMode getFollowRedirects() {
@@ -175,6 +181,8 @@
 	}
 
 	/**
+	 * Get the "http.maxRedirects" setting
+	 *
 	 * @return the value of the "http.maxRedirects" setting
 	 */
 	public int getMaxRedirects() {
@@ -182,10 +190,11 @@
 	}
 
 	/**
-	 * Creates a new {@link HttpConfig} tailored to the given {@link URIish}.
+	 * Creates a new {@link org.eclipse.jgit.transport.HttpConfig} tailored to
+	 * the given {@link org.eclipse.jgit.transport.URIish}.
 	 *
 	 * @param config
-	 *            to read the {@link HttpConfig} from
+	 *            to read the {@link org.eclipse.jgit.transport.HttpConfig} from
 	 * @param uri
 	 *            to get the configuration values for
 	 */
@@ -194,8 +203,8 @@
 	}
 
 	/**
-	 * Creates a {@link HttpConfig} that reads values solely from the user
-	 * config.
+	 * Creates a {@link org.eclipse.jgit.transport.HttpConfig} that reads values
+	 * solely from the user config.
 	 *
 	 * @param uri
 	 *            to get the configuration values for
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpTransport.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpTransport.java
index 006e846..d114186 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpTransport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpTransport.java
@@ -62,7 +62,11 @@
 	protected static HttpConnectionFactory connectionFactory = new JDKHttpConnectionFactory();
 
 	/**
-	 * @return the {@link HttpConnectionFactory} used to create new connections
+	 * Get the {@link org.eclipse.jgit.transport.http.HttpConnectionFactory}
+	 * used to create new connections
+	 *
+	 * @return the {@link org.eclipse.jgit.transport.http.HttpConnectionFactory}
+	 *         used to create new connections
 	 * @since 3.3
 	 */
 	public static HttpConnectionFactory getConnectionFactory() {
@@ -70,10 +74,11 @@
 	}
 
 	/**
-	 * Set the {@link HttpConnectionFactory} to be used to create new
-	 * connections
+	 * Set the {@link org.eclipse.jgit.transport.http.HttpConnectionFactory} to
+	 * be used to create new connections
 	 *
 	 * @param cf
+	 *            connection factory
 	 * @since 3.3
 	 */
 	public static void setConnectionFactory(HttpConnectionFactory cf) {
@@ -98,7 +103,7 @@
 	/**
 	 * Create a minimal HTTP transport instance not tied to a single repository.
 	 *
-	 * @param uri
+	 * @param uri a {@link org.eclipse.jgit.transport.URIish} object.
 	 */
 	protected HttpTransport(URIish uri) {
 		super(uri);
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 bea8d60..9fb9062 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalFetchConnection.java
@@ -57,6 +57,21 @@
 class InternalFetchConnection<C> extends BasePackFetchConnection {
 	private Thread worker;
 
+	/**
+	 * Constructor for InternalFetchConnection.
+	 *
+	 * @param transport
+	 *            a {@link org.eclipse.jgit.transport.PackTransport}
+	 * @param uploadPackFactory
+	 *            a
+	 *            {@link org.eclipse.jgit.transport.resolver.UploadPackFactory}
+	 * @param req
+	 *            request
+	 * @param remote
+	 *            the remote {@link org.eclipse.jgit.lib.Repository}
+	 * @throws org.eclipse.jgit.errors.TransportException
+	 *             if any.
+	 */
 	public InternalFetchConnection(PackTransport transport,
 			final UploadPackFactory<C> uploadPackFactory,
 			final C req, final Repository remote) throws TransportException {
@@ -125,6 +140,7 @@
 		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 8a1884e..732be63 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalPushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalPushConnection.java
@@ -57,6 +57,21 @@
 class InternalPushConnection<C> extends BasePackPushConnection {
 	private Thread worker;
 
+	/**
+	 * Constructor for InternalPushConnection.
+	 *
+	 * @param transport
+	 *            a {@link org.eclipse.jgit.transport.PackTransport}
+	 * @param receivePackFactory
+	 *            a
+	 *            {@link org.eclipse.jgit.transport.resolver.ReceivePackFactory}
+	 * @param req
+	 *            a request
+	 * @param remote
+	 *            the {@link org.eclipse.jgit.lib.Repository}
+	 * @throws org.eclipse.jgit.errors.TransportException
+	 *             if any.
+	 */
 	public InternalPushConnection(PackTransport transport,
 			final ReceivePackFactory<C> receivePackFactory,
 			final C req, final Repository remote) throws TransportException {
@@ -115,6 +130,7 @@
 		readAdvertisedRefs();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		super.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
index 0cc40f3..c381827 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
@@ -73,7 +73,6 @@
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
-import com.jcraft.jsch.UserInfo;
 
 /**
  * The base session factory that loads known hosts and private keys from
@@ -84,8 +83,8 @@
  * used by C Git.
  * <p>
  * The factory does not provide UI behavior. Override the method
- * {@link #configure(org.eclipse.jgit.transport.OpenSshConfig.Host, Session)}
- * to supply appropriate {@link UserInfo} to the session.
+ * {@link #configure(org.eclipse.jgit.transport.OpenSshConfig.Host, Session)} to
+ * supply appropriate {@link com.jcraft.jsch.UserInfo} to the session.
  */
 public abstract class JschConfigSessionFactory extends SshSessionFactory {
 
@@ -106,6 +105,7 @@
 
 	private OpenSshConfig config;
 
+	/** {@inheritDoc} */
 	@Override
 	public synchronized RemoteSession getSession(URIish uri,
 			CredentialsProvider credentialsProvider, FS fs, int tms)
@@ -263,7 +263,7 @@
 	 *            the file system abstraction which will be necessary to
 	 *            perform certain file system operations.
 	 * @return new session instance, but otherwise unconfigured.
-	 * @throws JSchException
+	 * @throws com.jcraft.jsch.JSchException
 	 *             the session could not be created.
 	 */
 	protected Session createSession(final OpenSshConfig.Host hc,
@@ -287,7 +287,8 @@
 
 	/**
 	 * Provide additional configuration for the session based on the host
-	 * information. This method could be used to supply {@link UserInfo}.
+	 * information. This method could be used to supply
+	 * {@link com.jcraft.jsch.UserInfo}.
 	 *
 	 * @param hc
 	 *            host configuration
@@ -305,7 +306,7 @@
 	 *            the file system abstraction which will be necessary to
 	 *            perform certain file system operations.
 	 * @return the JSch instance to use.
-	 * @throws JSchException
+	 * @throws com.jcraft.jsch.JSchException
 	 *             the user configuration could not be created.
 	 */
 	protected JSch getJSch(final OpenSshConfig.Host hc, FS fs) throws JSchException {
@@ -339,11 +340,13 @@
 	}
 
 	/**
+	 * Create default instance of jsch
+	 *
 	 * @param fs
-	 *            the file system abstraction which will be necessary to
-	 *            perform certain file system operations.
+	 *            the file system abstraction which will be necessary to perform
+	 *            certain file system operations.
 	 * @return the new default JSch implementation.
-	 * @throws JSchException
+	 * @throws com.jcraft.jsch.JSchException
 	 *             known host keys cannot be loaded.
 	 */
 	protected JSch createDefaultJSch(FS fs) throws JSchException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschSession.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschSession.java
index a8cc032..081d057 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschSession.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschSession.java
@@ -66,8 +66,8 @@
  * Run remote commands using Jsch.
  * <p>
  * This class is the default session implementation using Jsch. Note that
- * {@link JschConfigSessionFactory} is used to create the actual session passed
- * to the constructor.
+ * {@link org.eclipse.jgit.transport.JschConfigSessionFactory} is used to create
+ * the actual session passed to the constructor.
  */
 public class JschSession implements RemoteSession {
 	final Session sock;
@@ -87,11 +87,13 @@
 		this.uri = uri;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Process exec(String command, int timeout) throws IOException {
 		return new JschProcess(command, timeout);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void disconnect() {
 		if (sock.isConnected())
@@ -99,12 +101,13 @@
 	}
 
 	/**
-	 * A kludge to allow {@link TransportSftp} to get an Sftp channel from Jsch.
-	 * Ideally, this method would be generic, which would require implementing
-	 * generic Sftp channel operations in the RemoteSession class.
+	 * A kludge to allow {@link org.eclipse.jgit.transport.TransportSftp} to get
+	 * an Sftp channel from Jsch. Ideally, this method would be generic, which
+	 * would require implementing generic Sftp channel operations in the
+	 * RemoteSession class.
 	 *
 	 * @return a channel suitable for Sftp operations.
-	 * @throws JSchException
+	 * @throws com.jcraft.jsch.JSchException
 	 *             on problems getting the channel.
 	 */
 	public Channel getSftpChannel() throws JSchException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRC.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRC.java
index 5727b03..e3f287b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRC.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRC.java
@@ -143,7 +143,9 @@
 		COMMAND, MACHINE, LOGIN, PASSWORD, DEFAULT, ACCOUNT, MACDEF
 	}
 
-	/** */
+	/**
+	 * <p>Constructor for NetRC.</p>
+	 */
 	public NetRC() {
 		netrc = getDefaultFile();
 		if (netrc != null)
@@ -151,6 +153,8 @@
 	}
 
 	/**
+	 * <p>Constructor for NetRC.</p>
+	 *
 	 * @param netrc
 	 *            the .netrc file
 	 */
@@ -176,6 +180,7 @@
 	 * Get entry by host name
 	 *
 	 * @param host
+	 *            the host name
 	 * @return entry associated with host name or null
 	 */
 	public NetRCEntry getEntry(String host) {
@@ -194,6 +199,8 @@
 	}
 
 	/**
+	 * Get all entries collected from .netrc file
+	 *
 	 * @return all entries collected from .netrc file
 	 */
 	public Collection<NetRCEntry> getEntries() {
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 4037545..6531b17 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRCCredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NetRCCredentialsProvider.java
@@ -54,7 +54,9 @@
 
 	NetRC netrc = new NetRC();
 
-	/** */
+	/**
+	 * <p>Constructor for NetRCCredentialsProvider.</p>
+	 */
 	public NetRCCredentialsProvider() {
 	}
 
@@ -65,6 +67,7 @@
 		CredentialsProvider.setDefault(new NetRCCredentialsProvider());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -78,6 +81,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean get(URIish uri, CredentialItem... items)
 			throws UnsupportedCredentialItem {
@@ -108,6 +112,7 @@
 		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 d1ea089..51fe907 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/NonceGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/NonceGenerator.java
@@ -55,6 +55,8 @@
 public interface NonceGenerator {
 
 	/**
+	 * Create nonce to be signed by the pusher
+	 *
 	 * @param db
 	 *            The repository which should be used to obtain a unique String
 	 *            such that the pusher cannot forge nonces by pushing to another
@@ -62,12 +64,14 @@
 	 * @param timestamp
 	 *            The current time in seconds.
 	 * @return The nonce to be signed by the pusher
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 */
 	public String createNonce(Repository db, long timestamp)
 			throws IllegalStateException;
 
 	/**
+	 * Verify trustworthiness of the received nonce.
+	 *
 	 * @param received
 	 *            The nonce which was received from the server
 	 * @param sent
@@ -76,7 +80,6 @@
 	 *            The repository which should be used to obtain a unique String
 	 *            such that the pusher cannot forge nonces by pushing to another
 	 *            repository at the same time as well and reusing the nonce.
-	 *
 	 * @param allowSlop
 	 *            If the receiving backend is is able to generate slop. This is
 	 *            the case for serving via http protocol using more than one
@@ -85,7 +88,6 @@
 	 * @param slop
 	 *            If `allowSlop` is true, this specifies the number of seconds
 	 *            which we allow as slop.
-	 *
 	 * @return a NonceStatus indicating the trustworthiness of the received
 	 *         nonce.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectCountCallback.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectCountCallback.java
index cf81adb..3856bb2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectCountCallback.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ObjectCountCallback.java
@@ -45,7 +45,6 @@
 
 import java.io.OutputStream;
 
-import org.eclipse.jgit.internal.storage.pack.PackWriter;
 import org.eclipse.jgit.lib.ProgressMonitor;
 
 /**
@@ -55,19 +54,20 @@
  */
 public interface ObjectCountCallback {
 	/**
-	 * Invoked when the {@link PackWriter} has counted the objects to be
-	 * written to pack.
+	 * Invoked when the
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackWriter} has counted the
+	 * objects to be written to pack.
 	 * <p>
-	 * An {@code ObjectCountCallback} can use this information to decide
-	 * whether the
-	 * {@link PackWriter#writePack(ProgressMonitor, ProgressMonitor, OutputStream)}
+	 * An {@code ObjectCountCallback} can use this information to decide whether
+	 * the
+	 * {@link org.eclipse.jgit.internal.storage.pack.PackWriter#writePack(ProgressMonitor, ProgressMonitor, OutputStream)}
 	 * operation should be aborted.
 	 * <p>
 	 * This callback will be called exactly once.
 	 *
 	 * @param objectCount
 	 *            the count of the objects.
-	 * @throws WriteAbortedException
+	 * @throws org.eclipse.jgit.transport.WriteAbortedException
 	 *             to indicate that the write operation should be aborted.
 	 */
 	void setObjectCount(long objectCount) throws WriteAbortedException;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/OpenSshConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/OpenSshConfig.java
index b5d5099..4660c40 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/OpenSshConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/OpenSshConfig.java
@@ -84,9 +84,11 @@
  * </ul>
  * <p>
  * Therefore implement our own parser to read an OpenSSH configuration file. It
- * makes the critical options available to {@link SshSessionFactory} via
- * {@link Host} objects returned by {@link #lookup(String)}, and implements a
- * fully conforming {@link ConfigRepository} providing
+ * makes the critical options available to
+ * {@link org.eclipse.jgit.transport.SshSessionFactory} via
+ * {@link org.eclipse.jgit.transport.OpenSshConfig.Host} objects returned by
+ * {@link #lookup(String)}, and implements a fully conforming
+ * {@link com.jcraft.jsch.ConfigRepository} providing
  * {@link com.jcraft.jsch.ConfigRepository.Config}s via
  * {@link #getConfig(String)}.
  * </p>
@@ -103,7 +105,7 @@
  * ConfigRepository OTOH treats all option values as plain strings, so any
  * validation must happen in Jsch outside of the parser. Thus this parser does
  * not validate option values, except for a few options when constructing a
- * {@link Host} object.
+ * {@link org.eclipse.jgit.transport.OpenSshConfig.Host} object.
  * </p>
  * <p>
  * This config does %-substitutions for the following tokens:
@@ -960,12 +962,11 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Retrieves the full {@link com.jcraft.jsch.ConfigRepository.Config Config}
 	 * for the given host name. Should be called only by Jsch and tests.
 	 *
-	 * @param hostName
-	 *            to get the config for
-	 * @return the configuration for the host
 	 * @since 4.9
 	 */
 	@Override
@@ -974,6 +975,7 @@
 		return host.getConfig();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
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 833d211..af5a0b7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
@@ -76,7 +76,6 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdOwnerMap;
 import org.eclipse.jgit.lib.ObjectIdSubclassMap;
-import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ObjectStream;
@@ -88,14 +87,16 @@
 import org.eclipse.jgit.util.sha1.SHA1;
 
 /**
- * Parses a pack stream and imports it for an {@link ObjectInserter}.
+ * Parses a pack stream and imports it for an
+ * {@link org.eclipse.jgit.lib.ObjectInserter}.
  * <p>
  * Applications can acquire an instance of a parser from ObjectInserter's
- * {@link ObjectInserter#newPackParser(InputStream)} method.
+ * {@link org.eclipse.jgit.lib.ObjectInserter#newPackParser(InputStream)}
+ * method.
  * <p>
- * Implementations of {@link ObjectInserter} should subclass this type and
- * provide their own logic for the various {@code on*()} event methods declared
- * to be abstract.
+ * Implementations of {@link org.eclipse.jgit.lib.ObjectInserter} should
+ * subclass this type and provide their own logic for the various {@code on*()}
+ * event methods declared to be abstract.
  */
 public abstract class PackParser {
 	/** Size of the internal stream buffer. */
@@ -213,7 +214,11 @@
 		checkObjectCollisions = true;
 	}
 
-	/** @return true if a thin pack (missing base objects) is permitted. */
+	/**
+	 * Whether a thin pack (missing base objects) is permitted.
+	 *
+	 * @return {@code true} if a thin pack (missing base objects) is permitted.
+	 */
 	public boolean isAllowThin() {
 		return allowThin;
 	}
@@ -232,6 +237,8 @@
 	}
 
 	/**
+	 * Whether received objects are verified to prevent collisions.
+	 *
 	 * @return if true received objects are verified to prevent collisions.
 	 * @since 4.1
 	 */
@@ -300,7 +307,11 @@
 		this.needBaseObjectIds = b;
 	}
 
-	/** @return true if the EOF should be read from the input after the footer. */
+	/**
+	 * Whether the EOF should be read from the input after the footer.
+	 *
+	 * @return true if the EOF should be read from the input after the footer.
+	 */
 	public boolean isCheckEofAfterPackFooter() {
 		return checkEofAfterPackFooter;
 	}
@@ -315,12 +326,18 @@
 		checkEofAfterPackFooter = b;
 	}
 
-	/** @return true if there is data expected after the pack footer. */
+	/**
+	 * Whether there is data expected after the pack footer.
+	 *
+	 * @return true if there is data expected after the pack footer.
+	 */
 	public boolean isExpectDataAfterPackFooter() {
 		return expectDataAfterPackFooter;
 	}
 
 	/**
+	 * Set if there is additional data in InputStream after pack.
+	 *
 	 * @param e
 	 *            true if there is additional data in InputStream after pack.
 	 *            This requires the InputStream to support the mark and reset
@@ -330,14 +347,22 @@
 		expectDataAfterPackFooter = e;
 	}
 
-	/** @return the new objects that were sent by the user */
+	/**
+	 * Get the new objects that were sent by the user
+	 *
+	 * @return the new objects that were sent by the user
+	 */
 	public ObjectIdSubclassMap<ObjectId> getNewObjectIds() {
 		if (newObjectIds != null)
 			return newObjectIds;
 		return new ObjectIdSubclassMap<>();
 	}
 
-	/** @return set of objects the incoming pack assumed for delta purposes */
+	/**
+	 * Get set of objects the incoming pack assumed for delta purposes
+	 *
+	 * @return set of objects the incoming pack assumed for delta purposes
+	 */
 	public ObjectIdSubclassMap<ObjectId> getBaseObjectIds() {
 		if (baseObjectIds != null)
 			return baseObjectIds;
@@ -378,7 +403,11 @@
 		setObjectChecker(on ? new ObjectChecker() : null);
 	}
 
-	/** @return the message to record with the pack lock. */
+	/**
+	 * Get the message to record with the pack lock.
+	 *
+	 * @return the message to record with the pack lock.
+	 */
 	public String getLockMessage() {
 		return lockMessage;
 	}
@@ -420,7 +449,7 @@
 		return entryCount;
 	}
 
-	/***
+	/**
 	 * Get the information about the requested object.
 	 * <p>
 	 * The object information is only available after
@@ -477,7 +506,7 @@
 	 * <p>
 	 * This should only be called after pack parsing is finished.
 	 *
-	 * @return {@link ReceivedPackStatistics}
+	 * @return {@link org.eclipse.jgit.transport.ReceivedPackStatistics}
 	 * @since 4.6
 	 */
 	public ReceivedPackStatistics getReceivedPackStatistics() {
@@ -489,10 +518,10 @@
 	 *
 	 * @param progress
 	 *            callback to provide progress feedback during parsing. If null,
-	 *            {@link NullProgressMonitor} will be used.
+	 *            {@link org.eclipse.jgit.lib.NullProgressMonitor} will be used.
 	 * @return the pack lock, if one was requested by setting
 	 *         {@link #setLockMessage(String)}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream is malformed, or contains corrupt objects.
 	 * @since 3.0
 	 */
@@ -505,13 +534,13 @@
 	 *
 	 * @param receiving
 	 *            receives progress feedback during the initial receiving
-	 *            objects phase. If null, {@link NullProgressMonitor} will be
-	 *            used.
+	 *            objects phase. If null,
+	 *            {@link org.eclipse.jgit.lib.NullProgressMonitor} will be used.
 	 * @param resolving
 	 *            receives progress feedback during the resolving objects phase.
 	 * @return the pack lock, if one was requested by setting
 	 *         {@link #setLockMessage(String)}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream is malformed, or contains corrupt objects.
 	 * @since 3.0
 	 */
@@ -701,7 +730,7 @@
 
 	private final void checkIfTooLarge(int typeCode, long size)
 			throws IOException {
-		if (0 < maxObjectSizeLimit && maxObjectSizeLimit < size)
+		if (0 < maxObjectSizeLimit && maxObjectSizeLimit < size) {
 			switch (typeCode) {
 			case Constants.OBJ_COMMIT:
 			case Constants.OBJ_TREE:
@@ -711,13 +740,17 @@
 
 			case Constants.OBJ_OFS_DELTA:
 			case Constants.OBJ_REF_DELTA:
-				throw new TooLargeObjectInPackException(maxObjectSizeLimit);
+				throw new TooLargeObjectInPackException(size, maxObjectSizeLimit);
 
 			default:
 				throw new IOException(MessageFormat.format(
 						JGitText.get().unknownObjectType,
 						Integer.valueOf(typeCode)));
 			}
+		}
+		if (size > Integer.MAX_VALUE - 8) {
+			throw new TooLargeObjectInPackException(size, Integer.MAX_VALUE - 8);
+		}
 	}
 
 	/**
@@ -733,7 +766,7 @@
 	 * @param info
 	 *            the info object to populate.
 	 * @return {@code info}, after populating.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the size cannot be read.
 	 */
 	protected ObjectTypeAndSize readObjectHeader(ObjectTypeAndSize info)
@@ -1093,9 +1126,8 @@
 	 *            the type of the object.
 	 * @param data
 	 *            raw content of the object.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 * @since 4.9
-	 *
 	 */
 	protected void verifySafeObject(final AnyObjectId id, final int type,
 			final byte[] data) throws CorruptObjectException {
@@ -1261,7 +1293,11 @@
 		bOffset = 0;
 	}
 
-	/** @return a temporary byte array for use by the caller. */
+	/**
+	 * Get a temporary byte array for use by the caller.
+	 *
+	 * @return a temporary byte array for use by the caller.
+	 */
 	protected byte[] buffer() {
 		return tempBuffer;
 	}
@@ -1298,7 +1334,7 @@
 	 * If external implementation wants to overwrite the expectedObjectCount,
 	 * they should call this method during {@link #onPackHeader(long)}.
 	 *
-	 * @param expectedObjectCount
+	 * @param expectedObjectCount a long.
 	 * @since 4.9
 	 */
 	protected void setExpectedObjectCount(long expectedObjectCount) {
@@ -1323,7 +1359,7 @@
 	 *            first offset within the buffer that is valid.
 	 * @param len
 	 *            number of bytes in the buffer that are valid.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be archived.
 	 */
 	protected abstract void onStoreStream(byte[] raw, int pos, int len)
@@ -1343,7 +1379,7 @@
 	 *            first offset within buffer that is valid.
 	 * @param len
 	 *            number of bytes in buffer that are valid.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be archived.
 	 */
 	protected abstract void onObjectHeader(Source src, byte[] raw, int pos,
@@ -1366,7 +1402,7 @@
 	 *            first offset within buffer that is valid.
 	 * @param len
 	 *            number of bytes in buffer that are valid.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be archived.
 	 */
 	protected abstract void onObjectData(Source src, byte[] raw, int pos,
@@ -1381,7 +1417,7 @@
 	 *            the type of the object.
 	 * @param data
 	 *            inflated data for the object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be archived.
 	 */
 	protected abstract void onInflatedObjectData(PackedObjectInfo obj,
@@ -1392,7 +1428,7 @@
 	 *
 	 * @param objCnt
 	 *            number of objects expected in the stream.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the implementation refuses to work with this many objects.
 	 */
 	protected abstract void onPackHeader(long objCnt) throws IOException;
@@ -1403,7 +1439,7 @@
 	 * @param hash
 	 *            the trailing 20 bytes of the pack, this is a SHA-1 checksum of
 	 *            all of the pack data.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be archived.
 	 */
 	protected abstract void onPackFooter(byte[] hash) throws IOException;
@@ -1426,7 +1462,7 @@
 	 * @return true if the {@code info} should be included in the object list
 	 *         returned by {@link #getSortedObjectList(Comparator)}, false if it
 	 *         should not be included.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the base could not be included into the pack.
 	 */
 	protected abstract boolean onAppendBase(int typeCode, byte[] data,
@@ -1439,7 +1475,7 @@
 	 * external from the pack. The event is called after all of those deltas
 	 * have been resolved.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the pack cannot be archived.
 	 */
 	protected abstract void onEndThinPack() throws IOException;
@@ -1456,7 +1492,7 @@
 	 * @param info
 	 *            object to populate with type and size.
 	 * @return the {@code info} object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database cannot reposition to this location.
 	 */
 	protected abstract ObjectTypeAndSize seekDatabase(PackedObjectInfo obj,
@@ -1474,7 +1510,7 @@
 	 * @param info
 	 *            object to populate with type and size.
 	 * @return the {@code info} object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database cannot reposition to this location.
 	 */
 	protected abstract ObjectTypeAndSize seekDatabase(UnresolvedDelta delta,
@@ -1491,7 +1527,7 @@
 	 *            ideal target number of bytes to read. Actual read length may
 	 *            be shorter.
 	 * @return number of bytes stored.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the database cannot be accessed.
 	 */
 	protected abstract int readDatabase(byte[] dst, int pos, int cnt)
@@ -1521,13 +1557,15 @@
 	 * @param streamPosition
 	 *            position of this object in the incoming stream.
 	 * @param type
-	 *            type of the object; one of {@link Constants#OBJ_COMMIT},
-	 *            {@link Constants#OBJ_TREE}, {@link Constants#OBJ_BLOB}, or
-	 *            {@link Constants#OBJ_TAG}.
+	 *            type of the object; one of
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_COMMIT},
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_TREE},
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_BLOB}, or
+	 *            {@link org.eclipse.jgit.lib.Constants#OBJ_TAG}.
 	 * @param inflatedSize
 	 *            size of the object when fully inflated. The size stored within
 	 *            the pack may be larger or smaller, and is not yet known.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be recorded.
 	 */
 	protected abstract void onBeginWholeObject(long streamPosition, int type,
@@ -1538,7 +1576,7 @@
 	 *
 	 *@param info
 	 *            object information.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be recorded.
 	 */
 	protected abstract void onEndWholeObject(PackedObjectInfo info)
@@ -1557,7 +1595,7 @@
 	 * @param inflatedSize
 	 *            size of the delta when fully inflated. The size stored within
 	 *            the pack may be larger or smaller, and is not yet known.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be recorded.
 	 */
 	protected abstract void onBeginOfsDelta(long deltaStreamPosition,
@@ -1575,7 +1613,7 @@
 	 * @param inflatedSize
 	 *            size of the delta when fully inflated. The size stored within
 	 *            the pack may be larger or smaller, and is not yet known.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be recorded.
 	 */
 	protected abstract void onBeginRefDelta(long deltaStreamPosition,
@@ -1586,7 +1624,7 @@
 	 *
 	 *@return object information that must be populated with at least the
 	 *         offset.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the object cannot be recorded.
 	 */
 	protected UnresolvedDelta onEndDelta() throws IOException {
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 381c228..80fc0b4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackedObjectInfo.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackedObjectInfo.java
@@ -80,6 +80,8 @@
 	}
 
 	/**
+	 * Get offset in pack when object has been already written
+	 *
 	 * @return offset in pack when object has been already written, or 0 if it
 	 *         has not been written yet
 	 */
@@ -98,6 +100,8 @@
 	}
 
 	/**
+	 * Get the 32 bit CRC checksum for the packed data.
+	 *
 	 * @return the 32 bit CRC checksum for the packed data.
 	 */
 	public int getCRC() {
@@ -117,6 +121,8 @@
 	}
 
 	/**
+	 * Get the object type.
+	 *
 	 * @return the object type. The default type is OBJ_BAD, which is considered
 	 *         as unknown or invalid type.
 	 * @since 4.9
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
index e709256..87064e1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java
@@ -148,7 +148,7 @@
 	 *
 	 * @return the string. {@link #END} if the string was the magic flush
 	 *         packet.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be read.
 	 */
 	public String readString() throws IOException {
@@ -186,7 +186,7 @@
 	 *
 	 * @return the string. {@link #END} if the string was the magic flush
 	 *         packet.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the stream cannot be read.
 	 */
 	public String readStringRaw() throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineOut.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineOut.java
index a6bd342..48bdd01 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineOut.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineOut.java
@@ -100,7 +100,7 @@
 	 *
 	 * @param s
 	 *            string to write.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packet could not be written, the stream is corrupted as
 	 *             the packet may have been only partially written.
 	 */
@@ -114,7 +114,7 @@
 	 * @param packet
 	 *            the packet to write; the length of the packet is equal to the
 	 *            size of the byte array.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packet could not be written, the stream is corrupted as
 	 *             the packet may have been only partially written.
 	 */
@@ -131,7 +131,7 @@
 	 *            first index within {@code buf}.
 	 * @param len
 	 *            number of bytes to write.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the packet could not be written, the stream is corrupted as
 	 *             the packet may have been only partially written.
 	 * @since 4.5
@@ -155,7 +155,7 @@
 	 * Implicitly performs a flush on the underlying OutputStream to ensure the
 	 * peer will receive all data written thus far.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the end marker could not be written, the stream is corrupted
 	 *             as the end marker may have been only partially written.
 	 */
@@ -173,7 +173,7 @@
 	 * Performs a flush on the underlying OutputStream to ensure the peer will
 	 * receive all data written thus far.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying stream failed to flush.
 	 */
 	public void flush() throws IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHook.java
index 8e39501..5cbb6f5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostReceiveHook.java
@@ -46,11 +46,13 @@
 import java.util.Collection;
 
 /**
- * Hook invoked by {@link ReceivePack} after all updates are executed.
+ * Hook invoked by {@link org.eclipse.jgit.transport.ReceivePack} after all
+ * updates are executed.
  * <p>
  * The hook is called after all commands have been processed. Only commands with
- * a status of {@link ReceiveCommand.Result#OK} are passed into the hook. To get
- * all commands within the hook, see {@link ReceivePack#getAllCommands()}.
+ * a status of {@link org.eclipse.jgit.transport.ReceiveCommand.Result#OK} are
+ * passed into the hook. To get all commands within the hook, see
+ * {@link org.eclipse.jgit.transport.ReceivePack#getAllCommands()}.
  * <p>
  * Any post-receive hook implementation should not update the status of a
  * command, as the command has already completed or failed, and the status has
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 3bdcd68..0bdf7d4 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,8 @@
 import java.util.List;
 
 /**
- * {@link PostReceiveHook} that delegates to a list of other hooks.
+ * {@link org.eclipse.jgit.transport.PostReceiveHook} that delegates to a list
+ * of other hooks.
  * <p>
  * Hooks are run in the order passed to the constructor.
  */
@@ -77,6 +78,7 @@
 			return new PostReceiveHookChain(newHooks, i);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onPostReceive(ReceivePack rp,
 			Collection<ReceiveCommand> commands) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHook.java
index 5b37bcd..09667eb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHook.java
@@ -42,11 +42,11 @@
 
 package org.eclipse.jgit.transport;
 
-import org.eclipse.jgit.internal.storage.pack.PackWriter;
 import org.eclipse.jgit.storage.pack.PackStatistics;
 
 /**
- * Hook invoked by {@link UploadPack} after the pack has been uploaded.
+ * Hook invoked by {@link org.eclipse.jgit.transport.UploadPack} after the pack
+ * has been uploaded.
  * <p>
  * Implementors of the interface are responsible for associating the current
  * thread to a particular connection, if they need to also include connection
@@ -68,8 +68,9 @@
 	 * Notifies the hook that a pack has been sent.
 	 *
 	 * @param stats
-	 *            the statistics gathered by {@link PackWriter} for the uploaded
-	 *            pack
+	 *            the statistics gathered by
+	 *            {@link org.eclipse.jgit.internal.storage.pack.PackWriter} for
+	 *            the uploaded pack
 	 */
 	public void onPostUpload(PackStatistics stats);
 }
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 26323ba..542abe7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PostUploadHookChain.java
@@ -47,7 +47,8 @@
 import org.eclipse.jgit.storage.pack.PackStatistics;
 
 /**
- * {@link PostUploadHook} that delegates to a list of other hooks.
+ * {@link org.eclipse.jgit.transport.PostUploadHook} that delegates to a list of
+ * other hooks.
  * <p>
  * Hooks are run in the order passed to the constructor.
  *
@@ -78,6 +79,7 @@
 			return new PostUploadHookChain(newHooks, i);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onPostUpload(PackStatistics stats) {
 		for (int i = 0; i < count; i++)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHook.java
index 27b2df0..77c1a8a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHook.java
@@ -46,7 +46,8 @@
 import java.util.Collection;
 
 /**
- * Hook invoked by {@link ReceivePack} before any updates are executed.
+ * Hook invoked by {@link org.eclipse.jgit.transport.ReceivePack} before any
+ * updates are executed.
  * <p>
  * The hook is called with any commands that are deemed valid after parsing them
  * from the client and applying the standard receive configuration options to
@@ -57,23 +58,24 @@
  * </ul>
  * This means the hook will not receive a non-fast-forward update command if
  * denyNonFastForwards is set to true in the configuration file. To get all
- * commands within the hook, see {@link ReceivePack#getAllCommands()}.
+ * commands within the hook, see
+ * {@link org.eclipse.jgit.transport.ReceivePack#getAllCommands()}.
  * <p>
  * As the hook is invoked prior to the commands being executed, the hook may
  * choose to block any command by setting its result status with
- * {@link ReceiveCommand#setResult(ReceiveCommand.Result)}.
+ * {@link org.eclipse.jgit.transport.ReceiveCommand#setResult(ReceiveCommand.Result)}.
  * <p>
  * The hook may also choose to perform the command itself (or merely pretend
  * that it has performed the command), by setting the result status to
- * {@link ReceiveCommand.Result#OK}.
+ * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#OK}.
  * <p>
  * Hooks should run quickly, as they block the caller thread and the client
  * process from completing.
  * <p>
  * Hooks may send optional messages back to the client via methods on
- * {@link ReceivePack}. Implementors should be aware that not all network
- * transports support this output, so some (or all) messages may simply be
- * discarded. These messages should be advisory only.
+ * {@link org.eclipse.jgit.transport.ReceivePack}. Implementors should be aware
+ * that not all network transports support this output, so some (or all)
+ * messages may simply be discarded. These messages should be advisory only.
  */
 public interface PreReceiveHook {
 	/** A simple no-op hook. */
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 7b1c8fb..47b94c6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreReceiveHookChain.java
@@ -47,7 +47,8 @@
 import java.util.List;
 
 /**
- * {@link PreReceiveHook} that delegates to a list of other hooks.
+ * {@link org.eclipse.jgit.transport.PreReceiveHook} that delegates to a list of
+ * other hooks.
  * <p>
  * Hooks are run in the order passed to the constructor.
  */
@@ -76,6 +77,7 @@
 			return new PreReceiveHookChain(newHooks, i);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onPreReceive(ReceivePack rp,
 			Collection<ReceiveCommand> commands) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHook.java
index 7d9638c..2e1cd58 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHook.java
@@ -48,9 +48,11 @@
 import org.eclipse.jgit.lib.ObjectId;
 
 /**
- * Hook invoked by {@link UploadPack} before during critical phases.
+ * Hook invoked by {@link org.eclipse.jgit.transport.UploadPack} before during
+ * critical phases.
  * <p>
- * If any hook function throws {@link ServiceMayNotContinueException} then
+ * If any hook function throws
+ * {@link org.eclipse.jgit.transport.ServiceMayNotContinueException} then
  * processing stops immediately and the exception is thrown up the call stack.
  * Most phases of UploadPack will try to report the exception's message text to
  * the end-user over the client's protocol connection.
@@ -91,7 +93,7 @@
 	 *            the list of wanted objects.
 	 * @param cntOffered
 	 *            number of objects the client has offered.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	public void onBeginNegotiateRound(UploadPack up,
@@ -115,7 +117,7 @@
 	 * @param ready
 	 *            true if a pack is ready to be sent (the commit graph was
 	 *            successfully cut).
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	public void onEndNegotiateRound(UploadPack up,
@@ -136,7 +138,7 @@
 	 *            the list of common objects. Empty on an initial clone request.
 	 *            These may be RevObject or RevCommit if the processed parsed
 	 *            them. Implementors should not rely on the values being parsed.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             abort; the message will be sent to the user.
 	 */
 	public void onSendPack(UploadPack up, Collection<? extends ObjectId> wants,
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 c9f88dd..bfd52af 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHookChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PreUploadHookChain.java
@@ -49,7 +49,8 @@
 import org.eclipse.jgit.lib.ObjectId;
 
 /**
- * {@link PreUploadHook} that delegates to a list of other hooks.
+ * {@link org.eclipse.jgit.transport.PreUploadHook} that delegates to a list of
+ * other hooks.
  * <p>
  * Hooks are run in the order passed to the constructor. If running a method on
  * one hook throws an exception, execution of remaining hook methods is aborted.
@@ -79,6 +80,7 @@
 			return new PreUploadHookChain(newHooks, i);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onBeginNegotiateRound(UploadPack up,
 			Collection<? extends ObjectId> wants, int cntOffered)
@@ -87,6 +89,7 @@
 			hooks[i].onBeginNegotiateRound(up, wants, cntOffered);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onEndNegotiateRound(UploadPack up,
 			Collection<? extends ObjectId> wants, int cntCommon,
@@ -96,6 +99,7 @@
 			hooks[i].onEndNegotiateRound(up, wants, cntCommon, cntNotFound, ready);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void onSendPack(UploadPack up,
 			Collection<? extends ObjectId> wants,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProgressSpinner.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProgressSpinner.java
index ac048a1..41af807 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProgressSpinner.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ProgressSpinner.java
@@ -104,7 +104,9 @@
 		}
 	}
 
-	/** Update the spinner if it is showing. */
+	/**
+	 * Update the spinner if it is showing.
+	 */
 	public void update() {
 		long now = System.currentTimeMillis();
 		if (now >= nextUpdateMillis) {
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 e450345..a9397a5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificate.java
@@ -132,6 +132,8 @@
 	}
 
 	/**
+	 * Get the certificate version string.
+	 *
 	 * @return the certificate version string.
 	 * @since 4.1
 	 */
@@ -140,6 +142,8 @@
 	}
 
 	/**
+	 * Get the raw line that signed the cert, as a string.
+	 *
 	 * @return the raw line that signed the cert, as a string.
 	 * @since 4.0
 	 */
@@ -148,6 +152,8 @@
 	}
 
 	/**
+	 * Get identity of the pusher who signed the cert.
+	 *
 	 * @return identity of the pusher who signed the cert.
 	 * @since 4.1
 	 */
@@ -156,6 +162,8 @@
 	}
 
 	/**
+	 * Get URL of the repository the push was originally sent to.
+	 *
 	 * @return URL of the repository the push was originally sent to.
 	 * @since 4.0
 	 */
@@ -164,6 +172,8 @@
 	}
 
 	/**
+	 * Get the raw nonce value that was presented by the pusher.
+	 *
 	 * @return the raw nonce value that was presented by the pusher.
 	 * @since 4.1
 	 */
@@ -172,6 +182,8 @@
 	}
 
 	/**
+	 * Get verification status of the nonce embedded in the certificate.
+	 *
 	 * @return verification status of the nonce embedded in the certificate.
 	 * @since 4.0
 	 */
@@ -180,6 +192,9 @@
 	}
 
 	/**
+	 * Get the list of commands as one string to be feed into the signature
+	 * verifier.
+	 *
 	 * @return the list of commands as one string to be feed into the signature
 	 *         verifier.
 	 * @since 4.1
@@ -189,9 +204,11 @@
 	}
 
 	/**
+	 * Get the raw signature
+	 *
 	 * @return the raw signature, consisting of the lines received between the
-	 *     lines {@code "----BEGIN GPG SIGNATURE-----\n"} and
-	 *     {@code "----END GPG SIGNATURE-----\n}", inclusive.
+	 *         lines {@code "----BEGIN GPG SIGNATURE-----\n"} and
+	 *         {@code "----END GPG SIGNATURE-----\n}", inclusive.
 	 * @since 4.0
 	 */
 	public String getSignature() {
@@ -199,6 +216,8 @@
 	}
 
 	/**
+	 * Get text payload of the certificate for the signature verifier.
+	 *
 	 * @return text payload of the certificate for the signature verifier.
 	 * @since 4.1
 	 */
@@ -207,8 +226,11 @@
 	}
 
 	/**
+	 * Get original text payload plus signature
+	 *
 	 * @return original text payload plus signature; the final output will be
-	 *     valid as input to {@link PushCertificateParser#fromString(String)}.
+	 *         valid as input to
+	 *         {@link org.eclipse.jgit.transport.PushCertificateParser#fromString(String)}.
 	 * @since 4.1
 	 */
 	public String toTextWithSignature() {
@@ -233,11 +255,13 @@
 		return sb;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		return signature.hashCode();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(Object o) {
 		if (!(o instanceof PushCertificate)) {
@@ -268,6 +292,7 @@
 		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 4c8acd2..f9fddbe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateIdent.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateIdent.java
@@ -58,18 +58,19 @@
 /**
  * Identity in a push certificate.
  * <p>
- * This is similar to a {@link PersonIdent} in that it contains a name,
- * timestamp, and timezone offset, but differs in the following ways:
+ * This is similar to a {@link org.eclipse.jgit.lib.PersonIdent} in that it
+ * contains a name, timestamp, and timezone offset, but differs in the following
+ * ways:
  * <ul>
  * <li>It is always parsed from a UTF-8 string, rather than a raw commit
- *   buffer.</li>
+ * buffer.</li>
  * <li>It is not guaranteed to contain a name and email portion, since any UTF-8
- *   string is a valid OpenPGP User ID (RFC4880 5.1.1). The raw User ID is
- *   always available as {@link #getUserId()}, but {@link #getEmailAddress()}
- *   may return null.</li>
- * <li>The raw text from which the identity was parsed is available with {@link
- *   #getRaw()}. This is necessary for losslessly reconstructing the signed push
- *   certificate payload.</li>
+ * string is a valid OpenPGP User ID (RFC4880 5.1.1). The raw User ID is always
+ * available as {@link #getUserId()}, but {@link #getEmailAddress()} may return
+ * null.</li>
+ * <li>The raw text from which the identity was parsed is available with
+ * {@link #getRaw()}. This is necessary for losslessly reconstructing the signed
+ * push certificate payload.</li>
  * <li>
  * </ul>
  *
@@ -79,18 +80,18 @@
 	/**
 	 * Parse an identity from a string.
 	 * <p>
-	 * Spaces are trimmed when parsing the timestamp and timezone offset, with one
-	 * exception. The timestamp must be preceded by a single space, and the rest
-	 * of the string prior to that space (including any additional whitespace) is
-	 * treated as the OpenPGP User ID.
+	 * Spaces are trimmed when parsing the timestamp and timezone offset, with
+	 * one exception. The timestamp must be preceded by a single space, and the
+	 * rest of the string prior to that space (including any additional
+	 * whitespace) is treated as the OpenPGP User ID.
 	 * <p>
-	 * If either the timestamp or timezone offsets are missing, mimics {@link
-	 * RawParseUtils#parsePersonIdent(String)} behavior and sets them both to
-	 * zero.
+	 * If either the timestamp or timezone offsets are missing, mimics
+	 * {@link RawParseUtils#parsePersonIdent(String)} behavior and sets them
+	 * both to zero.
 	 *
 	 * @param str
 	 *            string to parse.
-	 * @return identity, never null.
+	 * @return a {@link org.eclipse.jgit.transport.PushCertificateIdent} object.
 	 */
 	public static PushCertificateIdent parse(String str) {
 		MutableInteger p = new MutableInteger();
@@ -181,15 +182,21 @@
 		return raw;
 	}
 
-	/** @return the OpenPGP User ID, which may be any string. */
+	/**
+	 * Get the OpenPGP User ID, which may be any string.
+	 *
+	 * @return the OpenPGP User ID, which may be any string.
+	 */
 	public String getUserId() {
 		return userId;
 	}
 
 	/**
+	 * Get the name portion of the User ID.
+	 *
 	 * @return the name portion of the User ID. If no email address would be
-	 *         parsed by {@link #getEmailAddress()}, returns the full User ID with
-	 *         spaces trimmed.
+	 *         parsed by {@link #getEmailAddress()}, returns the full User ID
+	 *         with spaces trimmed.
 	 */
 	public String getName() {
 		int nameEnd = userId.indexOf('<');
@@ -208,6 +215,8 @@
 	}
 
 	/**
+	 * Get the email portion of the User ID
+	 *
 	 * @return the email portion of the User ID, if one was successfully parsed
 	 *         from {@link #getUserId()}, or null.
 	 */
@@ -223,19 +232,28 @@
 		return userId.substring(emailBegin + 1, emailEnd);
 	}
 
-	/** @return the timestamp of the identity. */
+	/**
+	 * Get the timestamp of the identity.
+	 *
+	 * @return the timestamp of the identity.
+	 */
 	public Date getWhen() {
 		return new Date(when);
 	}
 
 	/**
-	 * @return this person's declared time zone; null if the timezone is unknown.
+	 * Get this person's declared time zone
+	 *
+	 * @return this person's declared time zone; null if the timezone is
+	 *         unknown.
 	 */
 	public TimeZone getTimeZone() {
 		return PersonIdent.getTimeZone(tzOffset);
 	}
 
 	/**
+	 * Get this person's declared time zone as minutes east of UTC.
+	 *
 	 * @return this person's declared time zone as minutes east of UTC. If the
 	 *         timezone is to the west of UTC it is negative.
 	 */
@@ -243,17 +261,20 @@
 		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/PushCertificateParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateParser.java
index 5174f85..89c1a93 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateParser.java
@@ -133,11 +133,12 @@
 	/**
 	 * Parse a push certificate from a reader.
 	 * <p>
-	 * Differences from the {@link PacketLineIn} receiver methods:
+	 * Differences from the {@link org.eclipse.jgit.transport.PacketLineIn}
+	 * receiver methods:
 	 * <ul>
 	 * <li>Does not use pkt-line framing.</li>
 	 * <li>Reads an entire cert in one call rather than depending on a loop in
-	 *   the caller.</li>
+	 * the caller.</li>
 	 * <li>Does not assume a {@code "push-cert-end"} line.</li>
 	 * </ul>
 	 *
@@ -145,9 +146,9 @@
 	 *            input reader; consumed only up until the end of the next
 	 *            signature in the input.
 	 * @return the parsed certificate, or null if the reader was at EOF.
-	 * @throws PackProtocolException
+	 * @throws org.eclipse.jgit.errors.PackProtocolException
 	 *             if the certificate is malformed.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if there was an error reading from the input.
 	 * @since 4.1
 	 */
@@ -163,9 +164,9 @@
 	 * @param str
 	 *            input string.
 	 * @return the parsed certificate.
-	 * @throws PackProtocolException
+	 * @throws org.eclipse.jgit.errors.PackProtocolException
 	 *             if the certificate is malformed.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if there was an error reading from the input.
 	 * @since 4.1
 	 */
@@ -207,6 +208,8 @@
 	private final List<ReceiveCommand> commands = new ArrayList<>();
 
 	/**
+	 * <p>Constructor for PushCertificateParser.</p>
+	 *
 	 * @param into
 	 *            destination repository for the push.
 	 * @param cfg
@@ -240,9 +243,9 @@
 	 *            input reader; consumed only up until the end of the next
 	 *            signature in the input.
 	 * @return the parsed certificate, or null if the reader was at EOF.
-	 * @throws PackProtocolException
+	 * @throws org.eclipse.jgit.errors.PackProtocolException
 	 *             if the certificate is malformed.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if there was an error reading from the input.
 	 * @since 4.1
 	 */
@@ -267,8 +270,11 @@
 	}
 
 	/**
-	 * @return the parsed certificate, or null if push certificates are disabled.
-	 * @throws IOException
+	 * Build the parsed certificate
+	 *
+	 * @return the parsed certificate, or null if push certificates are
+	 *         disabled.
+	 * @throws java.io.IOException
 	 *             if the push certificate has missing or invalid fields.
 	 * @since 4.1
 	 */
@@ -285,6 +291,9 @@
 	}
 
 	/**
+	 * Whether the repository is configured to use signed pushes in this
+	 * context.
+	 *
 	 * @return if the repository is configured to use signed pushes in this
 	 *         context.
 	 * @since 4.0
@@ -294,6 +303,9 @@
 	}
 
 	/**
+	 * Get the whole string for the nonce to be included into the capability
+	 * advertisement
+	 *
 	 * @return the whole string for the nonce to be included into the capability
 	 *         advertisement, or null if push certificates are disabled.
 	 * @since 4.0
@@ -348,7 +360,7 @@
 	 *            {@code NonceGenerator} will allow for some time skew caused by
 	 *            clients disconnected and reconnecting in the stateless smart
 	 *            HTTP protocol.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the certificate from the client is badly malformed or the
 	 *             client disconnects before sending the entire certificate.
 	 * @since 4.0
@@ -410,7 +422,7 @@
 	 *
 	 * @param pckIn
 	 *            where we read the signature from.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the signature is invalid.
 	 * @since 4.0
 	 */
@@ -455,7 +467,7 @@
 	 * @param line
 	 *            the line read from the wire that produced this
 	 *            command, with optional trailing newline already trimmed.
-	 * @throws PackProtocolException
+	 * @throws org.eclipse.jgit.errors.PackProtocolException
 	 *             if the raw line cannot be parsed to a command.
 	 * @since 4.0
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java
index 706e727..ab58a33 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushCertificateStore.java
@@ -135,10 +135,12 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Close resources opened by this store.
 	 * <p>
-	 * If {@link #get(String)} was called, closes the cached object reader created
-	 * by that method. Does not close the underlying repository.
+	 * If {@link #get(String)} was called, closes the cached object reader
+	 * created by that method. Does not close the underlying repository.
 	 */
 	@Override
 	public void close() {
@@ -160,7 +162,7 @@
 	 *            the ref name to get the certificate for.
 	 * @return last certificate affecting the ref, or null if no cert was recorded
 	 *         for the last update to this ref.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if a problem occurred reading the repository.
 	 */
 	public PushCertificate get(String refName) throws IOException {
@@ -298,20 +300,20 @@
 	/**
 	 * Put a certificate to be saved to the store.
 	 * <p>
-	 * Writes the contents of this certificate for each ref mentioned. It is up to
-	 * the caller to ensure this certificate accurately represents the state of
-	 * the ref.
+	 * Writes the contents of this certificate for each ref mentioned. It is up
+	 * to the caller to ensure this certificate accurately represents the state
+	 * of the ref.
 	 * <p>
-	 * Pending certificates added to this method are not returned by {@link
-	 * #get(String)} and {@link #getAll(String)} until after calling {@link
-	 * #save()}.
+	 * Pending certificates added to this method are not returned by
+	 * {@link #get(String)} and {@link #getAll(String)} until after calling
+	 * {@link #save()}.
 	 *
 	 * @param cert
 	 *            certificate to store.
 	 * @param ident
 	 *            identity for the commit that stores this certificate. Pending
-	 *            certificates are sorted by identity timestamp during {@link
-	 *            #save()}.
+	 *            certificates are sorted by identity timestamp during
+	 *            {@link #save()}.
 	 */
 	public void put(PushCertificate cert, PersonIdent ident) {
 		put(cert, ident, null);
@@ -325,16 +327,16 @@
 	 * list that exactly matches the old/new values mentioned in the push
 	 * certificate.
 	 * <p>
-	 * Pending certificates added to this method are not returned by {@link
-	 * #get(String)} and {@link #getAll(String)} until after calling {@link
-	 * #save()}.
+	 * Pending certificates added to this method are not returned by
+	 * {@link #get(String)} and {@link #getAll(String)} until after calling
+	 * {@link #save()}.
 	 *
 	 * @param cert
 	 *            certificate to store.
 	 * @param ident
 	 *            identity for the commit that stores this certificate. Pending
-	 *            certificates are sorted by identity timestamp during {@link
-	 *            #save()}.
+	 *            certificates are sorted by identity timestamp during
+	 *            {@link #save()}.
 	 * @param matching
 	 *            only store certs for the refs listed in this list whose values
 	 *            match the commands in the cert.
@@ -347,15 +349,15 @@
 	/**
 	 * Save pending certificates to the store.
 	 * <p>
-	 * One commit is created per certificate added with {@link
-	 * #put(PushCertificate, PersonIdent)}, in order of identity timestamps, and
-	 * a single ref update is performed.
+	 * One commit is created per certificate added with
+	 * {@link #put(PushCertificate, PersonIdent)}, in order of identity
+	 * timestamps, and a single ref update is performed.
 	 * <p>
-	 * The pending list is cleared if and only the ref update fails, which allows
-	 * for easy retries in case of lock failure.
+	 * The pending list is cleared if and only the ref update fails, which
+	 * allows for easy retries in case of lock failure.
 	 *
 	 * @return the result of attempting to update the ref.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if there was an error reading from or writing to the
 	 *             repository.
 	 */
@@ -384,18 +386,19 @@
 	/**
 	 * Save pending certificates to the store in an existing batch ref update.
 	 * <p>
-	 * One commit is created per certificate added with {@link
-	 * #put(PushCertificate, PersonIdent)}, in order of identity timestamps, all
-	 * commits are flushed, and a single command is added to the batch.
+	 * One commit is created per certificate added with
+	 * {@link #put(PushCertificate, PersonIdent)}, in order of identity
+	 * timestamps, all commits are flushed, and a single command is added to the
+	 * batch.
 	 * <p>
-	 * The cached ref value and pending list are <em>not</em> cleared. If the ref
-	 * update succeeds, the caller is responsible for calling {@link #close()}
-	 * and/or {@link #clear()}.
+	 * The cached ref value and pending list are <em>not</em> cleared. If the
+	 * ref update succeeds, the caller is responsible for calling
+	 * {@link #close()} and/or {@link #clear()}.
 	 *
 	 * @param batch
 	 *            update to save to.
 	 * @return whether a command was added to the batch.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if there was an error reading from or writing to the
 	 *             repository.
 	 */
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 c2a885f..ff2939a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushConnection.java
@@ -49,7 +49,6 @@
 
 import org.eclipse.jgit.errors.TransportException;
 import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
 
 /**
  * Lists known refs from the remote and sends objects to the remote.
@@ -60,9 +59,9 @@
  * into the remote repository, as well as a way to modify the refs stored by the
  * remote repository.
  * <p>
- * Instances of a PushConnection must be created by a {@link Transport} that
- * implements a specific object transfer protocol that both sides of the
- * connection understand.
+ * Instances of a PushConnection must be created by a
+ * {@link org.eclipse.jgit.transport.Transport} that implements a specific
+ * object transfer protocol that both sides of the connection understand.
  * <p>
  * PushConnection instances are not thread safe and may be accessed by only one
  * thread at a time.
@@ -79,13 +78,14 @@
 	 * <p>
 	 * <p>
 	 * Only one call per connection is allowed. Subsequent calls will result in
-	 * {@link TransportException}.
+	 * {@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 Transport#isPushThin()} should be honored if applicable.
-	 * refUpdates should be filled with information about status of each update.
+	 * {@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
@@ -97,12 +97,16 @@
 	 *            map of remote refnames to remote refs update
 	 *            specifications/statuses. Can't be empty. This indicate what
 	 *            refs caller want to update on remote side. Only refs updates
-	 *            with {@link Status#NOT_ATTEMPTED} should passed.
-	 *            Implementation must ensure that and appropriate status with
-	 *            optional message should be set during call. No refUpdate with
-	 *            {@link Status#AWAITING_REPORT} or {@link Status#NOT_ATTEMPTED}
+	 *            with
+	 *            {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
+	 *            should passed. Implementation must ensure that and appropriate
+	 *            status with optional message should be set during call. No
+	 *            refUpdate with
+	 *            {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#AWAITING_REPORT}
+	 *            or
+	 *            {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
 	 *            can be leaved by implementation after return from this call.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             objects could not be copied due to a network failure,
 	 *             critical protocol error, or error on remote side, or
 	 *             connection was already used for push - new connection must be
@@ -121,13 +125,14 @@
 	 * <p>
 	 * <p>
 	 * Only one call per connection is allowed. Subsequent calls will result in
-	 * {@link TransportException}.
+	 * {@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 Transport#isPushThin()} should be honored if applicable.
-	 * refUpdates should be filled with information about status of each update.
+	 * {@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
@@ -139,14 +144,18 @@
 	 *            map of remote refnames to remote refs update
 	 *            specifications/statuses. Can't be empty. This indicate what
 	 *            refs caller want to update on remote side. Only refs updates
-	 *            with {@link Status#NOT_ATTEMPTED} should passed.
-	 *            Implementation must ensure that and appropriate status with
-	 *            optional message should be set during call. No refUpdate with
-	 *            {@link Status#AWAITING_REPORT} or {@link Status#NOT_ATTEMPTED}
+	 *            with
+	 *            {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
+	 *            should passed. Implementation must ensure that and appropriate
+	 *            status with optional message should be set during call. No
+	 *            refUpdate with
+	 *            {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#AWAITING_REPORT}
+	 *            or
+	 *            {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
 	 *            can be leaved by implementation after return from this call.
 	 * @param out
 	 *            output stream to write sideband messages to
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             objects could not be copied due to a network failure,
 	 *             critical protocol error, or error on remote side, or
 	 *             connection was already used for push - new connection must be
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushResult.java
index 41aa73c..8bae5a5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushResult.java
@@ -51,7 +51,8 @@
 
 /**
  * Result of push operation to the remote repository. Holding information of
- * {@link OperationResult} and remote refs updates status.
+ * {@link org.eclipse.jgit.transport.OperationResult} and remote refs updates
+ * status.
  *
  * @see Transport#push(org.eclipse.jgit.lib.ProgressMonitor, Collection)
  */
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 e9681b3..e14d18f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
@@ -52,6 +52,7 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.eclipse.jgit.annotations.NonNull;
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.AnyObjectId;
@@ -63,10 +64,11 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 
 /**
- * A command being processed by {@link BaseReceivePack}.
+ * A command being processed by
+ * {@link org.eclipse.jgit.transport.BaseReceivePack}.
  * <p>
  * This command instance roughly translates to the server side representation of
- * the {@link RemoteRefUpdate} created by the client.
+ * the {@link org.eclipse.jgit.transport.RemoteRefUpdate} created by the client.
  */
 public class ReceiveCommand {
 	/** Type of operation requested. */
@@ -175,8 +177,10 @@
 	/**
 	 * Set unprocessed commands as failed due to transaction aborted.
 	 * <p>
-	 * If a command is still {@link Result#NOT_ATTEMPTED} it will be set to
-	 * {@link Result#REJECTED_OTHER_REASON}.
+	 * If a command is still
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#NOT_ATTEMPTED} it
+	 * will be set to
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#REJECTED_OTHER_REASON}.
 	 *
 	 * @param commands
 	 *            commands to mark as failed.
@@ -196,8 +200,8 @@
 	 *
 	 * @param cmd
 	 *            command.
-	 * @return whether the command failed due to transaction aborted, as in {@link
-	 *         #abort(Iterable)}.
+	 * @return whether the command failed due to transaction aborted, as in
+	 *         {@link #abort(Iterable)}.
 	 * @since 4.9
 	 */
 	public static boolean isTransactionAborted(ReceiveCommand cmd) {
@@ -205,14 +209,71 @@
 				&& cmd.getMessage().equals(JGitText.get().transactionAborted);
 	}
 
+	/**
+	 * Create a command to switch a reference from object to symbolic.
+	 *
+	 * @param oldId
+	 *            expected oldId. May be {@code zeroId} to create.
+	 * @param newTarget
+	 *            new target; must begin with {@code "refs/"}.
+	 * @param name
+	 *            name of the reference to make symbolic.
+	 * @return command instance.
+	 * @since 4.10
+	 */
+	public static ReceiveCommand link(@NonNull ObjectId oldId,
+			@NonNull String newTarget, @NonNull String name) {
+		return new ReceiveCommand(oldId, newTarget, name);
+	}
+
+	/**
+	 * Create a command to switch a symbolic reference's target.
+	 *
+	 * @param oldTarget
+	 *            expected old target. May be null to create.
+	 * @param newTarget
+	 *            new target; must begin with {@code "refs/"}.
+	 * @param name
+	 *            name of the reference to make symbolic.
+	 * @return command instance.
+	 * @since 4.10
+	 */
+	public static ReceiveCommand link(@Nullable String oldTarget,
+			@NonNull String newTarget, @NonNull String name) {
+		return new ReceiveCommand(oldTarget, newTarget, name);
+	}
+
+	/**
+	 * Create a command to switch a reference from symbolic to object.
+	 *
+	 * @param oldTarget
+	 *            expected old target.
+	 * @param newId
+	 *            new object identifier. May be {@code zeroId()} to delete.
+	 * @param name
+	 *            name of the reference to convert from symbolic.
+	 * @return command instance.
+	 * @since 4.10
+	 */
+	public static ReceiveCommand unlink(@NonNull String oldTarget,
+			@NonNull ObjectId newId, @NonNull String name) {
+		return new ReceiveCommand(oldTarget, newId, name);
+	}
+
 	private final ObjectId oldId;
 
+	private final String oldSymref;
+
 	private final ObjectId newId;
 
+	private final String newSymref;
+
 	private final String name;
 
 	private Type type;
 
+	private boolean typeIsCorrect;
+
 	private Ref ref;
 
 	private Result status = Result.NOT_ATTEMPTED;
@@ -227,30 +288,39 @@
 
 	private Boolean forceRefLog;
 
-	private boolean typeIsCorrect;
-
 	/**
-	 * Create a new command for {@link BaseReceivePack}.
+	 * Create a new command for
+	 * {@link org.eclipse.jgit.transport.BaseReceivePack}.
 	 *
 	 * @param oldId
 	 *            the expected old object id; must not be null. Use
-	 *            {@link ObjectId#zeroId()} to indicate a ref creation.
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to indicate a
+	 *            ref creation.
 	 * @param newId
 	 *            the new object id; must not be null. Use
-	 *            {@link ObjectId#zeroId()} to indicate a ref deletion.
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to indicate a
+	 *            ref deletion.
 	 * @param name
 	 *            name of the ref being affected.
 	 */
 	public ReceiveCommand(final ObjectId oldId, final ObjectId newId,
 			final String name) {
 		if (oldId == null) {
-			throw new IllegalArgumentException(JGitText.get().oldIdMustNotBeNull);
+			throw new IllegalArgumentException(
+					JGitText.get().oldIdMustNotBeNull);
 		}
 		if (newId == null) {
-			throw new IllegalArgumentException(JGitText.get().newIdMustNotBeNull);
+			throw new IllegalArgumentException(
+					JGitText.get().newIdMustNotBeNull);
+		}
+		if (name == null || name.isEmpty()) {
+			throw new IllegalArgumentException(
+					JGitText.get().nameMustNotBeNullOrEmpty);
 		}
 		this.oldId = oldId;
+		this.oldSymref = null;
 		this.newId = newId;
+		this.newSymref = null;
 		this.name = name;
 
 		type = Type.UPDATE;
@@ -263,31 +333,46 @@
 	}
 
 	/**
-	 * Create a new command for {@link BaseReceivePack}.
+	 * Create a new command for
+	 * {@link org.eclipse.jgit.transport.BaseReceivePack}.
 	 *
 	 * @param oldId
 	 *            the old object id; must not be null. Use
-	 *            {@link ObjectId#zeroId()} to indicate a ref creation.
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to indicate a
+	 *            ref creation.
 	 * @param newId
 	 *            the new object id; must not be null. Use
-	 *            {@link ObjectId#zeroId()} to indicate a ref deletion.
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} to indicate a
+	 *            ref deletion.
 	 * @param name
 	 *            name of the ref being affected.
 	 * @param type
-	 *            type of the command. Must be {@link Type#CREATE} if {@code
-	 *            oldId} is zero, or {@link Type#DELETE} if {@code newId} is zero.
+	 *            type of the command. Must be
+	 *            {@link org.eclipse.jgit.transport.ReceiveCommand.Type#CREATE}
+	 *            if {@code
+	 *            oldId} is zero, or
+	 *            {@link org.eclipse.jgit.transport.ReceiveCommand.Type#DELETE}
+	 *            if {@code newId} is zero.
 	 * @since 2.0
 	 */
 	public ReceiveCommand(final ObjectId oldId, final ObjectId newId,
 			final String name, final Type type) {
 		if (oldId == null) {
-			throw new IllegalArgumentException(JGitText.get().oldIdMustNotBeNull);
+			throw new IllegalArgumentException(
+					JGitText.get().oldIdMustNotBeNull);
 		}
 		if (newId == null) {
-			throw new IllegalArgumentException(JGitText.get().newIdMustNotBeNull);
+			throw new IllegalArgumentException(
+					JGitText.get().newIdMustNotBeNull);
+		}
+		if (name == null || name.isEmpty()) {
+			throw new IllegalArgumentException(
+					JGitText.get().nameMustNotBeNullOrEmpty);
 		}
 		this.oldId = oldId;
+		this.oldSymref = null;
 		this.newId = newId;
+		this.newSymref = null;
 		this.name = name;
 		switch (type) {
 		case CREATE:
@@ -311,42 +396,203 @@
 			}
 			break;
 		default:
-			throw new IllegalStateException(JGitText.get().enumValueNotSupported0);
+			throw new IllegalStateException(
+					JGitText.get().enumValueNotSupported0);
 		}
 		this.type = type;
 	}
 
-	/** @return the old value the client thinks the ref has. */
+	/**
+	 * Create a command to switch a reference from object to symbolic.
+	 *
+	 * @param oldId
+	 *            the old object id; must not be null. Use
+	 *            {@link ObjectId#zeroId()} to indicate a ref creation.
+	 * @param newSymref
+	 *            new target, must begin with {@code "refs/"}. Use {@code null}
+	 *            to indicate a ref deletion.
+	 * @param name
+	 *            name of the reference to make symbolic.
+	 * @since 4.10
+	 */
+	private ReceiveCommand(ObjectId oldId, String newSymref, String name) {
+		if (oldId == null) {
+			throw new IllegalArgumentException(
+					JGitText.get().oldIdMustNotBeNull);
+		}
+		if (name == null || name.isEmpty()) {
+			throw new IllegalArgumentException(
+					JGitText.get().nameMustNotBeNullOrEmpty);
+		}
+		this.oldId = oldId;
+		this.oldSymref = null;
+		this.newId = ObjectId.zeroId();
+		this.newSymref = newSymref;
+		this.name = name;
+		if (AnyObjectId.equals(ObjectId.zeroId(), oldId)) {
+			type = Type.CREATE;
+		} else if (newSymref != null) {
+			type = Type.UPDATE;
+		} else {
+			type = Type.DELETE;
+		}
+		typeIsCorrect = true;
+	}
+
+	/**
+	 * Create a command to switch a reference from symbolic to object.
+	 *
+	 * @param oldSymref
+	 *            expected old target. Use {@code null} to indicate a ref
+	 *            creation.
+	 * @param newId
+	 *            the new object id; must not be null. Use
+	 *            {@link ObjectId#zeroId()} to indicate a ref deletion.
+	 * @param name
+	 *            name of the reference to convert from symbolic.
+	 * @since 4.10
+	 */
+	private ReceiveCommand(String oldSymref, ObjectId newId, String name) {
+		if (newId == null) {
+			throw new IllegalArgumentException(
+					JGitText.get().newIdMustNotBeNull);
+		}
+		if (name == null || name.isEmpty()) {
+			throw new IllegalArgumentException(
+					JGitText.get().nameMustNotBeNullOrEmpty);
+		}
+		this.oldId = ObjectId.zeroId();
+		this.oldSymref = oldSymref;
+		this.newId = newId;
+		this.newSymref = null;
+		this.name = name;
+		if (oldSymref == null) {
+			type = Type.CREATE;
+		} else if (!AnyObjectId.equals(ObjectId.zeroId(), newId)) {
+			type = Type.UPDATE;
+		} else {
+			type = Type.DELETE;
+		}
+		typeIsCorrect = true;
+	}
+
+	/**
+	 * Create a command to switch a symbolic reference's target.
+	 *
+	 * @param oldTarget
+	 *            expected old target. Use {@code null} to indicate a ref
+	 *            creation.
+	 * @param newTarget
+	 *            new target. Use {@code null} to indicate a ref deletion.
+	 * @param name
+	 *            name of the reference to make symbolic.
+	 * @since 4.10
+	 */
+	private ReceiveCommand(@Nullable String oldTarget, String newTarget, String name) {
+		if (name == null || name.isEmpty()) {
+			throw new IllegalArgumentException(
+					JGitText.get().nameMustNotBeNullOrEmpty);
+		}
+		this.oldId = ObjectId.zeroId();
+		this.oldSymref = oldTarget;
+		this.newId = ObjectId.zeroId();
+		this.newSymref = newTarget;
+		this.name = name;
+		if (oldTarget == null) {
+			if (newTarget == null) {
+				throw new IllegalArgumentException(
+						JGitText.get().bothRefTargetsMustNotBeNull);
+			}
+			type = Type.CREATE;
+		} else if (newTarget != null) {
+			type = Type.UPDATE;
+		} else {
+			type = Type.DELETE;
+		}
+		typeIsCorrect = true;
+	}
+
+	/**
+	 * Get the old value the client thinks the ref has.
+	 *
+	 * @return the old value the client thinks the ref has.
+	 */
 	public ObjectId getOldId() {
 		return oldId;
 	}
 
-	/** @return the requested new value for this ref. */
+	/**
+	 * Get expected old target for a symbolic reference.
+	 *
+	 * @return expected old target for a symbolic reference.
+	 * @since 4.10
+	 */
+	@Nullable
+	public String getOldSymref() {
+		return oldSymref;
+	}
+
+	/**
+	 * Get the requested new value for this ref.
+	 *
+	 * @return the requested new value for this ref.
+	 */
 	public ObjectId getNewId() {
 		return newId;
 	}
 
-	/** @return the name of the ref being updated. */
+	/**
+	 * Get requested new target for a symbolic reference.
+	 *
+	 * @return requested new target for a symbolic reference.
+	 * @since 4.10
+	 */
+	@Nullable
+	public String getNewSymref() {
+		return newSymref;
+	}
+
+	/**
+	 * Get the name of the ref being updated.
+	 *
+	 * @return the name of the ref being updated.
+	 */
 	public String getRefName() {
 		return name;
 	}
 
-	/** @return the type of this command; see {@link Type}. */
+	/**
+	 * Get the type of this command; see {@link Type}.
+	 *
+	 * @return the type of this command; see {@link Type}.
+	 */
 	public Type getType() {
 		return type;
 	}
 
-	/** @return the ref, if this was advertised by the connection. */
+	/**
+	 * Get the ref, if this was advertised by the connection.
+	 *
+	 * @return the ref, if this was advertised by the connection.
+	 */
 	public Ref getRef() {
 		return ref;
 	}
 
-	/** @return the current status code of this command. */
+	/**
+	 * Get the current status code of this command.
+	 *
+	 * @return the current status code of this command.
+	 */
 	public Result getResult() {
 		return status;
 	}
 
-	/** @return the message associated with a failure status. */
+	/**
+	 * Get the message associated with a failure status.
+	 *
+	 * @return the message associated with a failure status.
+	 */
 	public String getMessage() {
 		return message;
 	}
@@ -452,8 +698,8 @@
 	/**
 	 * Check whether the reflog should be written regardless of repo defaults.
 	 *
-	 * @return whether force writing is enabled; null if {@code
-	 * #setForceRefLog(boolean)} was never called.
+	 * @return whether force writing is enabled; {@code null} if
+	 *         {@code #setForceRefLog(boolean)} was never called.
 	 * @since 4.9
 	 */
 	@Nullable
@@ -490,12 +736,13 @@
 	 * If the command's current type is UPDATE, a merge test will be performed
 	 * using the supplied RevWalk to determine if {@link #getOldId()} is fully
 	 * merged into {@link #getNewId()}. If some commits are not merged the
-	 * update type is changed to {@link Type#UPDATE_NONFASTFORWARD}.
+	 * update type is changed to
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Type#UPDATE_NONFASTFORWARD}.
 	 *
 	 * @param walk
 	 *            an instance to perform the merge test with. The caller must
 	 *            allocate and release this object.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             either oldId or newId is not accessible in the repository
 	 *             used by the RevWalk. This usually indicates data corruption,
 	 *             and the command cannot be processed.
@@ -525,7 +772,18 @@
 	 */
 	public void execute(final BaseReceivePack rp) {
 		try {
-			final RefUpdate ru = rp.getRepository().updateRef(getRefName());
+			String expTarget = getOldSymref();
+			boolean detach = getNewSymref() != null
+					|| (type == Type.DELETE && expTarget != null);
+			RefUpdate ru = rp.getRepository().updateRef(getRefName(), detach);
+			if (expTarget != null) {
+				if (!ru.getRef().isSymbolic() || !ru.getRef().getTarget()
+						.getName().equals(expTarget)) {
+					setResult(Result.LOCK_FAILURE);
+					return;
+				}
+			}
+
 			ru.setRefLogIdent(rp.getRefLogIdent());
 			ru.setRefLogMessage(refLogMessage, refLogIncludeResult);
 			switch (getType()) {
@@ -546,9 +804,13 @@
 			case UPDATE_NONFASTFORWARD:
 				ru.setForceUpdate(rp.isAllowNonFastForwards());
 				ru.setExpectedOldObjectId(getOldId());
-				ru.setNewObjectId(getNewId());
 				ru.setRefLogMessage("push", true); //$NON-NLS-1$
-				setResult(ru.update(rp.getRevWalk()));
+				if (getNewSymref() != null) {
+					setResult(ru.link(getNewSymref()));
+				} else {
+					ru.setNewObjectId(getNewId());
+					setResult(ru.update(rp.getRevWalk()));
+				}
 				break;
 			}
 		} catch (IOException err) {
@@ -620,6 +882,7 @@
 				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 169df3b..7c5f32a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
@@ -130,7 +130,11 @@
 		pushOptions = options;
 	}
 
-	/** @return the hook invoked before updates occur. */
+	/**
+	 * Get the hook invoked before updates occur.
+	 *
+	 * @return the hook invoked before updates occur.
+	 */
 	public PreReceiveHook getPreReceiveHook() {
 		return preReceive;
 	}
@@ -141,7 +145,8 @@
 	 * Only valid commands (those which have no obvious errors according to the
 	 * received input and this instance's configuration) are passed into the
 	 * hook. The hook may mark a command with a result of any value other than
-	 * {@link Result#NOT_ATTEMPTED} to block its execution.
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#NOT_ATTEMPTED} to
+	 * block its execution.
 	 * <p>
 	 * The hook may be called with an empty command collection if the current
 	 * set is completely invalid.
@@ -153,7 +158,11 @@
 		preReceive = h != null ? h : PreReceiveHook.NULL;
 	}
 
-	/** @return the hook invoked after updates occur. */
+	/**
+	 * Get the hook invoked after updates occur.
+	 *
+	 * @return the hook invoked after updates occur.
+	 */
 	public PostReceiveHook getPostReceiveHook() {
 		return postReceive;
 	}
@@ -161,9 +170,10 @@
 	/**
 	 * Set the hook which is invoked after commands are executed.
 	 * <p>
-	 * Only successful commands (type is {@link Result#OK}) are passed into the
-	 * hook. The hook may be called with an empty command collection if the
-	 * current set all resulted in an error.
+	 * Only successful commands (type is
+	 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#OK}) are passed
+	 * into the hook. The hook may be called with an empty command collection if
+	 * the current set all resulted in an error.
 	 *
 	 * @param h
 	 *            the hook instance; may be null to disable the hook.
@@ -173,6 +183,9 @@
 	}
 
 	/**
+	 * Set whether this class will report command failures as warning messages
+	 * before sending the command results.
+	 *
 	 * @param echo
 	 *            if true this class will report command failures as warning
 	 *            messages before sending the command results. This is usually
@@ -199,7 +212,7 @@
 	 *            through. When run over SSH this should be tied back to the
 	 *            standard error channel of the command execution. For most
 	 *            other network connections this should be null.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void receive(final InputStream input, final OutputStream output,
 			final OutputStream messages) throws IOException {
@@ -215,6 +228,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void enableCapabilities() {
 		reportStatus = isCapabilityEnabled(CAPABILITY_REPORT_STATUS);
@@ -325,6 +339,7 @@
 		repo.autoGC(NullProgressMonitor.INSTANCE);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected String getLockMessageProcessName() {
 		return "jgit receive-pack"; //$NON-NLS-1$
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivedPackStatistics.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivedPackStatistics.java
index 052d550..dec5289 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivedPackStatistics.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivedPackStatistics.java
@@ -46,7 +46,7 @@
 import org.eclipse.jgit.lib.Constants;
 
 /**
- * Statistics about {@link PackParser}.
+ * Statistics about {@link org.eclipse.jgit.transport.PackParser}.
  *
  * @since 4.6
  */
@@ -65,57 +65,101 @@
 	private long numDeltaBlob;
 	private long numDeltaTag;
 
-	/** @return number of bytes read from the input stream */
+	/**
+	 * Get number of bytes read from the input stream
+	 *
+	 * @return number of bytes read from the input stream
+	 */
 	public long getNumBytesRead() {
 		return numBytesRead;
 	}
 
-	/** @return number of whole commit objects in the pack */
+	/**
+	 * Get number of whole commit objects in the pack
+	 *
+	 * @return number of whole commit objects in the pack
+	 */
 	public long getNumWholeCommit() {
 		return numWholeCommit;
 	}
 
-	/** @return number of whole tree objects in the pack */
+	/**
+	 * Get number of whole tree objects in the pack
+	 *
+	 * @return number of whole tree objects in the pack
+	 */
 	public long getNumWholeTree() {
 		return numWholeTree;
 	}
 
-	/** @return number of whole blob objects in the pack */
+	/**
+	 * Get number of whole blob objects in the pack
+	 *
+	 * @return number of whole blob objects in the pack
+	 */
 	public long getNumWholeBlob() {
 		return numWholeBlob;
 	}
 
-	/** @return number of whole tag objects in the pack */
+	/**
+	 * Get number of whole tag objects in the pack
+	 *
+	 * @return number of whole tag objects in the pack
+	 */
 	public long getNumWholeTag() {
 		return numWholeTag;
 	}
 
-	/** @return number of offset delta objects in the pack */
+	/**
+	 * Get number of offset delta objects in the pack
+	 *
+	 * @return number of offset delta objects in the pack
+	 */
 	public long getNumOfsDelta() {
 		return numOfsDelta;
 	}
 
-	/** @return number of ref delta objects in the pack */
+	/**
+	 * Get number of ref delta objects in the pack
+	 *
+	 * @return number of ref delta objects in the pack
+	 */
 	public long getNumRefDelta() {
 		return numRefDelta;
 	}
 
-	/** @return number of delta commit objects in the pack */
+	/**
+	 * Get number of delta commit objects in the pack
+	 *
+	 * @return number of delta commit objects in the pack
+	 */
 	public long getNumDeltaCommit() {
 		return numDeltaCommit;
 	}
 
-	/** @return number of delta tree objects in the pack */
+	/**
+	 * Get number of delta tree objects in the pack
+	 *
+	 * @return number of delta tree objects in the pack
+	 */
 	public long getNumDeltaTree() {
 		return numDeltaTree;
 	}
 
-	/** @return number of delta blob objects in the pack */
+	/**
+	 * Get number of delta blob objects in the pack
+	 *
+	 * @return number of delta blob objects in the pack
+	 */
 	public long getNumDeltaBlob() {
 		return numDeltaBlob;
 	}
 
-	/** @return number of delta tag objects in the pack */
+	/**
+	 * Get number of delta tag objects in the pack
+	 *
+	 * @return number of delta tag objects in the pack
+	 */
 	public long getNumDeltaTag() {
 		return numDeltaTag;
 	}
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 745e813..5eb1661 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
@@ -67,7 +67,10 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.util.RefMap;
 
-/** Support for the start of {@link UploadPack} and {@link ReceivePack}. */
+/**
+ * Support for the start of {@link org.eclipse.jgit.transport.UploadPack} and
+ * {@link org.eclipse.jgit.transport.ReceivePack}.
+ */
 public abstract class RefAdvertiser {
 	/** Advertiser which frames lines in a {@link PacketLineOut} format. */
 	public static class PacketLineOutRefAdvertiser extends RefAdvertiser {
@@ -247,7 +250,6 @@
 	 *            The symbolic ref, e.g. "HEAD"
 	 * @param to
 	 *            The real ref it points to, e.g. "refs/heads/master"
-	 *
 	 * @since 3.6
 	 */
 	public void addSymref(String from, String to) {
@@ -262,7 +264,7 @@
 	 *            sorted before display if necessary, and therefore may appear
 	 *            in any order.
 	 * @return set of ObjectIds that were advertised to the client.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying output stream failed to write out an
 	 *             advertisement record.
 	 */
@@ -305,7 +307,7 @@
 	 *
 	 * @param id
 	 *            identity of the object that is assumed to exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying output stream failed to write out an
 	 *             advertisement record.
 	 */
@@ -313,7 +315,11 @@
 		advertiseAnyOnce(id, ".have"); //$NON-NLS-1$
 	}
 
-	/** @return true if no advertisements have been sent yet. */
+	/**
+	 * Whether no advertisements have been sent yet.
+	 *
+	 * @return true if no advertisements have been sent yet.
+	 */
 	public boolean isEmpty() {
 		return first;
 	}
@@ -341,7 +347,7 @@
 	 * @param refName
 	 *            name of the reference to advertise the object as, can be any
 	 *            string not including the NUL byte.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying output stream failed to write out an
 	 *             advertisement record.
 	 */
@@ -372,7 +378,7 @@
 	 * @param line
 	 *            the advertisement line to be written. The line always ends
 	 *            with LF. Never null or the empty string.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying output stream failed to write out an
 	 *             advertisement record.
 	 */
@@ -381,7 +387,7 @@
 	/**
 	 * Mark the end of the advertisements.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the underlying output stream failed to write out an
 	 *             advertisement record.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefFilter.java
index d4f85f2..bbe4f84 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefFilter.java
@@ -50,14 +50,17 @@
 /**
  * Filters the list of refs that are advertised to the client.
  * <p>
- * The filter is called by {@link ReceivePack} and {@link UploadPack} to ensure
- * that the refs are filtered before they are advertised to the client.
+ * The filter is called by {@link org.eclipse.jgit.transport.ReceivePack} and
+ * {@link org.eclipse.jgit.transport.UploadPack} to ensure that the refs are
+ * filtered before they are advertised to the client.
  * <p>
  * This can be used by applications to control visibility of certain refs based
  * on a custom set of rules.
  */
 public interface RefFilter {
-	/** The default filter, allows all refs to be shown. */
+	/**
+	 * The default filter, allows all refs to be shown.
+	 */
 	public static final RefFilter DEFAULT = new RefFilter() {
 		@Override
 		public Map<String, Ref> filter (final Map<String, Ref> refs) {
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 734f523..ea0f84a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefLeaseSpec.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefLeaseSpec.java
@@ -47,6 +47,7 @@
 
 /**
  * Describes the expected value for a ref being pushed.
+ *
  * @since 4.7
  */
 public class RefLeaseSpec implements Serializable {
@@ -59,6 +60,7 @@
 	private final String expected;
 
 	/**
+	 * <p>Constructor for RefLeaseSpec.</p>
 	 *
 	 * @param ref
 	 *            ref being pushed
@@ -89,6 +91,7 @@
 		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 64f6c3f..e1b306e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java
@@ -153,7 +153,7 @@
 	 * @param mode
 	 *            whether to allow a wildcard on one side without a wildcard on
 	 *            the other.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the specification is invalid.
 	 * @since 4.5
 	 */
@@ -219,7 +219,7 @@
 	 *
 	 * @param spec
 	 *            string describing the specification.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the specification is invalid.
 	 */
 	public RefSpec(final String spec) {
@@ -288,7 +288,7 @@
 	 * @param source
 	 *            new value for source in the returned instance.
 	 * @return a new RefSpec with source as specified.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             There is already a destination configured, and the wildcard
 	 *             status of the existing destination disagrees with the
 	 *             wildcard status of the new source.
@@ -327,7 +327,7 @@
 	 * @param destination
 	 *            new value for destination in the returned instance.
 	 * @return a new RefSpec with destination as specified.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             There is already a source configured, and the wildcard status
 	 *             of the existing source disagrees with the wildcard status of
 	 *             the new destination.
@@ -350,7 +350,7 @@
 	 * @param destination
 	 *            new value for destination in the returned instance.
 	 * @return a new RefSpec with destination as specified.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             The wildcard status of the new source disagrees with the
 	 *             wildcard status of the new destination.
 	 */
@@ -421,7 +421,7 @@
 	 * @return a new specification expanded from provided ref name. Result
 	 *         specification is wildcard if and only if provided ref name is
 	 *         wildcard.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             when the RefSpec was constructed with wildcard mode that
 	 *             doesn't require matching wildcards.
 	 */
@@ -453,7 +453,7 @@
 	 * @return a new specification expanded from provided ref name. Result
 	 *         specification is wildcard if and only if provided ref name is
 	 *         wildcard.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             when the RefSpec was constructed with wildcard mode that
 	 *             doesn't require matching wildcards.
 	 */
@@ -473,7 +473,7 @@
 	 * @return a new specification expanded from provided ref name. Result
 	 *         specification is wildcard if and only if provided ref name is
 	 *         wildcard.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             when the RefSpec was constructed with wildcard mode that
 	 *             doesn't require matching wildcards.
 	 */
@@ -504,7 +504,7 @@
 	 * @return a new specification expanded from provided ref name. Result
 	 *         specification is wildcard if and only if provided ref name is
 	 *         wildcard.
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             when the RefSpec was constructed with wildcard mode that
 	 *             doesn't require matching wildcards.
 	 */
@@ -556,6 +556,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		int hc = 0;
@@ -566,6 +567,7 @@
 		return hc;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(final Object obj) {
 		if (!(obj instanceof RefSpec))
@@ -590,6 +592,7 @@
 		return a.equals(b);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java
index c968ba3..7b882ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteConfig.java
@@ -109,7 +109,7 @@
 	 * @return all remotes configurations existing in provided repository
 	 *         configuration. Returned configurations are ordered
 	 *         lexicographically by names.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             one of the URIs within the remote's configuration is invalid.
 	 */
 	public static List<RemoteConfig> getAllRemoteConfigs(final Config rc)
@@ -157,7 +157,7 @@
 	 *            The configuration must already be loaded into memory.
 	 * @param remoteName
 	 *            subsection key indicating the name of this remote.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             one of the URIs within the remote's configuration is invalid.
 	 */
 	public RemoteConfig(final Config rc, final String remoteName)
@@ -525,6 +525,9 @@
 	}
 
 	/**
+	 * Whether pushing to the remote automatically deletes remote refs which
+	 * don't exist on the source side.
+	 *
 	 * @return true if pushing to the remote automatically deletes remote refs
 	 *         which don't exist on the source side.
 	 */
@@ -542,7 +545,11 @@
 		mirror = m;
 	}
 
-	/** @return timeout (in seconds) before aborting an IO operation. */
+	/**
+	 * Get timeout (in seconds) before aborting an IO operation.
+	 *
+	 * @return timeout (in seconds) before aborting an IO operation.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
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 5c58346..3e9b16e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java
@@ -55,17 +55,18 @@
 
 /**
  * Represent request and status of a remote ref update. Specification is
- * provided by client, while status is handled by {@link PushProcess} class,
- * being read-only for client.
+ * provided by client, while status is handled by
+ * {@link org.eclipse.jgit.transport.PushProcess} class, being read-only for
+ * client.
  * <p>
  * Client can create instances of this class directly, basing on user
- * specification and advertised refs ({@link Connection} or through
- * {@link Transport} helper methods. Apply this specification on remote
- * repository using
- * {@link Transport#push(org.eclipse.jgit.lib.ProgressMonitor, java.util.Collection)}
+ * specification and advertised refs
+ * ({@link org.eclipse.jgit.transport.Connection} or through
+ * {@link org.eclipse.jgit.transport.Transport} helper methods. Apply this
+ * specification on remote repository using
+ * {@link org.eclipse.jgit.transport.Transport#push(org.eclipse.jgit.lib.ProgressMonitor, java.util.Collection)}
  * method.
  * </p>
- *
  */
 public class RemoteRefUpdate {
 	/**
@@ -149,16 +150,19 @@
 
 	/**
 	 * Construct remote ref update request by providing an update specification.
-	 * Object is created with default {@link Status#NOT_ATTEMPTED} status and no
-	 * message.
+	 * Object is created with default
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
+	 * status and no message.
 	 *
 	 * @param localDb
 	 *            local repository to push from.
 	 * @param srcRef
 	 *            source revision - any string resolvable by
-	 *            {@link Repository#resolve(String)}. This resolves to the new
-	 *            object that the caller want remote ref to be after update. Use
-	 *            null or {@link ObjectId#zeroId()} string for delete request.
+	 *            {@link org.eclipse.jgit.lib.Repository#resolve(String)}. This
+	 *            resolves to the new object that the caller want remote ref to
+	 *            be after update. Use null or
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} string for
+	 *            delete request.
 	 * @param remoteName
 	 *            full name of a remote ref to update, e.g. "refs/heads/master"
 	 *            (no wildcard, no short name).
@@ -176,13 +180,14 @@
 	 *            advertised by remote side before update; update will take
 	 *            place ONLY if remote side advertise exactly this expected id;
 	 *            null if caller doesn't care what object id remote side
-	 *            advertise. Use {@link ObjectId#zeroId()} when expecting no
-	 *            remote ref with this name.
-	 * @throws IOException
+	 *            advertise. Use {@link org.eclipse.jgit.lib.ObjectId#zeroId()}
+	 *            when expecting no remote ref with this name.
+	 * @throws java.io.IOException
 	 *             when I/O error occurred during creating
-	 *             {@link TrackingRefUpdate} for local tracking branch or srcRef
-	 *             can't be resolved to any object.
-	 * @throws IllegalArgumentException
+	 *             {@link org.eclipse.jgit.transport.TrackingRefUpdate} for
+	 *             local tracking branch or srcRef can't be resolved to any
+	 *             object.
+	 * @throws java.lang.IllegalArgumentException
 	 *             if some required parameter was null
 	 */
 	public RemoteRefUpdate(final Repository localDb, final String srcRef,
@@ -196,8 +201,9 @@
 
 	/**
 	 * Construct remote ref update request by providing an update specification.
-	 * Object is created with default {@link Status#NOT_ATTEMPTED} status and no
-	 * message.
+	 * Object is created with default
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
+	 * status and no message.
 	 *
 	 * @param localDb
 	 *            local repository to push from.
@@ -220,13 +226,14 @@
 	 *            advertised by remote side before update; update will take
 	 *            place ONLY if remote side advertise exactly this expected id;
 	 *            null if caller doesn't care what object id remote side
-	 *            advertise. Use {@link ObjectId#zeroId()} when expecting no
-	 *            remote ref with this name.
-	 * @throws IOException
+	 *            advertise. Use {@link org.eclipse.jgit.lib.ObjectId#zeroId()}
+	 *            when expecting no remote ref with this name.
+	 * @throws java.io.IOException
 	 *             when I/O error occurred during creating
-	 *             {@link TrackingRefUpdate} for local tracking branch or srcRef
-	 *             can't be resolved to any object.
-	 * @throws IllegalArgumentException
+	 *             {@link org.eclipse.jgit.transport.TrackingRefUpdate} for
+	 *             local tracking branch or srcRef can't be resolved to any
+	 *             object.
+	 * @throws java.lang.IllegalArgumentException
 	 *             if some required parameter was null
 	 */
 	public RemoteRefUpdate(final Repository localDb, final Ref srcRef,
@@ -240,8 +247,9 @@
 
 	/**
 	 * Construct remote ref update request by providing an update specification.
-	 * Object is created with default {@link Status#NOT_ATTEMPTED} status and no
-	 * message.
+	 * Object is created with default
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED}
+	 * status and no message.
 	 *
 	 * @param localDb
 	 *            local repository to push from.
@@ -250,7 +258,8 @@
 	 *            be used instead.
 	 * @param srcId
 	 *            The new object that the caller wants remote ref to be after
-	 *            update. Use null or {@link ObjectId#zeroId()} for delete
+	 *            update. Use null or
+	 *            {@link org.eclipse.jgit.lib.ObjectId#zeroId()} for delete
 	 *            request.
 	 * @param remoteName
 	 *            full name of a remote ref to update, e.g. "refs/heads/master"
@@ -269,13 +278,14 @@
 	 *            advertised by remote side before update; update will take
 	 *            place ONLY if remote side advertise exactly this expected id;
 	 *            null if caller doesn't care what object id remote side
-	 *            advertise. Use {@link ObjectId#zeroId()} when expecting no
-	 *            remote ref with this name.
-	 * @throws IOException
+	 *            advertise. Use {@link org.eclipse.jgit.lib.ObjectId#zeroId()}
+	 *            when expecting no remote ref with this name.
+	 * @throws java.io.IOException
 	 *             when I/O error occurred during creating
-	 *             {@link TrackingRefUpdate} for local tracking branch or srcRef
-	 *             can't be resolved to any object.
-	 * @throws IllegalArgumentException
+	 *             {@link org.eclipse.jgit.transport.TrackingRefUpdate} for
+	 *             local tracking branch or srcRef can't be resolved to any
+	 *             object.
+	 * @throws java.lang.IllegalArgumentException
 	 *             if some required parameter was null
 	 */
 	public RemoteRefUpdate(final Repository localDb, final String srcRef,
@@ -333,10 +343,11 @@
 	 *            configuration base.
 	 * @param newExpectedOldObjectId
 	 *            new expected object id value.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when I/O error occurred during creating
-	 *             {@link TrackingRefUpdate} for local tracking branch or srcRef
-	 *             of base object no longer can be resolved to any object.
+	 *             {@link org.eclipse.jgit.transport.TrackingRefUpdate} for
+	 *             local tracking branch or srcRef of base object no longer can
+	 *             be resolved to any object.
 	 */
 	public RemoteRefUpdate(final RemoteRefUpdate base,
 			final ObjectId newExpectedOldObjectId) throws IOException {
@@ -346,6 +357,8 @@
 	}
 
 	/**
+	 * Get expected old object id
+	 *
 	 * @return expectedOldObjectId required to be advertised by remote side, as
 	 *         set in constructor; may be null.
 	 */
@@ -354,6 +367,9 @@
 	}
 
 	/**
+	 * Whether some object is required to be advertised by remote side, as set
+	 * in constructor
+	 *
 	 * @return true if some object is required to be advertised by remote side,
 	 *         as set in constructor; false otherwise.
 	 */
@@ -362,6 +378,8 @@
 	}
 
 	/**
+	 * Get new object id
+	 *
 	 * @return newObjectId for remote ref, as set in constructor.
 	 */
 	public ObjectId getNewObjectId() {
@@ -369,6 +387,8 @@
 	}
 
 	/**
+	 * Whether this update is a deleting update
+	 *
 	 * @return true if this update is deleting update; false otherwise.
 	 */
 	public boolean isDelete() {
@@ -376,6 +396,8 @@
 	}
 
 	/**
+	 * Get name of remote ref to update
+	 *
 	 * @return name of remote ref to update, as set in constructor.
 	 */
 	public String getRemoteName() {
@@ -383,6 +405,8 @@
 	}
 
 	/**
+	 * Get tracking branch update if localName was set in constructor.
+	 *
 	 * @return local tracking branch update if localName was set in constructor.
 	 */
 	public TrackingRefUpdate getTrackingRefUpdate() {
@@ -390,9 +414,12 @@
 	}
 
 	/**
+	 * Get source revision as specified by user (in constructor)
+	 *
 	 * @return source revision as specified by user (in constructor), could be
-	 *         any string parseable by {@link Repository#resolve(String)}; can
-	 *         be null if specified that way in constructor - this stands for
+	 *         any string parseable by
+	 *         {@link org.eclipse.jgit.lib.Repository#resolve(String)}; can be
+	 *         null if specified that way in constructor - this stands for
 	 *         delete request.
 	 */
 	public String getSrcRef() {
@@ -400,6 +427,8 @@
 	}
 
 	/**
+	 * Whether user specified a local tracking branch for remote update
+	 *
 	 * @return true if user specified a local tracking branch for remote update;
 	 *         false otherwise.
 	 */
@@ -408,6 +437,8 @@
 	}
 
 	/**
+	 * Whether this update is forced regardless of old remote ref object
+	 *
 	 * @return true if this update is forced regardless of old remote ref
 	 *         object; false otherwise.
 	 */
@@ -416,6 +447,8 @@
 	}
 
 	/**
+	 * Get status of remote ref update operation.
+	 *
 	 * @return status of remote ref update operation.
 	 */
 	public Status getStatus() {
@@ -424,7 +457,8 @@
 
 	/**
 	 * Check whether update was fast-forward. Note that this result is
-	 * meaningful only after successful update (when status is {@link Status#OK}).
+	 * meaningful only after successful update (when status is
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#OK}).
 	 *
 	 * @return true if update was fast-forward; false otherwise.
 	 */
@@ -433,6 +467,9 @@
 	}
 
 	/**
+	 * Get message describing reasons of status when needed/possible; may be
+	 * null.
+	 *
 	 * @return message describing reasons of status when needed/possible; may be
 	 *         null.
 	 */
@@ -461,7 +498,7 @@
 	 *
 	 * @param walk
 	 *            walker used for checking update properties.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             when I/O error occurred during update
 	 */
 	protected void updateTrackingRef(final RevWalk walk) throws IOException {
@@ -471,6 +508,7 @@
 			trackingRefUpdate.setResult(localUpdate.update(walk));
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteSession.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteSession.java
index d6a2fe6..525c895 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteSession.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteSession.java
@@ -65,17 +65,18 @@
 	 * Generate a new remote process to execute the given command. This function
 	 * should also start execution and may need to create the streams prior to
 	 * execution.
+	 *
 	 * @param commandName
 	 *            command to execute
 	 * @param timeout
 	 *            timeout value, in seconds, for command execution
 	 * @return a new remote process
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             may be thrown in several cases. For example, on problems
 	 *             opening input or output streams or on problems connecting or
 	 *             communicating with the remote host. For the latter two cases,
 	 *             a TransportException may be thrown (a subclass of
-	 *             IOException).
+	 *             java.io.IOException).
 	 */
 	public Process exec(String commandName, int timeout) throws IOException;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RequestNotYetReadException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RequestNotYetReadException.java
index 8b45174..428af96 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RequestNotYetReadException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RequestNotYetReadException.java
@@ -51,12 +51,16 @@
 public class RequestNotYetReadException extends IllegalStateException {
 	private static final long serialVersionUID = 1L;
 
-	/** Initialize with no message. */
+	/**
+	 * Initialize with no message.
+	 */
 	public RequestNotYetReadException() {
 		// Do not set a message.
 	}
 
 	/**
+	 * <p>Constructor for RequestNotYetReadException.</p>
+	 *
 	 * @param msg
 	 *            a message explaining the state. This message should not
 	 *            be shown to an end-user.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ServiceMayNotContinueException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ServiceMayNotContinueException.java
index 87c9a500..940d2e2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ServiceMayNotContinueException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ServiceMayNotContinueException.java
@@ -59,13 +59,17 @@
 	private final int statusCode;
 	private boolean output;
 
-	/** Initialize with no message. */
+	/**
+	 * Initialize with no message.
+	 */
 	public ServiceMayNotContinueException() {
 		// Do not set a message.
 		statusCode = FORBIDDEN;
 	}
 
 	/**
+	 * <p>Constructor for ServiceMayNotContinueException.</p>
+	 *
 	 * @param msg
 	 *            a message explaining why it cannot continue. This message may
 	 *            be shown to an end-user.
@@ -76,6 +80,8 @@
 	}
 
 	/**
+	 * <p>Constructor for ServiceMayNotContinueException.</p>
+	 *
 	 * @param msg
 	 *            a message explaining why it cannot continue. This message may
 	 *            be shown to an end-user.
@@ -89,6 +95,8 @@
 	}
 
 	/**
+	 * <p>Constructor for ServiceMayNotContinueException.</p>
+	 *
 	 * @param msg
 	 *            a message explaining why it cannot continue. This message may
 	 *            be shown to an end-user.
@@ -102,6 +110,8 @@
 	}
 
 	/**
+	 * <p>Constructor for ServiceMayNotContinueException.</p>
+	 *
 	 * @param msg
 	 *            a message explaining why it cannot continue. This message may
 	 *            be shown to an end-user.
@@ -128,17 +138,25 @@
 		this(JGitText.get().internalServerError, cause);
 	}
 
-	/** @return true if the message was already output to the client. */
+	/**
+	 * Whether the message was already output to the client.
+	 *
+	 * @return {@code true} if the message was already output to the client.
+	 */
 	public boolean isOutput() {
 		return output;
 	}
 
-	/** Mark this message has being sent to the client. */
+	/**
+	 * Mark this message has being sent to the client.
+	 */
 	public void setOutput() {
 		output = true;
 	}
 
 	/**
+	 * Get status code
+	 *
 	 * @return true if the message was already output to the client.
 	 * @since 4.5
 	 */
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 fe9f2a3..25486cb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandInputStream.java
@@ -120,6 +120,7 @@
 		out = outputStream;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		needDataPacket();
@@ -129,6 +130,7 @@
 		return rawIn.read();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read(final 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 0303eed..af65827 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandOutputStream.java
@@ -127,12 +127,14 @@
 			writeBuffer();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		flushBuffer();
 		out.flush();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(final byte[] b, int off, int len) throws IOException {
 		while (0 < len) {
@@ -159,6 +161,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(final 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 aa80065..365545a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandProgressMonitor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SideBandProgressMonitor.java
@@ -60,6 +60,7 @@
 		write = true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int workCurr) {
 		StringBuilder s = new StringBuilder();
@@ -68,6 +69,7 @@
 		send(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int workCurr) {
 		StringBuilder s = new StringBuilder();
@@ -82,6 +84,7 @@
 		s.append(workCurr);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt) {
 		StringBuilder s = new StringBuilder();
@@ -90,6 +93,7 @@
 		send(s);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected void onEndTask(String taskName, int cmp, int totalWork, int pcnt) {
 		StringBuilder s = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SignedPushConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SignedPushConfig.java
index 1ecbed9..f404737 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SignedPushConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SignedPushConfig.java
@@ -60,7 +60,9 @@
 	private int certNonceSlopLimit;
 	private NonceGenerator nonceGenerator;
 
-	/** Create a new config with default values disabling push verification. */
+	/**
+	 * Create a new config with default values disabling push verification.
+	 */
 	public SignedPushConfig() {
 	}
 
@@ -73,9 +75,10 @@
 	 * Set the seed used by the nonce verifier.
 	 * <p>
 	 * Setting this to a non-null value enables push certificate verification
-	 * using the default {@link HMACSHA1NonceGenerator} implementation, if a
-	 * different implementation was not set using {@link
-	 * #setNonceGenerator(NonceGenerator)}.
+	 * using the default
+	 * {@link org.eclipse.jgit.transport.HMACSHA1NonceGenerator} implementation,
+	 * if a different implementation was not set using
+	 * {@link #setNonceGenerator(NonceGenerator)}.
 	 *
 	 * @param seed
 	 *            new seed value.
@@ -84,7 +87,11 @@
 		certNonceSeed = seed;
 	}
 
-	/** @return the configured seed. */
+	/**
+	 * Get the configured seed.
+	 *
+	 * @return the configured seed.
+	 */
 	public String getCertNonceSeed() {
 		return certNonceSeed;
 	}
@@ -101,18 +108,23 @@
 		certNonceSlopLimit = limit;
 	}
 
-	/** @return the configured nonce slop limit. */
+	/**
+	 * Get the configured nonce slop limit.
+	 *
+	 * @return the configured nonce slop limit.
+	 */
 	public int getCertNonceSlopLimit() {
 		return certNonceSlopLimit;
 	}
 
 	/**
-	 * Set the {@link NonceGenerator} used for signed pushes.
+	 * Set the {@link org.eclipse.jgit.transport.NonceGenerator} used for signed
+	 * pushes.
 	 * <p>
-	 * Setting this to a non-null value enables push certificate verification. If
-	 * this method is called, this implementation will be used instead of the
-	 * default {@link HMACSHA1NonceGenerator} even if {@link
-	 * #setCertNonceSeed(String)} was called.
+	 * Setting this to a non-null value enables push certificate verification.
+	 * If this method is called, this implementation will be used instead of the
+	 * default {@link org.eclipse.jgit.transport.HMACSHA1NonceGenerator} even if
+	 * {@link #setCertNonceSeed(String)} was called.
 	 *
 	 * @param generator
 	 *            new nonce generator.
@@ -122,12 +134,13 @@
 	}
 
 	/**
-	 * Get the {@link NonceGenerator} used for signed pushes.
+	 * Get the {@link org.eclipse.jgit.transport.NonceGenerator} used for signed
+	 * pushes.
 	 * <p>
 	 * If {@link #setNonceGenerator(NonceGenerator)} was used to set a non-null
-	 * implementation, that will be returned. If no custom implementation was set
-	 * but {@link #setCertNonceSeed(String)} was called, returns a newly-created
-	 * {@link HMACSHA1NonceGenerator}.
+	 * implementation, that will be returned. If no custom implementation was
+	 * set but {@link #setCertNonceSeed(String)} was called, returns a
+	 * newly-created {@link org.eclipse.jgit.transport.HMACSHA1NonceGenerator}.
 	 *
 	 * @return the configured nonce generator.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java
index 2d5029a..e002233 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshSessionFactory.java
@@ -54,9 +54,9 @@
  * communicating with the end-user as well as reading their personal SSH
  * configuration settings, such as known hosts and private keys.
  * <p>
- * A {@link RemoteSession} must be returned to the factory that created it.
- * Callers are encouraged to retain the SshSessionFactory for the duration of
- * the period they are using the Session.
+ * A {@link org.eclipse.jgit.transport.RemoteSession} must be returned to the
+ * factory that created it. Callers are encouraged to retain the
+ * SshSessionFactory for the duration of the period they are using the Session.
  */
 public abstract class SshSessionFactory {
 	private static SshSessionFactory INSTANCE = new DefaultSshSessionFactory();
@@ -106,7 +106,7 @@
 	 * @param tms
 	 *            Timeout value, in milliseconds.
 	 * @return a session that can contact the remote host.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the session could not be created.
 	 */
 	public abstract RemoteSession getSession(URIish uri,
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 74865dc..62a6f0e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshTransport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshTransport.java
@@ -99,7 +99,7 @@
 	 *
 	 * @param factory
 	 *            a factory to set, must not be null
-	 * @throws IllegalStateException
+	 * @throws java.lang.IllegalStateException
 	 *             if session has been already created.
 	 */
 	public void setSshSessionFactory(SshSessionFactory factory) {
@@ -112,7 +112,10 @@
 	}
 
 	/**
-	 * @return the SSH session factory that will be used for creating SSH sessions
+	 * Get the SSH session factory
+	 *
+	 * @return the SSH session factory that will be used for creating SSH
+	 *         sessions
 	 */
 	public SshSessionFactory getSshSessionFactory() {
 		return sch;
@@ -122,7 +125,7 @@
 	 * Get the default SSH session
 	 *
 	 * @return a remote session
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             in case of error with opening SSH session
 	 */
 	protected RemoteSession getSession() throws TransportException {
@@ -138,6 +141,7 @@
 		return sock;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		if (sock != null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TagOpt.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TagOpt.java
index 384e9fc..e1134e8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TagOpt.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TagOpt.java
@@ -48,7 +48,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** Specification of annotated tag behavior during fetch. */
+/**
+ * Specification of annotated tag behavior during fetch.
+ */
 public enum TagOpt {
 	/**
 	 * Automatically follow tags if we fetch the thing they point at.
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 8a28e3a..b186f9e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TestProtocol.java
@@ -60,15 +60,16 @@
 /**
  * Protocol for transport between manually-specified repositories in tests.
  * <p>
- * Remote repositories are registered using {@link #register(Object,
- * Repository)}, after which they can be accessed using the returned URI. As
- * this class provides both the client side (the protocol) and the server side,
- * the caller is responsible for setting up and passing the connection context,
- * whatever form that may take.
+ * Remote repositories are registered using
+ * {@link #register(Object, Repository)}, after which they can be accessed using
+ * the returned URI. As this class provides both the client side (the protocol)
+ * and the server side, the caller is responsible for setting up and passing the
+ * connection context, whatever form that may take.
  * <p>
  * Unlike the other built-in protocols, which are automatically-registered
  * singletons, callers are expected to register/unregister specific protocol
- * instances on demand with {@link Transport#register(TransportProtocol)}.
+ * instances on demand with
+ * {@link org.eclipse.jgit.transport.Transport#register(TransportProtocol)}.
  *
  * @param <C>
  *            the connection type
@@ -92,12 +93,16 @@
 	private final HashMap<URIish, Handle> handles;
 
 	/**
+	 * Constructor for TestProtocol.
+	 *
 	 * @param uploadPackFactory
-	 *            factory for creating {@link UploadPack} used by all connections
-	 *            from this protocol instance.
+	 *            factory for creating
+	 *            {@link org.eclipse.jgit.transport.UploadPack} used by all
+	 *            connections from this protocol instance.
 	 * @param receivePackFactory
-	 *            factory for creating {@link ReceivePack} used by all connections
-	 *            from this protocol instance.
+	 *            factory for creating
+	 *            {@link org.eclipse.jgit.transport.ReceivePack} used by all
+	 *            connections from this protocol instance.
 	 */
 	public TestProtocol(UploadPackFactory<C> uploadPackFactory,
 			ReceivePackFactory<C> receivePackFactory) {
@@ -106,16 +111,19 @@
 		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 {
@@ -127,11 +135,13 @@
 		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 5aae5ea..ba2a673 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TrackingRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TrackingRefUpdate.java
@@ -49,7 +49,9 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.RefUpdate;
 
-/** Update of a locally stored tracking branch. */
+/**
+ * Update of a locally stored tracking branch.
+ */
 public class TrackingRefUpdate {
 	private final String remoteName;
 	final String localName;
@@ -132,6 +134,8 @@
 	}
 
 	/**
+	 * Get this update wrapped by a ReceiveCommand.
+	 *
 	 * @return this update wrapped by a ReceiveCommand.
 	 * @since 3.4
 	 */
@@ -201,6 +205,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java
index 099629c..4c70725 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java
@@ -157,6 +157,8 @@
 	}
 
 	/**
+	 * Create checker to verify fetched objects
+	 *
 	 * @return checker to verify fetched objects, or null if checking is not
 	 *         enabled in the repository configuration.
 	 * @since 3.6
@@ -167,6 +169,8 @@
 	}
 
 	/**
+	 * Create checker to verify objects pushed into this repository
+	 *
 	 * @return checker to verify objects pushed into this repository, or null if
 	 *         checking is not enabled in the repository configuration.
 	 * @since 4.2
@@ -196,6 +200,8 @@
 	}
 
 	/**
+	 * Whether to allow clients to request non-advertised tip SHA-1s
+	 *
 	 * @return allow clients to request non-advertised tip SHA-1s?
 	 * @since 3.1
 	 */
@@ -204,6 +210,8 @@
 	}
 
 	/**
+	 * Whether to allow clients to request non-tip SHA-1s
+	 *
 	 * @return allow clients to request non-tip SHA-1s?
 	 * @since 4.1
 	 */
@@ -212,7 +220,11 @@
 	}
 
 	/**
-	 * @return {@link RefFilter} respecting configured hidden refs.
+	 * Get {@link org.eclipse.jgit.transport.RefFilter} respecting configured
+	 * hidden refs.
+	 *
+	 * @return {@link org.eclipse.jgit.transport.RefFilter} respecting
+	 *         configured hidden refs.
 	 * @since 3.1
 	 */
 	public RefFilter getRefFilter() {
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 649e840..8db796a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java
@@ -78,7 +78,6 @@
 import org.eclipse.jgit.hooks.PrePushHook;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectChecker;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ProgressMonitor;
@@ -215,7 +214,8 @@
 	 * Protocol definitions are held by WeakReference, allowing them to be
 	 * garbage collected when the calling application drops all strongly held
 	 * references to the TransportProtocol. Therefore applications should use a
-	 * singleton pattern as described in {@link TransportProtocol}'s class
+	 * singleton pattern as described in
+	 * {@link org.eclipse.jgit.transport.TransportProtocol}'s class
 	 * documentation to ensure their protocol does not get disabled by garbage
 	 * collection earlier than expected.
 	 * <p>
@@ -270,7 +270,8 @@
 	/**
 	 * Open a new transport instance to connect two repositories.
 	 * <p>
-	 * This method assumes {@link Operation#FETCH}.
+	 * This method assumes
+	 * {@link org.eclipse.jgit.transport.Transport.Operation#FETCH}.
 	 *
 	 * @param local
 	 *            existing local repository.
@@ -279,12 +280,12 @@
 	 *            configuration name.
 	 * @return the new transport instance. Never null. In case of multiple URIs
 	 *         in remote configuration, only the first is chosen.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             the location is not a remote defined in the configuration
 	 *             file and is not a well-formed URL.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static Transport open(final Repository local, final String remote)
@@ -306,12 +307,12 @@
 	 *            based on the type of connection desired.
 	 * @return the new transport instance. Never null. In case of multiple URIs
 	 *         in remote configuration, only the first is chosen.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             the location is not a remote defined in the configuration
 	 *             file and is not a well-formed URL.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static Transport open(final Repository local, final String remote,
@@ -330,7 +331,8 @@
 	/**
 	 * Open new transport instances to connect two repositories.
 	 * <p>
-	 * This method assumes {@link Operation#FETCH}.
+	 * This method assumes
+	 * {@link org.eclipse.jgit.transport.Transport.Operation#FETCH}.
 	 *
 	 * @param local
 	 *            existing local repository.
@@ -339,12 +341,12 @@
 	 *            configuration name.
 	 * @return the list of new transport instances for every URI in remote
 	 *         configuration.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             the location is not a remote defined in the configuration
 	 *             file and is not a well-formed URL.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static List<Transport> openAll(final Repository local,
@@ -366,12 +368,12 @@
 	 *            based on the type of connection desired.
 	 * @return the list of new transport instances for every URI in remote
 	 *         configuration.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 *             the location is not a remote defined in the configuration
 	 *             file and is not a well-formed URL.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static List<Transport> openAll(final Repository local,
@@ -390,7 +392,8 @@
 	/**
 	 * Open a new transport instance to connect two repositories.
 	 * <p>
-	 * This method assumes {@link Operation#FETCH}.
+	 * This method assumes
+	 * {@link org.eclipse.jgit.transport.Transport.Operation#FETCH}.
 	 *
 	 * @param local
 	 *            existing local repository.
@@ -399,11 +402,11 @@
 	 *            repository.
 	 * @return the new transport instance. Never null. In case of multiple URIs
 	 *         in remote configuration, only the first is chosen.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             if provided remote configuration doesn't have any URI
 	 *             associated.
 	 */
@@ -425,11 +428,11 @@
 	 *            based on the type of connection desired.
 	 * @return the new transport instance. Never null. In case of multiple URIs
 	 *         in remote configuration, only the first is chosen.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             if provided remote configuration doesn't have any URI
 	 *             associated.
 	 */
@@ -448,7 +451,8 @@
 	/**
 	 * Open new transport instances to connect two repositories.
 	 * <p>
-	 * This method assumes {@link Operation#FETCH}.
+	 * This method assumes
+	 * {@link org.eclipse.jgit.transport.Transport.Operation#FETCH}.
 	 *
 	 * @param local
 	 *            existing local repository.
@@ -457,9 +461,9 @@
 	 *            repository.
 	 * @return the list of new transport instances for every URI in remote
 	 *         configuration.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static List<Transport> openAll(final Repository local,
@@ -481,9 +485,9 @@
 	 *            based on the type of connection desired.
 	 * @return the list of new transport instances for every URI in remote
 	 *         configuration.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static List<Transport> openAll(final Repository local,
@@ -527,9 +531,9 @@
 	 * @param uri
 	 *            location of the remote repository.
 	 * @return the new transport instance. Never null.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static Transport open(final Repository local, final URIish uri)
@@ -548,9 +552,9 @@
 	 *            name of the remote, if the remote as configured in
 	 *            {@code local}; otherwise null.
 	 * @return the new transport instance. Never null.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the protocol specified is not supported.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public static Transport open(Repository local, URIish uri, String remoteName)
@@ -580,10 +584,10 @@
 	 * Note that the resulting transport instance can not be used for fetching
 	 * or pushing, but only for reading remote refs.
 	 *
-	 * @param uri
+	 * @param uri a {@link org.eclipse.jgit.transport.URIish} object.
 	 * @return new Transport instance
-	 * @throws NotSupportedException
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 */
 	public static Transport open(URIish uri) throws NotSupportedException, TransportException {
 		for (WeakReference<TransportProtocol> ref : protocols) {
@@ -601,12 +605,13 @@
 	}
 
 	/**
-	 * Convert push remote refs update specification from {@link RefSpec} form
-	 * to {@link RemoteRefUpdate}. Conversion expands wildcards by matching
-	 * source part to local refs. expectedOldObjectId in RemoteRefUpdate is
-	 * set when specified in leases. Tracking branch is configured if RefSpec
-	 * destination matches source of any fetch ref spec for this transport
-	 * remote configuration.
+	 * Convert push remote refs update specification from
+	 * {@link org.eclipse.jgit.transport.RefSpec} form to
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate}. Conversion expands
+	 * wildcards by matching source part to local refs. expectedOldObjectId in
+	 * RemoteRefUpdate is set when specified in leases. Tracking branch is
+	 * configured if RefSpec destination matches source of any fetch ref spec
+	 * for this transport remote configuration.
 	 *
 	 * @param db
 	 *            local database.
@@ -617,8 +622,9 @@
 	 * @param fetchSpecs
 	 *            fetch specifications used for finding localtracking refs. May
 	 *            be null or empty collection.
-	 * @return collection of set up {@link RemoteRefUpdate}.
-	 * @throws IOException
+	 * @return collection of set up
+	 *         {@link org.eclipse.jgit.transport.RemoteRefUpdate}.
+	 * @throws java.io.IOException
 	 *             when problem occurred during conversion or specification set
 	 *             up: most probably, missing objects or refs.
 	 * @since 4.7
@@ -668,12 +674,13 @@
 	}
 
 	/**
-	 * Convert push remote refs update specification from {@link RefSpec} form
-	 * to {@link RemoteRefUpdate}. Conversion expands wildcards by matching
-	 * source part to local refs. expectedOldObjectId in RemoteRefUpdate is
-	 * always set as null. Tracking branch is configured if RefSpec destination
-	 * matches source of any fetch ref spec for this transport remote
-	 * configuration.
+	 * Convert push remote refs update specification from
+	 * {@link org.eclipse.jgit.transport.RefSpec} form to
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate}. Conversion expands
+	 * wildcards by matching source part to local refs. expectedOldObjectId in
+	 * RemoteRefUpdate is always set as null. Tracking branch is configured if
+	 * RefSpec destination matches source of any fetch ref spec for this
+	 * transport remote configuration.
 	 *
 	 * @param db
 	 *            local database.
@@ -682,8 +689,9 @@
 	 * @param fetchSpecs
 	 *            fetch specifications used for finding localtracking refs. May
 	 *            be null or empty collection.
-	 * @return collection of set up {@link RemoteRefUpdate}.
-	 * @throws IOException
+	 * @return collection of set up
+	 *         {@link org.eclipse.jgit.transport.RemoteRefUpdate}.
+	 * @throws java.io.IOException
 	 *             when problem occurred during conversion or specification set
 	 *             up: most probably, missing objects or refs.
 	 */
@@ -838,6 +846,7 @@
 	 * Create a minimal transport instance not tied to a single repository.
 	 *
 	 * @param uri
+	 *            a {@link org.eclipse.jgit.transport.URIish} object.
 	 */
 	protected Transport(final URIish uri) {
 		this.uri = uri;
@@ -923,6 +932,8 @@
 	}
 
 	/**
+	 * Whether fetch will verify if received objects are formatted correctly.
+	 *
 	 * @return true if fetch will verify received objects are formatted
 	 *         correctly. Validating objects requires more CPU time on the
 	 *         client side of the connection.
@@ -932,6 +943,8 @@
 	}
 
 	/**
+	 * Configure if checking received objects is enabled
+	 *
 	 * @param check
 	 *            true to enable checking received objects; false to assume all
 	 *            received objects are valid.
@@ -945,6 +958,8 @@
 	}
 
 	/**
+	 * Get configured object checker for received objects
+	 *
 	 * @return configured object checker for received objects, or null.
 	 * @since 3.6
 	 */
@@ -953,6 +968,8 @@
 	}
 
 	/**
+	 * Set the object checker to verify each received object with
+	 *
 	 * @param impl
 	 *            if non-null the object checking instance to verify each
 	 *            received object with; null to disable object checking.
@@ -963,7 +980,8 @@
 	}
 
 	/**
-	 * Default setting is: {@link RemoteConfig#DEFAULT_RECEIVE_PACK}
+	 * Default setting is:
+	 * {@link org.eclipse.jgit.transport.RemoteConfig#DEFAULT_RECEIVE_PACK}
 	 *
 	 * @return remote executable providing receive-pack service for pack
 	 *         transports.
@@ -975,7 +993,8 @@
 
 	/**
 	 * Set remote executable providing receive-pack service for pack transports.
-	 * Default setting is: {@link RemoteConfig#DEFAULT_RECEIVE_PACK}
+	 * Default setting is:
+	 * {@link org.eclipse.jgit.transport.RemoteConfig#DEFAULT_RECEIVE_PACK}
 	 *
 	 * @param optionReceivePack
 	 *            remote executable, if null or empty default one is set;
@@ -1036,6 +1055,9 @@
 	}
 
 	/**
+	 * Whether destination refs should be removed if they no longer exist at the
+	 * source repository.
+	 *
 	 * @return true if destination refs should be removed if they no longer
 	 *         exist at the source repository.
 	 */
@@ -1075,6 +1097,9 @@
 	}
 
 	/**
+	 * Whether push operation should just check for possible result and not
+	 * really update remote refs
+	 *
 	 * @return true if push operation should just check for possible result and
 	 *         not really update remote refs, false otherwise - when push should
 	 *         act normally.
@@ -1095,7 +1120,11 @@
 		this.dryRun = dryRun;
 	}
 
-	/** @return timeout (in seconds) before aborting an IO operation. */
+	/**
+	 * Get timeout (in seconds) before aborting an IO operation.
+	 *
+	 * @return timeout (in seconds) before aborting an IO operation.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
@@ -1159,6 +1188,8 @@
 	}
 
 	/**
+	 * Get the option strings associated with the push operation
+	 *
 	 * @return the option strings associated with the push operation
 	 * @since 4.5
 	 */
@@ -1182,22 +1213,24 @@
 	 * <p>
 	 * This is a utility function providing standard fetch behavior. Local
 	 * tracking refs associated with the remote repository are automatically
-	 * updated if this transport was created from a {@link RemoteConfig} with
-	 * fetch RefSpecs defined.
+	 * updated if this transport was created from a
+	 * {@link org.eclipse.jgit.transport.RemoteConfig} with fetch RefSpecs
+	 * defined.
 	 *
 	 * @param monitor
 	 *            progress monitor to inform the user about our processing
-	 *            activity. Must not be null. Use {@link NullProgressMonitor} if
-	 *            progress updates are not interesting or necessary.
+	 *            activity. Must not be null. Use
+	 *            {@link org.eclipse.jgit.lib.NullProgressMonitor} if progress
+	 *            updates are not interesting or necessary.
 	 * @param toFetch
 	 *            specification of refs to fetch locally. May be null or the
 	 *            empty collection to use the specifications from the
 	 *            RemoteConfig. Source for each RefSpec can't be null.
 	 * @return information describing the tracking refs updated.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             this transport implementation does not support fetching
 	 *             objects.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the remote connection could not be established or object
 	 *             copying (if necessary) failed or update specification was
 	 *             incorrect.
@@ -1252,17 +1285,18 @@
 	 * For setting up remote ref update specification from ref spec, see helper
 	 * method {@link #findRemoteRefUpdatesFor(Collection)}, predefined refspecs
 	 * ({@link #REFSPEC_TAGS}, {@link #REFSPEC_PUSH_ALL}) or consider using
-	 * directly {@link RemoteRefUpdate} for more possibilities.
+	 * directly {@link org.eclipse.jgit.transport.RemoteRefUpdate} for more
+	 * possibilities.
 	 * <p>
 	 * When {@link #isDryRun()} is true, result of this operation is just
 	 * estimation of real operation result, no real action is performed.
 	 *
 	 * @see RemoteRefUpdate
-	 *
 	 * @param monitor
 	 *            progress monitor to inform the user about our processing
-	 *            activity. Must not be null. Use {@link NullProgressMonitor} if
-	 *            progress updates are not interesting or necessary.
+	 *            activity. Must not be null. Use
+	 *            {@link org.eclipse.jgit.lib.NullProgressMonitor} if progress
+	 *            updates are not interesting or necessary.
 	 * @param toPush
 	 *            specification of refs to push. May be null or the empty
 	 *            collection to use the specifications from the RemoteConfig
@@ -1273,10 +1307,10 @@
 	 *            output stream to write messages to
 	 * @return information about results of remote refs updates, tracking refs
 	 *         updates and refs advertised by remote repository.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             this transport implementation does not support pushing
 	 *             objects.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the remote connection could not be established or object
 	 *             copying (if necessary) failed at I/O or protocol level or
 	 *             update specification was incorrect.
@@ -1322,30 +1356,30 @@
 	 * For setting up remote ref update specification from ref spec, see helper
 	 * method {@link #findRemoteRefUpdatesFor(Collection)}, predefined refspecs
 	 * ({@link #REFSPEC_TAGS}, {@link #REFSPEC_PUSH_ALL}) or consider using
-	 * directly {@link RemoteRefUpdate} for more possibilities.
+	 * directly {@link org.eclipse.jgit.transport.RemoteRefUpdate} for more
+	 * possibilities.
 	 * <p>
 	 * When {@link #isDryRun()} is true, result of this operation is just
 	 * estimation of real operation result, no real action is performed.
 	 *
 	 * @see RemoteRefUpdate
-	 *
 	 * @param monitor
 	 *            progress monitor to inform the user about our processing
-	 *            activity. Must not be null. Use {@link NullProgressMonitor} if
-	 *            progress updates are not interesting or necessary.
+	 *            activity. Must not be null. Use
+	 *            {@link org.eclipse.jgit.lib.NullProgressMonitor} if progress
+	 *            updates are not interesting or necessary.
 	 * @param toPush
 	 *            specification of refs to push. May be null or the empty
 	 *            collection to use the specifications from the RemoteConfig
 	 *            converted by {@link #findRemoteRefUpdatesFor(Collection)}. No
 	 *            more than 1 RemoteRefUpdate with the same remoteName is
 	 *            allowed. These objects are modified during this call.
-	 *
 	 * @return information about results of remote refs updates, tracking refs
 	 *         updates and refs advertised by remote repository.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             this transport implementation does not support pushing
 	 *             objects.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the remote connection could not be established or object
 	 *             copying (if necessary) failed at I/O or protocol level or
 	 *             update specification was incorrect.
@@ -1357,20 +1391,22 @@
 	}
 
 	/**
-	 * Convert push remote refs update specification from {@link RefSpec} form
-	 * to {@link RemoteRefUpdate}. Conversion expands wildcards by matching
-	 * source part to local refs. expectedOldObjectId in RemoteRefUpdate is
-	 * always set as null. Tracking branch is configured if RefSpec destination
-	 * matches source of any fetch ref spec for this transport remote
-	 * configuration.
+	 * Convert push remote refs update specification from
+	 * {@link org.eclipse.jgit.transport.RefSpec} form to
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate}. Conversion expands
+	 * wildcards by matching source part to local refs. expectedOldObjectId in
+	 * RemoteRefUpdate is always set as null. Tracking branch is configured if
+	 * RefSpec destination matches source of any fetch ref spec for this
+	 * transport remote configuration.
 	 * <p>
 	 * Conversion is performed for context of this transport (database, fetch
 	 * specifications).
 	 *
 	 * @param specs
 	 *            collection of RefSpec to convert.
-	 * @return collection of set up {@link RemoteRefUpdate}.
-	 * @throws IOException
+	 * @return collection of set up
+	 *         {@link org.eclipse.jgit.transport.RemoteRefUpdate}.
+	 * @throws java.io.IOException
 	 *             when problem occurred during conversion or specification set
 	 *             up: most probably, missing objects or refs.
 	 */
@@ -1381,12 +1417,13 @@
 	}
 
 	/**
-	 * Convert push remote refs update specification from {@link RefSpec} form
-	 * to {@link RemoteRefUpdate}. Conversion expands wildcards by matching
-	 * source part to local refs. expectedOldObjectId in RemoteRefUpdate is
-	 * set according to leases. Tracking branch is configured if RefSpec destination
-	 * matches source of any fetch ref spec for this transport remote
-	 * configuration.
+	 * Convert push remote refs update specification from
+	 * {@link org.eclipse.jgit.transport.RefSpec} form to
+	 * {@link org.eclipse.jgit.transport.RemoteRefUpdate}. Conversion expands
+	 * wildcards by matching source part to local refs. expectedOldObjectId in
+	 * RemoteRefUpdate is set according to leases. Tracking branch is configured
+	 * if RefSpec destination matches source of any fetch ref spec for this
+	 * transport remote configuration.
 	 * <p>
 	 * Conversion is performed for context of this transport (database, fetch
 	 * specifications).
@@ -1395,8 +1432,9 @@
 	 *            collection of RefSpec to convert.
 	 * @param leases
 	 *            map from ref to lease (containing expected old object id)
-	 * @return collection of set up {@link RemoteRefUpdate}.
-	 * @throws IOException
+	 * @return collection of set up
+	 *         {@link org.eclipse.jgit.transport.RemoteRefUpdate}.
+	 * @throws java.io.IOException
 	 *             when problem occurred during conversion or specification set
 	 *             up: most probably, missing objects or refs.
 	 * @since 4.7
@@ -1415,9 +1453,9 @@
 	 * be used for reading remote refs.
 	 *
 	 * @return a fresh connection to fetch from the remote repository.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the implementation does not support fetching.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the remote connection could not be established.
 	 */
 	public abstract FetchConnection openFetch() throws NotSupportedException,
@@ -1427,15 +1465,17 @@
 	 * Begins a new connection for pushing into the remote repository.
 	 *
 	 * @return a fresh connection to push into the remote repository.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             the implementation does not support pushing.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the remote connection could not be established
 	 */
 	public abstract PushConnection openPush() throws NotSupportedException,
 			TransportException;
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Close any resources used by this transport.
 	 * <p>
 	 * If the remote repository is contacted by a network socket this method
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 6cd119b..c6191eceb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportAmazonS3.java
@@ -86,8 +86,9 @@
  * extended HTTP/1.1 semantics. This make it possible to read or write Git data
  * from a remote repository that is stored on S3.
  * <p>
- * Unlike the HTTP variant (see {@link TransportHttp}) we rely upon being able
- * to list objects in a bucket, as the S3 API supports this function. By listing
+ * Unlike the HTTP variant (see
+ * {@link org.eclipse.jgit.transport.TransportHttp}) we rely upon being able to
+ * list objects in a bucket, as the S3 API supports this function. By listing
  * the bucket contents we can avoid relying on <code>objects/info/packs</code>
  * or <code>info/refs</code> in the remote repository.
  * <p>
@@ -201,6 +202,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		final DatabaseS3 c = new DatabaseS3(bucket, keyPrefix + "/objects"); //$NON-NLS-1$
@@ -209,6 +211,7 @@
 		return r;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		final DatabaseS3 c = new DatabaseS3(bucket, keyPrefix + "/objects"); //$NON-NLS-1$
@@ -217,6 +220,7 @@
 		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 f2ddc0d..58f021c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleFile.java
@@ -125,11 +125,20 @@
 		bundle = bundlePath;
 	}
 
+	/**
+	 * Constructor for TransportBundleFile.
+	 *
+	 * @param uri
+	 *            a {@link org.eclipse.jgit.transport.URIish} object.
+	 * @param bundlePath
+	 *            transport bundle path
+	 */
 	public TransportBundleFile(URIish uri, File bundlePath) {
 		super(uri);
 		bundle = bundlePath;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws NotSupportedException,
 			TransportException {
@@ -142,12 +151,14 @@
 		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 a9d881f..573367e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportBundleStream.java
@@ -90,6 +90,7 @@
 		src = in;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		if (src == null)
@@ -101,12 +102,14 @@
 		}
 	}
 
+	/** {@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 7bf5b94..816187e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitAnon.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitAnon.java
@@ -121,16 +121,19 @@
 		super(uri);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		return new TcpFetchConnection();
 	}
 
+	/** {@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 b1b910e..bc85e6f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
@@ -164,11 +164,13 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		return new SshFetchConnection();
 	}
 
+	/** {@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 7c3f738..db43edc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
@@ -291,8 +291,11 @@
 	}
 
 	/**
+	 * Set uri a {@link org.eclipse.jgit.transport.URIish} object.
+	 *
 	 * @param uri
-	 * @throws NotSupportedException
+	 *            a {@link org.eclipse.jgit.transport.URIish} object.
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 * @since 4.9
 	 */
 	protected void setURI(final URIish uri) throws NotSupportedException {
@@ -333,6 +336,7 @@
 		useSmartHttp = on;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException,
 			NotSupportedException {
@@ -427,6 +431,7 @@
 		return new BufferedReader(new InputStreamReader(in, Constants.CHARSET));
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws NotSupportedException,
 			TransportException {
@@ -465,6 +470,7 @@
 		return p;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// No explicit connections are maintained.
@@ -803,7 +809,7 @@
 	 * @param method HTTP request method
 	 * @param u url of the HTTP connection
 	 * @return the HTTP connection
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.3
 	 * @deprecated use {@link #httpOpen(String, URL, AcceptEncoding)} instead.
 	 */
@@ -819,7 +825,7 @@
 	 * @param u url of the HTTP connection
 	 * @param acceptEncoding accept-encoding header option
 	 * @return the HTTP connection
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.6
 	 */
 	protected HttpConnection httpOpen(String method, URL u,
@@ -1257,13 +1263,7 @@
 							}
 							authAttempts = 1;
 							// We only do the Kerberos part of SPNEGO, which
-							// requires only one attempt. We do *not* to the
-							// NTLM part of SPNEGO; it's a multi-round
-							// negotiation and among other problems it would
-							// be unclear when to stop if no HTTP_OK is
-							// forthcoming. In theory a malicious server
-							// could keep sending requests for another NTLM
-							// round, keeping a client stuck here.
+							// requires only one round.
 							break;
 						default:
 							// DIGEST or BASIC. Let's be sure we ignore
@@ -1305,6 +1305,27 @@
 				} catch (SSLHandshakeException e) {
 					handleSslFailure(e);
 					continue; // Re-try
+				} catch (IOException e) {
+					if (authenticator == null || authMethod
+							.getType() != HttpAuthMethod.Type.NONE) {
+						// Can happen for instance if the server advertises
+						// Negotiate, but the client isn't configured for
+						// Kerberos. The first time (authenticator == null) we
+						// must re-try even if the authMethod was NONE: this may
+						// occur if the server advertised NTLM on the GET
+						// and the HttpConnection managed to successfully
+						// authenticate under the hood with NTLM. We might not
+						// have picked this up on the GET's 200 response.
+						if (authMethod.getType() != HttpAuthMethod.Type.NONE) {
+							ignoreTypes.add(authMethod.getType());
+						}
+						// Start over with the remaining available methods.
+						authMethod = HttpAuthMethod.Type.NONE.method(null);
+						authenticator = authMethod;
+						authAttempts = 1;
+						continue;
+					}
+					throw e;
 				}
 			}
 		}
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 f483ec7..20eb898 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
@@ -178,6 +178,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		final String up = getOptionUploadPack();
@@ -194,6 +195,7 @@
 		return new InternalFetchConnection<>(this, upf, null, openRepo());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PushConnection openPush() throws TransportException {
 		final String rp = getOptionReceivePack();
@@ -210,11 +212,21 @@
 		return new InternalPushConnection<>(this, rpf, null, openRepo());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		// Resources must be established per-connection.
 	}
 
+	/**
+	 * Spawn process
+	 *
+	 * @param cmd
+	 *            command
+	 * @return a {@link java.lang.Process} object.
+	 * @throws org.eclipse.jgit.errors.TransportException
+	 *             if any.
+	 */
 	protected Process spawn(final String cmd)
 			throws TransportException {
 		try {
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 e08efc4..de58aa9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java
@@ -72,11 +72,12 @@
  *
  * <p>
  * Applications may register additional protocols for use by JGit by calling
- * {@link Transport#register(TransportProtocol)}. Because that API holds onto
- * the protocol object by a WeakReference, applications must ensure their own
- * ClassLoader retains the TransportProtocol for the life of the application.
- * Using a static singleton pattern as above will ensure the protocol is valid
- * so long as the ClassLoader that defines it remains valid.
+ * {@link org.eclipse.jgit.transport.Transport#register(TransportProtocol)}.
+ * Because that API holds onto the protocol object by a WeakReference,
+ * applications must ensure their own ClassLoader retains the TransportProtocol
+ * for the life of the application. Using a static singleton pattern as above
+ * will ensure the protocol is valid so long as the ClassLoader that defines it
+ * remains valid.
  * <p>
  * Applications may automatically register additional protocols by filling in
  * the names of their TransportProtocol defining classes using the services file
@@ -102,25 +103,45 @@
 		PATH,
 	}
 
-	/** @return text name of the protocol suitable for display to a user. */
+	/**
+	 * Get text name of the protocol suitable for display to a user.
+	 *
+	 * @return text name of the protocol suitable for display to a user.
+	 */
 	public abstract String getName();
 
-	/** @return immutable set of schemes supported by this protocol. */
+	/**
+	 * Get immutable set of schemes supported by this protocol.
+	 *
+	 * @return immutable set of schemes supported by this protocol.
+	 */
 	public Set<String> getSchemes() {
 		return Collections.emptySet();
 	}
 
-	/** @return immutable set of URIishFields that must be filled in. */
+	/**
+	 * Get immutable set of URIishFields that must be filled in.
+	 *
+	 * @return immutable set of URIishFields that must be filled in.
+	 */
 	public Set<URIishField> getRequiredFields() {
 		return Collections.unmodifiableSet(EnumSet.of(URIishField.PATH));
 	}
 
-	/** @return immutable set of URIishFields that may be filled in. */
+	/**
+	 * Get immutable set of URIishFields that may be filled in.
+	 *
+	 * @return immutable set of URIishFields that may be filled in.
+	 */
 	public Set<URIishField> getOptionalFields() {
 		return Collections.emptySet();
 	}
 
-	/** @return if a port is supported, the default port, else -1. */
+	/**
+	 * Get the default port if the protocol supports a port, else -1.
+	 *
+	 * @return the default port if the protocol supports a port, else -1.
+	 */
 	public int getDefaultPort() {
 		return -1;
 	}
@@ -246,9 +267,9 @@
 	 *            name of the remote, if the remote as configured in
 	 *            {@code local}; otherwise null.
 	 * @return the transport.
-	 * @throws NotSupportedException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
 	 *             this protocol does not support the URI.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             the transport cannot open this URI.
 	 */
 	public abstract Transport open(URIish uri, Repository local,
@@ -260,9 +281,10 @@
 	 * configuration instead of reading from configuration files.
 	 *
 	 * @param uri
+	 *            a {@link org.eclipse.jgit.transport.URIish} object.
 	 * @return new Transport
-	 * @throws NotSupportedException
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.NotSupportedException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 */
 	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 99e4809..e2d08b6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java
@@ -88,11 +88,12 @@
  * repository that is available over SSH, but whose remote host does not have
  * Git installed.
  * <p>
- * Unlike the HTTP variant (see {@link TransportHttp}) we rely upon being able
- * to list files in directories, as the SFTP protocol supports this function. By
+ * Unlike the HTTP variant (see
+ * {@link org.eclipse.jgit.transport.TransportHttp}) we rely upon being able to
+ * list files in directories, as the SFTP protocol supports this function. By
  * listing files through SFTP we can avoid needing to have current
- * <code>objects/info/packs</code> or <code>info/refs</code> files on the
- * remote repository and access the data directly, much as Git itself would.
+ * <code>objects/info/packs</code> or <code>info/refs</code> files on the remote
+ * repository and access the data directly, much as Git itself would.
  * <p>
  * Concurrent pushing over this transport is not supported. Multiple concurrent
  * push operations may cause confusion in the repository state.
@@ -139,6 +140,7 @@
 		super(local, uri);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FetchConnection openFetch() throws TransportException {
 		final SftpObjectDB c = new SftpObjectDB(uri.getPath());
@@ -147,6 +149,7 @@
 		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 ffd4d41..a048fe3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
@@ -95,7 +95,7 @@
 	 * Part of a pattern which matches the optional port part of URIs. Defines
 	 * one capturing group containing the port without the preceding colon.
 	 */
-	private static final String OPT_PORT_P = "(?::(\\d+))?"; //$NON-NLS-1$
+	private static final String OPT_PORT_P = "(?::(\\d*))?"; //$NON-NLS-1$
 
 	/**
 	 * Part of a pattern which matches the ~username part (e.g. /~root in
@@ -200,10 +200,12 @@
 	private String host;
 
 	/**
-	 * Parse and construct an {@link URIish} from a string
+	 * Parse and construct an {@link org.eclipse.jgit.transport.URIish} from a
+	 * string
 	 *
 	 * @param s
-	 * @throws URISyntaxException
+	 *            a {@link java.lang.String} object.
+	 * @throws java.net.URISyntaxException
 	 */
 	public URIish(String s) throws URISyntaxException {
 		if (StringUtils.isEmptyOrNull(s)) {
@@ -222,11 +224,23 @@
 			scheme = matcher.group(1);
 			user = unescape(matcher.group(2));
 			pass = unescape(matcher.group(3));
-			host = unescape(matcher.group(4));
-			if (matcher.group(5) != null)
-				port = Integer.parseInt(matcher.group(5));
-			rawPath = cleanLeadingSlashes(
-					n2e(matcher.group(6)) + n2e(matcher.group(7)), scheme);
+			// empty ports are in general allowed, except for URLs like
+			// file://D:/path for which it is more desirable to parse with
+			// host=null and path=D:/path
+			String portString = matcher.group(5);
+			if ("file".equals(scheme) && "".equals(portString)) { //$NON-NLS-1$ //$NON-NLS-2$
+				rawPath = cleanLeadingSlashes(
+						n2e(matcher.group(4)) + ":" + portString //$NON-NLS-1$
+								+ n2e(matcher.group(6)) + n2e(matcher.group(7)),
+						scheme);
+			} else {
+				host = unescape(matcher.group(4));
+				if (portString != null && portString.length() > 0) {
+					port = Integer.parseInt(portString);
+				}
+				rawPath = cleanLeadingSlashes(
+						n2e(matcher.group(6)) + n2e(matcher.group(7)), scheme);
+			}
 			path = unescape(rawPath);
 			return;
 		}
@@ -395,7 +409,9 @@
 		host = u.getHost();
 	}
 
-	/** Create an empty, non-configured URI. */
+	/**
+	 * Create an empty, non-configured URI.
+	 */
 	public URIish() {
 		// Configure nothing.
 	}
@@ -411,6 +427,8 @@
 	}
 
 	/**
+	 * Whether this URI references a repository on another system.
+	 *
 	 * @return true if this URI references a repository on another system.
 	 */
 	public boolean isRemote() {
@@ -418,6 +436,8 @@
 	}
 
 	/**
+	 * Get host name part.
+	 *
 	 * @return host name part or null
 	 */
 	public String getHost() {
@@ -438,6 +458,8 @@
 	}
 
 	/**
+	 * Get protocol name
+	 *
 	 * @return protocol name or null for local references
 	 */
 	public String getScheme() {
@@ -458,6 +480,8 @@
 	}
 
 	/**
+	 * Get path name component
+	 *
 	 * @return path name component
 	 */
 	public String getPath() {
@@ -465,6 +489,8 @@
 	}
 
 	/**
+	 * Get path name component
+	 *
 	 * @return path name component
 	 */
 	public String getRawPath() {
@@ -491,7 +517,7 @@
 	 * @param n
 	 *            the new value for path.
 	 * @return a new URI with the updated value.
-	 * @throws URISyntaxException
+	 * @throws java.net.URISyntaxException
 	 */
 	public URIish setRawPath(final String n) throws URISyntaxException {
 		final URIish r = new URIish(this);
@@ -501,6 +527,8 @@
 	}
 
 	/**
+	 * Get user name requested for transfer
+	 *
 	 * @return user name requested for transfer or null
 	 */
 	public String getUser() {
@@ -521,6 +549,8 @@
 	}
 
 	/**
+	 * Get password requested for transfer
+	 *
 	 * @return password requested for transfer or null
 	 */
 	public String getPass() {
@@ -541,6 +571,8 @@
 	}
 
 	/**
+	 * Get port number requested for transfer or -1 if not explicit
+	 *
 	 * @return port number requested for transfer or -1 if not explicit
 	 */
 	public int getPort() {
@@ -560,6 +592,7 @@
 		return r;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int hashCode() {
 		int hc = 0;
@@ -578,6 +611,7 @@
 		return hc;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean equals(final Object obj) {
 		if (!(obj instanceof URIish))
@@ -617,6 +651,7 @@
 		return format(true, false);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return format(false, false);
@@ -666,6 +701,8 @@
 	}
 
 	/**
+	 * Get the URI as an ASCII string.
+	 *
 	 * @return the URI as an ASCII string. Password is not included.
 	 */
 	public String toASCIIString() {
@@ -673,6 +710,9 @@
 	}
 
 	/**
+	 * Convert the URI including password, formatted with only ASCII characters
+	 * such that it will be valid for use over the network.
+	 *
 	 * @return the URI including password, formatted with only ASCII characters
 	 *         such that it will be valid for use over the network.
 	 */
@@ -713,7 +753,7 @@
 	 *
 	 * @return the "humanish" part of the path. May be an empty string. Never
 	 *         {@code null}.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             if it's impossible to determine a humanish part, or path is
 	 *             {@code null} or empty
 	 * @see #getPath
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 63236cb..5c52b73 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -77,13 +77,17 @@
 import org.eclipse.jgit.errors.PackProtocolException;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.storage.pack.PackWriter;
+import org.eclipse.jgit.lib.BitmapIndex;
+import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.AsyncRevObjectQueue;
+import org.eclipse.jgit.revwalk.BitmapWalker;
 import org.eclipse.jgit.revwalk.DepthWalk;
 import org.eclipse.jgit.revwalk.ObjectWalk;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -341,12 +345,20 @@
 		setTransferConfig(null);
 	}
 
-	/** @return the repository this upload is reading from. */
+	/**
+	 * Get the repository this upload is reading from.
+	 *
+	 * @return the repository this upload is reading from.
+	 */
 	public final Repository getRepository() {
 		return db;
 	}
 
-	/** @return the RevWalk instance used by this connection. */
+	/**
+	 * Get the RevWalk instance used by this connection.
+	 *
+	 * @return the RevWalk instance used by this connection.
+	 */
 	public final RevWalk getRevWalk() {
 		return walk;
 	}
@@ -364,14 +376,15 @@
 	/**
 	 * Set the refs advertised by this UploadPack.
 	 * <p>
-	 * Intended to be called from a {@link PreUploadHook}.
+	 * Intended to be called from a
+	 * {@link org.eclipse.jgit.transport.PreUploadHook}.
 	 *
 	 * @param allRefs
 	 *            explicit set of references to claim as advertised by this
-	 *            UploadPack instance. This overrides any references that
-	 *            may exist in the source repository. The map is passed
-	 *            to the configured {@link #getRefFilter()}. If null, assumes
-	 *            all refs were advertised.
+	 *            UploadPack instance. This overrides any references that may
+	 *            exist in the source repository. The map is passed to the
+	 *            configured {@link #getRefFilter()}. If null, assumes all refs
+	 *            were advertised.
 	 */
 	public void setAdvertisedRefs(Map<String, Ref> allRefs) {
 		if (allRefs != null)
@@ -384,7 +397,11 @@
 			refs = refFilter.filter(refs);
 	}
 
-	/** @return timeout (in seconds) before aborting an IO operation. */
+	/**
+	 * Get timeout (in seconds) before aborting an IO operation.
+	 *
+	 * @return timeout (in seconds) before aborting an IO operation.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
@@ -402,6 +419,9 @@
 	}
 
 	/**
+	 * Whether this class expects a bi-directional pipe opened between the
+	 * client and itself.
+	 *
 	 * @return true if this class expects a bi-directional pipe opened between
 	 *         the client and itself. The default is true.
 	 */
@@ -410,6 +430,9 @@
 	}
 
 	/**
+	 * Set whether this class will assume the socket is a fully bidirectional
+	 * pipe between the two peers
+	 *
 	 * @param twoWay
 	 *            if true, this class will assume the socket is a fully
 	 *            bidirectional pipe between the two peers and takes advantage
@@ -423,8 +446,10 @@
 	}
 
 	/**
-	 * @return policy used by the service to validate client requests, or null for
-	 *         a custom request validator.
+	 * Get policy used by the service to validate client requests
+	 *
+	 * @return policy used by the service to validate client requests, or null
+	 *         for a custom request validator.
 	 */
 	public RequestPolicy getRequestPolicy() {
 		if (requestValidator instanceof AdvertisedRequestValidator)
@@ -441,15 +466,21 @@
 	}
 
 	/**
+	 * Set the policy used to enforce validation of a client's want list.
+	 *
 	 * @param policy
 	 *            the policy used to enforce validation of a client's want list.
-	 *            By default the policy is {@link RequestPolicy#ADVERTISED},
+	 *            By default the policy is
+	 *            {@link org.eclipse.jgit.transport.UploadPack.RequestPolicy#ADVERTISED},
 	 *            which is the Git default requiring clients to only ask for an
-	 *            object that a reference directly points to. This may be relaxed
-	 *            to {@link RequestPolicy#REACHABLE_COMMIT} or
-	 *            {@link RequestPolicy#REACHABLE_COMMIT_TIP} when callers have
-	 *            {@link #setBiDirectionalPipe(boolean)} set to false.
-	 *            Overrides any policy specified in a {@link TransferConfig}.
+	 *            object that a reference directly points to. This may be
+	 *            relaxed to
+	 *            {@link org.eclipse.jgit.transport.UploadPack.RequestPolicy#REACHABLE_COMMIT}
+	 *            or
+	 *            {@link org.eclipse.jgit.transport.UploadPack.RequestPolicy#REACHABLE_COMMIT_TIP}
+	 *            when callers have {@link #setBiDirectionalPipe(boolean)} set
+	 *            to false. Overrides any policy specified in a
+	 *            {@link org.eclipse.jgit.transport.TransferConfig}.
 	 */
 	public void setRequestPolicy(RequestPolicy policy) {
 		switch (policy) {
@@ -473,6 +504,8 @@
 	}
 
 	/**
+	 * Set custom validator for client want list.
+	 *
 	 * @param validator
 	 *            custom validator for client want list.
 	 * @since 3.1
@@ -482,12 +515,20 @@
 				: new AdvertisedRequestValidator();
 	}
 
-	/** @return the hook used while advertising the refs to the client */
+	/**
+	 * Get the hook used while advertising the refs to the client.
+	 *
+	 * @return the hook used while advertising the refs to the client.
+	 */
 	public AdvertiseRefsHook getAdvertiseRefsHook() {
 		return advertiseRefsHook;
 	}
 
-	/** @return the filter used while advertising the refs to the client */
+	/**
+	 * Get the filter used while advertising the refs to the client.
+	 *
+	 * @return the filter used while advertising the refs to the client.
+	 */
 	public RefFilter getRefFilter() {
 		return refFilter;
 	}
@@ -495,9 +536,10 @@
 	/**
 	 * Set the hook used while advertising the refs to the client.
 	 * <p>
-	 * If the {@link AdvertiseRefsHook} chooses to call
-	 * {@link #setAdvertisedRefs(Map)}, only refs set by this hook <em>and</em>
-	 * selected by the {@link RefFilter} will be shown to the client.
+	 * If the {@link org.eclipse.jgit.transport.AdvertiseRefsHook} chooses to
+	 * call {@link #setAdvertisedRefs(Map)}, only refs set by this hook
+	 * <em>and</em> selected by the {@link org.eclipse.jgit.transport.RefFilter}
+	 * will be shown to the client.
 	 *
 	 * @param advertiseRefsHook
 	 *            the hook; may be null to show all refs.
@@ -512,10 +554,11 @@
 	/**
 	 * Set the filter used while advertising the refs to the client.
 	 * <p>
-	 * Only refs allowed by this filter will be sent to the client.
-	 * The filter is run against the refs specified by the
-	 * {@link AdvertiseRefsHook} (if applicable). If null or not set, uses the
-	 * filter implied by the {@link TransferConfig}.
+	 * Only refs allowed by this filter will be sent to the client. The filter
+	 * is run against the refs specified by the
+	 * {@link org.eclipse.jgit.transport.AdvertiseRefsHook} (if applicable). If
+	 * null or not set, uses the filter implied by the
+	 * {@link org.eclipse.jgit.transport.TransferConfig}.
 	 *
 	 * @param refFilter
 	 *            the filter; may be null to show all refs.
@@ -524,7 +567,11 @@
 		this.refFilter = refFilter != null ? refFilter : RefFilter.DEFAULT;
 	}
 
-	/** @return the configured pre upload hook. */
+	/**
+	 * Get the configured pre upload hook.
+	 *
+	 * @return the configured pre upload hook.
+	 */
 	public PreUploadHook getPreUploadHook() {
 		return preUploadHook;
 	}
@@ -540,6 +587,8 @@
 	}
 
 	/**
+	 * Get the configured post upload hook.
+	 *
 	 * @return the configured post upload hook.
 	 * @since 4.1
 	 */
@@ -570,6 +619,8 @@
 	}
 
 	/**
+	 * Set configuration controlling transfer options.
+	 *
 	 * @param tc
 	 *            configuration controlling transfer options. If null the source
 	 *            repository's settings will be used.
@@ -587,8 +638,9 @@
 	}
 
 	/**
-	 * @return the configured logger.
+	 * Get the configured logger.
 	 *
+	 * @return the configured logger.
 	 * @deprecated Use {@link #getPreUploadHook()}.
 	 */
 	@Deprecated
@@ -613,7 +665,7 @@
 	 *
 	 * @return true if the client has advertised a side-band capability, false
 	 *     otherwise.
-	 * @throws RequestNotYetReadException
+	 * @throws org.eclipse.jgit.transport.RequestNotYetReadException
 	 *             if the client's request has not yet been read from the wire, so
 	 *             we do not know if they expect side-band. Note that the client
 	 *             may have already written the request, it just has not been
@@ -641,7 +693,7 @@
 	 *            through. When run over SSH this should be tied back to the
 	 *            standard error channel of the command execution. For most
 	 *            other network connections this should be null.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void upload(final InputStream input, OutputStream output,
 			final OutputStream messages) throws IOException {
@@ -890,9 +942,9 @@
 	 *
 	 * @param adv
 	 *            the advertisement formatter.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the formatter failed to write an advertisement.
-	 * @throws ServiceMayNotContinueException
+	 * @throws org.eclipse.jgit.transport.ServiceMayNotContinueException
 	 *             the hook denied advertisement.
 	 */
 	public void sendAdvertisedRefs(final RefAdvertiser adv) throws IOException,
@@ -949,6 +1001,8 @@
 	}
 
 	/**
+	 * Get an underlying stream for sending messages to the client
+	 *
 	 * @return an underlying stream for sending messages to the client, or null.
 	 * @since 3.1
 	 */
@@ -1311,6 +1365,18 @@
 		}
 	}
 
+	private static void checkNotAdvertisedWantsUsingBitmap(ObjectReader reader,
+			BitmapIndex bitmapIndex, List<ObjectId> notAdvertisedWants,
+			Set<ObjectId> reachableFrom) throws IOException {
+		BitmapWalker bitmapWalker = new BitmapWalker(new ObjectWalk(reader), bitmapIndex, null);
+		BitmapBuilder reachables = bitmapWalker.findObjects(reachableFrom, null, false);
+		for (ObjectId oid : notAdvertisedWants) {
+			if (!reachables.contains(oid)) {
+				throw new WantNotValidException(oid);
+			}
+		}
+	}
+
 	private static void checkNotAdvertisedWants(UploadPack up,
 			List<ObjectId> notAdvertisedWants, Set<ObjectId> reachableFrom)
 			throws MissingObjectException, IncorrectObjectTypeException, IOException {
@@ -1320,13 +1386,28 @@
 		// into an advertised branch it will be marked UNINTERESTING and no commits
 		// return.
 
-		try (RevWalk walk = new RevWalk(up.getRevWalk().getObjectReader())) {
+		ObjectReader reader = up.getRevWalk().getObjectReader();
+		try (RevWalk walk = new RevWalk(reader)) {
 			AsyncRevObjectQueue q = walk.parseAny(notAdvertisedWants, true);
 			try {
 				RevObject obj;
 				while ((obj = q.next()) != null) {
-					if (!(obj instanceof RevCommit))
+					if (!(obj instanceof RevCommit)) {
+						// If unadvertized non-commits are requested, use
+						// bitmaps. If there are no bitmaps, instead of
+						// incurring the expense of a manual walk, reject
+						// the request.
+						BitmapIndex bitmapIndex = reader.getBitmapIndex();
+						if (bitmapIndex != null) {
+							checkNotAdvertisedWantsUsingBitmap(
+									reader,
+									bitmapIndex,
+									notAdvertisedWants,
+									reachableFrom);
+							return;
+						}
 						throw new WantNotValidException(obj);
+					}
 					walk.markStart((RevCommit) obj);
 				}
 			} catch (MissingObjectException notFound) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackInternalServerErrorException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackInternalServerErrorException.java
index acdfe04..1813521 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackInternalServerErrorException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackInternalServerErrorException.java
@@ -45,7 +45,9 @@
 
 import java.io.IOException;
 
-/** UploadPack has already reported an error to the client.*/
+/**
+ * UploadPack has already reported an error to the client.
+ */
 public class UploadPackInternalServerErrorException extends IOException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLogger.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLogger.java
index afc9965..611418d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLogger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLogger.java
@@ -46,14 +46,15 @@
 import org.eclipse.jgit.internal.storage.pack.PackWriter;
 
 /**
- * Logs activity that occurred within {@link UploadPack}.
+ * Logs activity that occurred within
+ * {@link org.eclipse.jgit.transport.UploadPack}.
  * <p>
  * Implementors of the interface are responsible for associating the current
  * thread to a particular connection, if they need to also include connection
  * information. One method is to use a {@link java.lang.ThreadLocal} to remember
  * the connection information before invoking UploadPack.
  *
- * @deprecated use {@link PostUploadHook} instead
+ * @deprecated use {@link org.eclipse.jgit.transport.PostUploadHook} instead
  */
 @Deprecated
 public interface UploadPackLogger { // TODO remove in JGit 5.0
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLoggerChain.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLoggerChain.java
index 9a8c12c..9e14672 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLoggerChain.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPackLoggerChain.java
@@ -52,7 +52,8 @@
  * <p>
  * loggers are run in the order passed to the constructor.
  *
- * @deprecated Use {@link PostUploadHookChain} instead.
+ * @deprecated Use {@link org.eclipse.jgit.transport.PostUploadHookChain}
+ *             instead.
  */
 @Deprecated
 public class UploadPackLoggerChain implements UploadPackLogger {
@@ -81,9 +82,7 @@
 			return new UploadPackLoggerChain(newLoggers, i);
 	}
 
-	/**
-	 * @since 3.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public void onPackStatistics(PackWriter.Statistics stats) {
 		for (int i = 0; i < count; i++)
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 6caa5aa..4445c3d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UsernamePasswordCredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UsernamePasswordCredentialsProvider.java
@@ -48,7 +48,8 @@
 import org.eclipse.jgit.errors.UnsupportedCredentialItem;
 
 /**
- * Simple {@link CredentialsProvider} that always uses the same information.
+ * Simple {@link org.eclipse.jgit.transport.CredentialsProvider} that always
+ * uses the same information.
  */
 public class UsernamePasswordCredentialsProvider extends CredentialsProvider {
 	private String username;
@@ -59,7 +60,9 @@
 	 * Initialize the provider with a single username and password.
 	 *
 	 * @param username
+	 *            user name
 	 * @param password
+	 *            password
 	 */
 	public UsernamePasswordCredentialsProvider(String username, String password) {
 		this(username, password.toCharArray());
@@ -69,18 +72,22 @@
 	 * Initialize the provider with a single username and password.
 	 *
 	 * @param username
+	 *            user name
 	 * @param password
+	 *            password
 	 */
 	public UsernamePasswordCredentialsProvider(String username, char[] password) {
 		this.username = username;
 		this.password = password;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isInteractive() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supports(CredentialItem... items) {
 		for (CredentialItem i : items) {
@@ -96,6 +103,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean get(URIish uri, CredentialItem... items)
 			throws UnsupportedCredentialItem {
@@ -121,7 +129,9 @@
 		return true;
 	}
 
-	/** Destroy the saved username and password.. */
+	/**
+	 * Destroy the saved username and password..
+	 */
 	public void clear() {
 		username = null;
 
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 333e09d..615e46b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java
@@ -95,6 +95,20 @@
 	// consider permitting mixed ciphers to facilitate algorithm migration
 	// i.e. user keeps the password, but changes the algorithm
 	// then existing remote entries will still be readable
+	/**
+	 * Validate
+	 *
+	 * @param u
+	 *            a {@link java.net.HttpURLConnection} object.
+	 * @param prefix
+	 *            a {@link java.lang.String} object.
+	 * @param version
+	 *            a {@link java.lang.String} object.
+	 * @param name
+	 *            a {@link java.lang.String} object.
+	 * @throws java.io.IOException
+	 *             if any.
+	 */
 	protected void validateImpl(final HttpURLConnection u, final String prefix,
 			final String version, final String name) throws IOException {
 		String v;
@@ -115,10 +129,9 @@
 	}
 
 	IOException error(final Throwable why) {
-		final IOException e;
-		e = new IOException(MessageFormat.format(JGitText.get().encryptionError, why.getMessage()));
-		e.initCause(why);
-		return e;
+		return new IOException(MessageFormat
+				.format(JGitText.get().encryptionError,
+				why.getMessage()), why);
 	}
 
 	private static class NoEncryption extends WalkEncryption {
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 3d60aed..6708964 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java
@@ -223,11 +223,13 @@
 		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)
@@ -249,16 +251,19 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Collection<PackLock> getPackLocks() {
 		return packLocks;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setPackLockMessage(final 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 5c4e14c..cf50c51 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkPushConnection.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkPushConnection.java
@@ -134,6 +134,7 @@
 		dest = w;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates)
@@ -141,6 +142,7 @@
 		push(monitor, refUpdates, null);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void push(final ProgressMonitor monitor,
 			final Map<String, RemoteRefUpdate> refUpdates, OutputStream out)
@@ -212,6 +214,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() {
 		dest.close();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkRemoteObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkRemoteObjectDatabase.java
index 17f8c3e..a0ad2f3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkRemoteObjectDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkRemoteObjectDatabase.java
@@ -417,7 +417,7 @@
 	 * @param avail
 	 *            return collection of references. Any existing entries will be
 	 *            replaced if they are found in the packed-refs file.
-	 * @throws TransportException
+	 * @throws org.eclipse.jgit.errors.TransportException
 	 *             an error occurred reading from the packed refs file.
 	 */
 	protected void readPackedRefs(final Map<String, Ref> avail)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkTransport.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkTransport.java
index f1c4357..8262d00 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkTransport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkTransport.java
@@ -53,8 +53,9 @@
  * from the loose objects directory, or entire packs if the source side does not
  * have the object as a loose object.
  * <p>
- * WalkTransports are not as efficient as {@link PackTransport} instances, but
- * can be useful in situations where a pack transport is not acceptable.
+ * WalkTransports are not as efficient as
+ * {@link org.eclipse.jgit.transport.PackTransport} instances, but can be useful
+ * in situations where a pack transport is not acceptable.
  *
  * @see WalkFetchConnection
  */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WantNotValidException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WantNotValidException.java
index f0f6434..601b0d0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WantNotValidException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WantNotValidException.java
@@ -54,7 +54,7 @@
  * <p>
  * Typically visible only inside of the server implementation; clients are
  * usually looking at the text message from the server in a generic
- * {@link PackProtocolException}.
+ * {@link org.eclipse.jgit.errors.PackProtocolException}.
  *
  * @since 4.3
  */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WriteAbortedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WriteAbortedException.java
index 267bf7a..e3987ea 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WriteAbortedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WriteAbortedException.java
@@ -49,7 +49,7 @@
  * An exception to be thrown when the write operation is aborted.
  * <p>
  * That can be thrown inside
- * {@link ObjectCountCallback#setObjectCount(long)}.
+ * {@link org.eclipse.jgit.transport.ObjectCountCallback#setObjectCount(long)}.
  *
  * @since 4.1
  */
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 35a1ee1..d815bc3 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
@@ -56,13 +56,12 @@
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.KeyManager;
-import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
 
 /**
  * The interface of connections used during HTTP communication. This interface
- * is that subset of the interface exposed by {@link HttpURLConnection} which is
- * used by JGit
+ * is that subset of the interface exposed by {@link java.net.HttpURLConnection}
+ * which is used by JGit
  *
  * @since 3.3
  */
@@ -114,32 +113,42 @@
 	public static final int HTTP_FORBIDDEN = java.net.HttpURLConnection.HTTP_FORBIDDEN;
 
 	/**
+	 * Get response code
+	 *
 	 * @see HttpURLConnection#getResponseCode()
 	 * @return the HTTP Status-Code, or -1
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public int getResponseCode() throws IOException;
 
 	/**
+	 * Get URL
+	 *
 	 * @see HttpURLConnection#getURL()
 	 * @return the URL.
 	 */
 	public URL getURL();
 
 	/**
+	 * Get response message
+	 *
 	 * @see HttpURLConnection#getResponseMessage()
 	 * @return the HTTP response message, or <code>null</code>
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public String getResponseMessage() throws IOException;
 
 	/**
+	 * Get list of header fields
+	 *
 	 * @see HttpURLConnection#getHeaderFields()
 	 * @return a Map of header fields
 	 */
 	public Map<String, List<String>> getHeaderFields();
 
 	/**
+	 * Set request property
+	 *
 	 * @see HttpURLConnection#setRequestProperty(String, String)
 	 * @param key
 	 *            the keyword by which the request is known (e.g., "
@@ -150,17 +159,23 @@
 	public void setRequestProperty(String key, String value);
 
 	/**
+	 * Set request method
+	 *
 	 * @see HttpURLConnection#setRequestMethod(String)
 	 * @param method
 	 *            the HTTP method
 	 * @exception ProtocolException
 	 *                if the method cannot be reset or if the requested method
 	 *                isn't valid for HTTP.
+	 * @throws java.net.ProtocolException
+	 *             if any.
 	 */
 	public void setRequestMethod(String method)
 			throws ProtocolException;
 
 	/**
+	 * Set if to use caches
+	 *
 	 * @see HttpURLConnection#setUseCaches(boolean)
 	 * @param usecaches
 	 *            a <code>boolean</code> indicating whether or not to allow
@@ -169,6 +184,8 @@
 	public void setUseCaches(boolean usecaches);
 
 	/**
+	 * Set connect timeout
+	 *
 	 * @see HttpURLConnection#setConnectTimeout(int)
 	 * @param timeout
 	 *            an <code>int</code> that specifies the connect timeout value
@@ -177,6 +194,8 @@
 	public void setConnectTimeout(int timeout);
 
 	/**
+	 * Set read timeout
+	 *
 	 * @see HttpURLConnection#setReadTimeout(int)
 	 * @param timeout
 	 *            an <code>int</code> that specifies the timeout value to be
@@ -185,6 +204,8 @@
 	public void setReadTimeout(int timeout);
 
 	/**
+	 * Get content type
+	 *
 	 * @see HttpURLConnection#getContentType()
 	 * @return the content type of the resource that the URL references, or
 	 *         <code>null</code> if not known.
@@ -192,14 +213,20 @@
 	public String getContentType();
 
 	/**
+	 * Get input stream
+	 *
 	 * @see HttpURLConnection#getInputStream()
 	 * @return an input stream that reads from this open connection.
 	 * @exception IOException
 	 *                if an I/O error occurs while creating the input stream.
+	 * @throws java.io.IOException
+	 *             if any.
 	 */
 	public InputStream getInputStream() throws IOException;
 
 	/**
+	 * Get header field
+	 *
 	 * @see HttpURLConnection#getHeaderField(String)
 	 * @param name
 	 *            the name of a header field.
@@ -209,6 +236,8 @@
 	public String getHeaderField(String name);
 
 	/**
+	 * Get content length
+	 *
 	 * @see HttpURLConnection#getContentLength()
 	 * @return the content length of the resource that this connection's URL
 	 *         references, {@code -1} if the content length is not known, or if
@@ -217,6 +246,8 @@
 	public int getContentLength();
 
 	/**
+	 * Set whether or not to follow HTTP redirects.
+	 *
 	 * @see HttpURLConnection#setInstanceFollowRedirects(boolean)
 	 * @param followRedirects
 	 *            a <code>boolean</code> indicating whether or not to follow
@@ -225,27 +256,35 @@
 	public void setInstanceFollowRedirects(boolean followRedirects);
 
 	/**
+	 * Set if to do output
+	 *
 	 * @see HttpURLConnection#setDoOutput(boolean)
-     * @param   dooutput   the new value.
+	 * @param dooutput
+	 *            the new value.
 	 */
 	public void setDoOutput(boolean dooutput);
 
 	/**
+	 * Set fixed length streaming mode
+	 *
 	 * @see HttpURLConnection#setFixedLengthStreamingMode(int)
 	 * @param contentLength
 	 *            The number of bytes which will be written to the OutputStream.
-	 *
 	 */
 	public void setFixedLengthStreamingMode(int contentLength);
 
 	/**
+	 * Get output stream
+	 *
 	 * @see HttpURLConnection#getOutputStream()
 	 * @return an output stream that writes to this connection.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public OutputStream getOutputStream() throws IOException;
 
 	/**
+	 * Set chunked streaming mode
+	 *
 	 * @see HttpURLConnection#setChunkedStreamingMode(int)
 	 * @param chunklen
 	 *            The number of bytes to write in each chunk. If chunklen is
@@ -254,20 +293,26 @@
 	public void setChunkedStreamingMode(int chunklen);
 
 	/**
+	 * Get request method
+	 *
 	 * @see HttpURLConnection#getRequestMethod()
 	 * @return the HTTP request method
 	 */
 	public String getRequestMethod();
 
 	/**
+	 * Whether we use a proxy
+	 *
 	 * @see HttpURLConnection#usingProxy()
 	 * @return a boolean indicating if the connection is using a proxy.
 	 */
 	public boolean usingProxy();
 
 	/**
+	 * Connect
+	 *
 	 * @see HttpURLConnection#connect()
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void connect() throws IOException;
 
@@ -283,21 +328,22 @@
 	 *            whether credentials presented by a peer should be accepted.
 	 * @param random
 	 *            the source of randomness for this generator or null. See
-	 *            {@link SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}
-	 *
-	 * @throws NoSuchAlgorithmException
-	 * @throws KeyManagementException
+	 *            {@link javax.net.ssl.SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}
+	 * @throws java.security.NoSuchAlgorithmException
+	 * @throws java.security.KeyManagementException
 	 */
 	public void configure(KeyManager[] km, TrustManager[] tm,
 			SecureRandom random) throws NoSuchAlgorithmException,
 			KeyManagementException;
 
 	/**
-	 * Set the {@link HostnameVerifier} used during https communication
+	 * Set the {@link javax.net.ssl.HostnameVerifier} used during https
+	 * communication
 	 *
 	 * @param hostnameverifier
-	 * @throws NoSuchAlgorithmException
-	 * @throws KeyManagementException
+	 *            a {@link javax.net.ssl.HostnameVerifier} object.
+	 * @throws java.security.NoSuchAlgorithmException
+	 * @throws java.security.KeyManagementException
 	 */
 	public 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 591353c..bd9d61f 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
@@ -47,30 +47,33 @@
 import java.net.URL;
 
 /**
- * The interface of a factory returning {@link HttpConnection}
+ * The interface of a factory returning
+ * {@link org.eclipse.jgit.transport.http.HttpConnection}
  *
  * @since 3.3
  */
 public interface HttpConnectionFactory {
 	/**
-	 * Creates a new connection to a destination defined by a {@link URL}
+	 * Creates a new connection to a destination defined by a
+	 * {@link java.net.URL}
 	 *
 	 * @param url
-	 * @return a {@link HttpConnection}
-	 * @throws IOException
+	 *            a {@link java.net.URL} object.
+	 * @return a {@link org.eclipse.jgit.transport.http.HttpConnection}
+	 * @throws java.io.IOException
 	 */
 	public HttpConnection create(URL url) throws IOException;
 
 	/**
-	 * Creates a new connection to a destination defined by a {@link URL} using
-	 * a proxy
+	 * Creates a new connection to a destination defined by a
+	 * {@link java.net.URL} using a proxy
 	 *
 	 * @param url
+	 *            a {@link java.net.URL} object.
 	 * @param proxy
 	 *            the proxy to be used
-	 * @return a {@link HttpConnection}
-	 *
-	 * @throws IOException
+	 * @return a {@link org.eclipse.jgit.transport.http.HttpConnection}
+	 * @throws java.io.IOException
 	 */
 	public HttpConnection create(URL url, Proxy proxy)
 			throws IOException;
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 534e3d7..8241c59 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
@@ -63,8 +63,9 @@
 import javax.net.ssl.TrustManager;
 
 /**
- * A {@link HttpConnection} which simply delegates every call to a
- * {@link HttpURLConnection}. This is the default implementation used by JGit
+ * A {@link org.eclipse.jgit.transport.http.HttpConnection} which simply
+ * delegates every call to a {@link java.net.HttpURLConnection}. This is the
+ * default implementation used by JGit
  *
  * @since 3.3
  */
@@ -72,9 +73,12 @@
 	HttpURLConnection wrappedUrlConnection;
 
 	/**
+	 * Constructor for JDKHttpConnection.
+	 *
 	 * @param url
-	 * @throws MalformedURLException
-	 * @throws IOException
+	 *            a {@link java.net.URL} object.
+	 * @throws java.net.MalformedURLException
+	 * @throws java.io.IOException
 	 */
 	protected JDKHttpConnection(URL url)
 			throws MalformedURLException,
@@ -83,10 +87,14 @@
 	}
 
 	/**
+	 * Constructor for JDKHttpConnection.
+	 *
 	 * @param url
+	 *            a {@link java.net.URL} object.
 	 * @param proxy
-	 * @throws MalformedURLException
-	 * @throws IOException
+	 *            a {@link java.net.Proxy} object.
+	 * @throws java.net.MalformedURLException
+	 * @throws java.io.IOException
 	 */
 	protected JDKHttpConnection(URL url, Proxy proxy)
 			throws MalformedURLException, IOException {
@@ -94,117 +102,140 @@
 				.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(String name) {
 		return wrappedUrlConnection.getHeaderField(name);
 	}
 
+	/** {@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/http/JDKHttpConnectionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnectionFactory.java
index b9f009f..ef88947 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnectionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/http/JDKHttpConnectionFactory.java
@@ -47,16 +47,19 @@
 import java.net.URL;
 
 /**
- * A factory returning instances of {@link JDKHttpConnection}
+ * A factory returning instances of
+ * {@link org.eclipse.jgit.transport.http.JDKHttpConnection}
  *
  * @since 3.3
  */
 public class JDKHttpConnectionFactory implements HttpConnectionFactory {
+	/** {@inheritDoc} */
 	@Override
 	public HttpConnection create(URL url) throws IOException {
 		return new JDKHttpConnection(url);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public HttpConnection create(URL url, Proxy proxy)
 			throws IOException {
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 8ab112e..16a6f4a 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
@@ -70,7 +70,9 @@
 
 	private final Collection<File> exportBase;
 
-	/** Initialize an empty file based resolver. */
+	/**
+	 * Initialize an empty file based resolver.
+	 */
 	public FileResolver() {
 		exports = new ConcurrentHashMap<>();
 		exportBase = new CopyOnWriteArrayList<>();
@@ -91,6 +93,7 @@
 		setExportAll(exportAll);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Repository open(final C req, final String name)
 			throws RepositoryNotFoundException, ServiceNotEnabledException {
@@ -148,6 +151,9 @@
 	}
 
 	/**
+	 * Whether <code>git-daemon-export-ok</code> is required to export a
+	 * repository
+	 *
 	 * @return false if <code>git-daemon-export-ok</code> is required to export
 	 *         a repository; true if <code>git-daemon-export-ok</code> is
 	 *         ignored.
@@ -167,7 +173,7 @@
 	 * If true, all repositories are available through the daemon, whether or
 	 * not <code>git-daemon-export-ok</code> exists.
 	 *
-	 * @param export
+	 * @param export a boolean.
 	 */
 	public void setExportAll(final boolean export) {
 		exportAll = export;
@@ -214,7 +220,7 @@
 	 * @param db
 	 *            the opened repository instance.
 	 * @return true if the repository is accessible; false if not.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the repository could not be accessed, the caller will claim
 	 *             the repository does not exist.
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ReceivePackFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ReceivePackFactory.java
index 73c2ed8..4967169 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ReceivePackFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ReceivePackFactory.java
@@ -47,13 +47,16 @@
 import org.eclipse.jgit.transport.ReceivePack;
 
 /**
- * Create and configure {@link ReceivePack} service instance.
+ * Create and configure {@link org.eclipse.jgit.transport.ReceivePack} service
+ * instance.
  *
  * @param <C>
  *            type of connection
  */
 public interface ReceivePackFactory<C> {
-	/** A factory disabling the ReceivePack service for all repositories */
+	/**
+	 * A factory disabling the ReceivePack service for all repositories
+	 */
 	public static final ReceivePackFactory<?> DISABLED = new ReceivePackFactory<Object>() {
 		@Override
 		public ReceivePack create(Object req, Repository db)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java
index 80211e5..a305e4c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java
@@ -48,13 +48,15 @@
 import org.eclipse.jgit.transport.ServiceMayNotContinueException;
 
 /**
- * Locate a Git {@link Repository} by name from the URL.
+ * Locate a Git {@link org.eclipse.jgit.lib.Repository} by name from the URL.
  *
  * @param <C>
  *            type of connection.
  */
 public interface RepositoryResolver<C> {
-	/** Resolver configured to open nothing. */
+	/**
+	 * Resolver configured to open nothing.
+	 */
 	public static final RepositoryResolver<?> NONE = new RepositoryResolver<Object>() {
 		@Override
 		public Repository open(Object req, String name)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotAuthorizedException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotAuthorizedException.java
index 57a6192..d2d1b99 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotAuthorizedException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotAuthorizedException.java
@@ -56,8 +56,12 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for ServiceNotAuthorizedException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable} object.
 	 * @since 4.1
 	 */
 	public ServiceNotAuthorizedException(String message, Throwable cause) {
@@ -65,14 +69,19 @@
 	}
 
 	/**
+	 * Constructor for ServiceNotAuthorizedException.
+	 *
 	 * @param message
+	 *            error message
 	 * @since 4.1
 	 */
 	public ServiceNotAuthorizedException(String message) {
 		super(message);
 	}
 
-	/** Indicates that the requested service requires authentication. */
+	/**
+	 * Indicates that the requested service requires authentication.
+	 */
 	public ServiceNotAuthorizedException() {
 		super(JGitText.get().unauthorized);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotEnabledException.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotEnabledException.java
index 78ae303..4473452 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotEnabledException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/ServiceNotEnabledException.java
@@ -45,13 +45,19 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** Indicates the request service is not enabled on a repository. */
+/**
+ * Indicates the request service is not enabled on a repository.
+ */
 public class ServiceNotEnabledException extends Exception {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Constructor for ServiceNotEnabledException.
+	 *
 	 * @param message
+	 *            error message
 	 * @param cause
+	 *            a {@link java.lang.Throwable} object.
 	 * @since 4.1
 	 */
 	public ServiceNotEnabledException(String message, Throwable cause) {
@@ -59,14 +65,19 @@
 	}
 
 	/**
+	 * Constructor for ServiceNotEnabledException.
+	 *
 	 * @param message
+	 *            error message
 	 * @since 4.1
 	 */
 	public ServiceNotEnabledException(String message) {
 		super(message);
 	}
 
-	/** Indicates the request service is not available. */
+	/**
+	 * Indicates the request service is not available.
+	 */
 	public ServiceNotEnabledException() {
 		super(JGitText.get().serviceNotEnabledNoName);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/UploadPackFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/UploadPackFactory.java
index d7ed0f6..40d1ffd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/UploadPackFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/UploadPackFactory.java
@@ -47,13 +47,16 @@
 import org.eclipse.jgit.transport.UploadPack;
 
 /**
- * Create and configure {@link UploadPack} service instance.
+ * Create and configure {@link org.eclipse.jgit.transport.UploadPack} service
+ * instance.
  *
  * @param <C>
  *            the connection type
  */
 public interface UploadPackFactory<C> {
-	/** A factory disabling the UploadPack service for all repositories. */
+	/**
+	 * A factory disabling the UploadPack service for all repositories.
+	 */
 	public static final UploadPackFactory<?> DISABLED = new UploadPackFactory<Object>() {
 		@Override
 		public UploadPack create(Object req, Repository db)
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 6d4c342..a7900f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
@@ -51,7 +51,6 @@
 
 import org.eclipse.jgit.attributes.AttributesHandler;
 import org.eclipse.jgit.attributes.AttributesNode;
-import org.eclipse.jgit.dircache.DirCacheCheckout;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.lib.Constants;
@@ -59,7 +58,6 @@
 import org.eclipse.jgit.lib.MutableObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.jgit.util.Paths;
 
 /**
@@ -154,7 +152,9 @@
 	 */
 	protected int pathLen;
 
-	/** Create a new iterator with no parent. */
+	/**
+	 * Create a new iterator with no parent.
+	 */
 	protected AbstractTreeIterator() {
 		parent = null;
 		path = new byte[DEFAULT_PATH_SIZE];
@@ -341,7 +341,7 @@
 	 * @param name
 	 *            file name to find (will not find a directory).
 	 * @return true if the file exists in this tree; false otherwise.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             tree is invalid.
 	 * @since 4.2
 	 */
@@ -355,7 +355,7 @@
 	 * @param name
 	 *            file name to find (will not find a directory).
 	 * @return true if the file exists in this tree; false otherwise.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             tree is invalid.
 	 * @since 4.2
 	 */
@@ -425,7 +425,11 @@
 				otherIterator.idBuffer(), otherIterator.idOffset());
 	}
 
-	/** @return true if the entry has a valid ObjectId. */
+	/**
+	 * Whether the entry has a valid ObjectId.
+	 *
+	 * @return {@code true} if the entry has a valid ObjectId.
+	 */
 	public abstract boolean hasId();
 
 	/**
@@ -447,17 +451,29 @@
 		out.fromRaw(idBuffer(), idOffset());
 	}
 
-	/** @return the file mode of the current entry. */
+	/**
+	 * Get the file mode of the current entry.
+	 *
+	 * @return the file mode of the current entry.
+	 */
 	public FileMode getEntryFileMode() {
 		return FileMode.fromBits(mode);
 	}
 
-	/** @return the file mode of the current entry as bits */
+	/**
+	 * Get the file mode of the current entry as bits.
+	 *
+	 * @return the file mode of the current entry as bits.
+	 */
 	public int getEntryRawMode() {
 		return mode;
 	}
 
-	/** @return path of the current entry, as a string. */
+	/**
+	 * Get path of the current entry, as a string.
+	 *
+	 * @return path of the current entry, as a string.
+	 */
 	public String getEntryPathString() {
 		return TreeWalk.pathOf(this);
 	}
@@ -474,7 +490,11 @@
 		return path;
 	}
 
-	/** @return length of the path in {@link #getEntryPathBuffer()}. */
+	/**
+	 * Get length of the path in {@link #getEntryPathBuffer()}.
+	 *
+	 * @return length of the path in {@link #getEntryPathBuffer()}.
+	 */
 	public int getEntryPathLength() {
 		return pathLen;
 	}
@@ -529,10 +549,10 @@
 	 * @param reader
 	 *            reader to load the tree data from.
 	 * @return a new parser that walks over the current subtree.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the current entry is not actually a tree and cannot be parsed
 	 *             as though it were a tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public abstract AbstractTreeIterator createSubtreeIterator(
@@ -560,10 +580,10 @@
 	 * @param idBuffer
 	 *            temporary ObjectId buffer for use by this method.
 	 * @return a new parser that walks over the current subtree.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the current entry is not actually a tree and cannot be parsed
 	 *             as though it were a tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public AbstractTreeIterator createSubtreeIterator(
@@ -580,7 +600,7 @@
 	 * method of repositioning the iterator to its first entry, so subclasses
 	 * are strongly encouraged to override the method.
 	 *
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the tree is invalid.
 	 */
 	public void reset() throws CorruptObjectException {
@@ -629,7 +649,7 @@
 	 * @param delta
 	 *            number of entries to move the iterator by. Must be a positive,
 	 *            non-zero integer.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the tree is invalid.
 	 */
 	public abstract void next(int delta) throws CorruptObjectException;
@@ -653,7 +673,7 @@
 	 * @param delta
 	 *            number of entries to move the iterator by. Must be a positive,
 	 *            non-zero integer.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the tree is invalid.
 	 */
 	public abstract void back(int delta) throws CorruptObjectException;
@@ -662,11 +682,12 @@
 	 * Advance to the next tree entry, populating this iterator with its data.
 	 * <p>
 	 * This method behaves like <code>seek(1)</code> but is called by
-	 * {@link TreeWalk} only if a {@link TreeFilter} was used and ruled out the
-	 * current entry from the results. In such cases this tree iterator may
-	 * perform special behavior.
+	 * {@link org.eclipse.jgit.treewalk.TreeWalk} only if a
+	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter} was used and ruled
+	 * out the current entry from the results. In such cases this tree iterator
+	 * may perform special behavior.
 	 *
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the tree is invalid.
 	 */
 	public void skip() throws CorruptObjectException {
@@ -685,7 +706,9 @@
 	}
 
 	/**
-	 * @return true if the iterator implements {@link #stopWalk()}.
+	 * Whether the iterator implements {@link #stopWalk()}.
+	 *
+	 * @return {@code true} if the iterator implements {@link #stopWalk()}.
 	 * @since 4.2
 	 */
 	protected boolean needsStopWalk() {
@@ -693,14 +716,18 @@
 	}
 
 	/**
-	 * @return the length of the name component of the path for the current entry
+	 * Get the length of the name component of the path for the current entry.
+	 *
+	 * @return the length of the name component of the path for the current
+	 *         entry.
 	 */
 	public int getNameLength() {
 		return pathLen - pathOffset;
 	}
 
 	/**
-	 * JGit internal API for use by {@link DirCacheCheckout}
+	 * JGit internal API for use by
+	 * {@link org.eclipse.jgit.dircache.DirCacheCheckout}
 	 *
 	 * @return start of name component part within {@link #getEntryPathBuffer()}
 	 * @since 2.0
@@ -724,6 +751,7 @@
 		System.arraycopy(path, pathOffset, buffer, offset, pathLen - pathOffset);
 	}
 
+	/** {@inheritDoc} */
 	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
@@ -731,8 +759,10 @@
 	}
 
 	/**
-	 * @return whether or not this Iterator is iterating through the Work Tree
+	 * Whether or not this Iterator is iterating through the working tree.
 	 *
+	 * @return whether or not this Iterator is iterating through the working
+	 *         tree
 	 * @since 4.3
 	 */
 	public boolean isWorkTree() {
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 2d6abd1..71113a6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
@@ -66,7 +66,9 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
 
-/** Parses raw Git trees from the canonical semi-text/semi-binary format. */
+/**
+ * Parses raw Git trees from the canonical semi-text/semi-binary format.
+ */
 public class CanonicalTreeParser extends AbstractTreeIterator {
 	private static final byte[] EMPTY = {};
 	private static final byte[] ATTRS = encode(DOT_GIT_ATTRIBUTES);
@@ -82,7 +84,9 @@
 	/** Offset one past the current entry (first byte of next entry). */
 	private int nextPtr;
 
-	/** Create a new parser. */
+	/**
+	 * Create a new parser.
+	 */
 	public CanonicalTreeParser() {
 		reset(EMPTY);
 	}
@@ -102,10 +106,10 @@
 	 *            messages if data corruption is found.
 	 * @throws MissingObjectException
 	 *             the object supplied is not available from the repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object supplied as an argument is not actually a tree and
 	 *             cannot be parsed as though it were a tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public CanonicalTreeParser(final byte[] prefix, final ObjectReader reader,
@@ -120,7 +124,9 @@
 	}
 
 	/**
-	 * @return the parent of this tree parser
+	 * Get the parent of this tree parser.
+	 *
+	 * @return the parent of this tree parser.
 	 * @deprecated internal use only
 	 */
 	@Deprecated
@@ -156,10 +162,10 @@
 	 * @return the root level parser.
 	 * @throws MissingObjectException
 	 *             the object supplied is not available from the repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object supplied as an argument is not actually a tree and
 	 *             cannot be parsed as though it were a tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public CanonicalTreeParser resetRoot(final ObjectReader reader,
@@ -172,7 +178,11 @@
 		return p;
 	}
 
-	/** @return this iterator, or its parent, if the tree is at eof. */
+	/**
+	 * Get this iterator, or its parent, if the tree is at eof.
+	 *
+	 * @return this iterator, or its parent, if the tree is at eof.
+	 */
 	public CanonicalTreeParser next() {
 		CanonicalTreeParser p = this;
 		for (;;) {
@@ -203,10 +213,10 @@
 	 *            messages if data corruption is found.
 	 * @throws MissingObjectException
 	 *             the object supplied is not available from the repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the object supplied as an argument is not actually a tree and
 	 *             cannot be parsed as though it were a tree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public void reset(final ObjectReader reader, final AnyObjectId id)
@@ -214,6 +224,7 @@
 		reset(reader.open(id, OBJ_TREE).getCachedBytes());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public CanonicalTreeParser createSubtreeIterator(final ObjectReader reader,
 			final MutableObjectId idBuffer)
@@ -238,7 +249,7 @@
 	 * @param id
 	 *            ObjectId of the tree to open.
 	 * @return a new parser that walks over the current subtree.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public final CanonicalTreeParser createSubtreeIterator0(
@@ -249,43 +260,51 @@
 		return p;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public CanonicalTreeParser createSubtreeIterator(final 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) {
@@ -315,6 +334,7 @@
 			parseEntry();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void back(int delta) {
 		if (delta == 1 && 0 <= prevPtr) {
@@ -381,12 +401,15 @@
 	}
 
 	/**
-	 * Retrieve the {@link AttributesNode} for the current entry.
+	 * Retrieve the {@link org.eclipse.jgit.attributes.AttributesNode} for the
+	 * current entry.
 	 *
 	 * @param reader
-	 *            {@link ObjectReader} used to parse the .gitattributes entry.
-	 * @return {@link AttributesNode} for the current entry.
-	 * @throws IOException
+	 *            {@link org.eclipse.jgit.lib.ObjectReader} used to parse the
+	 *            .gitattributes entry.
+	 * @return {@link org.eclipse.jgit.attributes.AttributesNode} for the
+	 *         current entry.
+	 * @throws java.io.IOException
 	 * @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 ec4a84e..596d3d0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/EmptyTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/EmptyTreeIterator.java
@@ -52,9 +52,13 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
 
-/** Iterator over an empty tree (a directory with no files). */
+/**
+ * Iterator over an empty tree (a directory with no files).
+ */
 public class EmptyTreeIterator extends AbstractTreeIterator {
-	/** Create a new iterator with no parent. */
+	/**
+	 * Create a new iterator with no parent.
+	 */
 	public EmptyTreeIterator() {
 		// Create a root empty tree.
 	}
@@ -86,63 +90,75 @@
 		pathLen = childPathOffset - 1;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(final 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(final int delta) throws CorruptObjectException {
 		// Do nothing.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void back(final 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 afa2ed9..8df764d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
@@ -63,7 +63,8 @@
  * Working directory iterator for standard Java IO.
  * <p>
  * This iterator uses the standard <code>java.io</code> package to read the
- * specified working directory as part of a {@link TreeWalk}.
+ * specified working directory as part of a
+ * {@link org.eclipse.jgit.treewalk.TreeWalk}.
  */
 public class FileTreeIterator extends WorkingTreeIterator {
 	/**
@@ -108,7 +109,6 @@
 	 * @param fileModeStrategy
 	 *            the strategy to use to determine the FileMode for a FileEntry;
 	 *            controls gitlinks etc.
-	 *
 	 * @since 4.3
 	 */
 	public FileTreeIterator(Repository repo, FileModeStrategy fileModeStrategy) {
@@ -148,7 +148,6 @@
 	 * @param fileModeStrategy
 	 *            the strategy to use to determine the FileMode for a FileEntry;
 	 *            controls gitlinks etc.
-	 *
 	 * @since 4.3
 	 */
 	public FileTreeIterator(final File root, FS fs, WorkingTreeOptions options,
@@ -192,7 +191,6 @@
 	 * @param fs
 	 *            the file system abstraction which will be necessary to perform
 	 *            certain file system operations.
-	 *
 	 * @since 4.3
 	 */
 	protected FileTreeIterator(final FileTreeIterator p, final File root,
@@ -215,7 +213,6 @@
 	 * @param fileModeStrategy
 	 *            the strategy to use to determine the FileMode for a given
 	 *            FileEntry.
-	 *
 	 * @since 4.3
 	 */
 	protected FileTreeIterator(final WorkingTreeIterator p, final File root,
@@ -227,6 +224,7 @@
 		init(entries());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public AbstractTreeIterator createSubtreeIterator(final ObjectReader reader)
 			throws IncorrectObjectTypeException, IOException {
@@ -407,6 +405,8 @@
 	}
 
 	/**
+	 * <p>Getter for the field <code>directory</code>.</p>
+	 *
 	 * @return The root directory of this iterator
 	 */
 	public File getDirectory() {
@@ -414,6 +414,8 @@
 	}
 
 	/**
+	 * Get the location of the working file.
+	 *
 	 * @return The location of the working file. This is the same as {@code new
 	 *         File(getDirectory(), getEntryPath())} but may be faster by
 	 *         reusing an internal File instance.
@@ -422,11 +424,13 @@
 		return ((FileEntry) current()).getFile();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected byte[] idSubmodule(final 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/NameConflictTreeWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/NameConflictTreeWalk.java
index 59cf798..3e06f04 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/NameConflictTreeWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/NameConflictTreeWalk.java
@@ -46,7 +46,6 @@
 import java.io.IOException;
 
 import org.eclipse.jgit.annotations.Nullable;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectReader;
@@ -55,24 +54,26 @@
 /**
  * Specialized TreeWalk to detect directory-file (D/F) name conflicts.
  * <p>
- * Due to the way a Git tree is organized the standard {@link TreeWalk} won't
- * easily find a D/F conflict when merging two or more trees together. In the
- * standard TreeWalk the file will be returned first, and then much later the
- * directory will be returned. This makes it impossible for the application to
- * efficiently detect and handle the conflict.
+ * Due to the way a Git tree is organized the standard
+ * {@link org.eclipse.jgit.treewalk.TreeWalk} won't easily find a D/F conflict
+ * when merging two or more trees together. In the standard TreeWalk the file
+ * will be returned first, and then much later the directory will be returned.
+ * This makes it impossible for the application to efficiently detect and handle
+ * the conflict.
  * <p>
  * Using this walk implementation causes the directory to report earlier than
  * usual, at the same time as the non-directory entry. This permits the
  * application to handle the D/F conflict in a single step. The directory is
  * returned only once, so it does not get returned later in the iteration.
  * <p>
- * When a D/F conflict is detected {@link TreeWalk#isSubtree()} will return true
- * and {@link TreeWalk#enterSubtree()} will recurse into the subtree, no matter
- * which iterator originally supplied the subtree.
+ * When a D/F conflict is detected
+ * {@link org.eclipse.jgit.treewalk.TreeWalk#isSubtree()} will return true and
+ * {@link org.eclipse.jgit.treewalk.TreeWalk#enterSubtree()} will recurse into
+ * the subtree, no matter which iterator originally supplied the subtree.
  * <p>
  * Because conflicted directories report early, using this walk implementation
- * to populate a {@link DirCacheBuilder} may cause the automatic resorting to
- * run and fix the entry ordering.
+ * to populate a {@link org.eclipse.jgit.dircache.DirCacheBuilder} may cause the
+ * automatic resorting to run and fix the entry ordering.
  * <p>
  * This walk implementation requires more CPU to implement a look-ahead and a
  * look-behind to merge a D/F pair together, or to skip a previously reported
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 c54e148..a91ad59 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
@@ -81,7 +81,8 @@
 import org.eclipse.jgit.util.io.EolStreamTypeUtil;
 
 /**
- * Walks one or more {@link AbstractTreeIterator}s in parallel.
+ * Walks one or more {@link org.eclipse.jgit.treewalk.AbstractTreeIterator}s in
+ * parallel.
  * <p>
  * This class can perform n-way differences across as many trees as necessary.
  * <p>
@@ -97,8 +98,9 @@
  * usage of a TreeWalk instance to a single thread, or implement their own
  * synchronization at a higher level.
  * <p>
- * Multiple simultaneous TreeWalk instances per {@link Repository} are
- * permitted, even from concurrent threads.
+ * Multiple simultaneous TreeWalk instances per
+ * {@link org.eclipse.jgit.lib.Repository} are permitted, even from concurrent
+ * threads.
  */
 public class TreeWalk implements AutoCloseable, AttributesProvider {
 	private static final AbstractTreeIterator[] NO_TREES = {};
@@ -131,7 +133,11 @@
 	private Map<String, String> filterCommandsByNameDotType = new HashMap<>();
 
 	/**
+	 * Set the operation type of this walk
+	 *
 	 * @param operationType
+	 *            a {@link org.eclipse.jgit.treewalk.TreeWalk.OperationType}
+	 *            object.
 	 * @since 4.2
 	 */
 	public void setOperationType(OperationType operationType) {
@@ -153,14 +159,14 @@
 	 *            one or more trees to walk through, all with the same root.
 	 * @return a new tree walk configured for exactly this one path; null if no
 	 *         path was found in any of the trees.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             reading a pack file or loose object failed.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             an tree object could not be read as its data stream did not
 	 *             appear to be a tree, or could not be inflated.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object we expected to be a tree was not a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a tree object was not found.
 	 */
 	public static TreeWalk forPath(final ObjectReader reader, final String path,
@@ -178,7 +184,8 @@
 	 *
 	 * @param repo
 	 *            repository to read config data and
-	 *            {@link AttributesNodeProvider} from.
+	 *            {@link org.eclipse.jgit.attributes.AttributesNodeProvider}
+	 *            from.
 	 * @param reader
 	 *            the reader the walker will obtain tree data from.
 	 * @param path
@@ -187,14 +194,14 @@
 	 *            one or more trees to walk through, all with the same root.
 	 * @return a new tree walk configured for exactly this one path; null if no
 	 *         path was found in any of the trees.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             reading a pack file or loose object failed.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             an tree object could not be read as its data stream did not
 	 *             appear to be a tree, or could not be inflated.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object we expected to be a tree was not a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a tree object was not found.
 	 * @since 4.3
 	 */
@@ -234,14 +241,14 @@
 	 *            one or more trees to walk through, all with the same root.
 	 * @return a new tree walk configured for exactly this one path; null if no
 	 *         path was found in any of the trees.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             reading a pack file or loose object failed.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             an tree object could not be read as its data stream did not
 	 *             appear to be a tree, or could not be inflated.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object we expected to be a tree was not a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a tree object was not found.
 	 */
 	public static TreeWalk forPath(final Repository db, final String path,
@@ -267,14 +274,14 @@
 	 *            the single tree to walk through.
 	 * @return a new tree walk configured for exactly this one path; null if no
 	 *         path was found in any of the trees.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             reading a pack file or loose object failed.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             an tree object could not be read as its data stream did not
 	 *             appear to be a tree, or could not be inflated.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object we expected to be a tree was not a tree.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a tree object was not found.
 	 */
 	public static TreeWalk forPath(final Repository db, final String path,
@@ -373,13 +380,19 @@
 		this.closeReader = closeReader;
 	}
 
-	/** @return the reader this walker is using to load objects. */
+	/**
+	 * Get the reader this walker is using to load objects.
+	 *
+	 * @return the reader this walker is using to load objects.
+	 */
 	public ObjectReader getObjectReader() {
 		return reader;
 	}
 
 	/**
-	 * @return the {@link OperationType}
+	 * Get the operation type
+	 *
+	 * @return the {@link org.eclipse.jgit.treewalk.TreeWalk.OperationType}
 	 * @since 4.3
 	 */
 	public OperationType getOperationType() {
@@ -387,6 +400,8 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Release any resources used by this walker's reader.
 	 * <p>
 	 * A walker that has been released can be used again, but may need to be
@@ -421,12 +436,14 @@
 	 * Note that filters are not thread-safe and may not be shared by concurrent
 	 * TreeWalk instances. Every TreeWalk must be supplied its own unique
 	 * filter, unless the filter implementation specifically states it is (and
-	 * always will be) thread-safe. Callers may use {@link TreeFilter#clone()}
-	 * to create a unique filter tree for this TreeWalk instance.
+	 * always will be) thread-safe. Callers may use
+	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#clone()} to create a
+	 * unique filter tree for this TreeWalk instance.
 	 *
 	 * @param newFilter
-	 *            the new filter. If null the special {@link TreeFilter#ALL}
-	 *            filter will be used instead, as it matches every entry.
+	 *            the new filter. If null the special
+	 *            {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ALL} filter
+	 *            will be used instead, as it matches every entry.
 	 * @see org.eclipse.jgit.treewalk.filter.AndTreeFilter
 	 * @see org.eclipse.jgit.treewalk.filter.OrTreeFilter
 	 */
@@ -493,19 +510,23 @@
 	}
 
 	/**
-	 * Sets the {@link AttributesNodeProvider} for this {@link TreeWalk}.
+	 * Sets the {@link org.eclipse.jgit.attributes.AttributesNodeProvider} for
+	 * this {@link org.eclipse.jgit.treewalk.TreeWalk}.
 	 * <p>
-	 * This is a requirement for a correct computation of the git attributes.
-	 * If this {@link TreeWalk} has been built using
+	 * This is a requirement for a correct computation of the git attributes. If
+	 * this {@link org.eclipse.jgit.treewalk.TreeWalk} has been built using
 	 * {@link #TreeWalk(Repository)} constructor, the
-	 * {@link AttributesNodeProvider} has already been set. Indeed,the
-	 * {@link Repository} can provide an {@link AttributesNodeProvider} using
-	 * {@link Repository#createAttributesNodeProvider()} method. Otherwise you
-	 * should provide one.
+	 * {@link org.eclipse.jgit.attributes.AttributesNodeProvider} has already
+	 * been set. Indeed,the {@link org.eclipse.jgit.lib.Repository} can provide
+	 * an {@link org.eclipse.jgit.attributes.AttributesNodeProvider} using
+	 * {@link org.eclipse.jgit.lib.Repository#createAttributesNodeProvider()}
+	 * method. Otherwise you should provide one.
 	 * </p>
 	 *
 	 * @see Repository#createAttributesNodeProvider()
 	 * @param provider
+	 *            a {@link org.eclipse.jgit.attributes.AttributesNodeProvider}
+	 *            object.
 	 * @since 4.2
 	 */
 	public void setAttributesNodeProvider(AttributesNodeProvider provider) {
@@ -513,7 +534,10 @@
 	}
 
 	/**
-	 * @return the {@link AttributesNodeProvider} for this {@link TreeWalk}.
+	 * Get the attributes node provider
+	 *
+	 * @return the {@link org.eclipse.jgit.attributes.AttributesNodeProvider}
+	 *         for this {@link org.eclipse.jgit.treewalk.TreeWalk}.
 	 * @since 4.3
 	 */
 	public AttributesNodeProvider getAttributesNodeProvider() {
@@ -521,9 +545,11 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * Retrieve the git attributes for the current entry.
 	 *
-	 * <h4>Git attribute computation</h4>
+	 * <h3>Git attribute computation</h3>
 	 *
 	 * <ul>
 	 * <li>Get the attributes matching the current path entry from the info file
@@ -542,7 +568,7 @@
 	 * </ul>
 	 *
 	 *
-	 * <h4>Iterator constraints</h4>
+	 * <h3>Iterator constraints</h3>
 	 *
 	 * <p>
 	 * In order to have a correct list of attributes for the current entry, this
@@ -556,7 +582,6 @@
 	 * provided it will fallback on the {@link DirCacheIterator}.
 	 * </p>
 	 *
-	 * @return a {@link Set} of {@link Attribute}s that match the current entry.
 	 * @since 4.2
 	 */
 	@Override
@@ -587,33 +612,45 @@
 	}
 
 	/**
+	 * Get the EOL stream type of the current entry using the config and
+	 * {@link #getAttributes()}.
+	 *
 	 * @param opType
 	 *            the operationtype (checkin/checkout) which should be used
 	 * @return the EOL stream type of the current entry using the config and
-	 *         {@link #getAttributes()} Note that this method may return null if
-	 *         the {@link TreeWalk} is not based on a working tree
+	 *         {@link #getAttributes()}. Note that this method may return null
+	 *         if the {@link org.eclipse.jgit.treewalk.TreeWalk} is not based on
+	 *         a working tree
+	 * @since 4.10
 	 */
-	// TODO(msohn) make this method public in 4.4
 	@Nullable
-	EolStreamType getEolStreamType(OperationType opType) {
-			if (attributesNodeProvider == null || config == null)
-				return null;
-		return EolStreamTypeUtil.detectStreamType(opType,
+	public EolStreamType getEolStreamType(OperationType opType) {
+		if (attributesNodeProvider == null || config == null)
+			return null;
+		return EolStreamTypeUtil.detectStreamType(
+				opType != null ? opType : operationType,
 					config.get(WorkingTreeOptions.KEY), getAttributes());
 	}
 
 	/**
+	 * Get the EOL stream type of the current entry using the config and
+	 * {@link #getAttributes()}.
+	 *
 	 * @return the EOL stream type of the current entry using the config and
-	 *         {@link #getAttributes()} Note that this method may return null if
-	 *         the {@link TreeWalk} is not based on a working tree
+	 *         {@link #getAttributes()}. Note that this method may return null
+	 *         if the {@link org.eclipse.jgit.treewalk.TreeWalk} is not based on
+	 *         a working tree
 	 * @since 4.3
+	 * @deprecated use {@link #getEolStreamType(OperationType)} instead.
 	 */
-	// TODO(msohn) deprecate this method in 4.4
+	@Deprecated
 	public @Nullable EolStreamType getEolStreamType() {
 		return (getEolStreamType(operationType));
 	}
 
-	/** Reset this walker so new tree iterators can be added to it. */
+	/**
+	 * Reset this walker so new tree iterators can be added to it.
+	 */
 	public void reset() {
 		attrs = null;
 		attributesHandler = null;
@@ -628,16 +665,16 @@
 	 * @param id
 	 *            the tree we need to parse. The walker will execute over this
 	 *            single tree if the reset is successful.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the given tree object does not exist in this repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the given object id does not denote a tree, but instead names
 	 *             some other non-tree type of object. Note that commits are not
 	 *             trees, even if they are sometimes called a "tree-ish".
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the object claimed to be a tree, but its contents did not
 	 *             appear to be a tree. The repository may have data corruption.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public void reset(final AnyObjectId id) throws MissingObjectException,
@@ -669,16 +706,16 @@
 	 * @param ids
 	 *            the trees we need to parse. The walker will execute over this
 	 *            many parallel trees if the reset is successful.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the given tree object does not exist in this repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the given object id does not denote a tree, but instead names
 	 *             some other non-tree type of object. Note that commits are not
 	 *             trees, even if they are sometimes called a "tree-ish".
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the object claimed to be a tree, but its contents did not
 	 *             appear to be a tree. The repository may have data corruption.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public void reset(final AnyObjectId... ids) throws MissingObjectException,
@@ -724,16 +761,16 @@
 	 * @param id
 	 *            identity of the tree object the caller wants walked.
 	 * @return position of this tree within the walker.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             the given tree object does not exist in this repository.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             the given object id does not denote a tree, but instead names
 	 *             some other non-tree type of object. Note that commits are not
 	 *             trees, even if they are sometimes called a "tree-ish".
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the object claimed to be a tree, but its contents did not
 	 *             appear to be a tree. The repository may have data corruption.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public int addTree(final AnyObjectId id) throws MissingObjectException,
@@ -784,19 +821,19 @@
 	 *
 	 * @return true if there is an entry available; false if all entries have
 	 *         been walked and the walk of this set of tree iterators is over.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             {@link #isRecursive()} was enabled, a subtree was found, but
 	 *             the subtree object does not exist in this repository. The
 	 *             repository may be missing objects.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             {@link #isRecursive()} was enabled, a subtree was found, and
 	 *             the subtree id does not denote a tree, but instead names some
 	 *             other non-tree type of object. The repository may have data
 	 *             corruption.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the contents of a tree did not appear to be a tree. The
 	 *             repository may have data corruption.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public boolean next() throws MissingObjectException,
@@ -871,8 +908,6 @@
 	 * iterators to manage only one list of items, with the diving handled by
 	 * recursive trees.
 	 *
-	 * @param <T>
-	 *            type of the tree iterator expected by the caller.
 	 * @param nth
 	 *            tree to obtain the current iterator of.
 	 * @param clazz
@@ -888,11 +923,13 @@
 	}
 
 	/**
-	 * Obtain the raw {@link FileMode} bits for the current entry.
+	 * Obtain the raw {@link org.eclipse.jgit.lib.FileMode} bits for the current
+	 * entry.
 	 * <p>
 	 * Every added tree supplies mode bits, even if the tree does not contain
-	 * the current entry. In the latter case {@link FileMode#MISSING}'s mode
-	 * bits (0) are returned.
+	 * the current entry. In the latter case
+	 * {@link org.eclipse.jgit.lib.FileMode#MISSING}'s mode bits (0) are
+	 * returned.
 	 *
 	 * @param nth
 	 *            tree to obtain the mode bits from.
@@ -905,10 +942,11 @@
 	}
 
 	/**
-	 * Obtain the {@link FileMode} for the current entry.
+	 * Obtain the {@link org.eclipse.jgit.lib.FileMode} for the current entry.
 	 * <p>
 	 * Every added tree supplies a mode, even if the tree does not contain the
-	 * current entry. In the latter case {@link FileMode#MISSING} is returned.
+	 * current entry. In the latter case
+	 * {@link org.eclipse.jgit.lib.FileMode#MISSING} is returned.
 	 *
 	 * @param nth
 	 *            tree to obtain the mode from.
@@ -919,7 +957,8 @@
 	}
 
 	/**
-	 * Obtain the {@link FileMode} for the current entry on the currentHead tree
+	 * Obtain the {@link org.eclipse.jgit.lib.FileMode} for the current entry on
+	 * the currentHead tree
 	 *
 	 * @return mode for the current entry of the currentHead tree.
 	 * @since 4.3
@@ -937,13 +976,16 @@
 	 * whenever possible.
 	 * <p>
 	 * Every tree supplies an object id, even if the tree does not contain the
-	 * current entry. In the latter case {@link ObjectId#zeroId()} is returned.
+	 * current entry. In the latter case
+	 * {@link org.eclipse.jgit.lib.ObjectId#zeroId()} is returned.
 	 *
 	 * @param nth
 	 *            tree to obtain the object identifier from.
 	 * @return object identifier for the current tree entry.
 	 * @see #getObjectId(MutableObjectId, int)
 	 * @see #idEqual(int, int)
+	 * @see #getObjectId(MutableObjectId, int)
+	 * @see #idEqual(int, int)
 	 */
 	public ObjectId getObjectId(final int nth) {
 		final AbstractTreeIterator t = trees[nth];
@@ -955,7 +997,8 @@
 	 * Obtain the ObjectId for the current entry.
 	 * <p>
 	 * Every tree supplies an object id, even if the tree does not contain the
-	 * current entry. In the latter case {@link ObjectId#zeroId()} is supplied.
+	 * current entry. In the latter case
+	 * {@link org.eclipse.jgit.lib.ObjectId#zeroId()} is supplied.
 	 * <p>
 	 * Applications should try to use {@link #idEqual(int, int)} when possible
 	 * as it avoids conversion overheads.
@@ -1053,6 +1096,8 @@
 	}
 
 	/**
+	 * Get the path length of the current entry.
+	 *
 	 * @return The path length of the current entry.
 	 */
 	public int getPathLength() {
@@ -1241,17 +1286,17 @@
 	 * If the current entry is a subtree this method arranges for its children
 	 * to be returned before the next sibling following the subtree is returned.
 	 *
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             a subtree was found, but the subtree object does not exist in
 	 *             this repository. The repository may be missing objects.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             a subtree was found, and the subtree id does not denote a
 	 *             tree, but instead names some other non-tree type of object.
 	 *             The repository may have data corruption.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             the contents of a tree did not appear to be a tree. The
 	 *             repository may have data corruption.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read.
 	 */
 	public void enterSubtree() throws MissingObjectException,
@@ -1357,10 +1402,14 @@
 	}
 
 	/**
+	 * Get the tree of that type.
+	 *
 	 * @param type
 	 *            of the tree to be queried
-	 * @return the tree of that type or null if none is present
+	 * @return the tree of that type or null if none is present.
 	 * @since 4.3
+	 * @param <T>
+	 *            a tree type.
 	 */
 	public <T extends AbstractTreeIterator> T getTree(
 			Class<T> type) {
@@ -1381,7 +1430,7 @@
 	 *            which type of filterCommand should be executed. E.g. "clean",
 	 *            "smudge"
 	 * @return a filter command
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	public String getFilterCommand(String filterCommandType)
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 b1b146c..8d02f90 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
@@ -67,7 +67,6 @@
 import org.eclipse.jgit.attributes.FilterCommand;
 import org.eclipse.jgit.attributes.FilterCommandRegistry;
 import org.eclipse.jgit.diff.RawText;
-import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheEntry;
 import org.eclipse.jgit.dircache.DirCacheIterator;
 import org.eclipse.jgit.errors.CorruptObjectException;
@@ -101,13 +100,15 @@
 import org.eclipse.jgit.util.sha1.SHA1;
 
 /**
- * Walks a working directory tree as part of a {@link TreeWalk}.
+ * Walks a working directory tree as part of a
+ * {@link org.eclipse.jgit.treewalk.TreeWalk}.
  * <p>
  * Most applications will want to use the standard implementation of this
- * iterator, {@link FileTreeIterator}, as that does all IO through the standard
- * <code>java.io</code> package. Plugins for a Java based IDE may however wish
- * to create their own implementations of this class to allow traversal of the
- * IDE's project space, as well as benefit from any caching the IDE may have.
+ * iterator, {@link org.eclipse.jgit.treewalk.FileTreeIterator}, as that does
+ * all IO through the standard <code>java.io</code> package. Plugins for a Java
+ * based IDE may however wish to create their own implementations of this class
+ * to allow traversal of the IDE's project space, as well as benefit from any
+ * caching the IDE may have.
  *
  * @see FileTreeIterator
  */
@@ -234,7 +235,8 @@
 	}
 
 	/**
-	 * Define the matching {@link DirCacheIterator}, to optimize ObjectIds.
+	 * Define the matching {@link org.eclipse.jgit.dircache.DirCacheIterator},
+	 * to optimize ObjectIds.
 	 *
 	 * Once the DirCacheIterator has been set this iterator must only be
 	 * advanced by the TreeWalk that is supplied, as it assumes that itself and
@@ -244,13 +246,15 @@
 	 * @param walk
 	 *            the walk that will be advancing this iterator.
 	 * @param treeId
-	 *            index of the matching {@link DirCacheIterator}.
+	 *            index of the matching
+	 *            {@link org.eclipse.jgit.dircache.DirCacheIterator}.
 	 */
 	public void setDirCacheIterator(TreeWalk walk, int treeId) {
 		state.walk = walk;
 		state.dirCacheTree = treeId;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean hasId() {
 		if (contentIdFromPtr == ptr)
@@ -258,6 +262,7 @@
 		return (mode & FileMode.TYPE_MASK) == FileMode.TYPE_FILE;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public byte[] idBuffer() {
 		if (contentIdFromPtr == ptr)
@@ -295,6 +300,7 @@
 		return zeroid;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isWorkTree() {
 		return true;
@@ -304,6 +310,8 @@
 	 * Get submodule id for given entry.
 	 *
 	 * @param e
+	 *            a {@link org.eclipse.jgit.treewalk.WorkingTreeIterator.Entry}
+	 *            object.
 	 * @return non-null submodule id
 	 */
 	protected byte[] idSubmodule(Entry e) {
@@ -323,14 +331,18 @@
 	 * relative to the directory.
 	 *
 	 * @param directory
+	 *            a {@link java.io.File} object.
 	 * @param e
+	 *            a {@link org.eclipse.jgit.treewalk.WorkingTreeIterator.Entry}
+	 *            object.
 	 * @return non-null submodule id
 	 */
 	protected byte[] idSubmodule(File directory, Entry e) {
 		final Repository submoduleRepo;
 		try {
 			submoduleRepo = SubmoduleWalk.getSubmoduleRepository(directory,
-					e.getName());
+					e.getName(),
+					repository != null ? repository.getFS() : FS.DETECTED);
 		} catch (IOException exception) {
 			return zeroid;
 		}
@@ -504,11 +516,13 @@
 		return state.options;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int idOffset() {
 		return contentIdOffset;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void reset() {
 		if (!first()) {
@@ -518,16 +532,19 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean first() {
 		return ptr == 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean eof() {
 		return ptr == entryCnt;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void next(final int delta) throws CorruptObjectException {
 		ptr += delta;
@@ -536,6 +553,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void back(final int delta) throws CorruptObjectException {
 		ptr -= delta;
@@ -568,7 +586,7 @@
 	 * Get the filtered input length of this entry
 	 *
 	 * @return size of the content, in bytes
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public long getEntryContentLength() throws IOException {
 		if (canonLen == -1) {
@@ -610,7 +628,7 @@
 	 * The caller will close the stream once complete.
 	 *
 	 * @return a stream to read from the file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file could not be opened for reading.
 	 */
 	public InputStream openEntryStream() throws IOException {
@@ -626,7 +644,7 @@
 	 * Determine if the current entry path is ignored by an ignore rule.
 	 *
 	 * @return true if the entry was ignored by an ignore rule file.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a relevant ignore rule file exists but cannot be read.
 	 */
 	public boolean isEntryIgnored() throws IOException {
@@ -639,7 +657,7 @@
 	 * @param pLen
 	 *            the length of the path in the path buffer.
 	 * @return true if the entry is ignored by an ignore rule.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a relevant ignore rule file exists but cannot be read.
 	 */
 	protected boolean isEntryIgnored(final int pLen) throws IOException {
@@ -700,12 +718,12 @@
 	}
 
 	/**
-	 * Retrieves the {@link AttributesNode} for the current entry.
+	 * Retrieves the {@link org.eclipse.jgit.attributes.AttributesNode} for the
+	 * current entry.
 	 *
-	 * @return {@link AttributesNode} for the current entry.
+	 * @return the {@link org.eclipse.jgit.attributes.AttributesNode} for the
+	 *         current entry.
 	 * @throws IOException
-	 *             if an error is raised while parsing the .gitattributes file
-	 * @since 3.7
 	 */
 	public AttributesNode getEntryAttributesNode() throws IOException {
 		if (attributesNode instanceof PerDirectoryAttributesNode)
@@ -809,6 +827,7 @@
 	 * Is the file mode of the current entry different than the given raw mode?
 	 *
 	 * @param rawMode
+	 *            an int.
 	 * @return true if different, false otherwise
 	 */
 	public boolean isModeDifferent(final int rawMode) {
@@ -835,12 +854,14 @@
 
 	/**
 	 * Compare the metadata (mode, length, modification-timestamp) of the
-	 * current entry and a {@link DirCacheEntry}
+	 * current entry and a {@link org.eclipse.jgit.dircache.DirCacheEntry}
 	 *
 	 * @param entry
-	 *            the {@link DirCacheEntry} to compare with
-	 * @return a {@link MetadataDiff} which tells whether and how the entries
-	 *         metadata differ
+	 *            the {@link org.eclipse.jgit.dircache.DirCacheEntry} to compare
+	 *            with
+	 * @return a
+	 *         {@link org.eclipse.jgit.treewalk.WorkingTreeIterator.MetadataDiff}
+	 *         which tells whether and how the entries metadata differ
 	 */
 	public MetadataDiff compareMetadata(DirCacheEntry entry) {
 		if (entry.isAssumeValid())
@@ -890,7 +911,7 @@
 
 	/**
 	 * Checks whether this entry differs from a given entry from the
-	 * {@link DirCache}.
+	 * {@link org.eclipse.jgit.dircache.DirCache}.
 	 *
 	 * File status information is used and if status is same we consider the
 	 * file identical to the state in the working directory. Native git uses
@@ -904,7 +925,7 @@
 	 * @param reader
 	 *            access to repository objects if necessary. Should not be null.
 	 * @return true if content is most likely different.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.3
 	 */
 	public boolean isModified(DirCacheEntry entry, boolean forceContentCheck,
@@ -945,9 +966,10 @@
 	 * in the index.
 	 *
 	 * @param indexIter
-	 *            {@link DirCacheIterator} positioned at the same entry as this
-	 *            iterator or null if no {@link DirCacheIterator} is available
-	 *            at this iterator's current entry
+	 *            {@link org.eclipse.jgit.dircache.DirCacheIterator} positioned
+	 *            at the same entry as this iterator or null if no
+	 *            {@link org.eclipse.jgit.dircache.DirCacheIterator} is
+	 *            available at this iterator's current entry
 	 * @return index file mode
 	 */
 	public FileMode getIndexFileMode(final DirCacheIterator indexIter) {
@@ -1067,7 +1089,7 @@
 	 * @param entry
 	 *            to read
 	 * @return the entry's content as a normalized string
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the entry cannot be read or does not denote a symlink
 	 * @since 4.6
 	 */
@@ -1351,9 +1373,11 @@
 	}
 
 	/**
+	 * Get the clean filter command for the current entry.
+	 *
 	 * @return the clean filter command for the current entry or
 	 *         <code>null</code> if no such command is defined
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	public String getCleanFilterCommand() throws IOException {
@@ -1369,11 +1393,13 @@
 	}
 
 	/**
+	 * Get the eol stream type for the current entry.
+	 *
 	 * @return the eol stream type for the current entry or <code>null</code> if
 	 *         it cannot be determined. When state or state.walk is null or the
-	 *         {@link TreeWalk} is not based on a {@link Repository} then null
-	 *         is returned.
-	 * @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
 	 * @since 4.3
 	 */
 	public EolStreamType getEolStreamType() throws IOException {
@@ -1394,11 +1420,7 @@
 		if (eolStreamTypeHolder == null) {
 			EolStreamType type=null;
 			if (state.walk != null) {
-				if (opType != null) {
-					type = state.walk.getEolStreamType(opType);
-				} else {
-					type=state.walk.getEolStreamType();
-				}
+				type = state.walk.getEolStreamType(opType);
 			} else {
 				switch (getOptions().getAutoCRLF()) {
 				case FALSE:
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeOptions.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeOptions.java
index 2b18904..2dfb203 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeOptions.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeOptions.java
@@ -52,7 +52,9 @@
 import org.eclipse.jgit.lib.CoreConfig.HideDotFiles;
 import org.eclipse.jgit.lib.CoreConfig.SymLinks;
 
-/** Options used by the {@link WorkingTreeIterator}. */
+/**
+ * Options used by the {@link org.eclipse.jgit.treewalk.WorkingTreeIterator}.
+ */
 public class WorkingTreeOptions {
 	/** Key for {@link Config#get(SectionParser)}. */
 	public static final Config.SectionParser<WorkingTreeOptions> KEY =
@@ -92,18 +94,29 @@
 	}
 
 	/** @return true if the execute bit on working files should be trusted. */
+	/**
+	 * Whether the execute bit on working files should be trusted.
+	 *
+	 * @return {@code true} if the execute bit on working files should be
+	 *         trusted.
+	 */
 	public boolean isFileMode() {
 		return fileMode;
 	}
 
-	/** @return how automatic CRLF conversion has been configured. */
+	/**
+	 * Get automatic CRLF conversion configuration.
+	 *
+	 * @return how automatic CRLF conversion has been configured.
+	 */
 	public AutoCRLF getAutoCRLF() {
 		return autoCRLF;
 	}
 
 	/**
-	 * @return how text line endings should be normalized.
+	 * Get how text line endings should be normalized.
 	 *
+	 * @return how text line endings should be normalized.
 	 * @since 4.3
 	 */
 	public EOL getEOL() {
@@ -111,7 +124,9 @@
 	}
 
 	/**
-	 * @return how stat data is compared
+	 * Get how stat data is compared.
+	 *
+	 * @return how stat data is compared.
 	 * @since 3.0
 	 */
 	public CheckStat getCheckStat() {
@@ -119,6 +134,8 @@
 	}
 
 	/**
+	 * Get how we handle symbolic links
+	 *
 	 * @return how we handle symbolic links
 	 * @since 3.3
 	 */
@@ -127,6 +144,8 @@
 	}
 
 	/**
+	 * Get how we create '.'-files (on Windows)
+	 *
 	 * @return how we create '.'-files (on Windows)
 	 * @since 3.5
 	 */
@@ -135,9 +154,10 @@
 	}
 
 	/**
-	 * @return whether or not we treat nested repos as directories.
-	 * 		   If true, folders containing .git entries will not be
-	 * 		   treated as gitlinks.
+	 * Whether or not we treat nested repos as directories.
+	 *
+	 * @return whether or not we treat nested repos as directories. If true,
+	 *         folders containing .git entries will not be treated as gitlinks.
 	 * @since 4.3
 	 */
 	public boolean isDirNoGitLinks() { return dirNoGitLinks; }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/AndTreeFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/AndTreeFilter.java
index 9658166..6d40a4e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/AndTreeFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/AndTreeFilter.java
@@ -56,9 +56,10 @@
  * Includes a tree entry only if all subfilters include the same tree entry.
  * <p>
  * Classic shortcut behavior is used, so evaluation of the
- * {@link TreeFilter#include(TreeWalk)} method stops as soon as a false result
- * is obtained. Applications can improve filtering performance by placing faster
- * filters that are more likely to reject a result earlier in the list.
+ * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#include(TreeWalk)} method
+ * stops as soon as a false result is obtained. Applications can improve
+ * filtering performance by placing faster filters that are more likely to
+ * reject a result earlier in the list.
  */
 public abstract class AndTreeFilter extends TreeFilter {
 	/**
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 91251e4..653786b 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
@@ -213,6 +213,7 @@
 		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 b821a16..6cca582 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
@@ -58,26 +58,33 @@
 import org.eclipse.jgit.treewalk.WorkingTreeIterator;
 
 /**
- * A performance optimized variant of {@link TreeFilter#ANY_DIFF} which should
- * be used when among the walked trees there is a {@link DirCacheIterator} and a
- * {@link WorkingTreeIterator}. Please see the documentation of
- * {@link TreeFilter#ANY_DIFF} for a basic description of the semantics.
+ * A performance optimized variant of
+ * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ANY_DIFF} which should be
+ * used when among the walked trees there is a
+ * {@link org.eclipse.jgit.dircache.DirCacheIterator} and a
+ * {@link org.eclipse.jgit.treewalk.WorkingTreeIterator}. Please see the
+ * documentation of {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ANY_DIFF}
+ * for a basic description of the semantics.
  * <p>
  * This filter tries to avoid computing content ids of the files in the
- * working-tree. In contrast to {@link TreeFilter#ANY_DIFF} this filter takes
- * care to first compare the entry from the {@link DirCacheIterator} with the
- * entries from all other iterators besides the {@link WorkingTreeIterator}.
- * Since all those entries have fast access to content ids that is very fast. If
- * a difference is detected in this step this filter decides to include that
- * path before even looking at the working-tree entry.
+ * working-tree. In contrast to
+ * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ANY_DIFF} this filter
+ * takes care to first compare the entry from the
+ * {@link org.eclipse.jgit.dircache.DirCacheIterator} with the entries from all
+ * other iterators besides the
+ * {@link org.eclipse.jgit.treewalk.WorkingTreeIterator}. Since all those
+ * entries have fast access to content ids that is very fast. If a difference is
+ * detected in this step this filter decides to include that path before even
+ * looking at the working-tree entry.
  * <p>
  * If no difference is found then we have to compare index and working-tree as
  * the last step. By making use of
- * {@link WorkingTreeIterator#isModified(org.eclipse.jgit.dircache.DirCacheEntry, boolean, ObjectReader)}
+ * {@link org.eclipse.jgit.treewalk.WorkingTreeIterator#isModified(org.eclipse.jgit.dircache.DirCacheEntry, boolean, ObjectReader)}
  * we can avoid the computation of the content id if the file is not dirty.
  * <p>
- * Instances of this filter should not be used for multiple {@link TreeWalk}s.
- * Always construct a new instance of this filter for each TreeWalk.
+ * Instances of this filter should not be used for multiple
+ * {@link org.eclipse.jgit.treewalk.TreeWalk}s. Always construct a new instance
+ * of this filter for each TreeWalk.
  */
 public class IndexDiffFilter extends TreeFilter {
 	private final int dirCache;
@@ -97,11 +104,13 @@
 	 * filter in multiple treewalks.
 	 *
 	 * @param dirCacheIndex
-	 *            the index of the {@link DirCacheIterator} in the associated
-	 *            treewalk
+	 *            the index of the
+	 *            {@link org.eclipse.jgit.dircache.DirCacheIterator} in the
+	 *            associated treewalk
 	 * @param workingTreeIndex
-	 *            the index of the {@link WorkingTreeIterator} in the associated
-	 *            treewalk
+	 *            the index of the
+	 *            {@link org.eclipse.jgit.treewalk.WorkingTreeIterator} in the
+	 *            associated treewalk
 	 */
 	public IndexDiffFilter(int dirCacheIndex, int workingTreeIndex) {
 		this(dirCacheIndex, workingTreeIndex, true /* honor ignores */);
@@ -112,14 +121,16 @@
 	 * filter in multiple treewalks.
 	 *
 	 * @param dirCacheIndex
-	 *            the index of the {@link DirCacheIterator} in the associated
-	 *            treewalk
+	 *            the index of the
+	 *            {@link org.eclipse.jgit.dircache.DirCacheIterator} in the
+	 *            associated treewalk
 	 * @param workingTreeIndex
-	 *            the index of the {@link WorkingTreeIterator} in the associated
-	 *            treewalk
+	 *            the index of the
+	 *            {@link org.eclipse.jgit.treewalk.WorkingTreeIterator} in the
+	 *            associated treewalk
 	 * @param honorIgnores
 	 *            true if the filter should skip working tree files that are
-	 *            declared as ignored by the standard exclude mechanisms..
+	 *            declared as ignored by the standard exclude mechanisms.
 	 */
 	public IndexDiffFilter(int dirCacheIndex, int workingTreeIndex,
 			boolean honorIgnores) {
@@ -128,6 +139,7 @@
 		this.honorIgnores = honorIgnores;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk tw) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -255,6 +267,7 @@
 		return tw.getTree(workingTree, WorkingTreeIterator.class);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		// We cannot compare subtrees in the working tree, so encourage
@@ -262,11 +275,13 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return "INDEX_DIFF_FILTER"; //$NON-NLS-1$
@@ -286,9 +301,11 @@
 	}
 
 	/**
+	 * <p>Getter for the field <code>untrackedFolders</code>.</p>
+	 *
 	 * @return all paths of folders which contain only untracked files/folders.
 	 *         If on the associated treewalk postorder traversal was turned on
-	 *         (see {@link TreeWalk#setPostOrderTraversal(boolean)}) then an
+	 *         (see {@link org.eclipse.jgit.treewalk.TreeWalk#setPostOrderTraversal(boolean)}) then an
 	 *         empty list will be returned.
 	 */
 	public List<String> getUntrackedFolders() {
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 2ea8228..81b8e6d 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
@@ -49,8 +49,9 @@
 
 /**
  * A filter for extracting changes between two versions of the dircache. In
- * addition to what {@link TreeFilter#ANY_DIFF} would do, it also detects
- * changes that will affect decorations and show up in an attempt to commit.
+ * addition to what {@link org.eclipse.jgit.treewalk.filter.TreeFilter#ANY_DIFF}
+ * would do, it also detects changes that will affect decorations and show up in
+ * an attempt to commit.
  */
 public final class InterIndexDiffFilter extends TreeFilter {
 	private static final int baseTree = 0;
@@ -60,6 +61,7 @@
 	 */
 	public static final TreeFilter INSTANCE = new InterIndexDiffFilter();
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final TreeWalk walker) {
 		final int n = walker.getTreeCount();
@@ -88,16 +90,19 @@
 		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 7f30cc7..3403c78 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
@@ -50,7 +50,8 @@
 import org.eclipse.jgit.treewalk.WorkingTreeIterator;
 
 /**
- * Skip {@link WorkingTreeIterator} entries that appear in gitignore files.
+ * Skip {@link org.eclipse.jgit.treewalk.WorkingTreeIterator} entries that
+ * appear in gitignore files.
  */
 public class NotIgnoredFilter extends TreeFilter {
 	private final int index;
@@ -65,6 +66,7 @@
 		this.index = workdirTreeIndex;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk tw) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -72,17 +74,20 @@
 		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 80c0b87..2e023d0 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
@@ -50,7 +50,9 @@
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.treewalk.TreeWalk;
 
-/** Includes an entry only if the subfilter does not include the entry. */
+/**
+ * Includes an entry only if the subfilter does not include the entry.
+ */
 public class NotTreeFilter extends TreeFilter {
 	/**
 	 * Create a filter that negates the result of another filter.
@@ -69,11 +71,13 @@
 		a = one;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public TreeFilter negate() {
 		return a;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final TreeWalk walker)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -81,6 +85,7 @@
 		return matchFilter(walker) == 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int matchFilter(TreeWalk walker)
 			throws MissingObjectException, IncorrectObjectTypeException,
@@ -97,17 +102,20 @@
 		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/OrTreeFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/OrTreeFilter.java
index 2c1a9d4..dbb062b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/OrTreeFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/OrTreeFilter.java
@@ -56,9 +56,10 @@
  * Includes a tree entry if any subfilters include the same tree entry.
  * <p>
  * Classic shortcut behavior is used, so evaluation of the
- * {@link TreeFilter#include(TreeWalk)} method stops as soon as a true result is
- * obtained. Applications can improve filtering performance by placing faster
- * filters that are more likely to accept a result earlier in the list.
+ * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#include(TreeWalk)} method
+ * stops as soon as a true result is obtained. Applications can improve
+ * filtering performance by placing faster filters that are more likely to
+ * accept a result earlier in the list.
  */
 public abstract class OrTreeFilter extends TreeFilter {
 	/**
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 445ba15..2f7f5cd 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
@@ -51,9 +51,10 @@
 /**
  * Includes tree entries only if they match the configured path.
  * <p>
- * Applications should use {@link PathFilterGroup} to connect these into a tree
- * filter graph, as the group supports breaking out of traversal once it is
- * known the path can never match.
+ * Applications should use
+ * {@link org.eclipse.jgit.treewalk.filter.PathFilterGroup} to connect these
+ * into a tree filter graph, as the group supports breaking out of traversal
+ * once it is known the path can never match.
  */
 public class PathFilter extends TreeFilter {
 	/**
@@ -70,7 +71,7 @@
 	 *            trailing '/' characters will be trimmed before string's length
 	 *            is checked or is used as part of the constructed filter.
 	 * @return a new filter for the requested path.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the path supplied was the empty string.
 	 */
 	public static PathFilter create(String path) {
@@ -90,21 +91,28 @@
 		pathRaw = Constants.encode(pathStr);
 	}
 
-	/** @return the path this filter matches. */
+	/**
+	 * Get the path this filter matches.
+	 *
+	 * @return the path this filter matches.
+	 */
 	public String getPath() {
 		return pathStr;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(final TreeWalk walker) {
 		return matchFilter(walker) <= 0;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int matchFilter(final TreeWalk walker) {
 		return walker.isPathMatch(pathRaw, pathRaw.length);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean shouldBeRecursive() {
 		for (final byte b : pathRaw)
@@ -113,11 +121,13 @@
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public PathFilter clone() {
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	@SuppressWarnings("nls")
 	public String toString() {
@@ -125,6 +135,9 @@
 	}
 
 	/**
+	 * Whether the path length of this filter matches the length of the current
+	 * path of the supplied TreeWalk.
+	 *
 	 * @param walker
 	 *            The walk to check against.
 	 * @return {@code true} if the path length of this filter matches the length
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilterGroup.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilterGroup.java
index 174a4f5..0652288 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilterGroup.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/PathFilterGroup.java
@@ -55,10 +55,11 @@
 /**
  * Includes tree entries only if they match one or more configured paths.
  * <p>
- * Operates like {@link PathFilter} but causes the walk to abort as soon as the
- * tree can no longer match any of the paths within the group. This may bypass
- * the boolean logic of a higher level AND or OR group, but does improve
- * performance for the common case of examining one or more modified paths.
+ * Operates like {@link org.eclipse.jgit.treewalk.filter.PathFilter} but causes
+ * the walk to abort as soon as the tree can no longer match any of the paths
+ * within the group. This may bypass the boolean logic of a higher level AND or
+ * OR group, but does improve performance for the common case of examining one
+ * or more modified paths.
  * <p>
  * This filter is effectively an OR group around paths, with the early abort
  * feature described above.
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 f54cbea..553e6bd 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
@@ -59,8 +59,8 @@
  * paths ending in <code>.txt</code>.
  * <p>
  * Using this filter is recommended instead of filtering the entries using
- * {@link TreeWalk#getPathString()} and <code>endsWith</code> or some other type
- * of string match function.
+ * {@link org.eclipse.jgit.treewalk.TreeWalk#getPathString()} and
+ * <code>endsWith</code> or some other type of string match function.
  */
 public class PathSuffixFilter extends TreeFilter {
 
@@ -72,7 +72,7 @@
 	 * @param path
 	 *            the path suffix to filter on. Must not be the empty string.
 	 * @return a new filter for the requested path.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the path supplied was the empty string.
 	 */
 	public static PathSuffixFilter create(String path) {
@@ -89,11 +89,13 @@
 		pathRaw = Constants.encode(pathStr);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public TreeFilter clone() {
 		return this;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
@@ -104,6 +106,7 @@
 
 	}
 
+	/** {@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 e6bedfd..b52d2bd 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
@@ -69,6 +69,7 @@
 		this.treeIdx = treeIdx;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean include(TreeWalk walker) {
 		DirCacheIterator i = walker.getTree(treeIdx, DirCacheIterator.class);
@@ -79,16 +80,19 @@
 		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 2c2fb47..f0a7632 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
@@ -67,7 +67,8 @@
  * <p>
  * <b>Path filters:</b>
  * <ul>
- * <li>Matching pathname: {@link PathFilter}</li>
+ * <li>Matching pathname:
+ * {@link org.eclipse.jgit.treewalk.filter.PathFilter}</li>
  * </ul>
  *
  * <p>
@@ -79,9 +80,9 @@
  * <p>
  * <b>Boolean modifiers:</b>
  * <ul>
- * <li>AND: {@link AndTreeFilter}</li>
- * <li>OR: {@link OrTreeFilter}</li>
- * <li>NOT: {@link NotTreeFilter}</li>
+ * <li>AND: {@link org.eclipse.jgit.treewalk.filter.AndTreeFilter}</li>
+ * <li>OR: {@link org.eclipse.jgit.treewalk.filter.OrTreeFilter}</li>
+ * <li>NOT: {@link org.eclipse.jgit.treewalk.filter.NotTreeFilter}</li>
  * </ul>
  */
 public abstract class TreeFilter {
@@ -173,24 +174,25 @@
 	 * Determine if the current entry is interesting to report.
 	 * <p>
 	 * This method is consulted for subtree entries even if
-	 * {@link TreeWalk#isRecursive()} is enabled. The consultation allows the
-	 * filter to bypass subtree recursion on a case-by-case basis, even when
-	 * recursion is enabled at the application level.
+	 * {@link org.eclipse.jgit.treewalk.TreeWalk#isRecursive()} is enabled. The
+	 * consultation allows the filter to bypass subtree recursion on a
+	 * case-by-case basis, even when recursion is enabled at the application
+	 * level.
 	 *
 	 * @param walker
 	 *            the walker the filter needs to examine.
 	 * @return true if the current entry should be seen by the application;
 	 *         false to hide the entry.
-	 * @throws MissingObjectException
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             an object the filter needs to consult to determine its answer
 	 *             does not exist in the Git repository the walker is operating
 	 *             on. Filtering this current walker entry is impossible without
 	 *             the object.
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             an object the filter needed to consult was not of the
 	 *             expected object type. This usually indicates a corrupt
 	 *             repository, as an object link is referencing the wrong type.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             a loose object or pack file could not be read to obtain data
 	 *             necessary for the filter to make its decision.
 	 */
@@ -203,19 +205,19 @@
 	 * <p>
 	 * This method extends the result returned by {@link #include(TreeWalk)}
 	 * with a third option (-1), splitting the value true. This gives the
-	 * application a possibility to distinguish between an exact match
-	 * and the case when a subtree to the current entry might be a match.
+	 * application a possibility to distinguish between an exact match and the
+	 * case when a subtree to the current entry might be a match.
 	 *
 	 * @param walker
 	 *            the walker the filter needs to examine.
-	 * @return -1 if the current entry is a parent of the filter but no
-	 *         exact match has been made; 0 if the current entry should
-	 *         be seen by the application; 1 if it should be hidden.
-	 * @throws MissingObjectException
+	 * @return -1 if the current entry is a parent of the filter but no exact
+	 *         match has been made; 0 if the current entry should be seen by the
+	 *         application; 1 if it should be hidden.
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
 	 *             as thrown by {@link #include(TreeWalk)}
-	 * @throws IncorrectObjectTypeException
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
 	 *             as thrown by {@link #include(TreeWalk)}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             as thrown by {@link #include(TreeWalk)}
 	 * @since 4.7
 	 */
@@ -241,16 +243,17 @@
 	public abstract boolean shouldBeRecursive();
 
 	/**
+	 * {@inheritDoc}
+	 *
 	 * Clone this tree filter, including its parameters.
 	 * <p>
 	 * This is a deep clone. If this filter embeds objects or other filters it
 	 * must also clone those, to ensure the instances do not share mutable data.
-	 *
-	 * @return another copy of this filter, suitable for another thread.
 	 */
 	@Override
 	public abstract TreeFilter clone();
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		String n = getClass().getName();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilterMarker.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilterMarker.java
index 59515dc..738ccbd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilterMarker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/TreeFilterMarker.java
@@ -53,8 +53,9 @@
 import org.eclipse.jgit.treewalk.TreeWalk;
 
 /**
- * For testing an array of {@link TreeFilter} during a {@link TreeWalk} for each
- * entry and returning the result as a bitmask.
+ * For testing an array of {@link org.eclipse.jgit.treewalk.filter.TreeFilter}
+ * during a {@link org.eclipse.jgit.treewalk.TreeWalk} for each entry and
+ * returning the result as a bitmask.
  *
  * @since 2.3
  */
@@ -68,8 +69,8 @@
 	 *
 	 * @param markTreeFilters
 	 *            the filters to use for marking, must not have more elements
-	 *            than {@link Integer#SIZE}.
-	 * @throws IllegalArgumentException
+	 *            than {@link java.lang.Integer#SIZE}.
+	 * @throws java.lang.IllegalArgumentException
 	 *             if more tree filters are passed than possible
 	 */
 	public TreeFilterMarker(TreeFilter[] markTreeFilters) {
@@ -85,19 +86,23 @@
 
 	/**
 	 * Test the filters against the walk. Returns a bitmask where each bit
-	 * represents the result of a call to {@link TreeFilter#include(TreeWalk)},
+	 * represents the result of a call to
+	 * {@link org.eclipse.jgit.treewalk.filter.TreeFilter#include(TreeWalk)},
 	 * ordered by the index for which the tree filters were passed in the
 	 * constructor.
 	 *
 	 * @param walk
 	 *            the walk from which to test the current entry
 	 * @return the marks bitmask
-	 * @throws MissingObjectException
-	 *             as thrown by {@link TreeFilter#include(TreeWalk)}
-	 * @throws IncorrectObjectTypeException
-	 *             as thrown by {@link TreeFilter#include(TreeWalk)}
-	 * @throws IOException
-	 *             as thrown by {@link TreeFilter#include(TreeWalk)}
+	 * @throws org.eclipse.jgit.errors.MissingObjectException
+	 *             as thrown by
+	 *             {@link org.eclipse.jgit.treewalk.filter.TreeFilter#include(TreeWalk)}
+	 * @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
+	 *             as thrown by
+	 *             {@link org.eclipse.jgit.treewalk.filter.TreeFilter#include(TreeWalk)}
+	 * @throws java.io.IOException
+	 *             as thrown by
+	 *             {@link org.eclipse.jgit.treewalk.filter.TreeFilter#include(TreeWalk)}
 	 */
 	public int getMarks(TreeWalk walk) throws MissingObjectException,
 			IncorrectObjectTypeException, IOException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java
index c05570b..0c27ced 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java
@@ -6,7 +6,8 @@
 
 package org.eclipse.jgit.util;
 
-import java.io.UnsupportedEncodingException;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.Arrays;
@@ -18,14 +19,13 @@
  * <p>
  * I am placing this code in the Public Domain. Do with it as you will. This
  * software comes with no guarantees or warranties but with plenty of
- * well-wishing instead! Please visit <a
- * href="http://iharder.net/base64">http://iharder.net/base64</a> periodically
- * to check for updates or to contribute improvements.
+ * well-wishing instead! Please visit
+ * <a href="http://iharder.net/base64">http://iharder.net/base64</a>
+ * periodically to check for updates or to contribute improvements.
  * </p>
  *
  * @author Robert Harder
  * @author rob@iharder.net
- * @version 2.1, stripped to minimum feature set used by JGit.
  */
 public class Base64 {
 	/** The equals sign (=) as a byte. */
@@ -40,9 +40,6 @@
 	/** Indicates an invalid byte during decoding. */
 	private final static byte INVALID_DEC = -3;
 
-	/** Preferred encoding. */
-	private final static String UTF_8 = "UTF-8"; //$NON-NLS-1$
-
 	/** The 64 valid Base64 values. */
 	private final static byte[] ENC;
 
@@ -54,15 +51,11 @@
 	private final static byte[] DEC;
 
 	static {
-		try {
-			ENC = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" // //$NON-NLS-1$
-					+ "abcdefghijklmnopqrstuvwxyz" // //$NON-NLS-1$
-					+ "0123456789" // //$NON-NLS-1$
-					+ "+/" // //$NON-NLS-1$
-			).getBytes(UTF_8);
-		} catch (UnsupportedEncodingException uee) {
-			throw new RuntimeException(uee.getMessage(), uee);
-		}
+		ENC = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" // //$NON-NLS-1$
+				+ "abcdefghijklmnopqrstuvwxyz" // //$NON-NLS-1$
+				+ "0123456789" // //$NON-NLS-1$
+				+ "+/" // //$NON-NLS-1$
+		).getBytes(UTF_8);
 
 		DEC = new byte[128];
 		Arrays.fill(DEC, INVALID_DEC);
@@ -254,7 +247,7 @@
 	 * @param len
 	 *            The length of characters to decode
 	 * @return decoded data
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             the input is not a valid Base64 sequence.
 	 */
 	public static byte[] decode(byte[] source, int off, int len) {
@@ -301,7 +294,7 @@
 	 * @return the decoded data
 	 */
 	public static byte[] decode(String s) {
-		byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
+		byte[] bytes = s.getBytes(UTF_8);
 		return decode(bytes, 0, bytes.length);
 	}
 }
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 c86c588..c3d4747 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/BlockList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/BlockList.java
@@ -84,7 +84,9 @@
 
 	private T[] tailBlock;
 
-	/** Initialize an empty list. */
+	/**
+	 * Initialize an empty list.
+	 */
 	public BlockList() {
 		directory = BlockList.<T> newDirectory(256);
 		directory[0] = BlockList.<T> newBlock();
@@ -106,11 +108,13 @@
 		tailBlock = directory[0];
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int size() {
 		return size;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void clear() {
 		for (T[] block : directory) {
@@ -123,6 +127,7 @@
 		tailBlock = directory[0];
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public T get(int index) {
 		if (index < 0 || size <= index)
@@ -130,6 +135,7 @@
 		return directory[toDirectoryIndex(index)][toBlockIndex(index)];
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public T set(int index, T element) {
 		if (index < 0 || size <= index)
@@ -187,6 +193,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean add(T element) {
 		int i = tailBlkIdx;
@@ -217,6 +224,7 @@
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void add(int index, T element) {
 		if (index == size) {
@@ -238,6 +246,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public T remove(int index) {
 		if (index == size - 1) {
@@ -277,6 +286,7 @@
 		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 8677c69..9915bdf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/CachedAuthenticator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/CachedAuthenticator.java
@@ -49,7 +49,9 @@
 import java.util.Collection;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-/** Abstract authenticator which remembers prior authentications. */
+/**
+ * Abstract authenticator which remembers prior authentications.
+ */
 public abstract class CachedAuthenticator extends Authenticator {
 	private static final Collection<CachedAuthentication> cached = new CopyOnWriteArrayList<>();
 
@@ -63,6 +65,7 @@
 		cached.add(ca);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected final PasswordAuthentication getPasswordAuthentication() {
 		final String host = getRequestingHost();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java
index f1f6053..c8e6645 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java
@@ -82,9 +82,11 @@
 	 * @param firstParentId
 	 *            parent id of previous commit or null
 	 * @param author
-	 *            the {@link PersonIdent} for the presumed author and time
+	 *            the {@link org.eclipse.jgit.lib.PersonIdent} for the presumed
+	 *            author and time
 	 * @param committer
-	 *            the {@link PersonIdent} for the presumed committer and time
+	 *            the {@link org.eclipse.jgit.lib.PersonIdent} for the presumed
+	 *            committer and time
 	 * @param message
 	 *            The commit message
 	 * @return the change id SHA1 string (without the 'I') or null if the
@@ -138,7 +140,9 @@
 	 * line.
 	 *
 	 * @param message
+	 *            a message.
 	 * @param changeId
+	 *            a Change-Id.
 	 * @return a commit message with an inserted Change-Id line
 	 */
 	public static String insertId(String message, ObjectId changeId) {
@@ -148,18 +152,21 @@
 	/**
 	 * Find the right place to insert a Change-Id and return it.
 	 * <p>
-	 * If no Change-Id is found the Change-Id is inserted before
-	 * the first footer line but after a Bug line.
+	 * If no Change-Id is found the Change-Id is inserted before the first
+	 * footer line but after a Bug line.
 	 *
-	 * If Change-Id is found and replaceExisting is set to false,
-	 * the message is unchanged.
+	 * If Change-Id is found and replaceExisting is set to false, the message is
+	 * unchanged.
 	 *
-	 * If Change-Id is found and replaceExisting is set to true,
-	 * the Change-Id is replaced with {@code changeId}.
+	 * If Change-Id is found and replaceExisting is set to true, the Change-Id
+	 * is replaced with {@code changeId}.
 	 *
 	 * @param message
+	 *            a message.
 	 * @param changeId
+	 *            a Change-Id.
 	 * @param replaceExisting
+	 *            a boolean.
 	 * @return a commit message with an inserted Change-Id line
 	 */
 	public static String insertId(String message, ObjectId changeId,
@@ -219,6 +226,7 @@
 	 * only lines matching {@code footerPattern}.
 	 *
 	 * @param message
+	 *            a message.
 	 * @param delimiter
 	 *            the line delimiter, like "\n" or "\r\n", needed to find the
 	 *            footer
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 244d71f..b442b3c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
@@ -79,8 +79,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** Abstraction to support various file system operations not in Java. */
+/**
+ * Abstraction to support various file system operations not in Java.
+ */
 public abstract class FS {
+	private static final Logger LOG = LoggerFactory.getLogger(FS.class);
+
 	/**
 	 * This class creates FS instances. It will be overridden by a Java7 variant
 	 * if such can be detected in {@link #detect(Boolean)}.
@@ -162,8 +166,6 @@
 		}
 	}
 
-	private final static Logger LOG = LoggerFactory.getLogger(FS.class);
-
 	/** The auto-detected implementation selected for this operating system and JRE. */
 	public static final FS DETECTED = detect();
 
@@ -196,7 +198,6 @@
 	 *            </ul>
 	 *
 	 *            Note: this parameter is only relevant on Windows.
-	 *
 	 * @return detected file system abstraction
 	 */
 	public static FS detect(Boolean cygwinUsed) {
@@ -228,7 +229,11 @@
 		gitSystemConfig = src.gitSystemConfig;
 	}
 
-	/** @return a new instance of the same type of FS. */
+	/**
+	 * Create a new instance of the same type of FS.
+	 *
+	 * @return a new instance of the same type of FS.
+	 */
 	public abstract FS newInstance();
 
 	/**
@@ -246,8 +251,8 @@
 	 * parallel only one will succeed. In such cases both clients may think they
 	 * created a new file.
 	 *
-	 * @return true if this implementation support atomic creation of new
-	 *         Files by {@link File#createNewFile()}
+	 * @return true if this implementation support atomic creation of new Files
+	 *         by {@link java.io.File#createNewFile()}
 	 * @since 4.5
 	 */
 	public boolean supportsAtomicCreateNewFile() {
@@ -309,8 +314,9 @@
 	 * than that of the link target.
 	 *
 	 * @param f
+	 *            a {@link java.io.File} object.
 	 * @return last modified time of f
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public long lastModified(File f) throws IOException {
@@ -322,8 +328,10 @@
 	 * symbolic links, the link is modified, not the target,
 	 *
 	 * @param f
+	 *            a {@link java.io.File} object.
 	 * @param time
-	 * @throws IOException
+	 *            last modified time
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public void setLastModified(File f, long time) throws IOException {
@@ -335,8 +343,9 @@
 	 * it's the length of the link, else the length of the target.
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return length of a file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public long length(File path) throws IOException {
@@ -347,7 +356,8 @@
 	 * Delete a file. Throws an exception if delete fails.
 	 *
 	 * @param f
-	 * @throws IOException
+	 *            a {@link java.io.File} object.
+	 * @throws java.io.IOException
 	 *             this may be a Java7 subclass with detailed information
 	 * @since 3.3
 	 */
@@ -448,7 +458,7 @@
 	 *            Files to search for in the given path
 	 * @return the first match found, or null
 	 * @since 3.0
-	 **/
+	 */
 	protected static File searchPath(final String path, final String... lookFor) {
 		if (path == null)
 			return null;
@@ -474,7 +484,7 @@
 	 *            to be used to parse the command's output
 	 * @return the one-line output of the command or {@code null} if there is
 	 *         none
-	 * @throws CommandFailedException
+	 * @throws org.eclipse.jgit.errors.CommandFailedException
 	 *             thrown when the command failed (return code was non-zero)
 	 */
 	@Nullable
@@ -497,7 +507,7 @@
 	 *            current process
 	 * @return the one-line output of the command or {@code null} if there is
 	 *         none
-	 * @throws CommandFailedException
+	 * @throws org.eclipse.jgit.errors.CommandFailedException
 	 *             thrown when the command failed (return code was non-zero)
 	 * @since 4.0
 	 */
@@ -636,6 +646,8 @@
 	}
 
 	/**
+	 * Discover the path to the Git executable.
+	 *
 	 * @return the path to the Git executable or {@code null} if it cannot be
 	 *         determined.
 	 * @since 4.0
@@ -643,6 +655,8 @@
 	protected abstract File discoverGitExe();
 
 	/**
+	 * Discover the path to the system-wide Git configuration file
+	 *
 	 * @return the path to the system-wide Git configuration file or
 	 *         {@code null} if it cannot be determined.
 	 * @since 4.0
@@ -690,8 +704,10 @@
 	}
 
 	/**
-	 * @return the currently used path to the system-wide Git configuration
-	 *         file or {@code null} if none has been set.
+	 * Get the currently used path to the system-wide Git configuration file.
+	 *
+	 * @return the currently used path to the system-wide Git configuration file
+	 *         or {@code null} if none has been set.
 	 * @since 4.0
 	 */
 	public File getGitSystemConfig() {
@@ -715,7 +731,10 @@
 	}
 
 	/**
+	 * Get the parent directory of this file's parent directory
+	 *
 	 * @param grandchild
+	 *            a {@link java.io.File} object.
 	 * @return the parent directory of this file's parent directory or
 	 *         {@code null} in case there's no grandparent directory
 	 * @since 4.0
@@ -733,8 +752,9 @@
 	 * Check if a file is a symbolic link and read it
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return target of link or null
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public String readSymLink(File path) throws IOException {
@@ -742,9 +762,12 @@
 	}
 
 	/**
+	 * Whether the path is a symbolic link (and we support these).
+	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return true if the path is a symbolic link (and we support these)
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public boolean isSymLink(File path) throws IOException {
@@ -756,6 +779,7 @@
 	 * target does not exist
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return true if path exists
 	 * @since 3.0
 	 */
@@ -768,6 +792,7 @@
 	 * path is a symbolic link to a directory, this method returns false.
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return true if file is a directory,
 	 * @since 3.0
 	 */
@@ -780,6 +805,7 @@
 	 * symbolic links the test returns false if path represents a symbolic link.
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return true if path represents a regular file
 	 * @since 3.0
 	 */
@@ -788,10 +814,14 @@
 	}
 
 	/**
+	 * Whether path is hidden, either starts with . on unix or has the hidden
+	 * attribute in windows
+	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return true if path is hidden, either starts with . on unix or has the
 	 *         hidden attribute in windows
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public boolean isHidden(File path) throws IOException {
@@ -802,8 +832,10 @@
 	 * Set the hidden attribute for file whose name starts with a period.
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @param hidden
-	 * @throws IOException
+	 *            whether to set the file hidden
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public void setHidden(File path, boolean hidden) throws IOException {
@@ -814,8 +846,10 @@
 	 * Create a symbolic link
 	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @param target
-	 * @throws IOException
+	 *            target path of the symlink
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public void createSymLink(File path, String target) throws IOException {
@@ -823,9 +857,9 @@
 	}
 
 	/**
-	 * Create a new file. See {@link File#createNewFile()}. Subclasses of this
-	 * class may take care to provide a safe implementation for this even if
-	 * {@link #supportsAtomicCreateNewFile()} is <code>false</code>
+	 * Create a new file. See {@link java.io.File#createNewFile()}. Subclasses
+	 * of this class may take care to provide a safe implementation for this
+	 * even if {@link #supportsAtomicCreateNewFile()} is <code>false</code>
 	 *
 	 * @param path
 	 *            the file to be created
@@ -909,7 +943,8 @@
 	}
 
 	/**
-	 * See {@link FileUtils#relativizePath(String, String, String, boolean)}.
+	 * See
+	 * {@link org.eclipse.jgit.util.FileUtils#relativizePath(String, String, String, boolean)}.
 	 *
 	 * @param base
 	 *            The path against which <code>other</code> should be
@@ -942,7 +977,7 @@
 	 *            Arguments to pass to this hook. Cannot be <code>null</code>,
 	 *            but can be an empty array.
 	 * @return The ProcessResult describing this hook's execution.
-	 * @throws JGitInternalException
+	 * @throws org.eclipse.jgit.api.errors.JGitInternalException
 	 *             if we fail to run the hook somehow. Causes may include an
 	 *             interrupted process or I/O errors.
 	 * @since 4.0
@@ -977,7 +1012,7 @@
 	 *            A string to pass on to the standard input of the hook. May be
 	 *            <code>null</code>.
 	 * @return The ProcessResult describing this hook's execution.
-	 * @throws JGitInternalException
+	 * @throws org.eclipse.jgit.api.errors.JGitInternalException
 	 *             if we fail to run the hook somehow. Causes may include an
 	 *             interrupted process or I/O errors.
 	 * @since 4.0
@@ -1013,7 +1048,7 @@
 	 *            A string to pass on to the standard input of the hook. May be
 	 *            <code>null</code>.
 	 * @return The ProcessResult describing this hook's execution.
-	 * @throws JGitInternalException
+	 * @throws org.eclipse.jgit.api.errors.JGitInternalException
 	 *             if we fail to run the hook somehow. Causes may include an
 	 *             interrupted process or I/O errors.
 	 * @since 4.0
@@ -1058,8 +1093,8 @@
 	 *            The repository within which to find a hook.
 	 * @param hookName
 	 *            The name of the hook we're trying to find.
-	 * @return The {@link File} containing this particular hook if it exists in
-	 *         the given repository, <code>null</code> otherwise.
+	 * @return The {@link java.io.File} containing this particular hook if it
+	 *         exists in the given repository, <code>null</code> otherwise.
 	 * @since 4.0
 	 */
 	public File findHook(Repository repository, final String hookName) {
@@ -1089,9 +1124,9 @@
 	 *            A string to pass on to the standard input of the hook. Can be
 	 *            <code>null</code>.
 	 * @return the exit value of this process.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if an I/O error occurs while executing this process.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             if the current thread is interrupted while waiting for the
 	 *             process to end.
 	 * @since 4.2
@@ -1125,9 +1160,9 @@
 	 *            will be consumed by the process. The method will close the
 	 *            inputstream after all bytes are read.
 	 * @return the return code of this process.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if an I/O error occurs while executing this process.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             if the current thread is interrupted while waiting for the
 	 *             process to end.
 	 * @since 4.2
@@ -1253,15 +1288,15 @@
 	public abstract ProcessBuilder runInShell(String cmd, String[] args);
 
 	/**
-	 * Execute a command defined by a {@link ProcessBuilder}.
+	 * Execute a command defined by a {@link java.lang.ProcessBuilder}.
 	 *
 	 * @param pb
 	 *            The command to be executed
 	 * @param in
 	 *            The standard input stream passed to the process
 	 * @return The result of the executed command
-	 * @throws InterruptedException
-	 * @throws IOException
+	 * @throws java.lang.InterruptedException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	public ExecutionResult execute(ProcessBuilder pb, InputStream in)
@@ -1414,8 +1449,11 @@
 	}
 
 	/**
+	 * Get the file attributes we care for.
+	 *
 	 * @param path
-	 * @return the file attributes we care for
+	 *            a {@link java.io.File} object.
+	 * @return the file attributes we care for.
 	 * @since 3.3
 	 */
 	public Attributes getAttributes(File path) {
@@ -1435,6 +1473,7 @@
 	 * Normalize the unicode path to composed form.
 	 *
 	 * @param file
+	 *            a {@link java.io.File} object.
 	 * @return NFC-format File
 	 * @since 3.3
 	 */
@@ -1446,6 +1485,7 @@
 	 * Normalize the unicode path to composed form.
 	 *
 	 * @param name
+	 *            path name
 	 * @return NFC-format string
 	 * @since 3.3
 	 */
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 d220030..45237c4 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
@@ -85,9 +85,15 @@
 
 	private volatile boolean supportsUnixNLink = true;
 
-	private volatile Boolean supportsAtomicCreateNewFile;
+	private volatile AtomicFileCreation supportsAtomicCreateNewFile = AtomicFileCreation.UNDEFINED;
 
-	/** Default constructor. */
+	private enum AtomicFileCreation {
+		SUPPORTED, NOT_SUPPORTED, UNDEFINED
+	}
+
+	/**
+	 * Default constructor.
+	 */
 	protected FS_POSIX() {
 	}
 
@@ -104,34 +110,38 @@
 		}
 	}
 
-	@SuppressWarnings("boxing")
 	private void determineAtomicFileCreationSupport() {
 		// @TODO: enhance SystemReader to support this without copying code
-		Boolean ret = getAtomicFileCreationSupportOption(
+		AtomicFileCreation ret = getAtomicFileCreationSupportOption(
 				SystemReader.getInstance().openUserConfig(null, this));
-		if (ret == null && StringUtils.isEmptyOrNull(SystemReader.getInstance()
-				.getenv(Constants.GIT_CONFIG_NOSYSTEM_KEY))) {
+		if (ret == AtomicFileCreation.UNDEFINED
+				&& StringUtils.isEmptyOrNull(SystemReader.getInstance()
+						.getenv(Constants.GIT_CONFIG_NOSYSTEM_KEY))) {
 			ret = getAtomicFileCreationSupportOption(
 					SystemReader.getInstance().openSystemConfig(null, this));
 		}
-		supportsAtomicCreateNewFile = (ret == null) || ret;
+		supportsAtomicCreateNewFile = ret;
 	}
 
-	private Boolean getAtomicFileCreationSupportOption(FileBasedConfig config) {
+	private AtomicFileCreation getAtomicFileCreationSupportOption(
+			FileBasedConfig config) {
 		try {
 			config.load();
 			String value = config.getString(ConfigConstants.CONFIG_CORE_SECTION,
 					null,
 					ConfigConstants.CONFIG_KEY_SUPPORTSATOMICFILECREATION);
 			if (value == null) {
-				return null;
+				return AtomicFileCreation.UNDEFINED;
 			}
-			return Boolean.valueOf(StringUtils.toBoolean(value));
+			return StringUtils.toBoolean(value)
+					? AtomicFileCreation.SUPPORTED
+					: AtomicFileCreation.NOT_SUPPORTED;
 		} catch (IOException | ConfigInvalidException e) {
-			return Boolean.TRUE;
+			return AtomicFileCreation.SUPPORTED;
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FS newInstance() {
 		return new FS_POSIX(this);
@@ -179,6 +189,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected File discoverGitExe() {
 		String path = SystemReader.getInstance().getenv("PATH"); //$NON-NLS-1$
@@ -209,21 +220,25 @@
 		return gitExe;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isCaseSensitive() {
 		return !SystemReader.getInstance().isMacOS();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supportsExecute() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean canExecute(File f) {
 		return FileUtils.canExecute(f);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean setExecute(File f, boolean canExecute) {
 		if (!isFile(f))
@@ -232,7 +247,7 @@
 			return f.setExecutable(false, false);
 
 		try {
-			Path path = f.toPath();
+			Path path = FileUtils.toPath(f);
 			Set<PosixFilePermission> pset = Files.getPosixFilePermissions(path);
 
 			// owner (user) is always allowed to execute.
@@ -264,6 +279,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ProcessBuilder runInShell(String cmd, String[] args) {
 		List<String> argv = new ArrayList<>(4 + args.length);
@@ -277,9 +293,7 @@
 		return proc;
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ProcessResult runHookIfPresent(Repository repository, String hookName,
 			String[] args, PrintStream outRedirect, PrintStream errRedirect,
@@ -288,48 +302,43 @@
 				errRedirect, stdinArgs);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean retryFailedLockFileCommit() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supportsSymlinks() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void setHidden(File path, boolean hidden) throws IOException {
 		// no action on POSIX
 	}
 
-	/**
-	 * @since 3.3
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public Attributes getAttributes(File path) {
 		return FileUtils.getFileAttributesPosix(this, path);
 	}
 
-	/**
-	 * @since 3.3
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public File normalize(File file) {
 		return FileUtils.normalize(file);
 	}
 
-	/**
-	 * @since 3.3
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public String normalize(String name) {
 		return FileUtils.normalize(name);
 	}
 
-	/**
-	 * @since 3.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public File findHook(Repository repository, String hookName) {
 		final File gitdir = repository.getDirectory();
@@ -343,24 +352,27 @@
 		return null;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supportsAtomicCreateNewFile() {
-		if (supportsAtomicCreateNewFile == null) {
+		if (supportsAtomicCreateNewFile == AtomicFileCreation.UNDEFINED) {
 			determineAtomicFileCreationSupport();
 		}
-		return supportsAtomicCreateNewFile.booleanValue();
+		return supportsAtomicCreateNewFile == AtomicFileCreation.SUPPORTED;
 	}
 
 	@Override
 	@SuppressWarnings("boxing")
 	/**
+	 * {@inheritDoc}
+	 * <p>
 	 * An implementation of the File#createNewFile() semantics which works also
 	 * on NFS. If the config option
 	 * {@code core.supportsAtomicCreateNewFile = true} (which is the default)
 	 * then simply File#createNewFile() is called.
 	 *
 	 * But if {@code core.supportsAtomicCreateNewFile = false} then after
-	 * successful creation of the lock file a hardlink to that lock file is
+	 * successful creation of the lock file a hard link to that lock file is
 	 * created and the attribute nlink of the lock file is checked to be 2. If
 	 * multiple clients manage to create the same lock file nlink would be
 	 * greater than 2 showing the error.
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 0602921..29fe5dc 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
@@ -83,36 +83,43 @@
 		super(src);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FS newInstance() {
 		return new FS_Win32(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supportsExecute() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean canExecute(final File f) {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean setExecute(final File f, final boolean canExec) {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isCaseSensitive() {
 		return false;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean retryFailedLockFileCommit() {
 		return true;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected File discoverGitExe() {
 		String path = SystemReader.getInstance().getenv("PATH"); //$NON-NLS-1$
@@ -141,6 +148,7 @@
 		return gitExe;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected File userHomeImpl() {
 		String home = SystemReader.getInstance().getenv("HOME"); //$NON-NLS-1$
@@ -160,6 +168,7 @@
 		return super.userHomeImpl();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public ProcessBuilder runInShell(String cmd, String[] args) {
 		List<String> argv = new ArrayList<>(3 + args.length);
@@ -172,6 +181,7 @@
 		return proc;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean supportsSymlinks() {
 		if (supportSymlinks == null)
@@ -200,9 +210,7 @@
 		}
 	}
 
-	/**
-	 * @since 3.3
-	 */
+	/** {@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 545cc01..64cdcc3 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,6 +72,8 @@
 	private static String cygpath;
 
 	/**
+	 * Whether cygwin is found
+	 *
 	 * @return true if cygwin is found
 	 */
 	public static boolean isCygwin() {
@@ -107,11 +109,13 @@
 		super(src);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FS newInstance() {
 		return new FS_Win32_Cygwin(this);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public File resolve(final File dir, final String pn) {
 		String useCygPath = System.getProperty("jgit.usecygpath"); //$NON-NLS-1$
@@ -132,6 +136,7 @@
 		return super.resolve(dir, pn);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	protected File userHomeImpl() {
 		final String home = AccessController
@@ -146,6 +151,7 @@
 		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);
@@ -159,18 +165,14 @@
 		return proc;
 	}
 
-	/**
-	 * @since 3.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public String relativize(String base, String other) {
 		final String relativized = super.relativize(base, other);
 		return relativized.replace(File.separatorChar, '/');
 	}
 
-	/**
-	 * @since 4.0
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public ProcessResult runHookIfPresent(Repository repository, String hookName,
 			String[] args, PrintStream outRedirect, PrintStream errRedirect,
@@ -179,9 +181,7 @@
 				errRedirect, stdinArgs);
 	}
 
-	/**
-	 * @since 3.7
-	 */
+	/** {@inheritDoc} */
 	@Override
 	public File findHook(Repository repository, String hookName) {
 		final File gitdir = repository.getDirectory();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtil.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtil.java
index b87b9a4..96f2175 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtil.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtil.java
@@ -45,7 +45,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.file.Files;
 
 import org.eclipse.jgit.util.FS.Attributes;
 
@@ -56,10 +55,14 @@
 public class FileUtil {
 
 	/**
+	 * Read target path of a symlink.
+	 *
 	 * @param path
-	 * @return target path of the symlink
-	 * @throws IOException
-	 * @deprecated use {@link FileUtils#readSymLink(File)} instead
+	 *            a {@link java.io.File}.
+	 * @return target path of the symlink.
+	 * @throws java.io.IOException
+	 * @deprecated use {@link org.eclipse.jgit.util.FileUtils#readSymLink(File)}
+	 *             instead
 	 */
 	@Deprecated
 	public static String readSymlink(File path) throws IOException {
@@ -67,12 +70,16 @@
 	}
 
 	/**
+	 * Create a symlink
+	 *
 	 * @param path
 	 *            path of the symlink to be created
 	 * @param target
 	 *            target of the symlink to be created
-	 * @throws IOException
-	 * @deprecated use {@link FileUtils#createSymLink(File, String)} instead
+	 * @throws java.io.IOException
+	 * @deprecated use
+	 *             {@link org.eclipse.jgit.util.FileUtils#createSymLink(File, String)}
+	 *             instead
 	 */
 	@Deprecated
 	public static void createSymLink(File path, String target)
@@ -81,9 +88,14 @@
 	}
 
 	/**
+	 * Whether the passed file is a symlink
+	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return {@code true} if the passed path is a symlink
-	 * @deprecated Use {@link Files#isSymbolicLink(java.nio.file.Path)} instead
+	 * @deprecated Use
+	 *             {@link java.nio.file.Files#isSymbolicLink(java.nio.file.Path)}
+	 *             instead
 	 */
 	@Deprecated
 	public static boolean isSymlink(File path) {
@@ -91,11 +103,14 @@
 	}
 
 	/**
+	 * Get lastModified attribute for given path
+	 *
 	 * @param path
+	 *            a {@link java.io.File}.
 	 * @return lastModified attribute for given path
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @deprecated Use
-	 *             {@link Files#getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...)}
+	 *             {@link java.nio.file.Files#getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...)}
 	 *             instead
 	 */
 	@Deprecated
@@ -104,11 +119,15 @@
 	}
 
 	/**
+	 * Set lastModified attribute for given path
+	 *
 	 * @param path
+	 *            a {@link java.io.File}.
 	 * @param time
-	 * @throws IOException
+	 *            a long.
+	 * @throws java.io.IOException
 	 * @deprecated Use
-	 *             {@link Files#setLastModifiedTime(java.nio.file.Path, java.nio.file.attribute.FileTime)}
+	 *             {@link java.nio.file.Files#setLastModifiedTime(java.nio.file.Path, java.nio.file.attribute.FileTime)}
 	 *             instead
 	 */
 	@Deprecated
@@ -117,10 +136,13 @@
 	}
 
 	/**
+	 * Whether this file exists
+	 *
 	 * @param path
+	 *            a {@link java.io.File}.
 	 * @return {@code true} if the given path exists
 	 * @deprecated Use
-	 *             {@link Files#exists(java.nio.file.Path, java.nio.file.LinkOption...)}
+	 *             {@link java.nio.file.Files#exists(java.nio.file.Path, java.nio.file.LinkOption...)}
 	 *             instead
 	 */
 	@Deprecated
@@ -129,10 +151,14 @@
 	}
 
 	/**
+	 * Whether this file is hidden
+	 *
 	 * @param path
+	 *            a {@link java.io.File}.
 	 * @return {@code true} if the given path is hidden
-	 * @throws IOException
-	 * @deprecated Use {@link Files#isHidden(java.nio.file.Path)} instead
+	 * @throws java.io.IOException
+	 * @deprecated Use {@link java.nio.file.Files#isHidden(java.nio.file.Path)}
+	 *             instead
 	 */
 	@Deprecated
 	public static boolean isHidden(File path) throws IOException {
@@ -140,10 +166,16 @@
 	}
 
 	/**
+	 * Set this file hidden
+	 *
 	 * @param path
+	 *            a {@link java.io.File}.
 	 * @param hidden
-	 * @throws IOException
-	 * @deprecated Use {@link FileUtils#setHidden(File,boolean)} instead
+	 *            a boolean.
+	 * @throws java.io.IOException
+	 * @deprecated Use
+	 *             {@link org.eclipse.jgit.util.FileUtils#setHidden(File,boolean)}
+	 *             instead
 	 */
 	@Deprecated
 	public static void setHidden(File path, boolean hidden) throws IOException {
@@ -151,10 +183,14 @@
 	}
 
 	/**
+	 * Get file length
+	 *
 	 * @param path
+	 *            a {@link java.io.File}.
 	 * @return length of the given file
-	 * @throws IOException
-	 * @deprecated Use {@link FileUtils#getLength(File)} instead
+	 * @throws java.io.IOException
+	 * @deprecated Use {@link org.eclipse.jgit.util.FileUtils#getLength(File)}
+	 *             instead
 	 */
 	@Deprecated
 	public static long getLength(File path) throws IOException {
@@ -162,10 +198,13 @@
 	}
 
 	/**
+	 * Whether the given File is a directory
+	 *
 	 * @param path
-	 * @return {@code true} if the given file a directory
+	 *            a {@link java.io.File} object.
+	 * @return {@code true} if the given file is a directory
 	 * @deprecated Use
-	 *             {@link Files#isDirectory(java.nio.file.Path, java.nio.file.LinkOption...)}
+	 *             {@link java.nio.file.Files#isDirectory(java.nio.file.Path, java.nio.file.LinkOption...)}
 	 *             instead
 	 */
 	@Deprecated
@@ -174,10 +213,13 @@
 	}
 
 	/**
+	 * Whether the given File is a file
+	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return {@code true} if the given file is a file
 	 * @deprecated Use
-	 *             {@link Files#isRegularFile(java.nio.file.Path, java.nio.file.LinkOption...)}
+	 *             {@link java.nio.file.Files#isRegularFile(java.nio.file.Path, java.nio.file.LinkOption...)}
 	 *             instead
 	 */
 	@Deprecated
@@ -186,9 +228,13 @@
 	}
 
 	/**
+	 * Whether the given file can be executed
+	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return {@code true} if the given file can be executed
-	 * @deprecated Use {@link FileUtils#canExecute(File)} instead
+	 * @deprecated Use {@link org.eclipse.jgit.util.FileUtils#canExecute(File)}
+	 *             instead
 	 */
 	@Deprecated
 	public static boolean canExecute(File path) {
@@ -196,9 +242,12 @@
 	}
 
 	/**
+	 * Delete the given file
+	 *
 	 * @param path
-	 * @throws IOException
-	 * @deprecated use {@link FileUtils#delete(File)}
+	 *            a {@link java.io.File} object.
+	 * @throws java.io.IOException
+	 * @deprecated use {@link org.eclipse.jgit.util.FileUtils#delete(File)}
 	 */
 	@Deprecated
 	public static void delete(File path) throws IOException {
@@ -206,10 +255,16 @@
 	}
 
 	/**
+	 * Get file system attributes for the given file
+	 *
 	 * @param fs
+	 *            a {@link org.eclipse.jgit.util.FS} object.
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return file system attributes for the given file
-	 * @deprecated Use {@link FileUtils#getFileAttributesPosix(FS,File)} instead
+	 * @deprecated Use
+	 *             {@link org.eclipse.jgit.util.FileUtils#getFileAttributesPosix(FS,File)}
+	 *             instead
 	 */
 	@Deprecated
 	public static Attributes getFileAttributesPosix(FS fs, File path) {
@@ -217,9 +272,14 @@
 	}
 
 	/**
+	 * NFC normalize File (on Mac), otherwise do nothing
+	 *
 	 * @param file
-	 * @return on Mac: NFC normalized {@link File}, otherwise the passed file
-	 * @deprecated Use {@link FileUtils#normalize(File)} instead
+	 *            a {@link java.io.File}.
+	 * @return on Mac: NFC normalized {@link java.io.File}, otherwise the passed
+	 *         file
+	 * @deprecated Use {@link org.eclipse.jgit.util.FileUtils#normalize(File)}
+	 *             instead
 	 */
 	@Deprecated
 	public static File normalize(File file) {
@@ -227,9 +287,13 @@
 	}
 
 	/**
+	 * NFC normalize file name (on Mac), otherwise do nothing
+	 *
 	 * @param name
+	 *            a {@link java.lang.String} object.
 	 * @return on Mac: NFC normalized form of given name
-	 * @deprecated Use {@link FileUtils#normalize(String)} instead
+	 * @deprecated Use {@link org.eclipse.jgit.util.FileUtils#normalize(String)}
+	 *             instead
 	 */
 	@Deprecated
 	public static String normalize(String name) {
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 76dbb87..08c278e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
@@ -47,10 +47,10 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.channels.FileLock;
 import java.nio.file.AtomicMoveNotSupportedException;
 import java.nio.file.CopyOption;
 import java.nio.file.Files;
+import java.nio.file.InvalidPathException;
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
@@ -112,15 +112,34 @@
 	public static final int EMPTY_DIRECTORIES_ONLY = 16;
 
 	/**
+	 * Safe conversion from {@link java.io.File} to {@link java.nio.file.Path}.
+	 *
+	 * @param f
+	 *            {@code File} to be converted to {@code Path}
+	 * @return the path represented by the file
+	 * @throws java.io.IOException
+	 *             in case the path represented by the file is not valid (
+	 *             {@link java.nio.file.InvalidPathException})
+	 * @since 4.10
+	 */
+	public static Path toPath(final File f) throws IOException {
+		try {
+			return f.toPath();
+		} catch (InvalidPathException ex) {
+			throw new IOException(ex);
+		}
+	}
+
+	/**
 	 * Delete file or empty folder
 	 *
 	 * @param f
 	 *            {@code File} to be deleted
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if deletion of {@code f} fails. This may occur if {@code f}
 	 *             didn't exist when the method was called. This can therefore
-	 *             cause IOExceptions during race conditions when multiple
-	 *             concurrent threads all try to delete the same file.
+	 *             cause java.io.IOExceptions during race conditions when
+	 *             multiple concurrent threads all try to delete the same file.
 	 */
 	public static void delete(final File f) throws IOException {
 		delete(f, NONE);
@@ -136,12 +155,12 @@
 	 *            a subtree, {@code RETRY} to retry when deletion failed.
 	 *            Retrying may help if the underlying file system doesn't allow
 	 *            deletion of files being read by another thread.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if deletion of {@code f} fails. This may occur if {@code f}
 	 *             didn't exist when the method was called. This can therefore
-	 *             cause IOExceptions during race conditions when multiple
-	 *             concurrent threads all try to delete the same file. This
-	 *             exception is not thrown when IGNORE_ERRORS is set.
+	 *             cause java.io.IOExceptions during race conditions when
+	 *             multiple concurrent threads all try to delete the same file.
+	 *             This exception is not thrown when IGNORE_ERRORS is set.
 	 */
 	public static void delete(final File f, int options) throws IOException {
 		FS fs = FS.DETECTED;
@@ -218,7 +237,7 @@
 	 *            the old {@code File}
 	 * @param dst
 	 *            the new {@code File}
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the rename has failed
 	 * @since 3.0
 	 */
@@ -228,18 +247,20 @@
 	}
 
 	/**
-	 * Rename a file or folder using the passed {@link CopyOption}s. If the
-	 * rename fails and if we are running on a filesystem where it makes sense
-	 * to repeat a failing rename then repeat the rename operation up to 9 times
-	 * with 100ms sleep time between two calls. Furthermore if the destination
-	 * exists and is a directory hierarchy with only directories in it, the
-	 * whole directory hierarchy will be deleted. If the target represents a
-	 * non-empty directory structure, empty subdirectories within that structure
-	 * may or may not be deleted even if the method fails. Furthermore if the
-	 * destination exists and is a file then the file will be replaced if
-	 * {@link StandardCopyOption#REPLACE_EXISTING} has been set. If
-	 * {@link StandardCopyOption#ATOMIC_MOVE} has been set the rename will be
-	 * done atomically or fail with an {@link AtomicMoveNotSupportedException}
+	 * Rename a file or folder using the passed
+	 * {@link java.nio.file.CopyOption}s. If the rename fails and if we are
+	 * running on a filesystem where it makes sense to repeat a failing rename
+	 * then repeat the rename operation up to 9 times with 100ms sleep time
+	 * between two calls. Furthermore if the destination exists and is a
+	 * directory hierarchy with only directories in it, the whole directory
+	 * hierarchy will be deleted. If the target represents a non-empty directory
+	 * structure, empty subdirectories within that structure may or may not be
+	 * deleted even if the method fails. Furthermore if the destination exists
+	 * and is a file then the file will be replaced if
+	 * {@link java.nio.file.StandardCopyOption#REPLACE_EXISTING} has been set.
+	 * If {@link java.nio.file.StandardCopyOption#ATOMIC_MOVE} has been set the
+	 * rename will be done atomically or fail with an
+	 * {@link java.nio.file.AtomicMoveNotSupportedException}
 	 *
 	 * @param src
 	 *            the old file
@@ -247,10 +268,10 @@
 	 *            the new file
 	 * @param options
 	 *            options to pass to
-	 *            {@link Files#move(java.nio.file.Path, java.nio.file.Path, CopyOption...)}
-	 * @throws AtomicMoveNotSupportedException
+	 *            {@link java.nio.file.Files#move(java.nio.file.Path, java.nio.file.Path, CopyOption...)}
+	 * @throws java.nio.file.AtomicMoveNotSupportedException
 	 *             if file cannot be moved as an atomic file system operation
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.1
 	 */
 	public static void rename(final File src, final File dst,
@@ -259,7 +280,7 @@
 		int attempts = FS.DETECTED.retryFailedLockFileCommit() ? 10 : 1;
 		while (--attempts >= 0) {
 			try {
-				Files.move(src.toPath(), dst.toPath(), options);
+				Files.move(toPath(src), toPath(dst), options);
 				return;
 			} catch (AtomicMoveNotSupportedException e) {
 				throw e;
@@ -269,7 +290,7 @@
 						delete(dst, EMPTY_DIRECTORIES_ONLY | RECURSIVE);
 					}
 					// On *nix there is no try, you do or do not
-					Files.move(src.toPath(), dst.toPath(), options);
+					Files.move(toPath(src), toPath(dst), options);
 					return;
 				} catch (IOException e2) {
 					// ignore and continue retry
@@ -293,11 +314,12 @@
 	 *
 	 * @param d
 	 *            directory to be created
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if creation of {@code d} fails. This may occur if {@code d}
 	 *             did exist when the method was called. This can therefore
-	 *             cause IOExceptions during race conditions when multiple
-	 *             concurrent threads all try to create the same directory.
+	 *             cause java.io.IOExceptions during race conditions when
+	 *             multiple concurrent threads all try to create the same
+	 *             directory.
 	 */
 	public static void mkdir(final File d)
 			throws IOException {
@@ -312,11 +334,12 @@
 	 * @param skipExisting
 	 *            if {@code true} skip creation of the given directory if it
 	 *            already exists in the file system
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if creation of {@code d} fails. This may occur if {@code d}
 	 *             did exist when the method was called. This can therefore
-	 *             cause IOExceptions during race conditions when multiple
-	 *             concurrent threads all try to create the same directory.
+	 *             cause java.io.IOExceptions during race conditions when
+	 *             multiple concurrent threads all try to create the same
+	 *             directory.
 	 */
 	public static void mkdir(final File d, boolean skipExisting)
 			throws IOException {
@@ -336,11 +359,12 @@
 	 *
 	 * @param d
 	 *            directory to be created
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if creation of {@code d} fails. This may occur if {@code d}
 	 *             did exist when the method was called. This can therefore
-	 *             cause IOExceptions during race conditions when multiple
-	 *             concurrent threads all try to create the same directory.
+	 *             cause java.io.IOExceptions during race conditions when
+	 *             multiple concurrent threads all try to create the same
+	 *             directory.
 	 */
 	public static void mkdirs(final File d) throws IOException {
 		mkdirs(d, false);
@@ -357,11 +381,12 @@
 	 * @param skipExisting
 	 *            if {@code true} skip creation of the given directory if it
 	 *            already exists in the file system
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if creation of {@code d} fails. This may occur if {@code d}
 	 *             did exist when the method was called. This can therefore
-	 *             cause IOExceptions during race conditions when multiple
-	 *             concurrent threads all try to create the same directory.
+	 *             cause java.io.IOExceptions during race conditions when
+	 *             multiple concurrent threads all try to create the same
+	 *             directory.
 	 */
 	public static void mkdirs(final File d, boolean skipExisting)
 			throws IOException {
@@ -381,12 +406,12 @@
 	 * filesystem activities that might affect the file.
 	 * <p>
 	 * Note: this method should not be used for file-locking, as the resulting
-	 * protocol cannot be made to work reliably. The {@link FileLock} facility
-	 * should be used instead.
+	 * protocol cannot be made to work reliably. The
+	 * {@link java.nio.channels.FileLock} facility should be used instead.
 	 *
 	 * @param f
 	 *            the file to be created
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             if the named file already exists or if an I/O error occurred
 	 */
 	public static void createNewFile(File f) throws IOException {
@@ -403,12 +428,12 @@
 	 * @param target
 	 *            the target of the symbolic link
 	 * @return the path to the symbolic link
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.2
 	 */
 	public static Path createSymLink(File path, String target)
 			throws IOException {
-		Path nioPath = path.toPath();
+		Path nioPath = toPath(path);
 		if (Files.exists(nioPath, LinkOption.NOFOLLOW_LINKS)) {
 			BasicFileAttributes attrs = Files.readAttributes(nioPath,
 					BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
@@ -421,18 +446,21 @@
 		if (SystemReader.getInstance().isWindows()) {
 			target = target.replace('/', '\\');
 		}
-		Path nioTarget = new File(target).toPath();
+		Path nioTarget = toPath(new File(target));
 		return Files.createSymbolicLink(nioPath, nioTarget);
 	}
 
 	/**
+	 * Read target path of the symlink.
+	 *
 	 * @param path
+	 *            a {@link java.io.File} object.
 	 * @return target path of the symlink, or null if it is not a symbolic link
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.0
 	 */
 	public static String readSymLink(File path) throws IOException {
-		Path nioPath = path.toPath();
+		Path nioPath = toPath(path);
 		Path target = Files.readSymbolicLink(nioPath);
 		String targetString = target.toString();
 		if (SystemReader.getInstance().isWindows()) {
@@ -447,11 +475,13 @@
 	 * Create a temporary directory.
 	 *
 	 * @param prefix
+	 *            prefix string
 	 * @param suffix
+	 *            suffix string
 	 * @param dir
 	 *            The parent dir, can be null to use system default temp dir.
 	 * @return the temp dir created.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 3.4
 	 */
 	public static File createTempDir(String prefix, String suffix, File dir)
@@ -470,18 +500,19 @@
 
 
 	/**
+	 * Relativize a path
+	 *
 	 * @deprecated Use the more-clearly-named
-	 *             {@link FileUtils#relativizeNativePath(String, String)}
+	 *             {@link org.eclipse.jgit.util.FileUtils#relativizeNativePath(String, String)}
 	 *             instead, or directly call
-	 *             {@link FileUtils#relativizePath(String, String, String, boolean)}
+	 *             {@link org.eclipse.jgit.util.FileUtils#relativizePath(String, String, String, boolean)}
 	 *
 	 *             Expresses <code>other</code> as a relative file path from
 	 *             <code>base</code>. File-separator and case sensitivity are
 	 *             based on the current file system.
 	 *
 	 *             See also
-	 *             {@link FileUtils#relativizePath(String, String, String, boolean)}.
-	 *
+	 *             {@link org.eclipse.jgit.util.FileUtils#relativizePath(String, String, String, boolean)}.
 	 * @param base
 	 *            Base path
 	 * @param other
@@ -495,15 +526,17 @@
 	}
 
 	/**
-	 * Expresses <code>other</code> as a relative file path from <code>base</code>.
-	 * File-separator and case sensitivity are based on the current file system.
+	 * Expresses <code>other</code> as a relative file path from
+	 * <code>base</code>. File-separator and case sensitivity are based on the
+	 * current file system.
 	 *
-	 * See also {@link FileUtils#relativizePath(String, String, String, boolean)}.
+	 * See also
+	 * {@link org.eclipse.jgit.util.FileUtils#relativizePath(String, String, String, boolean)}.
 	 *
 	 * @param base
 	 *            Base path
 	 * @param other
-	 *             Destination path
+	 *            Destination path
 	 * @return Relative path from <code>base</code> to <code>other</code>
 	 * @since 4.8
 	 */
@@ -512,15 +545,17 @@
 	}
 
 	/**
-	 * Expresses <code>other</code> as a relative file path from <code>base</code>.
-	 * File-separator and case sensitivity are based on Git's internal representation of files (which matches Unix).
+	 * Expresses <code>other</code> as a relative file path from
+	 * <code>base</code>. File-separator and case sensitivity are based on Git's
+	 * internal representation of files (which matches Unix).
 	 *
-	 * See also {@link FileUtils#relativizePath(String, String, String, boolean)}.
+	 * See also
+	 * {@link org.eclipse.jgit.util.FileUtils#relativizePath(String, String, String, boolean)}.
 	 *
 	 * @param base
 	 *            Base path
 	 * @param other
-	 *             Destination path
+	 *            Destination path
 	 * @return Relative path from <code>base</code> to <code>other</code>
 	 * @since 4.8
 	 */
@@ -540,7 +575,6 @@
 	 * </pre>
 	 *
 	 * This will return "..\\another_project\\pom.xml".
-	 * </p>
 	 *
 	 * <p>
 	 * <b>Note</b> that this will return the empty String if <code>base</code>
@@ -599,6 +633,7 @@
 	 * Determine if an IOException is a Stale NFS File Handle
 	 *
 	 * @param ioe
+	 *            an {@link java.io.IOException} object.
 	 * @return a boolean true if the IOException is a Stale NFS FIle Handle
 	 * @since 4.1
 	 */
@@ -614,6 +649,7 @@
 	 * File Handle
 	 *
 	 * @param throwable
+	 *            a {@link java.lang.Throwable} object.
 	 * @return a boolean true if the throwable or a cause in its causal chain is
 	 *         a Stale NFS File Handle
 	 * @since 4.7
@@ -644,7 +680,7 @@
 	 * @throws IOException
 	 */
 	static long lastModified(File file) throws IOException {
-		return Files.getLastModifiedTime(file.toPath(), LinkOption.NOFOLLOW_LINKS)
+		return Files.getLastModifiedTime(toPath(file), LinkOption.NOFOLLOW_LINKS)
 				.toMillis();
 	}
 
@@ -654,7 +690,7 @@
 	 * @throws IOException
 	 */
 	static void setLastModified(File file, long time) throws IOException {
-		Files.setLastModifiedTime(file.toPath(), FileTime.fromMillis(time));
+		Files.setLastModifiedTime(toPath(file), FileTime.fromMillis(time));
 	}
 
 	/**
@@ -672,28 +708,35 @@
 	 * @throws IOException
 	 */
 	static boolean isHidden(File file) throws IOException {
-		return Files.isHidden(file.toPath());
+		return Files.isHidden(toPath(file));
 	}
 
 	/**
+	 * Set a file hidden (on Windows)
+	 *
 	 * @param file
+	 *            a {@link java.io.File} object.
 	 * @param hidden
-	 * @throws IOException
+	 *            a boolean.
+	 * @throws java.io.IOException
 	 * @since 4.1
 	 */
 	public static void setHidden(File file, boolean hidden) throws IOException {
-		Files.setAttribute(file.toPath(), "dos:hidden", Boolean.valueOf(hidden), //$NON-NLS-1$
+		Files.setAttribute(toPath(file), "dos:hidden", Boolean.valueOf(hidden), //$NON-NLS-1$
 				LinkOption.NOFOLLOW_LINKS);
 	}
 
 	/**
+	 * Get file length
+	 *
 	 * @param file
+	 *            a {@link java.io.File}.
 	 * @return length of the given file
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 * @since 4.1
 	 */
 	public static long getLength(File file) throws IOException {
-		Path nioPath = file.toPath();
+		Path nioPath = toPath(file);
 		if (Files.isSymbolicLink(nioPath))
 			return Files.readSymbolicLink(nioPath).toString()
 					.getBytes(Constants.CHARSET).length;
@@ -719,8 +762,11 @@
 	}
 
 	/**
+	 * Whether the given file can be executed.
+	 *
 	 * @param file
-	 * @return {@code true} if the given file can be executed
+	 *            a {@link java.io.File} object.
+	 * @return {@code true} if the given file can be executed.
 	 * @since 4.1
 	 */
 	public static boolean canExecute(File file) {
@@ -737,7 +783,7 @@
 	 */
 	static Attributes getFileAttributesBasic(FS fs, File file) {
 		try {
-			Path nioPath = file.toPath();
+			Path nioPath = toPath(file);
 			BasicFileAttributes readAttributes = nioPath
 					.getFileSystem()
 					.provider()
@@ -762,14 +808,18 @@
 	}
 
 	/**
+	 * Get file system attributes for the given file.
+	 *
 	 * @param fs
+	 *            a {@link org.eclipse.jgit.util.FS} object.
 	 * @param file
-	 * @return file system attributes for the given file
+	 *            a {@link java.io.File}.
+	 * @return file system attributes for the given file.
 	 * @since 4.1
 	 */
 	public static Attributes getFileAttributesPosix(FS fs, File file) {
 		try {
-			Path nioPath = file.toPath();
+			Path nioPath = toPath(file);
 			PosixFileAttributes readAttributes = nioPath
 					.getFileSystem()
 					.provider()
@@ -795,8 +845,12 @@
 	}
 
 	/**
+	 * NFC normalize a file (on Mac), otherwise do nothing
+	 *
 	 * @param file
-	 * @return on Mac: NFC normalized {@link File}, otherwise the passed file
+	 *            a {@link java.io.File}.
+	 * @return on Mac: NFC normalized {@link java.io.File}, otherwise the passed
+	 *         file
 	 * @since 4.1
 	 */
 	public static File normalize(File file) {
@@ -811,7 +865,10 @@
 	}
 
 	/**
+	 * On Mac: get NFC normalized form of given name, otherwise the given name.
+	 *
 	 * @param name
+	 *            a {@link java.lang.String} object.
 	 * @return on Mac: NFC normalized form of given name
 	 * @since 4.1
 	 */
@@ -825,16 +882,16 @@
 	}
 
 	/**
-	 * Best-effort variation of {@link File#getCanonicalFile()} returning the
-	 * input file if the file cannot be canonicalized instead of throwing
-	 * {@link IOException}.
+	 * Best-effort variation of {@link java.io.File#getCanonicalFile()}
+	 * returning the input file if the file cannot be canonicalized instead of
+	 * throwing {@link java.io.IOException}.
 	 *
 	 * @param file
 	 *            to be canonicalized; may be {@code null}
 	 * @return canonicalized file, or the unchanged input file if
 	 *         canonicalization failed or if {@code file == null}
-	 * @throws SecurityException
-	 *             if {@link File#getCanonicalFile()} throws one
+	 * @throws java.lang.SecurityException
+	 *             if {@link java.io.File#getCanonicalFile()} throws one
 	 * @since 4.2
 	 */
 	public static File canonicalize(File file) {
@@ -848,4 +905,19 @@
 		}
 	}
 
+	/**
+	 * Convert a path to String, replacing separators as necessary.
+	 *
+	 * @param file
+	 *            a {@link java.io.File}.
+	 * @return file's path as a String
+	 * @since 4.10
+	 */
+	public static String pathToString(File file) {
+		final String path = file.getPath();
+		if (SystemReader.getInstance().isWindows()) {
+			return path.replace('\\', '/');
+		}
+		return path;
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java
index d7ab5f8..e461902 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java
@@ -54,7 +54,8 @@
  * A utility for formatting dates according to the Git log.date formats plus
  * extensions.
  * <p>
- * The enum {@link Format} defines the available types.
+ * The enum {@link org.eclipse.jgit.util.GitDateFormatter.Format} defines the
+ * available types.
  */
 public class GitDateFormatter {
 
@@ -119,6 +120,8 @@
 	 * Create a new Git oriented date formatter
 	 *
 	 * @param format
+	 *            a {@link org.eclipse.jgit.util.GitDateFormatter.Format}
+	 *            object.
 	 */
 	public GitDateFormatter(Format format) {
 		this.format = format;
@@ -159,6 +162,7 @@
 	 * specification.
 	 *
 	 * @param ident
+	 *            a {@link org.eclipse.jgit.lib.PersonIdent} object.
 	 * @return formatted version of date, time and time zone
 	 */
 	@SuppressWarnings("boxing")
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateParser.java
index da78008..a339b9a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateParser.java
@@ -55,7 +55,7 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * Parses strings with time and date specifications into {@link Date}.
+ * Parses strings with time and date specifications into {@link java.util.Date}.
  *
  * When git needs to parse strings specified by the user this parser can be
  * used. One example is the parsing of the config parameter gc.pruneexpire. The
@@ -134,16 +134,17 @@
 	}
 
 	/**
-	 * Parses a string into a {@link Date} using the default locale. Since this
-	 * parser also supports relative formats (e.g. "yesterday") the caller can
-	 * specify the reference date. These types of strings can be parsed:
+	 * Parses a string into a {@link java.util.Date} using the default locale.
+	 * Since this parser also supports relative formats (e.g. "yesterday") the
+	 * caller can specify the reference date. These types of strings can be
+	 * parsed:
 	 * <ul>
 	 * <li>"never"</li>
 	 * <li>"now"</li>
 	 * <li>"yesterday"</li>
 	 * <li>"(x) years|months|weeks|days|hours|minutes|seconds ago"<br>
-	 * Multiple specs can be combined like in "2 weeks 3 days ago". Instead of
-	 * ' ' one can use '.' to seperate the words</li>
+	 * Multiple specs can be combined like in "2 weeks 3 days ago". Instead of '
+	 * ' one can use '.' to seperate the words</li>
 	 * <li>"yyyy-MM-dd HH:mm:ss Z" (ISO)</li>
 	 * <li>"EEE, dd MMM yyyy HH:mm:ss Z" (RFC)</li>
 	 * <li>"yyyy-MM-dd"</li>
@@ -161,11 +162,12 @@
 	 *            formats. E.g. if baseDate is "25.8.2012" then parsing of the
 	 *            string "1 week ago" would result in a date corresponding to
 	 *            "18.8.2012". This is used when a JGit command calls this
-	 *            parser often but wants a consistent starting point for calls.<br>
+	 *            parser often but wants a consistent starting point for
+	 *            calls.<br>
 	 *            If set to <code>null</code> then the current time will be used
 	 *            instead.
-	 * @return the parsed {@link Date}
-	 * @throws ParseException
+	 * @return the parsed {@link java.util.Date}
+	 * @throws java.text.ParseException
 	 *             if the given dateStr was not recognized
 	 */
 	public static Date parse(String dateStr, Calendar now)
@@ -174,16 +176,17 @@
 	}
 
 	/**
-	 * Parses a string into a {@link Date} using the given locale. Since this
-	 * parser also supports relative formats (e.g. "yesterday") the caller can
-	 * specify the reference date. These types of strings can be parsed:
+	 * Parses a string into a {@link java.util.Date} using the given locale.
+	 * Since this parser also supports relative formats (e.g. "yesterday") the
+	 * caller can specify the reference date. These types of strings can be
+	 * parsed:
 	 * <ul>
 	 * <li>"never"</li>
 	 * <li>"now"</li>
 	 * <li>"yesterday"</li>
 	 * <li>"(x) years|months|weeks|days|hours|minutes|seconds ago"<br>
-	 * Multiple specs can be combined like in "2 weeks 3 days ago". Instead of
-	 * ' ' one can use '.' to seperate the words</li>
+	 * Multiple specs can be combined like in "2 weeks 3 days ago". Instead of '
+	 * ' one can use '.' to seperate the words</li>
 	 * <li>"yyyy-MM-dd HH:mm:ss Z" (ISO)</li>
 	 * <li>"EEE, dd MMM yyyy HH:mm:ss Z" (RFC)</li>
 	 * <li>"yyyy-MM-dd"</li>
@@ -201,13 +204,14 @@
 	 *            formats. E.g. if baseDate is "25.8.2012" then parsing of the
 	 *            string "1 week ago" would result in a date corresponding to
 	 *            "18.8.2012". This is used when a JGit command calls this
-	 *            parser often but wants a consistent starting point for calls.<br>
+	 *            parser often but wants a consistent starting point for
+	 *            calls.<br>
 	 *            If set to <code>null</code> then the current time will be used
 	 *            instead.
 	 * @param locale
 	 *            locale to be used to parse the date string
-	 * @return the parsed {@link Date}
-	 * @throws ParseException
+	 * @return the parsed {@link java.util.Date}
+	 * @throws java.text.ParseException
 	 *             if the given dateStr was not recognized
 	 * @since 3.2
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/Holder.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/Holder.java
index 3563e1b..b4cc6ca 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/Holder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/Holder.java
@@ -45,14 +45,15 @@
  * Holder of an object.
  *
  * @param <T>
- *            the type of value held by this {@link Holder}
- *
+ *            the type of value held by this {@link org.eclipse.jgit.util.Holder}
  * @since 4.3
  */
 public class Holder<T> {
 	private T value;
 
 	/**
+	 * <p>Constructor for Holder.</p>
+	 *
 	 * @param value
 	 *            is the initial value that is {@link #set(Object)}
 	 */
@@ -61,15 +62,20 @@
 	}
 
 	/**
-	 * @return the value held by this {@link Holder}
+	 * Get the value held by this {@link org.eclipse.jgit.util.Holder}
+	 *
+	 * @return the value held by this {@link org.eclipse.jgit.util.Holder}
 	 */
 	public T get() {
 		return value;
 	}
 
 	/**
+	 * Set a new value held by this {@link org.eclipse.jgit.util.Holder}
+	 *
 	 * @param value
-	 *            to be set as new value held by this {@link Holder}
+	 *            to be set as new value held by this
+	 *            {@link org.eclipse.jgit.util.Holder}
 	 */
 	public void set(T value) {
 		this.value = value;
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 13e61a7..a5a858f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java
@@ -65,7 +65,9 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.transport.http.HttpConnection;
 
-/** Extra utilities to support usage of HTTP. */
+/**
+ * Extra utilities to support usage of HTTP.
+ */
 public class HttpSupport {
 	/** The {@code GET} HTTP method. */
 	public static final String METHOD_GET = "GET"; //$NON-NLS-1$
@@ -192,8 +194,9 @@
 	 * @param c
 	 *            connection the code should be obtained from.
 	 * @return r HTTP status code, usually 200 to indicate success. See
-	 *         {@link HttpConnection} for other defined constants.
-	 * @throws IOException
+	 *         {@link org.eclipse.jgit.transport.http.HttpConnection} for other
+	 *         defined constants.
+	 * @throws java.io.IOException
 	 *             communications error prevented obtaining the response code.
 	 * @since 3.3
 	 */
@@ -220,8 +223,9 @@
 	 * @param c
 	 *            connection the code should be obtained from.
 	 * @return r HTTP status code, usually 200 to indicate success. See
-	 *         {@link HttpConnection} for other defined constants.
-	 * @throws IOException
+	 *         {@link org.eclipse.jgit.transport.http.HttpConnection} for other
+	 *         defined constants.
+	 * @throws java.io.IOException
 	 *             communications error prevented obtaining the response code.
 	 */
 	public static int response(final java.net.HttpURLConnection c)
@@ -248,7 +252,7 @@
 	 * @param headerName
 	 *            the header name
 	 * @return the header value
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             communications error prevented obtaining the header.
 	 * @since 4.7
 	 */
@@ -265,7 +269,7 @@
 	 * @param u
 	 *            location of the server caller wants to talk to.
 	 * @return proxy to communicate with the supplied URL.
-	 * @throws ConnectException
+	 * @throws java.net.ConnectException
 	 *             the proxy could not be computed as the supplied URL could not
 	 *             be read. This failure should never occur.
 	 */
@@ -285,7 +289,9 @@
 	 * Disable SSL and hostname verification for given HTTP connection
 	 *
 	 * @param conn
-	 * @throws IOException
+	 *            a {@link org.eclipse.jgit.transport.http.HttpConnection}
+	 *            object.
+	 * @throws java.io.IOException
 	 * @since 4.3
 	 */
 	public static void disableSslVerify(HttpConnection conn)
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java
index 6cff76c..f39d217 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java
@@ -71,9 +71,9 @@
 	 * @param path
 	 *            location of the file to read.
 	 * @return complete contents of the requested local file.
-	 * @throws FileNotFoundException
+	 * @throws java.io.FileNotFoundException
 	 *             the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file exists, but its contents cannot be read.
 	 */
 	public static final byte[] readFully(final File path)
@@ -91,9 +91,9 @@
 	 *            only the first limit number of bytes are returned
 	 * @return complete contents of the requested local file. If the contents
 	 *         exceeds the limit, then only the limit is returned.
-	 * @throws FileNotFoundException
+	 * @throws java.io.FileNotFoundException
 	 *             the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file exists, but its contents cannot be read.
 	 */
 	public static final byte[] readSome(final File path, final int limit)
@@ -131,9 +131,9 @@
 	 *            maximum number of bytes to read, if the file is larger than
 	 *            this limit an IOException is thrown.
 	 * @return complete contents of the requested local file.
-	 * @throws FileNotFoundException
+	 * @throws java.io.FileNotFoundException
 	 *             the file does not exist.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the file exists, but its contents cannot be read.
 	 */
 	public static final byte[] readFully(final File path, final int max)
@@ -199,7 +199,7 @@
 	 *         on obtaining the underlying array for efficient data access. If
 	 *         {@code sizeHint} was too large, the array may be over-allocated,
 	 *         resulting in {@code limit() < array().length}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the stream.
 	 */
 	public static ByteBuffer readWholeStream(InputStream in, int sizeHint)
@@ -238,7 +238,7 @@
 	 *            number of bytes that must be read.
 	 * @throws EOFException
 	 *             the stream ended before dst was fully populated.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the stream.
 	 */
 	public static void readFully(final InputStream fd, final byte[] dst,
@@ -264,7 +264,7 @@
 	 * @param len
 	 *            number of bytes that should be read.
 	 * @return number of bytes actually read.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the channel.
 	 */
 	public static int read(ReadableByteChannel channel, byte[] dst, int off,
@@ -293,7 +293,7 @@
 	 * @param off
 	 *            position within the buffer to start writing to.
 	 * @return number of bytes in buffer or stream, whichever is shortest
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the stream.
 	 */
 	public static int readFully(InputStream fd, byte[] dst, int off)
@@ -322,7 +322,7 @@
 	 * @throws EOFException
 	 *             the stream ended before the requested number of bytes were
 	 *             skipped.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the stream.
 	 */
 	public static void skipFully(final InputStream fd, long toSkip)
@@ -384,7 +384,7 @@
 	 *            hint for buffer sizing; 0 or negative for default.
 	 * @return the next line from the input, always ending in {@code \n} unless
 	 *         EOF was reached.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             there was an error reading from the stream.
 	 * @since 4.1
 	 */
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 0a3c846..24038f0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
@@ -44,13 +44,17 @@
 
 package org.eclipse.jgit.util;
 
-/** A more efficient List&lt;Integer&gt; using a primitive integer array. */
+/**
+ * A more efficient List&lt;Integer&gt; using a primitive integer array.
+ */
 public class IntList {
 	private int[] entries;
 
 	private int count;
 
-	/** Create an empty list with a default capacity. */
+	/**
+	 * Create an empty list with a default capacity.
+	 */
 	public IntList() {
 		this(10);
 	}
@@ -65,7 +69,11 @@
 		entries = new int[capacity];
 	}
 
-	/** @return number of entries in this list */
+	/**
+	 * Get number of entries in this list.
+	 *
+	 * @return number of entries in this list.
+	 */
 	public int size() {
 		return count;
 	}
@@ -86,10 +94,12 @@
 	}
 
 	/**
+	 * Get the value at the specified index
+	 *
 	 * @param i
 	 *            index to read, must be in the range [0, {@link #size()}).
 	 * @return the number at the specified index
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             the index outside the valid range
 	 */
 	public int get(final int i) {
@@ -98,7 +108,9 @@
 		return entries[i];
 	}
 
-	/** Empty this list */
+	/**
+	 * Empty this list
+	 */
 	public void clear() {
 		count = 0;
 	}
@@ -153,6 +165,7 @@
 		entries = n;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
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 e3639f5..404594c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
@@ -46,13 +46,17 @@
 
 import java.util.Arrays;
 
-/** A more efficient List&lt;Long&gt; using a primitive long array. */
+/**
+ * A more efficient List&lt;Long&gt; using a primitive long array.
+ */
 public class LongList {
 	private long[] entries;
 
 	private int count;
 
-	/** Create an empty list with a default capacity. */
+	/**
+	 * Create an empty list with a default capacity.
+	 */
 	public LongList() {
 		this(10);
 	}
@@ -67,16 +71,22 @@
 		entries = new long[capacity];
 	}
 
-	/** @return number of entries in this list */
+	/**
+	 * Get number of entries in this list
+	 *
+	 * @return number of entries in this list
+	 */
 	public int size() {
 		return count;
 	}
 
 	/**
+	 * Get the value at the specified index
+	 *
 	 * @param i
 	 *            index to read, must be in the range [0, {@link #size()}).
 	 * @return the number at the specified index
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             the index outside the valid range
 	 */
 	public long get(final int i) {
@@ -99,7 +109,9 @@
 		return false;
 	}
 
-	/** Empty this list */
+	/**
+	 * Clear this list
+	 */
 	public void clear() {
 		count = 0;
 	}
@@ -148,7 +160,9 @@
 			add(val);
 	}
 
-	/** Sort the list of longs according to their natural ordering. */
+	/**
+	 * Sort the list of longs according to their natural ordering.
+	 */
 	public void sort() {
 		Arrays.sort(entries, 0, count);
 	}
@@ -159,6 +173,7 @@
 		entries = n;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		final StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/LongMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/LongMap.java
index 7b0b0c7..09eee42 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/LongMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/LongMap.java
@@ -44,7 +44,7 @@
 package org.eclipse.jgit.util;
 
 /**
- * Simple Map<long,Object>.
+ * Simple Map&lt;long, Object&gt;.
  *
  * @param <V>
  *            type of the value instance.
@@ -61,13 +61,17 @@
 	/** Next {@link #size} to trigger a {@link #grow()}. */
 	private int growAt;
 
-	/** Initialize an empty LongMap. */
+	/**
+	 * Initialize an empty LongMap.
+	 */
 	public LongMap() {
 		table = createArray(64);
 		growAt = (int) (table.length * LOAD_FACTOR);
 	}
 
 	/**
+	 * Whether {@code key} is present in the map.
+	 *
 	 * @param key
 	 *            the key to find.
 	 * @return {@code true} if {@code key} is present in the map.
@@ -77,9 +81,11 @@
 	}
 
 	/**
+	 * Get value for this {@code key}
+	 *
 	 * @param key
 	 *            the key to find.
-	 * @return stored value of the key, or {@code null}.
+	 * @return stored value for this key, or {@code null}.
 	 */
 	public V get(long key) {
 		for (Node<V> n = table[index(key)]; n != null; n = n.next) {
@@ -90,6 +96,8 @@
 	}
 
 	/**
+	 * Remove an entry from the map
+	 *
 	 * @param key
 	 *            key to remove from the map.
 	 * @return old value of the key, or {@code null}.
@@ -113,6 +121,8 @@
 	}
 
 	/**
+	 * Put a new entry into the map
+	 *
 	 * @param key
 	 *            key to store {@code value} under.
 	 * @param value
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/MutableInteger.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/MutableInteger.java
index cbe3210..8cee9f9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/MutableInteger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/MutableInteger.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.util;
 
-/** A boxed integer that can be modified. */
+/**
+ * A boxed integer that can be modified.
+ */
 public final class MutableInteger {
 	/** Current value of this boxed value. */
 	public int value;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java
index 471a499..8ad6aa0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java
@@ -43,7 +43,9 @@
 
 package org.eclipse.jgit.util;
 
-/** Conversion utilities for network byte order handling. */
+/**
+ * Conversion utilities for network byte order handling.
+ */
 public final class NB {
 	/**
 	 * Compare a 32 bit unsigned integer stored in a 32 bit signed integer.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java
index 77c9608..9267a32 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java
@@ -86,6 +86,8 @@
 	}
 
 	/**
+	 * <p>Constructor for ProcessResult.</p>
+	 *
 	 * @param exitCode
 	 *            Exit code of the process.
 	 * @param status
@@ -97,6 +99,8 @@
 	}
 
 	/**
+	 * Get exit code of the process.
+	 *
 	 * @return The exit code of the process.
 	 */
 	public int getExitCode() {
@@ -104,6 +108,8 @@
 	}
 
 	/**
+	 * Get the status of the process' execution.
+	 *
 	 * @return The status of the process' execution.
 	 */
 	public Status getStatus() {
@@ -111,6 +117,8 @@
 	}
 
 	/**
+	 * Whether the execution occurred and resulted in an error
+	 *
 	 * @return <code>true</code> if the execution occurred and resulted in a
 	 *         return code different from 0, <code>false</code> otherwise.
 	 * @since 4.0
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/QuotedString.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/QuotedString.java
index 57dfb85..77bc249 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/QuotedString.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/QuotedString.java
@@ -47,7 +47,9 @@
 
 import org.eclipse.jgit.lib.Constants;
 
-/** Utility functions related to quoted string handling. */
+/**
+ * Utility functions related to quoted string handling.
+ */
 public abstract class QuotedString {
 	/** Quoting style that obeys the rules Git applies to file names */
 	public static final GitPathStyle GIT_PATH = new GitPathStyle();
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 e85bd65..23ee9d0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawCharSequence.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawCharSequence.java
@@ -74,21 +74,25 @@
 		endPtr = end;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public char charAt(final int index) {
 		return (char) (buffer[startPtr + index] & 0xff);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int length() {
 		return endPtr - startPtr;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public CharSequence subSequence(final int start, final 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 ad138bb..014c772 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
@@ -66,7 +66,9 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.PersonIdent;
 
-/** Handy utility functions to parse raw object contents. */
+/**
+ * Handy utility functions to parse raw object contents.
+ */
 public final class RawParseUtils {
 	/**
 	 * UTF-8 charset constant.
@@ -306,7 +308,7 @@
 	 * @param p
 	 *            first position within the buffer to parse.
 	 * @return the integer value.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             if the string is not hex formatted.
 	 */
 	public static final int parseHexInt16(final byte[] bs, final int p) {
@@ -336,7 +338,7 @@
 	 * @param p
 	 *            first position within the buffer to parse.
 	 * @return the integer value.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             if the string is not hex formatted.
 	 */
 	public static final int parseHexInt32(final byte[] bs, final int p) {
@@ -377,7 +379,7 @@
 	 * @param p
 	 *            first position within the buffer to parse.
 	 * @return the integer value.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             if the string is not hex formatted.
 	 * @since 4.3
 	 */
@@ -437,7 +439,7 @@
 	 * @param digit
 	 *            hex character to parse.
 	 * @return numeric value, in the range 0-15.
-	 * @throws ArrayIndexOutOfBoundsException
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
 	 *             if the input digit is not a valid hex digit.
 	 */
 	public static final int parseHexInt4(final byte digit) {
@@ -610,7 +612,7 @@
 	 * Index the region between <code>[ptr, end)</code> to find line starts.
 	 * <p>
 	 * The returned list is 1 indexed. Index 0 contains
-	 * {@link Integer#MIN_VALUE} to pad the list out.
+	 * {@link java.lang.Integer#MIN_VALUE} to pad the list out.
 	 * <p>
 	 * Using a 1 indexed list means that line numbers can be directly accessed
 	 * from the list, so <code>list.get(1)</code> (aka get line 1) returns
@@ -619,8 +621,8 @@
 	 * The last element (index <code>map.size()-1</code>) always contains
 	 * <code>end</code>.
 	 * <p>
-	 * If the data contains a '\0' anywhere, the whole region is considered binary
-	 * and a LineMap corresponding to a single line is returned.
+	 * If the data contains a '\0' anywhere, the whole region is considered
+	 * binary and a LineMap corresponding to a single line is returned.
 	 * </p>
 	 *
 	 * @param buf
@@ -1076,7 +1078,7 @@
 	 *            data from.
 	 * @return a string representation of the range <code>[start,end)</code>,
 	 *         after decoding the region through the specified character set.
-	 * @throws CharacterCodingException
+	 * @throws java.nio.charset.CharacterCodingException
 	 *             the input is not in any of the tested character sets.
 	 */
 	public static String decodeNoFallback(final Charset cs,
@@ -1222,13 +1224,15 @@
 	}
 
 	/**
+	 * Get last index of {@code ch} in raw, trimming spaces.
+	 *
 	 * @param raw
 	 *            buffer to scan.
 	 * @param ch
 	 *            character to find.
 	 * @param pos
 	 *            starting position.
-	 * @return last index of ch in raw, trimming spaces.
+	 * @return last index of {@code ch} in raw, trimming spaces.
 	 * @since 4.1
 	 */
 	public static int lastIndexOfTrim(byte[] raw, char ch, int pos) {
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 bc101bd..a8f9bc7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawSubStringPattern.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawSubStringPattern.java
@@ -131,6 +131,7 @@
 		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 ce4b7c7..639c353 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RefList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RefList.java
@@ -71,9 +71,9 @@
 	private static final RefList<Ref> EMPTY = new RefList<>(new Ref[0], 0);
 
 	/**
+	 * Create an empty unmodifiable reference list.
+	 *
 	 * @return an empty unmodifiable reference list.
-	 * @param <T>
-	 *            the type of reference being stored in the collection.
 	 */
 	@SuppressWarnings("unchecked")
 	public static <T extends Ref> RefList<T> emptyList() {
@@ -100,6 +100,7 @@
 		this.cnt = src.cnt;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Iterator<Ref> iterator() {
 		return new Iterator<Ref>() {
@@ -124,18 +125,30 @@
 		};
 	}
 
-	/** @return this cast as an immutable, standard {@link java.util.List}. */
+	/**
+	 * Cast {@code this} as an immutable, standard {@link java.util.List}.
+	 *
+	 * @return {@code this} as an immutable, standard {@link java.util.List}.
+	 */
 	public final List<Ref> asList() {
 		final List<Ref> r = Arrays.asList(list).subList(0, cnt);
 		return Collections.unmodifiableList(r);
 	}
 
-	/** @return number of items in this list. */
+	/**
+	 * Get number of items in this list.
+	 *
+	 * @return number of items in this list.
+	 */
 	public final int size() {
 		return cnt;
 	}
 
-	/** @return true if the size of this list is 0. */
+	/**
+	 * Get if this list is empty.
+	 *
+	 * @return true if the size of this list is 0.
+	 */
 	public final boolean isEmpty() {
 		return cnt == 0;
 	}
@@ -303,6 +316,7 @@
 		return add(idx, ref);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder r = new StringBuilder();
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 510e818..c1aaecf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RefMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RefMap.java
@@ -59,17 +59,19 @@
  * Specialized Map to present a {@code RefDatabase} namespace.
  * <p>
  * Although not declared as a {@link java.util.SortedMap}, iterators from this
- * map's projections always return references in {@link RefComparator} ordering.
- * The map's internal representation is a sorted array of {@link Ref} objects,
+ * map's projections always return references in
+ * {@link org.eclipse.jgit.lib.RefComparator} ordering. The map's internal
+ * representation is a sorted array of {@link org.eclipse.jgit.lib.Ref} objects,
  * which means lookup and replacement is O(log N), while insertion and removal
  * can be as expensive as O(N + log N) while the list expands or contracts.
  * Since this is not a general map implementation, all entries must be keyed by
  * the reference name.
  * <p>
  * This class is really intended as a helper for {@code RefDatabase}, which
- * needs to perform a merge-join of three sorted {@link RefList}s in order to
- * present the unified namespace of the packed-refs file, the loose refs/
- * directory tree, and the resolved form of any symbolic references.
+ * needs to perform a merge-join of three sorted
+ * {@link org.eclipse.jgit.util.RefList}s in order to present the unified
+ * namespace of the packed-refs file, the loose refs/ directory tree, and the
+ * resolved form of any symbolic references.
  */
 public class RefMap extends AbstractMap<String, Ref> {
 	/**
@@ -109,7 +111,9 @@
 
 	private Set<Entry<String, Ref>> entrySet;
 
-	/** Construct an empty map with a small initial capacity. */
+	/**
+	 * Construct an empty map with a small initial capacity.
+	 */
 	public RefMap() {
 		prefix = ""; //$NON-NLS-1$
 		packed = RefList.emptyList();
@@ -145,11 +149,13 @@
 		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);
@@ -161,6 +167,7 @@
 		return ref;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref put(final String keyName, Ref value) {
 		String name = toRefName(keyName);
@@ -189,6 +196,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Ref remove(Object key) {
 		String name = toRefName((String) key);
@@ -212,11 +220,13 @@
 		return res;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public boolean isEmpty() {
 		return entrySet().isEmpty();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Set<Entry<String, Ref>> entrySet() {
 		if (entrySet == null) {
@@ -258,6 +268,7 @@
 		return entrySet;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java
index a5df66e..83c60c6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java
@@ -67,10 +67,14 @@
 	final static long YEAR_IN_MILLIS = 365 * DAY_IN_MILLIS;
 
 	/**
+	 * Get age of given {@link java.util.Date} compared to now formatted in the
+	 * same relative format as returned by {@code git log --relative-date}
+	 *
 	 * @param when
-	 *            {@link Date} to format
-	 * @return age of given {@link Date} compared to now formatted in the same
-	 *         relative format as returned by {@code git log --relative-date}
+	 *            {@link java.util.Date} to format
+	 * @return age of given {@link java.util.Date} compared to now formatted in
+	 *         the same relative format as returned by
+	 *         {@code git log --relative-date}
 	 */
 	@SuppressWarnings("boxing")
 	public static String format(Date when) {
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 2bfeaf1..b4736d3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java
@@ -48,7 +48,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** Miscellaneous string comparison utility methods. */
+/**
+ * Miscellaneous string comparison utility methods.
+ */
 public final class StringUtils {
 	private static final char[] LC;
 
@@ -102,10 +104,12 @@
 	 *
 	 * <p>
 	 * Capitalizes a String changing the first letter to title case as per
-	 * {@link Character#toTitleCase(char)}. No other letters are changed.
+	 * {@link java.lang.Character#toTitleCase(char)}. No other letters are
+	 * changed.
 	 * </p>
-	 *
-	 * A <code>null</code> input String returns <code>null</code>.</p>
+	 * <p>
+	 * A <code>null</code> input String returns <code>null</code>.
+	 * </p>
 	 *
 	 * @param str
 	 *            the String to capitalize, may be null
@@ -156,9 +160,8 @@
 	 *            first string to compare.
 	 * @param b
 	 *            second string to compare.
-	 * @return negative, zero or positive if a sorts before, is equal to, or
-	 *         sorts after b.
 	 * @since 2.0
+	 * @return an int.
 	 */
 	public static int compareIgnoreCase(String a, String b) {
 		for (int i = 0; i < a.length() && i < b.length(); i++) {
@@ -179,9 +182,8 @@
 	 *            first string to compare.
 	 * @param b
 	 *            second string to compare.
-	 * @return negative, zero or positive if a sorts before, is equal to, or
-	 *         sorts after b.
 	 * @since 2.0
+	 * @return an int.
 	 */
 	public static int compareWithCase(String a, String b) {
 		for (int i = 0; i < a.length() && i < b.length(); i++) {
@@ -199,7 +201,7 @@
 	 * @param stringValue
 	 *            the string to parse.
 	 * @return the boolean interpretation of {@code value}.
-	 * @throws IllegalArgumentException
+	 * @throws java.lang.IllegalArgumentException
 	 *             if {@code value} is not recognized as one of the standard
 	 *             boolean names.
 	 */
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 2cd8035..96a796c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java
@@ -151,12 +151,18 @@
 
 	private static SystemReader INSTANCE = DEFAULT;
 
-	/** @return the live instance to read system properties. */
+	/**
+	 * Get time since epoch, with up to millisecond resolution.
+	 *
+	 * @return time since epoch, with up to millisecond resolution.
+	 */
 	public static SystemReader getInstance() {
 		return INSTANCE;
 	}
 
 	/**
+	 * Set the new instance to use when accessing properties.
+	 *
 	 * @param newReader
 	 *            the new instance to use when accessing properties, or null for
 	 *            the default instance.
@@ -201,18 +207,26 @@
 	public abstract String getHostname();
 
 	/**
-	 * @param variable system variable to read
+	 * Get value of the system variable
+	 *
+	 * @param variable
+	 *            system variable to read
 	 * @return value of the system variable
 	 */
 	public abstract String getenv(String variable);
 
 	/**
-	 * @param key of the system property to read
+	 * Get value of the system property
+	 *
+	 * @param key
+	 *            of the system property to read
 	 * @return value of the system property
 	 */
 	public abstract String getProperty(String key);
 
 	/**
+	 * Open the git configuration found in the user home
+	 *
 	 * @param parent
 	 *            a config with values not found directly in the returned config
 	 * @param fs
@@ -223,6 +237,8 @@
 	public abstract FileBasedConfig openUserConfig(Config parent, FS fs);
 
 	/**
+	 * Open the gitonfig configuration found in the system-wide "etc" directory
+	 *
 	 * @param parent
 	 *            a config with values not found directly in the returned
 	 *            config. Null is a reasonable value here.
@@ -235,11 +251,15 @@
 	public abstract FileBasedConfig openSystemConfig(Config parent, FS fs);
 
 	/**
+	 * Get the current system time
+	 *
 	 * @return the current system time
 	 */
 	public abstract long getCurrentTime();
 
 	/**
+	 * Get clock instance preferred by this system.
+	 *
 	 * @return clock instance preferred by this system.
 	 * @since 4.6
 	 */
@@ -248,12 +268,17 @@
 	}
 
 	/**
-	 * @param when TODO
+	 * Get the local time zone
+	 *
+	 * @param when
+	 *            a system timestamp
 	 * @return the local time zone
 	 */
 	public abstract int getTimezone(long when);
 
 	/**
+	 * Get system time zone, possibly mocked for testing
+	 *
 	 * @return system time zone, possibly mocked for testing
 	 * @since 1.2
 	 */
@@ -262,6 +287,8 @@
 	}
 
 	/**
+	 * Get the locale to use
+	 *
 	 * @return the locale to use
 	 * @since 1.2
 	 */
@@ -274,7 +301,7 @@
 	 *
 	 * @param pattern
 	 *            the pattern as defined in
-	 *            {@link SimpleDateFormat#SimpleDateFormat(String)}
+	 *            {@link java.text.SimpleDateFormat#SimpleDateFormat(String)}
 	 * @return the simple date format
 	 * @since 2.0
 	 */
@@ -287,7 +314,7 @@
 	 *
 	 * @param pattern
 	 *            the pattern as defined in
-	 *            {@link SimpleDateFormat#SimpleDateFormat(String)}
+	 *            {@link java.text.SimpleDateFormat#SimpleDateFormat(String)}
 	 * @param locale
 	 *            locale to be used for the {@code SimpleDateFormat}
 	 * @return the simple date format
@@ -302,10 +329,10 @@
 	 *
 	 * @param dateStyle
 	 *            the date style as specified in
-	 *            {@link DateFormat#getDateTimeInstance(int, int)}
+	 *            {@link java.text.DateFormat#getDateTimeInstance(int, int)}
 	 * @param timeStyle
 	 *            the time style as specified in
-	 *            {@link DateFormat#getDateTimeInstance(int, int)}
+	 *            {@link java.text.DateFormat#getDateTimeInstance(int, int)}
 	 * @return the date format
 	 * @since 2.0
 	 */
@@ -314,7 +341,9 @@
 	}
 
 	/**
-	 * @return true if we are running on a Windows.
+	 * Whether we are running on Windows.
+	 *
+	 * @return true if we are running on Windows.
 	 */
 	public boolean isWindows() {
 		if (isWindows == null) {
@@ -325,6 +354,8 @@
 	}
 
 	/**
+	 * Whether we are running on Mac OS X
+	 *
 	 * @return true if we are running on Mac OS X
 	 */
 	public boolean isMacOS() {
@@ -351,7 +382,7 @@
 	 * Scans a multi-directory path string such as {@code "src/main.c"}.
 	 *
 	 * @param path path string to scan.
-	 * @throws CorruptObjectException path is invalid.
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException path is invalid.
 	 * @since 3.6
 	 */
 	public void checkPath(String path) throws CorruptObjectException {
@@ -365,7 +396,7 @@
 	 *
 	 * @param path
 	 *            path string to scan.
-	 * @throws CorruptObjectException
+	 * @throws org.eclipse.jgit.errors.CorruptObjectException
 	 *             path is invalid.
 	 * @since 4.2
 	 */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java
index e3f1916..31abb7c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java
@@ -114,6 +114,7 @@
 		reset();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(final int b) throws IOException {
 		if (overflow != null) {
@@ -134,6 +135,7 @@
 		s.buffer[s.count++] = (byte) b;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(final byte[] b, int off, int len) throws IOException {
 		if (overflow == null) {
@@ -162,7 +164,7 @@
 	/**
 	 * Dumps the entire buffer into the overflow stream, and flushes it.
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the overflow stream cannot be started, or the buffer contents
 	 *             cannot be written to it, or it failed to flush.
 	 */
@@ -177,7 +179,7 @@
 	 *
 	 * @param in
 	 *            the stream to read from, until EOF is reached.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred reading from the input stream, or while
 	 *             writing to a local temporary file.
 	 */
@@ -227,10 +229,8 @@
 	 * The buffer is only complete after {@link #close()} has been invoked.
 	 *
 	 * @return the complete byte array; length matches {@link #length()}.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred reading from a local temporary file
-	 * @throws OutOfMemoryError
-	 *             the buffer cannot fit in memory
 	 */
 	public byte[] toByteArray() throws IOException {
 		final long len = length();
@@ -253,13 +253,9 @@
 	 *
 	 * @param limit
 	 *            the maximum number of bytes to be returned
-	 *
 	 * @return the byte array limited to {@code limit} bytes.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred reading from a local temporary file
-	 * @throws OutOfMemoryError
-	 *             the buffer cannot fit in memory
-	 *
 	 * @since 4.2
 	 */
 	public byte[] toByteArray(int limit) throws IOException {
@@ -288,7 +284,7 @@
 	 *            if not null progress updates are sent here. Caller should
 	 *            initialize the task and the number of work units to <code>
 	 *            {@link #length()}/1024</code>.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred reading from a temporary file on the local
 	 *             system, or writing to the output stream.
 	 */
@@ -310,14 +306,16 @@
 	 *
 	 * @return a stream to read from the buffer. The caller must close the
 	 *         stream when it is no longer useful.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             an error occurred opening the temporary file.
 	 */
 	public InputStream openInputStream() throws IOException {
 		return new BlockInputStream();
 	}
 
-	/** Reset this buffer for reuse, purging all buffered content. */
+	/**
+	 * Reset this buffer for reuse, purging all buffered content.
+	 */
 	public void reset() {
 		if (overflow != null) {
 			destroy();
@@ -334,7 +332,7 @@
 	 *
 	 * @return the output stream to receive the buffered content, followed by
 	 *         the remaining output.
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 *             the buffer cannot create the overflow stream.
 	 */
 	protected abstract OutputStream overflow() throws IOException;
@@ -363,6 +361,7 @@
 		overflow.write(last.buffer, 0, last.count);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		if (overflow != null) {
@@ -374,7 +373,9 @@
 		}
 	}
 
-	/** Clear this buffer so it has no data, and cannot be used again. */
+	/**
+	 * Clear this buffer so it has no data, and cannot be used again.
+	 */
 	public void destroy() {
 		blocks = null;
 
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 30f9ce9..4566825 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
@@ -91,12 +91,14 @@
 		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, final int off, final int len) throws IOException {
 		if (len == 0)
@@ -135,6 +137,7 @@
 		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 3a72f7e..e764389 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
@@ -75,14 +75,18 @@
 	private boolean isBinary;
 
 	/**
-	 * @param out
+	 * <p>Constructor for AutoCRLFOutputStream.</p>
+	 *
+	 * @param out a {@link java.io.OutputStream} object.
 	 */
 	public AutoCRLFOutputStream(OutputStream out) {
 		this(out, true);
 	}
 
 	/**
-	 * @param out
+	 * <p>Constructor for AutoCRLFOutputStream.</p>
+	 *
+	 * @param out a {@link java.io.OutputStream} object.
 	 * @param detectBinary
 	 *            whether binaries should be detected
 	 * @since 4.3
@@ -92,12 +96,14 @@
 		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);
@@ -105,6 +111,7 @@
 			write(b, b.length - overflow, overflow);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, final int startOff, final int startLen)
 			throws IOException {
@@ -166,6 +173,7 @@
 		write(binbuf, 0, cachedLen);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (binbufcnt <= binbuf.length)
@@ -174,6 +182,7 @@
 		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 6e33f99..06f83f3 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
@@ -125,12 +125,14 @@
 		this.abortIfBinary = abortIfBinary;
 	}
 
+	/** {@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, final int off, final int len)
 			throws IOException {
@@ -171,13 +173,16 @@
 	}
 
 	/**
-	 * @return true if the stream has detected as a binary so far
+	 * Whether the stream has detected as a binary so far.
+	 *
+	 * @return true if the stream has detected as a binary so far.
 	 * @since 3.3
 	 */
 	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 c932b00..32226c4 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
@@ -76,14 +76,24 @@
 	private boolean isBinary;
 
 	/**
+	 * <p>
+	 * Constructor for AutoLFOutputStream.
+	 * </p>
+	 *
 	 * @param out
+	 *            an {@link java.io.OutputStream} object.
 	 */
 	public AutoLFOutputStream(OutputStream out) {
 		this(out, true);
 	}
 
 	/**
+	 * <p>
+	 * Constructor for AutoLFOutputStream.
+	 * </p>
+	 *
 	 * @param out
+	 *            an {@link java.io.OutputStream} object.
 	 * @param detectBinary
 	 *            whether binaries should be detected
 	 */
@@ -92,12 +102,14 @@
 		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);
@@ -106,6 +118,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] b, final int startOff, final int startLen)
 			throws IOException {
@@ -180,6 +193,7 @@
 		write(binbuf, 0, cachedLen);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		if (binbufcnt <= binbuf.length) {
@@ -188,6 +202,7 @@
 		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 ad6f1de..6fb1e6d 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
@@ -46,7 +46,9 @@
 import java.io.IOException;
 import java.io.OutputStream;
 
-/** Counts the number of bytes written. */
+/**
+ * Counts the number of bytes written.
+ */
 public class CountingOutputStream extends OutputStream {
 	private final OutputStream out;
 	private long cnt;
@@ -61,28 +63,36 @@
 		this.out = out;
 	}
 
-	/** @return current number of bytes written. */
+	/**
+	 * Get current number of bytes written.
+	 *
+	 * @return current number of bytes written.
+	 */
 	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 9ddf9b3..ec36495 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
@@ -48,7 +48,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** An OutputStream which always throws IllegalStateExeption during write. */
+/**
+ * An OutputStream which always throws IllegalStateExeption during write.
+ */
 public final class DisabledOutputStream extends OutputStream {
 	/** The canonical instance which always throws IllegalStateException. */
 	public static final DisabledOutputStream INSTANCE = new DisabledOutputStream();
@@ -58,6 +60,7 @@
 		// 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/EolCanonicalizingInputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolCanonicalizingInputStream.java
index ee729e8..dd9a953 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolCanonicalizingInputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolCanonicalizingInputStream.java
@@ -52,7 +52,7 @@
  * Optionally, a binary check on the first 8000 bytes is performed and in case
  * of binary files, canonicalization is turned off (for the complete file).
  *
- * @deprecated use {@link AutoLFInputStream} instead
+ * @deprecated use {@link org.eclipse.jgit.util.io.AutoLFInputStream} instead
  */
 @Deprecated
 public class EolCanonicalizingInputStream extends AutoLFInputStream {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolStreamTypeUtil.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolStreamTypeUtil.java
index 727c1f4..822961f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolStreamTypeUtil.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolStreamTypeUtil.java
@@ -46,14 +46,13 @@
 import java.io.OutputStream;
 
 import org.eclipse.jgit.attributes.Attributes;
-import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.CoreConfig.EolStreamType;
 import org.eclipse.jgit.treewalk.TreeWalk.OperationType;
 import org.eclipse.jgit.treewalk.WorkingTreeOptions;
 
 /**
  * Utility used to create input and output stream wrappers for
- * {@link EolStreamType}
+ * {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType}
  *
  * @since 4.3
  */
@@ -71,18 +70,24 @@
 	 * <li>global attributes</li>
 	 * <li>info attributes</li>
 	 * <li>working tree .gitattributes</li>
+	 * </ul>
 	 *
 	 * @param op
-	 *            is the {@link OperationType} of the current traversal
+	 *            is the
+	 *            {@link org.eclipse.jgit.treewalk.TreeWalk.OperationType} of
+	 *            the current traversal
 	 * @param options
-	 *            are the {@link Config} options with key
-	 *            {@link WorkingTreeOptions#KEY}
+	 *            are the {@link org.eclipse.jgit.lib.Config} options with key
+	 *            {@link org.eclipse.jgit.treewalk.WorkingTreeOptions#KEY}
 	 * @param attrs
-	 *            are the {@link Attributes} of the file for which the
-	 *            {@link EolStreamType} is to be detected
-	 *
-	 * @return the stream conversion {@link EolStreamType} to be performed for
-	 *         the selected {@link OperationType}
+	 *            are the {@link org.eclipse.jgit.attributes.Attributes} of the
+	 *            file for which the
+	 *            {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType} is to be
+	 *            detected
+	 * @return the stream conversion
+	 *         {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType} to be
+	 *         performed for the selected
+	 *         {@link org.eclipse.jgit.treewalk.TreeWalk.OperationType}
 	 */
 	public static EolStreamType detectStreamType(OperationType op,
 			WorkingTreeOptions options, Attributes attrs) {
@@ -97,11 +102,15 @@
 	}
 
 	/**
+	 * Wrap the input stream depending on
+	 * {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType}
+	 *
 	 * @param in
 	 *            original stream
 	 * @param conversion
 	 *            to be performed
-	 * @return the converted stream depending on {@link EolStreamType}
+	 * @return the converted stream depending on
+	 *         {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType}
 	 */
 	public static InputStream wrapInputStream(InputStream in,
 			EolStreamType conversion) {
@@ -120,11 +129,15 @@
 	}
 
 	/**
+	 * Wrap the output stream depending on
+	 * {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType}
+	 *
 	 * @param out
 	 *            original stream
 	 * @param conversion
 	 *            to be performed
-	 * @return the converted stream depending on {@link EolStreamType}
+	 * @return the converted stream depending on
+	 *         {@link org.eclipse.jgit.lib.CoreConfig.EolStreamType}
 	 */
 	public static OutputStream wrapOutputStream(OutputStream out,
 			EolStreamType conversion) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/InterruptTimer.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/InterruptTimer.java
index 0c5edb0..f400e50 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/InterruptTimer.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/InterruptTimer.java
@@ -88,7 +88,9 @@
 
 	final AutoKiller autoKiller;
 
-	/** Create a new timer with a default thread name. */
+	/**
+	 * Create a new timer with a default thread name.
+	 */
 	public InterruptTimer() {
 		this("JGit-InterruptTimer"); //$NON-NLS-1$
 	}
@@ -123,12 +125,16 @@
 		state.begin(timeout);
 	}
 
-	/** Disable the interrupt timer, as the operation is complete. */
+	/**
+	 * Disable the interrupt timer, as the operation is complete.
+	 */
 	public void end() {
 		state.end();
 	}
 
-	/** Shutdown the timer thread, and wait for it to terminate. */
+	/**
+	 * Shutdown the timer thread, and wait for it to terminate.
+	 */
 	public void terminate() {
 		state.terminate();
 		try {
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 3598a7b..5e50995 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
@@ -91,11 +91,13 @@
 				new ArrayBlockingQueue<Runnable>(1), new NamedThreadFactory());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(int ch) throws IOException {
 		write(new byte[] { (byte) ch }, 0, 1);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(final byte[] buf, final int pos, final int cnt)
 			throws IOException {
@@ -109,6 +111,7 @@
 		});
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		checkClosed();
@@ -121,6 +124,7 @@
 		});
 	}
 
+	/** {@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 d74532f..9ab2caa 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
@@ -51,13 +51,13 @@
 import org.eclipse.jgit.internal.JGitText;
 
 /**
- * Wraps a {@link InputStream}, limiting the number of bytes which can be
- * read.
+ * Wraps a {@link java.io.InputStream}, limiting the number of bytes which can
+ * be read.
  *
- * This class was copied and modifed from the Google Guava 16.0. Differently from
- * the original Guava code, when a caller tries to read from this stream past
- * the given limit and the wrapped stream hasn't yet reached its EOF this class
- * will call the limitExceeded method instead of returning EOF.
+ * This class was copied and modifed from the Google Guava 16.0. Differently
+ * from the original Guava code, when a caller tries to read from this stream
+ * past the given limit and the wrapped stream hasn't yet reached its EOF this
+ * class will call the limitExceeded method instead of returning EOF.
  *
  * @since 3.3
  */
@@ -80,18 +80,21 @@
 		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) {
@@ -107,6 +110,7 @@
 		return result;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		if (left == 0) {
@@ -123,6 +127,7 @@
 		return result;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public synchronized void reset() throws IOException {
 		if (!in.markSupported())
@@ -135,6 +140,7 @@
 		left = mark;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long skip(long n) throws IOException {
 		n = Math.min(n, left);
@@ -147,10 +153,11 @@
 	 * Called when trying to read past the given {@link #limit} and the wrapped
 	 * InputStream {@link #in} hasn't yet reached its EOF
 	 *
-	 * @throws IOException
-	 *            subclasses can throw an IOException when the limit is exceeded.
-	 *            The throws IOException will be forwarded back to the caller of
-	 *            the read method which read the stream past the limit.
+	 * @throws java.io.IOException
+	 *             subclasses can throw an {@link java.io.IOException} when the
+	 *             limit is exceeded. The throws java.io.IOException will be
+	 *             forwarded back to the caller of the read method which read
+	 *             the stream past the limit.
 	 */
 	protected abstract void limitExceeded() throws IOException;
 }
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 a675360..94e5ef3 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
@@ -66,20 +66,24 @@
  * {@link #toString()} returns all written data, after converting it to a String
  * under the assumption of UTF-8 encoding.
  * <p>
- * Internally {@link RawParseUtils#decode(byte[])} is used by {@code toString()}
- * tries to work out a reasonably correct character set for the raw data.
+ * Internally {@link org.eclipse.jgit.util.RawParseUtils#decode(byte[])} is used
+ * by {@code toString()} tries to work out a reasonably correct character set
+ * for the raw data.
  */
 public class MessageWriter extends Writer {
 	private final ByteArrayOutputStream buf;
 
 	private final OutputStreamWriter enc;
 
-	/** Create an empty writer. */
+	/**
+	 * Create an empty writer.
+	 */
 	public MessageWriter() {
 		buf = new ByteArrayOutputStream();
 		enc = new OutputStreamWriter(getRawStream(), Constants.CHARSET);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(char[] cbuf, int off, int len) throws IOException {
 		synchronized (buf) {
@@ -89,6 +93,9 @@
 	}
 
 	/**
+	 * Get the underlying byte stream that character writes to this writer drop
+	 * into.
+	 *
 	 * @return the underlying byte stream that character writes to this writer
 	 *         drop into. Writes to this stream should should be in UTF-8.
 	 */
@@ -96,17 +103,20 @@
 		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/NullOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/NullOutputStream.java
index 7b1e932..f90f7e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/NullOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/NullOutputStream.java
@@ -57,16 +57,19 @@
 		// more than one instance from being created.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(int b) {
 		// Discard.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf) {
 		// Discard.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(byte[] buf, int pos, int cnt) {
 		// Discard.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/SafeBufferedOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/SafeBufferedOutputStream.java
index 84c3398..68b417e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/SafeBufferedOutputStream.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/SafeBufferedOutputStream.java
@@ -46,11 +46,15 @@
 import java.io.OutputStream;
 
 /**
+ * <p>SafeBufferedOutputStream class.</p>
+ *
  * @deprecated use BufferedOutputStream in Java 8 and later.
  */
 @Deprecated
 public class SafeBufferedOutputStream extends BufferedOutputStream {
 	/**
+	 * <p>Constructor for SafeBufferedOutputStream.</p>
+	 *
 	 * @see BufferedOutputStream#BufferedOutputStream(OutputStream)
 	 * @param out
 	 *            underlying output stream
@@ -60,6 +64,8 @@
 	}
 
 	/**
+	 * <p>Constructor for SafeBufferedOutputStream.</p>
+	 *
 	 * @see BufferedOutputStream#BufferedOutputStream(OutputStream, int)
 	 * @param out
 	 *            underlying output stream
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 7aba0a5..5c1af9ef 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
@@ -48,7 +48,9 @@
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
 
-/** Thread to copy from an input stream to an output stream. */
+/**
+ * Thread to copy from an input stream to an output stream.
+ */
 public class StreamCopyThread extends Thread {
 	private static final int BUFFER_SIZE = 1024;
 
@@ -98,7 +100,7 @@
 	 * This method signals to the copy thread that it should stop as soon as
 	 * there is no more IO occurring.
 	 *
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             the calling thread was interrupted.
 	 */
 	public void halt() throws InterruptedException {
@@ -112,6 +114,7 @@
 		}
 	}
 
+	/** {@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 a7a0347..dee4fe9 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
@@ -47,15 +47,13 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.eclipse.jgit.util.TemporaryBuffer;
-
 /**
  * Input stream that copies data read to another output stream.
  *
- * This stream is primarily useful with a {@link TemporaryBuffer}, where any
- * data read or skipped by the caller is also duplicated into the temporary
- * buffer. Later the temporary buffer can then be used instead of the original
- * source stream.
+ * This stream is primarily useful with a
+ * {@link org.eclipse.jgit.util.TemporaryBuffer}, where any data read or skipped
+ * by the caller is also duplicated into the temporary buffer. Later the
+ * temporary buffer can then be used instead of the original source stream.
  *
  * During close this stream copies any remaining data from the source stream
  * into the destination stream.
@@ -74,13 +72,14 @@
 	 *            source stream to consume.
 	 * @param dst
 	 *            destination to copy the source to as it is consumed. Typically
-	 *            this is a {@link TemporaryBuffer}.
+	 *            this is a {@link org.eclipse.jgit.util.TemporaryBuffer}.
 	 */
 	public TeeInputStream(InputStream src, OutputStream dst) {
 		this.src = src;
 		this.dst = dst;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		byte[] b = skipBuffer();
@@ -88,6 +87,7 @@
 		return n == 1 ? b[0] & 0xff : -1;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long skip(final long count) throws IOException {
 		long skipped = 0;
@@ -104,6 +104,7 @@
 		return skipped;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		if (len == 0)
@@ -115,6 +116,7 @@
 		return n;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void close() throws IOException {
 		byte[] b = skipBuffer();
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 5eca0d9..caabcef 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
@@ -64,7 +64,7 @@
 	 * Construct a JGitPrintWriter
 	 *
 	 * @param out
-	 *            the underlying {@link Writer}
+	 *            the underlying {@link java.io.Writer}
 	 */
 	public ThrowingPrintWriter(Writer out) {
 		this.out = out;
@@ -76,16 +76,19 @@
 		});
 	}
 
+	/** {@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();
@@ -94,8 +97,8 @@
 	/**
 	 * Print a string and terminate with a line feed.
 	 *
-	 * @param s
-	 * @throws IOException
+	 * @param s a {@link java.lang.String} object.
+	 * @throws java.io.IOException
 	 */
 	public void println(String s) throws IOException {
 		print(s + LF);
@@ -104,7 +107,7 @@
 	/**
 	 * Print a platform dependent new line
 	 *
-	 * @throws IOException
+	 * @throws java.io.IOException
 	 */
 	public void println() throws IOException {
 		print(LF);
@@ -113,8 +116,8 @@
 	/**
 	 * Print a char
 	 *
-	 * @param value
-	 * @throws IOException
+	 * @param value a char.
+	 * @throws java.io.IOException
 	 */
 	public void print(char value) throws IOException {
 		print(String.valueOf(value));
@@ -124,7 +127,8 @@
 	 * Print an int as string
 	 *
 	 * @param value
-	 * @throws IOException
+	 *            an int.
+	 * @throws java.io.IOException
 	 */
 	public void print(int value) throws IOException {
 		print(String.valueOf(value));
@@ -133,8 +137,8 @@
 	/**
 	 * Print a long as string
 	 *
-	 * @param value
-	 * @throws IOException
+	 * @param value a long.
+	 * @throws java.io.IOException
 	 */
 	public void print(long value) throws IOException {
 		print(String.valueOf(value));
@@ -143,8 +147,8 @@
 	/**
 	 * Print a short as string
 	 *
-	 * @param value
-	 * @throws IOException
+	 * @param value a short.
+	 * @throws java.io.IOException
 	 */
 	public void print(short value) throws IOException {
 		print(String.valueOf(value));
@@ -152,11 +156,13 @@
 
 	/**
 	 * Print a formatted message according to
-	 * {@link String#format(String, Object...)}.
+	 * {@link java.lang.String#format(String, Object...)}.
 	 *
 	 * @param fmt
+	 *            a {@link java.lang.String} object.
 	 * @param args
-	 * @throws IOException
+	 *            objects.
+	 * @throws java.io.IOException
 	 */
 	public void format(String fmt, Object... args) throws IOException {
 		print(String.format(fmt, args));
@@ -166,7 +172,8 @@
 	 * Print an object's toString representations
 	 *
 	 * @param any
-	 * @throws IOException
+	 *            an object.
+	 * @throws java.io.IOException
 	 */
 	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 1148895..01b2519 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
@@ -51,7 +51,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** InputStream with a configurable timeout. */
+/**
+ * InputStream with a configurable timeout.
+ */
 public class TimeoutInputStream extends FilterInputStream {
 	private final InterruptTimer myTimer;
 
@@ -72,12 +74,18 @@
 		myTimer = timer;
 	}
 
-	/** @return number of milliseconds before aborting a read. */
+	/**
+	 * Get number of milliseconds before aborting a read.
+	 *
+	 * @return number of milliseconds before aborting a read.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
 
 	/**
+	 * Set number of milliseconds before aborting a read.
+	 *
 	 * @param millis
 	 *            number of milliseconds before aborting a read. Must be &gt; 0.
 	 */
@@ -88,6 +96,7 @@
 		timeout = millis;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		try {
@@ -100,11 +109,13 @@
 		}
 	}
 
+	/** {@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 {
@@ -117,6 +128,7 @@
 		}
 	}
 
+	/** {@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 9236d0e..ea40133 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
@@ -50,7 +50,9 @@
 
 import org.eclipse.jgit.internal.JGitText;
 
-/** OutputStream with a configurable timeout. */
+/**
+ * OutputStream with a configurable timeout.
+ */
 public class TimeoutOutputStream extends OutputStream {
 	private final OutputStream dst;
 
@@ -73,14 +75,21 @@
 		myTimer = timer;
 	}
 
-	/** @return number of milliseconds before aborting a write. */
+	/**
+	 * Get number of milliseconds before aborting a write.
+	 *
+	 * @return number of milliseconds before aborting a write.
+	 */
 	public int getTimeout() {
 		return timeout;
 	}
 
 	/**
+	 * Set number of milliseconds before aborting a write.
+	 *
 	 * @param millis
-	 *            number of milliseconds before aborting a write. Must be &gt; 0.
+	 *            number of milliseconds before aborting a write. Must be &gt;
+	 *            0.
 	 */
 	public void setTimeout(final int millis) {
 		if (millis < 0)
@@ -89,6 +98,7 @@
 		timeout = millis;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void write(int b) throws IOException {
 		try {
@@ -101,11 +111,13 @@
 		}
 	}
 
+	/** {@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 {
@@ -118,6 +130,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public void flush() throws IOException {
 		try {
@@ -130,6 +143,7 @@
 		}
 	}
 
+	/** {@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 1c46310..51d3106 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
@@ -58,7 +58,7 @@
  * Currently this stream does not support the mark/reset APIs. If mark and later
  * reset functionality is needed the caller should wrap this stream with a
  * {@link java.io.BufferedInputStream}.
- * */
+ */
 public class UnionInputStream extends InputStream {
 	private static final InputStream EOF = new InputStream() {
 		@Override
@@ -69,7 +69,9 @@
 
 	private final LinkedList<InputStream> streams = new LinkedList<>();
 
-	/** Create an empty InputStream that is currently at EOF state. */
+	/**
+	 * Create an empty InputStream that is currently at EOF state.
+	 */
 	public UnionInputStream() {
 		// Do nothing.
 	}
@@ -122,6 +124,7 @@
 		return streams.isEmpty();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read() throws IOException {
 		for (;;) {
@@ -136,6 +139,7 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int read(byte[] b, int off, int len) throws IOException {
 		if (len == 0)
@@ -152,11 +156,13 @@
 		}
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public int available() throws IOException {
 		return head().available();
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long skip(final long count) throws IOException {
 		long skipped = 0;
@@ -190,6 +196,7 @@
 		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 5449711..9fe01f1 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
@@ -70,8 +70,8 @@
  * sha1collisiondetection</a> for more information.
  * <p>
  * When detectCollision is true (default), this implementation throws
- * {@link Sha1CollisionException} from any digest method if a potential
- * collision was detected.
+ * {@link org.eclipse.jgit.util.sha1.Sha1CollisionException} from any digest
+ * method if a potential collision was detected.
  *
  * @since 4.7
  */
@@ -85,7 +85,11 @@
 		DETECT_COLLISIONS = v != null ? Boolean.parseBoolean(v) : true;
 	}
 
-	/** @return a new context to compute a SHA-1 hash of data. */
+	/**
+	 * Create a new context to compute a SHA-1 hash of data.
+	 *
+	 * @return a new context to compute a SHA-1 hash of data.
+	 */
 	public static SHA1 newInstance() {
 		return new SHA1();
 	}
@@ -121,6 +125,7 @@
 	 * {@code -Dorg.eclipse.jgit.util.sha1.detectCollision=true}.
 	 *
 	 * @param detect
+	 *            a boolean.
 	 * @return {@code this}
 	 */
 	public SHA1 setDetectCollision(boolean detect) {
@@ -131,7 +136,7 @@
 	/**
 	 * Update the digest computation by adding a byte.
 	 *
-	 * @param b
+	 * @param b a byte.
 	 */
 	public void update(byte b) {
 		int bufferLen = (int) (length & 63);
@@ -503,7 +508,7 @@
 	 * Once {@code digest()} is called, this instance should be discarded.
 	 *
 	 * @return the bytes for the resulting hash.
-	 * @throws Sha1CollisionException
+	 * @throws org.eclipse.jgit.util.sha1.Sha1CollisionException
 	 *             if a collision was detected and safeHash is false.
 	 */
 	public byte[] digest() throws Sha1CollisionException {
@@ -524,7 +529,7 @@
 	 * Once {@code digest()} is called, this instance should be discarded.
 	 *
 	 * @return the ObjectId for the resulting hash.
-	 * @throws Sha1CollisionException
+	 * @throws org.eclipse.jgit.util.sha1.Sha1CollisionException
 	 *             if a collision was detected and safeHash is false.
 	 */
 	public ObjectId toObjectId() throws Sha1CollisionException {
@@ -539,7 +544,7 @@
 	 *
 	 * @param id
 	 *            destination to copy the digest to.
-	 * @throws Sha1CollisionException
+	 * @throws org.eclipse.jgit.util.sha1.Sha1CollisionException
 	 *             if a collision was detected and safeHash is false.
 	 */
 	public void digest(MutableObjectId id) throws Sha1CollisionException {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/Sha1CollisionException.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/Sha1CollisionException.java
index be126a5..dcefe95 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/Sha1CollisionException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/Sha1CollisionException.java
@@ -49,7 +49,8 @@
 import org.eclipse.jgit.lib.ObjectId;
 
 /**
- * Thrown by {@link SHA1} if it detects a likely hash collision.
+ * Thrown by {@link org.eclipse.jgit.util.sha1.SHA1} if it detects a likely hash
+ * collision.
  *
  * @since 4.7
  */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicClock.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicClock.java
index 794d851..c7c874d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicClock.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/time/MonotonicClock.java
@@ -44,7 +44,6 @@
 package org.eclipse.jgit.util.time;
 
 import java.time.Duration;
-import java.util.concurrent.TimeUnit;
 
 /**
  * A provider of time.
@@ -53,7 +52,9 @@
  * source, such as the local system clock.
  * <p>
  * MonotonicClocks provide the following behavior, with the assertion always
- * being true if {@link ProposedTimestamp#blockUntil(Duration)} is used:
+ * being true if
+ * {@link org.eclipse.jgit.util.time.ProposedTimestamp#blockUntil(Duration)} is
+ * used:
  *
  * <pre>
  *   MonotonicClock clk = ...;
@@ -64,7 +65,7 @@
  *   }
  *
  *   try (ProposedTimestamp t2 = clk.propose()) {
- *   	assert t2.millis() > r1;
+ *   	assert t2.millis() &gt; r1;
  *   }
  * </pre>
  *
@@ -83,14 +84,11 @@
 	 * by NTP) and return that proposal, concurrently sending network messages
 	 * to closely collaborating peers in the same cluster to also ensure their
 	 * system clocks are ahead of this time. In such an implementation the
-	 * {@link ProposedTimestamp#blockUntil(Duration)} method would wait for
-	 * replies from the peers indicating their own system clocks have moved past
-	 * the proposed time.
+	 * {@link org.eclipse.jgit.util.time.ProposedTimestamp#blockUntil(Duration)}
+	 * method would wait for replies from the peers indicating their own system
+	 * clocks have moved past the proposed time.
 	 *
-	 * @return "now". The value can be immediately accessed by
-	 *         {@link ProposedTimestamp#read(TimeUnit)} and friends, but the
-	 *         caller must use {@link ProposedTimestamp#blockUntil(Duration)} to
-	 *         ensure ordering holds.
+	 * @return a {@link org.eclipse.jgit.util.time.ProposedTimestamp} object.
 	 */
 	ProposedTimestamp propose();
 }
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 a9f4830..cce1e11 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
@@ -51,7 +51,8 @@
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
- * A {@link MonotonicClock} based on {@code System.currentTimeMillis}.
+ * A {@link org.eclipse.jgit.util.time.MonotonicClock} based on
+ * {@code System.currentTimeMillis}.
  *
  * @since 4.6
  */
@@ -69,6 +70,7 @@
 		}
 	}
 
+	/** {@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 c09ab32..789950e 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
@@ -55,7 +55,8 @@
 import java.util.concurrent.TimeoutException;
 
 /**
- * A timestamp generated by {@link MonotonicClock#propose()}.
+ * A timestamp generated by
+ * {@link org.eclipse.jgit.util.time.MonotonicClock#propose()}.
  * <p>
  * ProposedTimestamp implements AutoCloseable so that implementations can
  * release resources associated with obtaining certainty about time elapsing.
@@ -73,10 +74,10 @@
 	 *            timestamps to wait on.
 	 * @param maxWait
 	 *            how long to wait for the timestamps.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             current thread was interrupted before the waiting process
 	 *             completed normally.
-	 * @throws TimeoutException
+	 * @throws java.util.concurrent.TimeoutException
 	 *             the timeout was reached without the proposed timestamp become
 	 *             certainly in the past.
 	 */
@@ -121,31 +122,44 @@
 	 * <p>
 	 * This method forces the caller to wait up to {@code timeout} for
 	 * {@code this} to pass sufficiently into the past such that the creating
-	 * {@link MonotonicClock} instance will not create an earlier timestamp.
+	 * {@link org.eclipse.jgit.util.time.MonotonicClock} instance will not
+	 * create an earlier timestamp.
 	 *
 	 * @param maxWait
 	 *            how long the implementation may block the caller.
-	 * @throws InterruptedException
+	 * @throws java.lang.InterruptedException
 	 *             current thread was interrupted before the waiting process
 	 *             completed normally.
-	 * @throws TimeoutException
+	 * @throws java.util.concurrent.TimeoutException
 	 *             the timeout was reached without the proposed timestamp
 	 *             becoming certainly in the past.
 	 */
 	public abstract void blockUntil(Duration maxWait)
 			throws InterruptedException, TimeoutException;
 
-	/** @return milliseconds since epoch; {@code read(MILLISECONDS}). */
+	/**
+	 * Get milliseconds since epoch; {@code read(MILLISECONDS}).
+	 *
+	 * @return milliseconds since epoch; {@code read(MILLISECONDS}).
+	 */
 	public long millis() {
 		return read(MILLISECONDS);
 	}
 
-	/** @return microseconds since epoch; {@code read(MICROSECONDS}). */
+	/**
+	 * Get microseconds since epoch; {@code read(MICROSECONDS}).
+	 *
+	 * @return microseconds since epoch; {@code read(MICROSECONDS}).
+	 */
 	public long micros() {
 		return read(MICROSECONDS);
 	}
 
-	/** @return time since epoch, with up to microsecond resolution. */
+	/**
+	 * Get time since epoch, with up to microsecond resolution.
+	 *
+	 * @return time since epoch, with up to microsecond resolution.
+	 */
 	public Instant instant() {
 		long usec = micros();
 		long secs = usec / 1000000L;
@@ -153,22 +167,35 @@
 		return Instant.ofEpochSecond(secs, nanos);
 	}
 
-	/** @return time since epoch, with up to microsecond resolution. */
+	/**
+	 * Get time since epoch, with up to microsecond resolution.
+	 *
+	 * @return time since epoch, with up to microsecond resolution.
+	 */
 	public Timestamp timestamp() {
 		return Timestamp.from(instant());
 	}
 
-	/** @return time since epoch, with up to millisecond resolution. */
+	/**
+	 * Get time since epoch, with up to millisecond resolution.
+	 *
+	 * @return time since epoch, with up to millisecond resolution.
+	 */
 	public Date date() {
 		return new Date(millis());
 	}
 
-	/** Release resources allocated by this timestamp. */
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Release resources allocated by this timestamp.
+	 */
 	@Override
 	public void close() {
 		// Do nothing by default.
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String toString() {
 		return instant().toString();
diff --git a/pom.xml b/pom.xml
index 9a8050a..8159991 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,7 +51,7 @@
   <groupId>org.eclipse.jgit</groupId>
   <artifactId>org.eclipse.jgit-parent</artifactId>
   <packaging>pom</packaging>
-  <version>4.9.9-SNAPSHOT</version>
+  <version>4.10.1-SNAPSHOT</version>
 
   <name>JGit - Parent</name>
   <url>${jgit-url}</url>
@@ -70,10 +70,6 @@
     <connection>scm:git:https://git.eclipse.org/r/jgit/jgit</connection>
   </scm>
 
-  <prerequisites>
-    <maven>3.3.1</maven>
-  </prerequisites>
-
   <ciManagement>
     <system>hudson</system>
     <url>https://hudson.eclipse.org/jgit/</url>
@@ -195,7 +191,7 @@
     <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
     <bundle-manifest>${project.build.directory}/META-INF/MANIFEST.MF</bundle-manifest>
 
-    <jgit-last-release-version>4.7.0.201704051617-r</jgit-last-release-version>
+    <jgit-last-release-version>4.9.2.201712150930-r</jgit-last-release-version>
     <jsch-version>0.1.54</jsch-version>
     <javaewah-version>1.1.6</javaewah-version>
     <junit-version>4.12</junit-version>
@@ -204,16 +200,17 @@
     <commons-compress-version>1.6</commons-compress-version>
     <osgi-core-version>4.3.1</osgi-core-version>
     <servlet-api-version>3.1.0</servlet-api-version>
-    <jetty-version>9.4.5.v20170502</jetty-version>
-    <japicmp-version>0.10.0</japicmp-version>
-    <httpclient-version>4.3.6</httpclient-version>
+    <jetty-version>9.4.8.v20171121</jetty-version>
+    <japicmp-version>0.11.0</japicmp-version>
+    <httpclient-version>4.5.2</httpclient-version>
+    <httpcore-version>4.4.6</httpcore-version>
     <slf4j-version>1.7.2</slf4j-version>
     <log4j-version>1.2.15</log4j-version>
-    <maven-javadoc-plugin-version>2.10.4</maven-javadoc-plugin-version>
+    <maven-javadoc-plugin-version>3.0.0</maven-javadoc-plugin-version>
     <tycho-extras-version>1.0.0</tycho-extras-version>
     <gson-version>2.2.4</gson-version>
-    <spotbugs-maven-plugin-version>3.0.6</spotbugs-maven-plugin-version>
-    <maven-surefire-report-plugin-version>2.20</maven-surefire-report-plugin-version>
+    <spotbugs-maven-plugin-version>3.1.0</spotbugs-maven-plugin-version>
+    <maven-surefire-report-plugin-version>2.20.1</maven-surefire-report-plugin-version>
 
     <!-- Properties to enable jacoco code coverage analysis -->
     <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
@@ -264,7 +261,7 @@
 
         <plugin>
           <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.6.2</version>
+          <version>3.7.0</version>
           <configuration>
             <encoding>UTF-8</encoding>
             <source>1.8</source>
@@ -314,7 +311,7 @@
             <dependency>
               <groupId>com.google.errorprone</groupId>
               <artifactId>error_prone_core</artifactId>
-              <version>2.1.1</version>
+              <version>2.1.3</version>
             </dependency>
           </dependencies>
         </plugin>
@@ -327,7 +324,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-shade-plugin</artifactId>
-          <version>3.0.0</version>
+          <version>3.1.0</version>
         </plugin>
 
         <plugin>
@@ -339,7 +336,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-dependency-plugin</artifactId>
-          <version>3.0.0</version>
+          <version>3.0.2</version>
         </plugin>
 
         <plugin>
@@ -357,7 +354,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.20</version>
+          <version>2.20.1</version>
           <configuration>
             <forkCount>${test-fork-count}</forkCount>
             <reuseForks>true</reuseForks>
@@ -371,7 +368,7 @@
         </plugin>
 
         <plugin>
-          <groupId>com.github.hazendaz.spotbugs</groupId>
+          <groupId>com.github.spotbugs</groupId>
           <artifactId>spotbugs-maven-plugin</artifactId>
           <version>${spotbugs-maven-plugin-version}</version>
           <configuration>
@@ -462,6 +459,27 @@
 
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>3.0.0-M1</version>
+        <executions>
+          <execution>
+            <id>enforce-maven</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireMavenVersion>
+                  <version>3.5.2</version>
+                </requireMavenVersion>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
       </plugin>
 
@@ -506,6 +524,7 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <configuration>
+          <additionalJOption>-Xdoclint:-missing</additionalJOption>
           <encoding>${project.build.sourceEncoding}</encoding>
           <quiet>true</quiet>
           <excludePackageNames>org.eclipse.jgit.http.test</excludePackageNames>
@@ -570,8 +589,6 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <version>${maven-javadoc-plugin-version}</version>
-        <configuration>
-        </configuration>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -579,7 +596,7 @@
         <version>2.5</version>
       </plugin>
       <plugin>
-        <groupId>com.github.hazendaz.spotbugs</groupId>
+        <groupId>com.github.spotbugs</groupId>
         <artifactId>spotbugs-maven-plugin</artifactId>
         <version>${spotbugs-maven-plugin-version}</version>
       </plugin>
@@ -655,6 +672,12 @@
       </dependency>
 
       <dependency>
+        <groupId>org.apache.httpcomponents</groupId>
+        <artifactId>httpcore</artifactId>
+        <version>${httpcore-version}</version>
+      </dependency>
+
+      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>${slf4j-version}</version>
@@ -719,39 +742,11 @@
 
   <profiles>
     <profile>
-      <id>jgit.java8</id>
-      <activation>
-        <jdk>[1.8,)</jdk>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <configuration>
-              <additionalparam>-Xdoclint:-missing</additionalparam>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-      <reporting>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <configuration>
-              <additionalparam>-Xdoclint:-missing</additionalparam>
-            </configuration>
-          </plugin>
-        </plugins>
-      </reporting>
-    </profile>
-    <profile>
       <id>static-checks</id>
       <build>
         <plugins>
           <plugin>
-            <groupId>com.github.hazendaz.spotbugs</groupId>
+            <groupId>com.github.spotbugs</groupId>
             <artifactId>spotbugs-maven-plugin</artifactId>
           </plugin>
           <plugin>
