diff --git a/org.eclipse.core.filebuffers/META-INF/MANIFEST.MF b/org.eclipse.core.filebuffers/META-INF/MANIFEST.MF
index 07a476c..1879168 100644
--- a/org.eclipse.core.filebuffers/META-INF/MANIFEST.MF
+++ b/org.eclipse.core.filebuffers/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.core.filebuffers; singleton:=true
-Bundle-Version: 3.6.500.qualifier
+Bundle-Version: 3.6.600.qualifier
 Bundle-Activator: org.eclipse.core.internal.filebuffers.FileBuffersPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.core.filebuffers/pom.xml b/org.eclipse.core.filebuffers/pom.xml
index 68dbd3f..18b26a3 100644
--- a/org.eclipse.core.filebuffers/pom.xml
+++ b/org.eclipse.core.filebuffers/pom.xml
@@ -18,6 +18,6 @@
   </parent>
   <groupId>org.eclipse.core</groupId>
   <artifactId>org.eclipse.core.filebuffers</artifactId>
-  <version>3.6.500-SNAPSHOT</version>
+  <version>3.6.600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/ITextFileBufferManager.java b/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/ITextFileBufferManager.java
index 299f92f..0fa233c 100644
--- a/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/ITextFileBufferManager.java
+++ b/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/ITextFileBufferManager.java
@@ -96,7 +96,7 @@
 	ITextFileBuffer getFileStoreTextFileBuffer(IFileStore fileStore);
 
 	/**
- 	 * Returns the text file buffer managed for the given document
+	 * Returns the text file buffer managed for the given document
 	 * or <code>null</code> if there is no such text file buffer.
 	 * <p>
 	 * <strong>Note:</strong> This method goes through the list
diff --git a/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/LocationKind.java b/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/LocationKind.java
index 0d95286..7378dc8 100644
--- a/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/LocationKind.java
+++ b/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/LocationKind.java
@@ -32,7 +32,7 @@
 	 * connected using a file store will not be found.
 	 * </p>
 	 *
- 	 * @see IFileBufferManager#connectFileStore(org.eclipse.core.filesystem.IFileStore, org.eclipse.core.runtime.IProgressMonitor)
+	 * @see IFileBufferManager#connectFileStore(org.eclipse.core.filesystem.IFileStore, org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	public static final LocationKind LOCATION= new LocationKind("location"); //$NON-NLS-1$
 
diff --git a/org.eclipse.core.filebuffers/src/org/eclipse/core/internal/filebuffers/FileStoreTextFileBuffer.java b/org.eclipse.core.filebuffers/src/org/eclipse/core/internal/filebuffers/FileStoreTextFileBuffer.java
index bbaad79..06f91f8 100644
--- a/org.eclipse.core.filebuffers/src/org/eclipse/core/internal/filebuffers/FileStoreTextFileBuffer.java
+++ b/org.eclipse.core.filebuffers/src/org/eclipse/core/internal/filebuffers/FileStoreTextFileBuffer.java
@@ -113,7 +113,7 @@
 	/** Tells whether the file on disk has a BOM. */
 	private boolean fHasBOM;
 	/** The annotation model of this file buffer */
-    private IAnnotationModel fAnnotationModel;
+	private IAnnotationModel fAnnotationModel;
 	/**
 	 * Lock for lazy creation of annotation model.
 	 * @since 3.2
@@ -258,7 +258,7 @@
 			if (fAnnotationModel instanceof IPersistableAnnotationModel) {
 				IPersistableAnnotationModel persistableModel= (IPersistableAnnotationModel) fAnnotationModel;
 				try {
-				    persistableModel.revert(fDocument);
+					persistableModel.revert(fDocument);
 				} catch (CoreException x) {
 					fStatus= x.getStatus();
 				}
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/AbstractUndoManagerTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/AbstractUndoManagerTest.java
index 14fd1a8..01f385a 100644
--- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/AbstractUndoManagerTest.java
+++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/AbstractUndoManagerTest.java
@@ -404,7 +404,7 @@
 		fUndoManager.beginCompoundChange();
 		fUndoManager.endCompoundChange();
 
-	    // insert the atomic changes
+		// insert the atomic changes
 		doRepeatableChange(document);
 
 		assertTrue(fUndoManager.undoable());
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java
index 9e06ba1..4fbb54e 100644
--- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java
+++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java
@@ -118,8 +118,8 @@
 			public void dispose() {
 			}
 		});
-	    projectionSupport.install();
-	    fViewer.doOperation(ProjectionViewer.TOGGLE);
+		projectionSupport.install();
+		fViewer.doOperation(ProjectionViewer.TOGGLE);
 	}
 
 	@After
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/rules/FastPartitionerTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/rules/FastPartitionerTest.java
index 71053c1..9a51de2 100644
--- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/rules/FastPartitionerTest.java
+++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/rules/FastPartitionerTest.java
@@ -243,7 +243,7 @@
 		int[] offsets= new int[] { 0, 1 };
 		assertComputePartitioning_InterleavingPartitions(offsets);
 
-    }
+	}
 
 	@Test
 	public void testBug368219_1() throws Exception {
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SingleCharReader.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SingleCharReader.java
index 777850d..ea23266 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SingleCharReader.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SingleCharReader.java
@@ -50,7 +50,7 @@
 	/**
 	 * @see Reader#ready()
 	 */
-    @Override
+	@Override
 	public boolean ready() throws IOException {
 		return true;
 	}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SubstitutionTextReader.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SubstitutionTextReader.java
index 4e1a0c0..dea4d1d 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SubstitutionTextReader.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/html/SubstitutionTextReader.java
@@ -131,7 +131,7 @@
 	/**
 	 * @see Reader#ready()
 	 */
-    @Override
+	@Override
 	public boolean ready() throws IOException {
 		return fReader.ready();
 	}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContentAssistant2.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContentAssistant2.java
index 8ea4fae..38c6be6 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContentAssistant2.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContentAssistant2.java
@@ -1541,7 +1541,7 @@
 	 * @since 3.4
 	 */
 	boolean isColoredLabelsSupportEnabled() {
-	    return fIsColoredLabelsSupportEnabled;
+		return fIsColoredLabelsSupportEnabled;
 	}
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContextInformationPopup2.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContextInformationPopup2.java
index b89eaec..5dda118 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContextInformationPopup2.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/link/contentassist/ContextInformationPopup2.java
@@ -564,7 +564,7 @@
 
 		} else if (key == SWT.ESC) {
 			e.doit= false;
- 			hideContextInfoPopup();
+			hideContextInfoPopup();
 		} else {
 			validateContextInformation();
 		}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/LineIndexOutOfBoundsException.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/LineIndexOutOfBoundsException.java
index bc95f33..83fa56f 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/LineIndexOutOfBoundsException.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/LineIndexOutOfBoundsException.java
@@ -30,7 +30,7 @@
 		super();
 	}
 
-    /**
+	/**
 	 * Constructs an <code>LineIndexOutOfBoundsException</code> with the specified detail message.
 	 *
 	 * @param s the detail message.
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionPainter.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionPainter.java
index 0bb4492..0daf9b6 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionPainter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionPainter.java
@@ -285,7 +285,7 @@
 				updateFocusRevision(null); // kill any focus as the ctx menu is going to show
 			if (e.button == 1) {
 				fMouseDownRegion= fFocusRange;
-		    	postRedraw();
+				postRedraw();
 			}
 		}
 
@@ -351,41 +351,41 @@
 		@Override
 		protected IInformationControl doCreateInformationControl(Shell parent) {
 			if (BrowserInformationControl.isAvailable(parent)) {
-	            return new BrowserInformationControl(parent, JFaceResources.DIALOG_FONT, fIsFocusable) {
-	            	/**
+				return new BrowserInformationControl(parent, JFaceResources.DIALOG_FONT, fIsFocusable) {
+					/**
 					 * {@inheritDoc}
 					 *
 					 * @deprecated use {@link #setInput(Object)}
 					 */
-	            	@Deprecated
+					@Deprecated
 					@Override
 					public void setInformation(String content) {
-        				content= addCSSToHTMLFragment(content);
-	            		super.setInformation(content);
-	            	}
+						content= addCSSToHTMLFragment(content);
+						super.setInformation(content);
+					}
 
-	        		/**
-	        		 * Adds a HTML header and CSS info if <code>html</code> is only an HTML fragment (has no
-	        		 * &lt;html&gt; section).
-	        		 *
-	        		 * @param html the html / text produced by a revision
-	        		 * @return modified html
-	        		 */
-	        		private String addCSSToHTMLFragment(String html) {
-	        			int max= Math.min(100, html.length());
-	        			if (html.substring(0, max).indexOf("<html>") != -1) //$NON-NLS-1$
-	        				// there is already a header
-	        				return html;
+					/**
+					 * Adds a HTML header and CSS info if <code>html</code> is only an HTML fragment (has no
+					 * &lt;html&gt; section).
+					 *
+					 * @param html the html / text produced by a revision
+					 * @return modified html
+					 */
+					private String addCSSToHTMLFragment(String html) {
+						int max= Math.min(100, html.length());
+						if (html.substring(0, max).indexOf("<html>") != -1) //$NON-NLS-1$
+							// there is already a header
+							return html;
 
-	        			StringBuilder info= new StringBuilder(512 + html.length());
-	        			HTMLPrinter.insertPageProlog(info, 0, fgStyleSheet);
-	        			info.append(html);
-	        			HTMLPrinter.addPageEpilog(info);
-	        			return info.toString();
-	        		}
+						StringBuilder info= new StringBuilder(512 + html.length());
+						HTMLPrinter.insertPageProlog(info, 0, fgStyleSheet);
+						info.append(html);
+						HTMLPrinter.addPageEpilog(info);
+						return info.toString();
+					}
 
-	            };
-            }
+				};
+			}
 			return new DefaultInformationControl(parent, fIsFocusable);
 		}
 
@@ -473,7 +473,7 @@
 			return range == null ? null : new LineRange(lineNumber, 1);
 		}
 
-        @Override
+		@Override
 		public IInformationControlCreator getInformationPresenterControlCreator() {
 			RevisionInformation revisionInfo= fRevisionInfo;
 			if (revisionInfo != null) {
@@ -482,7 +482,7 @@
 					return creator;
 			}
 			return new HoverInformationControlCreator(true);
-        }
+		}
 	}
 
 	/* Listeners and helpers. */
@@ -1156,8 +1156,8 @@
 	/**
 	 * Handles the selection of a revision id and informs listeners
 	 *
-     * @param id the selected revision id
-     */
+	 * @param id the selected revision id
+	 */
 	void handleRevisionSelected(String id) {
 		Assert.isLegal(id != null);
 		if (fRevisionInfo == null)
@@ -1174,14 +1174,14 @@
 		handleRevisionSelected((Revision) null);
 	}
 
-    /**
-     * Returns the selection provider.
-     *
-     * @return the selection provider
-     */
-    public RevisionSelectionProvider getRevisionSelectionProvider() {
+	/**
+	 * Returns the selection provider.
+	 *
+	 * @return the selection provider
+	 */
+	public RevisionSelectionProvider getRevisionSelectionProvider() {
 		return fRevisionSelectionProvider;
-    }
+	}
 
 	/**
 	 * Updates the focus line with a new line.
@@ -1232,9 +1232,9 @@
 	}
 
 	private void updateFocusRevision(Revision revision) {
-	    if (fFocusRevision != revision)
+		if (fFocusRevision != revision)
 			onFocusRevisionChanged(fFocusRevision, revision);
-    }
+	}
 
 	/**
 	 * Handles a changing focus revision.
@@ -1423,30 +1423,30 @@
 	 * @param offset the document offset
 	 * @return the revision at offset, or <code>null</code> for none
 	 */
-    Revision getRevision(int offset) {
-    	IDocument document= fViewer.getDocument();
-    	int line;
-        try {
-	        line= document.getLineOfOffset(offset);
-        } catch (BadLocationException x) {
-        	return null;
-        }
-    	if (line != -1) {
-    		RevisionRange range= getRange(line);
-    		if (range != null)
-    			return range.getRevision();
-    	}
-    	return null;
-    }
+	Revision getRevision(int offset) {
+		IDocument document= fViewer.getDocument();
+		int line;
+		try {
+			line= document.getLineOfOffset(offset);
+		} catch (BadLocationException x) {
+			return null;
+		}
+		if (line != -1) {
+			RevisionRange range= getRange(line);
+			if (range != null)
+				return range.getRevision();
+		}
+		return null;
+	}
 
 	/**
 	 * Returns <code>true</code> if a revision model has been set, <code>false</code> otherwise.
 	 *
-     * @return <code>true</code> if a revision model has been set, <code>false</code> otherwise
-     */
-    public boolean hasInformation() {
-	    return fRevisionInfo != null;
-    }
+	 * @return <code>true</code> if a revision model has been set, <code>false</code> otherwise
+	 */
+	public boolean hasInformation() {
+		return fRevisionInfo != null;
+	}
 
 	/**
 	 * Returns the width in chars required to display information.
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionSelectionProvider.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionSelectionProvider.java
index 4c43acb..842bd79 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionSelectionProvider.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/revisions/RevisionSelectionProvider.java
@@ -46,29 +46,29 @@
 	 * Post selection listener on the viewer that remembers the selection provider it is registered
 	 * with.
 	 */
-    private final class PostSelectionListener implements ISelectionChangedListener {
-        private final IPostSelectionProvider fPostProvider;
+	private final class PostSelectionListener implements ISelectionChangedListener {
+		private final IPostSelectionProvider fPostProvider;
 
 		public PostSelectionListener(IPostSelectionProvider postProvider) {
 			postProvider.addPostSelectionChangedListener(this);
 			fPostProvider= postProvider;
-        }
+		}
 
 		@Override
 		public void selectionChanged(SelectionChangedEvent event) {
-	    	ISelection selection= event.getSelection();
-	    	if (selection instanceof ITextSelection) {
-	    		ITextSelection ts= (ITextSelection) selection;
-	            int offset= ts.getOffset();
-	            setSelectedRevision(fPainter.getRevision(offset));
-	        }
+			ISelection selection= event.getSelection();
+			if (selection instanceof ITextSelection) {
+				ITextSelection ts= (ITextSelection) selection;
+				int offset= ts.getOffset();
+				setSelectedRevision(fPainter.getRevision(offset));
+			}
 
-	    }
+		}
 
 		public void dispose() {
 			fPostProvider.removePostSelectionChangedListener(this);
 		}
-    }
+	}
 
 	private final RevisionPainter fPainter;
 
@@ -98,78 +98,78 @@
 	 *
 	 * @param painter the painter that the created provider interacts with
 	 */
-    RevisionSelectionProvider(RevisionPainter painter) {
+	RevisionSelectionProvider(RevisionPainter painter) {
 		fPainter= painter;
-    }
+	}
 
-    @Override
+	@Override
 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-    	fListeners.add(listener);
-    }
+		fListeners.add(listener);
+	}
 
-    @Override
+	@Override
 	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-    	fListeners.remove(listener);
-    }
+		fListeners.remove(listener);
+	}
 
-    @Override
+	@Override
 	public ISelection getSelection() {
-    	if (fSelection == null)
-    		return StructuredSelection.EMPTY;
-	    return new StructuredSelection(fSelection);
-    }
+		if (fSelection == null)
+			return StructuredSelection.EMPTY;
+		return new StructuredSelection(fSelection);
+	}
 
-    @Override
+	@Override
 	public void setSelection(ISelection selection) {
-    	if (fIgnoreEvents)
-    		return;
-    	if (selection instanceof IStructuredSelection) {
-    		Object first= ((IStructuredSelection) selection).getFirstElement();
-    		if (first instanceof Revision)
+		if (fIgnoreEvents)
+			return;
+		if (selection instanceof IStructuredSelection) {
+			Object first= ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Revision)
 				fPainter.handleRevisionSelected((Revision) first);
 			else if (first instanceof String)
 				fPainter.handleRevisionSelected((String) first);
 			else if (selection.isEmpty())
 				fPainter.handleRevisionSelected((Revision) null);
-    	}
-    }
+		}
+	}
 
-    /**
+	/**
 	 * Installs the selection provider on the viewer.
 	 *
 	 * @param viewer the viewer on which we listen to for post selection events
 	 */
-    void install(ITextViewer viewer) {
-    	uninstall();
+	void install(ITextViewer viewer) {
+		uninstall();
 		fViewer= viewer;
 		if (fViewer != null) {
 			ISelectionProvider provider= fViewer.getSelectionProvider();
 			if (provider instanceof IPostSelectionProvider) {
-	            IPostSelectionProvider postProvider= (IPostSelectionProvider) provider;
-	            fSelectionListener= new PostSelectionListener(postProvider);
-            }
+				IPostSelectionProvider postProvider= (IPostSelectionProvider) provider;
+				fSelectionListener= new PostSelectionListener(postProvider);
+			}
 		}
-    }
+	}
 
-    /**
-     * Uninstalls the selection provider.
-     */
-    void uninstall() {
-    	fViewer= null;
-    	if (fSelectionListener != null) {
-    		fSelectionListener.dispose();
-    		fSelectionListener= null;
-    	}
-    }
+	/**
+	 * Uninstalls the selection provider.
+	 */
+	void uninstall() {
+		fViewer= null;
+		if (fSelectionListener != null) {
+			fSelectionListener.dispose();
+			fSelectionListener= null;
+		}
+	}
 
-    /**
+	/**
 	 * Private protocol used by {@link RevisionPainter} to signal selection of a revision.
 	 *
 	 * @param revision the selected revision, or <code>null</code> for none
 	 */
-    void revisionSelected(Revision revision) {
-    	setSelectedRevision(revision);
-    }
+	void revisionSelected(Revision revision) {
+		setSelectedRevision(revision);
+	}
 
 	/**
 	 * Updates the currently selected revision and sends out an event if it changed.
@@ -181,19 +181,19 @@
 			fSelection= revision;
 			fireSelectionEvent();
 		}
-    }
+	}
 
-    private void fireSelectionEvent() {
-    	fIgnoreEvents= true;
-    	try {
-    		ISelection selection= getSelection();
-    		SelectionChangedEvent event= new SelectionChangedEvent(this, selection);
+	private void fireSelectionEvent() {
+		fIgnoreEvents= true;
+		try {
+			ISelection selection= getSelection();
+			SelectionChangedEvent event= new SelectionChangedEvent(this, selection);
 
 			for (ISelectionChangedListener listener : fListeners) {
 				listener.selectionChanged(event);
 			}
-    	} finally {
-    		fIgnoreEvents= false;
-    	}
-    }
+		} finally {
+			fIgnoreEvents= false;
+		}
+	}
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/source/DiffPainter.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/source/DiffPainter.java
index fd8f027..2c1d4cc 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/source/DiffPainter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/source/DiffPainter.java
@@ -526,9 +526,9 @@
 	/**
 	 * Returns <code>true</code> if diff information is being displayed, <code>false</code> otherwise.
 	 *
-     * @return <code>true</code> if diff information is being displayed, <code>false</code> otherwise
-     * @since 3.3
-     */
+	 * @return <code>true</code> if diff information is being displayed, <code>false</code> otherwise
+	 * @since 3.3
+	 */
 	public boolean hasInformation() {
 		if (fLineDiffer instanceof ILineDifferExtension2)
 			return !((ILineDifferExtension2) fLineDiffer).isSuspended();
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java
index 1166e26..f35accd 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java
@@ -609,7 +609,7 @@
 	private MouseTracker fMouseTracker= new MouseTracker();
 	/**
 	 * The remembered hover event.
-     * @since 3.0
+	 * @since 3.0
 	 */
 	private MouseEvent fHoverEvent= null;
 	/** The remembered hover event state mask of the keyboard modifiers */
@@ -845,7 +845,7 @@
 		fReplacingDelayJob= new Job("AbstractHoverInformationControlManager Replace Delayer") { //$NON-NLS-1$
 			@Override
 			public IStatus run(final IProgressMonitor monitor) {
-		        if (monitor.isCanceled() || display.isDisposed()) {
+				if (monitor.isCanceled() || display.isDisposed()) {
 					return Status.CANCEL_STATUS;
 				}
 				display.syncExec(() -> {
@@ -939,14 +939,14 @@
 		return fHoverEvent;
 	}
 
- 	/**
+	/**
 	 * Returns the SWT event state of the most recent mouse hover event.
 	 *
 	 * @return the SWT event state of the most recent mouse hover event
 	 */
 	protected int getHoverEventStateMask() {
 		return fHoverEventStateMask;
- 	}
+	}
 
 	/**
 	 * Returns an adapter that gives access to internal methods.
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultDocumentAdapter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultDocumentAdapter.java
index e752f80..a02d9b8 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultDocumentAdapter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultDocumentAdapter.java
@@ -352,9 +352,9 @@
 			return;
 
 		try {
-		    IDocument document= fEvent.getDocument();
-		    if (document == null)
-		    	return;
+			IDocument document= fEvent.getDocument();
+			if (document == null)
+				return;
 
 			TextChangingEvent event= new TextChangingEvent(this);
 			event.start= fEvent.fOffset;
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultInformationControl.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultInformationControl.java
index 6cea829..f583c84 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultInformationControl.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultInformationControl.java
@@ -121,7 +121,7 @@
 	/**
 	 * Additional styles to use for the text control.
 	 * @since 3.4, previously called <code>fTextStyle</code>
-     */
+	 */
 	private final int fAdditionalTextStyles;
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultTextDoubleClickStrategy.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultTextDoubleClickStrategy.java
index 9b283c9..f3e472e 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultTextDoubleClickStrategy.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultTextDoubleClickStrategy.java
@@ -75,8 +75,8 @@
 
 		@Override
 		public char last() {
-	        fIndex= fOffset < fEndOffset ? fEndOffset -1 : fEndOffset;
-        	return current();
+			fIndex= fOffset < fEndOffset ? fEndOffset -1 : fEndOffset;
+			return current();
 		}
 
 		@Override
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultUndoManager.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultUndoManager.java
index a391483..eae94c2 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultUndoManager.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/DefaultUndoManager.java
@@ -104,8 +104,8 @@
 		 * @since 3.1
 		 */
 		TextCommand(IUndoContext context) {
-		    super(JFaceTextMessages.getString("DefaultUndoManager.operationLabel")); //$NON-NLS-1$
-		    addContext(context);
+			super(JFaceTextMessages.getString("DefaultUndoManager.operationLabel")); //$NON-NLS-1$
+			addContext(context);
 		}
 
 		/**
@@ -133,7 +133,7 @@
 
 		@Override
 		public void dispose() {
-		    reinitialize();
+			reinitialize();
 		}
 
 		/**
@@ -223,13 +223,13 @@
 
 		@Override
 		public boolean canExecute() {
-		    return isConnected();
+			return isConnected();
 		}
 
 		@Override
 		public IStatus execute(IProgressMonitor monitor, IAdaptable uiInfo) {
 			// Text commands execute as they are typed, so executing one has no effect.
-		    return Status.OK_STATUS;
+			return Status.OK_STATUS;
 		}
 
 		/*
@@ -324,7 +324,7 @@
 				} else {
 					reinitialize();
 				}
- 			} else {
+			} else {
 				updateCommand();
 				fCurrent= createCurrent();
 			}
@@ -368,15 +368,15 @@
 		 * @since 3.1
 		 */
 		protected boolean isValid() {
-		    return fStart > -1 &&
-		    	fEnd > -1 &&
-		    	fText != null;
+			return fStart > -1 &&
+				fEnd > -1 &&
+				fText != null;
 		}
 
 		@Override
 		public String toString() {
 			String delimiter= ", "; //$NON-NLS-1$
-		    StringBuilder text= new StringBuilder(super.toString());
+			StringBuilder text= new StringBuilder(super.toString());
 			text.append("\n"); //$NON-NLS-1$
 			text.append(this.getClass().getName());
 			text.append(" undo modification stamp: "); //$NON-NLS-1$
@@ -386,17 +386,17 @@
 			text.append(" start: "); //$NON-NLS-1$
 			text.append(fStart);
 			text.append(delimiter);
-		    text.append("end: "); //$NON-NLS-1$
-		    text.append(fEnd);
+			text.append("end: "); //$NON-NLS-1$
+			text.append(fEnd);
 			text.append(delimiter);
-		    text.append("text: '"); //$NON-NLS-1$
+			text.append("text: '"); //$NON-NLS-1$
 			text.append(fText);
-		    text.append('\'');
+			text.append('\'');
 			text.append(delimiter);
-		    text.append("preservedText: '"); //$NON-NLS-1$
+			text.append("preservedText: '"); //$NON-NLS-1$
 			text.append(fPreservedText);
-		    text.append('\'');
-		    return text.toString();
+			text.append('\'');
+			return text.toString();
 		}
 
 		/**
@@ -436,7 +436,7 @@
 		 * @since 3.1
 		 */
 		CompoundTextCommand(IUndoContext context) {
-		    super(context);
+			super(context);
 		}
 
 		/**
@@ -545,7 +545,7 @@
 		protected boolean isValid() {
 			if (isConnected())
 				return (fStart > -1 || fCommands.size() > 0);
-		    return false;
+			return false;
 		}
 
 		/**
@@ -827,7 +827,7 @@
 	 * @param undoLevel the length of this manager's history
 	 */
 	public DefaultUndoManager(int undoLevel) {
-	    fHistory= OperationHistoryFactory.getOperationHistory();
+		fHistory= OperationHistoryFactory.getOperationHistory();
 		setMaximalUndoLevel(undoLevel);
 	}
 
@@ -909,8 +909,8 @@
 	 */
 	private void addToCommandStack(TextCommand command){
 		if (!fFoldingIntoCompoundChange || command instanceof CompoundTextCommand) {
-		    fHistory.add(command);
-		    fLastAddedCommand= command;
+			fHistory.add(command);
+			fLastAddedCommand= command;
 		}
 	}
 
@@ -920,7 +920,7 @@
 	 * @since 3.1
 	 */
 	private void disposeCommandStack() {
-	    fHistory.dispose(fUndoContext, true, true, true);
+		fHistory.dispose(fUndoContext, true, true, true);
 	}
 
 	/**
@@ -929,7 +929,7 @@
 	 * @since 3.1
 	 */
 	private void initializeCommandStack() {
-	    if (fHistory != null && fUndoContext != null)
+		if (fHistory != null && fUndoContext != null)
 			fHistory.dispose(fUndoContext, true, true, false);
 
 	}
@@ -1193,10 +1193,10 @@
 			fTextViewer= textViewer;
 			fTextBuffer= new StringBuilder();
 			fPreservedTextBuffer= new StringBuilder();
-		    if (fUndoContext == null)
-		        fUndoContext= new ObjectUndoContext(this);
+			if (fUndoContext == null)
+				fUndoContext= new ObjectUndoContext(this);
 
-		    fHistory.setLimit(fUndoContext, fUndoLevel);
+			fHistory.setLimit(fUndoContext, fUndoLevel);
 
 			initializeCommandStack();
 
@@ -1240,12 +1240,12 @@
 
 	@Override
 	public boolean redoable() {
-	    return fHistory.canRedo(fUndoContext);
+		return fHistory.canRedo(fUndoContext);
 	}
 
 	@Override
 	public boolean undoable() {
-	    return fHistory.canUndo(fUndoContext);
+		return fHistory.canUndo(fUndoContext);
 	}
 
 	@Override
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/IFindReplaceTarget.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/IFindReplaceTarget.java
index a699b2a..dc2939b 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/IFindReplaceTarget.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/IFindReplaceTarget.java
@@ -55,19 +55,19 @@
 	 */
 	boolean canPerformFind();
 
- 	/**
- 	 * Searches for a string starting at the given widget offset and using the specified search
- 	 * directives. If a string has been found it is selected and its start offset is
- 	 * returned.
- 	 * <p>
- 	 * Replaced by {@link IFindReplaceTargetExtension3#findAndSelect(int, String, boolean, boolean, boolean, boolean)}.
- 	 *
- 	 * @param widgetOffset the widget offset at which searching starts
- 	 * @param findString the string which should be found
- 	 * @param searchForward <code>true</code> searches forward, <code>false</code> backwards
-  	 * @param caseSensitive <code>true</code> performs a case sensitive search, <code>false</code> an insensitive search
-  	 * @param wholeWord if <code>true</code> only occurrences are reported in which the findString stands as a word by itself
-  	 * @return the position of the specified string, or -1 if the string has not been found
+	/**
+	 * Searches for a string starting at the given widget offset and using the specified search
+	 * directives. If a string has been found it is selected and its start offset is
+	 * returned.
+	 * <p>
+	 * Replaced by {@link IFindReplaceTargetExtension3#findAndSelect(int, String, boolean, boolean, boolean, boolean)}.
+	 *
+	 * @param widgetOffset the widget offset at which searching starts
+	 * @param findString the string which should be found
+	 * @param searchForward <code>true</code> searches forward, <code>false</code> backwards
+	 * @param caseSensitive <code>true</code> performs a case sensitive search, <code>false</code> an insensitive search
+	 * @param wholeWord if <code>true</code> only occurrences are reported in which the findString stands as a word by itself
+	 * @return the position of the specified string, or -1 if the string has not been found
 	 */
 	int findAndSelect(int widgetOffset, String findString, boolean searchForward, boolean caseSensitive, boolean wholeWord);
 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewer.java
index 1a7ed56..fe56c61 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewer.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewer.java
@@ -194,7 +194,7 @@
 	 * behavior over the course of time, this method causes them to be set
 	 * back to their initial state and behavior. E.g., if an {@link IUndoManager}
 	 * has been installed on this text viewer, the manager's list of remembered
-     * text editing operations is removed.
+	 * text editing operations is removed.
 	 */
 	void resetPlugins();
 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java
index 0dafb5f..f6ea97f 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java
@@ -47,9 +47,9 @@
  */
 public interface ITextViewerExtension2 {
 
-	 /**
-	  * The state mask of the default hover (value <code>0xff</code>).
-	  */
+	/**
+	 * The state mask of the default hover (value <code>0xff</code>).
+	 */
 	 final int DEFAULT_HOVER_STATE_MASK= 0xff;
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java
index 75feb94..c98fa3e 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java
@@ -2216,13 +2216,13 @@
 					return true;
 				}
 
-		   } else {
-			   fWidgetTokenKeeper= requester;
-			   return true;
-		   }
-	   }
-	   return false;
-   }
+			} else {
+				fWidgetTokenKeeper= requester;
+				return true;
+			}
+		}
+		return false;
+	}
 
 	@Override
 	public void releaseWidgetToken(IWidgetTokenKeeper tokenKeeper) {
@@ -2843,7 +2843,7 @@
 	 * @return <code>true</code> if the slave has been adapted successfully
 	 * @throws BadLocationException in case the specified range is not valid in the master document
 	 * @since 2.1
- 	 * @deprecated use <code>updateSlaveDocument</code> instead
+	 * @deprecated use <code>updateSlaveDocument</code> instead
 	 */
 	@Deprecated
 	protected boolean updateVisibleDocument(IDocument visibleDocument, int visibleRegionOffset, int visibleRegionLength) throws BadLocationException {
@@ -4412,7 +4412,7 @@
 		options.printTextFontStyle= true;
 		options.printTextForeground= true;
 		print(options);
-    }
+	}
 
 	//------ find support
 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AdditionalInfoController.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AdditionalInfoController.java
index 9d2655d..a4c43e6 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AdditionalInfoController.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AdditionalInfoController.java
@@ -63,16 +63,16 @@
 			/**
 			 * @return the delay in milliseconds before this task should be run
 			 */
-	        public abstract long delay();
-	        /**
-	         * Runs this task.
-	         */
-	        @Override
+			public abstract long delay();
+			/**
+			 * Runs this task.
+			 */
+			@Override
 			public abstract void run();
-	        /**
-	         * @return the task to be scheduled after this task has been run
-	         */
-	        public abstract Task nextTask();
+			/**
+			 * @return the task to be scheduled after this task has been run
+			 */
+			public abstract Task nextTask();
 		}
 
 		/**
@@ -88,7 +88,7 @@
 			@Override
 			public Task nextTask() {
 				Assert.isTrue(false);
-			    return null;
+				return null;
 			}
 
 			@Override
@@ -112,15 +112,15 @@
 					@Override
 					protected IStatus run(IProgressMonitor monitor) {
 						Object info;
-                        try {
-	                        info= proposal.getAdditionalProposalInfo(monitor);
-                        } catch (RuntimeException x) {
-                        	/*
+						try {
+							info= proposal.getAdditionalProposalInfo(monitor);
+						} catch (RuntimeException x) {
+							/*
 							 * XXX: This is the safest fix at this point so close to end of 3.2.
 							 *		Will be revisited when fixing https://bugs.eclipse.org/bugs/show_bug.cgi?id=101033
-                        	 */
-                        	return new Status(IStatus.WARNING, "org.eclipse.jface.text", IStatus.OK, "", x); //$NON-NLS-1$ //$NON-NLS-2$
-                        }
+							 */
+							return new Status(IStatus.WARNING, "org.eclipse.jface.text", IStatus.OK, "", x); //$NON-NLS-1$ //$NON-NLS-2$
+						}
 						setInfo((ICompletionProposal) proposal, info);
 						return Status.OK_STATUS;
 					}
@@ -200,7 +200,7 @@
 
 			@Override
 			public String toString() {
-			    return "LEGACY_WAIT"; //$NON-NLS-1$
+				return "LEGACY_WAIT"; //$NON-NLS-1$
 			}
 		};
 		/**
@@ -209,19 +209,19 @@
 		private final Task EXIT= new Task() {
 			@Override
 			public long delay() {
-		        return 1;
-	        }
+				return 1;
+			}
 
 			@Override
 			public Task nextTask() {
 				Assert.isTrue(false);
-		        return EXIT;
-	        }
+				return EXIT;
+			}
 
 			@Override
 			public void run() {
 				Assert.isTrue(false);
-	        }
+			}
 
 			@Override
 			public String toString() {
@@ -251,10 +251,10 @@
 		 * @param delay the delay until to show additional info
 		 */
 		public Timer(Display display, int delay) {
-    		fDisplay= display;
+			fDisplay= display;
 			fDelay= delay;
 			long current= System.currentTimeMillis();
-    		schedule(IDLE, current);
+			schedule(IDLE, current);
 
 			fThread= new Thread((Runnable) () -> {
 				try {
@@ -292,68 +292,68 @@
 			}
 		}
 
-        private Task taskOnReset(ICompletionProposal p) {
+		private Task taskOnReset(ICompletionProposal p) {
 			if (p == null)
 				return IDLE;
 			if (isExt5(p))
 				return FIRST_WAIT;
 			return LEGACY_WAIT;
-        }
+		}
 
-        private synchronized void loop() throws InterruptedException {
-        	long current= System.currentTimeMillis();
-        	Task task= currentTask();
+		private synchronized void loop() throws InterruptedException {
+			long current= System.currentTimeMillis();
+			Task task= currentTask();
 
-        	while (task != EXIT) {
-        		long delay= fNextWakeup - current;
-        		if (delay <= 0) {
-        			task.run();
-        			task= task.nextTask();
-        			schedule(task, current);
-        		} else {
-        			wait(delay);
-        			current= System.currentTimeMillis();
-        			task= currentTask();
-        		}
-        	}
-        }
+			while (task != EXIT) {
+				long delay= fNextWakeup - current;
+				if (delay <= 0) {
+					task.run();
+					task= task.nextTask();
+					schedule(task, current);
+				} else {
+					wait(delay);
+					current= System.currentTimeMillis();
+					task= currentTask();
+				}
+			}
+		}
 
-        private Task currentTask() {
-        	return fTask;
-        }
+		private Task currentTask() {
+			return fTask;
+		}
 
-        private void schedule(Task task, long current) {
-        	fTask= task;
-        	long nextWakeup= current + task.delay();
-        	if (nextWakeup <= current)
-        		fNextWakeup= Long.MAX_VALUE;
-        	else
-        		fNextWakeup= nextWakeup;
-        }
+		private void schedule(Task task, long current) {
+			fTask= task;
+			long nextWakeup= current + task.delay();
+			if (nextWakeup <= current)
+				fNextWakeup= Long.MAX_VALUE;
+			else
+				fNextWakeup= nextWakeup;
+		}
 
 		private boolean isExt5(ICompletionProposal p) {
 			return p instanceof ICompletionProposalExtension5;
 		}
 
-        ICompletionProposal getCurrentProposal() {
-	        return fCurrentProposal;
-        }
+		ICompletionProposal getCurrentProposal() {
+			return fCurrentProposal;
+		}
 
-        ICompletionProposalExtension5 getCurrentProposalEx() {
-        	Assert.isTrue(fCurrentProposal instanceof ICompletionProposalExtension5);
-        	return (ICompletionProposalExtension5) fCurrentProposal;
-        }
+		ICompletionProposalExtension5 getCurrentProposalEx() {
+			Assert.isTrue(fCurrentProposal instanceof ICompletionProposalExtension5);
+			return (ICompletionProposalExtension5) fCurrentProposal;
+		}
 
-        synchronized void setInfo(ICompletionProposal proposal, Object info) {
-        	if (proposal == fCurrentProposal) {
-        		fCurrentInfo= info;
-        		if (fAllowShowing) {
-        			triggerShowing();
-        		}
-        	}
-        }
+		synchronized void setInfo(ICompletionProposal proposal, Object info) {
+			if (proposal == fCurrentProposal) {
+				fCurrentInfo= info;
+				if (fAllowShowing) {
+					triggerShowing();
+				}
+			}
+		}
 
-        private void triggerShowing() {
+		private void triggerShowing() {
 			final Object info= fCurrentInfo;
 			if (!fDisplay.isDisposed()) {
 				fDisplay.asyncExec(() -> {
@@ -364,20 +364,20 @@
 					}
 				});
 			}
-        }
+		}
 
-        /**
-         * Called in the display thread to show additional info.
-         *
-         * @param proposal the proposal to show information about
-         * @param info the information about <code>proposal</code>
-         */
-        protected abstract void showInformation(ICompletionProposal proposal, Object info);
+		/**
+		 * Called in the display thread to show additional info.
+		 *
+		 * @param proposal the proposal to show information about
+		 * @param info the information about <code>proposal</code>
+		 */
+		protected abstract void showInformation(ICompletionProposal proposal, Object info);
 
-        void allowShowing() {
-        	fAllowShowing= true;
-       		triggerShowing();
-        }
+		void allowShowing() {
+			fAllowShowing= true;
+			triggerShowing();
+		}
 	}
 	/**
 	 * Internal table selection listener.
@@ -441,12 +441,12 @@
 		setAnchor(ANCHOR_RIGHT);
 		setFallbackAnchors(new Anchor[] { ANCHOR_RIGHT, ANCHOR_LEFT, ANCHOR_BOTTOM });
 
-	    /*
+		/*
 		 * Adjust the location by one pixel towards the proposal popup, so that the single pixel
 		 * border of the additional info popup overlays with the border of the popup. This avoids
 		 * having a double black line.
 		 */
-	    int spacing= -1;
+		int spacing= -1;
 		setMargins(spacing, spacing); // see also adjustment in #computeLocation
 
 		InformationControlReplacer replacer= new InformationControlReplacer(new DefaultPresenterControlCreator());
@@ -525,10 +525,10 @@
 		if (fProposal == proposal && ((info == null && fInformation == null) || (info != null && info.equals(fInformation))))
 			return;
 
-        fInformation= info;
-        fProposal= proposal;
-        showInformation();
-    }
+		fInformation= info;
+		fProposal= proposal;
+		showInformation();
+	}
 
 	@Override
 	protected void computeInformation() {
@@ -546,16 +546,16 @@
 
 	@Override
 	protected Point computeLocation(Rectangle subjectArea, Point controlSize, Anchor anchor) {
-	    Point location= super.computeLocation(subjectArea, controlSize, anchor);
+		Point location= super.computeLocation(subjectArea, controlSize, anchor);
 
-	    /*
+		/*
 		 * The location is computed using subjectControl.toDisplay(), which does not include the
 		 * trim of the subject control. As we want the additional info popup aligned with the outer
 		 * coordinates of the proposal popup, adjust this here
 		 */
-	    Rectangle trim= fProposalTable.getShell().computeTrim(0, 0, 0, 0);
-	    location.x += trim.x;
-	    location.y += trim.y;
+		Rectangle trim= fProposalTable.getShell().computeTrim(0, 0, 0, 0);
+		location.x += trim.x;
+		location.y += trim.y;
 
 		return location;
 	}
@@ -566,14 +566,14 @@
 		Point sizeConstraint= super.computeSizeConstraints(subjectControl, informationControl);
 		Point size= subjectControl.getShell().getSize();
 
-	    // AbstractInformationControlManager#internalShowInformationControl(Rectangle, Object) adds trims
+		// AbstractInformationControlManager#internalShowInformationControl(Rectangle, Object) adds trims
 		// to the computed constraints. Need to remove them here, to make the outer bounds of the additional
 		// info shell fit the bounds of the proposal shell:
-	    if (fInformationControl instanceof IInformationControlExtension3) {
-	    	Rectangle shellTrim= ((IInformationControlExtension3) fInformationControl).computeTrim();
-	    	size.x -= shellTrim.width;
-	    	size.y -= shellTrim.height;
-	    }
+		if (fInformationControl instanceof IInformationControlExtension3) {
+			Rectangle shellTrim= ((IInformationControlExtension3) fInformationControl).computeTrim();
+			size.x -= shellTrim.width;
+			size.y -= shellTrim.height;
+		}
 
 		if (sizeConstraint.x < size.x)
 			sizeConstraint.x= size.x;
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java
index d84b562..364b670 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java
@@ -740,36 +740,36 @@
 	 * @param control the control to watch for focus
 	 * @since 3.2
 	 */
-    private void addCommandSupport(final Control control) {
-    	final KeySequence commandSequence= fContentAssistant.getRepeatedInvocationKeySequence();
-    	if (commandSequence != null && !commandSequence.isEmpty() && fContentAssistant.isRepeatedInvocationMode()) {
-    		control.addFocusListener(new FocusListener() {
-    			private CommandKeyListener fCommandKeyListener;
-    			@Override
+	private void addCommandSupport(final Control control) {
+		final KeySequence commandSequence= fContentAssistant.getRepeatedInvocationKeySequence();
+		if (commandSequence != null && !commandSequence.isEmpty() && fContentAssistant.isRepeatedInvocationMode()) {
+			control.addFocusListener(new FocusListener() {
+				private CommandKeyListener fCommandKeyListener;
+				@Override
 				public void focusGained(FocusEvent e) {
-    				if (Helper.okToUse(control)) {
-    					if (fCommandKeyListener == null) {
-    						fCommandKeyListener= new CommandKeyListener(commandSequence);
-    						fProposalTable.addKeyListener(fCommandKeyListener);
-    					}
-    				}
-    			}
-    			@Override
+					if (Helper.okToUse(control)) {
+						if (fCommandKeyListener == null) {
+							fCommandKeyListener= new CommandKeyListener(commandSequence);
+							fProposalTable.addKeyListener(fCommandKeyListener);
+						}
+					}
+				}
+				@Override
 				public void focusLost(FocusEvent e) {
-    				if (fCommandKeyListener != null) {
-    					control.removeKeyListener(fCommandKeyListener);
-    					fCommandKeyListener= null;
-    				}
-    			}
-    		});
-    	}
-    	if (fAdditionalInfoController != null) {
-	    	control.addFocusListener(new FocusListener() {
-	    		private TraverseListener fTraverseListener;
-	    		@Override
+					if (fCommandKeyListener != null) {
+						control.removeKeyListener(fCommandKeyListener);
+						fCommandKeyListener= null;
+					}
+				}
+			});
+		}
+		if (fAdditionalInfoController != null) {
+			control.addFocusListener(new FocusListener() {
+				private TraverseListener fTraverseListener;
+				@Override
 				public void focusGained(FocusEvent e) {
-	    			if (Helper.okToUse(control)) {
-	    				if (fTraverseListener == null) {
+					if (Helper.okToUse(control)) {
+						if (fTraverseListener == null) {
 							fTraverseListener= new TraverseListener() {
 								@Override
 								public void keyTraversed(TraverseEvent event) {
@@ -782,20 +782,20 @@
 									}
 								}
 							};
-	    					fProposalTable.addTraverseListener(fTraverseListener);
-	    				}
-	    			}
-	    		}
-	    		@Override
+							fProposalTable.addTraverseListener(fTraverseListener);
+						}
+					}
+				}
+				@Override
 				public void focusLost(FocusEvent e) {
-	    			if (fTraverseListener != null) {
-	    				control.removeTraverseListener(fTraverseListener);
-	    				fTraverseListener= null;
-	    			}
-	    		}
-	    	});
-    	}
-    }
+					if (fTraverseListener != null) {
+						control.removeTraverseListener(fTraverseListener);
+						fTraverseListener= null;
+					}
+				}
+			});
+		}
+	}
 
 	/**
 	 * Returns the background color to use.
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
index 79ef8c9..a301bbd 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
@@ -2464,12 +2464,12 @@
 	/**
 	 * Returns the prefix completion state.
 	 *
-     * @return <code>true</code> if prefix completion is enabled, <code>false</code> otherwise
-     * @since 3.2
-     */
-    boolean isPrefixCompletionEnabled() {
-	    return fIsPrefixCompletionEnabled;
-    }
+	 * @return <code>true</code> if prefix completion is enabled, <code>false</code> otherwise
+	 * @since 3.2
+	 */
+	boolean isPrefixCompletionEnabled() {
+		return fIsPrefixCompletionEnabled;
+	}
 
 	/**
 	 * Returns whether the content assistant proposal popup has the focus.
@@ -2732,7 +2732,7 @@
 	 * @since 3.4
 	 */
 	boolean isColoredLabelsSupportEnabled() {
-	    return fIsColoredLabelsSupportEnabled;
+		return fIsColoredLabelsSupportEnabled;
 	}
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContextInformationPopup.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContextInformationPopup.java
index 9bbc4fb..6f8b9e9 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContextInformationPopup.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContextInformationPopup.java
@@ -823,7 +823,7 @@
 
 		} else if (key == SWT.ESC) {
 			e.doit= false;
- 			hideContextInfoPopup();
+			hideContextInfoPopup();
 		} else {
 			validateContextInformation();
 		}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/AbstractReconciler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/AbstractReconciler.java
index d97b12f..c239745 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/AbstractReconciler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/AbstractReconciler.java
@@ -150,7 +150,7 @@
 				}
 			}
 
-            reconcilerReset();
+			reconcilerReset();
 		}
 
 		/**
@@ -482,12 +482,12 @@
 			}
 			fListener= null;
 
-            synchronized (this) {
-                // http://dev.eclipse.org/bugs/show_bug.cgi?id=19135
-    			BackgroundThread bt= fThread;
-    			fThread= null;
-    			bt.cancel();
-            }
+			synchronized (this) {
+				// http://dev.eclipse.org/bugs/show_bug.cgi?id=19135
+				BackgroundThread bt= fThread;
+				fThread= null;
+				bt.cancel();
+			}
 		}
 	}
 
@@ -578,13 +578,13 @@
 		}
 	}
 
-    /**
-     * Hook that is called after the reconciler thread has been reset.
-     */
-    protected void reconcilerReset() {
-    }
+	/**
+	 * Hook that is called after the reconciler thread has been reset.
+	 */
+	protected void reconcilerReset() {
+	}
 
-    /**
+	/**
 	 * Tells whether the code is running in this reconciler's
 	 * background thread.
 	 *
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/DefaultPartitioner.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/DefaultPartitioner.java
index e0c979a..b8243a7 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/DefaultPartitioner.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/DefaultPartitioner.java
@@ -514,7 +514,7 @@
 		return null;
 	}
 
-    /* zero-length partition support */
+	/* zero-length partition support */
 
 	@Override
 	public String getContentType(int offset, boolean preferOpenPartitions) {
@@ -534,7 +534,7 @@
 				return new TypedRegion(offset, 0, IDocument.DEFAULT_CONTENT_TYPE);
 			}
 		}
-        return region;
+		return region;
 	}
 
 	@Override
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/FastPartitioner.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/FastPartitioner.java
index 4405a7d..5d1301a 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/FastPartitioner.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/FastPartitioner.java
@@ -574,7 +574,7 @@
 		return null;
 	}
 
-    /* zero-length partition support */
+	/* zero-length partition support */
 
 	/**
 	 * {@inheritDoc}
@@ -606,7 +606,7 @@
 				return new TypedRegion(offset, 0, IDocument.DEFAULT_CONTENT_TYPE);
 			}
 		}
-        return region;
+		return region;
 	}
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedPartitioner.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedPartitioner.java
index 2cee441..a5e508c 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedPartitioner.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedPartitioner.java
@@ -506,7 +506,7 @@
 		return null;
 	}
 
-    /* zero-length partition support */
+	/* zero-length partition support */
 
 	@Override
 	public String getContentType(int offset, boolean preferOpenPartitions) {
@@ -526,7 +526,7 @@
 				return new TypedRegion(offset, 0, IDocument.DEFAULT_CONTENT_TYPE);
 			}
 		}
-        return region;
+		return region;
 	}
 
 	@Override
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedScanner.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedScanner.java
index a61caa3..a9c8213 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedScanner.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/rules/RuleBasedScanner.java
@@ -195,7 +195,7 @@
 
 	@Override
 	public void unread() {
-    	--fOffset;
+		--fOffset;
 		fColumn= UNDEFINED;
 	}
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationBarHoverManager.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationBarHoverManager.java
index 53a0515..aa80985 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationBarHoverManager.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationBarHoverManager.java
@@ -350,14 +350,14 @@
 
 	@Override
 	protected void showInformationControl(Rectangle subjectArea) {
-	    super.showInformationControl(subjectArea);
-	    fCurrentHover= getHover(getHoverEvent());
+		super.showInformationControl(subjectArea);
+		fCurrentHover= getHover(getHoverEvent());
 	}
 
 	@Override
 	protected void hideInformationControl() {
 		fCurrentHover= null;
-	    super.hideInformationControl();
+		super.hideInformationControl();
 	}
 
 	/**
@@ -707,9 +707,9 @@
 	 * @return the currently shown annotation hover or <code>null</code>
 	 * @since 3.2
 	 */
-    public IAnnotationHover getCurrentAnnotationHover() {
-	    return fCurrentHover;
-    }
+	public IAnnotationHover getCurrentAnnotationHover() {
+		return fCurrentHover;
+	}
 
 	/**
 	 * Returns an adapter that gives access to internal methods.
@@ -722,9 +722,9 @@
 	 * @noreference This method is not intended to be referenced by clients.
 	 * @nooverride This method is not intended to be re-implemented or extended by clients.
 	 */
-    @Override
+	@Override
 	public InternalAccessor getInternalAccessor() {
-    	return new InternalAccessor() {
+		return new InternalAccessor() {
 			@Override
 			public IInformationControl getCurrentInformationControl() {
 				return AnnotationBarHoverManager.super.getInternalAccessor().getCurrentInformationControl();
@@ -770,6 +770,6 @@
 				return fAllowMouseExit;
 			}
 		};
-    }
+	}
 }
 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java
index 493c3e9..4e967c8 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java
@@ -957,8 +957,8 @@
 	private void invalidateTextPresentation() {
 		IRegion r= null;
 		synchronized (fHighlightedDecorationsMapLock) {
-		    if (fCurrentHighlightAnnotationRange != null)
-		    	r= new Region(fCurrentHighlightAnnotationRange.getOffset(), fCurrentHighlightAnnotationRange.getLength());
+			if (fCurrentHighlightAnnotationRange != null)
+				r= new Region(fCurrentHighlightAnnotationRange.getOffset(), fCurrentHighlightAnnotationRange.getLength());
 		}
 		if (r == null)
 			return;
@@ -1610,10 +1610,10 @@
 	}
 
 	/**
-     * Retrieves the annotation model from the given source viewer.
-     *
-     * @param sourceViewer the source viewer
-     * @return the source viewer's annotation model or <code>null</code> if none can be found
+	 * Retrieves the annotation model from the given source viewer.
+	 *
+	 * @param sourceViewer the source viewer
+	 * @return the source viewer's annotation model or <code>null</code> if none can be found
 	 * @since 3.0
 	 */
 	protected IAnnotationModel findAnnotationModel(ISourceViewer sourceViewer) {
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/ChangeRulerColumn.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/ChangeRulerColumn.java
index 9d49ec6..991c3d2 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/ChangeRulerColumn.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/ChangeRulerColumn.java
@@ -494,12 +494,12 @@
 	}
 
 	/**
-     * Returns the revision selection provider.
-     *
-     * @return the revision selection provider
-     * @since 3.2
-     */
-    public ISelectionProvider getRevisionSelectionProvider() {
-    	return fRevisionPainter.getRevisionSelectionProvider();
-    }
+	 * Returns the revision selection provider.
+	 *
+	 * @return the revision selection provider
+	 * @since 3.2
+	 */
+	public ISelectionProvider getRevisionSelectionProvider() {
+		return fRevisionPainter.getRevisionSelectionProvider();
+	}
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/IOverviewRuler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/IOverviewRuler.java
index 53c11e7..cd31396 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/IOverviewRuler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/IOverviewRuler.java
@@ -124,6 +124,6 @@
 	 * top of the text widget and the top of this overview ruler.
 	 *
 	 * @return the header control of this overview ruler.
- 	 */
+	 */
 	Control getHeaderControl();
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberChangeRulerColumn.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberChangeRulerColumn.java
index 955856f..326d6e7 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberChangeRulerColumn.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberChangeRulerColumn.java
@@ -229,16 +229,16 @@
 		postRedraw();
 	}
 
-    @Override
+	@Override
 	public ISelectionProvider getRevisionSelectionProvider() {
-	    return fRevisionPainter.getRevisionSelectionProvider();
-    }
+		return fRevisionPainter.getRevisionSelectionProvider();
+	}
 
-    /*
-     * @see org.eclipse.jface.text.revisions.IRevisionRulerColumnExtension#setRenderingMode(org.eclipse.jface.text.revisions.IRevisionRulerColumnExtension.RenderingMode)
-     * @since 3.3
-     */
-    @Override
+	/*
+	 * @see org.eclipse.jface.text.revisions.IRevisionRulerColumnExtension#setRenderingMode(org.eclipse.jface.text.revisions.IRevisionRulerColumnExtension.RenderingMode)
+	 * @since 3.3
+	 */
+	@Override
 	public void setRevisionRenderingMode(RenderingMode renderingMode) {
 		fRevisionPainter.setRenderingMode(renderingMode);
 	}
@@ -250,22 +250,22 @@
 	 *        diff / revision info.
 	 * @since 3.3
 	 */
-    public void showLineNumbers(boolean showNumbers) {
-    	if (fShowNumbers != showNumbers) {
-    		fShowNumbers= showNumbers;
+	public void showLineNumbers(boolean showNumbers) {
+		if (fShowNumbers != showNumbers) {
+			fShowNumbers= showNumbers;
 			updateNumberOfDigits();
 			computeIndentations();
 			layout(true);
-    	}
-    }
+		}
+	}
 
-    @Override
+	@Override
 	public int getWidth() {
-   		int width= super.getWidth();
+		int width= super.getWidth();
 		return width > 0 ? width : 8; // minimal width to display quick diff / revisions if no textual info is shown
-    }
+	}
 
-    /**
+	/**
 	 * Returns <code>true</code> if the ruler is showing line numbers, <code>false</code>
 	 * otherwise
 	 *
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java
index 3244d08..1e41584 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java
@@ -612,7 +612,7 @@
 		VisibleLinesTracker.track(fCachedTextViewer, lineHeightChangeHandler);
 
 		fCanvas= new Canvas(parentControl, SWT.NO_FOCUS ) {
- 			@Override
+			@Override
 			public void addMouseListener(MouseListener listener) {
 				// see bug 40889, bug 230073 and AnnotationRulerColumn#isPropagatingMouseListener()
 				if (listener == fMouseHandler)
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/OverviewRuler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/OverviewRuler.java
index 15b3029..a086fa2 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/OverviewRuler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/OverviewRuler.java
@@ -364,18 +364,18 @@
 				thumbHeight= verticalBar != null ? Math.max(Math.min(bounds.height, verticalBar.getThumbBounds().height), 0) : 0;
 			}
 
-	        int partialTopIndex= JFaceTextUtil.getPartialTopIndex(textWidget);
-	        int topLineHeight= textWidget.getLineHeight(textWidget.getOffsetAtLine(partialTopIndex));
-	        int topLinePixel= textWidget.getLinePixel(partialTopIndex);
-	        double topIndex= partialTopIndex - (double) topLinePixel / topLineHeight;
+			int partialTopIndex= JFaceTextUtil.getPartialTopIndex(textWidget);
+			int topLineHeight= textWidget.getLineHeight(textWidget.getOffsetAtLine(partialTopIndex));
+			int topLinePixel= textWidget.getLinePixel(partialTopIndex);
+			double topIndex= partialTopIndex - (double) topLinePixel / topLineHeight;
 
-	        int partialBottomIndex= JFaceTextUtil.getPartialBottomIndex(textWidget);
-	        int bottomLineHeight= textWidget.getLineHeight(textWidget.getOffsetAtLine(partialBottomIndex));
-	        int bottomLinePixel= textWidget.getLinePixel(partialBottomIndex);
-	        double bottomIndex= partialBottomIndex - ((double) bottomLinePixel - textWidget.getClientArea().height) / bottomLineHeight;
+			int partialBottomIndex= JFaceTextUtil.getPartialBottomIndex(textWidget);
+			int bottomLineHeight= textWidget.getLineHeight(textWidget.getOffsetAtLine(partialBottomIndex));
+			int bottomLinePixel= textWidget.getLinePixel(partialBottomIndex);
+			double bottomIndex= partialBottomIndex - ((double) bottomLinePixel - textWidget.getClientArea().height) / bottomLineHeight;
 
-	        visibleLines= bottomIndex - topIndex;
-	        invisibleLines= maxLines - visibleLines;
+			visibleLines= bottomIndex - topIndex;
+			invisibleLines= maxLines - visibleLines;
 		}
 	}
 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java
index f52244b..85395bd 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java
@@ -1258,14 +1258,14 @@
 		}
 	}
 
-    @Override
+	@Override
 	public IAnnotationHover getCurrentAnnotationHover() {
-    	if (fVerticalRulerHoveringController == null)
-    		return null;
-    	return fVerticalRulerHoveringController.getCurrentAnnotationHover();
-    }
+		if (fVerticalRulerHoveringController == null)
+			return null;
+		return fVerticalRulerHoveringController.getCurrentAnnotationHover();
+	}
 
-    @Override
+	@Override
 	public void setCodeMiningProviders(ICodeMiningProvider[] codeMiningProviders) {
 		boolean enable= codeMiningProviders != null && codeMiningProviders.length > 0;
 		fCodeMiningProviders= codeMiningProviders;
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/templates/TemplateProposal.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/templates/TemplateProposal.java
index 2e3067c..9a8c5b1 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/templates/TemplateProposal.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/templates/TemplateProposal.java
@@ -281,7 +281,7 @@
 
 	private int getCaretOffset(TemplateBuffer buffer) {
 
-	    TemplateVariable[] variables= buffer.getVariables();
+		TemplateVariable[] variables= buffer.getVariables();
 		for (int i= 0; i != variables.length; i++) {
 			TemplateVariable variable= variables[i];
 			if (variable.getType().equals(GlobalTemplateVariables.Cursor.NAME))
@@ -336,8 +336,8 @@
 
 	@Override
 	public String getAdditionalProposalInfo() {
-	    try {
-		    fContext.setReadOnly(true);
+		try {
+			fContext.setReadOnly(true);
 			TemplateBuffer templateBuffer;
 			try {
 				templateBuffer= fContext.evaluate(fTemplate);
@@ -347,7 +347,7 @@
 
 			return templateBuffer.getString();
 
-	    } catch (BadLocationException e) {
+		} catch (BadLocationException e) {
 			return null;
 		}
 	}
diff --git a/org.eclipse.search/META-INF/MANIFEST.MF b/org.eclipse.search/META-INF/MANIFEST.MF
index e1f7826..a47e00d 100644
--- a/org.eclipse.search/META-INF/MANIFEST.MF
+++ b/org.eclipse.search/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.search; singleton:=true
-Bundle-Version: 3.11.500.qualifier
+Bundle-Version: 3.11.600.qualifier
 Bundle-Activator: org.eclipse.search.internal.ui.SearchPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.search/new search/org/eclipse/search/ui/ISearchPageContainer.java b/org.eclipse.search/new search/org/eclipse/search/ui/ISearchPageContainer.java
index 8d15e6e..c90a658 100644
--- a/org.eclipse.search/new search/org/eclipse/search/ui/ISearchPageContainer.java
+++ b/org.eclipse.search/new search/org/eclipse/search/ui/ISearchPageContainer.java
@@ -98,7 +98,7 @@
 	 * The scope is WORKSPACE_SCOPE, SELECTED_PROJECTS_SCOPE, SELECTION_SCOPE or WORKING_SET_SCOPE.
 	 * @param scope the newly selected scope
 	 *
- 	 * @since 2.0
+	 * @since 2.0
 	 */
 	public void setSelectedScope(int scope);
 
@@ -106,7 +106,7 @@
 	 * Tells whether a valid scope is selected.
 	 *
 	 * @return a <code>true</code> if a valid scope is selected in this search page container
- 	 * @since 2.0
+	 * @since 2.0
 	 */
 	public boolean hasValidScope();
 
diff --git a/org.eclipse.search/new search/org/eclipse/search/ui/text/AbstractTextSearchViewPage.java b/org.eclipse.search/new search/org/eclipse/search/ui/text/AbstractTextSearchViewPage.java
index 01310e7..a3f53b0 100644
--- a/org.eclipse.search/new search/org/eclipse/search/ui/text/AbstractTextSearchViewPage.java
+++ b/org.eclipse.search/new search/org/eclipse/search/ui/text/AbstractTextSearchViewPage.java
@@ -152,14 +152,14 @@
 			} else {
 				fIsUIUpdateScheduled= false;
 				turnOnDecoration();
-                updateBusyLabel();
-                if (fScheduleEnsureSelection) {
-                    fScheduleEnsureSelection= false;
-                    AbstractTextSearchResult result = getInput();
-                    if (result != null && fViewer.getSelection().isEmpty()) {
-                        navigateNext(true);
-                    }
-                }
+				updateBusyLabel();
+				if (fScheduleEnsureSelection) {
+					fScheduleEnsureSelection= false;
+					AbstractTextSearchResult result = getInput();
+					if (result != null && fViewer.getSelection().isEmpty()) {
+						navigateNext(true);
+					}
+				}
 			}
 			fViewPart.updateLabel();
 			return Status.OK_STATUS;
@@ -210,7 +210,7 @@
 	}
 
 	private volatile boolean fIsUIUpdateScheduled= false;
-    private volatile boolean fScheduleEnsureSelection= false;
+	private volatile boolean fScheduleEnsureSelection= false;
 	private static final String KEY_LAYOUT = "org.eclipse.search.resultpage.layout"; //$NON-NLS-1$
 
 	/**
@@ -606,9 +606,9 @@
 
 			@Override
 			public void queryFinished(final ISearchQuery query) {
-                // handle the end of the query in the UIUpdateJob, as ui updates
-                // may not be finished here.
-                postEnsureSelection();
+				// handle the end of the query in the UIUpdateJob, as ui updates
+				// may not be finished here.
+				postEnsureSelection();
 			}
 		};
 	}
@@ -617,10 +617,10 @@
 	 * Posts a  UI update to make sure an element is selected.
 	 * @since 3.2
 	 */
-    protected void postEnsureSelection() {
-        fScheduleEnsureSelection= true;
-        scheduleUIUpdate();
-    }
+	protected void postEnsureSelection() {
+		fScheduleEnsureSelection= true;
+		scheduleUIUpdate();
+	}
 
 
 	private void updateBusyLabel() {
diff --git a/org.eclipse.search/new search/org/eclipse/search/ui/text/MatchFilter.java b/org.eclipse.search/new search/org/eclipse/search/ui/text/MatchFilter.java
index b94617b..391648a 100644
--- a/org.eclipse.search/new search/org/eclipse/search/ui/text/MatchFilter.java
+++ b/org.eclipse.search/new search/org/eclipse/search/ui/text/MatchFilter.java
@@ -21,40 +21,40 @@
  */
 public abstract class MatchFilter {
 
-    /**
-     * Returns whether the given match is filtered by this filter.
-     *
-     * @param match the match to look at
-     * @return returns <code>true</code> if the given match should be filtered or <code>false</code> if not.
-     */
+	/**
+	 * Returns whether the given match is filtered by this filter.
+	 *
+	 * @param match the match to look at
+	 * @return returns <code>true</code> if the given match should be filtered or <code>false</code> if not.
+	 */
 	public abstract boolean filters(Match match);
 
-    /**
-     * Returns the name of the filter as shown in the match filter selection dialog.
-     *
-     * @return the name of the filter as shown in the match filter selection dialog.
-     */
+	/**
+	 * Returns the name of the filter as shown in the match filter selection dialog.
+	 *
+	 * @return the name of the filter as shown in the match filter selection dialog.
+	 */
 	public abstract String getName();
 
-    /**
-     * Returns the description of the filter as shown in the match filter selection dialog.
-     *
-     * @return the description of the filter as shown in the match filter selection dialog.
-     */
+	/**
+	 * Returns the description of the filter as shown in the match filter selection dialog.
+	 *
+	 * @return the description of the filter as shown in the match filter selection dialog.
+	 */
 	public abstract String getDescription();
 
 	/**
-     * Returns the label of the filter as shown by the filter action.
-     *
-     * @return the label of the filter as shown by the filter action.
-     */
+	 * Returns the label of the filter as shown by the filter action.
+	 *
+	 * @return the label of the filter as shown by the filter action.
+	 */
 	public abstract String getActionLabel();
 
 	/**
-     * Returns an ID of this filter.
-     *
-     * @return the id of the filter to be used when persisting this filter.
-     */
+	 * Returns an ID of this filter.
+	 *
+	 * @return the id of the filter to be used when persisting this filter.
+	 */
 	public abstract String getID();
 
 }
diff --git a/org.eclipse.search/new search/org/eclipse/search/ui/text/TextSearchQueryProvider.java b/org.eclipse.search/new search/org/eclipse/search/ui/text/TextSearchQueryProvider.java
index a58695c..0613d9c 100644
--- a/org.eclipse.search/new search/org/eclipse/search/ui/text/TextSearchQueryProvider.java
+++ b/org.eclipse.search/new search/org/eclipse/search/ui/text/TextSearchQueryProvider.java
@@ -37,9 +37,9 @@
 
 	/**
 	 * Specified the input for a search query.
-     * <p>
-     * Clients may instantiate this class.
-     * </p>
+	 * <p>
+	 * Clients may instantiate this class.
+	 * </p>
 	 */
 	public static abstract class TextSearchInput {
 
diff --git a/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistoryDropDownAction.java b/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistoryDropDownAction.java
index 361691b..51904bc 100644
--- a/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistoryDropDownAction.java
+++ b/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistoryDropDownAction.java
@@ -36,7 +36,7 @@
 		private ISearchResult fSearch;
 
 		public ShowSearchFromHistoryAction(ISearchResult search) {
-	        super("", AS_RADIO_BUTTON); //$NON-NLS-1$
+			super("", AS_RADIO_BUTTON); //$NON-NLS-1$
 			fSearch= search;
 
 			String label= escapeAmp(search.getLabel());
diff --git a/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistorySelectionDialog.java b/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistorySelectionDialog.java
index d727777..6ee61f8 100644
--- a/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistorySelectionDialog.java
+++ b/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchHistorySelectionDialog.java
@@ -321,14 +321,14 @@
 		table.setLayoutData(gd);
 
 
-        fRemoveButton= new Button(parent, SWT.PUSH);
-        fRemoveButton.setText(SearchMessages.SearchesDialog_remove_label);
-        fRemoveButton.addSelectionListener(new SelectionAdapter() {
-            @Override
+		fRemoveButton= new Button(parent, SWT.PUSH);
+		fRemoveButton.setText(SearchMessages.SearchesDialog_remove_label);
+		fRemoveButton.addSelectionListener(new SelectionAdapter() {
+			@Override
 			public void widgetSelected(SelectionEvent event) {
-                buttonPressed(REMOVE_ID);
-            }
-        });
+				buttonPressed(REMOVE_ID);
+			}
+		});
 		fRemoveButton.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false));
 		SWTUtil.setButtonDimensionHint(fRemoveButton);
 
diff --git a/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchMessages.java b/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchMessages.java
index 9552fa9..7a3de33 100644
--- a/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchMessages.java
+++ b/org.eclipse.search/new search/org/eclipse/search2/internal/ui/SearchMessages.java
@@ -23,9 +23,9 @@
 		// Do not instantiate
 	}
 
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, SearchMessages.class);
-    }
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, SearchMessages.class);
+	}
 
 	public static String AbstractTextSearchViewPage_update_job_name;
 	public static String MatchFilterSelectionAction_label;
@@ -92,11 +92,11 @@
 	public static String PinSearchViewAction_label;
 	public static String PinSearchViewAction_tooltip;
 	public static String SearchPageRegistry_error_creating_extensionpoint;
-    public static String TextSearchGroup_submenu_text;
-    public static String FindInWorkspaceActionDelegate_text;
-    public static String FindInProjectActionDelegate_text;
-    public static String FindInWorkingSetActionDelegate_text;
-    public static String FindInFileActionDelegate_text;
+	public static String TextSearchGroup_submenu_text;
+	public static String FindInWorkspaceActionDelegate_text;
+	public static String FindInProjectActionDelegate_text;
+	public static String FindInWorkingSetActionDelegate_text;
+	public static String FindInFileActionDelegate_text;
 	public static String TextSearchQueryProviderRegistry_defaultProviderLabel;
 	public static String RetrieverAction_dialog_title;
 	public static String RetrieverAction_empty_selection;
diff --git a/org.eclipse.search/pom.xml b/org.eclipse.search/pom.xml
index a5c584c..8f32b33 100644
--- a/org.eclipse.search/pom.xml
+++ b/org.eclipse.search/pom.xml
@@ -18,6 +18,6 @@
   </parent>
   <groupId>org.eclipse.search</groupId>
   <artifactId>org.eclipse.search</artifactId>
-  <version>3.11.500-SNAPSHOT</version>
+  <version>3.11.600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/core/text/FileNamePatternSearchScope.java b/org.eclipse.search/search/org/eclipse/search/internal/core/text/FileNamePatternSearchScope.java
index ec48bda..28cd589 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/core/text/FileNamePatternSearchScope.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/core/text/FileNamePatternSearchScope.java
@@ -136,7 +136,7 @@
 	 * @return returns true if the file name is matching to a file name pattern
 	 */
 	private boolean matchesFileName(String fileName) {
- 		return getFileNameMatcher().reset(fileName).matches();
+		return getFileNameMatcher().reset(fileName).matches();
 	}
 
 	/**
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java b/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java
index 5210d25..f4b1a8b 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java
@@ -156,9 +156,9 @@
 	}
 
 
-    private static boolean isWordChar(char c) {
-        return Character.isLetterOrDigit(c);
-    }
+	private static boolean isWordChar(char c) {
+		return Character.isLetterOrDigit(c);
+	}
 
 	/**
 	 * Creates a pattern element from an array of patterns in the old 'StringMatcher' format.
@@ -172,8 +172,8 @@
 		StringBuilder pattern= new StringBuilder();
 		for (int i= 0; i < patterns.length; i++) {
 			if (i > 0) {
-                // note that this works only as we know that the operands of the
-                // or expression will be simple and need no brackets.
+				// note that this works only as we know that the operands of the
+				// or expression will be simple and need no brackets.
 				pattern.append('|');
 			}
 			appendAsRegEx(true, patterns[i], pattern);
@@ -183,75 +183,75 @@
 
 
 	public static StringBuilder appendAsRegEx(boolean isStringMatcher, String pattern, StringBuilder buffer) {
-        boolean isEscaped= false;
-        for (int i = 0; i < pattern.length(); i++) {
-            char c = pattern.charAt(i);
-            switch(c) {
-            // the backslash
-            case '\\':
-                // the backslash is escape char in string matcher
-                if (isStringMatcher && !isEscaped) {
-                    isEscaped= true;
-                }
-                else {
-                    buffer.append("\\\\");  //$NON-NLS-1$
-                    isEscaped= false;
-                }
-                break;
-            // characters that need to be escaped in the regex.
-            case '(':
-            case ')':
-            case '{':
-            case '}':
-            case '.':
-            case '[':
-            case ']':
-            case '$':
-            case '^':
-            case '+':
-            case '|':
-                if (isEscaped) {
-                    buffer.append("\\\\");  //$NON-NLS-1$
-                    isEscaped= false;
-                }
-                buffer.append('\\');
-                buffer.append(c);
-                break;
-            case '?':
-                if (isStringMatcher && !isEscaped) {
-                    buffer.append('.');
-                }
-                else {
-                    buffer.append('\\');
-                    buffer.append(c);
-                    isEscaped= false;
-                }
-                break;
-            case '*':
-                if (isStringMatcher && !isEscaped) {
-                    buffer.append(".*"); //$NON-NLS-1$
-                }
-                else {
-                    buffer.append('\\');
-                    buffer.append(c);
-                    isEscaped= false;
-                }
-                break;
-            default:
-                if (isEscaped) {
-                    buffer.append("\\\\");  //$NON-NLS-1$
-                    isEscaped= false;
-                }
-                buffer.append(c);
-                break;
-            }
-        }
-        if (isEscaped) {
-            buffer.append("\\\\");  //$NON-NLS-1$
-            isEscaped= false;
-        }
-        return buffer;
-    }
+		boolean isEscaped= false;
+		for (int i = 0; i < pattern.length(); i++) {
+			char c = pattern.charAt(i);
+			switch(c) {
+			// the backslash
+			case '\\':
+				// the backslash is escape char in string matcher
+				if (isStringMatcher && !isEscaped) {
+					isEscaped= true;
+				}
+				else {
+					buffer.append("\\\\");  //$NON-NLS-1$
+					isEscaped= false;
+				}
+				break;
+			// characters that need to be escaped in the regex.
+			case '(':
+			case ')':
+			case '{':
+			case '}':
+			case '.':
+			case '[':
+			case ']':
+			case '$':
+			case '^':
+			case '+':
+			case '|':
+				if (isEscaped) {
+					buffer.append("\\\\");  //$NON-NLS-1$
+					isEscaped= false;
+				}
+				buffer.append('\\');
+				buffer.append(c);
+				break;
+			case '?':
+				if (isStringMatcher && !isEscaped) {
+					buffer.append('.');
+				}
+				else {
+					buffer.append('\\');
+					buffer.append(c);
+					isEscaped= false;
+				}
+				break;
+			case '*':
+				if (isStringMatcher && !isEscaped) {
+					buffer.append(".*"); //$NON-NLS-1$
+				}
+				else {
+					buffer.append('\\');
+					buffer.append(c);
+					isEscaped= false;
+				}
+				break;
+			default:
+				if (isEscaped) {
+					buffer.append("\\\\");  //$NON-NLS-1$
+					isEscaped= false;
+				}
+				buffer.append(c);
+				break;
+			}
+		}
+		if (isEscaped) {
+			buffer.append("\\\\");  //$NON-NLS-1$
+			isEscaped= false;
+		}
+		return buffer;
+	}
 
 	/**
 	 * Interprets escaped characters in the given replace pattern.
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/core/text/TextSearchVisitor.java b/org.eclipse.search/search/org/eclipse/search/internal/core/text/TextSearchVisitor.java
index d7cb7cc..d54ca7c 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/core/text/TextSearchVisitor.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/core/text/TextSearchVisitor.java
@@ -434,7 +434,7 @@
 				System.out.println(Messages.format(
 						"[TextSearch] Search duration for {0} files in {1} jobs using {2} threads: {3}ms", args)); //$NON-NLS-1$
 			}
-	   }
+		}
 	}
 
 	public IStatus search(TextSearchScope scope, IProgressMonitor monitor) {
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDialog.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDialog.java
index 4af679f..316279d 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDialog.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDialog.java
@@ -385,7 +385,7 @@
 		ArrayList<SearchPageDescriptor> filteredList= new ArrayList<>(input.size());
 		for (SearchPageDescriptor descriptor : input) {
 			if (!WorkbenchActivityHelper.filterItem(descriptor))
-			    filteredList.add(descriptor);
+				filteredList.add(descriptor);
 
 		}
 		return filteredList;
@@ -431,7 +431,7 @@
 		for (int i= 0; i < numPages; i++) {
 			SearchPageDescriptor descriptor= getDescriptorAt(i);
 			if (WorkbenchActivityHelper.filterItem(descriptor))
-			    continue;
+				continue;
 
 			final CTabItem item = new CTabItem(folder, SWT.NONE);
 			item.setData("descriptor", descriptor); //$NON-NLS-1$
@@ -480,9 +480,9 @@
 		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
 		// create help control if needed
-        if (isHelpAvailable()) {
-        	createHelpControl(composite);
-        }
+		if (isHelpAvailable()) {
+			createHelpControl(composite);
+		}
 		fCustomizeButton= createButton(composite, CUSTOMIZE_ID, SearchMessages.SearchDialog_customize, true);
 
 		Label filler= new Label(composite, SWT.NONE);
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchMessages.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchMessages.java
index 128325b..090407b 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchMessages.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchMessages.java
@@ -216,7 +216,7 @@
 	}
 
 //	public static String ReplaceDialog2_nomatches_error;
-    public static String SearchPreferencePage_textSearchEngine;
+	public static String SearchPreferencePage_textSearchEngine;
 	public static String TextSearchEngineRegistry_defaulttextsearch_label;
 	public static String FileSearchQuery_singularPatternWithFileExt;
 	public static String FileSearchQuery_pluralPatternWithFileExt;
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPageDescriptor.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPageDescriptor.java
index 372c4de..e9ced17 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPageDescriptor.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPageDescriptor.java
@@ -192,15 +192,15 @@
 		if (sizeHint != null) {
 			int commaSep= sizeHint.indexOf(',');
 			if (commaSep != -1) {
-		        try {
-		            int xval= Integer.parseInt(sizeHint.substring(0, commaSep).trim());
-		            int yval= Integer.parseInt(sizeHint.substring(commaSep + 1).trim());
-		            return new Point(xval, yval);
-		        } catch (NumberFormatException e) {
-		        }
+				try {
+					int xval= Integer.parseInt(sizeHint.substring(0, commaSep).trim());
+					int yval= Integer.parseInt(sizeHint.substring(commaSep + 1).trim());
+					return new Point(xval, yval);
+				} catch (NumberFormatException e) {
+				}
 			}
 		}
-    	return UNKNOWN_SIZE;
+		return UNKNOWN_SIZE;
 	}
 
 	/**
@@ -367,13 +367,13 @@
 		}
 	}
 
-    @Override
+	@Override
 	public String getLocalId() {
-        return getId();
-    }
+		return getId();
+	}
 
-    @Override
+	@Override
 	public String getPluginId() {
-        return fElement.getContributor().getName();
-    }
+		return fElement.getContributor().getName();
+	}
 }
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java
index 62feefb..d5860f2 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java
@@ -302,19 +302,19 @@
 	}
 
 
-    public TextSearchEngineRegistry getTextSearchEngineRegistry() {
-        if (fTextSearchEngineRegistry == null) {
-        	fTextSearchEngineRegistry= new TextSearchEngineRegistry();
-        }
-        return fTextSearchEngineRegistry;
-    }
+	public TextSearchEngineRegistry getTextSearchEngineRegistry() {
+		if (fTextSearchEngineRegistry == null) {
+			fTextSearchEngineRegistry= new TextSearchEngineRegistry();
+		}
+		return fTextSearchEngineRegistry;
+	}
 
-    public TextSearchQueryProviderRegistry getTextSearchQueryProviderRegistry() {
-        if (fTextSearchQueryProviderRegistry == null) {
-        	fTextSearchQueryProviderRegistry= new TextSearchQueryProviderRegistry();
-        }
-        return fTextSearchQueryProviderRegistry;
-    }
+	public TextSearchQueryProviderRegistry getTextSearchQueryProviderRegistry() {
+		if (fTextSearchQueryProviderRegistry == null) {
+			fTextSearchQueryProviderRegistry= new TextSearchQueryProviderRegistry();
+		}
+		return fTextSearchQueryProviderRegistry;
+	}
 
 	/**
 	 * Creates all necessary sorter description nodes.
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPreferencePage.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPreferencePage.java
index 331f9c8..7e86869 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPreferencePage.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPreferencePage.java
@@ -53,8 +53,8 @@
 	public static final String DEFAULT_PERSPECTIVE= "org.eclipse.search.defaultPerspective"; //$NON-NLS-1$
 	private static final String NO_DEFAULT_PERSPECTIVE= "org.eclipse.search.defaultPerspective.none"; //$NON-NLS-1$
 	public static final String BRING_VIEW_TO_FRONT= "org.eclipse.search.bringToFront"; //$NON-NLS-1$
-    public static final String TEXT_SEARCH_ENGINE = "org.eclipse.search.textSearchEngine"; //$NON-NLS-1$
-    public static final String TEXT_SEARCH_QUERY_PROVIDER = "org.eclipse.search.textSearchQueryProvider"; //$NON-NLS-1$
+	public static final String TEXT_SEARCH_ENGINE = "org.eclipse.search.textSearchEngine"; //$NON-NLS-1$
+	public static final String TEXT_SEARCH_QUERY_PROVIDER = "org.eclipse.search.textSearchQueryProvider"; //$NON-NLS-1$
 	public static final String LIMIT_HISTORY= "org.eclipse.search.limitHistory"; //$NON-NLS-1$
 
 	private ColorFieldEditor fColorEditor;
@@ -119,7 +119,7 @@
 			POTENTIAL_MATCH_FG_COLOR,
 			SearchMessages.SearchPreferencePage_potentialMatchFgColor,
 			getFieldEditorParent()
-        );
+		);
 		addField(fColorEditor);
 
 		fEmphasizedCheckbox.setEnabled(!arePotentialMatchesIgnored(), getFieldEditorParent());
@@ -134,17 +134,17 @@
 			getFieldEditorParent());
 		addField(comboEditor);
 
-        // in case we have a contributed engine, let the user choose.
-        TextSearchEngineRegistry reg= SearchPlugin.getDefault().getTextSearchEngineRegistry();
-        String[][] engineNamesAndIds= reg.getAvailableEngines();
-        if (engineNamesAndIds.length > 1) {
-            comboEditor= new ComboFieldEditor(
-                    TEXT_SEARCH_ENGINE,
-                    SearchMessages.SearchPreferencePage_textSearchEngine,
-                    engineNamesAndIds,
-                    getFieldEditorParent());
-            addField(comboEditor);
-        }
+		// in case we have a contributed engine, let the user choose.
+		TextSearchEngineRegistry reg= SearchPlugin.getDefault().getTextSearchEngineRegistry();
+		String[][] engineNamesAndIds= reg.getAvailableEngines();
+		if (engineNamesAndIds.length > 1) {
+			comboEditor= new ComboFieldEditor(
+					TEXT_SEARCH_ENGINE,
+					SearchMessages.SearchPreferencePage_textSearchEngine,
+					engineNamesAndIds,
+					getFieldEditorParent());
+			addField(comboEditor);
+		}
 	}
 
 	@Override
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java
index 32a76bc..6d843df 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java
@@ -132,10 +132,10 @@
 		item.fill(parent, -1);
 	}
 
-    @Override
+	@Override
 	public void run() {
 		// nothing to do
-	    }
+	}
 
 	private SorterDescriptor findSorter(String pageId) {
 		Iterator<SorterDescriptor> iter= SearchPlugin.getDefault().getSorterDescriptors().iterator();
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileSearchPage.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileSearchPage.java
index 8a64d62..b396c04 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileSearchPage.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileSearchPage.java
@@ -90,30 +90,30 @@
 			return 2;
 		}
 
-	    @Override
+		@Override
 		public int compare(Viewer viewer, Object e1, Object e2) {
-	        int cat1 = category(e1);
-	        int cat2 = category(e2);
+			int cat1 = category(e1);
+			int cat2 = category(e2);
 
-	        if (cat1 != cat2) {
+			if (cat1 != cat2) {
 				return cat1 - cat2;
 			}
 
-	        if (e1 instanceof LineElement && e2 instanceof LineElement) {
+			if (e1 instanceof LineElement && e2 instanceof LineElement) {
 				LineElement m1= (LineElement) e1;
 				LineElement m2= (LineElement) e2;
-        		return m1.getOffset() - m2.getOffset();
-	        }
+				return m1.getOffset() - m2.getOffset();
+			}
 
-	        String name1= fLabelProvider.getText(e1);
-	        String name2= fLabelProvider.getText(e2);
-	        if (name1 == null)
-	            name1 = "";//$NON-NLS-1$
-	        if (name2 == null)
-	            name2 = "";//$NON-NLS-1$
+			String name1= fLabelProvider.getText(e1);
+			String name2= fLabelProvider.getText(e2);
+			if (name1 == null)
+				name1 = "";//$NON-NLS-1$
+			if (name2 == null)
+				name2 = "";//$NON-NLS-1$
 			int result= getComparator().compare(name1, name2);
 			return result;
-	    }
+		}
 	}
 
 	private static final String KEY_SORTING= "org.eclipse.search.resultpage.sorting"; //$NON-NLS-1$
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceConfigurationPage.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceConfigurationPage.java
index 07a7d59..8035774 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceConfigurationPage.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceConfigurationPage.java
@@ -63,12 +63,12 @@
 	public ReplaceConfigurationPage(ReplaceRefactoring refactoring) {
 		super("ReplaceConfigurationPage"); //$NON-NLS-1$
 		fReplaceRefactoring= refactoring;
-    }
+	}
 
-    @Override
+	@Override
 	public void createControl(Composite parent) {
-    	Composite result= new Composite(parent, SWT.NONE);
-    	GridLayout layout= new GridLayout(2, false);
+		Composite result= new Composite(parent, SWT.NONE);
+		GridLayout layout= new GridLayout(2, false);
 		result.setLayout(layout);
 
 		Label description= new Label(result, SWT.NONE);
@@ -153,7 +153,7 @@
 		Dialog.applyDialogFont(result);
 
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ISearchHelpContextIds.REPLACE_DIALOG);
-    }
+	}
 
 	final void updateOKStatus() {
 		RefactoringStatus status= new RefactoringStatus();
@@ -176,7 +176,7 @@
 		fTextFieldContentAssist.setEnabled(enable);
 	}
 
-    @Override
+	@Override
 	protected boolean performFinish() {
 		initializeRefactoring();
 		storeSettings();
@@ -204,10 +204,10 @@
 		IDialogSettings settings= SearchPlugin.getDefault().getDialogSettings().addNewSection(SETTINGS_GROUP);
 		settings.put(SETTINGS_REPLACE_WITH, history.toArray(new String[history.size()]));
 
-    }
+	}
 
 	private void initializeRefactoring() {
 		fReplaceRefactoring.setReplaceString(fTextField.getText());
-    }
+	}
 
 }
\ No newline at end of file
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceRefactoring.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceRefactoring.java
index 6c7648f..e07c365 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceRefactoring.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/ReplaceRefactoring.java
@@ -476,15 +476,15 @@
 				replacementText= PatternConstructor.interpretReplaceEscapes(replacementText, originalText, lineDelimiter);
 
 				Matcher matcher= pattern.matcher(originalText);
-		        StringBuffer sb = new StringBuffer();
-		        matcher.reset();
-		        if (matcher.find()) {
-		        	matcher.appendReplacement(sb, replacementText);
-		        } else {
-		        	return null;
-		        }
-		        matcher.appendTail(sb);
-		        return sb.toString();
+				StringBuffer sb = new StringBuffer();
+				matcher.reset();
+				if (matcher.find()) {
+					matcher.appendReplacement(sb, replacementText);
+				} else {
+					return null;
+				}
+				matcher.appendTail(sb);
+				return sb.toString();
 			} catch (IndexOutOfBoundsException ex) {
 				throw new PatternSyntaxException(ex.getLocalizedMessage(), replacementText, -1);
 			}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/TextSearchPage.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/TextSearchPage.java
index 09ce30a..75bb63e 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/TextSearchPage.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/TextSearchPage.java
@@ -279,7 +279,7 @@
 			ErrorDialog.openError(getShell(), SearchMessages.TextSearchPage_replace_searchproblems_title, SearchMessages.TextSearchPage_replace_searchproblems_message, e.getStatus());
 			return false;
 		}
- 		return true;
+		return true;
 	}
 
 	@Override
@@ -741,7 +741,7 @@
 		});
 		fSearchBinaryCheckbox.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 1, 1));
 		fSearchBinaryCheckbox.setFont(searchInGroup.getFont());
-  	}
+	}
 
 	/**
 	 * Sets the search page's container.
diff --git a/org.eclipse.search/search/org/eclipse/search/ui/ISearchResultView.java b/org.eclipse.search/search/org/eclipse/search/ui/ISearchResultView.java
index 19696cb..180084c 100644
--- a/org.eclipse.search/search/org/eclipse/search/ui/ISearchResultView.java
+++ b/org.eclipse.search/search/org/eclipse/search/ui/ISearchResultView.java
@@ -53,26 +53,26 @@
 	 * If every match should show up in the search result view then the match
 	 * itself can be used as key.
 	 *
- 	 * @param	groupFactory			the action group factory
-  	 *								  		or <code>null</code> if no factory is provided.
- 	 * @param	singularLabel			the label to be used for this search occurrence
- 	 * 									  if there is one match
+	 * @param	groupFactory			the action group factory
+	 *								  		or <code>null</code> if no factory is provided.
+	 * @param	singularLabel			the label to be used for this search occurrence
+	 * 									  if there is one match
 	 *									  or <code>null</code> if the pluralLabelPattern should be used
- 	 * @param	pluralLabelPattern		the label pattern to be used for this search occurrence
- 	 * 									  if there are more than one matches or none.
- 	 * 									  This string may contain {0} which will be replace by the match count
- 	 * @param	imageDescriptor			the image descriptor to be used for this search occurrence,
+	 * @param	pluralLabelPattern		the label pattern to be used for this search occurrence
+	 * 									  if there are more than one matches or none.
+	 * 									  This string may contain {0} which will be replace by the match count
+	 * @param	imageDescriptor			the image descriptor to be used for this search occurrence,
 	 *									  or <code>null</code> if this search should not have an image
 	 * @param	pageId					the id of the search page which started the search
 	 * @param	labelProvider			the label provider used by this search result view
-  	 *									  or <code>null</code> if the default provider should be used.
+	 *									  or <code>null</code> if the default provider should be used.
 	 *									  The default label provider shows the resource name and the corresponding image.
 	 * @param	gotoAction				the action used by the view to go to a marker
 	 * @param	groupByKeyComputer		the computer used by the view to compute the key for a marker
 	 * @param	operation				the runnable used by the view to repeat the search
 	 *
 	 * @see IActionGroupFactory
- 	 * @since 2.0
+	 * @since 2.0
 	 */
 	public void searchStarted(
 				IActionGroupFactory		groupFactory,
@@ -200,7 +200,7 @@
 	 *
 	 * @param	description		the text description of the match
 	 * @param	groupByKey		the <code>Object</code> by which this match is grouped
- 	 * @param	marker			the marker for this match
+	 * @param	marker			the marker for this match
 	 * @param	resource		the marker's resource passed for optimization
 	 */
 	public void addMatch(String description, Object groupByKey, IResource resource, IMarker marker);
diff --git a/org.eclipse.text.tests/src/org/eclipse/text/tests/AbstractLineTrackerTest.java b/org.eclipse.text.tests/src/org/eclipse/text/tests/AbstractLineTrackerTest.java
index cadeab4..a5593de 100644
--- a/org.eclipse.text.tests/src/org/eclipse/text/tests/AbstractLineTrackerTest.java
+++ b/org.eclipse.text.tests/src/org/eclipse/text/tests/AbstractLineTrackerTest.java
@@ -50,6 +50,6 @@
 	protected final void set(String string) {
 		fText.set(string);
 		fTracker.set(string);
-    }
+	}
 
 }
diff --git a/org.eclipse.text.tests/src/org/eclipse/text/tests/AdaptiveGapTextTest.java b/org.eclipse.text.tests/src/org/eclipse/text/tests/AdaptiveGapTextTest.java
index a39f1bf..7c850ea 100644
--- a/org.eclipse.text.tests/src/org/eclipse/text/tests/AdaptiveGapTextTest.java
+++ b/org.eclipse.text.tests/src/org/eclipse/text/tests/AdaptiveGapTextTest.java
@@ -157,12 +157,12 @@
 	
 	@Test
 	public void testRemoveReallocateBeforeGap() throws Exception {
-	    fText.replace(0, 0, "yyyyyzzzzz");
-	    assertGap(10, 15);
-	    assertContents("yyyyyzzzzzxxxxx");
+		fText.replace(0, 0, "yyyyyzzzzz");
+		assertGap(10, 15);
+		assertContents("yyyyyzzzzzxxxxx");
 
-	    fText.replace(2, 6, null);
-	    assertGap(2, 5);
-	    assertContents("yyzzxxxxx");
-    }
+		fText.replace(2, 6, null);
+		assertGap(2, 5);
+		assertContents("yyzzxxxxx");
+	}
 }
diff --git a/org.eclipse.text.tests/src/org/eclipse/text/tests/GapTextTest.java b/org.eclipse.text.tests/src/org/eclipse/text/tests/GapTextTest.java
index 83c19f4..b5452db 100644
--- a/org.eclipse.text.tests/src/org/eclipse/text/tests/GapTextTest.java
+++ b/org.eclipse.text.tests/src/org/eclipse/text/tests/GapTextTest.java
@@ -160,12 +160,12 @@
 	
 	@Test
 	public void testRemoveReallocateBeforeGap() throws Exception {
-	    fText.replace(0, 0, "yyyyyzzzzz");
-	    assertGap(10, 15);
-	    assertContents("yyyyyzzzzzxxxxx");
+		fText.replace(0, 0, "yyyyyzzzzz");
+		assertGap(10, 15);
+		assertContents("yyyyyzzzzzxxxxx");
 
-	    fText.replace(2, 6, null);
-	    assertGap(2, 7);
-	    assertContents("yyzzxxxxx");
-    }
+		fText.replace(2, 6, null);
+		assertGap(2, 7);
+		assertContents("yyzzxxxxx");
+	}
 }
diff --git a/org.eclipse.text.tests/src/org/eclipse/text/tests/LineTrackerTest3.java b/org.eclipse.text.tests/src/org/eclipse/text/tests/LineTrackerTest3.java
index 17d388f..610245c 100644
--- a/org.eclipse.text.tests/src/org/eclipse/text/tests/LineTrackerTest3.java
+++ b/org.eclipse.text.tests/src/org/eclipse/text/tests/LineTrackerTest3.java
@@ -382,12 +382,12 @@
 	
 	@Test
 	public void testNoDelimiterLine() throws Exception {
-	    set("abcef");
-	    checkLines(new int[] { 5 });
+		set("abcef");
+		checkLines(new int[] { 5 });
 
-	    replace(0, 0, ""); // switch to TreeLineTracker
-	    checkLines(new int[] { 5 });
-    }
+		replace(0, 0, ""); // switch to TreeLineTracker
+		checkLines(new int[] { 5 });
+	}
 	
 	@Test
 	public void testFunnyLastLineCompatibility2() throws Exception {
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/AbstractDocument.java b/org.eclipse.text/src/org/eclipse/jface/text/AbstractDocument.java
index 00bfb43..458f0e5 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/AbstractDocument.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/AbstractDocument.java
@@ -245,7 +245,7 @@
 	 * Returns all positions managed by the document grouped by category.
 	 *
 	 * @return the document's positions
-     */
+	 */
 	protected Map<String, List<Position>> getDocumentManagedPositions() {
 		return fPositions;
 	}
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/Assert.java b/org.eclipse.text/src/org/eclipse/jface/text/Assert.java
index 7f3d71b..c0ca2e9 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/Assert.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/Assert.java
@@ -69,7 +69,7 @@
 			 * @param detail the detailed message
 			 */
 			public AssertionFailedException(String detail) {
-			    super(detail);
+				super(detail);
 			}
 		}
 
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/GapTextStore.java b/org.eclipse.text/src/org/eclipse/jface/text/GapTextStore.java
index 887a67c..2ef0838 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/GapTextStore.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/GapTextStore.java
@@ -330,8 +330,8 @@
 	 * @since 3.3
 	 */
 	private char[] allocate(int size) {
-	    return new char[size];
-    }
+		return new char[size];
+	}
 
 	/*
 	 * Executes System.arraycopy if length != 0. A length < 0 cannot happen -> don't hide coding
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/IDocument.java b/org.eclipse.text/src/org/eclipse/jface/text/IDocument.java
index fba0c36..02d83d0 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/IDocument.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/IDocument.java
@@ -628,10 +628,10 @@
 
 	/**
 	 * Returns the line delimiter of that line or <code>null</code> if the
-     * line is not closed with a line delimiter.
+	 * line is not closed with a line delimiter.
 	 *
 	 * @param line the line of interest
-     * @return the line's delimiter or <code>null</code> if line does not have a delimiter
+	 * @return the line's delimiter or <code>null</code> if line does not have a delimiter
 	 * @exception BadLocationException if the line number is invalid in this document
 	 */
 	String getLineDelimiter(int line) throws BadLocationException;
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/IDocumentPartitionerExtension2.java b/org.eclipse.text/src/org/eclipse/jface/text/IDocumentPartitionerExtension2.java
index 15bda87..ef30c72 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/IDocumentPartitionerExtension2.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/IDocumentPartitionerExtension2.java
@@ -48,9 +48,9 @@
 	String[] getManagingPositionCategories();
 
 
-    /* zero-length partition support */
+	/* zero-length partition support */
 
-    /**
+	/**
 	 * Returns the content type of the partition containing the given offset in
 	 * the connected document. There must be a document connected to this
 	 * partitioner.
@@ -71,9 +71,9 @@
 	 *            a delimited partition starting at <code>offset</code>
 	 * @return the content type of the offset's partition
 	 */
-    String getContentType(int offset, boolean preferOpenPartitions);
+	String getContentType(int offset, boolean preferOpenPartitions);
 
-    /**
+	/**
 	 * Returns the partition containing the given offset of the connected
 	 * document. There must be a document connected to this partitioner.
 	 * <p>
@@ -93,9 +93,9 @@
 	 *            a delimited partition starting at <code>offset</code>
 	 * @return the partition containing the offset
 	 */
-    ITypedRegion getPartition(int offset, boolean preferOpenPartitions);
+	ITypedRegion getPartition(int offset, boolean preferOpenPartitions);
 
-    /**
+	/**
 	 * Returns the partitioning of the given range of the connected document.
 	 * There must be a document connected to this partitioner.
 	 * <p>
@@ -118,5 +118,5 @@
 	 *            partitioning
 	 * @return the partitioning of the range
 	 */
-    ITypedRegion[] computePartitioning(int offset, int length, boolean includeZeroLengthPartitions);
+	ITypedRegion[] computePartitioning(int offset, int length, boolean includeZeroLengthPartitions);
 }
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/ISynchronizable.java b/org.eclipse.text/src/org/eclipse/jface/text/ISynchronizable.java
index 46bad0f..5d0e92e 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/ISynchronizable.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/ISynchronizable.java
@@ -29,7 +29,7 @@
  */
 public interface ISynchronizable {
 
-    /**
+	/**
 	 * Sets the lock object for this object. If the lock object is not
 	 * <code>null</code> subsequent calls to specified methods of this object
 	 * are synchronized on this lock object. Which methods are synchronized is
@@ -41,14 +41,14 @@
 	 *
 	 * @param lockObject the lock object. May be <code>null</code>.
 	 */
-    void setLockObject(Object lockObject);
+	void setLockObject(Object lockObject);
 
-    /**
+	/**
 	 * Returns the lock object or <code>null</code> if there is none. Clients
 	 * should use the lock object in order to synchronize concurrent access to
 	 * the implementer.
 	 *
 	 * @return the lock object or <code>null</code>
 	 */
-    Object getLockObject();
+	Object getLockObject();
 }
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/TreeLineTracker.java b/org.eclipse.text/src/org/eclipse/jface/text/TreeLineTracker.java
index 49216db..e4cdbee 100755
--- a/org.eclipse.text/src/org/eclipse/jface/text/TreeLineTracker.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/TreeLineTracker.java
@@ -172,34 +172,34 @@
 	 *
 	 * @param tracker the list line tracker
 	 */
-    TreeLineTracker(ListLineTracker tracker) {
-    	final List<Line> lines= tracker.getLines();
-    	final int n= lines.size();
-    	if (n == 0)
-    		return;
+	TreeLineTracker(ListLineTracker tracker) {
+		final List<Line> lines= tracker.getLines();
+		final int n= lines.size();
+		if (n == 0)
+			return;
 
-    	Line line= lines.get(0);
-    	String delim= line.delimiter;
-    	if (delim == null)
-    		delim= NO_DELIM;
-    	int length= line.length;
-    	fRoot= new Node(length, delim);
-    	Node node= fRoot;
+		Line line= lines.get(0);
+		String delim= line.delimiter;
+		if (delim == null)
+			delim= NO_DELIM;
+		int length= line.length;
+		fRoot= new Node(length, delim);
+		Node node= fRoot;
 
 		for (int i= 1; i < n; i++) {
-	        line= lines.get(i);
-	        delim= line.delimiter;
-	        if (delim == null)
-	        	delim= NO_DELIM;
-	        length= line.length;
+			line= lines.get(i);
+			delim= line.delimiter;
+			if (delim == null)
+				delim= NO_DELIM;
+			length= line.length;
 			node= insertAfter(node, length, delim);
-        }
+		}
 
 		if (node.delimiter != NO_DELIM)
 			insertAfter(node, 0, NO_DELIM);
 
 		if (ASSERT) checkTree();
-    }
+	}
 
 	/**
 	 * Returns the node (line) including a certain offset. If the offset is between two
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeManager.java b/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeManager.java
index 1b5aabf..0a6b2f5 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeManager.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeManager.java
@@ -175,45 +175,45 @@
 		}
 	}
 
-    /**
-     * Tries to nest the given <code>LinkedModeModel</code> onto the top of
-     * the stack of environments managed by the receiver. If <code>force</code>
-     * is <code>true</code>, any environments on the stack that create a conflict
-     * are killed.
-     *
-     * @param model the model to nest
-     * @param force whether to force the addition of the model
-     * @return <code>true</code> if nesting was successful, <code>false</code> otherwise (only possible if <code>force</code> is <code>false</code>
-     */
-    public boolean nestEnvironment(LinkedModeModel model, boolean force) {
-    	Assert.isNotNull(model);
+	/**
+	 * Tries to nest the given <code>LinkedModeModel</code> onto the top of
+	 * the stack of environments managed by the receiver. If <code>force</code>
+	 * is <code>true</code>, any environments on the stack that create a conflict
+	 * are killed.
+	 *
+	 * @param model the model to nest
+	 * @param force whether to force the addition of the model
+	 * @return <code>true</code> if nesting was successful, <code>false</code> otherwise (only possible if <code>force</code> is <code>false</code>
+	 */
+	public boolean nestEnvironment(LinkedModeModel model, boolean force) {
+		Assert.isNotNull(model);
 
-    	try {
-    		while (true) {
-    			if (fEnvironments.isEmpty()) {
-    				model.addLinkingListener(fListener);
-    				fEnvironments.push(model);
-    				return true;
-    			}
+		try {
+			while (true) {
+				if (fEnvironments.isEmpty()) {
+					model.addLinkingListener(fListener);
+					fEnvironments.push(model);
+					return true;
+				}
 
-    			LinkedModeModel top= fEnvironments.peek();
-    			if (model.canNestInto(top)) {
-    				model.addLinkingListener(fListener);
-    				fEnvironments.push(model);
-    				return true;
-    			} else if (!force) {
-    				return false;
-    			} else { // force
-    				fEnvironments.pop();
-    				top.exit(ILinkedModeListener.NONE);
-    				// continue;
-    			}
-    		}
-    	} finally {
-    		// if we remove any, make sure the new one got inserted
-    		Assert.isTrue(fEnvironments.size() > 0);
-    	}
-    }
+				LinkedModeModel top= fEnvironments.peek();
+				if (model.canNestInto(top)) {
+					model.addLinkingListener(fListener);
+					fEnvironments.push(model);
+					return true;
+				} else if (!force) {
+					return false;
+				} else { // force
+					fEnvironments.pop();
+					top.exit(ILinkedModeListener.NONE);
+					// continue;
+				}
+			}
+		} finally {
+			// if we remove any, make sure the new one got inserted
+			Assert.isTrue(fEnvironments.size() > 0);
+		}
+	}
 
 	/**
 	 * Returns the <code>LinkedModeModel</code> that is on top of the stack of
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeModel.java b/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeModel.java
index c2485e6..dac5e74 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeModel.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedModeModel.java
@@ -505,8 +505,8 @@
 		// register positions
 		try {
 			for (LinkedPositionGroup group : fGroups) {
-	            group.register(this);
-	        }
+				group.register(this);
+			}
 			return true;
 		} catch (BadLocationException e){
 			// if we fail to add, make sure to release all listeners again
@@ -520,7 +520,7 @@
 	 * model, throws an IllegalStateException otherwise.
 	 */
 	private void enforceNotEmpty() {
-        boolean hasPosition= false;
+		boolean hasPosition= false;
 		for (LinkedPositionGroup linkedPositionGroup : fGroups)
 			if (!linkedPositionGroup.isEmpty()) {
 				hasPosition= true;
@@ -529,42 +529,42 @@
 		if (!hasPosition)
 			throw new IllegalStateException("must specify at least one linked position"); //$NON-NLS-1$
 
-    }
+	}
 
-    /**
+	/**
 	 * Collects all the documents that contained positions are set upon.
-     * @return the set of documents affected by this model
-     */
-    private IDocument[] getDocuments() {
-    	Set<IDocument> docs= new HashSet<>();
-        for (LinkedPositionGroup group : fGroups) {
-            docs.addAll(Arrays.asList(group.getDocuments()));
-        }
-        return docs.toArray(new IDocument[docs.size()]);
-    }
+	 * @return the set of documents affected by this model
+	 */
+	private IDocument[] getDocuments() {
+		Set<IDocument> docs= new HashSet<>();
+		for (LinkedPositionGroup group : fGroups) {
+			docs.addAll(Arrays.asList(group.getDocuments()));
+		}
+		return docs.toArray(new IDocument[docs.size()]);
+	}
 
-    /**
-     * Returns whether the receiver can be nested into the given <code>parent</code>
-     * model. If yes, the parent model and its position that the receiver
-     * fits in are remembered.
-     *
-     * @param parent the parent model candidate
-     * @return <code>true</code> if the receiver can be nested into <code>parent</code>, <code>false</code> otherwise
-     */
-    boolean canNestInto(LinkedModeModel parent) {
-    	for (LinkedPositionGroup group : fGroups) {
+	/**
+	 * Returns whether the receiver can be nested into the given <code>parent</code>
+	 * model. If yes, the parent model and its position that the receiver
+	 * fits in are remembered.
+	 *
+	 * @param parent the parent model candidate
+	 * @return <code>true</code> if the receiver can be nested into <code>parent</code>, <code>false</code> otherwise
+	 */
+	boolean canNestInto(LinkedModeModel parent) {
+		for (LinkedPositionGroup group : fGroups) {
 			if (!enforceNestability(group, parent)) {
 				fParentPosition= null;
 				return false;
 			}
 		}
 
-    	Assert.isNotNull(fParentPosition);
-    	fParentEnvironment= parent;
-    	return true;
-    }
+		Assert.isNotNull(fParentPosition);
+		fParentEnvironment= parent;
+		return true;
+	}
 
-    /**
+	/**
 	 * Called by nested models when a group is added to them. All
 	 * positions in all groups of a nested model have to fit inside a
 	 * single position in the parent model.
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedPositionGroup.java b/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedPositionGroup.java
index 3e416fa..d16a357 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedPositionGroup.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/link/LinkedPositionGroup.java
@@ -321,8 +321,8 @@
 
 	void register(LinkedModeModel model) throws BadLocationException {
 		for (LinkedPosition pos : fPositions) {
-            model.register(pos);
-        }
+			model.register(pos);
+		}
 	}
 
 	/**
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java b/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java
index 17105ac..97312b0 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java
@@ -31,103 +31,103 @@
  */
 class AnnotationMap implements IAnnotationMap {
 
-    /**
-     * The lock object used to synchronize the operations explicitly defined by
-     * <code>IAnnotationMap</code>
-     */
-    private Object fLockObject;
-    /**
-     * The internal lock object used if <code>fLockObject</code> is <code>null</code>.
+	/**
+	 * The lock object used to synchronize the operations explicitly defined by
+	 * <code>IAnnotationMap</code>
+	 */
+	private Object fLockObject;
+	/**
+	 * The internal lock object used if <code>fLockObject</code> is <code>null</code>.
 	 * @since 3.2
 	 */
-    private final Object fInternalLockObject= new Object();
+	private final Object fInternalLockObject= new Object();
 
-    /** The map holding the annotations */
-    private Map<Annotation, Position> fInternalMap;
+	/** The map holding the annotations */
+	private Map<Annotation, Position> fInternalMap;
 
-    /**
-     * Creates a new annotation map with the given capacity.
-     *
-     * @param capacity the capacity
-     */
-    public AnnotationMap(int capacity) {
-        fInternalMap= new HashMap<>(capacity);
-    }
+	/**
+	 * Creates a new annotation map with the given capacity.
+	 *
+	 * @param capacity the capacity
+	 */
+	public AnnotationMap(int capacity) {
+		fInternalMap= new HashMap<>(capacity);
+	}
 
-    @Override
+	@Override
 	public synchronized void setLockObject(Object lockObject) {
-        fLockObject= lockObject;
-    }
+		fLockObject= lockObject;
+	}
 
-    @Override
+	@Override
 	public synchronized Object getLockObject() {
-        if (fLockObject == null)
-        	return fInternalLockObject;
-        return fLockObject;
-    }
+		if (fLockObject == null)
+			return fInternalLockObject;
+		return fLockObject;
+	}
 
-    @Override
+	@Override
 	public Iterator<Position> valuesIterator() {
-        synchronized (getLockObject()) {
-            return new ArrayList<>(fInternalMap.values()).iterator();
-        }
-    }
+		synchronized (getLockObject()) {
+			return new ArrayList<>(fInternalMap.values()).iterator();
+		}
+	}
 
-    @Override
+	@Override
 	public Iterator<Annotation> keySetIterator() {
-        synchronized (getLockObject()) {
-            return new ArrayList<>(fInternalMap.keySet()).iterator();
-        }
-    }
+		synchronized (getLockObject()) {
+			return new ArrayList<>(fInternalMap.keySet()).iterator();
+		}
+	}
 
-    @Override
+	@Override
 	public boolean containsKey(Object annotation) {
-        synchronized (getLockObject()) {
-            return fInternalMap.containsKey(annotation);
-        }
-    }
+		synchronized (getLockObject()) {
+			return fInternalMap.containsKey(annotation);
+		}
+	}
 
-    @Override
+	@Override
 	public Position put(Annotation annotation, Position position) {
-        synchronized (getLockObject()) {
-            return fInternalMap.put(annotation, position);
-        }
-    }
+		synchronized (getLockObject()) {
+			return fInternalMap.put(annotation, position);
+		}
+	}
 
-    @Override
+	@Override
 	public Position get(Object annotation) {
-        synchronized (getLockObject()) {
-            return fInternalMap.get(annotation);
-        }
-    }
+		synchronized (getLockObject()) {
+			return fInternalMap.get(annotation);
+		}
+	}
 
-    @Override
+	@Override
 	public void clear() {
-        synchronized (getLockObject()) {
-            fInternalMap.clear();
-        }
-    }
+		synchronized (getLockObject()) {
+			fInternalMap.clear();
+		}
+	}
 
-    @Override
+	@Override
 	public Position remove(Object annotation) {
-        synchronized (getLockObject()) {
-            return fInternalMap.remove(annotation);
-        }
-    }
+		synchronized (getLockObject()) {
+			return fInternalMap.remove(annotation);
+		}
+	}
 
-    @Override
+	@Override
 	public int size() {
-        synchronized (getLockObject()) {
-            return fInternalMap.size();
-        }
-    }
+		synchronized (getLockObject()) {
+			return fInternalMap.size();
+		}
+	}
 
-    @Override
+	@Override
 	public boolean isEmpty() {
-        synchronized (getLockObject()) {
+		synchronized (getLockObject()) {
 			return fInternalMap.isEmpty();
 		}
-    }
+	}
 
 	@Override
 	public boolean containsValue(Object value) {
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java b/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java
index 3951742..602545e 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java
@@ -330,33 +330,33 @@
 		return (IAnnotationMap) fAnnotations;
 	}
 
-    @Override
+	@Override
 	public Object getLockObject() {
-        return getAnnotationMap().getLockObject();
-    }
+		return getAnnotationMap().getLockObject();
+	}
 
-    @Override
+	@Override
 	public void setLockObject(Object lockObject) {
-        getAnnotationMap().setLockObject(lockObject);
-    }
+		getAnnotationMap().setLockObject(lockObject);
+	}
 
-    /**
-     * Returns the current annotation model event. This is the event that will be sent out
-     * when calling <code>fireModelChanged</code>.
-     *
-     * @return the current annotation model event
-     * @since 3.0
-     */
-    protected final AnnotationModelEvent getAnnotationModelEvent() {
-    	synchronized (getLockObject()) {
-    		if (fModelEvent == null) {
-    			fModelEvent= createAnnotationModelEvent();
-    			fModelEvent.markWorldChange(false);
-    			fModificationStamp= new Object();
-    		}
-    		return fModelEvent;
-    	}
-    }
+	/**
+	 * Returns the current annotation model event. This is the event that will be sent out
+	 * when calling <code>fireModelChanged</code>.
+	 *
+	 * @return the current annotation model event
+	 * @since 3.0
+	 */
+	protected final AnnotationModelEvent getAnnotationModelEvent() {
+		synchronized (getLockObject()) {
+			if (fModelEvent == null) {
+				fModelEvent= createAnnotationModelEvent();
+				fModelEvent.markWorldChange(false);
+				fModificationStamp= new Object();
+			}
+			return fModelEvent;
+		}
+	}
 
 	@Override
 	public void addAnnotation(Annotation annotation, Position position) {
@@ -442,9 +442,9 @@
 				IAnnotationModelListenerExtension extension= (IAnnotationModelListenerExtension) listener;
 				AnnotationModelEvent event= createAnnotationModelEvent();
 				event.markSealed();
-			    extension.modelChanged(event);
+				extension.modelChanged(event);
 			} else
-			    listener.modelChanged(this);
+				listener.modelChanged(this);
 		}
 	}
 
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateBuffer.java b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateBuffer.java
index 5fa9ef3..97aa7a6 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateBuffer.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateBuffer.java
@@ -36,9 +36,9 @@
 	 * @param string the string
 	 * @param variables the variable positions
 	 */
-    public TemplateBuffer(String string, TemplateVariable[] variables) {
+	public TemplateBuffer(String string, TemplateVariable[] variables) {
 		setContent(string, variables);
-    }
+	}
 
 	/**
 	 * Sets the content of the template buffer.
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateContextType.java b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateContextType.java
index 84711b3..6a795f7 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateContextType.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateContextType.java
@@ -85,7 +85,7 @@
 	 * @return the id of the receiver
 	 */
 	public String getId() {
-	    return fId;
+		return fId;
 	}
 
 
@@ -235,9 +235,9 @@
 		List<RangeMarker> positions= variablesToPositions(variables);
 		List<ReplaceEdit> edits= new ArrayList<>(5);
 
-        // iterate over all variables and try to resolve them
-        for (int i= 0; i != variables.length; i++) {
-            TemplateVariable variable= variables[i];
+		// iterate over all variables and try to resolve them
+		for (int i= 0; i != variables.length; i++) {
+			TemplateVariable variable= variables[i];
 
 			if (!variable.isResolved())
 				resolve(variable, context);
@@ -248,18 +248,18 @@
 			for (int k= 0; k != offsets.length; k++)
 				edits.add(new ReplaceEdit(offsets[k], variable.getInitialLength(), value));
 
-        }
+		}
 
-    	IDocument document= new Document(buffer.getString());
-        MultiTextEdit edit= new MultiTextEdit(0, document.getLength());
-        edit.addChildren(positions.toArray(new TextEdit[positions.size()]));
-        edit.addChildren(edits.toArray(new TextEdit[edits.size()]));
-        edit.apply(document, TextEdit.UPDATE_REGIONS);
+		IDocument document= new Document(buffer.getString());
+		MultiTextEdit edit= new MultiTextEdit(0, document.getLength());
+		edit.addChildren(positions.toArray(new TextEdit[positions.size()]));
+		edit.addChildren(edits.toArray(new TextEdit[edits.size()]));
+		edit.apply(document, TextEdit.UPDATE_REGIONS);
 
 		positionsToVariables(positions, variables);
 
-        buffer.setContent(document.get(), variables);
-    }
+		buffer.setContent(document.get(), variables);
+	}
 
 	/**
 	 * Resolves a single variable in a context. Resolving is delegated to the registered resolver.
@@ -277,10 +277,10 @@
 	}
 
 	private static List<RangeMarker> variablesToPositions(TemplateVariable[] variables) {
-   		List<RangeMarker> positions= new ArrayList<>(5);
+		List<RangeMarker> positions= new ArrayList<>(5);
 		for (int i= 0; i != variables.length; i++) {
-		    int[] offsets= variables[i].getOffsets();
-		    for (int j= 0; j != offsets.length; j++)
+			int[] offsets= variables[i].getOffsets();
+			for (int j= 0; j != offsets.length; j++)
 				positions.add(new RangeMarker(offsets[j], 0));
 		}
 
@@ -291,7 +291,7 @@
 		Iterator<RangeMarker> iterator= positions.iterator();
 
 		for (int i= 0; i != variables.length; i++) {
-		    TemplateVariable variable= variables[i];
+			TemplateVariable variable= variables[i];
 
 			int[] offsets= new int[variable.getOffsets().length];
 			for (int j= 0; j != offsets.length; j++)
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateVariable.java b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateVariable.java
index ddbd31f..d95a9a5 100644
--- a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateVariable.java
+++ b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateVariable.java
@@ -141,7 +141,7 @@
 	 * @return the type name of the variable
 	 */
 	public String getType() {
-	    return fType.getName();
+		return fType.getName();
 	}
 
 	/**
@@ -160,7 +160,7 @@
 	 * @return the name of the variable
 	 */
 	public String getName() {
-	    return fName;
+		return fName;
 	}
 
 	/**
@@ -251,9 +251,9 @@
 	 * @param unambiguous the new unambiguous state of the variable
 	 */
 	public void setUnambiguous(boolean unambiguous) {
-	    fIsUnambiguous= unambiguous;
-	    if (unambiguous)
-	    	setResolved(true);
+		fIsUnambiguous= unambiguous;
+		if (unambiguous)
+			setResolved(true);
 	}
 
 	/**
diff --git a/org.eclipse.text/src/org/eclipse/text/edits/TextEditGroup.java b/org.eclipse.text/src/org/eclipse/text/edits/TextEditGroup.java
index 53781af..b320a32 100644
--- a/org.eclipse.text/src/org/eclipse/text/edits/TextEditGroup.java
+++ b/org.eclipse.text/src/org/eclipse/text/edits/TextEditGroup.java
@@ -110,7 +110,7 @@
 	 * @since 3.3
 	 */
 	public boolean removeTextEdit(TextEdit edit) {
-	  return fEdits.remove(edit);
+		return fEdits.remove(edit);
 	}
 
 	/**
@@ -119,7 +119,7 @@
 	 * @since 3.3
 	 */
 	public void clearTextEdits() {
-	  fEdits.clear();
+		fEdits.clear();
 	}
 
 
diff --git a/org.eclipse.text/src/org/eclipse/text/templates/TemplateStoreCore.java b/org.eclipse.text/src/org/eclipse/text/templates/TemplateStoreCore.java
index d32d2f9..08e8049 100644
--- a/org.eclipse.text/src/org/eclipse/text/templates/TemplateStoreCore.java
+++ b/org.eclipse.text/src/org/eclipse/text/templates/TemplateStoreCore.java
@@ -127,16 +127,16 @@
 				@Override
 				public void preferenceChange(PreferenceChangeEvent event) {
 					/*
-                     * Don't load if we are in the process of saving ourselves. We are in sync anyway after the
-                     * save operation, and clients may trigger reloading by listening to preference store
-                     * updates.
-                     */
-                    if (!fIgnorePreferenceStoreChanges && fKey.equals(event.getKey()))
-                        try {
-                            load();
-                        } catch (IOException x) {
-                            handleException(x);
-                        }
+					 * Don't load if we are in the process of saving ourselves. We are in sync anyway after the
+					 * save operation, and clients may trigger reloading by listening to preference store
+					 * updates.
+					 */
+					if (!fIgnorePreferenceStoreChanges && fKey.equals(event.getKey()))
+						try {
+							load();
+						} catch (IOException x) {
+							handleException(x);
+						}
 				}
 			};
 			fPreferenceStore.addPreferenceChangeListener(fPropertyListener);
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EncodingActionGroup.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EncodingActionGroup.java
index fe31024..965acf0 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EncodingActionGroup.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EncodingActionGroup.java
@@ -83,7 +83,7 @@
 		 * @param editor the target editor
 		 */
 		public PredefinedEncodingAction(ResourceBundle bundle, String prefix, String encoding, ITextEditor editor) {
-       		super(bundle, prefix, editor);
+			super(bundle, prefix, editor);
 			fEncoding= encoding;
 			if (prefix == null)
 				setText(encoding);
@@ -98,7 +98,7 @@
 		 * @param editor the target editor
 		 */
 		public PredefinedEncodingAction(ResourceBundle bundle, String encoding, ITextEditor editor) {
-       		super(bundle, null, editor);
+			super(bundle, null, editor);
 			fEncoding= encoding;
 			setText(encoding);
 			fLabel= getText();
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditor.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditor.java
index 366351f..ab09e71 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditor.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditor.java
@@ -97,9 +97,9 @@
 	/**
 	 * Installs the encoding support on the given text editor.
 	 * <p>
- 	 * Subclasses may override to install their own encoding
- 	 * support or to disable the default encoding support.
- 	 * </p>
+	 * Subclasses may override to install their own encoding
+	 * support or to disable the default encoding support.
+	 * </p>
 	 * @since 2.1
 	 */
 	protected void installEncodingSupport() {
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorPreferenceConstants.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorPreferenceConstants.java
index 88ff833..7c97795 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorPreferenceConstants.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorPreferenceConstants.java
@@ -24,7 +24,7 @@
  * @since 2.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
-  */
+ */
 public class TextEditorPreferenceConstants {
 
 	/**
@@ -60,7 +60,7 @@
 
 	/**
 	 * A named preference that controls whether the print margin is turned on or off
- 	 * (value <code>"printMargin"</code>).
+	 * (value <code>"printMargin"</code>).
 	 * <p>
 	 * The preference value is of type <code>Boolean</code>.
 	 * </p>
@@ -125,7 +125,7 @@
 
 	/**
 	 * A named preference that controls whether the overview ruler shows unknown indicators
- 	 * (value <code>"othersIndicationInOverviewRuler"</code>).
+	 * (value <code>"othersIndicationInOverviewRuler"</code>).
 	 * <p>
 	 * The preference value is of type <code>Boolean</code>.
 	 * </p>
@@ -137,7 +137,7 @@
 
 	/**
 	 * A named preference that controls if the overview ruler is shown in the UI
- 	 * (value <code>"overviewRuler"</code>).
+	 * (value <code>"overviewRuler"</code>).
 	 * <p>
 	 * The preference value is of type <code>Boolean</code>.
 	 * </p>
@@ -281,10 +281,10 @@
 	public final static String EDITOR_SEARCH_RESULT_INDICATION_IN_OVERVIEW_RULER= "searchResultIndicationInOverviewRuler"; //$NON-NLS-1$
 
 	/**
-  	* Initializes the given preference store with the default values.
+	* Initializes the given preference store with the default values.
 	 *
-  	* @param store the preference store to be initialized
-  	*/
+	* @param store the preference store to be initialized
+	*/
 	public static void initializeDefaultValues(IPreferenceStore store) {
 
 		// set defaults from AbstractDecoratedTextEditor
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/ConvertLineDelimitersAction.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/ConvertLineDelimitersAction.java
index 2782c92..47d9244 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/ConvertLineDelimitersAction.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/ConvertLineDelimitersAction.java
@@ -90,7 +90,7 @@
 			return filterUnacceptableFiles(files);
 		}
 
-    	final IFilter filter= new IFilter() {
+		final IFilter filter= new IFilter() {
 			@Override
 			public boolean accept(IResource resource) {
 				return resource != null && isAcceptableLocation(resource.getFullPath());
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/LinkedModeConfigurationBlock.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/LinkedModeConfigurationBlock.java
index 87ea350..05604cf 100755
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/LinkedModeConfigurationBlock.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/LinkedModeConfigurationBlock.java
@@ -375,12 +375,12 @@
 	 * @param chars the number of characters
 	 * @return the number of pixels
 	 */
-    protected int convertWidthInCharsToPixels(int chars) {
-        // test for failure to initialize for backward compatibility
-        if (fFontMetrics == null)
-            return 0;
-        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-    }
+	protected int convertWidthInCharsToPixels(int chars) {
+		// test for failure to initialize for backward compatibility
+		if (fFontMetrics == null)
+			return 0;
+		return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
+	}
 
 	/**
 	 * Returns the number of pixels corresponding to the height of the given number of characters.
@@ -394,12 +394,12 @@
 	 * @param chars the number of characters
 	 * @return the number of pixels
 	 */
-    protected int convertHeightInCharsToPixels(int chars) {
-        // test for failure to initialize for backward compatibility
-        if (fFontMetrics == null)
-            return 0;
-        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-    }
+	protected int convertHeightInCharsToPixels(int chars) {
+		// test for failure to initialize for backward compatibility
+		if (fFontMetrics == null)
+			return 0;
+		return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
+	}
 
 	/**
 	 * Initializes the computation of horizontal and vertical dialog units based on the size of
@@ -410,13 +410,13 @@
 	 *
 	 * @param testControl a control from which to obtain the current font
 	 */
-    protected void initializeDialogUnits(Control testControl) {
-        // Compute and store a font metric
-        GC gc = new GC(testControl);
-        gc.setFont(JFaceResources.getDialogFont());
-        fFontMetrics = gc.getFontMetrics();
-        gc.dispose();
-    }
+	protected void initializeDialogUnits(Control testControl) {
+		// Compute and store a font metric
+		GC gc = new GC(testControl);
+		gc.setFont(JFaceResources.getDialogFont());
+		fFontMetrics = gc.getFontMetrics();
+		gc.dispose();
+	}
 
 	private void handleAnnotationListSelection() {
 		ListItem item= getSelectedItem();
@@ -545,12 +545,12 @@
 
 	private void initializeFields() {
 
-        // Update slaves
-        Iterator<SelectionListener> iter= fMasterSlaveListeners.iterator();
-        while (iter.hasNext()) {
-            SelectionListener listener= iter.next();
-            listener.widgetSelected(null);
-        }
+		// Update slaves
+		Iterator<SelectionListener> iter= fMasterSlaveListeners.iterator();
+		while (iter.hasNext()) {
+			SelectionListener listener= iter.next();
+			listener.widgetSelected(null);
+		}
 	}
 
 	@Override
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/PreviousPulldownActionDelegate.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/PreviousPulldownActionDelegate.java
index bf02561..e73da30 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/PreviousPulldownActionDelegate.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/PreviousPulldownActionDelegate.java
@@ -23,9 +23,9 @@
  */
 public class PreviousPulldownActionDelegate extends NextPreviousPulldownActionDelegate {
 
-   @Override
+	@Override
 public String getPreferenceKey(AnnotationPreference annotationPreference) {
-	   return annotationPreference.getIsGoToPreviousNavigationTargetKey();
-   }
+		return annotationPreference.getIsGoToPreviousNavigationTargetKey();
+	}
 
 }
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/RemoveTrailingWhitespaceHandler.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/RemoveTrailingWhitespaceHandler.java
index 3933e92..c25a0aa 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/RemoveTrailingWhitespaceHandler.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/RemoveTrailingWhitespaceHandler.java
@@ -65,7 +65,7 @@
 		if (containsOnlyFiles(resources))
 			return files;
 
-    	final IFilter filter= new IFilter() {
+		final IFilter filter= new IFilter() {
 			@Override
 			public boolean accept(IResource resource) {
 				return resource != null && isAcceptableLocation(resource.getFullPath());
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesBlock.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesBlock.java
index 657bded..9ff215c 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesBlock.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesBlock.java
@@ -78,7 +78,7 @@
 
 		void filterElements(Collection<Object> elements) throws InterruptedException;
 
-	    void filterElements(Object[] elements) throws InterruptedException;
+		void filterElements(Object[] elements) throws InterruptedException;
 	}
 
 
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesDialog.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesDialog.java
index 0a21c76..75ec395 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesDialog.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/SelectResourcesDialog.java
@@ -63,11 +63,11 @@
 	}
 
 	private SelectResourcesBlock fResourceGroup;
-    private List<Object> fAcceptedFileTypes = new ArrayList<>();
-    private IResource[] fInput;
-    private String fTitle;
-    private String fInstruction;
-    private Label fCountIndication;
+	private List<Object> fAcceptedFileTypes = new ArrayList<>();
+	private IResource[] fInput;
+	private String fTitle;
+	private String fInstruction;
+	private Label fCountIndication;
 	private IFilter fAcceptableLocationsFilter;
 
 
@@ -130,50 +130,50 @@
 		return (displayHeight / fontHeight) > 50;
 	}
 
-    private ITreeContentProvider getResourceProvider(final int resourceType) {
-        return new WorkbenchContentProvider() {
-            @Override
+	private ITreeContentProvider getResourceProvider(final int resourceType) {
+		return new WorkbenchContentProvider() {
+			@Override
 			public Object[] getChildren(Object o) {
-            	if (o instanceof IWorkspaceRoot) {
-            		HashSet<IResource> projects= new HashSet<>();
-            		for (int i= 0; i < fInput.length; i++) {
-            			IResource project= fInput[i].getProject();
-            			if ((project.getType() & resourceType) > 0)
-            				projects.add(project);
-            		}
-            		return projects.toArray();
-            	}
+				if (o instanceof IWorkspaceRoot) {
+					HashSet<IResource> projects= new HashSet<>();
+					for (int i= 0; i < fInput.length; i++) {
+						IResource project= fInput[i].getProject();
+						if ((project.getType() & resourceType) > 0)
+							projects.add(project);
+					}
+					return projects.toArray();
+				}
 
-                if (o instanceof IContainer) {
-                    IResource[] members = null;
-                    try {
-                        members = ((IContainer) o).members();
-                    } catch (CoreException e) {
-                        //just return an empty set of children
-                        return new Object[0];
-                    }
+				if (o instanceof IContainer) {
+					IResource[] members = null;
+					try {
+						members = ((IContainer) o).members();
+					} catch (CoreException e) {
+						//just return an empty set of children
+						return new Object[0];
+					}
 
-                    //filter out the desired resource types
-                    ArrayList<IResource> results = new ArrayList<>();
-                    for (int i = 0; i < members.length; i++) {
-                        //And the test bits with the resource types to see if they are what we want
-                        if ((members[i].getType() & resourceType) > 0 && (resourceType != IResource.FILE || fAcceptableLocationsFilter == null || fAcceptableLocationsFilter.accept(members[i]))) {
-                            results.add(members[i]);
-                        }
-                    }
-                    return results.toArray();
-                }
+					//filter out the desired resource types
+					ArrayList<IResource> results = new ArrayList<>();
+					for (int i = 0; i < members.length; i++) {
+						//And the test bits with the resource types to see if they are what we want
+						if ((members[i].getType() & resourceType) > 0 && (resourceType != IResource.FILE || fAcceptableLocationsFilter == null || fAcceptableLocationsFilter.accept(members[i]))) {
+							results.add(members[i]);
+						}
+					}
+					return results.toArray();
+				}
 
-                //input element case
-                if (o instanceof ArrayList)
-                	return ((ArrayList<?>) o).toArray();
+				//input element case
+				if (o instanceof ArrayList)
+					return ((ArrayList<?>) o).toArray();
 
-                return new Object[0];
-            }
-        };
-    }
+				return new Object[0];
+			}
+		};
+	}
 
-    protected Composite createSelectionButtonGroup(Composite parent) {
+	protected Composite createSelectionButtonGroup(Composite parent) {
 
 		Font font= parent.getFont();
 
@@ -225,7 +225,7 @@
 		return buttonComposite;
 	}
 
-    protected void handleSelectFileTypes() {
+	protected void handleSelectFileTypes() {
 		Object[] acceptedFileTypes= queryFileTypes();
 		if (acceptedFileTypes != null) {
 			fAcceptedFileTypes= Arrays.asList(acceptedFileTypes);
@@ -233,13 +233,13 @@
 		}
 	}
 
-    protected Object[] queryFileTypes() {
+	protected Object[] queryFileTypes() {
 		TypeFilteringDialog dialog= new TypeFilteringDialog(getShell(), fAcceptedFileTypes);
 		dialog.open();
 		return dialog.getResult();
 	}
 
-    private void filterSelection() {
+	private void filterSelection() {
 
 		final IFilter filter= resource -> hasAcceptedFileType(resource);
 
@@ -248,10 +248,10 @@
 
 		Runnable runnable= () -> setSelection(resources, filter);
 
-        BusyIndicator.showWhile(getShell().getDisplay(), runnable);
-    }
+		BusyIndicator.showWhile(getShell().getDisplay(), runnable);
+	}
 
-    protected boolean hasAcceptedFileType(IResource resource) {
+	protected boolean hasAcceptedFileType(IResource resource) {
 		if (fAcceptedFileTypes == null)
 			return true;
 
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
index 87036b6..23e1615 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
@@ -1058,12 +1058,12 @@
 		fFieldsInitialized= true;
 		updateStatus(new StatusInfo());
 
-        // Update slaves
-        Iterator<SelectionListener> iter= fMasterSlaveListeners.iterator();
-        while (iter.hasNext()) {
-            SelectionListener listener= iter.next();
-            listener.widgetSelected(null);
-        }
+		// Update slaves
+		Iterator<SelectionListener> iter= fMasterSlaveListeners.iterator();
+		while (iter.hasNext()) {
+			SelectionListener listener= iter.next();
+			listener.widgetSelected(null);
+		}
 
 	}
 
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
index bd8ee10..6c0f9af 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
@@ -1185,10 +1185,10 @@
 		setAction(ITextEditorActionConstants.QUICKDIFF_REVERTDELETION, action);
 
 		IAction action2= new CompositeRevertAction(this, new IAction[] {
-		                                       getAction(ITextEditorActionConstants.QUICKDIFF_REVERTSELECTION),
-		                                       getAction(ITextEditorActionConstants.QUICKDIFF_REVERTBLOCK),
-										       getAction(ITextEditorActionConstants.QUICKDIFF_REVERTDELETION),
-										       getAction(ITextEditorActionConstants.QUICKDIFF_REVERTLINE)});
+												getAction(ITextEditorActionConstants.QUICKDIFF_REVERTSELECTION),
+												getAction(ITextEditorActionConstants.QUICKDIFF_REVERTBLOCK),
+												getAction(ITextEditorActionConstants.QUICKDIFF_REVERTDELETION),
+												getAction(ITextEditorActionConstants.QUICKDIFF_REVERTLINE)});
 		action2.setActionDefinitionId(ITextEditorActionDefinitionIds.QUICKDIFF_REVERT);
 		setAction(ITextEditorActionConstants.QUICKDIFF_REVERT, action2);
 
@@ -1310,7 +1310,7 @@
 		
 		IAnnotationHover hover= fLineColumn.getHover();
 		showFocusedRulerHover(hover, sourceViewer, caretOffset);
-    }
+	}
 
 	/**
 	 * Opens a sticky annotation ruler hover for the caret line. Does nothing if no annotation hover
@@ -1528,14 +1528,14 @@
 			// Check whether file exists and if so, confirm overwrite
 			final File localFile= new File(path);
 			if (localFile.exists()) {
-		        MessageDialog overwriteDialog= new MessageDialog(
-		        		shell,
-		        		TextEditorMessages.AbstractDecoratedTextEditor_saveAs_overwrite_title,
-		        		null,
-		        		NLSUtility.format(TextEditorMessages.AbstractDecoratedTextEditor_saveAs_overwrite_message, path),
-		        		MessageDialog.WARNING,
-		        		new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
-		        		1); // 'No' is the default
+				MessageDialog overwriteDialog= new MessageDialog(
+						shell,
+						TextEditorMessages.AbstractDecoratedTextEditor_saveAs_overwrite_title,
+						null,
+						NLSUtility.format(TextEditorMessages.AbstractDecoratedTextEditor_saveAs_overwrite_message, path),
+						MessageDialog.WARNING,
+						new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
+						1); // 'No' is the default
 				if (overwriteDialog.open() != Window.OK) {
 					if (progressMonitor != null) {
 						progressMonitor.setCanceled(true);
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
index 0717f06..79f55b8 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
@@ -102,7 +102,7 @@
 
 	/**
 	 * A named preference that controls whether the print margin is turned on or off
- 	 * (value <code>"printMargin"</code>).
+	 * (value <code>"printMargin"</code>).
 	 * <p>
 	 * The preference value is of type <code>Boolean</code>.
 	 * </p>
@@ -170,7 +170,7 @@
 
 	/**
 	 * A named preference that controls whether the overview ruler shows unknown indicators
- 	 * (value <code>"othersIndicationInOverviewRuler"</code>).
+	 * (value <code>"othersIndicationInOverviewRuler"</code>).
 	 * <p>
 	 * The preference value is of type <code>Boolean</code>.
 	 * </p>
@@ -181,7 +181,7 @@
 
 	/**
 	 * A named preference that controls if the overview ruler is shown in the UI
- 	 * (value <code>"overviewRuler"</code>).
+	 * (value <code>"overviewRuler"</code>).
 	 * <p>
 	 * The preference value is of type <code>Boolean</code>.
 	 * </p>
@@ -672,10 +672,10 @@
 	public static final String EDITOR_HOVER_ENRICH_MODE= AbstractTextEditor.PREFERENCE_HOVER_ENRICH_MODE;
 
 	/**
-  	* Initializes the given preference store with the default values.
+	* Initializes the given preference store with the default values.
 	 *
-  	* @param store the preference store to be initialized
-  	*/
+	* @param store the preference store to be initialized
+	*/
 	public static void initializeDefaultValues(IPreferenceStore store) {
 		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.USE_ANNOTATIONS_PREFERENCE_PAGE, false);
 		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.USE_QUICK_DIFF_PREFERENCE_PAGE, false);
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TaskRulerAction.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TaskRulerAction.java
index 6b914d3..e28f267 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TaskRulerAction.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TaskRulerAction.java
@@ -63,10 +63,10 @@
 			if (resource == null)
 				return;
 
-           TaskPropertiesDialog dialog = new TaskPropertiesDialog(getTextEditor().getSite().getShell());
-            dialog.setResource(resource);
-            dialog.setInitialAttributes(getInitialAttributes());
-            dialog.open();
+			TaskPropertiesDialog dialog = new TaskPropertiesDialog(getTextEditor().getSite().getShell());
+			dialog.setResource(resource);
+			dialog.setInitialAttributes(getInitialAttributes());
+			dialog.open();
 		}
 	}
 
diff --git a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/BlueTagsPresentationReconciler.java b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/BlueTagsPresentationReconciler.java
index f365a9f..cf3af15 100644
--- a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/BlueTagsPresentationReconciler.java
+++ b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/BlueTagsPresentationReconciler.java
@@ -26,17 +26,17 @@
 
 public class BlueTagsPresentationReconciler extends PresentationReconciler {
 
-    private final TextAttribute tagAttribute = new TextAttribute(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
-    private final TextAttribute headerAttribute = new TextAttribute(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY));
+	private final TextAttribute tagAttribute = new TextAttribute(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+	private final TextAttribute headerAttribute = new TextAttribute(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY));
 
-    public BlueTagsPresentationReconciler() {
-        RuleBasedScanner scanner= new RuleBasedScanner();
-        IRule[] rules = new IRule[2];
-        rules[1]= new SingleLineRule("<", ">", new Token(tagAttribute));
-        rules[0]= new SingleLineRule("<?", "?>", new Token(headerAttribute));
-        scanner.setRules(rules);
-        DefaultDamagerRepairer dr= new DefaultDamagerRepairer(scanner);
-        this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
-        this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
-    }
+	public BlueTagsPresentationReconciler() {
+		RuleBasedScanner scanner= new RuleBasedScanner();
+		IRule[] rules = new IRule[2];
+		rules[1]= new SingleLineRule("<", ">", new Token(tagAttribute));
+		rules[0]= new SingleLineRule("<?", "?>", new Token(headerAttribute));
+		scanner.setRules(rules);
+		DefaultDamagerRepairer dr= new DefaultDamagerRepairer(scanner);
+		this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+		this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/FoldingReconciler.java b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/FoldingReconciler.java
index aeb33e9..a9ed6d2 100644
--- a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/FoldingReconciler.java
+++ b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/FoldingReconciler.java
@@ -23,14 +23,14 @@
 	private FoldingStrategy fStrategy;
 
 	public FoldingReconciler() {
-        fStrategy = new FoldingStrategy();
-        this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
-    }
+		fStrategy = new FoldingStrategy();
+		this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
+	}
 
-    @Override
-    public void install(ITextViewer textViewer) {
-    	super.install(textViewer);
-    	ProjectionViewer pViewer =(ProjectionViewer)textViewer;
-    	fStrategy.setProjectionViewer(pViewer);
-    }
+	@Override
+	public void install(ITextViewer textViewer) {
+		super.install(textViewer);
+		ProjectionViewer pViewer =(ProjectionViewer)textViewer;
+		fStrategy.setProjectionViewer(pViewer);
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/HighlightReconciler.java b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/HighlightReconciler.java
index bdca530..971fe3b 100644
--- a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/HighlightReconciler.java
+++ b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/HighlightReconciler.java
@@ -22,9 +22,9 @@
 	private HighlightStrategy fStrategy;
 
 	public HighlightReconciler() {
-        fStrategy = new HighlightStrategy();
-        this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
-    }
+		fStrategy = new HighlightStrategy();
+		this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
+	}
 
 	@Override
 	public void install(ITextViewer textViewer) {
diff --git a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NatureLabelHoverProvider.java b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NatureLabelHoverProvider.java
index ef2c7d9..21c142a 100644
--- a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NatureLabelHoverProvider.java
+++ b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NatureLabelHoverProvider.java
@@ -23,31 +23,31 @@
 import org.eclipse.jface.text.Region;
 public class NatureLabelHoverProvider implements ITextHover {
 
-    public NatureLabelHoverProvider() {
-    }
+	public NatureLabelHoverProvider() {
+	}
 
-    @Override
-    public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+	@Override
+	public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
 
-        String contents= textViewer.getDocument().get();
-        int offset= hoverRegion.getOffset();
-        int endIndex= contents.indexOf("</nature>", offset);
-        if (endIndex==-1) return "";
-        int startIndex= contents.substring(0, offset).lastIndexOf("<nature>");
-        if (startIndex==-1) return "";
-        String selection = contents.substring(startIndex+"<nature>".length(), endIndex);
+		String contents= textViewer.getDocument().get();
+		int offset= hoverRegion.getOffset();
+		int endIndex= contents.indexOf("</nature>", offset);
+		if (endIndex==-1) return "";
+		int startIndex= contents.substring(0, offset).lastIndexOf("<nature>");
+		if (startIndex==-1) return "";
+		String selection = contents.substring(startIndex+"<nature>".length(), endIndex);
 
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IProjectNatureDescriptor[] natureDescriptors= workspace.getNatureDescriptors();
-        for (int i= 0; i < natureDescriptors.length; i++) {
-            if (natureDescriptors[i].getNatureId().equals(selection))
-                return natureDescriptors[i].getLabel();
-        }
-        return null;
-    }
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IProjectNatureDescriptor[] natureDescriptors= workspace.getNatureDescriptors();
+		for (int i= 0; i < natureDescriptors.length; i++) {
+			if (natureDescriptors[i].getNatureId().equals(selection))
+				return natureDescriptors[i].getLabel();
+		}
+		return null;
+	}
 
-    @Override
-    public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
-        return new Region(offset, 0);
-    }
+	@Override
+	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+		return new Region(offset, 0);
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NaturesAndProjectsContentAssistProcessor.java b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NaturesAndProjectsContentAssistProcessor.java
index f4a0375..a61f658 100644
--- a/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NaturesAndProjectsContentAssistProcessor.java
+++ b/org.eclipse.ui.genericeditor.examples/src/org/eclipse/ui/genericeditor/examples/dotproject/NaturesAndProjectsContentAssistProcessor.java
@@ -30,58 +30,58 @@
 		// TODO Auto-generated constructor stub
 	}
 
-    @Override
-    public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
-        String text = viewer.getDocument().get();
-        String natureTag= "<nature>";
-        String projectReferenceTag="<project>";
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        int natureTagLength = natureTag.length();
+	@Override
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+		String text = viewer.getDocument().get();
+		String natureTag= "<nature>";
+		String projectReferenceTag="<project>";
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		int natureTagLength = natureTag.length();
 		if (text.length() >= natureTagLength && offset >= natureTagLength && text.substring(offset - natureTagLength, offset).equals(natureTag)) {
-            IProjectNatureDescriptor[] natureDescriptors= workspace.getNatureDescriptors();
-            ICompletionProposal[] proposals = new ICompletionProposal[natureDescriptors.length];
-            for (int i= 0; i < natureDescriptors.length; i++) {
-                IProjectNatureDescriptor descriptor= natureDescriptors[i];
-                proposals[i] = new CompletionProposal(descriptor.getNatureId(), offset, 0, descriptor.getNatureId().length());
-            }
-            return proposals;
-        }
-        int projectReferenceTagLength = projectReferenceTag.length();
+			IProjectNatureDescriptor[] natureDescriptors= workspace.getNatureDescriptors();
+			ICompletionProposal[] proposals = new ICompletionProposal[natureDescriptors.length];
+			for (int i= 0; i < natureDescriptors.length; i++) {
+				IProjectNatureDescriptor descriptor= natureDescriptors[i];
+				proposals[i] = new CompletionProposal(descriptor.getNatureId(), offset, 0, descriptor.getNatureId().length());
+			}
+			return proposals;
+		}
+		int projectReferenceTagLength = projectReferenceTag.length();
 		if (text.length() >= projectReferenceTagLength && offset >= projectReferenceTagLength && text.substring(offset - projectReferenceTagLength, offset).equals(projectReferenceTag)) {
-            IProject[] projects= workspace.getRoot().getProjects();
-            //TODO - filter out the project this file is in
-            ICompletionProposal[] proposals = new ICompletionProposal[projects.length];
-            for (int i= 0; i < projects.length; i++) {
-                proposals[i]=new CompletionProposal(projects[i].getName(), offset, 0, projects[i].getName().length());
-            }
-            return proposals;
-        }
-        return new ICompletionProposal[0];
-    }
+			IProject[] projects= workspace.getRoot().getProjects();
+			//TODO - filter out the project this file is in
+			ICompletionProposal[] proposals = new ICompletionProposal[projects.length];
+			for (int i= 0; i < projects.length; i++) {
+				proposals[i]=new CompletionProposal(projects[i].getName(), offset, 0, projects[i].getName().length());
+			}
+			return proposals;
+		}
+		return new ICompletionProposal[0];
+	}
 
-    @Override
-    public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
-        return null;
-    }
+	@Override
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+		return null;
+	}
 
-    @Override
-    public char[] getCompletionProposalAutoActivationCharacters() {
-        return null;
-    }
+	@Override
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return null;
+	}
 
-    @Override
-    public char[] getContextInformationAutoActivationCharacters() {
-        return null;
-    }
+	@Override
+	public char[] getContextInformationAutoActivationCharacters() {
+		return null;
+	}
 
-    @Override
-    public String getErrorMessage() {
-        return null;
-    }
+	@Override
+	public String getErrorMessage() {
+		return null;
+	}
 
-    @Override
-    public IContextInformationValidator getContextInformationValidator() {
-        return null;
-    }
+	@Override
+	public IContextInformationValidator getContextInformationValidator() {
+		return null;
+	}
 
 }
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF b/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF
index 49a6416..2487095 100644
--- a/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.ui.genericeditor.tests;singleton:=true
-Bundle-Version: 1.1.200.qualifier
+Bundle-Version: 1.1.300.qualifier
 Bundle-Vendor: %Plugin.providerName
 Bundle-Localization: plugin
 Export-Package: org.eclipse.ui.genericeditor.tests,
diff --git a/org.eclipse.ui.genericeditor.tests/pom.xml b/org.eclipse.ui.genericeditor.tests/pom.xml
index 03c6ba2..295e7e9 100644
--- a/org.eclipse.ui.genericeditor.tests/pom.xml
+++ b/org.eclipse.ui.genericeditor.tests/pom.xml
@@ -19,7 +19,7 @@
   </parent>
   <groupId>org.eclipse.ui</groupId>
   <artifactId>org.eclipse.ui.genericeditor.tests</artifactId>
-  <version>1.1.200-SNAPSHOT</version>
+  <version>1.1.300-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
   	<testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/FoldingReconciler.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/FoldingReconciler.java
index 63c6014..7330b51 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/FoldingReconciler.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/FoldingReconciler.java
@@ -23,14 +23,14 @@
 	private FoldingStrategy fStrategy;
 
 	public FoldingReconciler() {
-        fStrategy = new FoldingStrategy();
-        this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
-    }
+		fStrategy = new FoldingStrategy();
+		this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
+	}
 
-    @Override
-    public void install(ITextViewer textViewer) {
-    	super.install(textViewer);
-    	ProjectionViewer pViewer =(ProjectionViewer)textViewer;
-    	fStrategy.setProjectionViewer(pViewer);
-    }
+	@Override
+	public void install(ITextViewer textViewer) {
+		super.install(textViewer);
+		ProjectionViewer pViewer =(ProjectionViewer)textViewer;
+		fStrategy.setProjectionViewer(pViewer);
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HighlightReconciler.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HighlightReconciler.java
index c20fc6a..c1318e5 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HighlightReconciler.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HighlightReconciler.java
@@ -22,9 +22,9 @@
 	private HighlightStrategy fStrategy;
 
 	public HighlightReconciler() {
-        fStrategy = new HighlightStrategy();
-        this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
-    }
+		fStrategy = new HighlightStrategy();
+		this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
+	}
 
 	@Override
 	public void install(ITextViewer textViewer) {
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerFirst.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerFirst.java
index dc1d313..f5856a8 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerFirst.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerFirst.java
@@ -18,6 +18,6 @@
 
 public class TheReconcilerFirst extends Reconciler{
 	public TheReconcilerFirst() {
-        this.setReconcilingStrategy(new ReconcilerStrategyFirst(), IDocument.DEFAULT_CONTENT_TYPE);
+		this.setReconcilingStrategy(new ReconcilerStrategyFirst(), IDocument.DEFAULT_CONTENT_TYPE);
 	}
 }
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerSecond.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerSecond.java
index 7067289..57d7a2b 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerSecond.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/TheReconcilerSecond.java
@@ -18,6 +18,6 @@
 
 public class TheReconcilerSecond extends Reconciler{
 	public TheReconcilerSecond() {
-        this.setReconcilingStrategy(new ReconcilerStrategySecond(), IDocument.DEFAULT_CONTENT_TYPE);
+		this.setReconcilingStrategy(new ReconcilerStrategySecond(), IDocument.DEFAULT_CONTENT_TYPE);
 	}
 }
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightReconciler.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightReconciler.java
index d0744cf..80d5d11 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightReconciler.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightReconciler.java
@@ -22,9 +22,9 @@
 	private DefaultWordHighlightStrategy fStrategy;
 
 	public DefaultWordHighlightReconciler() {
-        fStrategy = new DefaultWordHighlightStrategy();
-        this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
-    }
+		fStrategy = new DefaultWordHighlightStrategy();
+		this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE);
+	}
 
 	@Override
 	public void install(ITextViewer textViewer) {
diff --git a/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF b/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF
index 3d15992..78502d1 100644
--- a/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.ui.workbench.texteditor.tests
-Bundle-Version: 3.12.200.qualifier
+Bundle-Version: 3.12.300.qualifier
 Bundle-Vendor: %Plugin.providerName
 Bundle-Localization: plugin
 Export-Package: 
diff --git a/org.eclipse.ui.workbench.texteditor.tests/pom.xml b/org.eclipse.ui.workbench.texteditor.tests/pom.xml
index 69004f0..96a5bd8 100644
--- a/org.eclipse.ui.workbench.texteditor.tests/pom.xml
+++ b/org.eclipse.ui.workbench.texteditor.tests/pom.xml
@@ -19,7 +19,7 @@
   </parent>
   <groupId>org.eclipse.ui</groupId>
   <artifactId>org.eclipse.ui.workbench.texteditor.tests</artifactId>
-  <version>3.12.200-SNAPSHOT</version>
+  <version>3.12.300-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
   	<testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/HippieCompletionTest.java b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/HippieCompletionTest.java
index f4ded16..d265e89 100644
--- a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/HippieCompletionTest.java
+++ b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/HippieCompletionTest.java
@@ -161,7 +161,7 @@
 			list= fEngine.getCompletionsBackwards(documents[0],
 					"pri", documents[0].get().indexOf("println") + 1);
 			assertEquals(list.size(), 1);
-            assertEquals(list.get(0), "nt");
+			assertEquals(list.get(0), "nt");
 
 			list= fEngine.getCompletionsBackwards(documents[0],
 					"pa", 2);
@@ -192,22 +192,22 @@
 	}
 
 	@Test
-    public void testSearchBackwards3() {
-        try {
-        	List<String> list= fEngine.getCompletionsBackwards(documents[1],
-                    "test", documents[1].getLength());
-            assertEquals("Number of backwards suggestions does not match", 2, list.size());
-            list= fEngine.getCompletionsBackwards(documents[1],
-                    "tests", documents[1].getLength());
-            assertEquals("Number of backwards suggestions does not match", 1, list.size());
+	public void testSearchBackwards3() {
+		try {
+			List<String> list= fEngine.getCompletionsBackwards(documents[1],
+					"test", documents[1].getLength());
+			assertEquals("Number of backwards suggestions does not match", 2, list.size());
+			list= fEngine.getCompletionsBackwards(documents[1],
+					"tests", documents[1].getLength());
+			assertEquals("Number of backwards suggestions does not match", 1, list.size());
 
-            list= fEngine.getCompletionsBackwards(documents[1],
-                    "test", documents[1].getLength() - 1);
-            assertEquals("Number of backwards suggestions does not match", 1, list.size());
-        } catch (BadLocationException e) {
-            assertTrue("Got out of document bounds", false);
-        }
-    }
+			list= fEngine.getCompletionsBackwards(documents[1],
+					"test", documents[1].getLength() - 1);
+			assertEquals("Number of backwards suggestions does not match", 1, list.size());
+		} catch (BadLocationException e) {
+			assertTrue("Got out of document bounds", false);
+		}
+	}
 
 	@Test
 	public void testSearch() {
diff --git a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/ScreenshotTest.java b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/ScreenshotTest.java
index db4a5e1..da8eff7 100644
--- a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/ScreenshotTest.java
+++ b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/ScreenshotTest.java
@@ -54,49 +54,49 @@
 		
 		Display display= Display.getDefault();
 		
-        Event event= new Event();
-        event.type= SWT.KeyDown;
-        event.keyCode= SWT.CTRL;
-        System.out.println("* CTRL " + display.post(event));
-        event.keyCode= SWT.SHIFT;
-        System.out.println("* SHIFT " + display.post(event));
-        event.character= SWT.ESC;
-        event.keyCode= SWT.ESC;
-        System.out.println("* ESC " + display.post(event));
-        
-        event.type= SWT.KeyUp;
-        System.out.println("* ESC up " + display.post(event));
-        event.character= 0;
-        event.keyCode= SWT.SHIFT;
-        System.out.println("* SHIFT up " + display.post(event));
-        event.keyCode= SWT.CTRL;
-        System.out.println("* CTRL up " + display.post(event));
-        
-        runEventQueue();
-        takeScreenshot(ScreenshotTest.class, testName.getMethodName() + 2, System.out);
-        
-        event.type= SWT.KeyDown;
-        event.character= SWT.ESC;
-        event.keyCode= SWT.ESC;
-        System.out.println("* ESC " + display.post(event));
-        event.type= SWT.KeyUp;
-        System.out.println("* ESC up " + display.post(event));
-        
-        runEventQueue();
-        takeScreenshot(ScreenshotTest.class, testName.getMethodName() + 3, System.out);
+		Event event= new Event();
+		event.type= SWT.KeyDown;
+		event.keyCode= SWT.CTRL;
+		System.out.println("* CTRL " + display.post(event));
+		event.keyCode= SWT.SHIFT;
+		System.out.println("* SHIFT " + display.post(event));
+		event.character= SWT.ESC;
+		event.keyCode= SWT.ESC;
+		System.out.println("* ESC " + display.post(event));
+		
+		event.type= SWT.KeyUp;
+		System.out.println("* ESC up " + display.post(event));
+		event.character= 0;
+		event.keyCode= SWT.SHIFT;
+		System.out.println("* SHIFT up " + display.post(event));
+		event.keyCode= SWT.CTRL;
+		System.out.println("* CTRL up " + display.post(event));
+		
+		runEventQueue();
+		takeScreenshot(ScreenshotTest.class, testName.getMethodName() + 2, System.out);
+		
+		event.type= SWT.KeyDown;
+		event.character= SWT.ESC;
+		event.keyCode= SWT.ESC;
+		System.out.println("* ESC " + display.post(event));
+		event.type= SWT.KeyUp;
+		System.out.println("* ESC up " + display.post(event));
+		
+		runEventQueue();
+		takeScreenshot(ScreenshotTest.class, testName.getMethodName() + 3, System.out);
 	}
 	
 	/**
 	 * Takes a screenshot and dumps other debugging information to the given stream.
 	 * 
-     * <p>
-     * Workaround for missing {@link junit.framework.TestCase#getName()} in JUnit 4:
-     * </p>
-     * 
-     * <pre>
-     * &#64;Rule
-     * public TestName testName = new TestName();
-     * </pre>
+	 * <p>
+	 * Workaround for missing {@link junit.framework.TestCase#getName()} in JUnit 4:
+	 * </p>
+	 * 
+	 * <pre>
+	 * &#64;Rule
+	 * public TestName testName = new TestName();
+	 * </pre>
 	 * 
 	 * @param testClass test class that takes the screenshot
 	 * @param name screenshot identifier (e.g. test name)
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HippieCompletionEngine.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HippieCompletionEngine.java
index 2554896..8c24259 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HippieCompletionEngine.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HippieCompletionEngine.java
@@ -162,15 +162,15 @@
 
 	/**
 	 * Search for possible completions in the backward direction. If there
-     * is a possible completion that begins before <code>firstPosition</code>
-     * but ends after that position, it will not be included in the results.
+	 * is a possible completion that begins before <code>firstPosition</code>
+	 * but ends after that position, it will not be included in the results.
 	 *
 	 * @param document the document to be scanned
 	 * @param prefix the completion prefix
 	 * @param firstPosition the caret position
 	 * @return a {@link List} of possible completions ({@link String}s)
 	 *         from the caret position to the beginning of the document.
-     *         The empty suggestion is not included in the results.
+	 *         The empty suggestion is not included in the results.
 	 * @throws BadLocationException if any error occurs
 	 */
 	public List<String> getCompletionsBackwards(IDocument document, CharSequence prefix, int firstPosition) throws BadLocationException {
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/DocumentLineDiffer.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/DocumentLineDiffer.java
index 0439dff..32ec531 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/DocumentLineDiffer.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/DocumentLineDiffer.java
@@ -1416,9 +1416,9 @@
 			fRightDocument= document;
 			fRightDocument.addDocumentListener(this);
 			if (document instanceof IDocumentExtension4) {
-	            IDocumentExtension4 ext= (IDocumentExtension4) document;
-	            ext.addDocumentRewriteSessionListener(fSessionListener);
-            }
+				IDocumentExtension4 ext= (IDocumentExtension4) document;
+				ext.addDocumentRewriteSessionListener(fSessionListener);
+			}
 			initialize();
 		}
 	}
@@ -1454,9 +1454,9 @@
 			if (fRightDocument != null) {
 				fRightDocument.removeDocumentListener(this);
 				if (fRightDocument instanceof IDocumentExtension4) {
-		            IDocumentExtension4 ext= (IDocumentExtension4) fRightDocument;
-		            ext.removeDocumentRewriteSessionListener(fSessionListener);
-	            }
+					IDocumentExtension4 ext= (IDocumentExtension4) fRightDocument;
+					ext.removeDocumentRewriteSessionListener(fSessionListener);
+				}
 			}
 			fRightDocument= null;
 			fRightEquivalent= null;
@@ -1486,7 +1486,7 @@
 		List<QuickDiffRangeDifference> differences= fDifferences; // atomic
 		synchronized (differences) {
 			copy= new ArrayList<>(differences);
-        }
+		}
 		final Iterator<QuickDiffRangeDifference> iter= copy.iterator();
 		return new Iterator<Annotation>() {
 
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/compare/equivalence/DJBHashFunction.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/compare/equivalence/DJBHashFunction.java
index 4fbc594..8223816 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/compare/equivalence/DJBHashFunction.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/quickdiff/compare/equivalence/DJBHashFunction.java
@@ -25,14 +25,14 @@
 	}
 
 	private int hash(CharSequence seq){
-        int hash = 5381;
-        int len= seq.length();
-        for (int i= 0; i < len; i++) {
-        	char ch= seq.charAt(i);
-            hash = ((hash << 5) + hash) + ch; /* hash * 33 + ch */
-        }
+		int hash = 5381;
+		int len= seq.length();
+		for (int i= 0; i < len; i++) {
+			char ch= seq.charAt(i);
+			hash = ((hash << 5) + hash) + ch; /* hash * 33 + ch */
+		}
 
-        return hash;
-    }
+		return hash;
+	}
 
 }
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 65f9467..497865c 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
@@ -1860,7 +1860,7 @@
 				return false;
 
 			return getInformationPresenter().openFocusedAnnotationHover(annotationHover, line);
-        }
+		}
 
 		/**
 		 * Returns the information presenter (creates it if necessary).
@@ -3174,16 +3174,16 @@
 		} catch (InvocationTargetException x) {
 			Throwable t= x.getTargetException();
 			if (t instanceof CoreException) {
-                /*
-                /* XXX: Remove unpacking of CoreException once the following bug is
-                 *		fixed: https://bugs.eclipse.org/bugs/show_bug.cgi?id=81640
-                 */
-                CoreException e= (CoreException)t;
-                IStatus status= e.getStatus();
-                if (status.getException() != null)
-                    throw new PartInitException(status);
-               	throw new PartInitException(new Status(status.getSeverity(), status.getPlugin(), status.getCode(), status.getMessage(), t));
-            }
+				/*
+				/* XXX: Remove unpacking of CoreException once the following bug is
+				 *		fixed: https://bugs.eclipse.org/bugs/show_bug.cgi?id=81640
+				 */
+				CoreException e= (CoreException)t;
+				IStatus status= e.getStatus();
+				if (status.getException() != null)
+					throw new PartInitException(status);
+				throw new PartInitException(new Status(status.getSeverity(), status.getPlugin(), status.getCode(), status.getMessage(), t));
+			}
 			throw new PartInitException(new Status(IStatus.ERROR, TextEditorPlugin.PLUGIN_ID, IStatus.OK, EditorMessages.Editor_error_init, t));
 		}
 	}
@@ -3685,14 +3685,14 @@
 	}
 
 	/**
-     * Tells whether the editor input should be included when adding object
-     * contributions to this editor's context menu.
-     * <p>
-     * This implementation always returns <code>true</code>.
-     * </p>
-     *
+	 * Tells whether the editor input should be included when adding object
+	 * contributions to this editor's context menu.
+	 * <p>
+	 * This implementation always returns <code>true</code>.
+	 * </p>
+	 *
 	 * @return <code>true</code> if the editor input should be considered
-     * @since 3.2
+	 * @since 3.2
 	 */
 	protected boolean isEditorInputIncludedInContextMenu() {
 		return true;
@@ -6050,11 +6050,11 @@
 	 * @param newGroup the new group
 	 */
 	protected final void addGroup(IMenuManager menu, String existingGroup, String newGroup) {
- 		IMenuManager subMenu= menu.findMenuUsingPath(existingGroup);
- 		if (subMenu != null)
- 			subMenu.add(new Separator(newGroup));
- 		else
- 			menu.appendToGroup(existingGroup, new Separator(newGroup));
+		IMenuManager subMenu= menu.findMenuUsingPath(existingGroup);
+		if (subMenu != null)
+			subMenu.add(new Separator(newGroup));
+		else
+			menu.appendToGroup(existingGroup, new Separator(newGroup));
 	}
 
 	/**
@@ -6596,7 +6596,7 @@
 			styledText.setCaret(fNonDefaultCaret);
 			fNonDefaultCaretImage= fNonDefaultCaret.getImage();
 		} else if (fInitialCaret != styledText.getCaret())
-		    styledText.setCaret(fInitialCaret);
+			styledText.setCaret(fInitialCaret);
 	}
 
 	private void disposeNonDefaultCaret() {
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AnnotationPreference.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AnnotationPreference.java
index cc9b923..00ff12d 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AnnotationPreference.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AnnotationPreference.java
@@ -847,9 +847,9 @@
 	}
 
 	/**
- 	 * Sets the preference key for go to previous navigation enablement.
- 	 *
- 	 * @param isGoToPreviousNavigationTargetKey the preference key
+	 * Sets the preference key for go to previous navigation enablement.
+	 *
+	 * @param isGoToPreviousNavigationTargetKey the preference key
 	 * @since 3.0
 	 */
 	public void setIsGoToPreviousNavigationTargetKey(String isGoToPreviousNavigationTargetKey) {
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/BasicTextEditorActionContributor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/BasicTextEditorActionContributor.java
index 173b3da..f23c216 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/BasicTextEditorActionContributor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/BasicTextEditorActionContributor.java
@@ -292,12 +292,12 @@
 	 * @since 3.2
 	 */
 	private void addOrInsert(IContributionManager menu, IContributionItem item) {
-	    String id= item.getId();
+		String id= item.getId();
 		if (menu.find(id) == null)
-	    	menu.add(item);
-	    else
-	    	menu.insertAfter(id, item);
-    }
+			menu.add(item);
+		else
+			menu.insertAfter(id, item);
+	}
 
 	@Override
 	public void contributeToStatusLine(IStatusLineManager statusLineManager) {
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/ConfigurationElementSorter.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/ConfigurationElementSorter.java
index 1fe94fc..9082268 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/ConfigurationElementSorter.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/ConfigurationElementSorter.java
@@ -132,7 +132,7 @@
 			Set<Bundle> fBundleSet= new HashSet<>(length);
 
 			for (int i= 0; i < length; i++) {
-			    IConfigurationElement configElement= getConfigurationElement(elements[i]);
+				IConfigurationElement configElement= getConfigurationElement(elements[i]);
 				Bundle bundle= Platform.getBundle(configElement.getContributor().getName());
 				fDescriptorMapping.put(elements[i], bundle.getSymbolicName());
 				fBundleSet.add(bundle);
@@ -148,18 +148,18 @@
 
 				String requires = bundle.getHeaders().get(Constants.REQUIRE_BUNDLE);
 				ManifestElement[] manifestElements;
-                try {
-                    manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, requires);
-                } catch (BundleException e) {
-                	String uid= getExtensionPointUniqueIdentifier(bundle);
-                	String message= "ConfigurationElementSorter for '" + uid + "': getting required plug-ins for '" + bundle.getSymbolicName() + "' failed"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    				Status status= new Status(IStatus.ERROR, TextEditorPlugin.PLUGIN_ID, IStatus.OK, message, e);
-    				TextEditorPlugin.getDefault().getLog().log(status);
-                    continue;
-                }
+				try {
+					manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, requires);
+				} catch (BundleException e) {
+					String uid= getExtensionPointUniqueIdentifier(bundle);
+					String message= "ConfigurationElementSorter for '" + uid + "': getting required plug-ins for '" + bundle.getSymbolicName() + "' failed"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					Status status= new Status(IStatus.ERROR, TextEditorPlugin.PLUGIN_ID, IStatus.OK, message, e);
+					TextEditorPlugin.getDefault().getLog().log(status);
+					continue;
+				}
 
-                if (manifestElements == null)
-                	continue;
+				if (manifestElements == null)
+					continue;
 
 				int i= 0;
 				while (i < manifestElements.length && !toTest.isEmpty()) {
@@ -194,7 +194,7 @@
 					while (iter.hasNext()) {
 						Entry<Object, String> entry= iter.next();
 						if (bundleName.equals(entry.getValue())) {
-						    IExtension extension = getConfigurationElement(entry.getKey()).getDeclaringExtension();
+							IExtension extension = getConfigurationElement(entry.getKey()).getDeclaringExtension();
 							return extension.getExtensionPointUniqueIdentifier();
 						}
 					}
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceAction.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceAction.java
index 90bcab1..5839928 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceAction.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceAction.java
@@ -290,7 +290,7 @@
 		Assert.isLegal(target != null && shell != null);
 		fTarget= target;
 		fShell= shell;
- 		update();
+		update();
 	}
 
 	/**
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/IAbstractTextEditorHelpContextIds.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/IAbstractTextEditorHelpContextIds.java
index 3f1e2a3..22e039b 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/IAbstractTextEditorHelpContextIds.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/IAbstractTextEditorHelpContextIds.java
@@ -340,46 +340,46 @@
 	 */
 	String TOGGLE_INSERT_MODE_ACTION= PREFIX + "toggle_insert_mode" + ACTION_POSTFIX; //$NON-NLS-1$;;
 
-    /**
-     * Help context id for the word completion action.
-     * Value: <code>"org.eclipse.ui.hippie_completion_action_context"</code>
-     * @since 3.1
-     */
-    String HIPPIE_COMPLETION_ACTION= PREFIX + "hippie_completion" + ACTION_POSTFIX; //$NON-NLS-1$
+	/**
+	 * Help context id for the word completion action.
+	 * Value: <code>"org.eclipse.ui.hippie_completion_action_context"</code>
+	 * @since 3.1
+	 */
+	String HIPPIE_COMPLETION_ACTION= PREFIX + "hippie_completion" + ACTION_POSTFIX; //$NON-NLS-1$
 
-    /**
-     * Help context id for the content assist action.
-     * Value: <code>"org.eclipse.ui.content_assist_action_context"</code>
-     * @since 3.5
-     */
-    String CONTENT_ASSIST_ACTION= PREFIX + "content_assist" + ACTION_POSTFIX; //$NON-NLS-1$
+	/**
+	 * Help context id for the content assist action.
+	 * Value: <code>"org.eclipse.ui.content_assist_action_context"</code>
+	 * @since 3.5
+	 */
+	String CONTENT_ASSIST_ACTION= PREFIX + "content_assist" + ACTION_POSTFIX; //$NON-NLS-1$
 
-    /**
-     * Help context id for the content assist context information action.
-     * Value: <code>"org.eclipse.ui.content_assist_context_information_action_context"</code>
-     * @since 3.5
-     */
-    String CONTENT_ASSIST_CONTEXT_INFORMATION_ACTION= PREFIX + "content_assist_context_information" + ACTION_POSTFIX; //$NON-NLS-1$
+	/**
+	 * Help context id for the content assist context information action.
+	 * Value: <code>"org.eclipse.ui.content_assist_context_information_action_context"</code>
+	 * @since 3.5
+	 */
+	String CONTENT_ASSIST_CONTEXT_INFORMATION_ACTION= PREFIX + "content_assist_context_information" + ACTION_POSTFIX; //$NON-NLS-1$
 
-    /**
-     * Help context id for the quick assist action.
-     * Value: <code>"org.eclipse.ui.quick_assist_action_context"</code>
-     * @since 3.2
-     */
-    String QUICK_ASSIST_ACTION= PREFIX + "quick_assist" + ACTION_POSTFIX; //$NON-NLS-1$
+	/**
+	 * Help context id for the quick assist action.
+	 * Value: <code>"org.eclipse.ui.quick_assist_action_context"</code>
+	 * @since 3.2
+	 */
+	String QUICK_ASSIST_ACTION= PREFIX + "quick_assist" + ACTION_POSTFIX; //$NON-NLS-1$
 
-    /**
-     * Help context id for the recenter action.
-     * Value: <code>"org.eclipse.ui.recenter_action_context"</code>
-     * @since 3.3
-     */
-    String RECENTER_ACTION= PREFIX + "recenter" + ACTION_POSTFIX; //$NON-NLS-1$
+	/**
+	 * Help context id for the recenter action.
+	 * Value: <code>"org.eclipse.ui.recenter_action_context"</code>
+	 * @since 3.3
+	 */
+	String RECENTER_ACTION= PREFIX + "recenter" + ACTION_POSTFIX; //$NON-NLS-1$
 
-    /**
-     * Help context id for the show whitespace characters action.
-     * Value: <code>"org.eclipse.ui.show_whitespace_characters_action_context"</code>
-     * @since 3.3
-     */
+	/**
+	 * Help context id for the show whitespace characters action.
+	 * Value: <code>"org.eclipse.ui.show_whitespace_characters_action_context"</code>
+	 * @since 3.3
+	 */
 	String SHOW_WHITESPACE_CHARACTERS_ACTION= PREFIX + "show_whitepsace_characters" + ACTION_POSTFIX; //$NON-NLS-1$
 
 	/**
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/InfoForm.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/InfoForm.java
index cfd0059..ccc5e44 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/InfoForm.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/InfoForm.java
@@ -149,7 +149,7 @@
 		fText.setText(info);
 	}
 
-    /**
+	/**
 	 * Handles the property change.
 	 *
 	 * @param event the property change event object describing which property changed and how
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/RetargetTextEditorAction.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/RetargetTextEditorAction.java
index 18c6733..1359ef9 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/RetargetTextEditorAction.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/RetargetTextEditorAction.java
@@ -64,7 +64,7 @@
 	 *   (described in <code>ResourceAction</code> constructor), or
 	 *   <code>null</code> if none
 	 * @param	style one of <code>IAction.AS_PUSH_BUTTON</code>, <code>IAction.AS_CHECK_BOX</code>,
- 	 *			and <code>IAction.AS_RADIO_BUTTON</code>.
+	 *			and <code>IAction.AS_RADIO_BUTTON</code>.
 	 *
 	 * @see ResourceAction#ResourceAction(ResourceBundle, String, int)
 	 * @see IAction#AS_CHECK_BOX
@@ -109,7 +109,7 @@
 	 *   (described in <code>ResourceAction</code> constructor), or <code>null</code> if none
 	 * @param actionId the action id
 	 * @param	style one of <code>IAction.AS_PUSH_BUTTON</code>, <code>IAction.AS_CHECK_BOX</code>,
- 	 *			and <code>IAction.AS_RADIO_BUTTON</code>.
+	 *			and <code>IAction.AS_RADIO_BUTTON</code>.
 	 *
 	 * @see ResourceAction#ResourceAction(ResourceBundle, String, int)
 	 * @see IAction#AS_CHECK_BOX
@@ -183,7 +183,7 @@
 
 			setEnabled(false);
 			if (getStyle() == AS_CHECK_BOX || getStyle() == AS_RADIO_BUTTON)
-			   setChecked(false);
+				setChecked(false);
 			setText(fDefaultText);
 			setToolTipText(""); //$NON-NLS-1$
 
@@ -191,7 +191,7 @@
 
 			setEnabled(fAction.isEnabled());
 			if (fAction.getStyle() == AS_CHECK_BOX || fAction.getStyle() ==  AS_RADIO_BUTTON)
-			   super.setChecked(fAction.isChecked());
+				super.setChecked(fAction.isChecked());
 			setText(fAction.getText());
 			setToolTipText(fAction.getToolTipText());
 			fAction.addPropertyChangeListener(fListener);
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/SourceViewerDecorationSupport.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/SourceViewerDecorationSupport.java
index 87d43bd..e2e0e89 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/SourceViewerDecorationSupport.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/SourceViewerDecorationSupport.java
@@ -507,7 +507,7 @@
 
 	/*
 	 * @see AbstractTextEditor#handlePreferenceStoreChanged(PropertyChangeEvent)
- 	 */
+	 */
 	protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
 
 		String p= event.getProperty();
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/ColumnLayout.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/ColumnLayout.java
index ee22664..f0d7799 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/ColumnLayout.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/ColumnLayout.java
@@ -188,41 +188,41 @@
 
 	@Override
 	protected void layout(Composite composite, boolean flushCache) {
-        Rectangle area= composite.getClientArea();
-        Table table= getTable(composite);
-        int tableWidth= table.getSize().x;
-        int trim= computeTrim(area, table, tableWidth);
-        int width= Math.max(0, area.width - trim);
+		Rectangle area= composite.getClientArea();
+		Table table= getTable(composite);
+		int tableWidth= table.getSize().x;
+		int trim= computeTrim(area, table, tableWidth);
+		int width= Math.max(0, area.width - trim);
 
-        if (width > 1)
-        	layoutTable(table, width, area, tableWidth < area.width);
+		if (width > 1)
+			layoutTable(table, width, area, tableWidth < area.width);
 
-        if( composite.getData(RECALCULATE_LAYOUT) == null ) {
-        	composite.setData(RECALCULATE_LAYOUT, Boolean.FALSE);
-        	composite.layout();
-        }
+		if( composite.getData(RECALCULATE_LAYOUT) == null ) {
+			composite.setData(RECALCULATE_LAYOUT, Boolean.FALSE);
+			composite.layout();
+		}
 	}
 
 	private int computeTrim(Rectangle area, Table table, int tableWidth) {
 		Point preferredSize= computeTableSize(table, area.width, area.height);
-        int trim;
-        if (tableWidth > 1) {
-        	trim= tableWidth - table.getClientArea().width;
-        } else {
-        	// initially, the table has no extend and no client area - use the border with
-        	// plus some padding as educated guess
-        	trim= 2 * table.getBorderWidth() + 1 ;
-        }
-        if (preferredSize.y > area.height) {
-            // Subtract the scrollbar width from the total column width
-            // if a vertical scrollbar will be required, but is not currently showing
-        	// (in which case it is already subtracted above)
-            ScrollBar vBar= table.getVerticalBar();
-            if (!vBar.isVisible()) {
-            	Point vBarSize= vBar.getSize();
-            	trim += vBarSize.x;
-            }
-        }
+		int trim;
+		if (tableWidth > 1) {
+			trim= tableWidth - table.getClientArea().width;
+		} else {
+			// initially, the table has no extend and no client area - use the border with
+			// plus some padding as educated guess
+			trim= 2 * table.getBorderWidth() + 1 ;
+		}
+		if (preferredSize.y > area.height) {
+			// Subtract the scrollbar width from the total column width
+			// if a vertical scrollbar will be required, but is not currently showing
+			// (in which case it is already subtracted above)
+			ScrollBar vBar= table.getVerticalBar();
+			if (!vBar.isVisible()) {
+				Point vBarSize= vBar.getSize();
+				trim += vBarSize.x;
+			}
+		}
 		return trim;
 	}
 
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatePreferencePage.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatePreferencePage.java
index 2d93bbb..1583a79 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatePreferencePage.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatePreferencePage.java
@@ -832,24 +832,24 @@
 		layout.marginWidth= 0;
 		parent.setLayout(layout);
 
-        Composite innerParent= new Composite(parent, SWT.NONE);
-        GridLayout innerLayout= new GridLayout();
-        innerLayout.numColumns= 2;
-        innerLayout.marginHeight= 0;
-        innerLayout.marginWidth= 0;
-        innerParent.setLayout(innerLayout);
-        GridData gd= new GridData(GridData.FILL_BOTH);
-        gd.horizontalSpan= 2;
-        innerParent.setLayoutData(gd);
+		Composite innerParent= new Composite(parent, SWT.NONE);
+		GridLayout innerLayout= new GridLayout();
+		innerLayout.numColumns= 2;
+		innerLayout.marginHeight= 0;
+		innerLayout.marginWidth= 0;
+		innerParent.setLayout(innerLayout);
+		GridData gd= new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan= 2;
+		innerParent.setLayoutData(gd);
 
-        Composite tableComposite= new Composite(innerParent, SWT.NONE);
-        GridData data= new GridData(GridData.FILL_BOTH);
-        data.widthHint= 360;
-        data.heightHint= convertHeightInCharsToPixels(10);
-        tableComposite.setLayoutData(data);
+		Composite tableComposite= new Composite(innerParent, SWT.NONE);
+		GridData data= new GridData(GridData.FILL_BOTH);
+		data.widthHint= 360;
+		data.heightHint= convertHeightInCharsToPixels(10);
+		tableComposite.setLayoutData(data);
 
-        ColumnLayout columnLayout= new ColumnLayout();
-        tableComposite.setLayout(columnLayout);
+		ColumnLayout columnLayout= new ColumnLayout();
+		tableComposite.setLayout(columnLayout);
 		Table table= new Table(tableComposite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
 
 		table.setHeaderVisible(true);
@@ -959,10 +959,10 @@
 		if (isShowFormatterSetting()) {
 			fFormatButton= new Button(parent, SWT.CHECK);
 			fFormatButton.setText(TemplatesMessages.TemplatePreferencePage_use_code_formatter);
-	        GridData gd1= new GridData();
-	        gd1.horizontalSpan= 2;
-	        fFormatButton.setLayoutData(gd1);
-	        fFormatButton.setSelection(getPreferenceStore().getBoolean(getFormatterPreferenceKey()));
+			GridData gd1= new GridData();
+			gd1.horizontalSpan= 2;
+			fFormatButton.setLayoutData(gd1);
+			fFormatButton.setSelection(getPreferenceStore().getBoolean(getFormatterPreferenceKey()));
 		}
 
 		fTableViewer.setInput(fTemplateStore);
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesTransfer.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesTransfer.java
index a8edbdc..a7f1443 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesTransfer.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesTransfer.java
@@ -69,9 +69,9 @@
 
 	@Override
 	protected Object nativeToJava(TransferData transferData) {
-        Object result= super.nativeToJava(transferData);
-        if (!(result instanceof byte[]) || !TYPE_NAME.equals(new String((byte[]) result)))
-        	return null ;
+		Object result= super.nativeToJava(transferData);
+		if (!(result instanceof byte[]) || !TYPE_NAME.equals(new String((byte[]) result)))
+			return null ;
 		return fObject ;
 	}
 }
