diff --git a/bundles/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs
index 06f23f3..75856d2 100644
--- a/bundles/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs
@@ -55,7 +55,7 @@
 org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
 org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java
index aba9779..5620ae2 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java
@@ -57,7 +57,6 @@
  * </p>
  */
 public class CompareConfiguration {
-
 	/**
 	 * Name of the ignore whitespace property (value <code>"IGNORE_WHITESPACE"</code>).
 	 */
@@ -106,8 +105,8 @@
 	}
 
 	private IPreferenceStore fPreferenceStore;
-	private ListenerList fListeners= new ListenerList();
-	private HashMap fProperties= new HashMap();
+	private ListenerList<IPropertyChangeListener> fListeners= new ListenerList<>();
+	private HashMap<String, Object> fProperties= new HashMap<>();
 	private boolean fLeftEditable= true;
 	private boolean fRightEditable= true;
 	private String fAncestorLabel;
@@ -120,11 +119,13 @@
 	private DefaultLabelProvider labelProvider = new DefaultLabelProvider();
 	private boolean fDisposed;
 	private LocalResourceManager fResourceManager;
-	private Set fIgnoredChanges = new HashSet(6); 
+	private Set<Integer> fIgnoredChanges = new HashSet<>(6); 
 
 	private class DefaultLabelProvider extends LabelProvider implements ICompareInputLabelProvider, ILabelProviderListener {
-		private Map labelProviders = new HashMap();
+		private Map<ICompareInput, ICompareInputLabelProvider> labelProviders = new HashMap<>();
 		private ICompareInputLabelProvider defaultLabelProvider;
+
+		@Override
 		public Image getAncestorImage(Object input) {
 			ICompareInputLabelProvider provider = getLabelProvider(input);
 			if (provider != null) {
@@ -134,6 +135,8 @@
 			}
 			return fAncestorImage;
 		}
+
+		@Override
 		public String getAncestorLabel(Object input) {
 			ICompareInputLabelProvider provider = getLabelProvider(input);
 			if (provider != null) {
@@ -143,6 +146,8 @@
 			}
 			return fAncestorLabel;
 		}
+
+		@Override
 		public Image getLeftImage(Object input) {
 			ICompareInputLabelProvider provider = getLabelProvider(input);
 			if (provider != null) {
@@ -152,6 +157,8 @@
 			}
 			return fLeftImage;
 		}
+
+		@Override
 		public String getLeftLabel(Object input) {
 			ICompareInputLabelProvider provider = getLabelProvider(input);
 			if (provider != null) {
@@ -161,6 +168,8 @@
 			}
 			return fLeftLabel;
 		}
+
+		@Override
 		public Image getRightImage(Object input) {
 			ICompareInputLabelProvider provider = getLabelProvider(input);
 			if (provider != null) {
@@ -170,6 +179,8 @@
 			}
 			return fRightImage;
 		}
+
+		@Override
 		public String getRightLabel(Object input) {
 			ICompareInputLabelProvider provider = getLabelProvider(input);
 			if (provider != null) {
@@ -179,19 +190,23 @@
 			}
 			return fRightLabel;
 		}
+
 		public ICompareInputLabelProvider getLabelProvider(Object input) {
-			ICompareInputLabelProvider lp = (ICompareInputLabelProvider)labelProviders.get(input);
+			ICompareInputLabelProvider lp = labelProviders.get(input);
 			if (lp == null)
 				return defaultLabelProvider;
 			return lp;
 		}
+
 		public void setLabelProvider(ICompareInput input, ICompareInputLabelProvider labelProvider) {
-			ICompareInputLabelProvider old = (ICompareInputLabelProvider)labelProviders.get(input);
+			ICompareInputLabelProvider old = labelProviders.get(input);
 			if (old != null)
 				old.removeListener(this);
 			labelProviders.put(input, labelProvider);
 			labelProvider.addListener(this);
 		}
+
+		@Override
 		public Image getImage(Object element) {
 			ICompareInputLabelProvider provider = getLabelProvider(element);
 			if (provider != null) {
@@ -207,6 +222,8 @@
 			}
 			return super.getImage(element);
 		}
+
+		@Override
 		public String getText(Object element) {
 			ICompareInputLabelProvider provider = getLabelProvider(element);
 			if (provider != null) {
@@ -223,9 +240,10 @@
 			return super.getText(element);
 		}
 		
+		@Override
 		public void dispose() {
-			for (Iterator iterator = labelProviders.values().iterator(); iterator.hasNext();) {
-				ICompareInputLabelProvider lp = (ICompareInputLabelProvider) iterator.next();
+			for (Iterator<ICompareInputLabelProvider> iterator = labelProviders.values().iterator(); iterator.hasNext();) {
+				ICompareInputLabelProvider lp = iterator.next();
 				lp.removeListener(this);
 			}
 			if (defaultLabelProvider != null)
@@ -234,9 +252,11 @@
 			labelProviders.clear();
 		}
 			
+		@Override
 		public void labelProviderChanged(LabelProviderChangedEvent event) {
 			fireLabelProviderChanged(new LabelProviderChangedEvent(this, event.getElements()));
 		}
+
 		public void setDefaultLabelProvider(ICompareInputLabelProvider labelProvider) {
 			if (defaultLabelProvider != null)
 				defaultLabelProvider.removeListener(this);
@@ -370,16 +390,10 @@
 		}
 	}
 
-	/* (non javadoc)
-	 * see IPropertyChangeNotifier.addListener
-	 */
 	public void addPropertyChangeListener(IPropertyChangeListener listener) {
 		fListeners.add(listener);
 	}
 
-	/* (non javadoc)
-	 * see IPropertyChangeNotifier.removeListener
-	 */
 	public void removePropertyChangeListener(IPropertyChangeListener listener) {
 		fListeners.remove(listener);
 	}
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java
index 81cd560..55b4d5b 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java
@@ -107,7 +107,6 @@
  */
 public abstract class ContentMergeViewer extends ContentViewer
 					implements IPropertyChangeNotifier, IFlushable, IFlushable2 {
-	
 	/* package */ static final int HORIZONTAL= 1;
 	/* package */ static final int VERTICAL= 2;
 	
@@ -115,13 +114,13 @@
 	static final double VSPLIT= 0.3;
 	
 	private class ContentMergeViewerLayout extends Layout {
-		
+		@Override
 		public Point computeSize(Composite c, int w, int h, boolean force) {
 			return new Point(100, 100);
 		}
 		
+		@Override
 		public void layout(Composite composite, boolean force) {
-			
 			if (fLeftLabel == null) {
 				if (composite.isDisposed()) {
 					CompareUIPlugin
@@ -131,7 +130,7 @@
 					logTrace("found bad label. Layout = " + System.identityHashCode(this) + ". composite = "  //$NON-NLS-1$//$NON-NLS-2$
 							+ System.identityHashCode(composite) + ". fComposite = " //$NON-NLS-1$
 							+ System.identityHashCode(fComposite) + ". fComposite.isDisposed() = " //$NON-NLS-1$
-							+ fComposite.isDisposed()); //$NON-NLS-2$
+							+ fComposite.isDisposed());
 					logStackTrace();
 				}
 				// Help to find out the cause for bug 449558
@@ -233,6 +232,7 @@
 			fControl.addMouseMoveListener(this);
 			fControl.addDisposeListener(
 				new DisposeListener() {
+					@Override
 					public void widgetDisposed(DisposeEvent e) {
 						fControl= null;
 					}
@@ -240,6 +240,7 @@
 			);
 		}
 				
+		@Override
 		public void mouseDoubleClick(MouseEvent e) {
 			if ((fDirection & HORIZONTAL) != 0)
 				fHSplit= -1;
@@ -248,6 +249,7 @@
 			fComposite.layout(true);
 		}
 		
+		@Override
 		public void mouseDown(MouseEvent e) {
 			Composite parent= fControl.getParent();
 			
@@ -266,12 +268,14 @@
 			fIsDown= true;
 		}
 		
+		@Override
 		public void mouseUp(MouseEvent e) {
 			fIsDown= false;
 			if (!fLiveResize)
 				resize(e);
 		}
 		
+		@Override
 		public void mouseMove(MouseEvent e) {
 			if (fIsDown && fLiveResize)
 				resize(e);
@@ -307,7 +311,7 @@
 	private final CompareConfiguration fCompareConfiguration;
 	private IPropertyChangeListener fPropertyChangeListener;
 	private ICompareInputChangeListener fCompareInputChangeListener;
-	private ListenerList fListenerList;
+	private ListenerList<IPropertyChangeListener> fListenerList;
 	boolean fConfirmSave= true;
 	
 	private double fHSplit= -1;		// width ratio of left and right panes
@@ -345,6 +349,7 @@
 	private Cursor fHVSashCursor;
 
 	private ILabelProviderListener labelChangeListener = new ILabelProviderListener() {
+		@Override
 		public void labelProviderChanged(LabelProviderChangedEvent event) {
 			Object[] elements = event.getElements();
 			for (int i = 0; i < elements.length; i++) {
@@ -381,6 +386,7 @@
 		setContentProvider(new MergeViewerContentProvider(cc));
 		
 		fCompareInputChangeListener= new ICompareInputChangeListener() {
+			@Override
 			public void compareInputChanged(ICompareInput input) {
 				if (input == getInput()) {
 					handleCompareInputChange();
@@ -389,15 +395,17 @@
 		};
 		
 		// Make sure the compare configuration is not null
-		if (cc == null)
+		if (cc == null) {
 			fCompareConfiguration = new CompareConfiguration();
-		else
+		} else {
 			fCompareConfiguration= cc;
 			fPropertyChangeListener= new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				ContentMergeViewer.this.handlePropertyChangeEvent(event);
-			}
-		};
+				@Override
+				public void propertyChange(PropertyChangeEvent event) {
+					ContentMergeViewer.this.handlePropertyChangeEvent(event);
+				}
+			};
+		}
 		fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener);
 		
 		fIsLeftDirty = false;
@@ -530,6 +538,7 @@
 	 * checks to ensure that the content provider is an <code>IMergeViewerContentProvider</code>.
 	 * @param contentProvider the content provider to set. Must implement IMergeViewerContentProvider.
 	 */
+	@Override
 	public void setContentProvider(IContentProvider contentProvider) {
 		Assert.isTrue(contentProvider instanceof IMergeViewerContentProvider);
 		super.setContentProvider(contentProvider);
@@ -544,8 +553,10 @@
 	 * <code>Viewer</code> method returns the empty selection. Subclasses may override.
 	 * @return empty selection.
 	 */
+	@Override
 	public ISelection getSelection() {
 		return new ISelection() {
+			@Override
 			public boolean isEmpty() {
 				return true;
 			}
@@ -557,6 +568,7 @@
 	 * <code>Viewer</code> method does nothing. Subclasses may reimplement.
 	 * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
 	 */
+	@Override
 	public void setSelection(ISelection selection, boolean reveal) {
 		// empty implementation
 	}
@@ -568,7 +580,6 @@
 	 * @since 3.3
 	 */
 	protected void handlePropertyChangeEvent(PropertyChangeEvent event) {
-		
 		String key= event.getProperty();
 
 		if (key.equals(ICompareUIConstants.PROP_ANCESTOR_VISIBLE)) {
@@ -653,8 +664,8 @@
 	 * @param input the new input of this viewer, or <code>null</code> if there is no new input
 	 * @param oldInput the old input element, or <code>null</code> if there was previously no input
 	 */
+	@Override
 	protected final void inputChanged(Object input, Object oldInput) {
-		
 		if (input != oldInput && oldInput != null) {
 			ICompareInputLabelProvider lp = getCompareConfiguration().getLabelProvider();
 			if (lp != null)
@@ -755,16 +766,13 @@
 	public void setConfirmSave(boolean enable) {
 		fConfirmSave= enable;
 	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#refresh()
-	 */
+
+	@Override
 	public void refresh() {
 		internalRefresh(getInput());
 	}
 	
 	private void internalRefresh(Object input) {
-		
 		IMergeViewerContentProvider content= getMergeContentProvider();
 		if (content != null) {
 			Object ancestor= content.getAncestorContent(input);
@@ -799,6 +807,7 @@
 		}
 	}
 	
+	@Override
 	protected void hookControl(Control control) {
 		if (Policy.debugContentMergeViewer) {
 			logTrace("Attached dispose listener to control " + System.identityHashCode(control)); //$NON-NLS-1$
@@ -821,14 +830,14 @@
 	 * @return the new control
 	 */
 	protected final Control buildControl(Composite parent) {
-											
 		fComposite= new Composite(parent, fStyles | SWT.LEFT_TO_RIGHT) { // we force a specific direction
+			@Override
 			public boolean setFocus() {
 				return ContentMergeViewer.this.handleSetFocus();
 			}
 		};
 		fComposite.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle());
-		
+
 		hookControl(fComposite);	// hook help & dispose listener
 		
 		fComposite.setLayout(new ContentMergeViewerLayout());
@@ -900,6 +909,7 @@
 			if (cc.isRightEditable()) {
 				fCopyLeftToRightAction=
 					new Action() {
+						@Override
 						public void run() {
 							copy(true);
 						}
@@ -912,6 +922,7 @@
 			if (cc.isLeftEditable()) {
 				fCopyRightToLeftAction=
 					new Action() {
+						@Override
 						public void run() {
 							copy(false);
 						}
@@ -989,10 +1000,8 @@
 	protected Control getCenterControl() {
 		return fCenter;
 	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#getControl()
-	 */
+
+	@Override
 	public Control getControl() {
 		return fComposite;
 	}
@@ -1003,8 +1012,8 @@
 	 * Clients may extend if they have to do additional cleanup.
 	 * @see org.eclipse.jface.viewers.ContentViewer#handleDispose(org.eclipse.swt.events.DisposeEvent)
 	 */
+	@Override
 	protected void handleDispose(DisposeEvent event) {
-		
 		if (fHandlerService != null)
 			fHandlerService.dispose();
 		
@@ -1153,18 +1162,14 @@
 	
 	//---- dirty state & saving state
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.IPropertyChangeNotifier#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
+	@Override
 	public void addPropertyChangeListener(IPropertyChangeListener listener) {
 		if (fListenerList == null)
-			fListenerList= new ListenerList();
+			fListenerList= new ListenerList<>();
 		fListenerList.add(listener);
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.IPropertyChangeNotifier#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
+	@Override
 	public void removePropertyChangeListener(IPropertyChangeListener listener) {
 		if (fListenerList != null) {
 			fListenerList.remove(listener);
@@ -1231,6 +1236,7 @@
 	 * @see org.eclipse.compare.contentmergeviewer.IFlushable#flush(org.eclipse.core.runtime.IProgressMonitor)
 	 * @since 3.3
 	 */
+	@Override
 	public final void flush(IProgressMonitor monitor) {
 		flushContent(getInput(), monitor);
 	}
@@ -1250,7 +1256,6 @@
 		flushRightSide(input, monitor);
 	}
 
-
 	void flushLeftSide(Object input, IProgressMonitor monitor) {
 		IMergeViewerContentProvider content = (IMergeViewerContentProvider) getContentProvider();
 
@@ -1283,6 +1288,7 @@
 	 * @param monitor
 	 * @noreference This method is not intended to be referenced by clients.
 	 */
+	@Override
 	public void flushLeft(IProgressMonitor monitor) {
 		flushLeftSide(getInput(), monitor);
 	}
@@ -1291,6 +1297,7 @@
 	 * @param monitor
 	 * @noreference This method is not intended to be referenced by clients.
 	 */
+	@Override
 	public void flushRight(IProgressMonitor monitor) {
 		flushRightSide(getInput(), monitor);
 	}
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java
index dffed062..1096ed5 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java
@@ -258,7 +258,6 @@
  * @see org.eclipse.compare.IStreamContentAccessor
  */
 public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
-	
 	private static final String COPY_LEFT_TO_RIGHT_INDICATOR = ">"; //$NON-NLS-1$
 	private static final String COPY_RIGHT_TO_LEFT_INDICATOR = "<"; //$NON-NLS-1$
 	private static final char ANCESTOR_CONTRIBUTOR = MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR;
@@ -351,9 +350,9 @@
 	private IPreferenceStore fPreferenceStore;
 	private IPropertyChangeListener fPreferenceChangeListener;
 	
-	private HashMap fNewAncestorRanges= new HashMap();
-	private HashMap fNewLeftRanges= new HashMap();
-	private HashMap fNewRightRanges= new HashMap();
+	private HashMap<Object, Position> fNewAncestorRanges= new HashMap<>();
+	private HashMap<Object, Position> fNewLeftRanges= new HashMap<>();
+	private HashMap<Object, Position> fNewRightRanges= new HashMap<>();
 	
 	private MergeSourceViewer fAncestor;
 	private MergeSourceViewer fLeft;
@@ -412,7 +411,7 @@
 	private HeaderPainter fHeaderPainter;
 	
 	// SWT resources to be disposed
-	private Map fColors;
+	private Map<RGB, Color> fColors;
 	private Cursor fBirdsEyeCursor;
 				
 	// points for center curves
@@ -434,7 +433,7 @@
 	private TextEditorPropertyAction toggleLineNumbersAction;
 	private IFindReplaceTarget fFindReplaceTarget;
 	private ChangePropertyAction fIgnoreWhitespace;
-	private List fCompareFilterActions = new ArrayList();
+	private List<ChangeCompareFilterPropertyAction> fCompareFilterActions = new ArrayList<>();
 	private DocumentMerger fMerger;
 	/** The current diff */
 	private Diff fCurrentDiff;
@@ -454,12 +453,13 @@
 	 */
 	private final static String CURRENT_LINE_COLOR= AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR;
 	
-	private List fSourceViewerDecorationSupport = new ArrayList(3);
+	private List<SourceViewerDecorationSupport> fSourceViewerDecorationSupport = new ArrayList<>(3);
 	// whether enhanced viewer configuration has been done
 	private boolean isConfigured = false;
 	private boolean fRedoDiff = false;
 
 	private final class InternalOutlineViewerCreator extends OutlineViewerCreator implements ISelectionChangedListener {
+		@Override
 		public Viewer findStructureViewer(Viewer oldViewer,
 				ICompareInput input, Composite parent,
 				CompareConfiguration configuration) {
@@ -468,6 +468,7 @@
 			final Viewer v = CompareUI.findStructureViewer(oldViewer, input, parent, configuration);
 			if (v != null) {
 				v.getControl().addDisposeListener(new DisposeListener() {
+					@Override
 					public void widgetDisposed(DisposeEvent e) {
 						v.removeSelectionChangedListener(InternalOutlineViewerCreator.this);
 					}
@@ -478,10 +479,12 @@
 			return v;
 		}
 		
+		@Override
 		public boolean hasViewerFor(Object input) {
 			return true;
 		}
 
+		@Override
 		public void selectionChanged(SelectionChangedEvent event) {
 			ISelection s = event.getSelection();
 			if (s instanceof IStructuredSelection) {
@@ -507,7 +510,7 @@
 		}
 		
 	    private Diff findDiff(Position p, boolean left) {
-			for (Iterator iterator = fMerger.rangesIterator(); iterator.hasNext();) {
+			for (Iterator<?> iterator = fMerger.rangesIterator(); iterator.hasNext();) {
 				Diff diff = (Diff) iterator.next();
 				Position diffPos;
 				if (left) {
@@ -533,6 +536,7 @@
 			return null;
 		}
 
+		@Override
 		public Object getInput() {
 			return TextMergeViewer.this.getInput();
 		}
@@ -563,9 +567,7 @@
 			}
 		}
 
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.editors.text.IEncodingSupport#setEncoding(java.lang.String)
-		 */
+		@Override
 		public void setEncoding(String encoding) {
 			if (fDocumentKey == null || fDocumentProvider == null) {
 				return;
@@ -591,9 +593,7 @@
 			}
 		}
 
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.editors.text.IEncodingSupport#getEncoding()
-		 */
+		@Override
 		public String getEncoding() {
 			if (fDocumentProvider != null && fDocumentKey != null
 					&& fDocumentProvider instanceof IStorageDocumentProvider) {
@@ -603,9 +603,7 @@
 			return null;
 		}
 
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.editors.text.IEncodingSupport#getDefaultEncoding()
-		 */
+		@Override
 		public String getDefaultEncoding() {
 			if (fDocumentProvider != null && fDocumentKey != null
 					&& fDocumentProvider instanceof IStorageDocumentProvider) {
@@ -1006,6 +1004,7 @@
 			return false;
 		}
 		
+		@Override
 		public void elementMoved(Object originalElement, Object movedElement) {
 			IEditorInput input = getDocumentKey();
 			if (input != null && input.equals(originalElement)) {
@@ -1013,6 +1012,8 @@
 				resetDocument();
 			}
 		}
+
+		@Override
 		public void elementDirtyStateChanged(Object element, boolean isDirty) {
 			if (!checkState())
 				return;
@@ -1022,6 +1023,7 @@
 			}
 		}
 
+		@Override
 		public void elementDeleted(Object element) {
 			IEditorInput input = getDocumentKey();
 			if (input != null && input.equals(element)) {
@@ -1049,6 +1051,7 @@
 			return !control.isDisposed();
 		}
 
+		@Override
 		public void elementContentReplaced(Object element) {
 			if (!checkState())
 				return;
@@ -1058,6 +1061,7 @@
 
 				// recalculate diffs and update controls
 				new UIJob(CompareMessages.DocumentMerger_0) {
+					@Override
 					public IStatus runInUIThread(IProgressMonitor monitor) {
 						update(true);
 						updateStructure(fLeg);
@@ -1066,6 +1070,7 @@
 				}.schedule();
 			}
 		}
+		@Override
 		public void elementContentAboutToBeReplaced(Object element) {
 			// Nothing to do
 		}
@@ -1135,25 +1140,19 @@
 			return true;
 		}
 
-		/* (non-Javadoc)
-		 * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent)
-		 */
+		@Override
 		public void verifyText(VerifyEvent e) {
 			if (!validateChange()) {
 				e.doit= false;
 			}
 		}
 		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
-		 */
+		@Override
 		public void documentAboutToBeChanged(DocumentEvent e) {
 			// nothing to do
 		}
 		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
-		 */
+		@Override
 		public void documentChanged(DocumentEvent e) {
 			boolean dirty = true;
 			if (fDocumentProvider != null && fDocumentKey != null) {
@@ -1169,7 +1168,6 @@
 	}
 	
 	class HeaderPainter implements PaintListener {
-		
 		private static final int INSET= BIRDS_EYE_VIEW_INSET;
 
 		private RGB fIndicatorColor;
@@ -1202,8 +1200,8 @@
 			gc.drawLine(x, y + h, x + w, y + h);
 		}
 		
+		@Override
 		public void paintControl(PaintEvent e) {
-			
 			Point s= fSummaryHeader.getSize();
 			
 			if (fIndicatorColor != null) {
@@ -1227,7 +1225,6 @@
 	 * the child document ranges to changes of the parent document.
 	 */
 	class ChildPositionUpdater extends DefaultPositionUpdater {
-		
 		/*
 		 * Creates the position updated.
 		 */
@@ -1239,6 +1236,7 @@
 		 * Child document ranges cannot be deleted other then by calling
 		 * freeChildDocument.
 		 */
+		@Override
 		protected boolean notDeleted() {
 			return true;
 		}
@@ -1249,8 +1247,8 @@
 		 * right behind the end of the position, the position is extended rather
 		 * than kept stable.
 		 */
+		@Override
 		protected void adaptToInsert() {
-			
 			if (fPosition == fLeft.getRegion() || fPosition == fRight.getRegion()) {
 				int myStart= fPosition.offset;
 				int myEnd=   fPosition.offset + fPosition.length;
@@ -1274,16 +1272,13 @@
 	}
 	
 	private class ChangeHighlighter implements ITextPresentationListener {
-
 		private final MergeSourceViewer viewer;
 
 		public ChangeHighlighter(MergeSourceViewer viewer) {
 			this.viewer = viewer;
 		}
 
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.ITextPresentationListener#applyTextPresentation(org.eclipse.jface.text.TextPresentation)
-		 */
+		@Override
 		public void applyTextPresentation(TextPresentation textPresentation) {
 			if (!fHighlightTokenChanges)
 				return;
@@ -1336,41 +1331,47 @@
 					return INCOMING_TEXT_FILL;
 				case RangeDifference.CONFLICT:
 					return CONFLICT_TEXT_FILL;
+				default:
+					return null;
 				}
-				return null;
 			}
 			return OUTGOING_TEXT_FILL;
 		}
-		
 	}
 	
 	private class FindReplaceTarget implements IFindReplaceTarget, IFindReplaceTargetExtension, IFindReplaceTargetExtension2, IFindReplaceTargetExtension3 {
-
+		@Override
 		public boolean canPerformFind() {
 			return fFocusPart != null;
 		}
 
+		@Override
 		public int findAndSelect(int widgetOffset, String findString,
 				boolean searchForward, boolean caseSensitive, boolean wholeWord) {
 			return fFocusPart.getSourceViewer().getFindReplaceTarget().findAndSelect(widgetOffset, findString, searchForward, caseSensitive, wholeWord);
 		}
 
+		@Override
 		public Point getSelection() {
 			return fFocusPart.getSourceViewer().getFindReplaceTarget().getSelection();
 		}
 
+		@Override
 		public String getSelectionText() {
 			return fFocusPart.getSourceViewer().getFindReplaceTarget().getSelectionText();
 		}
 
+		@Override
 		public boolean isEditable() {
 			return fFocusPart.getSourceViewer().getFindReplaceTarget().isEditable();
 		}
 
+		@Override
 		public void replaceSelection(String text) {
 			fFocusPart.getSourceViewer().getFindReplaceTarget().replaceSelection(text);
 		}
 
+		@Override
 		public int findAndSelect(int offset, String findString, boolean searchForward, boolean caseSensitive, boolean wholeWord, boolean regExSearch) {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension3) {
@@ -1383,6 +1384,7 @@
 			return -1;
 		}
 
+		@Override
 		public void replaceSelection(String text, boolean regExReplace) {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension3) {
@@ -1395,6 +1397,7 @@
 				findReplaceTarget.replaceSelection(text);
 		}
 
+		@Override
 		public boolean validateTargetState() {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension2) {
@@ -1403,6 +1406,7 @@
 			return true;
 		}
 
+		@Override
 		public void beginSession() {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1410,6 +1414,7 @@
 			}
 		}
 
+		@Override
 		public void endSession() {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1417,6 +1422,7 @@
 			}
 		}
 
+		@Override
 		public IRegion getScope() {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1425,6 +1431,7 @@
 			return null;
 		}
 
+		@Override
 		public void setScope(IRegion scope) {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1432,6 +1439,7 @@
 			}
 		}
 
+		@Override
 		public Point getLineSelection() {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1440,6 +1448,7 @@
 			return null;
 		}
 
+		@Override
 		public void setSelection(int offset, int length) {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1447,6 +1456,7 @@
 			}
 		}
 
+		@Override
 		public void setScopeHighlightColor(Color color) {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1454,6 +1464,7 @@
 			}
 		}
 
+		@Override
 		public void setReplaceAllMode(boolean replaceAll) {
 			IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget();
 			if (findReplaceTarget instanceof IFindReplaceTargetExtension) {
@@ -1486,6 +1497,7 @@
 		super(style, ResourceBundle.getBundle(BUNDLE_NAME), configuration);
 
 		operationHistoryListener = new IOperationHistoryListener() {
+			@Override
 			public void historyNotification(OperationHistoryEvent event) {
 				TextMergeViewer.this.historyNotification(event);
 			}
@@ -1494,12 +1506,15 @@
 				.addOperationHistoryListener(operationHistoryListener);
 
 		fMerger = new DocumentMerger(new IDocumentMergerInput() {
+			@Override
 			public ITokenComparator createTokenComparator(String line) {
 				return TextMergeViewer.this.createTokenComparator(line);
 			}
+			@Override
 			public CompareConfiguration getCompareConfiguration() {
 				return TextMergeViewer.this.getCompareConfiguration();
 			}
+			@Override
 			public IDocument getDocument(char contributor) {
 				switch (contributor) {
 				case LEFT_CONTRIBUTOR:
@@ -1508,12 +1523,15 @@
 					return fRight.getSourceViewer().getDocument();
 				case ANCESTOR_CONTRIBUTOR:
 					return fAncestor.getSourceViewer().getDocument();
+				default:
+					return null;
 				}
-				return null;
 			}
+			@Override
 			public int getHunkStart() {
 				return TextMergeViewer.this.getHunkStart();
 			}
+			@Override
 			public Position getRegion(char contributor) {
 				switch (contributor) {
 				case LEFT_CONTRIBUTOR:
@@ -1522,30 +1540,36 @@
 					return fRight.getRegion();
 				case ANCESTOR_CONTRIBUTOR:
 					return fAncestor.getRegion();
+				default:
+					return null;
 				}
-				return null;
 			}
+			@Override
 			public boolean isHunkOnLeft() {
 				ITypedElement left = ((ICompareInput)getInput()).getRight();
 				return left != null && Utilities.getAdapter(left, IHunk.class) != null;
 			}
+			@Override
 			public boolean isIgnoreAncestor() {
 				return TextMergeViewer.this.isIgnoreAncestor();
 			}
+			@Override
 			public boolean isPatchHunk() {
 				return TextMergeViewer.this.isPatchHunk();
 			}
 
+			@Override
 			public boolean isShowPseudoConflicts() {
 				return fShowPseudoConflicts;
 			}
+			@Override
 			public boolean isThreeWay() {
 				return TextMergeViewer.this.isThreeWay();
 			}
+			@Override
 			public boolean isPatchHunkOk() {
 				return TextMergeViewer.this.isPatchHunkOk();
 			}
-			
 		});
 		
 		int inheritedStyle= parent.getStyle();
@@ -1573,6 +1597,7 @@
 			fMarginWidth= 0;
 		
 		fPreferenceChangeListener= new IPropertyChangeListener() {
+			@Override
 			public void propertyChange(PropertyChangeEvent event) {
 				TextMergeViewer.this.handlePropertyChangeEvent(event);
 			}
@@ -1596,6 +1621,7 @@
 		setColors();
 
 		INavigatable nav= new INavigatable() {
+			@Override
 			public boolean selectChange(int flag) {
 				if (flag == INavigatable.FIRST_CHANGE || flag == INavigatable.LAST_CHANGE) {
 					selectFirstDiff(flag == INavigatable.FIRST_CHANGE);
@@ -1603,12 +1629,15 @@
 				}
 				return navigate(flag == INavigatable.NEXT_CHANGE, false, false);
 			}
+			@Override
 			public Object getInput() {
 				return TextMergeViewer.this.getInput();
 			}
+			@Override
 			public boolean openSelectedChange() {
 				return false;
 			}
+			@Override
 			public boolean hasChange(int flag) {
 				return getNextVisibleDiff(flag == INavigatable.NEXT_CHANGE, false) != null;
 			}
@@ -1627,16 +1656,17 @@
 			super(label, viewers, preferenceKey);
 		}
 
+		@Override
 		protected boolean toggleState(boolean checked) {
 			return true;
 		}
 	}
 
 	private ChainedPreferenceStore createChainedPreferenceStore() {
-    	ArrayList stores= new ArrayList(2);
+    	ArrayList<IPreferenceStore> stores= new ArrayList<IPreferenceStore>(2);
 		stores.add(getCompareConfiguration().getPreferenceStore());
 		stores.add(EditorsUI.getPreferenceStore());
-		return new ChainedPreferenceStore((IPreferenceStore[]) stores.toArray(new IPreferenceStore[stores.size()]));
+		return new ChainedPreferenceStore(stores.toArray(new IPreferenceStore[stores.size()]));
     }
 	
 	/**
@@ -1667,7 +1697,7 @@
 	}
 
 	private String getSymbolicFontName() {
-		Class clazz= getClass();
+		Class<?> clazz= getClass();
 		do {
 			String fontName= clazz.getName();
 			if (JFaceResources.getFontRegistry().hasValueFor(fontName))
@@ -1916,9 +1946,9 @@
 	 * Clients may extend if they have to do additional cleanup.
 	 * @param event
 	 */
+	@Override
 	protected void handleDispose(DisposeEvent event) {
-		OperationHistoryFactory.getOperationHistory()
-				.removeOperationHistoryListener(operationHistoryListener);
+		OperationHistoryFactory.getOperationHistory().removeOperationHistoryListener(operationHistoryListener);
 
 		if (fHandlerService != null)
 			fHandlerService.dispose();
@@ -1973,8 +2003,8 @@
 		disposeCompareFilterActions(false);
 
 		if (fSourceViewerDecorationSupport != null) {
-			for (Iterator iterator = fSourceViewerDecorationSupport.iterator(); iterator.hasNext();) {
-				((SourceViewerDecorationSupport) iterator.next()).dispose();
+			for (Iterator<SourceViewerDecorationSupport> iterator = fSourceViewerDecorationSupport.iterator(); iterator.hasNext();) {
+				iterator.next().dispose();
 			}
 			fSourceViewerDecorationSupport = null;
 		}
@@ -1991,9 +2021,9 @@
 		fRight = null;
 
 		if (fColors != null) {
-			Iterator i= fColors.values().iterator();
+			Iterator<Color> i= fColors.values().iterator();
 			while (i.hasNext()) {
-				Color color= (Color) i.next();
+				Color color= i.next();
 				if (!color.isDisposed())
 					color.dispose();
 			}
@@ -2016,19 +2046,21 @@
 	 * Creates the specific SWT controls for the content areas.
 	 * Clients must not call or override this method.
 	 */
+	@Override
 	protected void createControls(Composite composite) {
-		
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ICompareContextIds.TEXT_MERGE_VIEW);
 		
 		// 1st row
 		if (fMarginWidth > 0) {
 			fAncestorCanvas= new BufferedCanvas(composite, SWT.NONE) {
+				@Override
 				public void doPaint(GC gc) {
 					paintSides(gc, fAncestor, fAncestorCanvas, false);
 				}
 			};
 			fAncestorCanvas.addMouseListener(
 				new MouseAdapter() {
+					@Override
 					public void mouseDown(MouseEvent e) {
 						setCurrentDiff2(handleMouseInSides(fAncestorCanvas, fAncestor, e.y), false);
 					}
@@ -2039,6 +2071,7 @@
 		fAncestor= createPart(composite);
 		setEditable(fAncestor.getSourceViewer(), false);
 		fAncestor.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			@Override
 			public void getName(AccessibleEvent e) {
 				e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_ancestor, getCompareConfiguration().getAncestorLabel(getInput()));
 			}
@@ -2053,12 +2086,14 @@
 		// 2nd row
 		if (fMarginWidth > 0) {
 			fLeftCanvas= new BufferedCanvas(composite, SWT.NONE) {
+				@Override
 				public void doPaint(GC gc) {
 					paintSides(gc, fLeft, fLeftCanvas, false);
 				}
 			};
 			fLeftCanvas.addMouseListener(
 				new MouseAdapter() {
+					@Override
 					public void mouseDown(MouseEvent e) {
 						setCurrentDiff2(handleMouseInSides(fLeftCanvas, fLeft, e.y), false);
 					}
@@ -2069,6 +2104,7 @@
 		fLeft= createPart(composite);
 		fLeft.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling);
 		fLeft.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			@Override
 			public void getName(AccessibleEvent e) {
 				e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_left, getCompareConfiguration().getLeftLabel(getInput()));
 			}
@@ -2078,6 +2114,7 @@
 		fRight= createPart(composite);
 		fRight.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling);
 		fRight.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			@Override
 			public void getName(AccessibleEvent e) {
 				e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_right, getCompareConfiguration().getRightLabel(getInput()));
 			}
@@ -2101,12 +2138,14 @@
 
 		if (fMarginWidth > 0) {
 			fRightCanvas= new BufferedCanvas(composite, SWT.NONE) {
+				@Override
 				public void doPaint(GC gc) {
 					paintSides(gc, fRight, fRightCanvas, fSynchronizedScrolling);
 				}
 			};
 			fRightCanvas.addMouseListener(
 				new MouseAdapter() {
+					@Override
 					public void mouseDown(MouseEvent e) {
 						setCurrentDiff2(handleMouseInSides(fRightCanvas, fRight, e.y), false);
 					}
@@ -2123,6 +2162,7 @@
 		fVScrollBar.setVisible(true);
 		fVScrollBar.addListener(SWT.Selection,
 			new Listener() {
+				@Override
 				public void handleEvent(Event e) {
 					int vpos= ((ScrollBar)e.widget).getSelection();
 					synchronizedScrollVertical(vpos);
@@ -2131,12 +2171,14 @@
 		);
 		
 		fBirdsEyeCanvas= new BufferedCanvas(composite, SWT.NONE) {
+			@Override
 			public void doPaint(GC gc) {
 				paintBirdsEyeView(this, gc);
 			}
 		};
 		fBirdsEyeCanvas.addMouseListener(
 			new MouseAdapter() {
+				@Override
 				public void mouseDown(MouseEvent e) {
 					setCurrentDiff2(handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y), true);
 				}
@@ -2144,9 +2186,9 @@
 		);
 		fBirdsEyeCanvas.addMouseMoveListener(
 			new MouseMoveListener() {
-				
 				private Cursor fLastCursor;
 				
+				@Override
 				public void mouseMove(MouseEvent e) {
 					Cursor cursor= null;
 					Diff diff= handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y);
@@ -2175,6 +2217,7 @@
 		final StyledText st3= tv3.getTextWidget();
 		final ScrollBar sb1= st1.getHorizontalBar();
 		sb1.addSelectionListener(new SelectionAdapter() {
+			@Override
 			public void widgetSelected(SelectionEvent e) {
 			    if (fSynchronizedScrolling) {
 					int v= sb1.getSelection();
@@ -2207,7 +2250,7 @@
 
 			Point region= new Point(0, 0);
 			char leg = getLeg(tp);
-			for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+			for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 				Diff diff = (Diff) iterator.next();
 				if (diff.isDeleted())
 					continue;
@@ -2251,7 +2294,7 @@
 
 			Point region= new Point(0, 0);
 
-			for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+			for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 				Diff diff = (Diff) iterator.next();
 				if (diff.isDeleted())
 					continue;
@@ -2307,7 +2350,7 @@
 				
 		Display display= canvas.getDisplay();
 		int y= 0;
-		for (Iterator iterator = fMerger.rangesIterator(); iterator.hasNext();) {
+		for (Iterator<?> iterator = fMerger.rangesIterator(); iterator.hasNext();) {
 			Diff diff = (Diff) iterator.next();
 			int h= fSynchronizedScrolling ? diff.getMaxDiffHeight()
 										  : diff.getRightHeight();
@@ -2359,9 +2402,11 @@
 	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleSetFocus()
 	 * @since 3.3
 	 */
+	@Override
 	protected boolean handleSetFocus() {
 		if (fRedoDiff) {
 			new UIJob(CompareMessages.DocumentMerger_0) {
+				@Override
 				public IStatus runInUIThread(IProgressMonitor monitor) {
 					update(true);
 					updateStructure();
@@ -2394,6 +2439,7 @@
 			super(c, dir);
 			fCanvas= c;
 		}
+		@Override
 		public void mouseMove(MouseEvent e) {
 			if (!fIsDown && fUseSingleLine && isAnySideEditable() && handleMouseMoveOverCenter(fCanvas, e.x, e.y))
 				return;
@@ -2401,18 +2447,16 @@
 		}
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#createCenterControl(org.eclipse.swt.widgets.Composite)
-	 */
+	@Override
 	protected final Control createCenterControl(Composite parent) {
 		if (fSynchronizedScrolling) {
 			final Canvas canvas= new BufferedCanvas(parent, SWT.NONE) {
+				@Override
 				public void doPaint(GC gc) {
 					paintCenter(this, gc);
 				}
 			};
 			if (fUseResolveUI) {
-				
 				new HoverResizer(canvas, HORIZONTAL);
 
 				if (fNormalCursor == null) fNormalCursor= new Cursor(canvas.getDisplay(), SWT.CURSOR_ARROW);
@@ -2427,6 +2471,7 @@
 				fLeftToRightButton.setVisible(false);
 				fLeftToRightButton.addSelectionListener(
 					new SelectionAdapter() {
+						@Override
 						public void widgetSelected(SelectionEvent e) {
 							handleCenterButtonSelection(true);
 						}
@@ -2442,6 +2487,7 @@
 				fRightToLeftButton.setVisible(false);
 				fRightToLeftButton.addSelectionListener(
 						new SelectionAdapter() {
+							@Override
 							public void widgetSelected(SelectionEvent e) {
 								handleCenterButtonSelection(false);
 							}
@@ -2514,9 +2560,7 @@
 		return fButtonDiff != null;
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#getCenterWidth()
-	 */
+	@Override
 	protected final int getCenterWidth() {
 		if (fSynchronizedScrolling)
 			return CENTER_WIDTH;
@@ -2530,8 +2574,9 @@
 			if (fInheritedDirection == fTextDirection)
 				return SWT.NONE;
 			return fTextDirection;
+		default:
+			return fInheritedDirection;
 		}
-		return fInheritedDirection;
 	}
 
 	/**
@@ -2606,6 +2651,7 @@
 		
 		te.addPaintListener(
 			new PaintListener() {
+				@Override
 				public void paintControl(PaintEvent e) {
 					paint(e, viewer);
 				}
@@ -2613,6 +2659,7 @@
 		);
 		te.addKeyListener(
 			new KeyAdapter() {
+				@Override
 				public void keyPressed(KeyEvent e) {
 					handleSelectionChanged(viewer);
 				}
@@ -2620,6 +2667,7 @@
 		);
 		te.addMouseListener(
 			new MouseAdapter() {
+				@Override
 				public void mouseDown(MouseEvent e) {
 					//syncViewport(part);
 					handleSelectionChanged(viewer);
@@ -2629,9 +2677,11 @@
 					
 		te.addFocusListener(
 			new FocusAdapter() {
+				@Override
 				public void focusGained(FocusEvent fe) {
 					setActiveViewer(viewer, true);
 				}
+				@Override
 				public void focusLost(FocusEvent fe) {
 					setActiveViewer(viewer, false);
 				}
@@ -2640,6 +2690,7 @@
 		
 		viewer.getSourceViewer().addViewportListener(
 			new IViewportListener() {
+				@Override
 				public void viewportChanged(int verticalPosition) {
 					syncViewport(viewer);
 				}
@@ -2707,9 +2758,9 @@
 	private void contributeDiffBackgroundListener(final MergeSourceViewer viewer) {
 		viewer.getSourceViewer().getTextWidget().addLineBackgroundListener(
 				new LineBackgroundListener() {
+					@Override
 					public void lineGetBackground(LineBackgroundEvent event) {
-						StyledText textWidget = viewer.getSourceViewer()
-								.getTextWidget();
+						StyledText textWidget = viewer.getSourceViewer().getTextWidget();
 						if (textWidget != null) {
 
 							int caret = textWidget.getCaretOffset();
@@ -2740,6 +2791,7 @@
 			if (part != null)
 				part.updateActions();
 			fHandlerService.updatePaneActionHandlers(new Runnable() {
+				@Override
 				public void run() {
 					for (int i= 0; i < GLOBAL_ACTIONS.length; i++) {
 						IAction action= null;
@@ -2756,6 +2808,7 @@
 	private void connectContributedActions(final MergeSourceViewer viewer, final boolean connect) {
 		if (fHandlerService != null) {
 			fHandlerService.updatePaneActionHandlers(new Runnable() {
+				@Override
 				public void run() {
 					if (viewer != null) {
 						setActionsActivated(viewer.getSourceViewer(), connect);
@@ -2810,6 +2863,8 @@
 		case RIGHT_CONTRIBUTOR:
 			document = getDocument(te, fRightContributor);
 			break;
+		default:
+			break;
 		}
 		if (document != null)
 			return document;
@@ -2860,6 +2915,7 @@
 	 * @return <code>true</code> if saving was successful, or if the user didn't want to save (by pressing 'NO' in the confirmation dialog).
 	 * @since 2.0
 	 */
+	@Override
 	protected boolean doSave(Object newInput, Object oldInput) {
 		// TODO: Would be good if this could be restated in terms of Saveables and moved up
 		if (oldInput != null && newInput != null) {
@@ -2903,8 +2959,8 @@
 	 * Initializes the text viewers of the three content areas with the given input objects.
 	 * Subclasses may extend.
 	 */
+	@Override
 	protected void updateContent(Object ancestor, Object left, Object right) {
-		
 		boolean emptyInput= (ancestor == null && left == null && right == null);
 
 		Object input= getInput();
@@ -3107,7 +3163,6 @@
 	 * Implements IDocumentListener.
 	 */
 	private void documentChanged(DocumentEvent e, boolean dirty) {
-		
 		final IDocument doc= e.getDocument();
 		
 		if (doc == fLeft.getSourceViewer().getDocument()) {
@@ -3119,6 +3174,7 @@
 			fRedoDiff = false;
 			final Diff oldDiff = getLastDiff();
 			new UIJob(CompareMessages.DocumentMerger_0) {
+				@Override
 				public IStatus runInUIThread(IProgressMonitor monitor) {
 					if (!getControl().isDisposed()) {
 						doDiff();
@@ -3219,6 +3275,8 @@
 				otherType= ANCESTOR_CONTRIBUTOR;
 			}
 			break;
+		default:
+			break;
 		}
 		
 		if (other instanceof IDocumentRange) {
@@ -3244,6 +3302,8 @@
 			case RIGHT_CONTRIBUTOR:
 				mcp.setRightError(message);
 				break;
+			default:
+				break;
 			}
 		}
 		fHasErrors= true;
@@ -3278,13 +3338,14 @@
 	private Position getNewRange(char type, Object input) {
 		switch (type) {
 		case ANCESTOR_CONTRIBUTOR:
-			return (Position) fNewAncestorRanges.get(input);
+			return fNewAncestorRanges.get(input);
 		case LEFT_CONTRIBUTOR:
-			return (Position) fNewLeftRanges.get(input);
+			return fNewLeftRanges.get(input);
 		case RIGHT_CONTRIBUTOR:
-			return (Position) fNewRightRanges.get(input);
+			return fNewRightRanges.get(input);
+		default:
+			return null;
 		}
-		return null;
 	}
 	
 	private void addNewRange(char type, Object input, Position range) {
@@ -3298,6 +3359,8 @@
 		case RIGHT_CONTRIBUTOR:
 			fNewRightRanges.put(input, range);
 			break;
+		default:
+			break;
 		}
 	}
 	
@@ -3307,6 +3370,7 @@
 	 * @param left if <code>true</code> the contents of the left side is returned; otherwise the right side
 	 * @return the contents of the left or right document or null
 	 */
+	@Override
 	protected byte[] getContents(boolean left) {
 		MergeSourceViewer v= left ? fLeft : fRight;
 		if (v != null) {
@@ -3350,9 +3414,7 @@
 		return new Region(start, length);
 	}
 		
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleResizeAncestor(int, int, int, int)
-	 */
+	@Override
 	protected final void handleResizeAncestor(int x, int y, int width, int height) {
 		if (width > 0) {
 			Rectangle trim= fLeft.getSourceViewer().getTextWidget().computeTrim(0, 0, 0, 0);
@@ -3383,11 +3445,8 @@
 		}
 	}
 
-  	/* (non-Javadoc)
-  	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleResizeLeftRight(int, int, int, int, int, int)
-  	 */
+	@Override
   	protected final void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2,  int height) {
-  				
   		if (fBirdsEyeCanvas != null)
   			width2-= BIRDS_EYE_VIEW_WIDTH;
   			
@@ -3606,8 +3665,7 @@
 			int unresolvedConflicting= 0;
 
 			if (fMerger.hasChanges()) {
-				for (Iterator iterator = fMerger.changesIterator(); iterator
-						.hasNext();) {
+				for (Iterator<?> iterator = fMerger.changesIterator(); iterator	.hasNext();) {
 					Diff d = (Diff) iterator.next();
 					if (d.isIncomingOrConflicting() /* && useChange(d.fDirection) && !d.fIsWhitespace */) {
 						incomingOrConflicting++;
@@ -3678,6 +3736,8 @@
 		case RangeDifference.CONFLICT:
 			s= CompareMessages.TextMergeViewer_direction_conflicting;
 			break;
+		default:
+			break;
 		}
 		String format= CompareMessages.TextMergeViewer_diffType_format;
 		return MessageFormat.format(format, s, diff.changeType());
@@ -3687,7 +3747,7 @@
 		// find the diff's number
 		int diffNumber= 0;
 		if (fMerger.hasChanges()) {
-			for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+			for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 				Diff d = (Diff) iterator.next();
 				diffNumber++;
 				if (d == diff)
@@ -3725,7 +3785,6 @@
 				int caret= offset + styledText.getCaretOffset();
 				
 				try {
-					
 					int line=document.getLineOfOffset(caret);
 					
 					int lineOffset= document.getLineOffset(line);
@@ -3740,7 +3799,6 @@
 					String format= CompareMessages.TextMergeViewer_cursorPosition_format;
 					return MessageFormat.format(format,
 						Integer.toString(line + 1), Integer.toString(column + 1) );
-					
 				} catch (BadLocationException x) {
 					// silently ignored
 				}
@@ -3749,8 +3807,8 @@
 		return "";	//$NON-NLS-1$
 	}
 
+	@Override
 	protected void updateHeader() {
-		
 		super.updateHeader();
 				
 		updateControls();
@@ -3760,12 +3818,13 @@
 	 * Creates the two items for copying a difference range from one side to the other
 	 * and adds them to the given toolbar manager.
 	 */
+	@Override
 	protected void createToolItems(ToolBarManager tbm) {
-
 		fHandlerService= CompareHandlerService.createFor(getCompareConfiguration().getContainer(), fLeft.getSourceViewer().getControl().getShell());
 		
 		final String ignoreAncestorActionKey= "action.IgnoreAncestor.";	//$NON-NLS-1$
 		Action ignoreAncestorAction= new Action() {
+			@Override
 			public void run() {
 				// First make sure the ancestor is hidden
 				if (!isIgnoreAncestor())
@@ -3786,6 +3845,7 @@
 		tbm.add(new Separator());
 		
 		Action a= new Action() {
+			@Override
 			public void run() {
 				if (navigate(true, false, false)) {
 					endOfDocumentReached(true);
@@ -3798,6 +3858,7 @@
 		// Don't register this action since it is probably registered by the container
 		
 		a= new Action() {
+			@Override
 			public void run() {
 				if (navigate(false, false, false)) {
 					endOfDocumentReached(false);
@@ -3810,6 +3871,7 @@
 		// Don't register this action since it is probably registered by the container
 		
 		a= new Action() {
+			@Override
 			public void run() {
 				if (navigate(true, false, true)) {
 					endOfDocumentReached(true);
@@ -3822,6 +3884,7 @@
 		fHandlerService.registerAction(a, "org.eclipse.compare.selectNextChange");	//$NON-NLS-1$
 		
 		a= new Action() {
+			@Override
 			public void run() {
 				if (navigate(false, false, true)) {
 					endOfDocumentReached(false);
@@ -3837,6 +3900,7 @@
 		
 		if (cc.isRightEditable()) {
 			a= new Action() {
+				@Override
 				public void run() {
 					copyDiffLeftToRight();
 				}
@@ -3850,6 +3914,7 @@
 		
 		if (cc.isLeftEditable()) {
 			a= new Action() {
+				@Override
 				public void run() {
 					copyDiffRightToLeft();
 				}
@@ -3885,24 +3950,25 @@
 	private void configureCompareFilterActions(Object input, Object ancestor,
 			Object left, Object right) {
 		if (getCompareConfiguration() != null) {
-			CompareFilterDescriptor[] compareFilterDescriptors = CompareUIPlugin
-					.getDefault().findCompareFilters(input);
+			CompareFilterDescriptor[] compareFilterDescriptors =
+					CompareUIPlugin.getDefault().findCompareFilters(input);
 
 			Object current = getCompareConfiguration().getProperty(
 					ChangeCompareFilterPropertyAction.COMPARE_FILTER_ACTIONS);
 			boolean currentFiltersMatch = false;
 			if (current != null
 					&& current instanceof List
-					&& ((List) current).size() == compareFilterDescriptors.length) {
+					&& ((List<?>) current).size() == compareFilterDescriptors.length) {
 				currentFiltersMatch = true;
-				List currentFilterActions = (List) current;
+				@SuppressWarnings("unchecked")
+				List<ChangeCompareFilterPropertyAction> currentFilterActions =
+						(List<ChangeCompareFilterPropertyAction>) current;
 				for (int i = 0; i < compareFilterDescriptors.length; i++) {
 					boolean match = false;
 					for (int j = 0; j < currentFilterActions.size(); j++) {
 						if (compareFilterDescriptors[i]
 								.getFilterId()
-								.equals(((ChangeCompareFilterPropertyAction) currentFilterActions
-										.get(j)).getFilterId())) {
+								.equals(currentFilterActions.get(j).getFilterId())) {
 							match = true;
 							break;
 						}
@@ -3970,18 +4036,18 @@
 								null);
 			} else {
 				for (int i = 0; i < fCompareFilterActions.size(); i++) {
-					((ChangeCompareFilterPropertyAction) fCompareFilterActions
-							.get(i)).setInput(input, ancestor, left, right);
+					fCompareFilterActions
+							.get(i).setInput(input, ancestor, left, right);
 				}
 			}
 		}
 	}
 
 	private void disposeCompareFilterActions(boolean updateActionBars) {
-		Iterator compareFilterActionsIterator = fCompareFilterActions
+		Iterator<ChangeCompareFilterPropertyAction> compareFilterActionsIterator = fCompareFilterActions
 				.iterator();
 		while (compareFilterActionsIterator.hasNext()) {
-			ChangeCompareFilterPropertyAction compareFilterAction = (ChangeCompareFilterPropertyAction) compareFilterActionsIterator
+			ChangeCompareFilterPropertyAction compareFilterAction = compareFilterActionsIterator
 					.next();
 			fLeft.removeTextAction(compareFilterAction);
 			fRight.removeTextAction(compareFilterAction);
@@ -4016,9 +4082,7 @@
 				ChangeCompareFilterPropertyAction.COMPARE_FILTER_ACTIONS, null);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handlePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
+	@Override
 	protected void handlePropertyChangeEvent(PropertyChangeEvent event) {
 		String key= event.getProperty();
 		
@@ -4147,6 +4211,7 @@
 		}
 	}
 					
+	@Override
 	protected void updateToolItems() {
 		//only update toolbar items if diffs need to be calculated (which
 		//dictates whether a toolbar gets added at all)
@@ -4172,7 +4237,6 @@
 	//---- painting lines
 	
 	private void updateLines(IDocument d) {
-
 		boolean left= false;
 		boolean right= false;
 		
@@ -4190,7 +4254,6 @@
 		}
 		
 		if (left || right) {
-			
 			if (left) {
 				if (fLeftCanvas != null)
 					fLeftCanvas.redraw();
@@ -4284,7 +4347,7 @@
 					
 			Point region= new Point(0, 0);
 		
-			for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+			for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 				Diff diff = (Diff) iterator.next();
 				if (diff.isDeleted())
 					continue;
@@ -4429,7 +4492,7 @@
 				
 			Point region= new Point(0, 0);
 			char leg = getLeg(tp);
-			for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+			for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 				Diff diff = (Diff) iterator.next();
 				if (diff.isDeleted())
 					continue;
@@ -4485,7 +4548,7 @@
 		Point range= new Point(0, 0);
 		
 		char leg = getLeg(tp);
-		for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+		for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 			Diff diff = (Diff) iterator.next();
 			if (diff.isDeleted())
 				continue;
@@ -4525,8 +4588,9 @@
 				return selected ? selected_fill : INCOMING_FILL;
 			case RangeDifference.CONFLICT:
 				return selected ? selected_fill : CONFLICT_FILL;
+			default:
+				return null;
 			}
-			return null;
 		}
 		return selected ? selected_fill : OUTGOING_FILL;
 	}
@@ -4548,8 +4612,9 @@
 				return selected ? SELECTED_INCOMING : INCOMING;
 			case RangeDifference.CONFLICT:
 				return selected ? SELECTED_CONFLICT : CONFLICT;
+			default:
+				return null;
 			}
-			return null;
 		}
 		return selected ? SELECTED_OUTGOING : OUTGOING;
 	}
@@ -4558,8 +4623,8 @@
 		if (rgb == null)
 			return null;
 		if (fColors == null)
-			fColors= new HashMap(20);
-		Color c= (Color) fColors.get(rgb);
+			fColors= new HashMap<RGB, Color>(20);
+		Color c= fColors.get(rgb);
 		if (c == null) {
 			c= new Color(display, rgb);
 			fColors.put(rgb, c);
@@ -4847,8 +4912,7 @@
 				allButThis= fAncestor;
 			} else {
 				int vpos= 0;
-				for (Iterator iterator = fMerger.rangesIterator(); iterator
-						.hasNext();) {
+				for (Iterator<?> iterator = fMerger.rangesIterator(); iterator.hasNext();) {
 					Diff diff = (Diff) iterator.next();
 					if (diff == d)
 						break;
@@ -4920,7 +4984,7 @@
 			IRewriteTarget target= leftToRight ? fRight.getSourceViewer().getRewriteTarget() : fLeft.getSourceViewer().getRewriteTarget();
 			boolean compoundChangeStarted= false;
 			try {
-				for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) {
+				for (Iterator<?> iterator = fMerger.changesIterator(); iterator.hasNext();) {
 					Diff diff = (Diff) iterator.next();
 					switch (diff.getKind()) {
 					case RangeDifference.LEFT:
@@ -4956,6 +5020,7 @@
 	/*
 	 * Copy whole document from one side to the other.
 	 */
+	@Override
 	protected void copy(boolean leftToRight) {
 		if (!validateChange(!leftToRight))
 			return;
@@ -5202,6 +5267,7 @@
 		return fMerger.virtualToRealPosition(contributor, v);
 	}
 	
+	@Override
 	void flushLeftSide(Object oldInput, IProgressMonitor monitor){
 		IMergeViewerContentProvider content= getMergeContentProvider();
 		Object leftContent = content.getLeftContent(oldInput);
@@ -5218,6 +5284,7 @@
 		}
 	}
 	
+	@Override
 	void flushRightSide(Object oldInput, IProgressMonitor monitor){
 		IMergeViewerContentProvider content= getMergeContentProvider();
 		Object rightContent = content.getRightContent(oldInput);
@@ -5234,9 +5301,7 @@
 		}
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#flushContent(java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
-	 */
+	@Override
 	protected void flushContent(Object oldInput, IProgressMonitor monitor) {
 		flushLeftSide(oldInput, monitor);
 		flushRightSide(oldInput, monitor);
@@ -5267,12 +5332,12 @@
 		CompareUIPlugin.log(throwable);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
+	@Override
+	@SuppressWarnings("unchecked")
+	public <T> T getAdapter(Class<T> adapter) {
 		if (adapter == IMergeViewerTestAdapter.class) {
-			return new IMergeViewerTestAdapter() {
+			return (T) new IMergeViewerTestAdapter() {
+				@Override
 				public IDocument getDocument(char leg) {
 					switch (leg) {
 					case LEFT_CONTRIBUTOR:
@@ -5281,10 +5346,12 @@
 						return fRight.getSourceViewer().getDocument();
 					case ANCESTOR_CONTRIBUTOR:
 						return fAncestor.getSourceViewer().getDocument();
+					default:
+						return null;
 					}
-					return null;
 				}
 
+				@Override
 				public int getChangesCount() {
 					return fMerger.changesCount();
 				}
@@ -5293,35 +5360,33 @@
 		if (adapter == OutlineViewerCreator.class) {
 			if (fOutlineViewerCreator == null)
 				fOutlineViewerCreator = new InternalOutlineViewerCreator();
-			return fOutlineViewerCreator;
+			return (T) fOutlineViewerCreator;
 
 		}
 		if (adapter == IFindReplaceTarget.class)
-			return getFindReplaceTarget();
+			return (T) getFindReplaceTarget();
 		if (adapter == CompareHandlerService.class)
-			return fHandlerService;
+			return (T) fHandlerService;
 		if (adapter == CompareHandlerService[].class) {
-			return new CompareHandlerService[] { fHandlerService,
+			return (T) new CompareHandlerService[] { fHandlerService,
 					super.getCompareHandlerService() };
 		}
 		if (adapter == IEditorInput.class) {
 			// return active editor input
 			if (fLeft != null && fLeft == fFocusPart)
 				if (fLeftContributor != null)
-					return fLeftContributor.getDocumentKey();
+					return (T) fLeftContributor.getDocumentKey();
 			if (fRight != null && fRight == fFocusPart)
 				if (fRightContributor != null)
-					return fRightContributor.getDocumentKey();
+					return (T) fRightContributor.getDocumentKey();
 			if (fAncestor != null && fAncestor == fFocusPart)
 				if (fAncestorContributor != null)
-					return fAncestorContributor.getDocumentKey();
+					return (T) fAncestorContributor.getDocumentKey();
 		}
 		return null;
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleCompareInputChange()
-	 */
+	@Override
 	protected void handleCompareInputChange() {
 		try {
 			beginRefresh();
@@ -5465,60 +5530,70 @@
 	 */
 	private ITextEditor getTextEditorAdapter() {
 		return new ITextEditor() {
+			@Override
 			public void close(boolean save) {
-				// Implementing interface method
 			}
+			@Override
 			public void doRevertToSaved() {
-				// Implementing interface method
 			}
+			@Override
 			public IAction getAction(String actionId) {
-				// Implementing interface method
 				return null;
 			}
+			@Override
 			public IDocumentProvider getDocumentProvider() {
-				// Implementing interface method
 				return null;
 			}
+			@Override
 			public IRegion getHighlightRange() {
-				// Implementing interface method
 				return null;
 			}
+			@Override
 			public ISelectionProvider getSelectionProvider() {
-				// Implementing interface method
 				return null;
 			}
+
+			@Override
 			public boolean isEditable() {
-				// Implementing interface method
 				return false;
 			}
+
+			@Override
 			public void removeActionActivationCode(String actionId) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void resetHighlightRange() {
-				// Implementing interface method
 			}
+
+			@Override
 			public void selectAndReveal(int offset, int length) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void setAction(String actionId, IAction action) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void setActionActivationCode(String actionId,
 					char activationCharacter, int activationKeyCode,
 					int activationStateMask) {
-				// Implementing interface method
 			}
-			public void setHighlightRange(int offset, int length,
-					boolean moveCursor) {
-				// Implementing interface method
+
+			@Override
+			public void setHighlightRange(int offset, int length, boolean moveCursor) {
 			}
+
+			@Override
 			public void showHighlightRangeOnly(boolean showHighlightRangeOnly) {
-				// Implementing interface method
 			}
+
+			@Override
 			public boolean showsHighlightRangeOnly() {
-				// Implementing interface method
 				return false;
 			}
+
+			@Override
 			public IEditorInput getEditorInput() {
 				if (fFocusPart == fAncestor && fAncestorContributor != null) {
 					return fAncestorContributor.getDocumentKey();
@@ -5530,129 +5605,149 @@
 					return null;
 				}
 			}
+
+			@Override
 			public IEditorSite getEditorSite() {
-				// Implementing interface method
 				return null;
 			}
+
+			@Override
 			public void init(IEditorSite site, IEditorInput input)
 					throws PartInitException {
-				// Implementing interface method
 			}
+
+			@Override
 			public void addPropertyListener(IPropertyListener listener) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void createPartControl(Composite parent) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void dispose() {
-				// Implementing interface method
 			}
+
+			@Override
 			public IWorkbenchPartSite getSite() {
-				// Implementing interface method
 				return new IWorkbenchPartSite() {
+					@Override
 					public String getId() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public IKeyBindingService getKeyBindingService() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public IWorkbenchPart getPart() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public String getPluginId() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public String getRegisteredName() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public void registerContextMenu(MenuManager menuManager,
 							ISelectionProvider selectionProvider) {
-						// Implementing interface method
 					}
+					@Override
 					public void registerContextMenu(String menuId,
 							MenuManager menuManager,
 							ISelectionProvider selectionProvider) {
-						// Implementing interface method
 					}
+					@Override
 					public IWorkbenchPage getPage() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public ISelectionProvider getSelectionProvider() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public Shell getShell() {
 						return fComposite.getShell();
 					}
+					@Override
 					public IWorkbenchWindow getWorkbenchWindow() {
-						// Implementing interface method
 						return null;
 					}
+					@Override
 					public void setSelectionProvider(ISelectionProvider provider) {
-						// Implementing interface method
 					}
-					public Object getAdapter(Class adapter) {
-						// Implementing interface method
+					@Override
+					public <T> T getAdapter(Class<T> adapter) {
 						return null;
 					}
-					public Object getService(Class api) {
-						// Implementing interface method
+					@Override
+					public <T> T getService(Class<T> api) {
 						return null;
 					}
-					public boolean hasService(Class api) {
-						// Implementing interface method
+					@Override
+					public boolean hasService(Class<?> api) {
 						return false;
 					}
 				};
 			}
+
+			@Override
 			public String getTitle() {
-				// Implementing interface method
 				return null;
 			}
+
+			@Override
 			public Image getTitleImage() {
-				// Implementing interface method
 				return null;
 			}
+
+			@Override
 			public String getTitleToolTip() {
-				// Implementing interface method
 				return null;
 			}
+
+			@Override
 			public void removePropertyListener(IPropertyListener listener) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void setFocus() {
-				// Implementing interface method
 			}
-			public Object getAdapter(Class adapter) {
+
+			@Override
+			@SuppressWarnings("unchecked")
+			public <T> T getAdapter(Class<T> adapter) {
 				if (adapter == IEncodingSupport.class) {
 					if (fFocusPart == fAncestor) {
-						return getEncodingSupport(fAncestorContributor);
+						return (T) getEncodingSupport(fAncestorContributor);
 					} else if (fFocusPart == fLeft) {
-						return getEncodingSupport(fLeftContributor);
+						return (T) getEncodingSupport(fLeftContributor);
 					} else if (fFocusPart == fRight) {
-						return getEncodingSupport(fRightContributor);
+						return (T) getEncodingSupport(fRightContributor);
 					}
 				}
 				return null;
 			}
+
 			private IEncodingSupport getEncodingSupport(ContributorInfo contributor) {
 				if (contributor != null && contributor.getDefaultEncoding() != null) {
 					return contributor;
 				}
 				return null;
 			}
+
+			@Override
 			public void doSave(IProgressMonitor monitor) {
-				// Implementing interface method
 			}
+
+			@Override
 			public void doSaveAs() {
-				// Implementing interface method
 			}
+
+			@Override
 			public boolean isDirty() {
 				if (fFocusPart == fLeft) {
 					return isLeftDirty();
@@ -5661,10 +5756,14 @@
 				}
 				return false;
 			}
+
+			@Override
 			public boolean isSaveAsAllowed() {
 				// Implementing interface method
 				return false;
 			}
+
+			@Override
 			public boolean isSaveOnCloseNeeded() {
 				// Implementing interface method
 				return false;
@@ -5688,9 +5787,10 @@
 		case RIGHT_CONTRIBUTOR:
 			key = "RIGHT_STRUCTURE_REFRESH"; //$NON-NLS-1$
 			break;
+		default:
+			break;
 		}
 		Assert.isNotNull(key);
 		getCompareConfiguration().setProperty(key, null);
 	}
-
 }
diff --git a/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/ContentMergeViewerTest.java b/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/ContentMergeViewerTest.java
index c5cf395..d5716ca 100644
--- a/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/ContentMergeViewerTest.java
+++ b/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/ContentMergeViewerTest.java
@@ -10,17 +10,16 @@
  *******************************************************************************/
 package org.eclipse.compare.tests;
 
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
 import org.eclipse.compare.CompareConfiguration;
 import org.eclipse.compare.contentmergeviewer.ContentMergeViewer;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.widgets.Composite;
+import org.junit.Assert;
+
+import junit.framework.TestCase;
 
 public class ContentMergeViewerTest extends TestCase {
-
 	private MyContentMergeViewer myContentMergeViewer;
 	/**
 	 * result[0]-event occurred or not; result[1]-new state that was set
@@ -44,52 +43,64 @@
 		public boolean leftDirty = false;
 		public boolean rightDirty = false;
 
+		@Override
 		protected boolean isLeftDirty() {
 			return leftDirty;
 		}
 
+		@Override
 		protected boolean isRightDirty() {
 			return rightDirty;
 		}
 
+		@Override
 		protected void setLeftDirty(boolean dirty) {
 			super.setLeftDirty(dirty);
 		}
 
+		@Override
 		protected void setRightDirty(boolean dirty) {
 			super.setRightDirty(dirty);
 		}
 
+		@Override
 		protected void copy(boolean leftToRight) {
 			// nothing here
 		}
 
+		@Override
 		protected void createControls(Composite composite) {
 			// nothing here
 		}
 
+		@Override
 		protected byte[] getContents(boolean left) {
 			return null;
 		}
 
+		@Override
 		protected void handleResizeAncestor(int x, int y, int width, int height) {
 			// nothing here
 		}
 
+		@Override
 		protected void handleResizeLeftRight(int x, int y, int leftWidth,
 				int centerWidth, int rightWidth, int height) {
 			// nothing here
 		}
 
+		@Override
 		protected void updateContent(Object ancestor, Object left, Object right) {
 			// nothing here
 		}
 	}
 
+	@Override
 	protected void setUp() throws Exception {
 		result = new boolean[] { false, false };
 		myContentMergeViewer = new MyContentMergeViewer();
 		myContentMergeViewer.addPropertyChangeListener(new IPropertyChangeListener() {
+			@Override
 			public void propertyChange(PropertyChangeEvent event) {
 				result[0] = true;
 				result[1] = ((Boolean) event.getNewValue()).booleanValue();
diff --git a/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java b/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java
index f7c068f..4369193 100644
--- a/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java
+++ b/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java
@@ -246,7 +246,7 @@
 		char leg = left ? MergeViewerContentProvider.LEFT_CONTRIBUTOR : MergeViewerContentProvider.RIGHT_CONTRIBUTOR;
 		IDocument document = Utilities.getDocument(leg, viewer.getInput(), true, true);
 		if (document == null) {
-			return ((IMergeViewerTestAdapter)viewer.getAdapter(IMergeViewerTestAdapter.class)).getDocument(leg);
+			return viewer.getAdapter(IMergeViewerTestAdapter.class).getDocument(leg);
 		}
 		return document;
 	}
