Merge changes Id9a641dd,If2ee1f42

* changes:
  Added TestCase for 7d5e1f Fixed RevWalk.isMergedInto()
  Fixed RevWalk.isMergedInto() returning wrong results
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 b64e349..c0d4b5e 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
@@ -131,7 +131,7 @@
 	 *            first parsed version string.
 	 * @param b
 	 *            second parsed version string.
-	 * @return <0 if a is before b; 0 if a equals b; >0 if a is after b.
+	 * @return &lt; 0 if a is before b; 0 if a equals b; &gt;0 if a is after b.
 	 */
 	public static int compare(int[] a, int[] b) {
 		for (int i = 0; i < a.length && i < b.length; i++) {
diff --git "a/org.eclipse.jgit.java7.test/org.eclipse.jgit.java7 -- Java7 feature test \050Java 8\051.launch" "b/org.eclipse.jgit.java7.test/org.eclipse.jgit.java7 -- Java7 feature test \050Java 8\051.launch"
new file mode 100644
index 0000000..0c460f0
--- /dev/null
+++ "b/org.eclipse.jgit.java7.test/org.eclipse.jgit.java7 -- Java7 feature test \050Java 8\051.launch"
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.jgit.java7.test"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.jgit.java7.test"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jgit.java7.test"/>
+</launchConfiguration>
diff --git "a/org.eclipse.jgit.pgm.test/org.eclipse.jgit.pgm--All-Tests \050Java8\051.launch" "b/org.eclipse.jgit.pgm.test/org.eclipse.jgit.pgm--All-Tests \050Java8\051.launch"
new file mode 100644
index 0000000..1b61d3d
--- /dev/null
+++ "b/org.eclipse.jgit.pgm.test/org.eclipse.jgit.pgm--All-Tests \050Java8\051.launch"
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.jgit.pgm.test/tst"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="2"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.jgit.pgm.test/tst"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;org.eclipse.jgit.pgm.test&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;org.eclipse.jgit.java7&quot; type=&quot;1&quot;/&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jgit.pgm.test"/>
+</launchConfiguration>
diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml
index 24230ba..830f512 100644
--- a/org.eclipse.jgit.pgm.test/pom.xml
+++ b/org.eclipse.jgit.pgm.test/pom.xml
@@ -64,7 +64,7 @@
     <profile>
       <id>jgit.java7</id>
       <activation>
-	<jdk>1.7</jdk>
+	<jdk>[1.7,)</jdk>
       </activation>
       <dependencies>
 	<dependency>
diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml
index b2d4262..8ef89ce 100644
--- a/org.eclipse.jgit.pgm/pom.xml
+++ b/org.eclipse.jgit.pgm/pom.xml
@@ -112,7 +112,7 @@
     <profile>
       <id>java7</id>
       <activation>
-       <jdk>1.7</jdk>
+       <jdk>[1.7,)</jdk>
       </activation>
       <dependencies>
         <dependency>
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 1fe39da..d226df2 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
@@ -50,7 +50,6 @@
 import static java.lang.Character.valueOf;
 
 import java.io.IOException;
-import java.io.PrintWriter;
 import java.text.MessageFormat;
 
 import org.eclipse.jgit.lib.Constants;
@@ -60,6 +59,7 @@
 import org.eclipse.jgit.pgm.internal.CLIText;
 import org.eclipse.jgit.transport.FetchResult;
 import org.eclipse.jgit.transport.TrackingRefUpdate;
+import org.eclipse.jgit.util.io.ThrowingPrintWriter;
 import org.kohsuke.args4j.Option;
 
 abstract class AbstractFetchCommand extends TextBuiltin {
@@ -92,11 +92,10 @@
 		} finally {
 			reader.release();
 		}
-		showRemoteMessages(r.getMessages());
+		showRemoteMessages(errw, r.getMessages());
 	}
 
-	static void showRemoteMessages(String pkt) {
-		PrintWriter writer = new PrintWriter(System.err);
+	static void showRemoteMessages(ThrowingPrintWriter writer, String pkt) throws IOException {
 		while (0 < pkt.length()) {
 			final int lf = pkt.indexOf('\n');
 			final int cr = pkt.indexOf('\r');
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 5e66c36..e0a9244 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
@@ -116,7 +116,7 @@
 			final OutputStream os = s3.beginPut(bucket, key, null, null);
 			final byte[] tmp = new byte[2048];
 			int n;
-			while ((n = System.in.read(tmp)) > 0)
+			while ((n = ins.read(tmp)) > 0)
 				os.write(tmp, 0, n);
 			os.close();
 
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 a2f4060..f07df1a 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
@@ -54,6 +54,8 @@
 public class Die extends RuntimeException {
 	private static final long serialVersionUID = 1L;
 
+	private boolean aborted;
+
 	/**
 	 * Construct a new message explaining what has gone wrong.
 	 *
@@ -75,4 +77,25 @@
 	public Die(final String why, final Throwable cause) {
 		super(why, cause);
 	}
+
+	/**
+	 * Construct a new exception reflecting the fact that the
+	 * command execution has been aborted before running.
+	 *
+	 * @param aborted boolean indicating the fact the execution has been aborted
+	 * @since 3.4
+	 */
+	public Die(boolean aborted) {
+		this.aborted = aborted;
+	}
+
+	/**
+	 * Check if this exception should cause the execution to be aborted.
+	 *
+	 * @return boolean indicating that the execution should be aborted
+	 * @since 3.4
+	 */
+	public boolean isAborted() {
+		return aborted;
+	}
 }
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 9fc5882..4211406 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
@@ -62,7 +62,7 @@
 
 	@Override
 	protected void run() throws Exception {
-		BufferedInputStream in = new BufferedInputStream(System.in);
+		BufferedInputStream in = new BufferedInputStream(ins);
 		ObjectInserter inserter = db.newObjectInserter();
 		try {
 			PackParser p = inserter.newPackParser(in);
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 3648ffd..9459139 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
@@ -123,6 +123,8 @@
 			configureHttpProxy();
 			execute(argv);
 		} catch (Die err) {
+			if (err.isAborted())
+				System.exit(1);
 			System.err.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
 			if (showStackTrace)
 				err.printStackTrace();
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 b252de8..c7c27b4 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
@@ -161,7 +161,7 @@
 				printRefUpdateResult(reader, uri, result, rru);
 		}
 
-		AbstractFetchCommand.showRemoteMessages(result.getMessages());
+		AbstractFetchCommand.showRemoteMessages(errw, result.getMessages());
 		if (everythingUpToDate)
 			outw.println(CLIText.get().everythingUpToDate);
 	}
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 bc8f497..d7f895a 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
@@ -76,6 +76,6 @@
 		}
 
 		rp = new org.eclipse.jgit.transport.ReceivePack(db);
-		rp.receive(System.in, outs, System.err);
+		rp.receive(ins, outs, errs);
 	}
 }
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 847bf7f..e23fb35 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
@@ -199,10 +199,9 @@
 		final int n = walkLoop();
 		if (count) {
 			final long end = System.currentTimeMillis();
-			System.err.print(n);
-			System.err.print(' ');
-			System.err
-					.println(MessageFormat.format(
+			errw.print(n);
+			errw.print(' ');
+			errw.println(MessageFormat.format(
 							CLIText.get().timeInMilliSeconds,
 							Long.valueOf(end - start)));
 		}
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 7f7ef8d..8e8b82f 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
@@ -50,8 +50,10 @@
 
 import java.io.BufferedWriter;
 import java.io.FileDescriptor;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
@@ -85,6 +87,13 @@
 	private boolean help;
 
 	/**
+	 * Input stream, typically this is standard input.
+	 *
+	 * @since 3.4
+	 */
+	protected InputStream ins;
+
+	/**
 	 * Writer to output to, typically this is standard output.
 	 *
 	 * @since 2.2
@@ -106,6 +115,20 @@
 	@Deprecated
 	protected PrintWriter out;
 
+	/**
+	 * Error writer, typically this is standard error.
+	 *
+	 * @since 3.4
+	 */
+	protected ThrowingPrintWriter errw;
+
+	/**
+	 * Error output stream, typically this is standard error.
+	 *
+	 * @since 3.4
+	 */
+	protected OutputStream errs;
+
 	/** Git repository the command was invoked within. */
 	protected Repository db;
 
@@ -137,16 +160,27 @@
 		try {
 			final String outputEncoding = repository != null ? repository
 					.getConfig().getString("i18n", null, "logOutputEncoding") : null; //$NON-NLS-1$ //$NON-NLS-2$
+			if (ins == null)
+				ins = new FileInputStream(FileDescriptor.in);
 			if (outs == null)
 				outs = new FileOutputStream(FileDescriptor.out);
-			BufferedWriter bufw;
+			if (errs == null)
+				errs = new FileOutputStream(FileDescriptor.err);
+			BufferedWriter outbufw;
 			if (outputEncoding != null)
-				bufw = new BufferedWriter(new OutputStreamWriter(outs,
+				outbufw = new BufferedWriter(new OutputStreamWriter(outs,
 						outputEncoding));
 			else
-				bufw = new BufferedWriter(new OutputStreamWriter(outs));
-			out = new PrintWriter(bufw);
-			outw = new ThrowingPrintWriter(bufw);
+				outbufw = new BufferedWriter(new OutputStreamWriter(outs));
+			out = new PrintWriter(outbufw);
+			outw = new ThrowingPrintWriter(outbufw);
+			BufferedWriter errbufw;
+			if (outputEncoding != null)
+				errbufw = new BufferedWriter(new OutputStreamWriter(errs,
+						outputEncoding));
+			else
+				errbufw = new BufferedWriter(new OutputStreamWriter(errs));
+			errw = new ThrowingPrintWriter(errbufw);
 		} catch (IOException e) {
 			throw die(CLIText.get().cannotCreateOutputStream);
 		}
@@ -184,15 +218,16 @@
 	 *
 	 * @param args
 	 *            the arguments supplied on the command line, if any.
+	 * @throws IOException
 	 */
-	protected void parseArguments(final String[] args) {
+	protected void parseArguments(final String[] args) throws IOException {
 		final CmdLineParser clp = new CmdLineParser(this);
 		try {
 			clp.parseArgument(args);
 		} catch (CmdLineException err) {
 			if (!help) {
-				System.err.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
-				System.exit(1);
+				this.errw.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
+				throw die(true);
 			}
 		}
 
@@ -207,8 +242,9 @@
 	 * Print the usage line
 	 *
 	 * @param clp
+	 * @throws IOException
 	 */
-	public void printUsageAndExit(final CmdLineParser clp) {
+	public void printUsageAndExit(final CmdLineParser clp) throws IOException {
 		printUsageAndExit("", clp); //$NON-NLS-1$
 	}
 
@@ -217,21 +253,21 @@
 	 *
 	 * @param message
 	 * @param clp
+	 * @throws IOException
 	 */
-	public void printUsageAndExit(final String message, final CmdLineParser clp) {
-		PrintWriter writer = new PrintWriter(System.err);
-		writer.println(message);
-		writer.print("jgit "); //$NON-NLS-1$
-		writer.print(commandName);
-		clp.printSingleLineUsage(writer, getResourceBundle());
-		writer.println();
+	public void printUsageAndExit(final String message, final CmdLineParser clp) throws IOException {
+		errw.println(message);
+		errw.print("jgit "); //$NON-NLS-1$
+		errw.print(commandName);
+		clp.printSingleLineUsage(errw, getResourceBundle());
+		errw.println();
 
-		writer.println();
-		clp.printUsage(writer, getResourceBundle());
-		writer.println();
+		errw.println();
+		clp.printUsage(errw, getResourceBundle());
+		errw.println();
 
-		writer.flush();
-		System.exit(1);
+		errw.flush();
+		throw die(true);
 	}
 
 	/**
@@ -288,6 +324,16 @@
 		return new Die(why, cause);
 	}
 
+	/**
+	 * @param aborted
+	 *            boolean indicating that the execution has been aborted before running
+	 * @return a runtime exception the caller is expected to throw
+	 * @since 3.4
+	 */
+	protected static Die die(boolean aborted) {
+		return new Die(aborted);
+	}
+
 	String abbreviateRef(String dst, boolean abbreviateRemote) {
 		if (dst.startsWith(R_HEADS))
 			dst = dst.substring(R_HEADS.length());
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 4ace0aa..447374d 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
@@ -82,6 +82,6 @@
 		up = new org.eclipse.jgit.transport.UploadPack(db);
 		if (0 <= timeout)
 			up.setTimeout(timeout);
-		up.upload(System.in, outs, System.err);
+		up.upload(ins, outs, errs);
 	}
 }
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 cd0236c..2140939 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
@@ -117,7 +117,7 @@
 	@Override
 	protected void run() throws Exception {
 		if (!really && !db.getRefDatabase().getRefs(ALL).isEmpty()) {
-			System.err.println(
+			errw.println(
 				MessageFormat.format(CLIText.get().fatalThisProgramWillDestroyTheRepository
 					, db.getDirectory().getAbsolutePath(), REALLY));
 			throw die(CLIText.get().needApprovalToDestroyCurrentRepository);
@@ -294,7 +294,7 @@
 					rw.parseAny(id);
 				} catch (MissingObjectException mue) {
 					if (!Constants.TYPE_COMMIT.equals(type)) {
-						System.err.println(MessageFormat.format(CLIText.get().skippingObject, type, name));
+						errw.println(MessageFormat.format(CLIText.get().skippingObject, type, name));
 						continue;
 					}
 					throw new MissingObjectException(id, type);
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 4f6d150..aa25807 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
@@ -43,14 +43,16 @@
 
 package org.eclipse.jgit.pgm.debug;
 
+import java.io.IOException;
 import java.net.URL;
 
-import org.kohsuke.args4j.Option;
 import org.eclipse.jgit.pgm.Command;
 import org.eclipse.jgit.pgm.CommandCatalog;
 import org.eclipse.jgit.pgm.CommandRef;
 import org.eclipse.jgit.pgm.TextBuiltin;
 import org.eclipse.jgit.pgm.internal.CLIText;
+import org.eclipse.jgit.util.io.ThrowingPrintWriter;
+import org.kohsuke.args4j.Option;
 
 @Command(usage = "usage_displayAListOfAllRegisteredJgitCommands")
 class ShowCommands extends TextBuiltin {
@@ -67,39 +69,39 @@
 		width += 2;
 
 		for (final CommandRef c : list) {
-			System.err.print(c.isCommon() ? '*' : ' ');
-			System.err.print(' ');
+			errw.print(c.isCommon() ? '*' : ' ');
+			errw.print(' ');
 
-			System.err.print(c.getName());
+			errw.print(c.getName());
 			for (int i = c.getName().length(); i < width; i++)
-				System.err.print(' ');
+				errw.print(' ');
 
-			pretty.print(c);
-			System.err.println();
+			pretty.print(errw, c);
+			errw.println();
 		}
-		System.err.println();
+		errw.println();
 	}
 
 	static enum Format {
 		/** */
 		USAGE {
-			void print(final CommandRef c) {
+			void print(ThrowingPrintWriter err, final CommandRef c) throws IOException {
 				String usage = c.getUsage();
 				if (usage != null && usage.length() > 0)
-					System.err.print(CLIText.get().resourceBundle().getString(usage));
+					err.print(CLIText.get().resourceBundle().getString(usage));
 			}
 		},
 
 		/** */
 		CLASSES {
-			void print(final CommandRef c) {
-				System.err.print(c.getImplementationClassName());
+			void print(ThrowingPrintWriter err, final CommandRef c) throws IOException {
+				err.print(c.getImplementationClassName());
 			}
 		},
 
 		/** */
 		URLS {
-			void print(final CommandRef c) {
+			void print(ThrowingPrintWriter err, final CommandRef c) throws IOException {
 				final ClassLoader ldr = c.getImplementationClassLoader();
 
 				String cn = c.getImplementationClassName();
@@ -107,7 +109,7 @@
 
 				final URL url = ldr.getResource(cn);
 				if (url == null) {
-					System.err.print(CLIText.get().notFound);
+					err.print(CLIText.get().notFound);
 					return;
 				}
 
@@ -115,10 +117,10 @@
 				if (rn.endsWith(cn))
 					rn = rn.substring(0, rn.length() - cn.length());
 
-				System.err.print(rn);
+				err.print(rn);
 			}
 		};
 
-		abstract void print(CommandRef c);
+		abstract void print(ThrowingPrintWriter err, CommandRef c) throws IOException;
 	}
 }
diff --git "a/org.eclipse.jgit.test/org.eclipse.jgit.core--All-Tests \050Java 8\051.launch" "b/org.eclipse.jgit.test/org.eclipse.jgit.core--All-Tests \050Java 8\051.launch"
new file mode 100644
index 0000000..04aa3ea
--- /dev/null
+++ "b/org.eclipse.jgit.test/org.eclipse.jgit.core--All-Tests \050Java 8\051.launch"
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.jgit.test/tst"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="2"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.jgit.test/tst"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;org.eclipse.jgit.test&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;org.eclipse.jgit.java7&quot; type=&quot;1&quot;/&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jgit.test"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx256m"/>
+</launchConfiguration>
diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml
index 47e47b4..5e011f9 100644
--- a/org.eclipse.jgit.test/pom.xml
+++ b/org.eclipse.jgit.test/pom.xml
@@ -66,7 +66,7 @@
     <profile>
       <id>jgit.java7</id>
       <activation>
-	<jdk>1.7</jdk>
+	<jdk>[1.7,)</jdk>
       </activation>
       <dependencies>
 	<dependency>
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java
index b92a636..4915954 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java
@@ -44,6 +44,7 @@
 package org.eclipse.jgit.api;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Map;
 
@@ -109,6 +110,19 @@
 	}
 
 	@Test
+	public void annotatedTagsNoResult() throws Exception {
+		RevCommit c = tr.commit().create();
+		tr.update("refs/heads/master", c);
+		tr.update("refs/tags/tag1", c);
+		tr.update("refs/tags/tag2", c);
+		Map<ObjectId, String> result = git.nameRev()
+				.add(c)
+				.addAnnotatedTags()
+				.call();
+		assertTrue(result.toString(), result.isEmpty());
+	}
+
+	@Test
 	public void simpleAncestor() throws Exception {
 		// 0--1--2
 		RevCommit c0 = tr.commit().create();
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 40eb494..c5829ec 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
@@ -2347,7 +2347,7 @@
 						assertFalse(messageFixupFile.exists());
 						assertTrue(messageSquashFile.exists());
 						assertEquals(
-								"# This is a combination of 2 commits.\n# This is the 2nd commit message:\nupdated file1 on master\nnew line\n# The first commit's message is:\nAdd file2\nnew line",
+								"# This is a combination of 2 commits.\n# The first commit's message is:\nAdd file2\nnew line\n# This is the 2nd commit message:\nupdated file1 on master\nnew line",
 								commit);
 
 						try {
@@ -2426,7 +2426,7 @@
 						assertFalse(messageFixupFile.exists());
 						assertTrue(messageSquashFile.exists());
 						assertEquals(
-								"# This is a combination of 3 commits.\n# This is the 3rd commit message:\nupdated file1 on master\nnew line\n# This is the 2nd commit message:\nAdd file2\nnew line\n# The first commit's message is:\nAdd file1\nnew line",
+								"# This is a combination of 3 commits.\n# The first commit's message is:\nAdd file1\nnew line\n# This is the 2nd commit message:\nAdd file2\nnew line\n# This is the 3rd commit message:\nupdated file1 on master\nnew line",
 								commit);
 
 						try {
@@ -2441,7 +2441,7 @@
 							fail(t.getMessage());
 						}
 
-						return "# This is a combination of 3 commits.\n# This is the 3rd commit message:\nupdated file1 on master\nnew line\n# This is the 2nd commit message:\nAdd file2\nnew line\n# The first commit's message is:\nAdd file1\nnew line";
+						return "# This is a combination of 3 commits.\n# The first commit's message is:\nAdd file1\nnew line\n# This is the 2nd commit message:\nAdd file2\nnew line\n# This is the 3rd commit message:\nupdated file1 on master\nnew line";
 					}
 				}).call();
 
@@ -2454,7 +2454,7 @@
 		ObjectId head2Id = db.resolve(Constants.HEAD + "^1");
 		RevCommit head1Commit = walk.parseCommit(head2Id);
 		assertEquals(
-				"updated file1 on master\nnew line\nAdd file2\nnew line\nAdd file1\nnew line",
+				"Add file1\nnew line\nAdd file2\nnew line\nupdated file1 on master\nnew line",
 				head1Commit.getFullMessage());
 	}
 
@@ -2508,7 +2508,7 @@
 						assertFalse(messageFixupFile.exists());
 						assertTrue(messageSquashFile.exists());
 						assertEquals(
-								"# This is a combination of 3 commits.\n# This is the 3rd commit message:\nupdated file1 on master\nnew line\n# The 2nd commit message will be skipped:\n# Add file2\n# new line\n# The first commit's message is:\nAdd file1\nnew line",
+								"# This is a combination of 3 commits.\n# The first commit's message is:\nAdd file1\nnew line\n# The 2nd commit message will be skipped:\n# Add file2\n# new line\n# This is the 3rd commit message:\nupdated file1 on master\nnew line",
 								commit);
 
 						try {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
index 0ade902..c7336da 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
@@ -45,6 +45,7 @@
 
 import static java.lang.Integer.valueOf;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 
 import java.io.File;
@@ -57,10 +58,16 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
+import org.eclipse.jgit.lib.ConfigConstants;
+import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Ref.Storage;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.RefUpdate.Result;
 import org.eclipse.jgit.revwalk.RevBlob;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.junit.Test;
 
 public class GcPackRefsTest extends GcTestCase {
@@ -177,4 +184,65 @@
 
 		assertEquals(repo.getRef("refs/tags/t").getObjectId(), b);
 	}
+
+	@Test
+	public void dontPackHEAD_nonBare() throws Exception {
+		BranchBuilder bb = tr.branch("refs/heads/side");
+		RevCommit first = bb.commit().add("A", "A").add("B", "B").create();
+		bb.commit().add("A", "A2").add("B", "B2").create();
+		Git git = Git.wrap(repo);
+
+		// check for the unborn branch master. HEAD should point to master and
+		// master doesn't exist.
+		assertEquals(repo.getRef("HEAD").getTarget().getName(),
+				"refs/heads/master");
+		assertNull(repo.getRef("HEAD").getTarget().getObjectId());
+		gc.packRefs();
+		assertSame(repo.getRef("HEAD").getStorage(), Storage.LOOSE);
+		assertEquals(repo.getRef("HEAD").getTarget().getName(),
+				"refs/heads/master");
+		assertNull(repo.getRef("HEAD").getTarget().getObjectId());
+
+		git.checkout().setName("refs/heads/side").call();
+		gc.packRefs();
+		assertSame(repo.getRef("HEAD").getStorage(), Storage.LOOSE);
+
+		// check for detached HEAD
+		git.checkout().setName(first.getName()).call();
+		gc.packRefs();
+		assertSame(repo.getRef("HEAD").getStorage(), Storage.LOOSE);
+	}
+
+	@Test
+	public void dontPackHEAD_bare() throws Exception {
+		BranchBuilder bb = tr.branch("refs/heads/side");
+		bb.commit().add("A", "A").add("B", "B").create();
+		RevCommit second = bb.commit().add("A", "A2").add("B", "B2").create();
+
+		// Convert the repo to be bare
+		FileBasedConfig cfg = repo.getConfig();
+		cfg.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null,
+				ConfigConstants.CONFIG_KEY_BARE, true);
+		cfg.save();
+		Git git = Git.open(repo.getDirectory());
+		repo = (FileRepository) git.getRepository();
+
+		// check for the unborn branch master. HEAD should point to master and
+		// master doesn't exist.
+		assertEquals(repo.getRef("HEAD").getTarget().getName(),
+				"refs/heads/master");
+		assertNull(repo.getRef("HEAD").getTarget().getObjectId());
+		gc.packRefs();
+		assertSame(repo.getRef("HEAD").getStorage(), Storage.LOOSE);
+		assertEquals(repo.getRef("HEAD").getTarget().getName(),
+				"refs/heads/master");
+		assertNull(repo.getRef("HEAD").getTarget().getObjectId());
+
+		// check for non-detached HEAD
+		repo.updateRef(Constants.HEAD).link("refs/heads/side");
+		gc.packRefs();
+		assertSame(repo.getRef("HEAD").getStorage(), Storage.LOOSE);
+		assertEquals(repo.getRef("HEAD").getTarget().getObjectId(),
+				second.getId());
+	}
 }
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 3f58b75..9fc7fca 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
@@ -1493,8 +1493,8 @@
 		}
 
 		StringBuilder b = new StringBuilder();
-		entry(b, "100644 \u00C1");
-		entry(b, "100644 \u004a\u0301");
+		entry(b, "100644 \u0065\u0301");
+		entry(b, "100644 \u00e9");
 		byte[] data = b.toString().getBytes("UTF-8");
 		try {
 			checker.setSafeForMacOS(true);
@@ -1506,6 +1506,15 @@
 	}
 
 	@Test
+	public void testInvalidTreeDuplicateNames8()
+			throws UnsupportedEncodingException, CorruptObjectException {
+		StringBuilder b = new StringBuilder();
+		entry(b, "100644 A");
+		checker.setSafeForMacOS(true);
+		checker.checkTree(b.toString().getBytes("UTF-8"));
+	}
+
+	@Test
 	public void testRejectNulInPathSegment() {
 		try {
 			checker.checkPathSegment(Constants.encodeASCII("a\u0000b"), 0, 3);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java
index 2f8bfb3..e9d46bb 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java
@@ -51,7 +51,47 @@
 
 public class ValidRefNameTest {
 	private static void assertValid(final boolean exp, final String name) {
-		assertEquals("\"" + name + "\"", exp, Repository.isValidRefName(name));
+		SystemReader instance = SystemReader.getInstance();
+		try {
+			setUnixSystemReader();
+			assertEquals("\"" + name + "\"", exp,
+					Repository.isValidRefName(name));
+			setWindowsSystemReader();
+			assertEquals("\"" + name + "\"", exp,
+					Repository.isValidRefName(name));
+		} finally {
+			SystemReader.setInstance(instance);
+		}
+	}
+
+	private static void setWindowsSystemReader() {
+		SystemReader.setInstance(new MockSystemReader() {
+			{
+				setWindows();
+			}
+		});
+	}
+
+	private static void setUnixSystemReader() {
+		SystemReader.setInstance(new MockSystemReader() {
+			{
+				setUnix();
+			}
+		});
+	}
+
+	private static void assertInvalidOnWindows(final String name) {
+		SystemReader instance = SystemReader.getInstance();
+		try {
+			setUnixSystemReader();
+			assertEquals("\"" + name + "\"", true,
+					Repository.isValidRefName(name));
+			setWindowsSystemReader();
+			assertEquals("\"" + name + "\"", false,
+					Repository.isValidRefName(name));
+		} finally {
+			SystemReader.setInstance(instance);
+		}
 	}
 
 	@Test
@@ -153,9 +193,8 @@
 	}
 
 	@Test
-	public void testValidSpecialCharacters() {
+	public void testValidSpecialCharacterUnixs() {
 		assertValid(true, "refs/heads/!");
-		assertValid(true, "refs/heads/\"");
 		assertValid(true, "refs/heads/#");
 		assertValid(true, "refs/heads/$");
 		assertValid(true, "refs/heads/%");
@@ -167,21 +206,24 @@
 		assertValid(true, "refs/heads/,");
 		assertValid(true, "refs/heads/-");
 		assertValid(true, "refs/heads/;");
-		assertValid(true, "refs/heads/<");
 		assertValid(true, "refs/heads/=");
-		assertValid(true, "refs/heads/>");
 		assertValid(true, "refs/heads/@");
 		assertValid(true, "refs/heads/]");
 		assertValid(true, "refs/heads/_");
 		assertValid(true, "refs/heads/`");
 		assertValid(true, "refs/heads/{");
-		assertValid(true, "refs/heads/|");
 		assertValid(true, "refs/heads/}");
 
 		// This is valid on UNIX, but not on Windows
 		// hence we make in invalid due to non-portability
 		//
 		assertValid(false, "refs/heads/\\");
+
+		// More invalid characters on Windows, but we allow them
+		assertInvalidOnWindows("refs/heads/\"");
+		assertInvalidOnWindows("refs/heads/<");
+		assertInvalidOnWindows("refs/heads/>");
+		assertInvalidOnWindows("refs/heads/|");
 	}
 
 	@Test
@@ -197,22 +239,12 @@
 
 	@Test
 	public void testWindowsReservedNames() {
-		SystemReader original = SystemReader.getInstance();
-		try {
-			SystemReader.setInstance(new MockSystemReader() {
-				public boolean isWindows() {
-					return true;
-				}
-			});
-			// re-using code from DirCacheCheckoutTest, hence
-			// only testing for one of the special names.
-			assertValid(false, "refs/heads/con");
-			assertValid(false, "refs/con/x");
-			assertValid(false, "con/heads/x");
-			assertValid(true, "refs/heads/conx");
-			assertValid(true, "refs/heads/xcon");
-		} finally {
-			SystemReader.setInstance(original);
-		}
+		// re-using code from DirCacheCheckoutTest, hence
+		// only testing for one of the special names.
+		assertInvalidOnWindows("refs/heads/con");
+		assertInvalidOnWindows("refs/con/x");
+		assertInvalidOnWindows("con/heads/x");
+		assertValid(true, "refs/heads/conx");
+		assertValid(true, "refs/heads/xcon");
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java
index 34ea584..51110b1 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java
@@ -277,6 +277,11 @@
 		git.add().addFilepattern("file").call();
 		writeTrashFile("file", "conten2");
 		f.setLastModified(lastModified);
+		// We cannot trust this to go fast enough on
+		// a system with less than one-second lastModified
+		// resolution, so we force the index to have the
+		// same timestamp as the file we look at.
+		db.getIndexFile().setLastModified(lastModified);
 		DirCacheEntry dce = db.readDirCache().getEntry("file");
 		FileTreeIterator fti = new FileTreeIterator(trash, db.getFS(), db
 				.getConfig().get(WorkingTreeOptions.KEY));
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 0752dce..4d32235 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
@@ -74,7 +74,7 @@
  * <li>Commit graph and short message</li>
  * <li>Author name and email address</li>
  * <li>Author date and time</li>
- * </ul>
+ * </ol>
  */
 public class CommitGraphPane extends JTable {
 	private static final long serialVersionUID = 1L;
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 57c08f3..3bc682b 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
@@ -266,7 +266,7 @@
 invalidLineInConfigFile=Invalid line in config file
 invalidModeFor=Invalid mode {0} for {1} {2} in {3}.
 invalidModeForPath=Invalid mode {0} for path {1}
-invalidObject=Invalid {0} {1}:{2}
+invalidObject=Invalid {0} {1}: {2}
 invalidOldIdSent=invalid old id sent
 invalidPacketLineHeader=Invalid packet line header: {0}
 invalidPath=Invalid path: {0}
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 6feb186..2ca8422 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java
@@ -142,7 +142,7 @@
 	 * @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/>
+	 *         <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.
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 d8e73e3..6f0313d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java
@@ -107,7 +107,7 @@
 	/**
 	 * The modes available for fast forward merges corresponding to the
 	 * <code>--ff</code>, <code>--no-ff</code> and <code>--ff-only</code>
-	 * options under <code>branch.<name>.mergeoptions</code>.
+	 * options under <code>branch.&lt;name&gt;.mergeoptions</code>.
 	 */
 	public enum FastForwardMode implements ConfigEnum {
 		/**
@@ -162,7 +162,7 @@
 			 *
 			 * @param ffMode
 			 *            the <code>FastForwardMode</code> value to be mapped
-			 * @return the mapped code>FastForwardMode.Merge</code> value
+			 * @return the mapped <code>FastForwardMode.Merge</code> value
 			 */
 			public static Merge valueOf(FastForwardMode ffMode) {
 				switch (ffMode) {
@@ -182,7 +182,7 @@
 		 *
 		 * @param ffMode
 		 *            the <code>FastForwardMode.Merge</code> value to be mapped
-		 * @return the mapped code>FastForwardMode</code> value
+		 * @return the mapped <code>FastForwardMode</code> value
 		 */
 		public static FastForwardMode valueOf(FastForwardMode.Merge ffMode) {
 			switch (ffMode) {
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 30edf96..2def12f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeResult.java
@@ -464,32 +464,36 @@
 	 * 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"->[x][y]=z then this means
+	 * If the returned value contains a mapping "path"-&gt;[x][y]=z then this
+	 * means
 	 * <ul>
 	 * <li>the file with path "path" contains conflicts</li>
-	 * <li>if y < "number of merged commits": for conflict number x in this file
-	 * the chunk which was copied from commit number y starts on line number z.
-	 * All numberings and line numbers start with 0.</li>
+	 * <li>if y &lt; "number of merged commits": for conflict number x in this
+	 * file the chunk which was copied from commit number y starts on line
+	 * number z. All numberings and line numbers start with 0.</li>
 	 * <li>if y == "number of merged commits": the first non-conflicting line
 	 * after conflict number x starts at line number z</li>
 	 * </ul>
 	 * <p>
 	 * Example code how to parse this data:
-	 * <pre> MergeResult m=...;
-	 * Map<String, int[][]> allConflicts = m.getConflicts();
+	 *
+	 * <pre>
+	 * MergeResult m=...;
+	 * Map&lt;String, int[][]&gt; allConflicts = m.getConflicts();
 	 * for (String path : allConflicts.keySet()) {
 	 * 	int[][] c = allConflicts.get(path);
 	 * 	System.out.println("Conflicts in file " + path);
 	 * 	for (int i = 0; i < c.length; ++i) {
 	 * 		System.out.println("  Conflict #" + i);
-	 * 		for (int j = 0; j < (c[i].length) - 1; ++j) {
+	 * 		for (int j = 0; j &lt;	 (c[i].length) - 1; ++j) {
 	 * 			if (c[i][j] >= 0)
 	 * 				System.out.println("    Chunk for "
 	 * 						+ m.getMergedCommits()[j] + " starts on line #"
 	 * 						+ c[i][j]);
 	 * 		}
 	 * 	}
-	 * }</pre>
+	 * }
+	 * </pre>
 	 *
 	 * @return the conflicts or <code>null</code> if no conflict 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 95a1f35..cce42fc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java
@@ -112,8 +112,8 @@
 
 	private final RevWalk walk;
 	private final List<String> prefixes;
-	private final List<Ref> refs;
 	private final List<ObjectId> revs;
+	private List<Ref> refs;
 	private int mergeCost;
 
 	/**
@@ -125,7 +125,6 @@
 		super(repo);
 		mergeCost = MERGE_COST;
 		prefixes = new ArrayList<String>(2);
-		refs = new ArrayList<Ref>();
 		revs = new ArrayList<ObjectId>(2);
 		walk = new RevWalk(repo) {
 			@Override
@@ -140,8 +139,10 @@
 		try {
 			Map<ObjectId, String> nonCommits = new HashMap<ObjectId, String>();
 			FIFORevQueue pending = new FIFORevQueue();
-			for (Ref ref : refs)
-				addRef(ref, nonCommits, pending);
+			if (refs != null) {
+				for (Ref ref : refs)
+					addRef(ref, nonCommits, pending);
+			}
 			addPrefixes(nonCommits, pending);
 			int cutoff = minCommitTime() - COMMIT_TIME_SLOP;
 
@@ -273,6 +274,8 @@
 	 */
 	public NameRevCommand addAnnotatedTags() {
 		checkCallable();
+		if (refs == null)
+			refs = new ArrayList<Ref>();
 		try {
 			for (Ref ref : repo.getRefDatabase().getRefs(Constants.R_TAGS).values()) {
 				ObjectId id = ref.getObjectId();
@@ -298,6 +301,8 @@
 	 */
 	public NameRevCommand addRef(Ref ref) {
 		checkCallable();
+		if (refs == null)
+			refs = new ArrayList<Ref>();
 		refs.add(ref);
 		return this;
 	}
@@ -312,7 +317,7 @@
 		if (!prefixes.isEmpty()) {
 			for (String prefix : prefixes)
 				addPrefix(prefix, nonCommits, pending);
-		} else if (refs.isEmpty())
+		} else if (refs == null)
 			addPrefix(Constants.R_REFS, nonCommits, pending);
 	}
 
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 c157f14..d92adfe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java
@@ -111,16 +111,18 @@
 
 	/**
 	 * Set if rebase should be used after fetching. If set to true, rebase is
-	 * used instead of merge. This is equivalent to --rebase on the command line.
-	 * <p/>
-	 * If set to false, merge is used after fetching, overriding the configuration
-	 * file. This is equivalent to --no-rebase on the command line.
-	 * <p/>
-	 * This setting overrides the settings in the configuration file.
-	 * By default, the setting in the repository configuration file is used.
-	 * <p/>
-	 * A branch can be configured to use rebase by default.
-	 * See branch.[name].rebase and branch.autosetuprebase.
+	 * used instead of merge. This is equivalent to --rebase on the command
+	 * line.
+	 * <p>
+	 * If set to false, merge is used after fetching, overriding the
+	 * configuration file. This is equivalent to --no-rebase on the command
+	 * line.
+	 * <p>
+	 * This setting overrides the settings in the configuration file. By
+	 * default, the setting in the repository configuration file is used.
+	 * <p>
+	 * A branch can be configured to use rebase by default. See
+	 * branch.[name].rebase and branch.autosetuprebase.
 	 *
 	 * @param useRebase
 	 * @return {@code this}
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 cb1e6cf..3b84917 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -162,7 +162,7 @@
 
 	private static final String AUTOSTASH = "autostash"; //$NON-NLS-1$
 
-	private static final String AUTOSTASH_MSG = "On {0}: autostash";
+	private static final String AUTOSTASH_MSG = "On {0}: autostash"; //$NON-NLS-1$
 
 	/**
 	 * The available operations
@@ -621,6 +621,9 @@
 		sb.setLength(0);
 		sb.append("# This is a combination of ").append(count)
 				.append(" commits.\n");
+		// Add the previous message without header (i.e first line)
+		sb.append(currSquashMessage.substring(currSquashMessage.indexOf("\n") + 1));
+		sb.append("\n");
 		if (isSquash) {
 			sb.append("# This is the ").append(count).append(ordinal)
 					.append(" commit message:\n");
@@ -631,9 +634,6 @@
 			sb.append(commitToPick.getFullMessage().replaceAll("([\n\r])",
 					"$1# "));
 		}
-		// Add the previous message without header (i.e first line)
-		sb.append("\n");
-		sb.append(currSquashMessage.substring(currSquashMessage.indexOf("\n") + 1));
 		return sb.toString();
 	}
 
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 06b2aec..24409ee 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java
@@ -372,7 +372,7 @@
 	 * <li><i>file modify</i>: always {@link #getOldPath()}</li>
 	 * <li><i>file delete</i>: always <code>/dev/null</code></li>
 	 * <li><i>file copy</i>: destination file the copy ends up at</li>
-	 * <li><i>file rename</i>: destination file the rename ends up at/li>
+	 * <li><i>file rename</i>: destination file the rename ends up at</li>
 	 * </ul>
 	 *
 	 * @return new name for this file.
@@ -453,7 +453,7 @@
 	 * <pre>
 	 * TreeFilter filterA = ...;
 	 * TreeFilter filterB = ...;
-	 * List<DiffEntry> entries = DiffEntry.scan(walk, false, filterA, filterB);
+	 * List&lt;DiffEntry&gt; entries = DiffEntry.scan(walk, false, filterA, filterB);
 	 * DiffEntry entry = entries.get(0);
 	 * boolean filterAMatched = entry.isMarked(0);
 	 * boolean filterBMatched = entry.isMarked(1);
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 684c066..57a2018 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java
@@ -51,16 +51,16 @@
  * Regions should be specified using 0 based notation, so add 1 to the start and
  * end marks for line numbers in a file.
  * <p>
- * An edit where <code>beginA == endA && beginB < endB</code> is an insert edit,
- * that is sequence B inserted the elements in region
+ * An edit where <code>beginA == endA && beginB &lt; endB</code> is an insert
+ * edit, that is sequence B inserted the elements in region
  * <code>[beginB, endB)</code> at <code>beginA</code>.
  * <p>
- * An edit where <code>beginA < endA && beginB == endB</code> is a delete edit,
- * that is sequence B has removed the elements between
+ * An edit where <code>beginA &lt; endA && beginB == endB</code> is a delete
+ * edit, that is sequence B has removed the elements between
  * <code>[beginA, endA)</code>.
  * <p>
- * An edit where <code>beginA < endA && beginB < endB</code> is a replace edit,
- * that is sequence B has replaced the range of elements between
+ * An edit where <code>beginA &lt; endA && beginB &lt; endB</code> is a replace
+ * edit, that is sequence B has replaced the range of elements between
  * <code>[beginA, endA)</code> with those found in <code>[beginB, endB)</code>.
  */
 public class Edit {
@@ -105,11 +105,11 @@
 	 * @param as
 	 *            beginA: start of region in sequence A; 0 based.
 	 * @param ae
-	 *            endA: end of region in sequence A; must be >= as.
+	 *            endA: end of region in sequence A; must be &gt;= as.
 	 * @param bs
 	 *            beginB: start of region in sequence B; 0 based.
 	 * @param be
-	 *            endB: end of region in sequence B; must be >= bs.
+	 *            endB: end of region in sequence B; must be &gt; = bs.
 	 */
 	public Edit(final int as, final int ae, final int bs, final int be) {
 		beginA = as;
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 86af86d..a415ad3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/MyersDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/MyersDiff.java
@@ -167,11 +167,21 @@
 	}
 
 	/**
-	 * Calculates the differences between a given part of A against another given part of B
-	 * @param beginA start of the part of A which should be compared (0<=beginA<sizeof(A))
-	 * @param endA end of the part of A which should be compared (beginA<=endA<sizeof(A))
-	 * @param beginB start of the part of B which should be compared (0<=beginB<sizeof(B))
-	 * @param endB end of the part of B which should be compared (beginB<=endB<sizeof(B))
+	 * Calculates the differences between a given part of A against another
+	 * given part of B
+	 *
+	 * @param beginA
+	 *            start of the part of A which should be compared
+	 *            (0&lt;=beginA&lt;sizeof(A))
+	 * @param endA
+	 *            end of the part of A which should be compared
+	 *            (beginA&lt;=endA&lt;sizeof(A))
+	 * @param beginB
+	 *            start of the part of B which should be compared
+	 *            (0&lt;=beginB&lt;sizeof(B))
+	 * @param endB
+	 *            end of the part of B which should be compared
+	 *            (beginB&lt;=endB&lt;sizeof(B))
 	 */
 	protected void calculateEdits(int beginA, int endA,
 			int beginB, int endB) {
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 68e088b..645de27 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
@@ -730,14 +730,14 @@
 	}
 
 	/**
-	 * Locate the position a path's entry is at in the index.
-	 * For details refer to #findEntry(byte[], int).
+	 * Locate the position a path's entry is at in the index. For details refer
+	 * to #findEntry(byte[], int).
 	 *
 	 * @param path
 	 *            the path to search for.
-	 * @return if >= 0 then the return value is the position of the entry in the
-	 *         index; pass to {@link #getEntry(int)} to obtain the entry
-	 *         information. If < 0 the entry does not exist in the index.
+	 * @return if &gt;= 0 then the return value is the position of the entry in
+	 *         the index; pass to {@link #getEntry(int)} to obtain the entry
+	 *         information. If &lt; 0 the entry does not exist in the index.
 	 */
 	public int findEntry(final String path) {
 		final byte[] p = Constants.encode(path);
@@ -758,9 +758,9 @@
 	 *            the byte array starting with the path to search for.
 	 * @param pLen
 	 *            the length of the path in bytes
-	 * @return if >= 0 then the return value is the position of the entry in the
-	 *         index; pass to {@link #getEntry(int)} to obtain the entry
-	 *         information. If < 0 the entry does not exist in the index.
+	 * @return if &gt;= 0 then the return value is the position of the entry in
+	 *         the index; pass to {@link #getEntry(int)} to obtain the entry
+	 *         information. If &lt; 0 the entry does not exist in the index.
 	 * @since 3.4
 	 */
 	public int findEntry(final byte[] p, final int pLen) {
@@ -917,7 +917,7 @@
 	 *            returned tree identity.
 	 * @return identity for the root tree.
 	 * @throws UnmergedPathException
-	 *             one or more paths contain higher-order stages (stage > 0),
+	 *             one or more paths contain higher-order stages (stage &gt; 0),
 	 *             which cannot be stored in a tree object.
 	 * @throws IllegalStateException
 	 *             one or more paths contain an invalid mode which should never
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 650accc..65188c8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java
@@ -548,7 +548,7 @@
 	 * <p>
 	 * Note that this is the length of the file in the working directory, which
 	 * may differ from the size of the decompressed blob if work tree filters
-	 * are being used, such as LF<->CRLF conversion.
+	 * are being used, such as LF&lt;-&gt;CRLF conversion.
 	 * <p>
 	 * Note also that for very large files, this is the size of the on-disk file
 	 * truncated to 32 bits, i.e. modulo 4294967296. If that value is larger
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 6104233..c6ea093 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/CorruptObjectException.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/CorruptObjectException.java
@@ -90,4 +90,19 @@
 	public CorruptObjectException(final String why) {
 		super(why);
 	}
+
+	/**
+	 * Construct a CorruptObjectException for reporting a problem not associated
+	 * with a specific object id.
+	 *
+	 * @param why
+	 *            message describing the corruption.
+	 * @param cause
+	 *            optional root cause exception
+	 * @since 3.4
+	 */
+	public CorruptObjectException(String why, Throwable cause) {
+		super(why);
+		initCause(cause);
+	}
 }
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 02e4235..92a4837 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/FileNameMatcher.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/fnmatch/FileNameMatcher.java
@@ -80,7 +80,6 @@
  * </ul>
  * e. g. [[:xdigit:]]</li>
  * </ul>
- * </p>
  * Any character can be escaped by prepending it with a \
  */
 public class FileNameMatcher {
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 6784b49..593aaac 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
@@ -56,6 +56,7 @@
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefRename;
+import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.SymbolicRef;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
@@ -211,7 +212,7 @@
 	}
 
 	@Override
-	public DfsRefUpdate newUpdate(String refName, boolean detach)
+	public RefUpdate newUpdate(String refName, boolean detach)
 			throws IOException {
 		boolean detachingSymbolicRef = false;
 		Ref ref = getOneRef(refName);
@@ -233,8 +234,8 @@
 	@Override
 	public RefRename newRename(String fromName, String toName)
 			throws IOException {
-		DfsRefUpdate src = newUpdate(fromName, true);
-		DfsRefUpdate dst = newUpdate(toName, true);
+		RefUpdate src = newUpdate(fromName, true);
+		RefUpdate dst = newUpdate(toName, true);
 		return new DfsRefRename(src, dst);
 	}
 
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 a4cb791..d9c2bc7 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
@@ -47,10 +47,11 @@
 
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.RefRename;
+import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.RefUpdate.Result;
 
 final class DfsRefRename extends RefRename {
-	DfsRefRename(DfsRefUpdate src, DfsRefUpdate dst) {
+	DfsRefRename(RefUpdate src, RefUpdate dst) {
 		super(src, dst);
 	}
 
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 e06ff65..3cc4e7b 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
@@ -481,7 +481,7 @@
 	 * @throws IOException
 	 */
 	public void packRefs() throws IOException {
-		Collection<Ref> refs = repo.getRefDatabase().getRefs(ALL).values();
+		Collection<Ref> refs = repo.getRefDatabase().getRefs(Constants.R_REFS).values();
 		List<String> refsToBePacked = new ArrayList<String>(refs.size());
 		pm.beginTask(JGitText.get().packRefs, refs.size());
 		try {
@@ -714,26 +714,27 @@
 						JGitText.get().cannotCreateIndexfile, tmpIdx.getPath()));
 
 			// write the packfile
-			@SuppressWarnings("resource" /* java 7 */)
-			FileChannel channel = new FileOutputStream(tmpPack).getChannel();
+			FileOutputStream fos = new FileOutputStream(tmpPack);
+			FileChannel channel = fos.getChannel();
 			OutputStream channelStream = Channels.newOutputStream(channel);
 			try {
 				pw.writePack(pm, pm, channelStream);
 			} finally {
 				channel.force(true);
 				channelStream.close();
-				channel.close();
+				fos.close();
 			}
 
 			// write the packindex
-			FileChannel idxChannel = new FileOutputStream(tmpIdx).getChannel();
+			fos = new FileOutputStream(tmpIdx);
+			FileChannel idxChannel = fos.getChannel();
 			OutputStream idxStream = Channels.newOutputStream(idxChannel);
 			try {
 				pw.writeIndex(idxStream);
 			} finally {
 				idxChannel.force(true);
 				idxStream.close();
-				idxChannel.close();
+				fos.close();
 			}
 
 			if (pw.prepareBitmapIndex(pm)) {
@@ -745,14 +746,15 @@
 							JGitText.get().cannotCreateIndexfile,
 							tmpBitmapIdx.getPath()));
 
-				idxChannel = new FileOutputStream(tmpBitmapIdx).getChannel();
+				fos = new FileOutputStream(tmpBitmapIdx);
+				idxChannel = fos.getChannel();
 				idxStream = Channels.newOutputStream(idxChannel);
 				try {
 					pw.writeBitmapIndex(idxStream);
 				} finally {
 					idxChannel.force(true);
 					idxStream.close();
-					idxChannel.close();
+					fos.close();
 				}
 			}
 
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 a712259..f3791e6 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
@@ -132,11 +132,13 @@
  * <li>by providing iterator of {@link RevObject} specifying exact list and
  * order of objects in pack</li>
  * </ul>
+ * <p>
  * Typical usage consists of creating instance intended for some pack,
  * configuring options, preparing the list of objects by calling
  * {@link #preparePack(Iterator)} or
  * {@link #preparePack(ProgressMonitor, Collection, Collection)}, and finally
- * producing the stream with {@link #writePack(ProgressMonitor, ProgressMonitor, OutputStream)}.
+ * producing the stream with
+ * {@link #writePack(ProgressMonitor, ProgressMonitor, OutputStream)}.
  * </p>
  * <p>
  * Class provide set of configurable options and {@link ProgressMonitor}
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 87dabd4..29a379e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AbbreviatedObjectId.java
@@ -325,7 +325,7 @@
 		return NB.compareUInt32(w5, mask(5, bs[p + 4]));
 	}
 
-	/** @return value for a fan-out style map, only valid of length >= 2. */
+	/** @return value for a fan-out style map, only valid of length &gt;= 2. */
 	public final int getFirstByte() {
 		return w1 >>> 24;
 	}
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 9db4a61..11081d5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
@@ -156,8 +156,8 @@
 	 *
 	 * @param other
 	 *            the other id to compare to. Must not be null.
-	 * @return < 0 if this id comes before other; 0 if this id is equal to
-	 *         other; > 0 if this id comes after other.
+	 * @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.
 	 */
 	public final int compareTo(final AnyObjectId other) {
 		if (this == other)
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 18adb9a..962f2e7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java
@@ -64,13 +64,13 @@
 
 	/** Permissible values for {@code core.autocrlf}. */
 	public static enum AutoCRLF {
-		/** Automatic CRLF->LF conversion is disabled. */
+		/** Automatic CRLF-&gt;LF conversion is disabled. */
 		FALSE,
 
-		/** Automatic CRLF->LF conversion is enabled. */
+		/** Automatic CRLF-&gt;LF conversion is enabled. */
 		TRUE,
 
-		/** CRLF->LF performed, but no LF->CRLF. */
+		/** CRLF-&gt;LF performed, but no LF-&gt;CRLF. */
 		INPUT;
 	}
 
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 1b135a9..d8a70c1 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java
@@ -382,7 +382,7 @@
 				throw new CorruptObjectException("truncated in name");
 			checkPathSegment2(raw, thisNameB, ptr);
 			if (normalized != null) {
-				if (normalized.add(normalize(raw, thisNameB, ptr)))
+				if (!normalized.add(normalize(raw, thisNameB, ptr)))
 					throw new CorruptObjectException("duplicate entry names");
 			} else if (duplicateName(raw, thisNameB, ptr))
 				throw new CorruptObjectException("duplicate entry names");
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 f14488b..c6e1029 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefComparator.java
@@ -66,7 +66,7 @@
 
 	/**
 	 * Sorts the collection of refs, returning a new collection.
-	 * 
+	 *
 	 * @param refs
 	 *            collection to be sorted
 	 * @return sorted collection of refs
@@ -79,12 +79,12 @@
 
 	/**
 	 * Compare a reference to a name.
-	 * 
+	 *
 	 * @param o1
 	 *            the reference instance.
 	 * @param o2
 	 *            the name to compare to.
-	 * @return standard Comparator result of < 0, 0, > 0.
+	 * @return standard Comparator result of &lt; 0, 0, &gt; 0.
 	 */
 	public static int compareTo(Ref o1, String o2) {
 		return o1.getName().compareTo(o2);
@@ -92,12 +92,12 @@
 
 	/**
 	 * Compare two references by name.
-	 * 
+	 *
 	 * @param o1
 	 *            the reference instance.
 	 * @param o2
 	 *            the other reference instance.
-	 * @return standard Comparator result of < 0, 0, > 0.
+	 * @return standard Comparator result of &lt; 0, 0, &gt; 0.
 	 */
 	public static int compareTo(final Ref o1, final Ref o2) {
 		return o1.getName().compareTo(o2.getName());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tree.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tree.java
index d257ba9..43bd489 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tree.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tree.java
@@ -81,7 +81,7 @@
 	 * @param lasta '/' if a is a tree, else NUL
 	 * @param lastb '/' if b is a tree, else NUL
 	 *
-	 * @return < 0 if a is sorted before b, 0 if they are the same, else b
+	 * @return &lt; 0 if a is sorted before b, 0 if they are the same, else b
 	 */
 	public static final int compareNames(final byte[] a, final byte[] b, final int lasta,final int lastb) {
 		return compareNames(a, b, 0, b.length, lasta, lastb);
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 db0694b..065b8f4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/TreeFormatter.java
@@ -111,7 +111,7 @@
 	}
 
 	/**
-	 * Add a link to a submodule commit, mode is {@link #GITLINK}.
+	 * Add a link to a submodule commit, mode is {@link FileMode#GITLINK}.
 	 *
 	 * @param name
 	 *            name of the entry.
@@ -123,7 +123,7 @@
 	}
 
 	/**
-	 * Add a subtree, mode is {@link #TREE}.
+	 * Add a subtree, mode is {@link FileMode#TREE}.
 	 *
 	 * @param name
 	 *            name of the entry.
@@ -135,7 +135,7 @@
 	}
 
 	/**
-	 * Add a regular file, mode is {@link #REGULAR_FILE}.
+	 * Add a regular file, mode is {@link FileMode#REGULAR_FILE}.
 	 *
 	 * @param name
 	 *            name of the entry.
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 1ba8086..eed1dcf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java
@@ -68,7 +68,7 @@
 	 *            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 "<<<<<<< " or ">>>>>>> "
+	 *            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
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 9624e49..db49448 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/DefaultNoteMerger.java
@@ -82,8 +82,12 @@
 		ObjectLoader lt = reader.open(theirs.getData());
 		UnionInputStream union = new UnionInputStream(lo.openStream(),
 				lt.openStream());
-		ObjectId noteData = inserter.insert(Constants.OBJ_BLOB,
-				lo.getSize() + lt.getSize(), union);
-		return new Note(ours, noteData);
+		try {
+			ObjectId noteData = inserter.insert(Constants.OBJ_BLOB,
+					lo.getSize() + lt.getSize(), union);
+			return new Note(ours, noteData);
+		} finally {
+			union.close();
+		}
 	}
 }
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 f233923..b061d6a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FooterLine.java
@@ -124,7 +124,7 @@
 	 * Extract the email address (if present) from the footer.
 	 * <p>
 	 * If there is an email address looking string inside of angle brackets
-	 * (e.g. "<a@b>"), the return value is the part extracted from inside the
+	 * (e.g. "&lt;a@b&gt;"), the return value is the part extracted from inside the
 	 * brackets. If no brackets are found, then {@link #getValue()} is returned
 	 * if the value contains an '@' sign. Otherwise, null.
 	 *
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 3498059..835e0ce 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitList.java
@@ -344,7 +344,8 @@
 	 * walker specified by {@link #source(RevWalk)} is pumped until the
 	 * specified commit is loaded. Callers can test the final size of the list
 	 * by {@link #size()} to determine if the high water mark specified was met.
-	 * <p/>
+	 * <p>
+	 *
 	 * @param commitToLoad
 	 *            commit the caller wants this list to contain when the fill
 	 *            operation is complete.
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 e321953..a8835b7 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
@@ -599,7 +599,7 @@
 	 * Default setting: 0 (auto-detect processors)
 	 *
 	 * @param threads
-	 *            number of threads to use. If <= 0 the number of available
+	 *            number of threads to use. If &lt;= 0 the number of available
 	 *            processors for this JVM is used.
 	 */
 	public void setThreads(int threads) {
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 d701488..36d429a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
@@ -148,6 +148,9 @@
 			FS fs, String user, final String pass, String host, int port,
 			final OpenSshConfig.Host hc) throws JSchException {
 		final Session session = createSession(hc, user, host, port, fs);
+		// We retry already in getSession() method. JSch must not retry
+		// on its own.
+		session.setConfig("MaxAuthTries", "1"); //$NON-NLS-1$ //$NON-NLS-2$
 		if (pass != null)
 			session.setPassword(pass);
 		final String strictHostKeyCheckingPolicy = hc
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 93522c1..c3fdacc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
@@ -1014,9 +1014,11 @@
 			try {
 				objCheck.check(type, data);
 			} catch (CorruptObjectException e) {
-				throw new IOException(MessageFormat.format(
-						JGitText.get().invalidObject, Constants
-								.typeString(type), id.name(), e.getMessage()));
+				throw new CorruptObjectException(MessageFormat.format(
+						JGitText.get().invalidObject,
+						Constants.typeString(type),
+						readCurs.abbreviate(id, 10).name(),
+						e.getMessage()), e);
 			}
 		}
 
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 fe55e23..5885e7b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
@@ -471,12 +471,14 @@
 					if (authMethod == HttpAuthMethod.NONE)
 						throw new TransportException(uri, MessageFormat.format(
 								JGitText.get().authenticationNotSupported, uri));
-					if (1 < authAttempts
-							|| !authMethod.authorize(uri,
-									getCredentialsProvider())) {
+					CredentialsProvider credentialsProvider = getCredentialsProvider();
+					if (3 < authAttempts
+							|| !authMethod.authorize(uri, credentialsProvider)) {
+						credentialsProvider.reset(uri);
 						throw new TransportException(uri,
 								JGitText.get().notAuthorized);
 					}
+					credentialsProvider.reset(uri);
 					authAttempts++;
 					continue;
 
@@ -504,7 +506,7 @@
 
 	/**
 	 * Open an HTTP connection.
-	 * 
+	 *
 	 * @param method
 	 * @param u
 	 * @return the connection
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 bd65182..aae898d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
@@ -65,8 +65,8 @@
 /**
  * This URI like construct used for referencing Git archives over the net, as
  * well as locally stored archives. It is similar to RFC 2396 URI's, but also
- * support SCP and the malformed file://<path> syntax (as opposed to the correct
- * file:<path> syntax.
+ * support SCP and the malformed file://&lt;path&gt; syntax (as opposed to the correct
+ * file:&lt;path&gt; syntax.
  */
 public class URIish implements Serializable {
 	/**
@@ -660,7 +660,7 @@
 	/**
 	 * Get the "humanish" part of the path. Some examples of a 'humanish' part
 	 * for a full path:
-	 * <table>
+	 * <table summary="path vs humanish path" border="1">
 	 * <tr>
 	 * <th>Path</th>
 	 * <th>Humanish part</th>
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 57bbd64..0805e50 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
@@ -110,8 +110,9 @@
 
 	/**
 	 * @return the parent of this tree parser
-	 * @internal
+	 * @deprecated internal use only
 	 */
+	@Deprecated
 	public CanonicalTreeParser getParent() {
 		return (CanonicalTreeParser) parent;
 	}
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 90850ea..94281fb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
@@ -777,7 +777,7 @@
 	 *            end with '/' prior to invocation.
 	 * @param pLen
 	 *            number of bytes from <code>buf</code> to test.
-	 * @return < 0 if p is before the current path; 0 if p matches the current
+	 * @return &lt; 0 if p is before the current path; 0 if p matches the current
 	 *         path; 1 if the current path is past p and p will never match
 	 *         again on this tree walk.
 	 */
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 834cc85..b77807c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java
@@ -193,7 +193,7 @@
 	 * the method fails. Furthermore if the destination exists and is a file
 	 * then the file will be deleted and then the rename is retried.
 	 * <p>
-	 * This operation is <em>not</me> atomic.
+	 * This operation is <em>not</em> atomic.
 	 *
 	 * @see FS#retryFailedLockFileCommit()
 	 * @param src
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 0975cd3..c817c47 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java
@@ -317,7 +317,7 @@
 	 * @param fd
 	 *            the stream to skip bytes from.
 	 * @param toSkip
-	 *            total number of bytes to be discarded. Must be >= 0.
+	 *            total number of bytes to be discarded. Must be &gt;= 0.
 	 * @throws EOFException
 	 *             the stream ended before the requested number of bytes were
 	 *             skipped.
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 3161b51..f7688e3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/IntList.java
@@ -44,7 +44,7 @@
 
 package org.eclipse.jgit.util;
 
-/** A more efficient List<Integer> using a primitive integer array. */
+/** A more efficient List&lt;Integer&gt; using a primitive integer array. */
 public class IntList {
 	private int[] entries;
 
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 d62203c..dc4004f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/LongList.java
@@ -46,7 +46,7 @@
 
 import java.util.Arrays;
 
-/** A more efficient List<Long> using a primitive long array. */
+/** A more efficient List&lt;Long&gt; using a primitive long array. */
 public class LongList {
 	private long[] entries;
 
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 e110c11..85c1648 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java
@@ -56,7 +56,7 @@
 	 *            the first value to compare.
 	 * @param b
 	 *            the second value to compare.
-	 * @return < 0 if a < b; 0 if a == b; > 0 if a > b.
+	 * @return &lt; 0 if a &lt; b; 0 if a == b; &gt; 0 if a &gt; b.
 	 */
 	public static int compareUInt32(final int a, final int b) {
 		final int cmp = (a >>> 1) - (b >>> 1);
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 2f9a6d1..3c2460c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
@@ -982,7 +982,7 @@
 	 * Decode a region of the buffer under the ISO-8859-1 encoding.
 	 *
 	 * Each byte is treated as a single character in the 8859-1 character
-	 * encoding, performing a raw binary->char conversion.
+	 * encoding, performing a raw binary-&gt;char conversion.
 	 *
 	 * @param buffer
 	 *            buffer to pull raw bytes from.
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 0e58c4b..1024380 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
@@ -113,7 +113,7 @@
 	 *
 	 * @param timeout
 	 *            number of milliseconds before the interrupt should trigger.
-	 *            Must be > 0.
+	 *            Must be &gt; 0.
 	 */
 	public void begin(final int timeout) {
 		if (timeout <= 0)
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 fe452c2..1148895 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
@@ -79,7 +79,7 @@
 
 	/**
 	 * @param millis
-	 *            number of milliseconds before aborting a read. Must be > 0.
+	 *            number of milliseconds before aborting a read. Must be &gt; 0.
 	 */
 	public void setTimeout(final int millis) {
 		if (millis < 0)
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 7ca11ca..9236d0e 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
@@ -80,7 +80,7 @@
 
 	/**
 	 * @param millis
-	 *            number of milliseconds before aborting a write. Must be > 0.
+	 *            number of milliseconds before aborting a write. Must be &gt; 0.
 	 */
 	public void setTimeout(final int millis) {
 		if (millis < 0)
diff --git a/pom.xml b/pom.xml
index ecf2400..d4acb3e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -503,7 +503,7 @@
     <profile>
       <id>jgit.java6</id>
       <activation>
-        <jdk>1.6</jdk>
+        <jdk>[1.6,)</jdk>
       </activation>
       <modules>
         <module>org.eclipse.jgit.console</module>
@@ -512,10 +512,9 @@
     <profile>
       <id>jgit.java7</id>
       <activation>
-        <jdk>1.7</jdk>
+        <jdk>[1.7,)</jdk>
       </activation>
       <modules>
-        <module>org.eclipse.jgit.console</module>
         <module>org.eclipse.jgit.java7</module>
         <module>org.eclipse.jgit.java7.test</module>
       </modules>