diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/BrowserInformationControl.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/BrowserInformationControl.java
index 8643b69..51d471e 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/BrowserInformationControl.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/BrowserInformationControl.java
@@ -109,7 +109,7 @@
 
 	/**
 	 * Minimal size constraints.
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	private static final int MIN_WIDTH = 80;
@@ -167,7 +167,7 @@
 	 *
 	 * @since 3.4
 	 */
-	private ListenerList/* <IInputChangedListener> */ fInputChangeListeners = new ListenerList(
+	private ListenerList<IInputChangedListener> fInputChangeListeners = new ListenerList<>(
 			ListenerList.IDENTITY);
 
 	/**
@@ -356,9 +356,8 @@
 		fCompleted = false;
 		fBrowser.setText(content);
 
-		Object[] listeners = fInputChangeListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++)
-			((IInputChangedListener) listeners[i]).inputChanged(fInput);
+		for (IInputChangedListener listener : fInputChangeListeners)
+			listener.inputChanged(fInput);
 	}
 
 	/*
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptEditor.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptEditor.java
index 538db04..2074f59 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptEditor.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptEditor.java
@@ -2995,7 +2995,7 @@
 		setTitleImage(image);
 	}
 
-	private ListenerList fReconcilingListeners = new ListenerList(
+	private ListenerList<IScriptReconcilingListener> fReconcilingListeners = new ListenerList<>(
 			ListenerList.IDENTITY);
 
 	/**
@@ -3017,9 +3017,8 @@
 		// getInputJavaElement());
 
 		// Notify listeners
-		Object[] listeners = fReconcilingListeners.getListeners();
-		for (int i = 0, length = listeners.length; i < length; ++i)
-			((IScriptReconcilingListener) listeners[i]).aboutToBeReconciled();
+		for (IScriptReconcilingListener listener : fReconcilingListeners)
+			listener.aboutToBeReconciled();
 	}
 
 	/*
@@ -3043,10 +3042,8 @@
 		// progressMonitor);
 
 		// Notify listeners
-		Object[] listeners = fReconcilingListeners.getListeners();
-		for (int i = 0, length = listeners.length; i < length; ++i)
-			((IScriptReconcilingListener) listeners[i]).reconciled(ast, forced,
-					progressMonitor);
+		for (IScriptReconcilingListener listener : fReconcilingListeners)
+			listener.reconciled(ast, forced, progressMonitor);
 
 		// Update Outline page selection
 		if (!forced && !progressMonitor.isCanceled()) {
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptOutlinePage.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptOutlinePage.java
index e8b76df..4b6265a 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptOutlinePage.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/ScriptOutlinePage.java
@@ -525,9 +525,9 @@
 	protected IPreferenceStore fStore;
 	private MemberFilterActionGroup fMemberFilterActionGroup;
 
-	private ListenerList fSelectionChangedListeners = new ListenerList(
+	private ListenerList<ISelectionChangedListener> fSelectionChangedListeners = new ListenerList<>(
 			ListenerList.IDENTITY);
-	private ListenerList fPostSelectionChangedListeners = new ListenerList(
+	private ListenerList<ISelectionChangedListener> fPostSelectionChangedListeners = new ListenerList<>(
 			ListenerList.IDENTITY);
 	private Hashtable<String, IAction> fActions = new Hashtable<String, IAction>();
 
@@ -602,11 +602,6 @@
 		}
 	}
 
-	/*
-	 * @see org.eclipse.jface.text.IPostSelectionProvider#
-	 * addPostSelectionChangedListener
-	 * (org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
 	@Override
 	public void addPostSelectionChangedListener(
 			ISelectionChangedListener listener) {
@@ -617,10 +612,6 @@
 		}
 	}
 
-	/*
-	 * @see
-	 * ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
-	 */
 	@Override
 	public void addSelectionChangedListener(
 			ISelectionChangedListener listener) {
@@ -682,18 +673,14 @@
 		fOutlineViewer.setLabelProvider(
 				new StyledDecoratingModelLabelProvider(lprovider));
 
-		Object[] listeners = fSelectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			fSelectionChangedListeners.remove(listeners[i]);
-			fOutlineViewer.addSelectionChangedListener(
-					(ISelectionChangedListener) listeners[i]);
+		for (ISelectionChangedListener listener : fSelectionChangedListeners) {
+			fSelectionChangedListeners.remove(listener);
+			fOutlineViewer.addSelectionChangedListener(listener);
 		}
 
-		listeners = fPostSelectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			fPostSelectionChangedListeners.remove(listeners[i]);
-			fOutlineViewer.addPostSelectionChangedListener(
-					(ISelectionChangedListener) listeners[i]);
+		for (ISelectionChangedListener listener : fPostSelectionChangedListeners) {
+			fPostSelectionChangedListeners.remove(listener);
+			fOutlineViewer.addPostSelectionChangedListener(listener);
 		}
 
 		MenuManager manager = new MenuManager(
@@ -1000,11 +987,6 @@
 		// fCategoryFilterActionGroup.contributeToViewMenu(viewMenuManager);
 	}
 
-	/*
-	 * @seeorg.eclipse.jface.text.IPostSelectionProvider#
-	 * removePostSelectionChangedListener
-	 * (org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
 	@Override
 	public void removePostSelectionChangedListener(
 			ISelectionChangedListener listener) {
@@ -1015,10 +997,6 @@
 		}
 	}
 
-	/*
-	 * @see ISelectionProvider#removeSelectionChangedListener(
-	 * ISelectionChangedListener )
-	 */
 	@Override
 	public void removeSelectionChangedListener(
 			ISelectionChangedListener listener) {
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/SourceModuleDocumentProvider.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/SourceModuleDocumentProvider.java
index f47de29..99bdd00 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/SourceModuleDocumentProvider.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/editor/SourceModuleDocumentProvider.java
@@ -987,10 +987,10 @@
 	protected static class GlobalAnnotationModelListener implements
 			IAnnotationModelListener, IAnnotationModelListenerExtension {
 
-		private ListenerList fListenerList;
+		private ListenerList<IAnnotationModelListener> fListenerList;
 
 		public GlobalAnnotationModelListener() {
-			fListenerList = new ListenerList(ListenerList.IDENTITY);
+			fListenerList = new ListenerList<>(ListenerList.IDENTITY);
 		}
 
 		/**
@@ -998,9 +998,8 @@
 		 */
 		@Override
 		public void modelChanged(IAnnotationModel model) {
-			Object[] listeners = fListenerList.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				((IAnnotationModelListener) listeners[i]).modelChanged(model);
+			for (IAnnotationModelListener listener : fListenerList) {
+				listener.modelChanged(model);
 			}
 		}
 
@@ -1009,9 +1008,7 @@
 		 */
 		@Override
 		public void modelChanged(AnnotationModelEvent event) {
-			Object[] listeners = fListenerList.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				Object curr = listeners[i];
+			for (IAnnotationModelListener curr : fListenerList) {
 				if (curr instanceof IAnnotationModelListenerExtension) {
 					((IAnnotationModelListenerExtension) curr)
 							.modelChanged(event);
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/text/PreferencesAdapter.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/text/PreferencesAdapter.java
index 5cdf8bb..314e5a9 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/text/PreferencesAdapter.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/text/PreferencesAdapter.java
@@ -24,23 +24,25 @@
 
 	/**
 	 * Property change listener. Listens for events of type
-	 * {@link org.eclipse.core.runtime.Preferences.PropertyChangeEvent} and fires
-	 * a {@link org.eclipse.jface.util.PropertyChangeEvent} on the
-	 * adapter with arguments from the received event.
+	 * {@link org.eclipse.core.runtime.Preferences.PropertyChangeEvent} and
+	 * fires a {@link org.eclipse.jface.util.PropertyChangeEvent} on the adapter
+	 * with arguments from the received event.
 	 */
-	private class PropertyChangeListener implements Preferences.IPropertyChangeListener {
+	private class PropertyChangeListener
+			implements Preferences.IPropertyChangeListener {
 
 		@Override
 		public void propertyChange(Preferences.PropertyChangeEvent event) {
-			firePropertyChangeEvent(event.getProperty(), event.getOldValue(), event.getNewValue());
+			firePropertyChangeEvent(event.getProperty(), event.getOldValue(),
+					event.getNewValue());
 		}
 	}
 
 	/** Listeners on the adapter */
-	private ListenerList fListeners= new ListenerList();
+	private ListenerList<IPropertyChangeListener> fListeners = new ListenerList<>();
 
 	/** Listener on the adapted Preferences */
-	private PropertyChangeListener fListener= new PropertyChangeListener();
+	private PropertyChangeListener fListener = new PropertyChangeListener();
 
 	/** Adapted Preferences */
 	private Preferences fPreferences;
@@ -54,13 +56,15 @@
 	public PreferencesAdapter() {
 		this(new Preferences());
 	}
+
 	/**
 	 * Initialize with the given Preferences.
 	 *
-	 * @param preferences The preferences to wrap.
+	 * @param preferences
+	 *            The preferences to wrap.
 	 */
 	public PreferencesAdapter(Preferences preferences) {
-		fPreferences= preferences;
+		fPreferences = preferences;
 	}
 
 	@Override
@@ -83,12 +87,13 @@
 	}
 
 	@Override
-	public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+	public void firePropertyChangeEvent(String name, Object oldValue,
+			Object newValue) {
 		if (!fSilent) {
-			PropertyChangeEvent event= new PropertyChangeEvent(this, name, oldValue, newValue);
-			Object[] listeners= fListeners.getListeners();
-			for (int i= 0; i < listeners.length; i++)
-				((IPropertyChangeListener) listeners[i]).propertyChange(event);
+			PropertyChangeEvent event = new PropertyChangeEvent(this, name,
+					oldValue, newValue);
+			for (IPropertyChangeListener listener : fListeners)
+				listener.propertyChange(event);
 		}
 	}
 
@@ -165,10 +170,10 @@
 	@Override
 	public void putValue(String name, String value) {
 		try {
-			fSilent= true;
+			fSilent = true;
 			fPreferences.setValue(name, value);
 		} finally {
-			fSilent= false;
+			fSilent = false;
 		}
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/wizards/dialogfields/CheckedListDialogField.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/wizards/dialogfields/CheckedListDialogField.java
index 0834763..affeee0 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/wizards/dialogfields/CheckedListDialogField.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/wizards/dialogfields/CheckedListDialogField.java
@@ -224,7 +224,7 @@
 		checkStateChanged();
 	}
 
-	private final ListenerList checkStateListeners = new ListenerList();
+	private final ListenerList<ICheckStateListener> checkStateListeners = new ListenerList<>();
 
 	public void addCheckStateListener(ICheckStateListener listener) {
 		checkStateListeners.add(listener);
@@ -238,9 +238,8 @@
 		} else {
 			fCheckedElements.remove(e.getElement());
 		}
-		final Object[] listeners = checkStateListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ICheckStateListener) listeners[i]).checkStateChanged(e);
+		for (ICheckStateListener listener : checkStateListeners) {
+			listener.checkStateChanged(e);
 		}
 		checkStateChanged();
 	}
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/workingsets/WorkingSetModel.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/workingsets/WorkingSetModel.java
index 96c7b81..993f616 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/workingsets/WorkingSetModel.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/internal/ui/workingsets/WorkingSetModel.java
@@ -46,7 +46,7 @@
 
 	private ILocalWorkingSetManager fLocalWorkingSetManager;
 	private List<IWorkingSet> fActiveWorkingSets;
-	private ListenerList fListeners;
+	private ListenerList<IPropertyChangeListener> fListeners;
 	private IPropertyChangeListener fWorkingSetManagerListener;
 	private OthersWorkingSetUpdater fOthersWorkingSetUpdater;
 
@@ -159,8 +159,7 @@
 
 		private void addElement(IAdaptable element, IWorkingSet ws) {
 			addToMap(fElementToWorkingSet, element, ws);
-			IResource resource = element
-					.getAdapter(IResource.class);
+			IResource resource = element.getAdapter(IResource.class);
 			if (resource != null) {
 				addToMap(fResourceToWorkingSet, resource, ws);
 			}
@@ -168,8 +167,7 @@
 
 		private void removeElement(IAdaptable element, IWorkingSet ws) {
 			removeFromMap(fElementToWorkingSet, element, ws);
-			IResource resource = element
-					.getAdapter(IResource.class);
+			IResource resource = element.getAdapter(IResource.class);
 			if (resource != null) {
 				removeFromMap(fResourceToWorkingSet, resource, ws);
 			}
@@ -249,7 +247,7 @@
 	}
 
 	private void addListenersToWorkingSetManagers() {
-		fListeners = new ListenerList(ListenerList.IDENTITY);
+		fListeners = new ListenerList<>(ListenerList.IDENTITY);
 		fWorkingSetManagerListener = event -> workingSetManagerChanged(event);
 		PlatformUI.getWorkbench().getWorkingSetManager()
 				.addPropertyChangeListener(fWorkingSetManagerListener);
@@ -311,10 +309,9 @@
 	}
 
 	public boolean needsConfiguration() {
-		return !fConfigured
-				&& fActiveWorkingSets.size() == 1
-				&& WorkingSetIDs.OTHERS.equals(fActiveWorkingSets.get(0)
-						.getId());
+		return !fConfigured && fActiveWorkingSets.size() == 1
+				&& WorkingSetIDs.OTHERS
+						.equals(fActiveWorkingSets.get(0).getId());
 	}
 
 	public void configured() {
@@ -344,8 +341,8 @@
 	}
 
 	public IWorkingSet[] getActiveWorkingSets() {
-		return fActiveWorkingSets.toArray(new IWorkingSet[fActiveWorkingSets
-				.size()]);
+		return fActiveWorkingSets
+				.toArray(new IWorkingSet[fActiveWorkingSets.size()]);
 	}
 
 	public IWorkingSet[] getAllWorkingSets() {
@@ -356,8 +353,8 @@
 			if (!result.contains(locals[i]))
 				result.add(locals[i]);
 		}
-		IWorkingSet[] globals = PlatformUI.getWorkbench()
-				.getWorkingSetManager().getWorkingSets();
+		IWorkingSet[] globals = PlatformUI.getWorkbench().getWorkingSetManager()
+				.getWorkingSets();
 		for (int i = 0; i < globals.length; i++) {
 			if (!result.contains(globals[i]))
 				result.add(globals[i]);
@@ -366,8 +363,8 @@
 	}
 
 	public void setActiveWorkingSets(IWorkingSet[] workingSets) {
-		fActiveWorkingSets = new ArrayList<IWorkingSet>(Arrays
-				.asList(workingSets));
+		fActiveWorkingSets = new ArrayList<IWorkingSet>(
+				Arrays.asList(workingSets));
 		fElementMapper.rebuild(getActiveWorkingSets());
 		fOthersWorkingSetUpdater.updateElements();
 		fireEvent(new PropertyChangeEvent(this,
@@ -376,11 +373,12 @@
 
 	public void saveState(IMemento memento) {
 		memento.putString(TAG_CONFIGURED, Boolean.toString(fConfigured));
-		fLocalWorkingSetManager.saveState(memento
-				.createChild(TAG_LOCAL_WORKING_SET_MANAGER));
-		for (Iterator iter = fActiveWorkingSets.iterator(); iter.hasNext();) {
+		fLocalWorkingSetManager
+				.saveState(memento.createChild(TAG_LOCAL_WORKING_SET_MANAGER));
+		for (Iterator<IWorkingSet> iter = fActiveWorkingSets.iterator(); iter
+				.hasNext();) {
 			IMemento active = memento.createChild(TAG_ACTIVE_WORKING_SET);
-			IWorkingSet workingSet = (IWorkingSet) iter.next();
+			IWorkingSet workingSet = iter.next();
 			active.putString(TAG_WORKING_SET_NAME, workingSet.getName());
 		}
 	}
@@ -421,9 +419,8 @@
 
 	private void workingSetManagerChanged(PropertyChangeEvent event) {
 		String property = event.getProperty();
-		if (IWorkingSetManager.CHANGE_WORKING_SET_UPDATER_INSTALLED
-				.equals(property)
-				&& event.getSource() == fLocalWorkingSetManager) {
+		if (IWorkingSetManager.CHANGE_WORKING_SET_UPDATER_INSTALLED.equals(
+				property) && event.getSource() == fLocalWorkingSetManager) {
 			IWorkingSetUpdater updater = (IWorkingSetUpdater) event
 					.getNewValue();
 			if (updater instanceof OthersWorkingSetUpdater) {
@@ -449,8 +446,8 @@
 			List<IWorkingSet> elements = new ArrayList<IWorkingSet>(
 					fActiveWorkingSets);
 			elements.remove(workingSet);
-			setActiveWorkingSets(elements.toArray(new IWorkingSet[elements
-					.size()]));
+			setActiveWorkingSets(
+					elements.toArray(new IWorkingSet[elements.size()]));
 		} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE
 				.equals(property)) {
 			fireEvent(event);
@@ -458,9 +455,8 @@
 	}
 
 	private void fireEvent(PropertyChangeEvent event) {
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			((IPropertyChangeListener) listeners[i]).propertyChange(event);
+		for (IPropertyChangeListener listener : fListeners) {
+			listener.propertyChange(event);
 		}
 	}
 
@@ -470,7 +466,8 @@
 		Object oldValue = event.getOldValue();
 		Object newValue = event.getNewValue();
 		if ((oldValue != null && fActiveWorkingSets.contains(oldValue))
-				|| (newValue != null && fActiveWorkingSets.contains(newValue))) {
+				|| (newValue != null
+						&& fActiveWorkingSets.contains(newValue))) {
 			return true;
 		}
 		return false;
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/DLTKUIPlugin.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/DLTKUIPlugin.java
index 8dc3de1..cd56e19 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/DLTKUIPlugin.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/DLTKUIPlugin.java
@@ -204,8 +204,8 @@
 		new InitializeJob().schedule();
 	}
 
-	static class ShutdownCloseRemoteEditorsListener implements
-			IWorkbenchListener {
+	static class ShutdownCloseRemoteEditorsListener
+			implements IWorkbenchListener {
 		@Override
 		public void postShutdown(IWorkbench workbench) {
 			// empty
@@ -256,8 +256,8 @@
 		}
 	}
 
-	private static class UIExecutionContextManager implements
-			IExecutionContextManager {
+	private static class UIExecutionContextManager
+			implements IExecutionContextManager {
 
 		private boolean active = false;
 
@@ -301,7 +301,7 @@
 
 	}
 
-	private final ListenerList shutdownListeners = new ListenerList();
+	private final ListenerList<IShutdownListener> shutdownListeners = new ListenerList<>();
 
 	public void addShutdownListener(IShutdownListener listener) {
 		shutdownListeners.add(listener);
@@ -318,9 +318,8 @@
 			fMembersOrderPreferenceCache.dispose();
 			fMembersOrderPreferenceCache = null;
 		}
-		Object[] listeners = shutdownListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((IShutdownListener) listeners[i]).shutdown();
+		for (IShutdownListener listener : shutdownListeners) {
+			listener.shutdown();
 		}
 		shutdownListeners.clear();
 		super.stop(context);
@@ -376,8 +375,8 @@
 	 * @return the image descriptor
 	 */
 	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin(
-				"org.eclipse.dltk.ui", path); //$NON-NLS-1$
+		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.dltk.ui", //$NON-NLS-1$
+				path);
 	}
 
 	private IWorkingCopyManager fWorkingCopyManager;
@@ -434,13 +433,13 @@
 		}
 
 		if (editorInput instanceof FileStoreEditorInput) {
-			ISourceModule module = resolveSourceModule((FileStoreEditorInput) editorInput);
+			ISourceModule module = resolveSourceModule(
+					(FileStoreEditorInput) editorInput);
 			if (module != null) {
 				return module;
 			}
 		}
-		IModelElement me = editorInput
-				.getAdapter(IModelElement.class);
+		IModelElement me = editorInput.getAdapter(IModelElement.class);
 		if (me instanceof ISourceModule) {
 			return (ISourceModule) me;
 		}
@@ -617,7 +616,8 @@
 			descriptors = editorTextHoverDescriptorsByNature.get(natureId);
 		}
 		if (descriptors == null) {
-			descriptors = initializeEditorTextHoverDescriprtors(store, natureId);
+			descriptors = initializeEditorTextHoverDescriprtors(store,
+					natureId);
 			if (descriptors != null && natureId != null) {
 				synchronized (editorTextHoverDescriptorsByNature) {
 					editorTextHoverDescriptorsByNature.put(natureId,
@@ -638,7 +638,8 @@
 			 * getConfigurationElement(java.lang.Object)
 			 */
 			@Override
-			public IConfigurationElement getConfigurationElement(Object object) {
+			public IConfigurationElement getConfigurationElement(
+					Object object) {
 				return ((EditorTextHoverDescriptor) object)
 						.getConfigurationElement();
 			}
@@ -646,8 +647,8 @@
 		sorter.sort(descriptors);
 		// Move Best Match hover to front
 		for (int i = 0; i < descriptors.length - 1; i++) {
-			if (PreferenceConstants.ID_BESTMATCH_HOVER.equals(descriptors[i]
-					.getId())) {
+			if (PreferenceConstants.ID_BESTMATCH_HOVER
+					.equals(descriptors[i].getId())) {
 				final EditorTextHoverDescriptor hoverDescriptor = descriptors[i];
 				for (int j = i; j > 0; j--)
 					descriptors[j] = descriptors[j - 1];
@@ -711,8 +712,8 @@
 	 * @since 3.3
 	 */
 	public static IEditorPart openInEditor(IModelElement element,
-			boolean activate, boolean reveal) throws ModelException,
-			PartInitException {
+			boolean activate, boolean reveal)
+			throws ModelException, PartInitException {
 		if (!(element instanceof ISourceReference)) {
 			return null;
 		}
@@ -741,11 +742,12 @@
 		return fBuildpathAttributeConfigurationDescriptors;
 	}
 
-	public static ISourceModule resolveSourceModule(FileStoreEditorInput input) {
+	public static ISourceModule resolveSourceModule(
+			FileStoreEditorInput input) {
 		final ISourceModule[] modules = new ISourceModule[1];
 		final IPath filePath = URIUtil.toPath(input.getURI());
-		IScriptModel scriptModel = DLTKCore.create(ResourcesPlugin
-				.getWorkspace().getRoot());
+		IScriptModel scriptModel = DLTKCore
+				.create(ResourcesPlugin.getWorkspace().getRoot());
 		try {
 			scriptModel.accept(element -> {
 				boolean shouldDescend = (modules[0] == null);
@@ -762,11 +764,10 @@
 								IPath folderPath = new Path(
 										filePath.removeLastSegments(1).toFile()
 												.getCanonicalPath());
-								folderPath = folderPath
-										.removeFirstSegments(new Path(
-												fragment.getPath().toFile()
-														.getCanonicalPath())
-																.segmentCount());
+								folderPath = folderPath.removeFirstSegments(
+										new Path(fragment.getPath().toFile()
+												.getCanonicalPath())
+														.segmentCount());
 								IScriptFolder folder = fragment
 										.getScriptFolder(folderPath);
 								if ((folder != null)
@@ -813,10 +814,8 @@
 	}
 
 	public static String getAdditionalInfoAffordanceString() {
-		if (!EditorsUI
-				.getPreferenceStore()
-				.getBoolean(
-						AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE))
+		if (!EditorsUI.getPreferenceStore().getBoolean(
+				AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE))
 			return null;
 		return Messages.DLTKUIPlugin_additionalInfo_affordance;
 	}
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/EclipsePreferencesAdapter.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/EclipsePreferencesAdapter.java
index 010b1ac..30c69ea 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/EclipsePreferencesAdapter.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/EclipsePreferencesAdapter.java
@@ -24,8 +24,8 @@
 	 * {@link org.eclipse.jface.util.PropertyChangeEvent} on this adapter with
 	 * arguments from the received event.
 	 */
-	private class PreferenceChangeListener implements
-			IEclipsePreferences.IPreferenceChangeListener {
+	private class PreferenceChangeListener
+			implements IEclipsePreferences.IPreferenceChangeListener {
 		@Override
 		public void preferenceChange(
 				final IEclipsePreferences.PreferenceChangeEvent event) {
@@ -41,7 +41,7 @@
 	}
 
 	/** Listeners on on this adapter */
-	private ListenerList fListeners = new ListenerList();
+	private ListenerList<IPropertyChangeListener> fListeners = new ListenerList<>();
 
 	/** Listener on the node */
 	private IEclipsePreferences.IPreferenceChangeListener fListener = new PreferenceChangeListener();
@@ -95,9 +95,8 @@
 			Object newValue) {
 		PropertyChangeEvent event = new PropertyChangeEvent(this, name,
 				oldValue, newValue);
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++)
-			((IPropertyChangeListener) listeners[i]).propertyChange(event);
+		for (IPropertyChangeListener listener : fListeners)
+			listener.propertyChange(event);
 	}
 
 	@Override
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/PreferencesAdapter.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/PreferencesAdapter.java
index 1f7048e..1121457 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/PreferencesAdapter.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/PreferencesAdapter.java
@@ -18,29 +18,32 @@
  * Adapts {@link org.eclipse.core.runtime.Preferences} to
  * {@link org.eclipse.jface.preference.IPreferenceStore}
  *
-	 *
+ *
  */
 public class PreferencesAdapter implements IPreferenceStore {
 
 	/**
 	 * Property change listener. Listens for events of type
-	 * {@link org.eclipse.core.runtime.Preferences.PropertyChangeEvent} and fires
-	 * a {@link org.eclipse.jface.util.PropertyChangeEvent} on the
-	 * adapter with arguments from the received event.
+	 * {@link org.eclipse.core.runtime.Preferences.PropertyChangeEvent} and
+	 * fires a {@link org.eclipse.jface.util.PropertyChangeEvent} on the adapter
+	 * with arguments from the received event.
 	 */
-	private class PropertyChangeListener implements Preferences.IPropertyChangeListener {
+	private class PropertyChangeListener
+			implements Preferences.IPropertyChangeListener {
 
 		@Override
 		public void propertyChange(Preferences.PropertyChangeEvent event) {
-			firePropertyChangeEvent(event.getProperty(), event.getOldValue(), event.getNewValue());
+			firePropertyChangeEvent(event.getProperty(), event.getOldValue(),
+					event.getNewValue());
 		}
 	}
 
 	/** Listeners on the adapter */
-	private ListenerList fListeners= new ListenerList(ListenerList.IDENTITY);
+	private ListenerList<IPropertyChangeListener> fListeners = new ListenerList<>(
+			ListenerList.IDENTITY);
 
 	/** Listener on the adapted Preferences */
-	private PropertyChangeListener fListener= new PropertyChangeListener();
+	private PropertyChangeListener fListener = new PropertyChangeListener();
 
 	/** Adapted Preferences */
 	private Preferences fPreferences;
@@ -54,10 +57,12 @@
 	public PreferencesAdapter() {
 		this(new Preferences());
 	}
+
 	/**
 	 * Initialize with the given Preferences.
 	 *
-	 * @param preferences The preferences to wrap.
+	 * @param preferences
+	 *            The preferences to wrap.
 	 */
 	public PreferencesAdapter(Preferences preferences) {
 		fPreferences = preferences;
@@ -83,12 +88,13 @@
 	}
 
 	@Override
-	public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+	public void firePropertyChangeEvent(String name, Object oldValue,
+			Object newValue) {
 		if (!fSilent) {
-			PropertyChangeEvent event= new PropertyChangeEvent(this, name, oldValue, newValue);
-			Object[] listeners= fListeners.getListeners();
-			for (int i= 0; i < listeners.length; i++)
-				((IPropertyChangeListener) listeners[i]).propertyChange(event);
+			PropertyChangeEvent event = new PropertyChangeEvent(this, name,
+					oldValue, newValue);
+			for (IPropertyChangeListener listener : fListeners)
+				listener.propertyChange(event);
 		}
 	}
 
@@ -165,10 +171,10 @@
 	@Override
 	public void putValue(String name, String value) {
 		try {
-			fSilent= true;
+			fSilent = true;
 			fPreferences.setValue(name, value);
 		} finally {
-			fSilent= false;
+			fSilent = false;
 		}
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/ProblemsLabelDecorator.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/ProblemsLabelDecorator.java
index a94a6ec..49e4f74 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/ProblemsLabelDecorator.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/ProblemsLabelDecorator.java
@@ -110,7 +110,7 @@
 	private boolean fUseNewRegistry = false;
 	private IProblemChangedListener fProblemChangedListener;
 
-	private ListenerList fListeners;
+	private ListenerList<ILabelProviderListener> fListeners;
 	private ISourceRange fCachedRange;
 
 	/**
@@ -376,7 +376,7 @@
 	@Override
 	public void addListener(ILabelProviderListener listener) {
 		if (fListeners == null) {
-			fListeners = new ListenerList();
+			fListeners = new ListenerList<>();
 		}
 		fListeners.add(listener);
 		if (fProblemChangedListener == null) {
@@ -405,10 +405,8 @@
 		if (fListeners != null && !fListeners.isEmpty()) {
 			LabelProviderChangedEvent event = new ProblemsLabelChangedEvent(
 					this, changedResources, isMarkerChange);
-			Object[] listeners = fListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				((ILabelProviderListener) listeners[i])
-						.labelProviderChanged(event);
+			for (ILabelProviderListener listener : fListeners) {
+				listener.labelProviderChanged(event);
 			}
 		}
 	}
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/PackageViewerWrapper.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/PackageViewerWrapper.java
index 5824f73..7f5e73e 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/PackageViewerWrapper.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/PackageViewerWrapper.java
@@ -33,30 +33,32 @@
 import org.eclipse.swt.widgets.Widget;
 
 /**
- * Wrapper who transfers listeners and filters and to which clients
- * can refer.
+ * Wrapper who transfers listeners and filters and to which clients can refer.
  *
- * @deprecated needs to be replaced by a manager who handles transfer of listeners and filters
+ * @deprecated needs to be replaced by a manager who handles transfer of
+ *             listeners and filters
  */
 @Deprecated
 class PackageViewerWrapper extends StructuredViewer {
 
 	private StructuredViewer fViewer;
 	private ListenerList fListenerList;
-	private ListenerList fSelectionChangedListenerList;
-	private ListenerList fPostSelectionChangedListenerList;
+	private ListenerList<ISelectionChangedListener> fSelectionChangedListenerList;
+	private ListenerList<ISelectionChangedListener> fPostSelectionChangedListenerList;
 
 	public PackageViewerWrapper() {
-		fListenerList= new ListenerList(ListenerList.IDENTITY);
-		fPostSelectionChangedListenerList= new ListenerList(ListenerList.IDENTITY);
-		fSelectionChangedListenerList= new ListenerList(ListenerList.IDENTITY);
+		fListenerList = new ListenerList(ListenerList.IDENTITY);
+		fPostSelectionChangedListenerList = new ListenerList<>(
+				ListenerList.IDENTITY);
+		fSelectionChangedListenerList = new ListenerList<>(
+				ListenerList.IDENTITY);
 	}
 
 	public void setViewer(StructuredViewer viewer) {
 		Assert.isNotNull(viewer);
 
-		StructuredViewer oldViewer= fViewer;
-		fViewer= viewer;
+		StructuredViewer oldViewer = fViewer;
+		fViewer = viewer;
 
 		if (fViewer.getContentProvider() != null)
 			super.setContentProvider(fViewer.getContentProvider());
@@ -64,16 +66,16 @@
 		transferListeners();
 	}
 
-	StructuredViewer getViewer(){
+	StructuredViewer getViewer() {
 		return fViewer;
 	}
 
 	private void transferFilters(StructuredViewer oldViewer) {
-		//set filters
+		// set filters
 		if (oldViewer != null) {
-			ViewerFilter[] filters= oldViewer.getFilters();
-			for (int i= 0; i < filters.length; i++) {
-				ViewerFilter filter= filters[i];
+			ViewerFilter[] filters = oldViewer.getFilters();
+			for (int i = 0; i < filters.length; i++) {
+				ViewerFilter filter = filters[i];
 				fViewer.addFilter(filter);
 			}
 		}
@@ -81,33 +83,27 @@
 
 	private void transferListeners() {
 
-		Object[] listeners= fPostSelectionChangedListenerList.getListeners();
-		for (int i= 0; i < listeners.length; i++) {
-			Object object= listeners[i];
-			ISelectionChangedListener listener= (ISelectionChangedListener)object;
+		for (ISelectionChangedListener listener : fPostSelectionChangedListenerList) {
 			fViewer.addPostSelectionChangedListener(listener);
 		}
 
-		listeners= fSelectionChangedListenerList.getListeners();
-		for (int i= 0; i < listeners.length; i++) {
-			Object object= listeners[i];
-			ISelectionChangedListener listener= (ISelectionChangedListener)object;
+		for (ISelectionChangedListener listener : fSelectionChangedListenerList) {
 			fViewer.addSelectionChangedListener(listener);
 		}
 
 		// Add all other listeners
-		listeners= fListenerList.getListeners();
-		for (int i= 0; i < listeners.length; i++) {
-			Object object= listeners[i];
+		Object[] listeners = fListenerList.getListeners();
+		for (int i = 0; i < listeners.length; i++) {
+			Object object = listeners[i];
 
 			if (object instanceof IOpenListener) {
-				IOpenListener listener= (IOpenListener) object;
+				IOpenListener listener = (IOpenListener) object;
 				addOpenListener(listener);
 			} else if (object instanceof HelpListener) {
-				HelpListener listener= (HelpListener) object;
+				HelpListener listener = (HelpListener) object;
 				addHelpListener(listener);
 			} else if (object instanceof IDoubleClickListener) {
-				IDoubleClickListener listener= (IDoubleClickListener) object;
+				IDoubleClickListener listener = (IDoubleClickListener) object;
 				addDoubleClickListener(listener);
 			}
 		}
@@ -116,24 +112,26 @@
 	@Override
 	public void setSelection(ISelection selection, boolean reveal) {
 		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel= (IStructuredSelection) selection;
+			IStructuredSelection sel = (IStructuredSelection) selection;
 
-			//try and give the two a common super class
-			IContentProvider provider= getContentProvider();
+			// try and give the two a common super class
+			IContentProvider provider = getContentProvider();
 			if (provider instanceof LogicalPackagesProvider) {
-				LogicalPackagesProvider fprovider= (LogicalPackagesProvider) provider;
+				LogicalPackagesProvider fprovider = (LogicalPackagesProvider) provider;
 
-				Object object= sel.getFirstElement();
+				Object object = sel.getFirstElement();
 				if (object instanceof IScriptFolder) {
-					IScriptFolder pkgFragment= (IScriptFolder)object;
-					LogicalPackage logicalPkg= fprovider.findLogicalPackage(pkgFragment);
+					IScriptFolder pkgFragment = (IScriptFolder) object;
+					LogicalPackage logicalPkg = fprovider
+							.findLogicalPackage(pkgFragment);
 					if (logicalPkg != null)
-						object= logicalPkg;
+						object = logicalPkg;
 					else
-						object= pkgFragment;
+						object = pkgFragment;
 				}
 				if (object != null)
-					fViewer.setSelection(new StructuredSelection(object), reveal);
+					fViewer.setSelection(new StructuredSelection(object),
+							reveal);
 				else
 					fViewer.setSelection(StructuredSelection.EMPTY, reveal);
 			}
@@ -142,13 +140,15 @@
 	}
 
 	@Override
-	public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+	public void addPostSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fPostSelectionChangedListenerList.add(listener);
 		fViewer.addPostSelectionChangedListener(listener);
 	}
 
 	@Override
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+	public void addSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fSelectionChangedListenerList.add(listener);
 		fViewer.addSelectionChangedListener(listener);
 	}
@@ -172,13 +172,15 @@
 	}
 
 	@Override
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+	public void removeSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fViewer.removeSelectionChangedListener(listener);
 		fSelectionChangedListenerList.remove(listener);
 	}
 
 	@Override
-	public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+	public void removePostSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fViewer.removePostSelectionChangedListener(listener);
 		fPostSelectionChangedListenerList.remove(listener);
 	}
@@ -352,40 +354,39 @@
 		return fViewer.toString();
 	}
 
-	public void setViewerInput(Object input){
+	public void setViewerInput(Object input) {
 		fViewer.setInput(input);
 	}
 
 	// need to provide implementation for abstract methods
 	@Override
 	protected Widget doFindInputItem(Object element) {
-		return ((IPackagesViewViewer)fViewer).doFindInputItem(element);
+		return ((IPackagesViewViewer) fViewer).doFindInputItem(element);
 	}
 
 	@Override
 	protected Widget doFindItem(Object element) {
-		return ((IPackagesViewViewer)fViewer).doFindItem(element);
+		return ((IPackagesViewViewer) fViewer).doFindItem(element);
 	}
 
 	@Override
 	protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
-		((IPackagesViewViewer)fViewer).doUpdateItem(item, element, fullMap);
+		((IPackagesViewViewer) fViewer).doUpdateItem(item, element, fullMap);
 	}
 
 	@Override
 	protected List getSelectionFromWidget() {
-		return ((IPackagesViewViewer)fViewer).getSelectionFromWidget();
+		return ((IPackagesViewViewer) fViewer).getSelectionFromWidget();
 	}
 
 	@Override
 	protected void internalRefresh(Object element) {
-		((IPackagesViewViewer)fViewer).internalRefresh(element);
+		((IPackagesViewViewer) fViewer).internalRefresh(element);
 	}
 
 	@Override
 	protected void setSelectionToWidget(List l, boolean reveal) {
-		((IPackagesViewViewer)fViewer).setSelectionToWidget(l, reveal);
+		((IPackagesViewViewer) fViewer).setSelectionToWidget(l, reveal);
 	}
 
-
 }
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/ext/ExtendedClassesView.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/ext/ExtendedClassesView.java
index 903937e..dae730d 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/ext/ExtendedClassesView.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/browsing/ext/ExtendedClassesView.java
@@ -66,12 +66,12 @@
 import org.eclipse.ui.contexts.IContextService;
 import org.eclipse.ui.part.ViewPart;
 
-public class ExtendedClassesView extends ViewPart implements
-		IViewPartInputProvider, ISelectionListener, ISelectionProvider,
-		IExecutableExtension, IMenuListener {
+public class ExtendedClassesView extends ViewPart
+		implements IViewPartInputProvider, ISelectionListener,
+		ISelectionProvider, IExecutableExtension, IMenuListener {
 
-	private final class IElementChangedListenerImplementation implements
-			IElementChangedListener {
+	private final class IElementChangedListenerImplementation
+			implements IElementChangedListener {
 		@Override
 		public void elementChanged(ElementChangedEvent event) {
 			// We need to update
@@ -79,7 +79,8 @@
 			IModelElementDelta delta = event.getDelta();
 			if (browsingPane != null && !browsingPane.isDisposed()
 					&& typesChanged(delta)) {
-				browsingPane.getDisplay().asyncExec(() -> browsingPane.refresh());
+				browsingPane.getDisplay()
+						.asyncExec(() -> browsingPane.refresh());
 			}
 			// }
 		}
@@ -87,7 +88,8 @@
 		private boolean typesChanged(IModelElementDelta delta) {
 			IModelElementDelta[] affectedChildren = delta.getAffectedChildren();
 			for (int i = 0; i < affectedChildren.length; i++) {
-				if (affectedChildren[i].getElement().getElementType() == IModelElement.TYPE) {
+				if (affectedChildren[i].getElement()
+						.getElementType() == IModelElement.TYPE) {
 					return true;
 				} else {
 					if (typesChanged(affectedChildren[i])) {
@@ -116,8 +118,8 @@
 
 	public ExtendedClassesView() {
 		elementChangedListenerImplementation = new IElementChangedListenerImplementation();
-		DLTKCore
-				.addElementChangedListener(elementChangedListenerImplementation);
+		DLTKCore.addElementChangedListener(
+				elementChangedListenerImplementation);
 	}
 
 	@Override
@@ -130,8 +132,8 @@
 			}
 		}
 		super.dispose();
-		DLTKCore
-				.removeElementChangedListener(elementChangedListenerImplementation);
+		DLTKCore.removeElementChangedListener(
+				elementChangedListenerImplementation);
 	}
 
 	//
@@ -141,12 +143,10 @@
 		browsingPane = new MultiSelectionListViewer(parent, SWT.NONE) {
 			@Override
 			public void elementSelectionChanged(ISelection selection) {
-				Object[] listeners = listenerList.getListeners();
 				SelectionChangedEvent event = new SelectionChangedEvent(
 						ExtendedClassesView.this, convertSelection(selection));
-				for (int i = 0; i < listeners.length; i++) {
-					((ISelectionChangedListener) (listeners[i]))
-							.selectionChanged(event);
+				for (ISelectionChangedListener listener : listenerList) {
+					listener.selectionChanged(event);
 				}
 			}
 
@@ -212,17 +212,17 @@
 				SearchEngine.createWorkspaceScope(this.fToolkit), parent,
 				this.fToolkit));
 
-		browsingPane.setLabelProvider(new ExtendedClasesLabelProvider(
-				DLTKUILanguageManager.createLabelProvider(this.fToolkit
-						.getNatureId())));
+		browsingPane.setLabelProvider(
+				new ExtendedClasesLabelProvider(DLTKUILanguageManager
+						.createLabelProvider(this.fToolkit.getNatureId())));
 
 		getSite().setSelectionProvider(this);
 		getViewSite().getPage().addPostSelectionListener(this);
 		getViewSite().getPage().addPartListener(fPartListener);
 
 		createActions();
-		IContextService ctxService = getSite().getService(
-				IContextService.class);
+		IContextService ctxService = getSite()
+				.getService(IContextService.class);
 		if (ctxService != null) {
 			fContextActivation = ctxService
 					.activateContext(DLTKUIPlugin.CONTEXT_VIEWS);
@@ -299,8 +299,8 @@
 
 	protected boolean needsToProcessSelectionChanged(IWorkbenchPart part,
 			ISelection selection) {
-		if (!fProcessSelectionEvents || part == this
-				|| isSearchResultView(part) || part instanceof AbstractInfoView) {
+		if (!fProcessSelectionEvents || part == this || isSearchResultView(part)
+				|| part instanceof AbstractInfoView) {
 			if (part == this)
 				fPreviousSelectionProvider = part;
 			return false;
@@ -334,8 +334,7 @@
 		}
 		Object currentInput = browsingPane.getInput();
 		List elements = new ArrayList();
-		if (currentInput == null
-				|| !currentInput.equals(firstElement))
+		if (currentInput == null || !currentInput.equals(firstElement))
 			if (iter.hasNext() && selection instanceof StructuredSelection) {
 				// multi-selection and view is empty
 				return ((StructuredSelection) selection).toList();
@@ -388,7 +387,8 @@
 		fPreviousSelectedElement = selectedElement;
 
 		if (selectedElement != null
-				&& (selectedElement instanceof IScriptProject || selectedElement instanceof IProjectFragment)) {
+				&& (selectedElement instanceof IScriptProject
+						|| selectedElement instanceof IProjectFragment)) {
 			browsingPane.setInput(selectedElement);
 		}
 
@@ -452,12 +452,13 @@
 		}
 	};
 
-	ListenerList listenerList = new ListenerList();
+	ListenerList<ISelectionChangedListener> listenerList = new ListenerList<>();
 	private IDLTKLanguageToolkit fToolkit;
 	private IElementChangedListenerImplementation elementChangedListenerImplementation;
 
 	@Override
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+	public void addSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		listenerList.add(listener);
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentContainer.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentContainer.java
index 1a5aa85..03607d5 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentContainer.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentContainer.java
@@ -57,8 +57,8 @@
 		}
 	}
 
-	private static class EnvironmentComparator implements
-			Comparator<IEnvironment> {
+	private static class EnvironmentComparator
+			implements Comparator<IEnvironment> {
 
 		@Override
 		public int compare(final IEnvironment e1, final IEnvironment e2) {
@@ -90,7 +90,8 @@
 					synchronized (environments) {
 						initEnvironments();
 					}
-					Display.getDefault().asyncExec(() -> fireChangeNotifications());
+					Display.getDefault()
+							.asyncExec(() -> fireChangeNotifications());
 				}
 
 			};
@@ -162,7 +163,7 @@
 		initialized = false;
 	}
 
-	private final ListenerList changeListeners = new ListenerList();
+	private final ListenerList<Runnable> changeListeners = new ListenerList<>();
 
 	/**
 	 * Registers the specified change listener to be called when available
@@ -176,9 +177,8 @@
 	}
 
 	protected void fireChangeNotifications() {
-		Object[] listeners = changeListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((Runnable) listeners[i]).run();
+		for (Runnable listener : changeListeners) {
+			listener.run();
 		}
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentPathBlock.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentPathBlock.java
index b272967..0981ffe 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentPathBlock.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/environment/EnvironmentPathBlock.java
@@ -40,7 +40,7 @@
 	private Table pathTable;
 	private TableViewer pathViewer;
 
-	private ListenerList listeners = new ListenerList();
+	private ListenerList<IEnvironmentPathBlockListener> listeners = new ListenerList<>();
 
 	/**
 	 * Environment to path association.
@@ -56,8 +56,8 @@
 		this.useFolders = useFolders;
 	}
 
-	protected class PathLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
+	protected class PathLabelProvider extends LabelProvider
+			implements ITableLabelProvider {
 
 		private final int pathColumn;
 
@@ -102,8 +102,8 @@
 			IEnvironment[] environments) {
 		PixelConverter conv = new PixelConverter(parent);
 
-		pathTable = new Table(parent, SWT.SINGLE | SWT.BORDER
-				| SWT.FULL_SELECTION);
+		pathTable = new Table(parent,
+				SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
 		pathTable.setHeaderVisible(true);
 		pathTable.setLinesVisible(true);
 		// GridData tableData = new GridData(SWT.FILL, SWT.DEFAULT, true,
@@ -153,13 +153,14 @@
 		initPathColumn(viewer, conv);
 	}
 
-	protected void initEnvironmentColumn(TableViewer viewer, PixelConverter conv) {
-		TableViewerColumn environmentsColumn = new TableViewerColumn(
-				pathViewer, SWT.NULL);
-		environmentsColumn.getColumn().setText(
-				Messages.EnvironmentPathBlock_environment);
-		environmentsColumn.getColumn().setWidth(
-				conv.convertWidthInCharsToPixels(30));
+	protected void initEnvironmentColumn(TableViewer viewer,
+			PixelConverter conv) {
+		TableViewerColumn environmentsColumn = new TableViewerColumn(pathViewer,
+				SWT.NULL);
+		environmentsColumn.getColumn()
+				.setText(Messages.EnvironmentPathBlock_environment);
+		environmentsColumn.getColumn()
+				.setWidth(conv.convertWidthInCharsToPixels(30));
 	}
 
 	protected void initPathColumn(TableViewer viewer, PixelConverter conv) {
@@ -198,8 +199,8 @@
 						Font font = new Font(compositeParent.getDisplay(),
 								"arial", 6, 0); //$NON-NLS-1$
 						browse.setFont(font);
-						browse.setLayoutData(new GridData(SWT.DEFAULT,
-								SWT.FILL, false, true));
+						browse.setLayoutData(new GridData(SWT.DEFAULT, SWT.FILL,
+								false, true));
 						browse.addSelectionListener(new SelectionAdapter() {
 							@Override
 							public void widgetSelected(SelectionEvent e) {
@@ -271,8 +272,7 @@
 		if (selection instanceof IStructuredSelection) {
 			IStructuredSelection sel = (IStructuredSelection) selection;
 			IEnvironment environment = (IEnvironment) sel.getFirstElement();
-			IEnvironmentUI ui = environment
-					.getAdapter(IEnvironmentUI.class);
+			IEnvironmentUI ui = environment.getAdapter(IEnvironmentUI.class);
 			String file = null;
 			if (!useFolders) {
 				file = ui.selectFile(this.pathTable.getShell(),
@@ -305,9 +305,7 @@
 	}
 
 	protected void fireValueChanged() {
-		Object[] array = listeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			final IEnvironmentPathBlockListener listener = (IEnvironmentPathBlockListener) array[i];
+		for (final IEnvironmentPathBlockListener listener : listeners) {
 			SafeRunnable.run(new SafeRunnable() {
 				@Override
 				public void run() {
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/formatter/internal/FormatterControlManager.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/formatter/internal/FormatterControlManager.java
index 2c434fa..845c24c 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/formatter/internal/FormatterControlManager.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/formatter/internal/FormatterControlManager.java
@@ -31,8 +31,8 @@
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 
-public class FormatterControlManager implements IFormatterControlManager,
-		IStatusChangeListener {
+public class FormatterControlManager
+		implements IFormatterControlManager, IStatusChangeListener {
 
 	private final IPreferenceDelegate<String> delegate;
 	private final ControlBindingManager<String> bindingManager;
@@ -63,8 +63,8 @@
 	public Combo createCombo(Composite parent, String key, String label,
 			String[] items) {
 		final Label labelControl = SWTFactory.createLabel(parent, label, 1);
-		Combo combo = SWTFactory.createCombo(parent,
-				SWT.READ_ONLY | SWT.BORDER, 1, items);
+		Combo combo = SWTFactory.createCombo(parent, SWT.READ_ONLY | SWT.BORDER,
+				1, items);
 		bindingManager.bindControl(combo, key);
 		registerAssociatedLabel(combo, labelControl);
 		return combo;
@@ -74,8 +74,8 @@
 	public Combo createCombo(Composite parent, String key, String label,
 			String[] itemValues, String[] itemLabels) {
 		final Label labelControl = SWTFactory.createLabel(parent, label, 1);
-		Combo combo = SWTFactory.createCombo(parent,
-				SWT.READ_ONLY | SWT.BORDER, 1, itemLabels);
+		Combo combo = SWTFactory.createCombo(parent, SWT.READ_ONLY | SWT.BORDER,
+				1, itemLabels);
 		bindingManager.bindControl(combo, key, itemValues);
 		registerAssociatedLabel(combo, labelControl);
 		return combo;
@@ -111,7 +111,7 @@
 		}
 	}
 
-	private final ListenerList initListeners = new ListenerList();
+	private final ListenerList<IInitializeListener> initListeners = new ListenerList<>();
 
 	@Override
 	public void addInitializeListener(IInitializeListener listener) {
@@ -129,9 +129,8 @@
 		initialization = true;
 		try {
 			bindingManager.initialize();
-			final Object[] listeners = initListeners.getListeners();
-			for (int i = 0; i < listeners.length; ++i) {
-				((IInitializeListener) listeners[i]).initialize();
+			for (IInitializeListener listener : initListeners) {
+				listener.initialize();
 			}
 		} finally {
 			initialization = false;
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/infoviews/AbstractDocumentationView.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/infoviews/AbstractDocumentationView.java
index cb905ce..9a9d08e 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/infoviews/AbstractDocumentationView.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/infoviews/AbstractDocumentationView.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -81,8 +81,8 @@
 	/**
 	 * Preference key for the preference whether to show a dialog when the SWT
 	 * Browser widget is not available.
-	 * 
-	 * 
+	 *
+	 *
 	 */
 	private static final String DO_NOT_WARN_PREFERENCE_KEY = "AbstractDocumentationView.error.doNotWarn"; //$NON-NLS-1$
 	// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=73558
@@ -122,7 +122,7 @@
 
 		/**
 		 * Creates the action.
-		 * 
+		 *
 		 * @param control
 		 *            the widget
 		 * @param selectionProvider
@@ -164,14 +164,14 @@
 	 */
 	private static class SelectionProvider implements ISelectionProvider {
 		/** The selection changed listeners. */
-		private ListenerList fListeners = new ListenerList(
+		private ListenerList<ISelectionChangedListener> fListeners = new ListenerList<>(
 				ListenerList.IDENTITY);
 		/** The widget. */
 		private Control fControl;
 
 		/**
 		 * Creates a new selection provider.
-		 * 
+		 *
 		 * @param control
 		 *            the widget
 		 */
@@ -204,10 +204,8 @@
 			ISelection selection = getSelection();
 			SelectionChangedEvent event = new SelectionChangedEvent(this,
 					selection);
-			Object[] selectionChangedListeners = fListeners.getListeners();
-			for (int i = 0; i < selectionChangedListeners.length; i++)
-				((ISelectionChangedListener) selectionChangedListeners[i])
-						.selectionChanged(event);
+			for (ISelectionChangedListener listener : fListeners)
+				listener.selectionChanged(event);
 		}
 
 		@Override
@@ -219,8 +217,8 @@
 		@Override
 		public ISelection getSelection() {
 			if (fControl instanceof StyledText) {
-				IDocument document = new Document(((StyledText) fControl)
-						.getSelectionText());
+				IDocument document = new Document(
+						((StyledText) fControl).getSelectionText());
 				return new TextSelection(document, 0, document.getLength());
 			} else {
 				// FIXME: see
@@ -264,8 +262,8 @@
 						.openError(parent.getShell(), title, message,
 								toggleMessage, false, null, null);
 				if (dialog.getReturnCode() == Window.OK)
-					store.setValue(DO_NOT_WARN_PREFERENCE_KEY, dialog
-							.getToggleState());
+					store.setValue(DO_NOT_WARN_PREFERENCE_KEY,
+							dialog.getToggleState());
 			}
 			fIsUsingBrowserWidget = false;
 		}
@@ -295,8 +293,8 @@
 			return;
 		try {
 			styleSheetURL = FileLocator.toFileURL(styleSheetURL);
-			BufferedReader reader = new BufferedReader(new InputStreamReader(
-					styleSheetURL.openStream()));
+			BufferedReader reader = new BufferedReader(
+					new InputStreamReader(styleSheetURL.openStream()));
 			StringBuffer buffer = new StringBuffer(200);
 			String line = reader.readLine();
 			while (line != null) {
@@ -350,8 +348,7 @@
 		if (getInput() == null) {
 			StringBuffer buffer = new StringBuffer();
 			HTMLPrinter.insertPageProlog(buffer, 0, fBackgroundColorRGB,
-					fForegroundColorRGB,
-					fgStyleSheet);
+					fForegroundColorRGB, fgStyleSheet);
 			setInput(buffer.toString());
 		} else {
 			setInput(computeInput(getInput()));
@@ -405,7 +402,8 @@
 		String javadocHtml = (String) input;
 		if (fIsUsingBrowserWidget) {
 			if (javadocHtml != null && javadocHtml.length() > 0) {
-				boolean RTL = (getSite().getShell().getStyle() & SWT.RIGHT_TO_LEFT) != 0;
+				boolean RTL = (getSite().getShell().getStyle()
+						& SWT.RIGHT_TO_LEFT) != 0;
 				if (RTL) {
 					StringBuffer buffer = new StringBuffer(javadocHtml);
 					HTMLPrinter.insertStyles(buffer,
@@ -432,7 +430,7 @@
 
 	/**
 	 * Returns the doc in HTML format.
-	 * 
+	 *
 	 * @param result
 	 *            the Script elements for which to get the Javadoc
 	 * @return a string with the Javadoc in HTML format.
@@ -459,7 +457,7 @@
 
 	/**
 	 * Returns the Javadoc in HTML format.
-	 * 
+	 *
 	 * @param result
 	 *            the Script elements for which to get the Javadoc
 	 * @return a string with the Javadoc in HTML format.
@@ -469,8 +467,8 @@
 		final List<String> nodocs = new ArrayList<String>();
 		for (int i = 0; i < result.length; i++) {
 			final Object member = result[i];
-			Reader reader = ScriptDocumentationAccess.getHTMLContentReader(
-					getNature(), member, true, true);
+			Reader reader = ScriptDocumentationAccess
+					.getHTMLContentReader(getNature(), member, true, true);
 			if (reader != null) {
 				buffer.append("<b>"); //$NON-NLS-1$
 				buffer.append(getInfoText(member));
@@ -478,11 +476,9 @@
 				HTMLPrinter.addParagraph(buffer, reader);
 			} else {
 				if (member instanceof IModelElement) {
-					nodocs.add(ScriptElementLabels.getDefault()
-							.getElementLabel(
-									(IModelElement) member,
-									LABEL_FLAGS
-											| ScriptElementLabels.APPEND_FILE));
+					nodocs.add(ScriptElementLabels.getDefault().getElementLabel(
+							(IModelElement) member,
+							LABEL_FLAGS | ScriptElementLabels.APPEND_FILE));
 				} else {
 					// TODO
 				}
@@ -503,7 +499,7 @@
 
 	/**
 	 * Returns the Javadoc in HTML format.
-	 * 
+	 *
 	 * @param result
 	 *            the Script elements for which to get the Javadoc
 	 * @return a string with the Javadoc in HTML format.
@@ -524,7 +520,7 @@
 
 	/**
 	 * Returns the Javadoc in HTML format.
-	 * 
+	 *
 	 * @param result
 	 *            the Script elements for which to get the Javadoc
 	 * @return a string with the Javadoc in HTML format.
@@ -534,8 +530,8 @@
 		if (curr instanceof IMember) {
 			IMember member = (IMember) curr;
 			// HTMLPrinter.addSmallHeader(buffer, getInfoText(member));
-			Reader reader = ScriptDocumentationAccess.getHTMLContentReader(
-					getNature(), member, true, true);
+			Reader reader = ScriptDocumentationAccess
+					.getHTMLContentReader(getNature(), member, true, true);
 			if (reader != null) {
 				HTMLPrinter.addParagraph(buffer, reader);
 			} else {
@@ -550,8 +546,7 @@
 	private String addPrologeEpilog(StringBuffer buffer) {
 		if (buffer.length() > 0) {
 			HTMLPrinter.insertPageProlog(buffer, 0, fBackgroundColorRGB,
-					fForegroundColorRGB,
-					fgStyleSheet);
+					fForegroundColorRGB, fgStyleSheet);
 			HTMLPrinter.addPageEpilog(buffer);
 			return buffer.toString();
 		}
@@ -561,7 +556,7 @@
 	/**
 	 * The method is overridden to compare {@link ScriptEditor} nature with the
 	 * nature of this view.
-	 * 
+	 *
 	 * @see org.eclipse.dltk.ui.infoviews.AbstractInfoView#isValidWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
 	 */
 	@Override
@@ -586,15 +581,15 @@
 
 	/**
 	 * Gets the label for the given member.
-	 * 
+	 *
 	 * @param member
 	 *            the Script member
 	 * @return a string containing the member's label
 	 */
 	private String getInfoText(Object member) {
 		if (member instanceof IModelElement) {
-			return ScriptElementLabels.getDefault().getElementLabel(
-					(IModelElement) member, LABEL_FLAGS);
+			return ScriptElementLabels.getDefault()
+					.getElementLabel((IModelElement) member, LABEL_FLAGS);
 		} else {
 			// TODO
 			return null;
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ProblemMarkerManager.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ProblemMarkerManager.java
index 9928058..d20b148 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ProblemMarkerManager.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ProblemMarkerManager.java
@@ -30,28 +30,31 @@
 import org.eclipse.swt.widgets.Display;
 
 /**
- * Listens to resource deltas and filters for marker changes of type IMarker.PROBLEM
- * Viewers showing error ticks should register as listener to
+ * Listens to resource deltas and filters for marker changes of type
+ * IMarker.PROBLEM Viewers showing error ticks should register as listener to
  * this type.
  */
-public class ProblemMarkerManager implements IResourceChangeListener, IAnnotationModelListener , IAnnotationModelListenerExtension {
+public class ProblemMarkerManager implements IResourceChangeListener,
+		IAnnotationModelListener, IAnnotationModelListenerExtension {
 
 	/**
-	 * Visitors used to look if the element change delta contains a marker change.
+	 * Visitors used to look if the element change delta contains a marker
+	 * change.
 	 */
 	private static class ProjectErrorVisitor implements IResourceDeltaVisitor {
 
 		private HashSet fChangedElements;
 
 		public ProjectErrorVisitor(HashSet changedElements) {
-			fChangedElements= changedElements;
+			fChangedElements = changedElements;
 		}
 
 		@Override
 		public boolean visit(IResourceDelta delta) throws CoreException {
-			IResource res= delta.getResource();
-			if (res instanceof IProject && delta.getKind() == IResourceDelta.CHANGED) {
-				IProject project= (IProject) res;
+			IResource res = delta.getResource();
+			if (res instanceof IProject
+					&& delta.getKind() == IResourceDelta.CHANGED) {
+				IProject project = (IProject) res;
 				if (!project.isAccessible()) {
 					// only track open Java projects
 					return false;
@@ -62,25 +65,31 @@
 		}
 
 		private void checkInvalidate(IResourceDelta delta, IResource resource) {
-			int kind= delta.getKind();
-			if (kind == IResourceDelta.REMOVED || kind == IResourceDelta.ADDED || (kind == IResourceDelta.CHANGED && isErrorDelta(delta))) {
+			int kind = delta.getKind();
+			if (kind == IResourceDelta.REMOVED || kind == IResourceDelta.ADDED
+					|| (kind == IResourceDelta.CHANGED
+							&& isErrorDelta(delta))) {
 				// invalidate the resource and all parents
-				while (resource.getType() != IResource.ROOT && fChangedElements.add(resource)) {
-					resource= resource.getParent();
+				while (resource.getType() != IResource.ROOT
+						&& fChangedElements.add(resource)) {
+					resource = resource.getParent();
 				}
 			}
 		}
 
 		private boolean isErrorDelta(IResourceDelta delta) {
 			if ((delta.getFlags() & IResourceDelta.MARKERS) != 0) {
-				IMarkerDelta[] markerDeltas= delta.getMarkerDeltas();
-				for (int i= 0; i < markerDeltas.length; i++) {
+				IMarkerDelta[] markerDeltas = delta.getMarkerDeltas();
+				for (int i = 0; i < markerDeltas.length; i++) {
 					if (markerDeltas[i].isSubtypeOf(IMarker.PROBLEM)) {
-						int kind= markerDeltas[i].getKind();
-						if (kind == IResourceDelta.ADDED || kind == IResourceDelta.REMOVED)
+						int kind = markerDeltas[i].getKind();
+						if (kind == IResourceDelta.ADDED
+								|| kind == IResourceDelta.REMOVED)
 							return true;
-						int severity= markerDeltas[i].getAttribute(IMarker.SEVERITY, -1);
-						int newSeverity= markerDeltas[i].getMarker().getAttribute(IMarker.SEVERITY, -1);
+						int severity = markerDeltas[i]
+								.getAttribute(IMarker.SEVERITY, -1);
+						int newSeverity = markerDeltas[i].getMarker()
+								.getAttribute(IMarker.SEVERITY, -1);
 						if (newSeverity != severity)
 							return true;
 					}
@@ -90,11 +99,10 @@
 		}
 	}
 
-	private ListenerList fListeners;
-
+	private ListenerList<IProblemChangedListener> fListeners;
 
 	public ProblemMarkerManager() {
-		fListeners= new ListenerList();
+		fListeners = new ListenerList<>();
 	}
 
 	@Override
@@ -102,7 +110,7 @@
 		HashSet<IResource> changedElements = new HashSet<IResource>();
 
 		try {
-			IResourceDelta delta= event.getDelta();
+			IResourceDelta delta = event.getDelta();
 			if (delta != null)
 				delta.accept(new ProjectErrorVisitor(changedElements));
 		} catch (CoreException e) {
@@ -124,22 +132,23 @@
 	@Override
 	public void modelChanged(AnnotationModelEvent event) {
 		if (event instanceof SourceModuleAnnotationModelEvent) {
-			SourceModuleAnnotationModelEvent cuEvent= (SourceModuleAnnotationModelEvent) event;
+			SourceModuleAnnotationModelEvent cuEvent = (SourceModuleAnnotationModelEvent) event;
 			if (cuEvent.includesProblemMarkerAnnotationChanges()) {
-				IResource[] changes= new IResource[] { cuEvent.getUnderlyingResource() };
+				IResource[] changes = new IResource[] {
+						cuEvent.getUnderlyingResource() };
 				fireChanges(changes, false);
 			}
 		}
 	}
 
-
 	/**
 	 * Adds a listener for problem marker changes.
 	 */
 	public void addListener(IProblemChangedListener listener) {
 		if (fListeners.isEmpty()) {
 			DLTKUIPlugin.getWorkspace().addResourceChangeListener(this);
-			DLTKUIPlugin.getDefault().getSourceModuleDocumentProvider().addGlobalAnnotationModelListener(this);
+			DLTKUIPlugin.getDefault().getSourceModuleDocumentProvider()
+					.addGlobalAnnotationModelListener(this);
 		}
 		fListeners.add(listener);
 	}
@@ -151,17 +160,17 @@
 		fListeners.remove(listener);
 		if (fListeners.isEmpty()) {
 			DLTKUIPlugin.getWorkspace().removeResourceChangeListener(this);
-			DLTKUIPlugin.getDefault().getSourceModuleDocumentProvider().removeGlobalAnnotationModelListener(this);
+			DLTKUIPlugin.getDefault().getSourceModuleDocumentProvider()
+					.removeGlobalAnnotationModelListener(this);
 		}
 	}
 
-	private void fireChanges(final IResource[] changes, final boolean isMarkerChange) {
-		Display display= SWTUtil.getStandardDisplay();
+	private void fireChanges(final IResource[] changes,
+			final boolean isMarkerChange) {
+		Display display = SWTUtil.getStandardDisplay();
 		if (display != null && !display.isDisposed()) {
 			display.asyncExec(() -> {
-				Object[] listeners= fListeners.getListeners();
-				for (int i= 0; i < listeners.length; i++) {
-					IProblemChangedListener curr= (IProblemChangedListener) listeners[i];
+				for (IProblemChangedListener curr : fListeners) {
 					curr.problemsChanged(changes, isMarkerChange);
 				}
 			});
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ScriptUILabelProvider.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ScriptUILabelProvider.java
index 4748894..f5c0c28 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ScriptUILabelProvider.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/ScriptUILabelProvider.java
@@ -36,9 +36,11 @@
 import org.eclipse.swt.graphics.ImageData;
 import org.eclipse.swt.graphics.Point;
 
-public class ScriptUILabelProvider implements ILabelProvider, IColorProvider,  IStyledLabelProvider {
+public class ScriptUILabelProvider
+		implements ILabelProvider, IColorProvider, IStyledLabelProvider {
 
-	protected ListenerList fListeners = new ListenerList(1);
+	protected ListenerList<ILabelProviderListener> fListeners = new ListenerList<>(
+			1);
 
 	protected ScriptElementImageProvider fImageLabelProvider;
 
@@ -123,9 +125,8 @@
 					if (ScriptElementImageProvider.useSmallSize(flags)) {
 						result = image;
 					} else {
-						result = getLocalRegistry().get(
-								new BigImageDescriptor(image,
-										ScriptElementImageProvider.BIG_SIZE));
+						result = getLocalRegistry().get(new BigImageDescriptor(
+								image, ScriptElementImageProvider.BIG_SIZE));
 					}
 					break;
 				}
@@ -134,16 +135,15 @@
 		if (result == null) {
 			result = fImageLabelProvider.getImageLabel(element, flags);
 		}
-		if (result == null
-				&& (element instanceof IStorage || element instanceof ISourceModule)) {
+		if (result == null && (element instanceof IStorage
+				|| element instanceof ISourceModule)) {
 			result = fStorageLabelProvider.getImage(element);
 			// StorageLabelProvider always returns 16x16 images
 			// resize if this provider returns big icons
 			if (result != null
 					&& !ScriptElementImageProvider.useSmallSize(flags)) {
-				result = getLocalRegistry().get(
-						new BigImageDescriptor(result,
-								ScriptElementImageProvider.BIG_SIZE));
+				result = getLocalRegistry().get(new BigImageDescriptor(result,
+						ScriptElementImageProvider.BIG_SIZE));
 			}
 		}
 		return decorateImage(result, element);
@@ -292,10 +292,7 @@
 	protected void fireLabelProviderChanged(
 			final LabelProviderChangedEvent event) {
 
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ILabelProviderListener l = (ILabelProviderListener) listeners[i];
-
+		for (final ILabelProviderListener l : fListeners) {
 			SafeRunner.run(new SafeRunnable() {
 				@Override
 				public void run() {
@@ -342,7 +339,8 @@
 		if (providers != null) {
 			for (int i = 0; i < providers.length; i++) {
 				if (providers[i] instanceof IStyledLabelProvider) {
-					StyledString string = ((IStyledLabelProvider) providers[i]).getStyledText(element);
+					StyledString string = ((IStyledLabelProvider) providers[i])
+							.getStyledText(element);
 					if (string != null) {
 						result = string;
 						break;
@@ -357,7 +355,8 @@
 			}
 		}
 		if (result == null) {
-			result = new StyledString(ScriptElementLabels.getDefault().getTextLabel(element, evaluateTextFlags(element)));
+			result = new StyledString(ScriptElementLabels.getDefault()
+					.getTextLabel(element, evaluateTextFlags(element)));
 		}
 
 		if (result.length() == 0 && (element instanceof IStorage)) {
@@ -366,7 +365,8 @@
 
 		String decorated = decorateText(result.getString(), element);
 		if (decorated != null) {
-			return StyledCellLabelProvider.styleDecoratedString(decorated, StyledString.DECORATIONS_STYLER, result);
+			return StyledCellLabelProvider.styleDecoratedString(decorated,
+					StyledString.DECORATIONS_STYLER, result);
 		}
 		return result;
 	}
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionListenerWithASTManager.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionListenerWithASTManager.java
index 3840932..7b980e9 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionListenerWithASTManager.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionListenerWithASTManager.java
@@ -55,7 +55,7 @@
 		private ISelectionListener fPostSelectionListener;
 		private ISelectionChangedListener fSelectionListener;
 		private Job fCurrentJob;
-		protected final ListenerList fAstListeners;
+		protected final ListenerList<ISelectionListenerWithAST> fAstListeners;
 		/**
 		 * Lock to avoid having more than one calculateAndInform job in
 		 * parallel. Only jobs may synchronize on this as otherwise deadlocks
@@ -66,7 +66,7 @@
 		public PartListenerGroup(ITextEditor editorPart) {
 			fPart = editorPart;
 			fCurrentJob = null;
-			fAstListeners = new ListenerList(ListenerList.IDENTITY);
+			fAstListeners = new ListenerList<>(ListenerList.IDENTITY);
 
 			fSelectionListener = event -> {
 				ISelection selection = event.getSelection();
@@ -131,8 +131,8 @@
 		 */
 		public void firePostSelectionChanged(final ITextSelection selection) {
 			cancelJob();
-			IModelElement input = EditorUtility.getEditorInputModelElement(
-					fPart, false);
+			IModelElement input = EditorUtility
+					.getEditorInputModelElement(fPart, false);
 			if (!(input instanceof ISourceModule)) {
 				return;
 			}
@@ -194,21 +194,20 @@
 			}
 		}
 
-		protected final IStatus calculateASTandInform(IProgressMonitor monitor) {
+		protected final IStatus calculateASTandInform(
+				IProgressMonitor monitor) {
 			if (monitor.isCanceled()) {
 				return Status.CANCEL_STATUS;
 			}
 			// create AST
 			try {
-				IModuleDeclaration astRoot = SourceParserUtil
-						.parse(input, null);
+				IModuleDeclaration astRoot = SourceParserUtil.parse(input,
+						null);
 
 				if (astRoot != null && !monitor.isCanceled()) {
-					Object[] listeners = owner.fAstListeners.getListeners();
-					for (int i = 0; i < listeners.length; i++) {
-						((ISelectionListenerWithAST) listeners[i])
-								.selectionChanged(owner.fPart, selection,
-										input, astRoot);
+					for (ISelectionListenerWithAST listener : owner.fAstListeners) {
+						listener.selectionChanged(owner.fPart, selection, input,
+								astRoot);
 						if (monitor.isCanceled()) {
 							return Status.CANCEL_STATUS;
 						}
@@ -236,7 +235,8 @@
 	 * @param listener
 	 *            The listener to register.
 	 */
-	public void addListener(ITextEditor part, ISelectionListenerWithAST listener) {
+	public void addListener(ITextEditor part,
+			ISelectionListenerWithAST listener) {
 		synchronized (this) {
 			PartListenerGroup partListener = fListenerGroups.get(part);
 			if (partListener == null) {
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionProviderMediator.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionProviderMediator.java
index 70dffae..84b0fcb 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionProviderMediator.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/viewsupport/SelectionProviderMediator.java
@@ -22,30 +22,32 @@
 import org.eclipse.swt.widgets.Widget;
 
 /**
- * A selection provider for view parts with more that one viewer.
- * Tracks the focus of the viewers to provide the correct selection.
+ * A selection provider for view parts with more that one viewer. Tracks the
+ * focus of the viewers to provide the correct selection.
  */
 public class SelectionProviderMediator implements IPostSelectionProvider {
 
-	private class InternalListener implements ISelectionChangedListener, FocusListener {
+	private class InternalListener
+			implements ISelectionChangedListener, FocusListener {
 		@Override
 		public void selectionChanged(SelectionChangedEvent event) {
 			doSelectionChanged(event);
 		}
 
-	    @Override
+		@Override
 		public void focusGained(FocusEvent e) {
-	    	doFocusChanged(e.widget);
-	    }
+			doFocusChanged(e.widget);
+		}
 
-	    @Override
+		@Override
 		public void focusLost(FocusEvent e) {
-	    	// do not reset due to focus behavior on GTK
-	    	//fViewerInFocus= null;
-	    }
+			// do not reset due to focus behavior on GTK
+			// fViewerInFocus= null;
+		}
 	}
 
-	private class InternalPostSelectionListener implements ISelectionChangedListener {
+	private class InternalPostSelectionListener
+			implements ISelectionChangedListener {
 		@Override
 		public void selectionChanged(SelectionChangedEvent event) {
 			doPostSelectionChanged(event);
@@ -56,31 +58,35 @@
 	private StructuredViewer[] fViewers;
 
 	private StructuredViewer fViewerInFocus;
-	private ListenerList fSelectionChangedListeners;
-	private ListenerList fPostSelectionChangedListeners;
+	private ListenerList<ISelectionChangedListener> fSelectionChangedListeners;
+	private ListenerList<ISelectionChangedListener> fPostSelectionChangedListeners;
 
 	/**
-	 * @param viewers All viewers that can provide a selection
-	 * @param viewerInFocus the viewer currently in focus or <code>null</code>
+	 * @param viewers
+	 *            All viewers that can provide a selection
+	 * @param viewerInFocus
+	 *            the viewer currently in focus or <code>null</code>
 	 */
-	public SelectionProviderMediator(StructuredViewer[] viewers, StructuredViewer viewerInFocus) {
-		fViewers= viewers;
-		InternalListener listener= new InternalListener();
-		fSelectionChangedListeners= new ListenerList();
-		fPostSelectionChangedListeners= new ListenerList();
-		fViewerInFocus= viewerInFocus;
+	public SelectionProviderMediator(StructuredViewer[] viewers,
+			StructuredViewer viewerInFocus) {
+		fViewers = viewers;
+		InternalListener listener = new InternalListener();
+		fSelectionChangedListeners = new ListenerList<>();
+		fPostSelectionChangedListeners = new ListenerList<>();
+		fViewerInFocus = viewerInFocus;
 
-		for (int i= 0; i < fViewers.length; i++) {
-			StructuredViewer viewer= fViewers[i];
+		for (int i = 0; i < fViewers.length; i++) {
+			StructuredViewer viewer = fViewers[i];
 			viewer.addSelectionChangedListener(listener);
-			viewer.addPostSelectionChangedListener(new InternalPostSelectionListener());
-			Control control= viewer.getControl();
+			viewer.addPostSelectionChangedListener(
+					new InternalPostSelectionListener());
+			Control control = viewer.getControl();
 			control.addFocusListener(listener);
 		}
 	}
 
 	private void doFocusChanged(Widget control) {
-		for (int i= 0; i < fViewers.length; i++) {
+		for (int i = 0; i < fViewers.length; i++) {
 			if (fViewers[i].getControl() == control) {
 				propagateFocusChanged(fViewers[i]);
 				return;
@@ -89,14 +95,14 @@
 	}
 
 	final void doPostSelectionChanged(SelectionChangedEvent event) {
-		ISelectionProvider provider= event.getSelectionProvider();
+		ISelectionProvider provider = event.getSelectionProvider();
 		if (provider == fViewerInFocus) {
 			firePostSelectionChanged();
 		}
 	}
 
 	final void doSelectionChanged(SelectionChangedEvent event) {
-		ISelectionProvider provider= event.getSelectionProvider();
+		ISelectionProvider provider = event.getSelectionProvider();
 		if (provider == fViewerInFocus) {
 			fireSelectionChanged();
 		}
@@ -104,7 +110,7 @@
 
 	final void propagateFocusChanged(StructuredViewer viewer) {
 		if (viewer != fViewerInFocus) { // OK to compare by identity
-			fViewerInFocus= viewer;
+			fViewerInFocus = viewer;
 			fireSelectionChanged();
 			firePostSelectionChanged();
 		}
@@ -112,11 +118,10 @@
 
 	private void fireSelectionChanged() {
 		if (fSelectionChangedListeners != null) {
-			SelectionChangedEvent event= new SelectionChangedEvent(this, getSelection());
+			SelectionChangedEvent event = new SelectionChangedEvent(this,
+					getSelection());
 
-			Object[] listeners= fSelectionChangedListeners.getListeners();
-			for (int i= 0; i < listeners.length; i++) {
-				ISelectionChangedListener listener= (ISelectionChangedListener) listeners[i];
+			for (ISelectionChangedListener listener : fSelectionChangedListeners) {
 				listener.selectionChanged(event);
 			}
 		}
@@ -124,34 +129,36 @@
 
 	private void firePostSelectionChanged() {
 		if (fPostSelectionChangedListeners != null) {
-			SelectionChangedEvent event= new SelectionChangedEvent(this, getSelection());
+			SelectionChangedEvent event = new SelectionChangedEvent(this,
+					getSelection());
 
-			Object[] listeners= fPostSelectionChangedListeners.getListeners();
-			for (int i= 0; i < listeners.length; i++) {
-				ISelectionChangedListener listener= (ISelectionChangedListener) listeners[i];
+			for (ISelectionChangedListener listener : fPostSelectionChangedListeners) {
 				listener.selectionChanged(event);
 			}
 		}
 	}
 
 	@Override
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+	public void addSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fSelectionChangedListeners.add(listener);
 	}
 
 	@Override
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+	public void removeSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fSelectionChangedListeners.remove(listener);
 	}
 
 	@Override
-	public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+	public void addPostSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fPostSelectionChangedListeners.add(listener);
 	}
 
-
 	@Override
-	public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+	public void removePostSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		fPostSelectionChangedListeners.remove(listener);
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/wizards/NewSourceModuleWizard.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/wizards/NewSourceModuleWizard.java
index b418362..8e95505 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/wizards/NewSourceModuleWizard.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/wizards/NewSourceModuleWizard.java
@@ -35,11 +35,11 @@
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.PartInitException;
 
-public abstract class NewSourceModuleWizard extends NewElementWizard implements
-		ISourceModuleWizard {
+public abstract class NewSourceModuleWizard extends NewElementWizard
+		implements ISourceModuleWizard {
 
-	static class WizardExtensionManager extends
-			LazyExtensionManager<ISourceModuleWizardExtension> {
+	static class WizardExtensionManager
+			extends LazyExtensionManager<ISourceModuleWizardExtension> {
 
 		static final String EXTENSION_POINT = DLTKUIPlugin.PLUGIN_ID
 				+ ".sourceModuleWizardExtension"; //$NON-NLS-1$
@@ -85,8 +85,8 @@
 	}
 
 	private void createExtensions() {
-		final WizardExtensionManager manager = new WizardExtensionManager(page
-				.getRequiredNature());
+		final WizardExtensionManager manager = new WizardExtensionManager(
+				page.getRequiredNature());
 		for (Descriptor<ISourceModuleWizardExtension> descriptor : manager
 				.getDescriptors()) {
 			final ISourceModuleWizardExtension extension = descriptor.get();
@@ -246,7 +246,7 @@
 		return !disabledModes.contains(mode);
 	}
 
-	private Map<String, ListenerList> listeners = null;
+	private Map<String, ListenerList<IFieldChangeListener>> listeners = null;
 
 	/**
 	 * @since 2.0
@@ -255,11 +255,11 @@
 	public void addFieldChangeListener(String field,
 			IFieldChangeListener listener) {
 		if (listeners == null) {
-			listeners = new HashMap<String, ListenerList>();
+			listeners = new HashMap<String, ListenerList<IFieldChangeListener>>();
 		}
-		ListenerList list = listeners.get(field);
+		ListenerList<IFieldChangeListener> list = listeners.get(field);
 		if (list == null) {
-			list = new ListenerList();
+			list = new ListenerList<>();
 			listeners.put(field, list);
 		}
 		list.add(listener);
@@ -272,7 +272,8 @@
 	public void removeFieldChangeListener(String field,
 			IFieldChangeListener listener) {
 		if (listeners != null) {
-			final ListenerList list = listeners.get(field);
+			final ListenerList<IFieldChangeListener> list = listeners
+					.get(field);
 			if (list != null) {
 				list.remove(listener);
 				if (list.isEmpty()) {
@@ -284,11 +285,12 @@
 
 	void fireFieldChange(String field) {
 		if (listeners != null) {
-			final ListenerList list = listeners.get(field);
+			final ListenerList<IFieldChangeListener> list = listeners
+					.get(field);
 			if (list != null) {
-				for (Object listener : list.getListeners()) {
+				for (IFieldChangeListener listener : list) {
 					if (listener instanceof IFieldChangeListener) {
-						((IFieldChangeListener) listener).fieldChanged();
+						listener.fieldChanged();
 					}
 				}
 			}
