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 2d552d40d9400d5e26c2530a951e5d2485c50edc..c40d3b70006c4032324d0c39876dabf72a99eacb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java
@@ -139,15 +139,15 @@ public void formatEdits(final OutputStream out, final RawText a,
 
 			while (aCur < aEnd || bCur < bEnd) {
 				if (aCur < curEdit.getBeginA() || endIdx + 1 < curIdx) {
-					writeLine(out, ' ', a, aCur);
+					writeContextLine(out, a, aCur, isEndOfLineMissing(a, aCur));
 					aCur++;
 					bCur++;
-
 				} else if (aCur < curEdit.getEndA()) {
-					writeLine(out, '-', a, aCur++);
-
+					writeRemovedLine(out, a, aCur, isEndOfLineMissing(a, aCur));
+					aCur++;
 				} else if (bCur < curEdit.getEndB()) {
-					writeLine(out, '+', b, bCur++);
+					writeAddedLine(out, b, bCur, isEndOfLineMissing(b, bCur));
+					bCur++;
 				}
 
 				if (end(curEdit, aCur, bCur) && ++curIdx < edits.size())
@@ -156,12 +156,85 @@ public void formatEdits(final OutputStream out, final RawText a,
 		}
 	}
 
-	private void writeHunkHeader(final OutputStream out, int aCur, int aEnd,
-			int bCur, int bEnd) throws IOException {
+	/**
+	 * Output a line of diff context
+	 *
+	 * @param out
+	 *            OutputStream
+	 * @param text
+	 *            RawText for accessing raw data
+	 * @param line
+	 *            the line number within text
+	 * @param endOfLineMissing
+	 *            true if we should add the GNU end of line missing warning
+	 * @throws IOException
+	 */
+	protected void writeContextLine(final OutputStream out, final RawText text,
+			final int line, boolean endOfLineMissing) throws IOException {
+		writeLine(out, ' ', text, line, endOfLineMissing);
+	}
+
+	private boolean isEndOfLineMissing(final RawText text, final int line) {
+		return line + 1 == text.size() && text.isMissingNewlineAtEnd();
+	}
+
+	/**
+	 * Output an added line
+	 *
+	 * @param out
+	 *            OutputStream
+	 * @param text
+	 *            RawText for accessing raw data
+	 * @param line
+	 *            the line number within text
+	 * @param endOfLineMissing
+	 *            true if we should add the gnu end of line missing warning
+	 * @throws IOException
+	 */
+	protected void writeAddedLine(final OutputStream out, final RawText text, final int line, boolean endOfLineMissing)
+			throws IOException {
+		writeLine(out, '+', text, line, endOfLineMissing);
+	}
+
+	/**
+	 * Output a removed line
+	 *
+	 * @param out
+	 *            OutputStream
+	 * @param text
+	 *            RawText for accessing raw data
+	 * @param line
+	 *            the line number within text
+	 * @param endOfLineMissing
+	 *            true if we should add the gnu end of line missing warning
+	 * @throws IOException
+	 */
+	protected void writeRemovedLine(final OutputStream out, final RawText text,
+			final int line, boolean endOfLineMissing) throws IOException {
+		writeLine(out, '-', text, line, endOfLineMissing);
+	}
+
+	/**
+	 * Output a hunk header
+	 *
+	 * @param out
+	 *            OutputStream
+	 * @param aStartLine
+	 *            within first source
+	 * @param aEndLine
+	 *            within first source
+	 * @param bStartLine
+	 *            within second source
+	 * @param bEndLine
+	 *            within second source
+	 * @throws IOException
+	 */
+	protected void writeHunkHeader(final OutputStream out, int aStartLine, int aEndLine,
+			int bStartLine, int bEndLine) throws IOException {
 		out.write('@');
 		out.write('@');
-		writeRange(out, '-', aCur + 1, aEnd - aCur);
-		writeRange(out, '+', bCur + 1, bEnd - bCur);
+		writeRange(out, '-', aStartLine + 1, aEndLine - aStartLine);
+		writeRange(out, '+', bStartLine + 1, bEndLine - bStartLine);
 		out.write(' ');
 		out.write('@');
 		out.write('@');
@@ -199,12 +272,17 @@ private static void writeRange(final OutputStream out, final char prefix,
 	}
 
 	private static void writeLine(final OutputStream out, final char prefix,
-			final RawText text, final int cur) throws IOException {
+			final RawText text, final int cur, boolean noNewLineIndicator) throws IOException {
 		out.write(prefix);
 		text.writeLine(out, cur);
 		out.write('\n');
-		if (cur + 1 == text.size() && text.isMissingNewlineAtEnd())
-			out.write(noNewLine);
+		if (noNewLineIndicator)
+			writeNoNewLine(out);
+	}
+
+	private static void writeNoNewLine(final OutputStream out)
+			throws IOException {
+		out.write(noNewLine);
 	}
 
 	private int findCombinedEnd(final List<Edit> edits, final int i) {