diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java
index 2ae93a4..0f59a09 100644
--- a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java
@@ -52,15 +52,17 @@
  */
 public class TextNavigationTest {
 
-	private static File file;
-	private static AbstractTextEditor editor;
-	private static StyledText widget;
+	private File file;
+	private AbstractTextEditor editor;
+	private StyledText widget;
+	private IDocument fDocument;
 
 	@Before
-	public void setUpBeforeClass() throws IOException, PartInitException, CoreException {
+	public void setUp() throws IOException, PartInitException, CoreException {
 		file = File.createTempFile(TextNavigationTest.class.getName(), ".txt");
 		Files.write(file.toPath(), "  abc".getBytes());
 		editor = (AbstractTextEditor)IDE.openEditorOnFileStore(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), EFS.getStore(file.toURI()));
+		fDocument = editor.getDocumentProvider().getDocument(editor.getEditorInput());
 		widget = (StyledText) editor.getAdapter(Control.class);
 	}
 
@@ -75,9 +77,8 @@
 		IPreferenceStore preferenceStore = EditorsPlugin.getDefault().getPreferenceStore();
 		boolean previousPrefValue = preferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_NAVIGATION_SMART_HOME_END);
 		preferenceStore.setValue(AbstractTextEditor.PREFERENCE_NAVIGATION_SMART_HOME_END, false);
-		IDocument doc = editor.getDocumentProvider().getDocument(editor.getEditorInput());
-		doc.set("line1\nline2");
-		editor.selectAndReveal(doc.getLength(), 0);
+		fDocument.set("line1\nline2");
+		editor.selectAndReveal(fDocument.getLength(), 0);
 		editor.getAction(ITextEditorActionDefinitionIds.LINE_START).run();
 		try {
 			assertEquals(6, ((ITextSelection) editor.getSelectionProvider().getSelection()).getOffset());
@@ -116,6 +117,17 @@
 	}
 
 	@Test
+	public void testShiftEndMultipleLines() {
+		fDocument.set("LINE 1\nLINE 2\n");
+		editor.selectAndReveal(12, -7);
+		editor.getAction(ITextEditorActionDefinitionIds.SELECT_LINE_END).run();
+		ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+		assertEquals(6, selection.getOffset());
+		assertEquals(6, selection.getLength());
+		assertEquals(6, widget.getCaretOffset());
+	}
+
+	@Test
 	public void testShiftEndHomeHome() {
 		editor.getSelectionProvider().setSelection(new TextSelection(0, 0));
 		assertEquals(0, widget.getCaretOffset());
@@ -142,8 +154,7 @@
 	@Test
 	public void testEndHomeRevealCaret() {
 		editor.getSelectionProvider().setSelection(new TextSelection(0, 0));
-		IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
-		document.set(IntStream.range(0, 2000).mapToObj(i -> "a").collect(Collectors.joining()));
+		fDocument.set(IntStream.range(0, 2000).mapToObj(i -> "a").collect(Collectors.joining()));
 		PlatformUI.getWorkbench().getIntroManager().closeIntro(PlatformUI.getWorkbench().getIntroManager().getIntro());
 		assertTrue(DisplayHelper.waitForCondition(widget.getDisplay(), 2000, () -> widget.isVisible()));
 		int firstCharX = widget.getTextBounds(0, 0).x;
@@ -151,8 +162,8 @@
 		assertEquals(0, widget.getClientArea().x);
 		editor.getAction(ITextEditorActionDefinitionIds.LINE_END).run();
 		ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
-		assertEquals(document.getLength(), selection.getOffset());
-		int lastCharX = widget.getTextBounds(document.getLength() - 1, document.getLength() - 1).x;
+		assertEquals(fDocument.getLength(), selection.getOffset());
+		int lastCharX = widget.getTextBounds(fDocument.getLength() - 1, fDocument.getLength() - 1).x;
 		assertTrue(lastCharX >= 0 && lastCharX <= widget.getClientArea().width);
 		editor.getAction(ITextEditorActionDefinitionIds.LINE_START).run();
 		firstCharX = widget.getTextBounds(0, 0).x;
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
index 67ef523..0cf8f2e 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
@@ -1234,8 +1234,8 @@
 					int i = getLineEndPosition(document, line, lineLength, caretOffsetInDocument);
 					newCaretOffset = (caretOffset - lineOffset == i) ? lineEndOffset : lineOffset + i;
 				} else if (caretOffset < lineEndOffset) {
-						// to end of line
-						newCaretOffset = lineEndOffset;
+					// to end of line
+					newCaretOffset = lineEndOffset;
 				}
 
 				if (newCaretOffset == -1) {
@@ -1248,7 +1248,7 @@
 
 			}
 			st.setSelectionRanges(newSelection.stream().flatMapToInt(
-					p -> IntStream.of(Math.min(p.y, p.x), Math.abs(p.y - p.x)))
+					p -> IntStream.of(p.x, p.y - p.x))
 					.toArray());
 			if (newSelection.size() == 1) {
 				st.showSelection();
