diff --git a/org.eclipse.core.externaltools/pom.xml b/org.eclipse.core.externaltools/pom.xml
index 02caa34cfebc9f8400102042433a2df56a009d95..1dcab250a89e226ffdd9f9612ab21d17ed5de3e1 100644
--- a/org.eclipse.core.externaltools/pom.xml
+++ b/org.eclipse.core.externaltools/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.core</groupId>
   <artifactId>org.eclipse.core.externaltools</artifactId>
diff --git a/org.eclipse.core.variables/pom.xml b/org.eclipse.core.variables/pom.xml
index 7fbd58886b7c72aac190745af9685de7298effd0..397d8f91651f4b055d8063060332ae9e8c1bf224 100644
--- a/org.eclipse.core.variables/pom.xml
+++ b/org.eclipse.core.variables/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.core</groupId>
   <artifactId>org.eclipse.core.variables</artifactId>
diff --git a/org.eclipse.debug.core/META-INF/MANIFEST.MF b/org.eclipse.debug.core/META-INF/MANIFEST.MF
index 9e15c244fa2462638f61b769e4fbf6ae3e33afda..480148cba9aa4278d06e9c66b0acd750446e4ba2 100644
--- a/org.eclipse.debug.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.debug.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.debug.core; singleton:=true
-Bundle-Version: 3.15.100.qualifier
+Bundle-Version: 3.16.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.debug.core.DebugPlugin
 Bundle-Vendor: %providerName
@@ -12,7 +12,7 @@ Export-Package: org.eclipse.debug.core,
  org.eclipse.debug.core.model,
  org.eclipse.debug.core.sourcelookup,
  org.eclipse.debug.core.sourcelookup.containers,
- org.eclipse.debug.internal.core;x-friends:="org.eclipse.debug.ui,org.eclipse.debug.tests,org.eclipse.debug.examples.mixedmode,org.eclipse.jdt.launching",
+ org.eclipse.debug.internal.core;x-friends:="org.eclipse.debug.ui,org.eclipse.debug.tests,org.eclipse.debug.examples.mixedmode,org.eclipse.jdt.launching,org.eclipse.ui.console",
  org.eclipse.debug.internal.core.commands;x-friends:="org.eclipse.debug.ui",
  org.eclipse.debug.internal.core.groups;x-friends:="org.eclipse.debug.ui",
  org.eclipse.debug.internal.core.groups.observer;x-internal:=true,
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBinaryStreamListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBinaryStreamListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..b21697abe5496ee6a5da2cdca07d3a0fe425e83e
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBinaryStreamListener.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.core;
+
+import org.eclipse.debug.core.model.IBinaryStreamMonitor;
+
+/**
+ * A stream listener is notified of changes to a binary stream monitor.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ *
+ * @see IBinaryStreamMonitor
+ * @see IStreamListener
+ * @since 3.16
+ */
+public interface IBinaryStreamListener {
+
+	/**
+	 * Notifies this listener that data has been appended to the given stream
+	 * monitor.
+	 *
+	 * @param data the content appended; not <code>null</code>
+	 * @param monitor the stream monitor to which content was appended
+	 */
+	void streamAppended(byte[] data, IBinaryStreamMonitor monitor);
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamMonitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fe05444b71428bd282c380b0a101fc92fbfcd25
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamMonitor.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.core.model;
+
+import org.eclipse.debug.core.IBinaryStreamListener;
+
+/**
+ * A variant of {@link IStreamMonitor} which does not touch the received content
+ * and pass it as bytes instead of strings.
+ * <p>
+ * A stream monitor manages the contents of the stream a process is writing to,
+ * and notifies registered listeners of changes in the stream.
+ * </p>
+ * <p>
+ * Clients may implement this interface. Generally, a client that provides an
+ * implementation of the {@link IBinaryStreamsProxy} interface must also provide
+ * an implementation of this interface.
+ * </p>
+ *
+ * @see org.eclipse.debug.core.model.IStreamsProxy
+ * @see org.eclipse.debug.core.model.IFlushableStreamMonitor
+ * @since 3.16
+ */
+public interface IBinaryStreamMonitor extends IFlushableStreamMonitor {
+	/**
+	 * Adds the given listener to this stream monitor's registered listeners.
+	 * Has no effect if an identical listener is already registered.
+	 *
+	 * @param listener the listener to add
+	 */
+	void addBinaryListener(IBinaryStreamListener listener);
+
+	/**
+	 * Returns the entire current contents of the stream. An empty array is
+	 * returned if the stream is empty.
+	 * <p>
+	 * Note: the current content is influenced by the buffering mechanism.
+	 * </p>
+	 *
+	 * @return the stream contents as array
+	 * @see #isBuffered()
+	 * @see #flushContents()
+	 */
+	byte[] getData();
+
+	/**
+	 * Removes the given listener from this stream monitor's registered listeners.
+	 * Has no effect if the listener is not already registered.
+	 *
+	 * @param listener the listener to remove
+	 */
+	void removeBinaryListener(IBinaryStreamListener listener);
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamsProxy.java
new file mode 100644
index 0000000000000000000000000000000000000000..d355e26c73a45bf8069ad9701a5abcffb5d47794
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamsProxy.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.core.model;
+
+import java.io.IOException;
+
+/**
+ * A variant of {@link IStreamsProxy} which does not touch the proxied content
+ * and pass it as bytes instead of strings.
+ * <p>
+ * A streams proxy acts as proxy between the streams of a process and interested
+ * clients. This abstraction allows implementations of <code>IProcess</code> to
+ * handle I/O related to the standard input, output, and error streams
+ * associated with a process.
+ * </p>
+ * <p>
+ * Clients implementing the <code>IProcess</code> interface for a process which
+ * produce or consumes binary content should consider to implement this
+ * interface instead of just {@link IStreamsProxy}.
+ * </p>
+ *
+ * @see IProcess
+ * @see IStreamsProxy
+ * @since 3.16
+ */
+public interface IBinaryStreamsProxy extends IStreamsProxy2 {
+	/**
+	 * Returns a monitor for the error stream of this proxy's process, or
+	 * <code>null</code> if not supported.
+	 * <p>
+	 * The monitor is connected to the error stream of the associated process.
+	 * </p>
+	 * <p>
+	 * In contrast to {@link #getErrorStreamMonitor()} which will decode the
+	 * stream content to strings, the {@link IBinaryStreamMonitor} will provide
+	 * the raw stream data.
+	 * </p>
+	 *
+	 * @return an error stream monitor, or <code>null</code> if none
+	 */
+	IBinaryStreamMonitor getBinaryErrorStreamMonitor();
+
+	/**
+	 * Returns a monitor for the output stream of this proxy's process, or
+	 * <code>null</code> if not supported.
+	 * <p>
+	 * The monitor is connected to the output stream of the associated process.
+	 * </p>
+	 * <p>
+	 * In contrast to {@link #getOutputStreamMonitor()} which will decode the
+	 * stream content to strings, the {@link IBinaryStreamMonitor} will provide
+	 * the raw stream data.
+	 * </p>
+	 *
+	 * @return an output stream monitor, or <code>null</code> if none
+	 */
+	IBinaryStreamMonitor getBinaryOutputStreamMonitor();
+
+	/**
+	 * Writes the given data to the output stream connected to the standard
+	 * input stream of this proxy's process.
+	 *
+	 * @param data the data to be written
+	 * @exception IOException when an error occurs writing to the underlying
+	 *                <code>OutputStream</code>.
+	 */
+	default void write(byte[] data) throws IOException {
+		write(data, 0, data.length);
+	}
+
+	/**
+	 * Writes the given data to the output stream connected to the standard
+	 * input stream of this proxy's process.
+	 *
+	 * @param data the data to be written
+	 * @param offset start offset in the data
+	 * @param length number of bytes to write
+	 * @exception IOException when an error occurs writing to the underlying
+	 *                <code>OutputStream</code>.
+	 */
+	void write(byte[] data, int offset, int length) throws IOException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java
index a0e5f832e20a664abb76997851be08ce80c92e4e..5272b58f92ebfd51361417939733a42065c98835 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java
@@ -43,12 +43,12 @@ import org.eclipse.debug.core.DebugPlugin;
  *      markerType="com.example.BreakpointMarker"&gt;
  *   &lt;/breakpoint&gt;
  * &lt;/extension&gt;
- * &lt;extension point="org.eclipse.core.resources.markers"&gt;
- *   &lt;marker
+ * &lt;extension
+ *      point="org.eclipse.core.resources.markers"
  *      id="com.example.BreakpointMarker"
- *      super type="org.eclipse.debug.core.breakpointMarker"
- *      attribute name ="exampleAttribute"&gt;
- *   &lt;/marker&gt;
+ *      name="Example Breakpoint"&gt;
+ *   &lt;super type="org.eclipse.debug.core.breakpointMarker"/&gt;
+ *   &lt;attribute name="exampleAttribute"/&gt;
  * &lt;/extension&gt;
  * </pre>
  * <p>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java
index e0c309ac5b0f67c32ea439540c55228a68cc33b1..651fbf5aea90d786fef352e4388cbaf2e524c307 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java
@@ -22,6 +22,8 @@ package org.eclipse.debug.core.model;
  * Clients may implement this interface.
  * </p>
  * @since 2.1
+ * @see IStreamMonitor
+ * @see IBinaryStreamMonitor
  */
 public interface IFlushableStreamMonitor extends IStreamMonitor {
 
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java
index aa26d7acbdad86f71a508b72d87ba3fee3503216..8a5677e375243e7ce123bec9314d8ee48cd7f8b1 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java
@@ -27,6 +27,7 @@ import org.eclipse.debug.core.IStreamListener;
  * </p>
  * @see org.eclipse.debug.core.model.IStreamsProxy
  * @see org.eclipse.debug.core.model.IFlushableStreamMonitor
+ * @see org.eclipse.debug.core.model.IBinaryStreamMonitor
  */
 public interface IStreamMonitor {
 	/**
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java
index 83e5755b25a1d5f841c2a5cbc834d55629842d33..72d00a2fb9e22a99c8a4b64a24f1ba946551fb87 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java
@@ -27,6 +27,7 @@ import java.io.IOException;
  * provide an implementation of this interface.
  * </p>
  * @see IProcess
+ * @see IBinaryStreamsProxy
  */
 public interface IStreamsProxy {
 	/**
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
index db02ab6494fce7a985fd8efcaf7f651599649e26..6d8539d66de607acad99300694644dcaeb1d83f2 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
@@ -763,7 +763,7 @@ public class BreakpointManager implements IBreakpointManager, IResourceChangeLis
 						}
 					};
 					getWorkspace().run(runnable, null, 0, null);
-					addBreakpoints(fAdded.toArray(new IBreakpoint[fAdded.size()]), false);
+					addBreakpoints(fAdded.toArray(new IBreakpoint[fAdded.size()]), true);
 				} catch (CoreException e) {
 					DebugPlugin.log(e);
 				}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
index ef77a06102c9cce054f77742370d1b1d77bef962..7ed21a6eaf840a2ac370f6dd2425e09ab19f1dcc 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Paul Pazderski  - Bug 558463: add handling of raw stream content instead of strings
  *******************************************************************************/
 package org.eclipse.debug.internal.core;
 
@@ -22,11 +23,10 @@ import java.util.Vector;
 import org.eclipse.debug.core.DebugPlugin;
 
 /**
- * Writes to the input stream of a system process,
- * queueing output if the stream is blocked.
+ * Writes to the input stream of a system process, queuing output if the stream
+ * is blocked.
  *
- * The input stream monitor writes to system in via
- * an output stream.
+ * The input stream monitor writes to system in via an output stream.
  */
 public class InputStreamMonitor {
 
@@ -34,14 +34,17 @@ public class InputStreamMonitor {
 	 * The stream which is being written to (connected to system in).
 	 */
 	private OutputStream fStream;
+
 	/**
 	 * The queue of output.
 	 */
-	private Vector<String> fQueue;
+	private Vector<byte[]> fQueue;
+
 	/**
 	 * The thread which writes to the stream.
 	 */
 	private Thread fThread;
+
 	/**
 	 * A lock for ensuring that writes to the queue are contiguous
 	 */
@@ -101,8 +104,25 @@ public class InputStreamMonitor {
 	 * @param text text to append
 	 */
 	public void write(String text) {
-		synchronized(fLock) {
-			fQueue.add(text);
+		synchronized (fLock) {
+			fQueue.add(fCharset == null ? text.getBytes() : text.getBytes(fCharset));
+			fLock.notifyAll();
+		}
+	}
+
+	/**
+	 * Appends the given binary data to the stream, or queues the text to be
+	 * written at a later time if the stream is blocked.
+	 *
+	 * @param data data to append; not <code>null</code>
+	 * @param offset start offset in data
+	 * @param length number of bytes in data
+	 */
+	public void write(byte[] data, int offset, int length) {
+		synchronized (fLock) {
+			byte[] copy = new byte[length];
+			System.arraycopy(data, offset, copy, 0, length);
+			fQueue.add(copy);
 			fLock.notifyAll();
 		}
 	}
@@ -151,14 +171,10 @@ public class InputStreamMonitor {
 	 */
 	protected void writeNext() {
 		while (!fQueue.isEmpty() && !fClosed) {
-			String text = fQueue.firstElement();
+			byte[] data = fQueue.firstElement();
 			fQueue.removeElementAt(0);
 			try {
-				if (fCharset != null) {
-					fStream.write(text.getBytes(fCharset));
-				} else {
-					fStream.write(text.getBytes());
-				}
+				fStream.write(data);
 				fStream.flush();
 			} catch (IOException e) {
 				DebugPlugin.log(e);
@@ -180,7 +196,8 @@ public class InputStreamMonitor {
 	 * Closes the output stream attached to the standard input stream of this
 	 * monitor's process.
 	 *
-	 * @exception IOException if an exception occurs closing the input stream
+	 * @exception IOException if an exception occurs closing the input stream or
+	 *                stream is already closed
 	 */
 	public void closeInputStream() throws IOException {
 		if (!fClosed) {
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
index 1a193b812e24bf57e4107e5f0f2677587c7caec5..cf60a2d752ddd2466e7742a965a3688c3245a30e 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
@@ -987,7 +987,7 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
 
 	/*
 	 * Get Preferred delegate with all fallbacks
-	 * 
+	 *
 	 */
 	public ILaunchConfigurationDelegate getPreferredLaunchDelegate(String mode) throws CoreException {
 		Set<String> modes = getModes();
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
index 9b4d8dc9f48bd8e87b1ba3245b4dae0e5d7fff20..9f460fdc15af1de8e2f2ea574f366ad00e7d22b0 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
@@ -896,7 +896,7 @@ public class LaunchConfigurationInfo {
 			String strAttr1 = null;
 			String strAttr2 = null;
 			if (fgIsSun14x) {
-				if(attr2 instanceof String & attr1 instanceof String) {
+				if(attr2 instanceof String && attr1 instanceof String) {
 					// this is a hack for bug 110215, on SUN 1.4.x, \r
 					// is stripped off when the stream is written to the
 					// DOM
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
index 92676174825f92bdf9ae572eebee68bdcb823b3a..ad5ac42457384d0fcd23847e355f94e505dfc906 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
@@ -1630,7 +1630,7 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
 						LaunchDelegate delegate = getLaunchDelegateExtension(typeid, delegateid, modeset);
 						if (delegate != null) {
 							//take type id, modeset, delegate and create entry
-							if(!IInternalDebugCoreConstants.EMPTY_STRING.equals(typeid) & modeset != null) {
+							if(!IInternalDebugCoreConstants.EMPTY_STRING.equals(typeid) && modeset != null) {
 								fPreferredDelegates.add(new PreferredDelegate(delegate, typeid, modeset));
 							}
 						}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java
index 0bbcdf62ec7539e52491ee7d1f3b55ce2178bfe9..494a9c2970a0d2abfe1cbc308dd9232aeabf7a35 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -16,11 +16,13 @@ package org.eclipse.debug.internal.core;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.eclipse.debug.core.IBinaryStreamListener;
 import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IBinaryStreamMonitor;
+import org.eclipse.debug.core.model.IBinaryStreamsProxy;
 import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.debug.core.model.IStreamsProxy2;
 
-public class NullStreamsProxy implements IStreamsProxy2 {
+public class NullStreamsProxy implements IBinaryStreamsProxy {
 	private NullStreamMonitor outputStreamMonitor;
 	private NullStreamMonitor errorStreamMonitor;
 
@@ -48,7 +50,21 @@ public class NullStreamsProxy implements IStreamsProxy2 {
 	public void write(String input) throws IOException {
 	}
 
-	private class NullStreamMonitor implements IStreamMonitor {
+	@Override
+	public IBinaryStreamMonitor getBinaryErrorStreamMonitor() {
+		return errorStreamMonitor;
+	}
+
+	@Override
+	public IBinaryStreamMonitor getBinaryOutputStreamMonitor() {
+		return outputStreamMonitor;
+	}
+
+	@Override
+	public void write(byte[] data, int offset, int length) throws IOException {
+	}
+
+	private class NullStreamMonitor implements IBinaryStreamMonitor {
 		private InputStream fStream;
 
 		public NullStreamMonitor(InputStream stream) {
@@ -80,8 +96,34 @@ public class NullStreamsProxy implements IStreamsProxy2 {
 			return ""; //$NON-NLS-1$
 		}
 
+		@Override
+		public void flushContents() {
+		}
+
+		@Override
+		public void setBuffered(boolean buffer) {
+		}
+
+		@Override
+		public boolean isBuffered() {
+			return false;
+		}
+
 		@Override
 		public void removeListener(IStreamListener listener) {
 		}
+
+		@Override
+		public void addBinaryListener(IBinaryStreamListener listener) {
+		}
+
+		@Override
+		public byte[] getData() {
+			return new byte[0];
+		}
+
+		@Override
+		public void removeBinaryListener(IBinaryStreamListener listener) {
+		}
 	}
 }
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
index 4c64c2654981f729f8d049d88718cff20c50b275..916858aab7c2c6d44cdfd4952ce05acb023461ed 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -11,13 +11,14 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Paul Pazderski  - Bug 545769: fixed rare UTF-8 character corruption bug
+ *     Paul Pazderski  - Bug 558463: add handling of raw stream content instead of strings
  *******************************************************************************/
 package org.eclipse.debug.internal.core;
 
 import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.nio.charset.Charset;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -25,58 +26,69 @@ import org.eclipse.core.runtime.ISafeRunnable;
 import org.eclipse.core.runtime.ListenerList;
 import org.eclipse.core.runtime.SafeRunner;
 import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBinaryStreamListener;
 import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IFlushableStreamMonitor;
+import org.eclipse.debug.core.model.IBinaryStreamMonitor;
 
 /**
- * Monitors the output stream of a system process and notifies
- * listeners of additions to the stream.
- *
- * The output stream monitor reads system out (or err) via
- * and input stream.
+ * Monitors the output stream of a system process and notifies listeners of
+ * additions to the stream.
+ * <p>
+ * The output stream monitor reads system out (or err) via and input stream.
  */
-public class OutputStreamMonitor implements IFlushableStreamMonitor {
+public class OutputStreamMonitor implements IBinaryStreamMonitor {
+	/**
+	 * The size of the read buffer.
+	 */
+	private static final int BUFFER_SIZE = 8192;
+
 	/**
 	 * The stream being monitored (connected system out or err).
 	 */
 	private InputStream fStream;
 
 	/**
-	 * A collection of listeners
+	 * A collection of listeners interested in decoded content.
 	 */
 	private ListenerList<IStreamListener> fListeners = new ListenerList<>();
 
 	/**
-	 * Whether content is being buffered
+	 * A collection of listeners interested in the raw content.
 	 */
-	private boolean fBuffered = true;
+	private ListenerList<IBinaryStreamListener> fBinaryListeners = new ListenerList<>();
 
 	/**
-	 * The local copy of the stream contents
+	 * The buffered stream content since last flush. Value of <code>null</code>
+	 * indicates disabled buffering.
+	 *
+	 * @see #isBuffered()
 	 */
-	private StringBuilder fContents;
+	private ByteArrayOutputStream fContents;
 
 	/**
-	 * The thread which reads from the stream
+	 * Decoder used for the buffered content. This is required to keep the state
+	 * of an incomplete character.
 	 */
-	private Thread fThread;
+	private StreamDecoder fBufferedDecoder;
+	private String fCachedDecodedContents;
 
 	/**
-	 * The size of the read buffer
+	 * The thread which reads from the stream
 	 */
-	private static final int BUFFER_SIZE= 8192;
+	private Thread fThread;
 
 	/**
-	 * Whether or not this monitor has been killed.
-	 * When the monitor is killed, it stops reading
-	 * from the stream immediately.
+	 * Whether or not this monitor has been killed. When the monitor is killed,
+	 * it stops reading from the stream immediately.
 	 */
-	private boolean fKilled= false;
+	private boolean fKilled = false;
 
 	private long lastSleep;
 
 	private Charset fCharset;
 
+	private StreamDecoder fDecoder;
+
 	private final AtomicBoolean fDone;
 
 	/**
@@ -84,13 +96,15 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
 	 * out or err).
 	 *
 	 * @param stream input stream to read from
-	 * @param charset stream charset or <code>null</code> for system default
+	 * @param charset stream charset or <code>null</code> for system default;
+	 *            unused if only the binary interface is used
 	 */
 	public OutputStreamMonitor(InputStream stream, Charset charset) {
 		fStream = new BufferedInputStream(stream, 8192);
 		fCharset = charset;
-		fContents= new StringBuilder();
+		fDecoder = new StreamDecoder(charset == null ? Charset.defaultCharset() : charset);
 		fDone = new AtomicBoolean(false);
+		setBuffered(true);
 	}
 
 	/**
@@ -112,35 +126,97 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
 		fListeners.add(listener);
 	}
 
+	@Override
+	public synchronized void addBinaryListener(IBinaryStreamListener listener) {
+		fBinaryListeners.add(listener);
+	}
+
 	/**
-	 * Causes the monitor to close all
-	 * communications between it and the
+	 * Causes the monitor to close all communications between it and the
 	 * underlying stream by waiting for the thread to terminate.
 	 */
 	protected void close() {
 		if (fThread != null) {
-			Thread thread= fThread;
-			fThread= null;
+			Thread thread = fThread;
+			fThread = null;
 			try {
 				thread.join();
 			} catch (InterruptedException ie) {
 			}
 			fListeners = new ListenerList<>();
+			fBinaryListeners = new ListenerList<>();
 		}
 	}
 
 	/**
-	 * Notifies the listeners that text has
-	 * been appended to the stream.
-	 * @param text the text that was appended to the stream
+	 * Notifies the listeners that content has been appended to the stream. Will
+	 * notify both, binary and text listeners.
+	 *
+	 * @param data that has been appended; not <code>null</code>
+	 * @param offset start of valid data
+	 * @param length number of valid bytes
 	 */
-	private void fireStreamAppended(String text) {
-		getNotifier().notifyAppend(text);
+	private void fireStreamAppended(final byte[] data, int offset, int length) {
+		if (!fListeners.isEmpty()) {
+			StringBuilder sb = new StringBuilder();
+			fDecoder.decode(sb, data, offset, length);
+			final String text = sb.toString();
+			for (final IStreamListener listener : fListeners) {
+				SafeRunner.run(new ISafeRunnable() {
+					@Override
+					public void run() throws Exception {
+						listener.streamAppended(text, OutputStreamMonitor.this);
+					}
+
+					@Override
+					public void handleException(Throwable exception) {
+						DebugPlugin.log(exception);
+					}
+				});
+			}
+		}
+		if (!fBinaryListeners.isEmpty()) {
+			final byte[] validData;
+			if (offset > 0 || length < data.length) {
+				validData = new byte[length];
+				System.arraycopy(data, offset, validData, 0, length);
+			} else {
+				validData = data;
+			}
+			for (final IBinaryStreamListener listener : fBinaryListeners) {
+				SafeRunner.run(new ISafeRunnable() {
+					@Override
+					public void run() throws Exception {
+						listener.streamAppended(validData, OutputStreamMonitor.this);
+					}
+
+					@Override
+					public void handleException(Throwable exception) {
+						DebugPlugin.log(exception);
+					}
+				});
+			}
+		}
 	}
 
 	@Override
 	public synchronized String getContents() {
-		return fContents.toString();
+		if (!isBuffered()) {
+			return ""; //$NON-NLS-1$
+		}
+		if (fCachedDecodedContents != null) {
+			return fCachedDecodedContents;
+		}
+		StringBuilder sb = new StringBuilder();
+		byte[] data = getData();
+		fBufferedDecoder.decode(sb, data, 0, data.length);
+		fCachedDecodedContents = sb.toString();
+		return fCachedDecodedContents;
+	}
+
+	@Override
+	public synchronized byte[] getData() {
+		return isBuffered() ? fContents.toByteArray() : new byte[0];
 	}
 
 	private void read() {
@@ -154,30 +230,29 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
 	/**
 	 * Continually reads from the stream.
 	 * <p>
-	 * This method, along with the <code>startReading</code>
-	 * method is used to allow <code>OutputStreamMonitor</code>
-	 * to implement <code>Runnable</code> without publicly
-	 * exposing a <code>run</code> method.
+	 * This method, along with the {@link #startMonitoring()} method is used to
+	 * allow {@link OutputStreamMonitor} to implement {@link Runnable} without
+	 * publicly exposing a {@link Runnable#run()} method.
 	 */
 	private void internalRead() {
 		lastSleep = System.currentTimeMillis();
 		long currentTime = lastSleep;
-		char[] chars = new char[BUFFER_SIZE];
+		byte[] buffer = new byte[BUFFER_SIZE];
 		int read = 0;
-		try (InputStreamReader reader = (fCharset == null ? new InputStreamReader(fStream) : new InputStreamReader(fStream, fCharset))) {
+		try {
 			while (read >= 0) {
 				try {
 					if (fKilled) {
 						break;
 					}
-					read = reader.read(chars);
+					read = fStream.read(buffer);
 					if (read > 0) {
-						String text = new String(chars, 0, read);
 						synchronized (this) {
 							if (isBuffered()) {
-								fContents.append(text);
+								fCachedDecodedContents = null;
+								fContents.write(buffer, 0, read);
 							}
-							fireStreamAppended(text);
+							fireStreamAppended(buffer, 0, read);
 						}
 					}
 				} catch (IOException ioe) {
@@ -204,13 +279,17 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
 					}
 				}
 			}
-		} catch (IOException e) {
-			DebugPlugin.log(e);
+		} finally {
+			try {
+				fStream.close();
+			} catch (IOException e) {
+				DebugPlugin.log(e);
+			}
 		}
 	}
 
 	protected void kill() {
-		fKilled= true;
+		fKilled = true;
 	}
 
 	@Override
@@ -218,6 +297,11 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
 		fListeners.remove(listener);
 	}
 
+	@Override
+	public synchronized void removeBinaryListener(IBinaryStreamListener listener) {
+		fBinaryListeners.remove(listener);
+	}
+
 	/**
 	 * Starts a thread which reads from the stream
 	 */
@@ -233,57 +317,37 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
 
 	@Override
 	public synchronized void setBuffered(boolean buffer) {
-		fBuffered = buffer;
+		if (isBuffered() != buffer) {
+			fCachedDecodedContents = null;
+			if (buffer) {
+				fContents = new ByteArrayOutputStream();
+				fBufferedDecoder = new StreamDecoder(fCharset == null ? Charset.defaultCharset() : fCharset);
+			} else {
+				fContents = null;
+				fBufferedDecoder = null;
+			}
+		}
 	}
 
 	@Override
 	public synchronized void flushContents() {
-		fContents.setLength(0);
+		if (isBuffered()) {
+			fCachedDecodedContents = null;
+			fContents.reset();
+		}
 	}
 
 	@Override
 	public synchronized boolean isBuffered() {
-		return fBuffered;
-	}
-
-	private ContentNotifier getNotifier() {
-		return new ContentNotifier();
+		return fContents != null;
 	}
 
 	/**
 	 * @return {@code true} if reading the underlying stream is done.
-	 *         {@code false} if reading the stream has not started or is not done.
+	 *         {@code false} if reading the stream has not started or is not
+	 *         done.
 	 */
 	public boolean isReadingDone() {
 		return fDone.get();
 	}
-
-	class ContentNotifier implements ISafeRunnable {
-
-		private IStreamListener fListener;
-		private String fText;
-
-		@Override
-		public void handleException(Throwable exception) {
-			DebugPlugin.log(exception);
-		}
-
-		@Override
-		public void run() throws Exception {
-			fListener.streamAppended(fText, OutputStreamMonitor.this);
-		}
-
-		public void notifyAppend(String text) {
-			if (text == null) {
-				return;
-			}
-			fText = text;
-			for (IStreamListener iStreamListener : fListeners) {
-				fListener = iStreamListener;
-				SafeRunner.run(this);
-			}
-			fListener = null;
-			fText = null;
-		}
-	}
 }
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamDecoder.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamDecoder.java
new file mode 100644
index 0000000000000000000000000000000000000000..7cb15a73615048b29381d77b7b578cb832b2b29a
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamDecoder.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Andreas Loth and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Andreas Loth - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.debug.internal.core;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CoderResult;
+import java.nio.charset.CodingErrorAction;
+
+/**
+ * Wraps CharsetDecoder to decode a byte stream statefully to characters.
+ *
+ * @since 3.7 org.eclipse.ui.console
+ */
+public class StreamDecoder {
+	// For more context see https://bugs.eclipse.org/bugs/show_bug.cgi?id=507664
+
+	static private final int BUFFER_SIZE = 4096;
+
+	private final CharsetDecoder decoder;
+	private final ByteBuffer inputBuffer;
+	private final CharBuffer outputBuffer;
+	private boolean finished;
+
+	public StreamDecoder(Charset charset) {
+		this.decoder = charset.newDecoder();
+		this.decoder.onMalformedInput(CodingErrorAction.REPLACE);
+		this.decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
+		this.inputBuffer = ByteBuffer.allocate(StreamDecoder.BUFFER_SIZE);
+		this.inputBuffer.flip();
+		this.outputBuffer = CharBuffer.allocate(StreamDecoder.BUFFER_SIZE);
+		this.finished = false;
+	}
+
+	private void consume(StringBuilder consumer) {
+		this.outputBuffer.flip();
+		consumer.append(this.outputBuffer);
+		this.outputBuffer.clear();
+	}
+
+	private void internalDecode(StringBuilder consumer, byte[] buffer, int offset, int length) {
+		assert (offset >= 0);
+		assert (length >= 0);
+		int position = offset;
+		int end = offset + length;
+		assert (end <= buffer.length);
+		boolean finishedReading = false;
+		do {
+			CoderResult result = this.decoder.decode(this.inputBuffer, this.outputBuffer, false);
+			if (result.isOverflow()) {
+				this.consume(consumer);
+			} else if (result.isUnderflow()) {
+				this.inputBuffer.compact();
+				int remaining = this.inputBuffer.remaining();
+				assert (remaining > 0);
+				int read = Math.min(remaining, end - position);
+				if (read > 0) {
+					this.inputBuffer.put(buffer, position, read);
+					position += read;
+				} else {
+					finishedReading = true;
+				}
+				this.inputBuffer.flip();
+			} else {
+				assert false;
+			}
+		} while (!finishedReading);
+	}
+
+	public void decode(StringBuilder consumer, byte[] buffer, int offset, int length) {
+		this.internalDecode(consumer, buffer, offset, length);
+		this.consume(consumer);
+	}
+
+	public void finish(StringBuilder consumer) {
+		if (this.finished) {
+			return;
+		}
+		this.finished = true;
+		CoderResult result;
+		result = this.decoder.decode(this.inputBuffer, this.outputBuffer, true);
+		assert (result.isOverflow() || result.isUnderflow());
+		do {
+			result = this.decoder.flush(this.outputBuffer);
+			if (result.isOverflow()) {
+				this.consume(consumer);
+			} else {
+				assert result.isUnderflow();
+			}
+		} while (!result.isUnderflow());
+		this.consume(consumer);
+	}
+
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
index f8aa4ef0da92b57821c3cd6bd81370b4935ca19a..0f14b7d1a7a84788525fbaacaab0c87d7fb92e60 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -17,15 +17,19 @@ package org.eclipse.debug.internal.core;
 import java.io.IOException;
 import java.nio.charset.Charset;
 
+import org.eclipse.debug.core.model.IBinaryStreamMonitor;
+import org.eclipse.debug.core.model.IBinaryStreamsProxy;
 import org.eclipse.debug.core.model.IStreamMonitor;
 import org.eclipse.debug.core.model.IStreamsProxy;
 import org.eclipse.debug.core.model.IStreamsProxy2;
 
 /**
- * Standard implementation of a streams proxy for IStreamsProxy.
+ * Standard implementation of a streams proxy for {@link IStreamsProxy},
+ * {@link IStreamsProxy2} and {@link IBinaryStreamsProxy}.
+ * <p>
+ * Will use the same monitor instances for binary and string stream handling.
  */
-
-public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 {
+public class StreamsProxy implements IBinaryStreamsProxy {
 	/**
 	 * The monitor for the output stream (connected to standard out of the process)
 	 */
@@ -155,4 +159,22 @@ public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 {
 
 	}
 
+	@Override
+	public IBinaryStreamMonitor getBinaryErrorStreamMonitor() {
+		return fErrorMonitor;
+	}
+
+	@Override
+	public IBinaryStreamMonitor getBinaryOutputStreamMonitor() {
+		return fOutputMonitor;
+	}
+
+	@Override
+	public void write(byte[] data, int offset, int length) throws IOException {
+		if (!isClosed(false)) {
+			fInputMonitor.write(data, offset, length);
+		} else {
+			throw new IOException();
+		}
+	}
 }
diff --git a/org.eclipse.debug.core/forceQualifierUpdate.txt b/org.eclipse.debug.core/forceQualifierUpdate.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e3185a3bd627646336dd678248df95de813ddb2e
--- /dev/null
+++ b/org.eclipse.debug.core/forceQualifierUpdate.txt
@@ -0,0 +1,2 @@
+# To force a version qualifier update add the bug here
+Bug 566471 - I20200828-0150 - Comparator Errors Found
diff --git a/org.eclipse.debug.core/pom.xml b/org.eclipse.debug.core/pom.xml
index 61af1aa1b3e9b14615cb0cebf3984dd79072d38a..55df17e89776444983fa3397ca82be18268cb771 100644
--- a/org.eclipse.debug.core/pom.xml
+++ b/org.eclipse.debug.core/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.core</artifactId>
-  <version>3.15.100-SNAPSHOT</version>
+  <version>3.16.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF b/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF
index cc379e56125a02af42e5b589764b4729779270e6..a5f7859db1055a3f150c7219e484807acc74bda2 100644
--- a/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.debug.examples.core;singleton:=true
-Bundle-Version: 1.4.700.qualifier
+Bundle-Version: 1.4.800.qualifier
 Bundle-Activator: org.eclipse.debug.examples.core.pda.DebugCorePlugin
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.core.resources,
diff --git a/org.eclipse.debug.examples.core/pom.xml b/org.eclipse.debug.examples.core/pom.xml
index 280d038542f9ec7a9e3b0eeefed205a6563ae655..cfdf35b2dee66bfb089ee02a479d5af11a055b00 100644
--- a/org.eclipse.debug.examples.core/pom.xml
+++ b/org.eclipse.debug.examples.core/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.examples.core</artifactId>
-  <version>1.4.700-SNAPSHOT</version>
+  <version>1.4.800-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java
index c1a21a99bc8122d284518d88c8fd48507bf05451..c7a207b074528324bc2babfef3c45ef2489afd6e 100644
--- a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java
+++ b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java
@@ -19,7 +19,6 @@ import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.debug.core.model.IBreakpoint;
 import org.eclipse.debug.core.model.LineBreakpoint;
 import org.eclipse.debug.examples.core.pda.DebugCorePlugin;
@@ -62,16 +61,13 @@ public class PDALineBreakpoint extends LineBreakpoint implements IPDAEventListen
 	 * @throws CoreException if unable to create the breakpoint
 	 */
 	public PDALineBreakpoint(final IResource resource, final int lineNumber) throws CoreException {
-		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-			@Override
-			public void run(IProgressMonitor monitor) throws CoreException {
-				IMarker marker = resource.createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$
-				setMarker(marker);
-				marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE);
-				marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
-				marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
-				marker.setAttribute(IMarker.MESSAGE, "Line Breakpoint: " + resource.getName() + " [line: " + lineNumber + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
+		IWorkspaceRunnable runnable = monitor -> {
+			IMarker marker = resource.createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$
+			setMarker(marker);
+			marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE);
+			marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
+			marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
+			marker.setAttribute(IMarker.MESSAGE, "Line Breakpoint: " + resource.getName() + " [line: " + lineNumber + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		};
 		run(getMarkerRule(resource), runnable);
 	}
diff --git a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java
index 55eb369bac234a97eadd157de32be1ed6793e55b..e9629042ae9e2eb2e56864cb35aa0f54c5f5b0d4 100644
--- a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java
+++ b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java
@@ -18,8 +18,6 @@ import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.model.IBreakpoint;
 
@@ -38,18 +36,15 @@ public class PDARunToLineBreakpoint extends PDALineBreakpoint {
 	 * @exception DebugException if unable to create the breakpoint
 	 */
 	public PDARunToLineBreakpoint(final IFile resource, final int lineNumber) throws DebugException {
-		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-			@Override
-			public void run(IProgressMonitor monitor) throws CoreException {
-				// associate with workspace root to avoid drawing in editor ruler
-				IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$
-				setMarker(marker);
-				marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE);
-				marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
-				marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
-				setRegistered(false);
-				fSourceFile = resource;
-			}
+		IWorkspaceRunnable runnable = monitor -> {
+			// associate with workspace root to avoid drawing in editor ruler
+			IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$
+			setMarker(marker);
+			marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE);
+			marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
+			marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
+			setRegistered(false);
+			fSourceFile = resource;
 		};
 		run(getMarkerRule(resource), runnable);
 	}
diff --git a/org.eclipse.debug.examples.memory/pom.xml b/org.eclipse.debug.examples.memory/pom.xml
index cd82309d2b6517ab6c44b7fd7437c7a454c970ca..96c26ed6bc02dfd4d77d09280614267d507c6555 100644
--- a/org.eclipse.debug.examples.memory/pom.xml
+++ b/org.eclipse.debug.examples.memory/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.examples.memory</artifactId>
diff --git a/org.eclipse.debug.examples.mixedmode/pom.xml b/org.eclipse.debug.examples.mixedmode/pom.xml
index 7d4975fe7dea641a59f1736faa51c5d7dc7b4c12..8ff465b560371ac05c07ab73e196369a681a531d 100644
--- a/org.eclipse.debug.examples.mixedmode/pom.xml
+++ b/org.eclipse.debug.examples.mixedmode/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.examples.mixedmode</artifactId>
diff --git a/org.eclipse.debug.examples.ui/pom.xml b/org.eclipse.debug.examples.ui/pom.xml
index 3f44fc16de3a8dc67c43202929c21844102fdece..f192d2a0fed421d37f396aa0aa5d47db90e24896 100644
--- a/org.eclipse.debug.examples.ui/pom.xml
+++ b/org.eclipse.debug.examples.ui/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.examples.ui</artifactId>
diff --git a/org.eclipse.debug.tests/META-INF/MANIFEST.MF b/org.eclipse.debug.tests/META-INF/MANIFEST.MF
index fa85ae8123999f7894de76b8effaa669384c73e8..2f725b1673d429f454511323676de5c0e83e2dff 100644
--- a/org.eclipse.debug.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.debug.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.debug.tests;singleton:=true
-Bundle-Version: 3.11.700.qualifier
+Bundle-Version: 3.11.800.qualifier
 Bundle-Activator: org.eclipse.debug.tests.TestsPlugin
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.ui;bundle-version="[3.6.0,4.0.0)",
diff --git a/org.eclipse.debug.tests/plugin.properties b/org.eclipse.debug.tests/plugin.properties
index 2643d02af79ba934de911eb9b8d62369bf02a14f..8fcb3b9f3e530a50f341e6d8acb2e0581c90c631 100755
--- a/org.eclipse.debug.tests/plugin.properties
+++ b/org.eclipse.debug.tests/plugin.properties
@@ -20,4 +20,5 @@ renderingType.name.0 = Rendering Two
 renderingType.name.1 = Rendering Default
 launchConfigurationType.name = Test Launch Type
 extension.name = Debug File System
-launchConfigurationType.name.0 = Cancelling Launch Type
\ No newline at end of file
+launchConfigurationType.name.0 = Cancelling Launch Type
+testBreakpoint.name = Test Breakpoint
\ No newline at end of file
diff --git a/org.eclipse.debug.tests/plugin.xml b/org.eclipse.debug.tests/plugin.xml
index b697fbdca6ccbd93cbe32c771e9a1a66a6d982c8..ab1d612ec9fa671d88e9e397d892668c4aba4d76 100644
--- a/org.eclipse.debug.tests/plugin.xml
+++ b/org.eclipse.debug.tests/plugin.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.4"?>
 <!--
-     Copyright (c) 2009 IBM Corporation and others.
+     Copyright (c) 2009, 2020 IBM Corporation and others.
 
      This program and the accompanying materials
      are made available under the terms of the Eclipse Public License 2.0
@@ -31,7 +31,7 @@
             id="rendering_type_3"
             name="%renderingType.name.1"
             class="org.eclipse.debug.tests.view.memory.RenderingTypeDelegate">
-      </renderingType>      
+      </renderingType>
       <renderingBindings
       		primaryId="rendering_type_1">
       		<enablement>
@@ -55,7 +55,7 @@
       		<enablement>
       			<instanceof value="org.eclipse.debug.tests.view.memory.MemoryBlockDynamic"/>
       		</enablement>
-      </renderingBindings>                  
+      </renderingBindings>
    </extension>
    <extension
          point="org.eclipse.debug.core.launchConfigurationTypes">
@@ -111,5 +111,27 @@
             class="org.eclipse.debug.tests.stepfilters.TestStepFilter"
             modelIdentifier="com.example.debug.model">
       </stepFilter>
-   </extension>   
+   </extension>
+   <extension point="org.eclipse.debug.core.breakpoints">
+      <breakpoint
+          id="org.eclipse.debug.tests.testBreakpoint"
+          class="org.eclipse.debug.tests.breakpoint.TestBreakpoint"
+          markerType="org.eclipse.debug.core.breakpointMarker">
+      </breakpoint>
+   </extension>
+   <extension
+         id="org.eclipse.debug.tests.testBreakpointMarker"
+         name="%testBreakpoint.name"
+         point="org.eclipse.core.resources.markers">
+      <super
+            type="org.eclipse.debug.core.breakpointMarker">
+      </super>
+   </extension>
+   <extension
+         point="org.eclipse.debug.ui.debugModelPresentations">
+      <debugModelPresentation
+            class="org.eclipse.debug.tests.viewer.model.DebugTestModelPresentation"
+            id="org.eclipse.debug.tests">
+      </debugModelPresentation>
+   </extension>
 </plugin>
diff --git a/org.eclipse.debug.tests/pom.xml b/org.eclipse.debug.tests/pom.xml
index b1e24f437f22f0c3bc0d52eba9f0856eca7f6a09..5e20ea247b4010ab753ad6d03cebe91cef6788ca 100644
--- a/org.eclipse.debug.tests/pom.xml
+++ b/org.eclipse.debug.tests/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.tests</artifactId>
-  <version>3.11.700-SNAPSHOT</version>
+  <version>3.11.800-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <code.ignoredWarnings>${tests.ignoredWarnings}</code.ignoredWarnings>
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java
index ed53aad4a798691a6c79e4609818268c85de750b..825625830c0c7e28097861b2887776a621757b5f 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2019 IBM Corporation and others.
+ * Copyright (c) 2009, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -16,11 +16,15 @@
 package org.eclipse.debug.tests;
 
 import org.eclipse.debug.tests.breakpoint.BreakpointOrderingTests;
+import org.eclipse.debug.tests.breakpoint.BreakpointTests;
 import org.eclipse.debug.tests.console.ConsoleDocumentAdapterTests;
 import org.eclipse.debug.tests.console.ConsoleManagerTests;
 import org.eclipse.debug.tests.console.ConsoleTests;
+import org.eclipse.debug.tests.console.FileLinkTests;
 import org.eclipse.debug.tests.console.IOConsoleFixedWidthTests;
 import org.eclipse.debug.tests.console.IOConsoleTests;
+import org.eclipse.debug.tests.console.InputStreamMonitorTests;
+import org.eclipse.debug.tests.console.OutputStreamMonitorTests;
 import org.eclipse.debug.tests.console.ProcessConsoleManagerTests;
 import org.eclipse.debug.tests.console.ProcessConsoleTests;
 import org.eclipse.debug.tests.console.RuntimeProcessTests;
@@ -59,23 +63,65 @@ import org.junit.runners.Suite;
  */
 @RunWith(Suite.class)
 @Suite.SuiteClasses({
-		SourceLookupFacilityTests.class, BreakpointOrderingTests.class,
-		VirtualViewerDeltaTests.class, VirtualViewerContentTests.class,
-		VirtualViewerLazyModeTests.class, VirtualViewerSelectionTests.class,
-		VirtualViewerStateTests.class, VirtualViewerUpdateTests.class,
-		VirtualViewerFilterTests.class, FilterTransformTests.class,
-		ChildrenUpdateTests.class, PresentationContextTests.class,
-		MemoryRenderingTests.class, LaunchConfigurationTests.class,
-		AcceleratorSubstitutionTests.class, LaunchHistoryTests.class,
-		LaunchFavoriteTests.class, LaunchManagerTests.class,
-		RefreshTabTests.class, ArgumentParsingTests.class, LaunchTests.class,
+		// Source lookup tests
+		SourceLookupFacilityTests.class,
+		// BP tests
+		BreakpointOrderingTests.class,
+		BreakpointTests.class,
+		// Note: jface viewer tests were moved out of nightly tests
+		// due to frequent problems on nightly build machines.
+		// (Bug 343308).
+
+		// Virtual viewer tests
+		VirtualViewerDeltaTests.class,
+		VirtualViewerContentTests.class,
+		VirtualViewerLazyModeTests.class,
+		VirtualViewerSelectionTests.class,
+		VirtualViewerStateTests.class,
+		VirtualViewerUpdateTests.class,
+		VirtualViewerFilterTests.class,
+
+		// Viewer neutral tests
+		FilterTransformTests.class,
+		ChildrenUpdateTests.class,
+		PresentationContextTests.class,
+		
+		// Memory view
+		MemoryRenderingTests.class,
+
+		// Launch framework
+		LaunchConfigurationTests.class,
+		AcceleratorSubstitutionTests.class,
+		LaunchHistoryTests.class,
+		LaunchFavoriteTests.class,
+		LaunchManagerTests.class,
+		RefreshTabTests.class,
+		ArgumentParsingTests.class,
+		LaunchTests.class,
+
+		// Status handlers
 		StatusHandlerTests.class,
+
+		// Step filters
 		StepFiltersTests.class,
-		ConsoleDocumentAdapterTests.class, ConsoleManagerTests.class,
-		ConsoleTests.class, IOConsoleTests.class,
-		IOConsoleFixedWidthTests.class, ProcessConsoleManagerTests.class,
-		ProcessConsoleTests.class, StreamsProxyTests.class,
-		TextConsoleViewerTest.class, RuntimeProcessTests.class,
-		LaunchGroupTests.class })
+
+		// Console view
+		ConsoleDocumentAdapterTests.class,
+		ConsoleManagerTests.class,
+		ConsoleTests.class,
+		IOConsoleTests.class,
+		IOConsoleFixedWidthTests.class,
+		ProcessConsoleManagerTests.class,
+		ProcessConsoleTests.class,
+		StreamsProxyTests.class,
+		TextConsoleViewerTest.class,
+		RuntimeProcessTests.class,
+		OutputStreamMonitorTests.class,
+		InputStreamMonitorTests.class,
+		FileLinkTests.class,
+
+		// Launch Groups
+		LaunchGroupTests.class,
+})
 public class AutomatedSuite {
 }
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java
index 99f2a2645ec13c6246ab254d7067c2de8c70fdbd..e7644a8c1da17833b22836f9cd8e65ba8f458d32 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java
@@ -24,6 +24,8 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.function.Supplier;
+
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
@@ -108,8 +110,8 @@ public class TestUtil {
 	 * background thread, just waits.
 	 *
 	 * @param <T> type of the context
-	 * @param context test context
 	 * @param condition function which will be evaluated while waiting
+	 * @param context test context
 	 * @param timeout max wait time in milliseconds to wait on given condition
 	 * @param errorMessage message which will be used to construct the failure
 	 *            exception in case the condition will still return {@code true}
@@ -133,6 +135,39 @@ public class TestUtil {
 		}
 	}
 
+	/**
+	 * A simplified variant of
+	 * {@link #waitWhile(Function, Object, long, Function)}.
+	 * <p>
+	 * Waits while given condition is {@code true} for a given amount of
+	 * milliseconds.
+	 * <p>
+	 * Will process UI events while waiting in UI thread, if called from
+	 * background thread, just waits.
+	 *
+	 * @param condition function which will be evaluated while waiting
+	 * @param timeout max wait time in milliseconds to wait on given condition
+	 * @return value of condition when method returned
+	 */
+	public static boolean waitWhile(Supplier<Boolean> condition, long timeout) throws Exception {
+		if (condition == null) {
+			condition = () -> true;
+		}
+		long start = System.currentTimeMillis();
+		Display display = Display.getCurrent();
+		while (System.currentTimeMillis() - start < timeout && condition.get()) {
+			Thread.yield();
+			if (display != null && !display.isDisposed()) {
+				if (!display.readAndDispatch()) {
+					Thread.sleep(1);
+				}
+			} else {
+				Thread.sleep(5);
+			}
+		}
+		return condition.get();
+	}
+
 	/**
 	 * Utility for waiting until the execution of jobs of any family has
 	 * finished or timeout is reached. If no jobs are running, the method waits
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java
index c70242f7955b1c1572e6ec88a9a9a06382b7abcb..91a3d93187ef743283c07bf7e0b7378932fd177a 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java
@@ -19,20 +19,12 @@ import static org.junit.Assert.fail;
 
 import java.util.List;
 
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.core.model.IBreakpoint;
 import org.eclipse.debug.core.model.ILineBreakpoint;
 import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsComparator;
 import org.eclipse.debug.tests.AbstractDebugTest;
-import org.eclipse.debug.tests.TestsPlugin;
 import org.eclipse.debug.ui.IDebugModelPresentation;
 import org.eclipse.debug.ui.IValueDetailListener;
 import org.eclipse.jface.viewers.IBaseLabelProvider;
@@ -51,110 +43,6 @@ import org.junit.Test;
  */
 public class BreakpointOrderingTests extends AbstractDebugTest {
 
-	/**
-	 * Test only implementation of IBreakpoint.
-	 */
-	static class TestBreakpoint implements IBreakpoint {
-
-		private final String fText;
-		private IMarker fMarker = null;
-
-		TestBreakpoint(String text) {
-			this(text, IBreakpoint.BREAKPOINT_MARKER);
-		}
-
-		TestBreakpoint(String text, final String markerType) {
-			fText = text;
-			final IResource resource = ResourcesPlugin.getWorkspace().getRoot();
-			IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-
-				@Override
-				public void run( IProgressMonitor monitor ) throws CoreException {
-					// create the marker
-					setMarker(resource.createMarker(markerType));
-				}
-			};
-			try {
-				ResourcesPlugin.getWorkspace().run( wr, null );
-			}
-			catch ( CoreException e ) {
-				fail("Unexpected exception: " + e); //$NON-NLS-1$
-			}
-
-		}
-
-		void ReportFailure(String msg) throws CoreException {
-			throw new CoreException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, msg));
-		}
-
-
-		String getText() {
-			return fText;
-		}
-
-		@Override
-		public void delete() throws CoreException {
-			fMarker.delete();
-		}
-
-		@Override
-		public IMarker getMarker() {
-			return fMarker;
-		}
-
-		@Override
-		public String getModelIdentifier() {
-			return "Test"; //$NON-NLS-1$
-		}
-
-		@Override
-		public boolean isEnabled() throws CoreException {
-			fail("not implemented in test"); //$NON-NLS-1$
-			return false;
-		}
-
-		@Override
-		public boolean isPersisted() throws CoreException {
-			fail("not implemented in test"); //$NON-NLS-1$
-			return false;
-		}
-
-		@Override
-		public boolean isRegistered() throws CoreException {
-			fail("not implemented in test"); //$NON-NLS-1$
-			return false;
-		}
-
-		@Override
-		public void setEnabled(boolean enabled) throws CoreException {
-			fail("not implemented in test"); //$NON-NLS-1$
-		}
-
-		@Override
-		public void setMarker(IMarker marker) throws CoreException {
-			assertTrue(fMarker == null && marker != null);
-			fMarker = marker;
-		}
-
-		@Override
-		public void setPersisted(boolean registered) throws CoreException {
-			fail("not implemented in test"); //$NON-NLS-1$
-		}
-
-		@Override
-		public void setRegistered(boolean registered) throws CoreException {
-			fail("not implemented in test"); //$NON-NLS-1$
-
-		}
-
-		@Override
-		public <T> T getAdapter(Class<T> adapter) {
-			fail("not implemented in test"); //$NON-NLS-1$
-			return null;
-		}
-
-	}
-
 	/**
 	 * Test only implementation of ILineBreakpoint.
 	 */
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..39c127bfb880874b0c1f2cd4bd08b336680c4479
--- /dev/null
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointTests.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.tests.breakpoint;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.operations.IOperationHistory;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.internal.core.BreakpointManager;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
+import org.eclipse.debug.tests.AbstractDebugTest;
+import org.eclipse.debug.tests.TestUtil;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+import org.junit.Test;
+
+public class BreakpointTests extends AbstractDebugTest {
+
+	private final IBreakpointManager bpm = DebugPlugin.getDefault().getBreakpointManager();
+
+	@Override
+	public void tearDown() throws Exception {
+		super.tearDown();
+
+		for (IBreakpoint bp : getTestBreakpoints()) {
+			bp.delete();
+		}
+	}
+
+	/**
+	 * Get all {@link TestBreakpoint}s known by the default
+	 * {@link BreakpointManager}.
+	 *
+	 * @return {@link TestBreakpoint}s or empty list
+	 */
+	private List<TestBreakpoint> getTestBreakpoints() {
+		List<TestBreakpoint> bps = new ArrayList<>();
+		for (IBreakpoint bp : bpm.getBreakpoints(TestBreakpoint.MODEL)) {
+			assertTrue(bp instanceof TestBreakpoint);
+			bps.add((TestBreakpoint) bp);
+		}
+		return bps;
+	}
+
+	/**
+	 * Test for bug 424561 where a breakpoint is deleted and the sequence undo
+	 * (recreate breakpoint), redo (delete again), undo (recreate breakpoint)
+	 * does not recreate the breakpoint.
+	 */
+	@Test
+	public void testBug424561_undoRedoUndoGone() throws Exception {
+		boolean viewVisible = true;
+		BreakpointsView view = ((BreakpointsView) DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW));
+		if (view == null) {
+			viewVisible = false;
+			view = ((BreakpointsView) DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().showView(IDebugUIConstants.ID_BREAKPOINT_VIEW));
+		}
+		assertNotNull("Failed to obtain breakpoint view.", view);
+
+		try {
+			String content = "Bug 424561";
+			TestBreakpoint bp = new TestBreakpoint(content);
+			IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory();
+			IUndoContext context = DebugUITools.getBreakpointsUndoContext();
+
+			bpm.addBreakpoint(bp);
+			TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not created");
+			assertTrue("Breakpoint marker missing", bp.getMarker().exists());
+			assertTrue("Breakpoint not registered", bp.isRegistered());
+
+			DebugUITools.deleteBreakpoints(new IBreakpoint[] {
+					bp }, null, null);
+			assertTrue(operationHistory.canUndo(context));
+			TestUtil.waitWhile(c -> c.getTestBreakpoints().size() > 0, this, testTimeout, c -> "Breakpoint is not deleted");
+			assertFalse("Breakpoint marker not removed", bp.getMarker().exists());
+			assertFalse("Breakpoint still registered", bp.isRegistered());
+
+			operationHistory.undo(context, null, null);
+			assertTrue(operationHistory.canRedo(context));
+			TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not recreated");
+			bp = getTestBreakpoints().get(0);
+			assertEquals("Breakpoint attributes not correctly restored", content, bp.getText());
+			assertTrue("Breakpoint marker missing", bp.getMarker().exists());
+			assertTrue("Breakpoint not registered", bp.isRegistered());
+
+			operationHistory.redo(context, null, null);
+			assertTrue(operationHistory.canUndo(context));
+			TestUtil.waitWhile(c -> c.getTestBreakpoints().size() > 0, this, testTimeout, c -> "Breakpoint is not deleted");
+			assertFalse("Breakpoint marker not removed", bp.getMarker().exists());
+			assertFalse("Breakpoint still registered", bp.isRegistered());
+
+			operationHistory.undo(context, null, null);
+			assertTrue(operationHistory.canRedo(context));
+			TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not recreated");
+			bp = getTestBreakpoints().get(0);
+			assertEquals("Breakpoint attributes not correctly restored", content, bp.getText());
+			assertTrue("Breakpoint marker missing", bp.getMarker().exists());
+			assertTrue("Breakpoint not registered", bp.isRegistered());
+
+			final BreakpointsView finalView = view;
+			final TestBreakpoint finalBp = bp;
+			TestUtil.waitWhile(c -> {
+				TreeItem item = (TreeItem) finalView.getTreeModelViewer().testFindItem(finalBp);
+				return item == null || item.getText() == null || !item.getText().contains(content);
+			}, this, testTimeout, c -> "Breakpoint not restored in view");
+		} finally {
+			if (!viewVisible) {
+				DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().hideView(view);
+			}
+		}
+	}
+}
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/TestBreakpoint.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/TestBreakpoint.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a1cc32893fd23056645c2837cc422fef233ff44
--- /dev/null
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/TestBreakpoint.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.tests.breakpoint;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.model.Breakpoint;
+import org.eclipse.debug.core.model.IBreakpoint;
+
+/**
+ * Test only implementation of IBreakpoint.
+ */
+public class TestBreakpoint extends Breakpoint {
+
+	public static final String MODEL = "org.eclipse.debug.tests"; //$NON-NLS-1$
+	public static final String TEXT_ATTRIBUTE = "org.eclipse.debug.tests.breakpoint.TestBreakpoint.text"; //$NON-NLS-1$
+
+	public TestBreakpoint() {
+		super();
+	}
+
+	TestBreakpoint(String text) {
+		this(text, IBreakpoint.BREAKPOINT_MARKER);
+	}
+
+	TestBreakpoint(String text, final String markerType) {
+		final IResource resource = ResourcesPlugin.getWorkspace().getRoot();
+		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
+			@Override
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// create the marker
+				setMarker(resource.createMarker(markerType));
+				ensureMarker().setAttribute(ID, getModelIdentifier());
+				ensureMarker().setAttribute(TEXT_ATTRIBUTE, text);
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(wr, null);
+		} catch (CoreException e) {
+			fail("Unexpected exception: " + e); //$NON-NLS-1$
+		}
+
+	}
+
+	public String getText() {
+		return getMarker().getAttribute(TEXT_ATTRIBUTE, null);
+	}
+
+	@Override
+	public String getModelIdentifier() {
+		return MODEL;
+	}
+
+	@Override
+	public void setMarker(IMarker marker) throws CoreException {
+		assertTrue(getMarker() == null && marker != null);
+		super.setMarker(marker);
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/FileLinkTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/FileLinkTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..9042f27b34bc9f9fb4e920a1daaa28d50abf7bcc
--- /dev/null
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/FileLinkTests.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.tests.console;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.UUID;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.tests.AbstractDebugTest;
+import org.eclipse.debug.ui.console.FileLink;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.junit.Test;
+
+/**
+ * Tests for {@link FileLink}.
+ */
+public class FileLinkTests extends AbstractDebugTest {
+
+	private IProject testProject;
+	private IFile testFile;
+
+	@Override
+	public void setUp() throws Exception {
+		super.setUp();
+
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		testProject = workspace.getRoot().getProject("FileLinkTest-" + UUID.randomUUID());
+		testProject.create(null);
+		testProject.open(null);
+		testFile = testProject.getFile("filelinktest.txt");
+		setTestContent("Test file\nSecond line");
+	}
+
+	@Override
+	public void tearDown() throws Exception {
+		if (testProject.exists()) {
+			testProject.delete(true, true, null);
+		}
+
+		super.tearDown();
+	}
+
+	private void setTestContent(String fileContent) throws UnsupportedEncodingException, CoreException {
+		ByteArrayInputStream data = new ByteArrayInputStream(fileContent.getBytes(testFile.getCharset()));
+		if (testFile.exists()) {
+			testFile.setContents(data, IResource.FORCE, null);
+		} else {
+			testFile.create(data, IResource.FORCE, null);
+		}
+	}
+
+	@Test
+	public void testFileLink() throws Exception {
+		FileLink link = new FileLink(testFile, null, -1, -1, -1);
+		link.linkActivated();
+		assertEquals(testFile.getName(), getActiveEditorFilename());
+	}
+
+	@Test
+	public void testFileLinkWithOffset() throws Exception {
+		FileLink link = new FileLink(testFile, null, 4, 0, -1);
+		link.linkActivated();
+		assertEquals(testFile.getName(), getActiveEditorFilename());
+		ITextSelection selection = getCurrentTextSelection();
+		assertNotNull("No selection.", selection);
+		assertEquals(4, selection.getOffset());
+		assertEquals(0, selection.getLength());
+		assertEquals(0, selection.getStartLine());
+		assertEquals(0, selection.getEndLine());
+	}
+
+	@Test
+	public void testFileLinkWithSelection() throws Exception {
+		FileLink link = new FileLink(testFile, null, 7, 5, -1);
+		link.linkActivated();
+		assertEquals(testFile.getName(), getActiveEditorFilename());
+		ITextSelection selection = getCurrentTextSelection();
+		assertNotNull("No selection.", selection);
+		assertEquals(7, selection.getOffset());
+		assertEquals(5, selection.getLength());
+		assertEquals(0, selection.getStartLine());
+		assertEquals(1, selection.getEndLine());
+
+		// if offset + length and line is specified the line should be ignored
+		link = new FileLink(testFile, null, 7, 5, 1);
+		link.linkActivated();
+		assertEquals(testFile.getName(), getActiveEditorFilename());
+		selection = getCurrentTextSelection();
+		assertNotNull("No selection.", selection);
+		assertEquals(7, selection.getOffset());
+		assertEquals(5, selection.getLength());
+		assertEquals(0, selection.getStartLine());
+		assertEquals(1, selection.getEndLine());
+	}
+
+	@Test
+	public void testFileLinkWithLine() throws Exception {
+		FileLink link = new FileLink(testFile, null, -1, -1, 2);
+		link.linkActivated();
+		assertEquals(testFile.getName(), getActiveEditorFilename());
+		ITextSelection selection = getCurrentTextSelection();
+		assertNotNull("No selection.", selection);
+		assertEquals(10, selection.getOffset());
+		assertEquals(11, selection.getLength());
+		assertEquals(1, selection.getStartLine());
+		assertEquals(1, selection.getEndLine());
+	}
+
+	private String getActiveEditorFilename() {
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		IEditorPart editor = window.getActivePage().getActiveEditor();
+		return editor != null ? editor.getEditorInput().getName() : null;
+	}
+
+	private ITextSelection getCurrentTextSelection() {
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		ISelection selection = window.getSelectionService().getSelection();
+		if (selection instanceof ITextSelection) {
+			return (ITextSelection) selection;
+		}
+		return null;
+	}
+}
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java
index a90cad29ac77ceb4c1dacdc7bce9b008e81f3ebb..ae51f9f7f14d672069f515adf793f3b3ba0ba0eb 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java
@@ -611,6 +611,26 @@ public class IOConsoleTests extends AbstractDebugTest {
 		closeConsole(c);
 	}
 
+	/**
+	 * Test handling of <code>\0</code>.
+	 */
+	@Test
+	public void testNullByte() throws Exception {
+		final IOConsoleTestUtil c = getTestUtil("Test \\0");
+		c.getConsole().setHandleControlCharacters(true);
+		try (IOConsoleOutputStream err = c.getConsole().newOutputStream()) {
+			c.write("\u0000").verifyContent("");
+			c.write("abc\u0000123").verifyContent("abc123");
+			c.writeFast("\u0000", err).writeAndVerify("output");
+			c.write("\n\u0000x\u0000y\u0000z\u0000\u0000\u0000987", err).verifyContentByLine("xyz987", 1).verifyPartitions();
+			assertFalse(c.getDocument().get().contains("\u0000"));
+
+			c.clear();
+			c.writeFast("123").writeFast("\b\b\b").write("+\u0000+").verifyContent("++3").verifyPartitions();
+		}
+		closeConsole(c);
+	}
+
 	/**
 	 * Test larger number of partitions with pseudo random console content.
 	 */
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/InputStreamMonitorTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/InputStreamMonitorTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..361995c89a2c3555080a9c64c6e179c612827e5e
--- /dev/null
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/InputStreamMonitorTests.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.tests.console;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.nio.charset.Charset;
+import java.util.Set;
+import java.util.function.Supplier;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.debug.internal.core.DebugCoreMessages;
+import org.eclipse.debug.internal.core.InputStreamMonitor;
+import org.eclipse.debug.tests.AbstractDebugTest;
+import org.eclipse.debug.tests.TestUtil;
+import org.eclipse.debug.tests.TestsPlugin;
+import org.junit.Test;
+
+/**
+ * Tests the {@link InputStreamMonitor}.
+ */
+public class InputStreamMonitorTests extends AbstractDebugTest {
+
+	/**
+	 * Simple test for input stream monitor. Write some bytes before starting
+	 * the monitor, some after and check if they are correctly transfered.
+	 */
+	@Test
+	@SuppressWarnings("resource")
+	public void testInputStreamMonitor() throws Exception {
+		PipedInputStream sysin = new PipedInputStream();
+		InputStreamMonitor monitor = new InputStreamMonitor(new PipedOutputStream(sysin));
+
+		byte[] content = new byte[100];
+		for (int i = 0; i < content.length; i++) {
+			content[i] = (byte) (i % 255);
+		}
+		try {
+			int half = content.length / 2;
+			monitor.write(content, 0, half);
+			monitor.startMonitoring();
+			monitor.write(content, half, content.length - half);
+			Thread.sleep(30);
+
+			byte[] readBack = new byte[content.length];
+			int read = sysin.read(readBack);
+			assertEquals("Monitor wrote to few bytes.", read, content.length);
+			assertEquals("Monitor wrote to much bytes.", 0, sysin.available());
+			assertArrayEquals("Monitor wrote wrong content.", content, readBack);
+		} finally {
+			monitor.close();
+		}
+	}
+
+	/**
+	 * Test that passing <code>null</code> as charset does not raise exceptions.
+	 */
+	@Test
+	@SuppressWarnings("resource")
+	public void testNullCharset() throws Exception {
+		PipedInputStream sysin = new PipedInputStream();
+		InputStreamMonitor monitor = new InputStreamMonitor(new PipedOutputStream(sysin), (Charset) null);
+		String text = "o\u00F6O\u00EFiI\u00D6\u00D8\u00F8";
+		try {
+			monitor.startMonitoring();
+			monitor.write(text);
+			Thread.sleep(30);
+
+			byte[] readBack = new byte[1000];
+			int len = sysin.read(readBack);
+			assertEquals("Monitor wrote wrong content.", text, new String(readBack, 0, len));
+		} finally {
+			monitor.close();
+		}
+	}
+
+	/**
+	 * Test different combinations of stream closing.
+	 */
+	@Test
+	@SuppressWarnings("resource")
+	public void testClose() throws Exception {
+		Supplier<Long> getInputStreamMonitorThreads = () -> {
+			Set<Thread> allThreads = Thread.getAllStackTraces().keySet();
+			long numMonitorThreads = allThreads.stream().filter(t -> DebugCoreMessages.InputStreamMonitor_label.equals(t.getName())).count();
+			return numMonitorThreads;
+		};
+		long alreadyLeakedThreads = getInputStreamMonitorThreads.get();
+		if (alreadyLeakedThreads > 0) {
+			Platform.getLog(TestsPlugin.class).warn("Test started with " + alreadyLeakedThreads + " leaked monitor threads.");
+		}
+
+		{
+			ClosableTestOutputStream testStream = new ClosableTestOutputStream();
+			InputStreamMonitor monitor = new InputStreamMonitor(testStream);
+			assertEquals("Stream closed to early.", 0, testStream.numClosed);
+			monitor.closeInputStream();
+			TestUtil.waitWhile(() -> testStream.numClosed == 0, 100);
+			assertEquals("Stream not closed.", 1, testStream.numClosed);
+		}
+		{
+			ClosableTestOutputStream testStream = new ClosableTestOutputStream();
+			InputStreamMonitor monitor = new InputStreamMonitor(testStream);
+			monitor.startMonitoring();
+			assertEquals("Stream closed to early.", 0, testStream.numClosed);
+			monitor.close();
+			TestUtil.waitWhile(() -> testStream.numClosed == 0, 200);
+			assertEquals("Stream not closed.", 1, testStream.numClosed);
+		}
+		{
+			ClosableTestOutputStream testStream = new ClosableTestOutputStream();
+			InputStreamMonitor monitor = new InputStreamMonitor(testStream);
+			monitor.startMonitoring();
+			assertEquals("Stream closed to early.", 0, testStream.numClosed);
+			monitor.closeInputStream();
+			monitor.close();
+			monitor.close();
+			TestUtil.waitWhile(() -> testStream.numClosed == 0, 100);
+			assertEquals("Stream not closed or to often.", 1, testStream.numClosed);
+		}
+
+		TestUtil.waitWhile(() -> getInputStreamMonitorThreads.get() > 0, 500);
+		assertEquals("Leaked monitor threads.", 0, (long) getInputStreamMonitorThreads.get());
+	}
+
+	/**
+	 * Extension of output stream to log calls to {@link #close()}.
+	 */
+	public static class ClosableTestOutputStream extends OutputStream {
+		public volatile int numClosed = 0;
+
+		@Override
+		public void close() throws IOException {
+			numClosed++;
+		}
+
+		@Override
+		public void write(int b) throws IOException {
+		}
+	}
+}
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/OutputStreamMonitorTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/OutputStreamMonitorTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d361021f94bd4ac317ac02bac9adc5a6c29ad31
--- /dev/null
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/OutputStreamMonitorTests.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.tests.console;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+import org.eclipse.debug.core.IBinaryStreamListener;
+import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IBinaryStreamMonitor;
+import org.eclipse.debug.core.model.IStreamMonitor;
+import org.eclipse.debug.internal.core.OutputStreamMonitor;
+import org.eclipse.debug.tests.AbstractDebugTest;
+import org.eclipse.debug.tests.TestUtil;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the {@link OutputStreamMonitor}.
+ */
+public class OutputStreamMonitorTests extends AbstractDebugTest {
+
+	/** Stream to simulate an application writing to system out. */
+	PipedOutputStream sysout = new PipedOutputStream();
+	/** The {@link OutputStreamMonitor} used for the test runs. */
+	TestOutputStreamMonitor monitor;
+	/** The bytes received through listener. */
+	ByteArrayOutputStream notifiedBytes = new ByteArrayOutputStream();
+	/** The strings received through listener. */
+	StringBuilder notifiedChars = new StringBuilder();
+
+	IBinaryStreamListener fBinaryListener = new IBinaryStreamListener() {
+		@Override
+		public void streamAppended(byte[] data, IBinaryStreamMonitor mon) {
+			if (monitor == mon) {
+				try {
+					notifiedBytes.write(data);
+				} catch (IOException e) {
+				}
+			}
+		}
+	};
+	IStreamListener fStreamListener = new IStreamListener() {
+		@Override
+		public void streamAppended(String text, IStreamMonitor mon) {
+			if (monitor == mon) {
+				notifiedChars.append(text);
+			}
+		}
+	};
+
+	@Override
+	@Before
+	@SuppressWarnings("resource")
+	public void setUp() throws IOException {
+		monitor = new TestOutputStreamMonitor(new PipedInputStream(sysout), StandardCharsets.UTF_8);
+	}
+
+	/**
+	 * Simple test for output stream monitor. Test buffering and listeners.
+	 */
+	@Test
+	public void testBufferedOutputStreamMonitor() throws Exception {
+		String input = "o\u00F6O";
+		byte[] byteInput = input.getBytes(StandardCharsets.UTF_8);
+		try {
+			monitor.addBinaryListener(fBinaryListener);
+			monitor.addListener(fStreamListener);
+
+			sysout.write(byteInput, 0, 2);
+			sysout.flush();
+			monitor.startMonitoring();
+			TestUtil.waitWhile(() -> notifiedBytes.size() < 2, 1000);
+			String contents = monitor.getContents();
+			assertEquals("Monitor read wrong content.", input.substring(0, 1), contents);
+			assertEquals("Notified and buffered content differ.", contents, notifiedChars.toString());
+			assertEquals("Failed to access buffered content twice.", contents, monitor.getContents());
+			byte[] data = monitor.getData();
+			byte[] expected = new byte[2];
+			System.arraycopy(byteInput, 0, expected, 0, 2);
+			assertArrayEquals("Monitor read wrong binary content.", expected, data);
+			assertArrayEquals("Notified and buffered binary content differ.", data, notifiedBytes.toByteArray());
+			assertArrayEquals("Failed to access buffered binary content twice.", data, monitor.getData());
+
+			monitor.flushContents();
+			sysout.write(byteInput, 2, byteInput.length - 2);
+			sysout.flush();
+			TestUtil.waitWhile(() -> notifiedBytes.size() < byteInput.length, 1000);
+			contents = monitor.getContents();
+			assertEquals("Monitor buffered wrong content.", input.substring(1), contents);
+			assertEquals("Failed to access buffered content twice.", contents, monitor.getContents());
+			assertEquals("Wrong content through listener.", input, notifiedChars.toString());
+			data = monitor.getData();
+			expected = new byte[byteInput.length - 2];
+			System.arraycopy(byteInput, 2, expected, 0, expected.length);
+			assertArrayEquals("Monitor read wrong binary content.", expected, data);
+			assertArrayEquals("Failed to access buffered binary content twice.", data, monitor.getData());
+			assertArrayEquals("Wrong binary content through listener.", byteInput, notifiedBytes.toByteArray());
+		} finally {
+			sysout.close();
+			monitor.close();
+		}
+	}
+
+	/**
+	 * Simple test for output stream monitor. Test listeners without buffering.
+	 */
+	@Test
+	public void testUnbufferedOutputStreamMonitor() throws Exception {
+		String input = "o\u00F6O";
+		byte[] byteInput = input.getBytes(StandardCharsets.UTF_8);
+		try {
+			monitor.addBinaryListener(fBinaryListener);
+			monitor.addListener(fStreamListener);
+
+			sysout.write(byteInput, 0, 2);
+			sysout.flush();
+			monitor.setBuffered(false);
+			monitor.startMonitoring();
+			TestUtil.waitWhile(() -> notifiedBytes.size() < 2, 1000);
+			assertEquals("Monitor read wrong content.", input.substring(0, 1), notifiedChars.toString());
+			byte[] expected = new byte[2];
+			System.arraycopy(byteInput, 0, expected, 0, 2);
+			assertArrayEquals("Monitor read wrong binary content.", expected, notifiedBytes.toByteArray());
+
+			monitor.flushContents();
+			sysout.write(byteInput, 2, byteInput.length - 2);
+			sysout.flush();
+			TestUtil.waitWhile(() -> notifiedBytes.size() < byteInput.length, 1000);
+			assertEquals("Wrong content through listener.", input, notifiedChars.toString());
+			expected = new byte[byteInput.length - 2];
+			System.arraycopy(byteInput, 2, expected, 0, expected.length);
+			assertArrayEquals("Wrong binary content through listener.", byteInput, notifiedBytes.toByteArray());
+		} finally {
+			sysout.close();
+			monitor.close();
+		}
+	}
+
+	/**
+	 * Test that passing <code>null</code> as charset does not raise exceptions.
+	 */
+	@Test
+	@SuppressWarnings("resource")
+	public void testNullCharset() throws Exception {
+		String input = "o\u00F6O\u00EFiI\u00D6\u00D8\u00F8";
+
+		sysout.close();
+		sysout = new PipedOutputStream();
+		monitor.close();
+		monitor = new TestOutputStreamMonitor(new PipedInputStream(sysout), null);
+		try {
+			monitor.addListener(fStreamListener);
+			monitor.startMonitoring();
+			try (PrintStream out = new PrintStream(sysout)) {
+				out.print(input);
+			}
+			sysout.flush();
+
+			TestUtil.waitWhile(() -> notifiedChars.length() < input.length(), 500);
+			assertEquals("Monitor read wrong content.", input, notifiedChars.toString());
+		} finally {
+			sysout.close();
+			monitor.close();
+		}
+	}
+
+	/**
+	 * {@link OutputStreamMonitor} with public {@link #startMonitoring()} for
+	 * testing.
+	 */
+	private static class TestOutputStreamMonitor extends OutputStreamMonitor {
+
+		public TestOutputStreamMonitor(InputStream stream, Charset charset) {
+			super(stream, charset);
+		}
+
+		@Override
+		public void startMonitoring() {
+			super.startMonitoring();
+		}
+
+		@Override
+		public void close() {
+			super.close();
+		}
+	}
+}
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java
index 7b274bcc2585e09c6d22c4e58482a9ed134c8b53..e6eb8b195a7b4858fae436f0c628b21356d682de 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java
@@ -14,13 +14,15 @@
 package org.eclipse.debug.tests.console;
 
 import static org.junit.Assert.assertArrayEquals;
-
-import java.io.ByteArrayInputStream;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.text.MessageFormat;
@@ -51,6 +53,7 @@ import org.eclipse.debug.tests.launching.LaunchConfigurationTests;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.debug.ui.console.ConsoleColorProvider;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.ui.console.ConsolePlugin;
 import org.eclipse.ui.console.IConsole;
@@ -405,4 +408,121 @@ public class ProcessConsoleTests extends AbstractDebugTest {
 			TestUtil.waitForJobs(name.getMethodName(), 0, 1000);
 		}
 	}
+
+	/**
+	 * Simulate the common case of a process which constantly produce output.
+	 * This should cover the situation that a process produce output before
+	 * ProcessConsole is initialized and more output after console is ready.
+	 */
+	@Test
+	public void testOutput() throws Exception {
+		String[] lines = new String[] {
+				"'Native' process started.",
+				"'Eclipse' process started. Stream proxying started.",
+				"Console created.", "Console initialized.",
+				"Stopping mock process.", };
+		String consoleEncoding = StandardCharsets.UTF_8.name();
+		try (PipedOutputStream procOut = new PipedOutputStream(); PrintStream sysout = new PrintStream(procOut, true, consoleEncoding)) {
+			@SuppressWarnings("resource")
+			final MockProcess mockProcess = new MockProcess(new PipedInputStream(procOut), null, MockProcess.RUN_FOREVER);
+			sysout.println(lines[0]);
+			try {
+				Map<String, Object> launchConfigAttributes = new HashMap<>();
+				launchConfigAttributes.put(DebugPlugin.ATTR_CONSOLE_ENCODING, consoleEncoding);
+				final IProcess process = mockProcess.toRuntimeProcess("simpleOutput", launchConfigAttributes);
+				sysout.println(lines[1]);
+				@SuppressWarnings("restriction")
+				final org.eclipse.debug.internal.ui.views.console.ProcessConsole console = new org.eclipse.debug.internal.ui.views.console.ProcessConsole(process, new ConsoleColorProvider(), consoleEncoding);
+				sysout.println(lines[2]);
+				try {
+					console.initialize();
+					sysout.println(lines[3]);
+					sysout.println(lines[4]);
+					mockProcess.destroy();
+					sysout.close();
+					TestUtil.processUIEvents(200);
+
+					for (int i = 0; i < lines.length; i++) {
+						IRegion lineInfo = console.getDocument().getLineInformation(i);
+						String line = console.getDocument().get(lineInfo.getOffset(), lineInfo.getLength());
+						assertEquals("Wrong content in line " + i, lines[i], line);
+					}
+				} finally {
+					console.destroy();
+				}
+			} finally {
+				mockProcess.destroy();
+			}
+		}
+	}
+
+	/**
+	 * Test a process which produces binary output and a launch which redirects
+	 * output to file. The process output must not be changed in any way due to
+	 * the redirection. See bug 558463.
+	 */
+	@Test
+	public void testBinaryOutputToFile() throws Exception {
+		byte[] output = new byte[] { (byte) 0xac };
+		String consoleEncoding = StandardCharsets.UTF_8.name();
+
+		final File outFile = createTmpFile("testoutput.bin");
+		final MockProcess mockProcess = new MockProcess(new ByteArrayInputStream(output), null, MockProcess.RUN_FOREVER);
+		try {
+			Map<String, Object> launchConfigAttributes = new HashMap<>();
+			launchConfigAttributes.put(DebugPlugin.ATTR_CONSOLE_ENCODING, consoleEncoding);
+			launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_IN_FILE, outFile.getCanonicalPath());
+			launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, false);
+			final IProcess process = mockProcess.toRuntimeProcess("redirectBinaryOutput", launchConfigAttributes);
+			@SuppressWarnings("restriction")
+			final org.eclipse.debug.internal.ui.views.console.ProcessConsole console = new org.eclipse.debug.internal.ui.views.console.ProcessConsole(process, new ConsoleColorProvider(), consoleEncoding);
+			try {
+				console.initialize();
+				mockProcess.waitFor(100, TimeUnit.MILLISECONDS);
+				mockProcess.destroy();
+			} finally {
+				console.destroy();
+			}
+		} finally {
+			mockProcess.destroy();
+		}
+
+		byte[] receivedOutput = Files.readAllBytes(outFile.toPath());
+		assertArrayEquals(output, receivedOutput);
+	}
+
+	/**
+	 * Test a process which reads binary input from a file through Eclipse
+	 * console. The input must not be changed in any way due to the redirection.
+	 * See bug 558463.
+	 */
+	@Test
+	public void testBinaryInputFromFile() throws Exception {
+		byte[] input = new byte[] { (byte) 0xac };
+		String consoleEncoding = StandardCharsets.UTF_8.name();
+
+		final File inFile = createTmpFile("testinput.bin");
+		Files.write(inFile.toPath(), input);
+		final MockProcess mockProcess = new MockProcess(input.length, testTimeout);
+		try {
+			Map<String, Object> launchConfigAttributes = new HashMap<>();
+			launchConfigAttributes.put(DebugPlugin.ATTR_CONSOLE_ENCODING, consoleEncoding);
+			launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_STDIN_FILE, inFile.getCanonicalPath());
+			launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, false);
+			final IProcess process = mockProcess.toRuntimeProcess("redirectBinaryInput", launchConfigAttributes);
+			@SuppressWarnings("restriction")
+			final org.eclipse.debug.internal.ui.views.console.ProcessConsole console = new org.eclipse.debug.internal.ui.views.console.ProcessConsole(process, new ConsoleColorProvider(), consoleEncoding);
+			try {
+				console.initialize();
+				mockProcess.waitFor(testTimeout, TimeUnit.MILLISECONDS);
+			} finally {
+				console.destroy();
+			}
+		} finally {
+			mockProcess.destroy();
+		}
+
+		byte[] receivedInput = mockProcess.getReceivedInput();
+		assertArrayEquals(input, receivedInput);
+	}
 }
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java
index 2f775f33a0be9e1a0d7f676c9255c7629de9d969..696bc6357e01c24eb76dd6b16b653133252be2ed 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java
@@ -224,23 +224,6 @@ public class TextConsoleViewerTest extends AbstractDebugTest {
 			// if this happened the method may have be renamed or moved
 			throw e;
 		}
-		finally {
-			if (colorR != null) {
-				colorR.dispose();
-			}
-			if (colorG != null) {
-				colorG.dispose();
-			}
-			if (colorB != null) {
-				colorB.dispose();
-			}
-			if (colorK != null) {
-				colorK.dispose();
-			}
-			if (colorW != null) {
-				colorW.dispose();
-			}
-		}
 	}
 
 	/**
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DebugTestModelPresentation.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DebugTestModelPresentation.java
new file mode 100644
index 0000000000000000000000000000000000000000..110af5f13d634f6effa930ed045510dca5859d99
--- /dev/null
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DebugTestModelPresentation.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.tests.viewer.model;
+
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.tests.breakpoint.TestBreakpoint;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.IValueDetailListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.ui.IEditorInput;
+
+/**
+ * Model presentation to show the text attribute of {@link TestBreakpoint}s in
+ * Breakpoint View.
+ */
+public class DebugTestModelPresentation extends LabelProvider implements IDebugModelPresentation {
+
+	@Override
+	public String getText(Object element) {
+		if (element instanceof TestBreakpoint) {
+			return "TestBreakpoint: " + ((TestBreakpoint) element).getText();
+		}
+		return super.getText(element);
+	}
+
+	@Override
+	public IEditorInput getEditorInput(Object element) {
+		return null;
+	}
+
+	@Override
+	public String getEditorId(IEditorInput input, Object element) {
+		return null;
+	}
+
+	@Override
+	public void setAttribute(String attribute, Object value) {
+	}
+
+	@Override
+	public void computeDetail(IValue value, IValueDetailListener listener) {
+		listener.detailComputed(value, null);
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.debug.ui/META-INF/MANIFEST.MF
index c5d38b2783a1702f716f6d7467889f71a9ec9c11..4a6347647d6b53ffda9b04e6d154101029bcd305 100644
--- a/org.eclipse.debug.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.debug.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.debug.ui; singleton:=true
-Bundle-Version: 3.14.500.qualifier
+Bundle-Version: 3.14.600.qualifier
 Bundle-Activator: org.eclipse.debug.internal.ui.DebugUIPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.debug.ui/forceQualifierUpdate.txt b/org.eclipse.debug.ui/forceQualifierUpdate.txt
index bdcfb9f5f93bc64b777ee9922ff1152b35667db5..0ba44bccc130e68a2eabed1e46d0e96692e4c3b8 100644
--- a/org.eclipse.debug.ui/forceQualifierUpdate.txt
+++ b/org.eclipse.debug.ui/forceQualifierUpdate.txt
@@ -1,3 +1,4 @@
 # To force a version qualifier update add the bug here
 Bug 509973 - Comparator errors in I20170105-0320
-Bug 534597 - Unanticipated comparator errors in I20180511-2000
\ No newline at end of file
+Bug 534597 - Unanticipated comparator errors in I20180511-2000
+Bug 566471 - I20200828-0150 - Comparator Errors Found
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif b/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif
deleted file mode 100644
index f529c5a4225f47f76e0fc6a19ef9160c3eee6f0d..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif
deleted file mode 100644
index ac5431fa311bc030ee3ed411a1d9db9915fe6397..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif
deleted file mode 100644
index ac5431fa311bc030ee3ed411a1d9db9915fe6397..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/details_view.gif b/org.eclipse.debug.ui/icons/full/eview16/details_view.gif
deleted file mode 100644
index c81630a08081ef028834e42594bfd40bb98f88c1..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/details_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif b/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif
deleted file mode 100644
index 7ce1112834c586412a98acd9d1d42258cfd7b4f8..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/module_view.gif b/org.eclipse.debug.ui/icons/full/eview16/module_view.gif
deleted file mode 100644
index cb55e33b5ebaed988a88b859aaf3be8b600201cb..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/module_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/register_view.gif b/org.eclipse.debug.ui/icons/full/eview16/register_view.gif
deleted file mode 100644
index 7134210d0a6153361dc40ae589fd73f20059d819..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/register_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif b/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif
deleted file mode 100644
index e35f594d88c44de815d13639ab5f9b1cbaab70a1..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif b/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif
deleted file mode 100644
index c55cb5842e2a23ecbbcc093e63e726b0fb71da19..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif
deleted file mode 100644
index f1e585bdf727a4a0c6b99516d0eacb6dff499214..0000000000000000000000000000000000000000
Binary files a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif and /dev/null differ
diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties
index d8b1dc8f5fe409de03a04e7d3e46c9ab2d762f1b..618f41d4f9b5e73d0ba1487d887bed1ea99ee9f5 100644
--- a/org.eclipse.debug.ui/plugin.properties
+++ b/org.eclipse.debug.ui/plugin.properties
@@ -200,6 +200,9 @@ ActionContext.breakpointsview.description=The breakpoints view context
 ActionDefinition.eof.name= EOF
 ActionDefinition.eof.description= Send end of file
 
+ActionDefinition.clear.name=Clear Console
+ActionDefinition.clear.description=Clear Console
+
 ActionDefinition.addMemoryBlock.name= Add Memory Block
 ActionDefinition.addMemoryBlock.description=Add memory block
 
diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml
index c06fdbfeb0e6301edc6cd9b02557fbbc8acd8494..184ad060857218b501a92c1311b4e0dfbe3c55ac 100644
--- a/org.eclipse.debug.ui/plugin.xml
+++ b/org.eclipse.debug.ui/plugin.xml
@@ -1989,21 +1989,27 @@ M4 = Platform-specific fourth key
             categoryId="org.eclipse.debug.ui.category.run"
             id="org.eclipse.debug.ui.commands.ToggleMethodBreakpoint">
       </command>
-<!-- console -->      
+<!-- console -->
       <command
             name="%ActionDefinition.eof.name"
             categoryId="org.eclipse.debug.ui.category.run"
             description="%ActionDefinition.eof.description"
             id="org.eclipse.debug.ui.commands.eof">
       </command>
+      <command
+            name="%ActionDefinition.clear.name"
+            categoryId="org.eclipse.debug.ui.category.run"
+            description="%ActionDefinition.clear.description"
+            id="org.eclipse.debug.ui.commands.console.clear">
+      </command>
 <!-- Memory View -->
  	  <command
        		categoryId="org.eclipse.debug.ui.category.run"
       		description="%ActionDefinition.addMemoryBlock.description"
      		id="org.eclipse.debug.ui.commands.addMemoryMonitor"
-     		name="%ActionDefinition.addMemoryBlock.name"/>           
+     		name="%ActionDefinition.addMemoryBlock.name"/>
 <!-- views -->
-<!-- Perspective -->      
+<!-- Perspective -->
 	<command
       		name="%DebugPerspective.name"
       		description="%command.openDebugPerspective.description"
diff --git a/org.eclipse.debug.ui/pom.xml b/org.eclipse.debug.ui/pom.xml
index f17774ebfd08b1cdf9c84e64b4dfbf587f986d8b..22d6fbf2174e1bc2060c597fdcb42733b0c5affb 100644
--- a/org.eclipse.debug.ui/pom.xml
+++ b/org.eclipse.debug.ui/pom.xml
@@ -15,11 +15,11 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.debug</groupId>
   <artifactId>org.eclipse.debug.ui</artifactId>
-  <version>3.14.500-SNAPSHOT</version>
+  <version>3.14.600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <code.ignoredWarnings>-warn:+resource,-deprecation,unavoidableGenericProblems</code.ignoredWarnings>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java
index 7f234f4e62bfa98b0b5cbb2bb983e081473a8580..084aa4863d48542c1b1dbedb8a12c7ece0055432 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java
@@ -14,12 +14,8 @@
 package org.eclipse.debug.internal.ui;
 
 import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
@@ -57,18 +53,10 @@ public abstract class AbstractDebugListSelectionDialog extends AbstractDebugSele
 
 	@Override
 	protected void addViewerListeners(StructuredViewer viewer) {
-		viewer.addSelectionChangedListener(new ISelectionChangedListener(){
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-			}
-		});
-		viewer.addDoubleClickListener(new IDoubleClickListener(){
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				if (isValid()){
-					okPressed();
-				}
+		viewer.addSelectionChangedListener(event -> getButton(IDialogConstants.OK_ID).setEnabled(isValid()));
+		viewer.addDoubleClickListener(event -> {
+			if (isValid()){
+				okPressed();
 			}
 		});
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java
index 14af785268f177e1bb1c1840fb0b7fa5686b2a2d..d31bf634c066d5f19942851789bc18698713ab75 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java
@@ -88,7 +88,7 @@ public abstract class AbstractDebugSelectionDialog extends SelectionDialog {
 	 */
 	protected IContentProvider getContentProvider() {
 		//by default return a simple array content provider
-		return new ArrayContentProvider();
+		return ArrayContentProvider.getInstance();
 	}
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
index 4095e260acbe6d0b462d35b888909dde59d46b93..9dc8f62f3b4ca90c6b05b59d0350d0ac5136513e 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
@@ -263,7 +263,7 @@ public class DebugUIPlugin extends AbstractUIPlugin implements ILaunchListener,
 
 	/**
 	 * Prints the given message to System.out or to the OSGi tracing (if started)
-	 * 
+	 *
 	 * @param option    the option or <code>null</code>
 	 * @param message   the message to print or <code>null</code>
 	 * @param throwable the {@link Throwable} or <code>null</code>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java
index c9e2932f4b4e76185922aee801f043ba09c4dd14..5e3092622c0044079658ab0223484bb501893b52 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java
@@ -25,12 +25,8 @@ import org.eclipse.debug.ui.StringVariableSelectionDialog;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -151,12 +147,7 @@ public class MultipleInputDialog extends Dialog {
 					return !text.getText().equals(IInternalDebugCoreConstants.EMPTY_STRING);
 				}
 			});
-			text.addModifyListener(new ModifyListener() {
-				@Override
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
+			text.addModifyListener(e -> validateFields());
 		}
 
 		controlList.add(text);
@@ -195,12 +186,7 @@ public class MultipleInputDialog extends Dialog {
 				}
 			});
 
-			text.addModifyListener(new ModifyListener() {
-				@Override
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
+			text.addModifyListener(e -> validateFields());
 		}
 
 		Button button = createButton(comp, IDialogConstants.IGNORE_ID, DebugUIMessages.MultipleInputDialog_6, false);
@@ -262,12 +248,7 @@ public class MultipleInputDialog extends Dialog {
 				}
 			});
 
-			text.addModifyListener(new ModifyListener() {
-				@Override
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
+			text.addModifyListener(e -> validateFields());
 		}
 
 		Button button = createButton(comp, IDialogConstants.IGNORE_ID, DebugUIMessages.MultipleInputDialog_8, false);
@@ -304,12 +285,9 @@ public class MultipleInputDialog extends Dialog {
 		text.setLayoutData(gd);
 		text.setData(FIELD_NAME, labelText);
 
-		text.addTraverseListener(new TraverseListener () {
-			@Override
-			public void keyTraversed(TraverseEvent e) {
-				if(e.detail == SWT.TRAVERSE_RETURN && e.stateMask == SWT.SHIFT) {
-					e.doit = true;
-				}
+		text.addTraverseListener(e -> {
+			if(e.detail == SWT.TRAVERSE_RETURN && e.stateMask == SWT.SHIFT) {
+				e.doit = true;
 			}
 		});
 
@@ -328,12 +306,7 @@ public class MultipleInputDialog extends Dialog {
 				}
 			});
 
-			text.addModifyListener(new ModifyListener() {
-				@Override
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
+			text.addModifyListener(e -> validateFields());
 		}
 		Composite comp = SWTFactory.createComposite(panel, panel.getFont(), 1, 2, GridData.HORIZONTAL_ALIGN_END);
 		GridLayout ld = (GridLayout)comp.getLayout();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java
index 26a3730e93112e6ef6b003cf6fce243fabf5dd83..49df424dcd125ac288e3df70ee57b574187be43e 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java
@@ -27,15 +27,11 @@ import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.TrayDialog;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
@@ -186,18 +182,8 @@ public class GroupBreakpointsByDialog extends TrayDialog {
 		Table table = fAvailableViewer.getTable();
 		table.setLayoutData(new GridData(GridData.FILL_BOTH));
 		table.setFont(parent.getFont());
-		fAvailableViewer.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				handleAddPressed();
-			}
-		});
-		fAvailableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateAddButton();
-			}
-		});
+		fAvailableViewer.addDoubleClickListener(event -> handleAddPressed());
+		fAvailableViewer.addSelectionChangedListener(event -> updateAddButton());
 	}
 
 	/**
@@ -229,18 +215,8 @@ public class GroupBreakpointsByDialog extends TrayDialog {
 		Tree tree = fSelectedViewer.getTree();
 		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
 		tree.setFont(parent.getFont());
-		fSelectedViewer.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				handleRemovePressed();
-			}
-		});
-		fSelectedViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateSelectedButtons();
-			}
-		});
+		fSelectedViewer.addDoubleClickListener(event -> handleRemovePressed());
+		fSelectedViewer.addSelectionChangedListener(event -> updateSelectedButtons());
 	}
 
 	public void createButtons(Composite parent) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java
index 41505f3ff6a0a33dbfad7242e58b30ab8ba5b2a3..a573edaf4d74377b9a32838ab7e3a01016768ba0 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java
@@ -20,9 +20,7 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IWorkingSet;
@@ -52,12 +50,9 @@ public class SelectBreakpointWorkingsetDialog extends AbstractDebugCheckboxSelec
 	protected void addViewerListeners(StructuredViewer viewer) {
 		CheckboxTableViewer checkViewer = getCheckBoxTableViewer();
 		if (checkViewer != null){
-			checkViewer.addCheckStateListener(new ICheckStateListener(){
-				@Override
-				public void checkStateChanged(CheckStateChangedEvent event) {
-					getCheckBoxTableViewer().setCheckedElements(new Object[] {event.getElement()});
-					getButton(IDialogConstants.OK_ID).setEnabled(true);
-				}
+			checkViewer.addCheckStateListener(event -> {
+				getCheckBoxTableViewer().setCheckedElements(new Object[] {event.getElement()});
+				getButton(IDialogConstants.OK_ID).setEnabled(true);
 			});
 		}
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java
index e2aeb3b70911059e532a67714910de6593d3c1fa..f75ee9379e2ad5255df76e1b1c5943a07e9cc37d 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java
@@ -60,92 +60,89 @@ public class RemoveBreakpointAction extends AbstractSelectionActionDelegate {
 		}
 		final Iterator<?> itr = selection.iterator();
 		final CoreException[] exception= new CoreException[1];
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-			@Override
-			public void run(IProgressMonitor monitor) {
-				Set<IBreakpoint> breakpointsToDelete = new LinkedHashSet<>();
-				ArrayList<IWorkingSet> groupsToDelete = new ArrayList<>();
-				boolean deleteAll = false;
-				boolean deleteContainer = false;
-				boolean prompted = false;
-				while (itr.hasNext()) {
-					Object next= itr.next();
-					IBreakpoint breakpoint = (IBreakpoint)DebugPlugin.getAdapter(next, IBreakpoint.class);
-					if (breakpoint != null) {
-						breakpointsToDelete.add(breakpoint);
-					} else if (next instanceof IBreakpointContainer) {
-						//the the container is a workingset, ask if they want to delete it as well
-						IBreakpointContainer bpc = (IBreakpointContainer) next;
-						if(bpc.getCategory() instanceof WorkingSetCategory) {
-							IWorkingSet set = ((WorkingSetCategory)bpc.getCategory()).getWorkingSet();
-							if(!prompted) {
-								prompted = true;
-								DeleteWorkingsetsMessageDialog dialog = new DeleteWorkingsetsMessageDialog(getView().getSite().getShell(),
-										ActionMessages.RemoveBreakpointAction_3,
-										null,
-										ActionMessages.RemoveBreakpointAction_4,
-										MessageDialog.QUESTION,
-										new String[] {ActionMessages.RemoveBreakpointAction_5, ActionMessages.RemoveBreakpointAction_6},
-										0);
-								if (dialog.open() == Window.CANCEL) {
-									return;
-								}
-								deleteAll = dialog.deleteAllBreakpoints();
-								deleteContainer = dialog.deleteWorkingset();
-							}
-							if(deleteContainer) {
-								groupsToDelete.add(set);
+		IWorkspaceRunnable runnable= monitor -> {
+			Set<IBreakpoint> breakpointsToDelete = new LinkedHashSet<>();
+			ArrayList<IWorkingSet> groupsToDelete = new ArrayList<>();
+			boolean deleteAll = false;
+			boolean deleteContainer = false;
+			boolean prompted = false;
+			while (itr.hasNext()) {
+				Object next= itr.next();
+				IBreakpoint breakpoint = (IBreakpoint)DebugPlugin.getAdapter(next, IBreakpoint.class);
+				if (breakpoint != null) {
+					breakpointsToDelete.add(breakpoint);
+				} else if (next instanceof IBreakpointContainer) {
+					//the the container is a workingset, ask if they want to delete it as well
+					IBreakpointContainer bpc = (IBreakpointContainer) next;
+					if(bpc.getCategory() instanceof WorkingSetCategory) {
+						IWorkingSet set = ((WorkingSetCategory)bpc.getCategory()).getWorkingSet();
+						if(!prompted) {
+							prompted = true;
+							DeleteWorkingsetsMessageDialog dialog = new DeleteWorkingsetsMessageDialog(getView().getSite().getShell(),
+									ActionMessages.RemoveBreakpointAction_3,
+									null,
+									ActionMessages.RemoveBreakpointAction_4,
+									MessageDialog.QUESTION,
+									new String[] {ActionMessages.RemoveBreakpointAction_5, ActionMessages.RemoveBreakpointAction_6},
+									0);
+							if (dialog.open() == Window.CANCEL) {
+								return;
 							}
+							deleteAll = dialog.deleteAllBreakpoints();
+							deleteContainer = dialog.deleteWorkingset();
 						}
-						else {
-							if(!prompted) {
-								IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-								prompted = store.getBoolean(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER);
-								if(prompted) {
-									MessageDialogWithToggle mdwt = MessageDialogWithToggle.openYesNoQuestion(getView().getSite().getShell(), ActionMessages.RemoveBreakpointAction_0,
-											ActionMessages.RemoveBreakpointAction_1, ActionMessages.RemoveAllBreakpointsAction_3, !prompted, null, null);
-									if(mdwt.getReturnCode() == IDialogConstants.NO_ID) {
-										deleteAll = false;
-									}
-									else {
-										store.setValue(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, !mdwt.getToggleState());
-										deleteAll = true;
-									}
+						if(deleteContainer) {
+							groupsToDelete.add(set);
+						}
+					}
+					else {
+						if(!prompted) {
+							IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
+							prompted = store.getBoolean(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER);
+							if(prompted) {
+								MessageDialogWithToggle mdwt = MessageDialogWithToggle.openYesNoQuestion(getView().getSite().getShell(), ActionMessages.RemoveBreakpointAction_0,
+										ActionMessages.RemoveBreakpointAction_1, ActionMessages.RemoveAllBreakpointsAction_3, !prompted, null, null);
+								if(mdwt.getReturnCode() == IDialogConstants.NO_ID) {
+									deleteAll = false;
 								}
 								else {
-									deleteAll = !prompted;
+									store.setValue(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, !mdwt.getToggleState());
+									deleteAll = true;
 								}
 							}
-						}
-						if(deleteAll) {
-							IBreakpoint[] breakpoints = bpc.getBreakpoints();
-							Collections.addAll(breakpointsToDelete, breakpoints);
+							else {
+								deleteAll = !prompted;
+							}
 						}
 					}
+					if(deleteAll) {
+						IBreakpoint[] breakpoints1 = bpc.getBreakpoints();
+						Collections.addAll(breakpointsToDelete, breakpoints1);
+					}
 				}
-				final IBreakpoint[] breakpoints = breakpointsToDelete.toArray(new IBreakpoint[0]);
-				final IWorkingSet[] sets = groupsToDelete.toArray(new IWorkingSet[groupsToDelete.size()]);
-				if(breakpoints.length > 0) {
-					((BreakpointsView)getView()).preserveSelection(getSelection());
-				}
-				new Job(ActionMessages.RemoveBreakpointAction_2) {
-					@Override
-					protected IStatus run(IProgressMonitor pmonitor) {
-						try {
-							Shell shell= getView() != null ? getView().getSite().getShell() : null;
-							DebugUITools.deleteBreakpoints(breakpoints, shell, pmonitor);
+			}
+			final IBreakpoint[] breakpoints2 = breakpointsToDelete.toArray(new IBreakpoint[0]);
+			final IWorkingSet[] sets = groupsToDelete.toArray(new IWorkingSet[groupsToDelete.size()]);
+			if(breakpoints2.length > 0) {
+				((BreakpointsView)getView()).preserveSelection(getSelection());
+			}
+			new Job(ActionMessages.RemoveBreakpointAction_2) {
+				@Override
+				protected IStatus run(IProgressMonitor pmonitor) {
+					try {
+						Shell shell= getView() != null ? getView().getSite().getShell() : null;
+						DebugUITools.deleteBreakpoints(breakpoints2, shell, pmonitor);
 
-							for (IWorkingSet set : sets) {
-								PlatformUI.getWorkbench().getWorkingSetManager().removeWorkingSet(set);
-							}
-							return Status.OK_STATUS;
-						} catch (CoreException e) {
-							DebugUIPlugin.log(e);
+						for (IWorkingSet set : sets) {
+							PlatformUI.getWorkbench().getWorkingSetManager().removeWorkingSet(set);
 						}
-						return Status.CANCEL_STATUS;
+						return Status.OK_STATUS;
+					} catch (CoreException e) {
+						DebugUIPlugin.log(e);
 					}
-				}.schedule();
-			}
+					return Status.CANCEL_STATUS;
+				}
+			}.schedule();
 		};
 		try {
 			ResourcesPlugin.getWorkspace().run(runnable, null, 0, null);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java
index a23e15e3ccc75e195521cfe3d8fdf37ebb569cd3..548245b87b18ef797fcd1742bd31712d37e1613b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java
@@ -21,8 +21,6 @@ import org.eclipse.debug.core.model.IWatchExpression;
 import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
 import org.eclipse.debug.internal.ui.actions.ActionMessages;
 import org.eclipse.debug.internal.ui.actions.StatusInfo;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.bindings.keys.IKeyLookup;
 import org.eclipse.jface.bindings.keys.KeyLookupFactory;
@@ -149,13 +147,10 @@ public class WatchExpressionDialog extends StatusDialog {
 		menuManager.add(cutAction);
 		menuManager.add(copyAction);
 		menuManager.add(pasteAction);
-		menuManager.addMenuListener(new IMenuListener() {
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				cutAction.update();
-				copyAction.update();
-				pasteAction.update();
-			}
+		menuManager.addMenuListener(manager -> {
+			cutAction.update();
+			copyAction.update();
+			pasteAction.update();
 		});
 		Menu menu = menuManager.createContextMenu(fSnippetViewer.getTextWidget());
 		fSnippetViewer.getTextWidget().setMenu(menu);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java
index 89c697c28fbd4f497e62226b6c6ac9df2973a6a5..4aa3b7e61dbdfca2126fb144d3666657dc2b1663 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java
@@ -31,7 +31,6 @@ import org.eclipse.debug.internal.ui.actions.ActionMessages;
 import org.eclipse.debug.internal.ui.views.variables.VariablesView;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.debug.ui.actions.IVariableValueEditor;
-import org.eclipse.jface.dialogs.IInputValidator;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.widgets.Shell;
@@ -126,21 +125,15 @@ public class ChangeVariableValueAction extends SelectionProviderAction {
 			DebugUIPlugin.errorDialog(shell, ActionMessages.ChangeVariableValue_errorDialogTitle,ActionMessages.ChangeVariableValue_errorDialogMessage, exception);	//
 			return;
 		}
-		ChangeVariableValueInputDialog inputDialog = new ChangeVariableValueInputDialog(shell, ActionMessages.ChangeVariableValue_1, MessageFormat.format(ActionMessages.ChangeVariableValue_2, new Object[] { name }), value, new IInputValidator() { //
-			/**
-			 * Returns an error string if the input is invalid
-			 */
-			@Override
-			public String isValid(String input) {
-				try {
-					if (fVariable.verifyValue(input)) {
-						return null; // null means valid
-					}
-				} catch (DebugException exception) {
-					return ActionMessages.ChangeVariableValue_3;
+		ChangeVariableValueInputDialog inputDialog = new ChangeVariableValueInputDialog(shell, ActionMessages.ChangeVariableValue_1, MessageFormat.format(ActionMessages.ChangeVariableValue_2, new Object[] { name }), value, input -> {
+			try {
+				if (fVariable.verifyValue(input)) {
+					return null; // null means valid
 				}
-				return ActionMessages.ChangeVariableValue_4;
+			} catch (DebugException exception) {
+				return ActionMessages.ChangeVariableValue_3;
 			}
+			return ActionMessages.ChangeVariableValue_4;
 		});
 
 		inputDialog.open();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java
index 081a4a43a8e51528d7473931381ce8395ede1f02..fdd3f2feaf0a789eda56e2d67f990174525e0d11 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java
@@ -21,8 +21,6 @@ import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.dialogs.IInputValidator;
 import org.eclipse.jface.dialogs.TrayDialog;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Button;
@@ -161,16 +159,13 @@ public class ChangeVariableValueInputDialog extends TrayDialog {
 		text.setLayoutData(gridData);
 		text.setFont(font);
 		text.addModifyListener(
-				new ModifyListener() {
-					@Override
-					public void modifyText(ModifyEvent e) {
-						if (okButton.isEnabled()) {
-							return;
-						}
-						errorMessageLabel.setText(IInternalDebugCoreConstants.EMPTY_STRING);
-						errorMessageLabel.getParent().update();
-						okButton.setEnabled(true);
+				e -> {
+					if (okButton.isEnabled()) {
+						return;
 					}
+					errorMessageLabel.setText(IInternalDebugCoreConstants.EMPTY_STRING);
+					errorMessageLabel.getParent().update();
+					okButton.setEnabled(true);
 				}
 		);
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java
index 7778425fed507a8d1b7a7291a33de27ea654bea9..bcf843595f90f11c03c454acce7baee4d4092883 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java
@@ -23,8 +23,6 @@ import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.dialogs.IInputValidator;
 import org.eclipse.jface.dialogs.TrayDialog;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -57,21 +55,17 @@ public class DetailPaneMaxLengthDialog extends TrayDialog {
 		super(parent);
 		setShellStyle(getShellStyle() | SWT.RESIZE);
 		fValue = Integer.toString(DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH));
-		fValidator = new IInputValidator() {
-					@Override
-					public String isValid(String newText) {
-						try {
-							int num = Integer.parseInt(newText);
-							if (num < 0) {
-								return VariablesViewMessages.DetailPaneMaxLengthDialog_2;
-							}
-						} catch (NumberFormatException e) {
-							return VariablesViewMessages.DetailPaneMaxLengthDialog_3;
-						}
-						return null;
-					}
-
-				};
+		fValidator = newText -> {
+			try {
+				int num = Integer.parseInt(newText);
+				if (num < 0) {
+					return VariablesViewMessages.DetailPaneMaxLengthDialog_2;
+				}
+			} catch (NumberFormatException e) {
+				return VariablesViewMessages.DetailPaneMaxLengthDialog_3;
+			}
+			return null;
+		};
 	}
 
 	@Override
@@ -104,12 +98,9 @@ public class DetailPaneMaxLengthDialog extends TrayDialog {
 		fTextWidget = new Text(composite, SWT.SINGLE | SWT.BORDER);
 		fTextWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
 		fTextWidget.setText(fValue);
-		fTextWidget.addModifyListener(new ModifyListener() {
-			@Override
-			public void modifyText(ModifyEvent e) {
-				validateInput();
-				fValue = fTextWidget.getText();
-			}
+		fTextWidget.addModifyListener(e -> {
+			validateInput();
+			fValue = fTextWidget.getText();
 		});
 		fErrorTextWidget = new Text(composite, SWT.READ_ONLY);
 		fErrorTextWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java
index 8a4d9b69871300d3154e68ce9220b77bae6dd7e5..730c7f8fd86f413146048e32339e6ec13d100899 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java
@@ -48,9 +48,7 @@ import org.eclipse.debug.ui.ILaunchGroup;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.ITableLabelProvider;
@@ -58,7 +56,6 @@ import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.accessibility.AccessibleAdapter;
 import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -111,12 +108,7 @@ class CommonTabLite extends AbstractLaunchConfigurationTab {
 	/**
 	 * Modify listener that simply updates the owning launch configuration dialog.
 	 */
-	private ModifyListener fBasicModifyListener = new ModifyListener() {
-		@Override
-		public void modifyText(ModifyEvent evt) {
-			updateLaunchConfigurationDialog();
-		}
-	};
+	private ModifyListener fBasicModifyListener = evt -> updateLaunchConfigurationDialog();
 
 	@Override
 	public void createControl(Composite parent) {
@@ -144,12 +136,7 @@ class CommonTabLite extends AbstractLaunchConfigurationTab {
 		table.setFont(parent.getFont());
 		fFavoritesTable.setContentProvider(new FavoritesContentProvider());
 		fFavoritesTable.setLabelProvider(new FavoritesLabelProvider());
-		fFavoritesTable.addCheckStateListener(new ICheckStateListener() {
-				@Override
-				public void checkStateChanged(CheckStateChangedEvent event) {
-					updateLaunchConfigurationDialog();
-				}
-			});
+		fFavoritesTable.addCheckStateListener(event -> updateLaunchConfigurationDialog());
 	}
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java
index 4a55978f0d1a98c02410287d130fe98d0cc3e1b6..0ff1d19cf49ebc95c6c6fc1ed71a895b308f5c8a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java
@@ -50,8 +50,6 @@ import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
@@ -257,21 +255,18 @@ class GroupLaunchConfigurationSelectionDialog extends TitleAreaDialog implements
 		fActionParamLabel = new Label(comp, SWT.NONE);
 		fActionParamWidget = new Text(comp, SWT.SINGLE | SWT.BORDER);
 		GridDataFactory.fillDefaults().applyTo(fActionParamWidget);
-		fActionParamWidget.addModifyListener(new ModifyListener() {
-			@Override
-			public void modifyText(ModifyEvent e) {
-				String text = ((Text) e.widget).getText();
-				if (action == GroupElementPostLaunchAction.DELAY) {
-					try {
-						actionParam = Integer.valueOf(text);
-					} catch (NumberFormatException exc) {
-						actionParam = null;
-					}
-				} else if (action == GroupElementPostLaunchAction.OUTPUT_REGEXP) {
-					actionParam = text;
+		fActionParamWidget.addModifyListener(e -> {
+			String text = ((Text) e.widget).getText();
+			if (action == GroupElementPostLaunchAction.DELAY) {
+				try {
+					actionParam = Integer.valueOf(text);
+				} catch (NumberFormatException exc) {
+					actionParam = null;
 				}
-				validate();
+			} else if (action == GroupElementPostLaunchAction.OUTPUT_REGEXP) {
+				actionParam = text;
 			}
+			validate();
 		});
 		if (actionParam instanceof Integer) {
 			fActionParamWidget.setText(((Integer) actionParam).toString());
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java
index a0086d77dbde08ad6093ad7c112e04ea1bc0f610..8d9940f0bc2c5a27f6e4ec3b5f88449c8300a48a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java
@@ -195,7 +195,7 @@ public class ExpressionInformationControlCreator implements IInformationControlC
 		private IDialogSettings getDialogSettings(boolean create) {
 			IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
 			IDialogSettings section = settings.getSection(this.getClass().getName());
-			if (section == null & create) {
+			if (section == null && create) {
 				section = settings.addNewSection(this.getClass().getName());
 			}
 			return section;
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java
index 4e21e81157d4ab8b513e198fb8397c751b0cb231..137c02397d8439f8acdce80dc487e023510331ba 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java
@@ -35,7 +35,6 @@ import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
 import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer;
 import org.eclipse.debug.ui.IDebugModelPresentation;
 import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
@@ -62,12 +61,7 @@ public class EmbeddedBreakpointsViewer {
 	private BreakpointsContentProvider fProvider = null;
 	private Tree fTree = null;
 	private BreakpointsViewer fViewer = null;
-	private ICheckStateListener fCheckListener = new ICheckStateListener() {
-		@Override
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			updateCheckedState(event.getElement(), event.getChecked());
-		}
-	};
+	private ICheckStateListener fCheckListener = event -> updateCheckedState(event.getElement(), event.getChecked());
 
 	/**
 	 * This constructor allows a specific selection to be used in stead of the default
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java
index 57e7c6a7d6564454fce621bc095115db11471779..2b9d737ad2d0d9e75da031717fc107e93b8c8c33 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java
@@ -34,8 +34,6 @@ import org.eclipse.debug.ui.actions.ExportBreakpointsOperation;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
@@ -173,12 +171,7 @@ public class WizardExportBreakpointsPage extends WizardPage implements Listener
 		Composite composite = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
 		SWTFactory.createLabel(composite, ImportExportMessages.WizardExportBreakpointsPage_2, 1);
 		fTView = new EmbeddedBreakpointsViewer(composite, DebugPlugin.getDefault().getBreakpointManager(), fSelection);
-		fTView.getViewer().addCheckStateListener(new ICheckStateListener() {
-			@Override
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				setPageComplete(detectPageComplete());
-			}
-		});
+		fTView.getViewer().addCheckStateListener(event -> setPageComplete(detectPageComplete()));
 		fTView.getViewer().setSelection(fSelection);
 		//ensure we can see the beginning check-boxes etc. (bug 180971)
 		//this will not work in Windows Vista as there is no way to over-ride the default viewer item showing policy
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java
index fba1257bb9354c06ffeeb272cb807ff5f1313412..b63dd42482bec9281c150fcff3614db0f5695adb 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java
@@ -29,7 +29,6 @@ import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
 import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.actions.ImportBreakpointsOperation;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.DecoratingLabelProvider;
 import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.ILabelProvider;
@@ -54,12 +53,7 @@ public class WizardImportBreakpointsSelectionPage extends WizardPage implements
 	private Button fSelectAll = null;
 	private Button fDeselectAll = null;
 
-	private ICheckStateListener fImportCheckListener = new ICheckStateListener() {
-		@Override
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			updateCheckedState(event.getChecked());
-		}
-	};
+	private ICheckStateListener fImportCheckListener = event -> updateCheckedState(event.getChecked());
 	protected WizardImportBreakpointsSelectionPage(String pageName) {
 		super(pageName, ImportExportMessages.WizardImportBreakpointsSelectionPage_2, null);
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java
index 378ab54a8edff63c679672b8bfd3b5fc6e086ad8..7465864eeb1b5737af97603c3f43060ac5e4fb9a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java
@@ -254,8 +254,8 @@ public class ExportLaunchConfigurationsWizardPage extends WizardPage {
 					onechecked = true;
 				}
 			}
-			fViewer.setGrayed(parent, onechecked & !checked);
-			fViewer.setChecked(parent, checked | onechecked);
+			fViewer.setGrayed(parent, onechecked && !checked);
+			fViewer.setChecked(parent, checked || onechecked);
 		}
 	}
 
@@ -366,7 +366,7 @@ public class ExportLaunchConfigurationsWizardPage extends WizardPage {
 									errors.add(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), MessageFormat.format(WizardMessages.ExportLaunchConfigurationsWizardPage_19, new Object[] { launchConfig.getName() }), null));
 								} else {
 									newfile = new File(destpath.append(file.getName()).toOSString());
-									if(newfile.exists() & !overwrite) {
+									if(newfile.exists() && !overwrite) {
 										if(nowall) {
 											continue;
 										}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java
index bd62dc8ea33b766301764b29206052aaf49c9387..aa77749bfda9dc77cb4951267dfe83ff204d7a44 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java
@@ -174,7 +174,7 @@ public class ImportLaunchConfigurationsWizardPage extends WizardResourceImportPa
 		for (Object resource :  getSelectedResources()) {
 			config = (File) ((DebugFileSystemElement) resource).getFileSystemObject();
 			newconfig = new File(new Path(LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH.toOSString()).append(config.getName()).toOSString());
-			if(newconfig.exists() & !overwrite) {
+			if(newconfig.exists() && !overwrite) {
 				if(nowall) {
 					continue;
 				}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java
index a4ca54ce5eee8162733d80d1a1884b37dbb8c328..5f66d2719ec5fc4291a01809f0133e9a50340daf 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java
@@ -37,7 +37,6 @@ import org.eclipse.jface.viewers.IContentProvider;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
@@ -99,12 +98,7 @@ public class FavoritesDialog extends TrayDialog {
 	/**
 	 * Listener that delegates when the selection changes in a table
 	 */
-	private ISelectionChangedListener fSelectionChangedListener= new ISelectionChangedListener() {
-		@Override
-		public void selectionChanged(SelectionChangedEvent event) {
-			handleFavoriteSelectionChanged();
-		}
-	};
+	private ISelectionChangedListener fSelectionChangedListener= event -> handleFavoriteSelectionChanged();
 
 	/**
 	 * Listener that delegates when a key is pressed in a table
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java
index 3a80b7724ac8746c7d278e03400c0c59313a2eb1..f064ec2af7b3ab67a9cb610a97857bea71c5b1ca 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java
@@ -15,7 +15,6 @@ package org.eclipse.debug.internal.ui.launchConfigurations;
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -66,14 +65,10 @@ public class LaunchConfigurationComparator extends WorkbenchViewerComparator {
 		if (fgCategories == null) {
 			fgCategories = new HashMap<>();
 			List<ILaunchConfigurationType> types = Arrays.asList(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes());
-			Collections.sort(types, new Comparator<ILaunchConfigurationType>() {
-				@Override
-				public int compare(ILaunchConfigurationType o1, ILaunchConfigurationType o2) {
-					ILaunchConfigurationType t1 = o1;
-					ILaunchConfigurationType t2 = o2;
-					return t1.getName().compareTo(t2.getName());
-				}
-
+			Collections.sort(types, (o1, o2) -> {
+				ILaunchConfigurationType t1 = o1;
+				ILaunchConfigurationType t2 = o2;
+				return t1.getName().compareTo(t2.getName());
 			});
 			Iterator<ILaunchConfigurationType> iterator = types.iterator();
 			int i = 0;
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java
index f916fef0d84672c40c2093f40134700e7b444fe3..be47357952f6ae3858f1b7213d57aa82f9f297e2 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java
@@ -32,7 +32,6 @@ import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.FilteredTree;
@@ -87,12 +86,7 @@ public final class LaunchConfigurationFilteredTree extends FilteredTree {
 				treeViewer.addFilter(filter);
 			}
 		}
-		treeViewer.getControl().addHelpListener(new HelpListener() {
-			@Override
-			public void helpRequested(HelpEvent evt) {
-				handleHelpRequest(evt);
-			}
-		});
+		treeViewer.getControl().addHelpListener(this::handleHelpRequest);
 		return treeViewer;
 	}
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java
index c056a43dd97a8a786f7260b5f0ea79ef2c12fc30..f7e750bf8158116b86e0e5d52f76a6c4a6f14e4b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java
@@ -586,7 +586,8 @@ public class LaunchConfigurationTabGroupViewer {
 		} else {
 			fOptionsErrorLabel.setImage(null);
 		}
-		fViewform.layout(true, true);
+		fOptionsLink.requestLayout();
+		fOptionsErrorLabel.requestLayout();
 	}
 
 	/**
@@ -805,13 +806,14 @@ public class LaunchConfigurationTabGroupViewer {
 		fApplyButton.setVisible(visible);
 		fRevertButton.setVisible(visible);
 		fOptionsLink.setVisible(visible);
+		StackLayout layout = (StackLayout)fTabPlaceHolder.getLayout();
 		if(visible) {
-			((StackLayout)fTabPlaceHolder.getLayout()).topControl = fGroupComposite;
+			layout.topControl = fGroupComposite;
 		}
 		else {
-			((StackLayout)fTabPlaceHolder.getLayout()).topControl = fGettingStarted;
+			layout.topControl = fGettingStarted;
 		}
-		fTabPlaceHolder.layout(true, true);
+		layout.topControl.requestLayout();
 	}
 
 	private void updateShowCommandLineVisibility(boolean visible) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java
index a9b491ca19ca7617f3790a0b93a5faabd7ef8286..58a92a2a49c377455bd5c617f97c749d4c98a686 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java
@@ -61,7 +61,6 @@ import org.eclipse.jface.operation.ModalContext;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
@@ -588,20 +587,17 @@ public class LaunchConfigurationsDialog extends TitleAreaDialog implements ILaun
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		control.setLayoutData(gd);
 		viewForm.setContent(viewFormContents);
-		AbstractLaunchConfigurationAction.IConfirmationRequestor requestor = new AbstractLaunchConfigurationAction.IConfirmationRequestor() {
-			@Override
-			public boolean getConfirmation() {
-				int status = shouldSaveCurrentConfig();
-				if(status == IDialogConstants.YES_ID) {
-					fTabViewer.handleApplyPressed();
-					return true;
-				}
-				else if(status == IDialogConstants.NO_ID) {
-					fTabViewer.handleRevertPressed();
-					return true;
-				}
-				return false;
+		AbstractLaunchConfigurationAction.IConfirmationRequestor requestor = () -> {
+			int status = shouldSaveCurrentConfig();
+			if(status == IDialogConstants.YES_ID) {
+				fTabViewer.handleApplyPressed();
+				return true;
 			}
+			else if(status == IDialogConstants.NO_ID) {
+				fTabViewer.handleRevertPressed();
+				return true;
+			}
+			return false;
 		};
 		getDuplicateAction().setConfirmationRequestor(requestor);
 		getExportAction().setConfirmationRequestor(requestor);
@@ -610,19 +606,16 @@ public class LaunchConfigurationsDialog extends TitleAreaDialog implements ILaun
 		getLinkPrototypeAction().setConfirmationRequestor(requestor);
 		getUnlinkPrototypeAction().setConfirmationRequestor(requestor);
 		getResetWithPrototypeValuesAction().setConfirmationRequestor(requestor);
-		((StructuredViewer) viewer).addPostSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				handleLaunchConfigurationSelectionChanged(event);
-				getNewAction().setEnabled(getNewAction().isEnabled());
-				getNewPrototypeAction().setEnabled(getNewPrototypeAction().isEnabled());
-				getDeleteAction().setEnabled(getDeleteAction().isEnabled());
-				getExportAction().setEnabled(getExportAction().isEnabled());
-				getDuplicateAction().setEnabled(getDuplicateAction().isEnabled());
-				getLinkPrototypeAction().setEnabled(getLinkPrototypeAction().isEnabled());
-				getUnlinkPrototypeAction().setEnabled(getUnlinkPrototypeAction().isEnabled());
-				getResetWithPrototypeValuesAction().setEnabled(getResetWithPrototypeValuesAction().isEnabled());
-			}
+		((StructuredViewer) viewer).addPostSelectionChangedListener(event -> {
+			handleLaunchConfigurationSelectionChanged(event);
+			getNewAction().setEnabled(getNewAction().isEnabled());
+			getNewPrototypeAction().setEnabled(getNewPrototypeAction().isEnabled());
+			getDeleteAction().setEnabled(getDeleteAction().isEnabled());
+			getExportAction().setEnabled(getExportAction().isEnabled());
+			getDuplicateAction().setEnabled(getDuplicateAction().isEnabled());
+			getLinkPrototypeAction().setEnabled(getLinkPrototypeAction().isEnabled());
+			getUnlinkPrototypeAction().setEnabled(getUnlinkPrototypeAction().isEnabled());
+			getResetWithPrototypeValuesAction().setEnabled(getResetWithPrototypeValuesAction().isEnabled());
 		});
 		return comp;
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties
index dbabd94cf43ab9affd68217da5bf032acdc94d48..9361e7b52501923a67f3d533709322f9c17afbcb 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties
@@ -253,7 +253,7 @@ OrganizeFavoritesAction_0=Organize Fa&vorites...
 PerspectiveManager_12=Confirm Perspective Switch
 PerspectiveManager_13=This kind of launch is configured to open the {0} perspective when it suspends. Do you want to switch to this perspective now?
 PerspectiveManager_15=This kind of launch is associated with the {0} perspective. Do you want to switch to this perspective now?
-PerspectiveManager_suspend_description=This kind of launch is configured to open the {0} perspective when it suspends.\n\n{1}\n\nDo you want to switch to this perspective now?
+PerspectiveManager_suspend_description=This kind of launch is configured to open the {0} perspective when it suspends.\n\n{1}\n\nSwitch to this perspective?
 PerspectiveManager_launch_description=This kind of launch is associated with the {0} perspective.\n\n{1}\n\nDo you want to switch to this perspective now?
 PerspectiveManager_switch=&Switch
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java
index bce24bd6a4ff15a54fe8d1f236875242e5d8ee0f..8b4e3705e963eb2cf821a769bd1d44d6e6c3dd10 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java
@@ -25,9 +25,7 @@ import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
 import org.eclipse.debug.internal.ui.SWTFactory;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -89,15 +87,12 @@ public class LaunchShortcutSelectionDialog extends AbstractDebugListSelectionDia
 	@Override
 	protected void addViewerListeners(StructuredViewer viewer) {
 		super.addViewerListeners(viewer);
-		viewer.addSelectionChangedListener(new ISelectionChangedListener(){
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = event.getStructuredSelection();
-				if (!selection.isEmpty()) {
-					LaunchShortcutExtension shortcutSource = (LaunchShortcutExtension) selection.getFirstElement();
-					String description = shortcutSource.getShortcutDescription(fMode);
-					fDescriptionText.setText((description == null ? LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_3 : description));
-				}
+		viewer.addSelectionChangedListener(event -> {
+			IStructuredSelection selection = event.getStructuredSelection();
+			if (!selection.isEmpty()) {
+				LaunchShortcutExtension shortcutSource = (LaunchShortcutExtension) selection.getFirstElement();
+				String description = shortcutSource.getShortcutDescription(fMode);
+				fDescriptionText.setText((description == null ? LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_3 : description));
 			}
 		});
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java
index 38350c96ae43768db26f2eda813c60cab87669bd..4cf54a11e1cfe8859891a22d2790e8e38ae2bd10 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2017 IBM Corporation and others.
+ * Copyright (c) 2006, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -35,6 +35,7 @@ import org.eclipse.jface.viewers.IBaseLabelProvider;
 import org.eclipse.jface.viewers.IContentProvider;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -49,7 +50,6 @@ import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.IDE;
 import org.eclipse.ui.model.AdaptableList;
 import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
 
 /**
  * Status handler to prompt for saving of resources prior to launching.
@@ -244,7 +244,7 @@ public class SaveScopeResourcesHandler implements IStatusHandler {
 				ScopedResourcesSelectionDialog lsd = new ScopedResourcesSelectionDialog(DebugUIPlugin.getShell(),
 						new AdaptableList(resources),
 						new WorkbenchContentProvider(),
-						new WorkbenchLabelProvider());
+						new SaveResourceDialogWorkbenchLabelProvider());
 				lsd.setInitialSelections((Object[]) resources);
 				lsd.setTitle(LaunchConfigurationsMessages.SaveScopeResourcesHandler_3);
 				if(lsd.open() == IDialogConstants.CANCEL_ID) {
@@ -262,4 +262,17 @@ public class SaveScopeResourcesHandler implements IStatusHandler {
 		}
 		return IDialogConstants.OK_ID;
 	}
+
 }
+
+
+class SaveResourceDialogWorkbenchLabelProvider extends LabelProvider {
+	@Override
+	public final String getText(Object element) {
+		if (element instanceof IResource) {
+			return ((IResource)element).getFullPath().toString();
+		}
+		return super.getText(element);
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java
index eb21df1801dab4389ca72e5a51d6ac20dd061944..66749e8c1364810b6957b9a8d5221aaccc6f11ee 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java
@@ -31,9 +31,7 @@ import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.viewers.IBaseLabelProvider;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.Viewer;
@@ -108,7 +106,7 @@ public class SelectLaunchersDialog extends AbstractDebugListSelectionDialog {
 			try {
 				int width = settings.getInt("DIALOG_WIDTH"); //$NON-NLS-1$
 				int height = settings.getInt("DIALOG_HEIGHT"); //$NON-NLS-1$
-				if(width > 0 & height > 0) {
+				if(width > 0 && height > 0) {
 					return new Point(width, height);
 				}
 			}
@@ -245,16 +243,13 @@ public class SelectLaunchersDialog extends AbstractDebugListSelectionDialog {
 	@Override
 	protected void addViewerListeners(StructuredViewer viewer) {
 		// Override super to use custom listeners
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection ss = event.getStructuredSelection();
-				if(ss != null && !ss.isEmpty()) {
-					SelectLaunchersDialog.this.description.setText(((ILaunchDelegate)ss.getFirstElement()).getDescription());
-				}
-				else {
-					SelectLaunchersDialog.this.description.setText(IInternalDebugCoreConstants.EMPTY_STRING);
-				}
+		viewer.addSelectionChangedListener(event -> {
+			IStructuredSelection ss = event.getStructuredSelection();
+			if(ss != null && !ss.isEmpty()) {
+				SelectLaunchersDialog.this.description.setText(((ILaunchDelegate)ss.getFirstElement()).getDescription());
+			}
+			else {
+				SelectLaunchersDialog.this.description.setText(IInternalDebugCoreConstants.EMPTY_STRING);
 			}
 		});
 		super.addViewerListeners(viewer);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java
index e64b805dbe31826f42bb33449e4df27fde154e80..89e241016e1a3c721404ed83c3cb4750a8fe80e9 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java
@@ -112,20 +112,9 @@ public class BreakpointManagerContentProvider extends ElementContentProvider
 
 		private IStructuredSelection fDebugContext = StructuredSelection.EMPTY;
 
-		private IPropertyChangeListener fOrganizersListener = new IPropertyChangeListener() {
-			@Override
-			public void propertyChange(PropertyChangeEvent event) {
-				// For any property changes in breakpoint organizers, refresh the containers.
-				updateContainers();
-			}
-		};
+		private IPropertyChangeListener fOrganizersListener = event -> updateContainers();
 
-		private IPropertyChangeListener fPresentationContextListener = new IPropertyChangeListener() {
-			@Override
-			public void propertyChange(PropertyChangeEvent event) {
-				presentationPropertyChanged(event);
-			}
-		};
+		private IPropertyChangeListener fPresentationContextListener = this::presentationPropertyChanged;
 
 		private IDebugContextListener fDebugContextListener = InputData.this::debugContextChanged;
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java
index ab8f4dca0c06bab69fffacc5c89a8953fda41e57..fbdf847e630b4aeb6cc70d7c7f0e7fccea272ed9 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java
@@ -20,7 +20,6 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
 import org.eclipse.debug.core.ILogicalStructureType;
 import org.eclipse.debug.core.model.IDebugElement;
 import org.eclipse.debug.core.model.IIndexedValue;
@@ -233,23 +232,20 @@ public class VariableContentProvider extends ElementContentProvider {
 		if (fgLogicalCache == null){
 			fgLogicalCache = new LogicalStructureCache();
 			// Add a listener to clear the cache when resuming, terminating, or suspending
-			DebugPlugin.getDefault().addDebugEventListener(new IDebugEventSetListener(){
-				@Override
-				public void handleDebugEvents(DebugEvent[] events) {
-					for (DebugEvent event : events) {
-						if (event.getKind() == DebugEvent.TERMINATE) {
-							fgLogicalCache.clear();
-							break;
-						} else if (event.getKind() == DebugEvent.RESUME && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) {
-							fgLogicalCache.clear();
-							break;
-						} else if (event.getKind() == DebugEvent.SUSPEND && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) {
-							fgLogicalCache.clear();
-							break;
-						} else if (event.getKind() == DebugEvent.CHANGE && event.getDetail() == DebugEvent.CONTENT) {
-							fgLogicalCache.clear();
-							break;
-						}
+			DebugPlugin.getDefault().addDebugEventListener(events -> {
+				for (DebugEvent event : events) {
+					if (event.getKind() == DebugEvent.TERMINATE) {
+						fgLogicalCache.clear();
+						break;
+					} else if (event.getKind() == DebugEvent.RESUME && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) {
+						fgLogicalCache.clear();
+						break;
+					} else if (event.getKind() == DebugEvent.SUSPEND && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) {
+						fgLogicalCache.clear();
+						break;
+					} else if (event.getKind() == DebugEvent.CHANGE && event.getDetail() == DebugEvent.CONTENT) {
+						fgLogicalCache.clear();
+						break;
 					}
 				}
 			});
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java
index bed606c1b053fd8ba5028de407df88fa35c7917f..d51ed864c1cf3a7c4233eaba5a9e3140839f011b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java
@@ -37,8 +37,6 @@ import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.preference.BooleanFieldEditor;
 import org.eclipse.jface.preference.FieldEditor;
 import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
 import org.eclipse.jface.viewers.IBaseLabelProvider;
 import org.eclipse.jface.viewers.IContentProvider;
@@ -228,22 +226,19 @@ public class LaunchConfigurationsPreferencePage extends PreferencePage implement
 	private Composite createTypeFiltering(Composite parent) {
 		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_HORIZONTAL);
 		BooleanFieldEditor2 editor = new BooleanFieldEditor2(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES, DebugPreferencesMessages.LaunchConfigurationsPreferencePage_0, SWT.NONE, comp);
-		editor.setPropertyChangeListener(new IPropertyChangeListener() {
-			@Override
-			public void propertyChange(PropertyChangeEvent event) {
-				boolean newvalue = false;
-				if(event.getNewValue() instanceof Boolean) {
-					newvalue = ((Boolean)event.getNewValue()).booleanValue();
-				}
-				else {
-					newvalue = Boolean.valueOf(event.getNewValue().toString()).booleanValue();
-				}
-				if(newvalue) {
-					fTable.setEnabled(true);
-				}
-				else {
-					fTable.setEnabled(false);
-				}
+		editor.setPropertyChangeListener(event -> {
+			boolean newvalue = false;
+			if(event.getNewValue() instanceof Boolean) {
+				newvalue = ((Boolean)event.getNewValue()).booleanValue();
+			}
+			else {
+				newvalue = Boolean.valueOf(event.getNewValue().toString()).booleanValue();
+			}
+			if(newvalue) {
+				fTable.setEnabled(true);
+			}
+			else {
+				fTable.setEnabled(false);
 			}
 		});
 		fFieldEditors.add(editor);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java
index 750ba5e748462c221aebfbb9b75dcc16a0578817..c6055fad0131d5828c9017998b5d99ad5ffcd7f6 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java
@@ -42,12 +42,8 @@ import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.MessageDialogWithToggle;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
@@ -328,20 +324,12 @@ public class LaunchPerspectivePreferencePage extends PreferencePage implements I
 		gd.heightHint = 250;
 		fTree.setLayoutData(gd);
 		fTreeViewer = new PerspectivesTreeViewer(fTree);
-		fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				fPerspectivesPanel.refreshPanel(event.getStructuredSelection());
-			}
-		});
-		fTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				IStructuredSelection ss = (IStructuredSelection) event.getSelection();
-				if(!ss.isEmpty()) {
-					Object obj = ss.getFirstElement();
-					fTreeViewer.setExpandedState(obj, !fTreeViewer.getExpandedState(obj));
-				}
+		fTreeViewer.addSelectionChangedListener(event -> fPerspectivesPanel.refreshPanel(event.getStructuredSelection()));
+		fTreeViewer.addDoubleClickListener(event -> {
+			IStructuredSelection ss = (IStructuredSelection) event.getSelection();
+			if(!ss.isEmpty()) {
+				Object obj = ss.getFirstElement();
+				fTreeViewer.setExpandedState(obj, !fTreeViewer.getExpandedState(obj));
 			}
 		});
 		fTreeViewer.setLabelProvider(DebugUITools.newDebugModelPresentation());
@@ -468,27 +456,22 @@ public class LaunchPerspectivePreferencePage extends PreferencePage implements I
 
 	//prep selection context, remove types from the equation
 		HashSet<ILaunchDelegate> delegates = new HashSet<>();
-		Object o = null;
-		for(int i = 0; i < selection.length; i++) {
-			o = selection[i];
+		for (Object o : selection) {
 			if(o instanceof ILaunchDelegate) {
 				delegates.add((ILaunchDelegate) o);
 			}
 			else if(o instanceof ILaunchConfigurationType) {
 				fgCurrentWorkingContext.add(o);
-				Object[] kids = fTreeViewer.getFilteredChildren(o);
-				for (int j = 0; j < kids.length; j++) {
-					delegates.add((ILaunchDelegate) kids[i]);
+				for (Object kid : fTreeViewer.getFilteredChildren(o)) {
+					delegates.add((ILaunchDelegate) kid);
 				}
 			}
 		}
 	//compare the listing of delegates to find common mode sets
 		HashSet<Set<String>> common = new HashSet<>();
-		List<Set<String>> modes = null;
 		HashSet<Set<String>> pruned = new HashSet<>();
 		for (ILaunchDelegate delegate : delegates) {
-			modes = delegate.getModes();
-			for (Set<String> fmodes : modes) {
+			for (Set<String> fmodes : delegate.getModes()) {
 				if (isCommonModeset(fmodes, delegates, pruned)) {
 					common.add(fmodes);
 					fgCurrentWorkingContext.add(delegate);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java
index cc9fbc128952fba6132872960f757cd5b48a9f40..a7691894386bef679712b90174423e9c4eb56a54 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java
@@ -33,13 +33,9 @@ import org.eclipse.debug.internal.ui.SWTFactory;
 import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
@@ -190,25 +186,22 @@ public class LaunchersPreferencePage extends PreferencePage implements IWorkbenc
 		fTreeViewer.setLabelProvider(new LabelProvider());
 		fTreeViewer.setInput(fDuplicates);
 		fTreeViewer.expandToLevel(2);
-		fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				Object obj = event.getStructuredSelection().getFirstElement();
-				if(obj instanceof DuplicateDelegate) {
-					fTableViewer.setAllChecked(false);
-					DuplicateDelegate dd = (DuplicateDelegate) obj;
-					fTableViewer.setInput(dd.getDelegates());
-					fTableViewer.setSelection(null);
-					obj = fDupeSelections.get(dd);
-					if(obj != null) {
-						fTableViewer.setChecked(obj, true);
-						fTableViewer.setSelection(new StructuredSelection(obj));
-					}
-				}
-				else {
-					fTableViewer.setInput(null);
+		fTreeViewer.addSelectionChangedListener(event -> {
+			Object obj = event.getStructuredSelection().getFirstElement();
+			if(obj instanceof DuplicateDelegate) {
+				fTableViewer.setAllChecked(false);
+				DuplicateDelegate dd = (DuplicateDelegate) obj;
+				fTableViewer.setInput(dd.getDelegates());
+				fTableViewer.setSelection(null);
+				obj = fDupeSelections.get(dd);
+				if(obj != null) {
+					fTableViewer.setChecked(obj, true);
+					fTableViewer.setSelection(new StructuredSelection(obj));
 				}
 			}
+			else {
+				fTableViewer.setInput(null);
+			}
 		});
 
 	//table
@@ -221,40 +214,34 @@ public class LaunchersPreferencePage extends PreferencePage implements IWorkbenc
 		fTableViewer = new CheckboxTableViewer(table);
 		fTableViewer.setComparator(new WorkbenchViewerComparator());
 		fTableViewer.setLabelProvider(new LabelProvider());
-		fTableViewer.setContentProvider(new ArrayContentProvider());
-		fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection ss = event.getStructuredSelection();
-				if(ss != null && !ss.isEmpty()) {
-					ILaunchDelegate delegate = (ILaunchDelegate)ss.getFirstElement();
-					fDescription.setText(delegate.getDescription());
-				}
-				else {
-					fDescription.setText(IInternalDebugCoreConstants.EMPTY_STRING);
-				}
+		fTableViewer.setContentProvider(ArrayContentProvider.getInstance());
+		fTableViewer.addSelectionChangedListener(event -> {
+			IStructuredSelection ss = event.getStructuredSelection();
+			if(ss != null && !ss.isEmpty()) {
+				ILaunchDelegate delegate = (ILaunchDelegate)ss.getFirstElement();
+				fDescription.setText(delegate.getDescription());
+			}
+			else {
+				fDescription.setText(IInternalDebugCoreConstants.EMPTY_STRING);
 			}
 		});
-		fTableViewer.addCheckStateListener(new ICheckStateListener() {
-			@Override
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				fDirty = true;
-				Object element = event.getElement();
-				boolean checked = event.getChecked();
-				//always set checked, this way users cannot 'undo' a change to selecting a preferred delegate
-				//The story for this is that on startup if there are dupes, the user is prompted to pick a delegate, after that they cannot
-				//return to a state of not being able to launch something, but can pick a different delegate
-				fTableViewer.setCheckedElements(new Object[] {element});
-				//set the selection to be the checked element
-				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=233233
-				fTableViewer.setSelection(new StructuredSelection(element));
-				//persist the selection
-				Object obj = fTreeViewer.getStructuredSelection().getFirstElement();
-				if(obj instanceof DuplicateDelegate) {
-					fDupeSelections.remove(obj);
-					if(checked) {
-						fDupeSelections.put((DuplicateDelegate) obj, (ILaunchDelegate) element);
-					}
+		fTableViewer.addCheckStateListener(event -> {
+			fDirty = true;
+			Object element = event.getElement();
+			boolean checked = event.getChecked();
+			//always set checked, this way users cannot 'undo' a change to selecting a preferred delegate
+			//The story for this is that on startup if there are dupes, the user is prompted to pick a delegate, after that they cannot
+			//return to a state of not being able to launch something, but can pick a different delegate
+			fTableViewer.setCheckedElements(new Object[] {element});
+			//set the selection to be the checked element
+			//https://bugs.eclipse.org/bugs/show_bug.cgi?id=233233
+			fTableViewer.setSelection(new StructuredSelection(element));
+			//persist the selection
+			Object obj = fTreeViewer.getStructuredSelection().getFirstElement();
+			if(obj instanceof DuplicateDelegate) {
+				fDupeSelections.remove(obj);
+				if(checked) {
+					fDupeSelections.put((DuplicateDelegate) obj, (ILaunchDelegate) element);
 				}
 			}
 		});
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java
index 85c87b027321fe5506c5fce479694303da760a49..f07909873e133024a1a9e320b4042fbe02be313b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java
@@ -29,8 +29,6 @@ import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
 import org.eclipse.debug.internal.ui.SWTFactory;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BidiSegmentEvent;
-import org.eclipse.swt.custom.BidiSegmentListener;
 import org.eclipse.swt.custom.StyledText;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.layout.GridData;
@@ -112,34 +110,31 @@ public class ProcessPropertyPage extends PropertyPage {
 				final int[] segments = new int[count - 1];
 				commandLineText = DebugPlugin.renderArguments(arguments, segments);
 
-				styledText.addBidiSegmentListener(new BidiSegmentListener() {
-					@Override
-					public void lineGetSegments(BidiSegmentEvent event) {
-						int offset = event.lineOffset;
-						int end = offset + event.lineText.length();
+				styledText.addBidiSegmentListener(event -> {
+					int offset = event.lineOffset;
+					int end = offset + event.lineText.length();
 
-						// extract segments for the current line:
-						int iStart = Arrays.binarySearch(segments, offset);
-						if (iStart < 0) {
-							iStart = -iStart - 1;
-						}
-						int i = iStart;
-						while (i < segments.length && segments[i] < end) {
-							i++;
-						}
-						int n = i - iStart;
-						if (n > 0) {
-							if (n == segments.length) {
-								event.segments = segments;
-							} else {
-								int[] lineSegments = new int[n];
-								System.arraycopy(segments, iStart, lineSegments, 0, n);
-								event.segments = lineSegments;
-							}
-							final char[] chars = new char[n];
-							Arrays.fill(chars, '\n');
-							event.segmentsChars = chars;
+					// extract segments for the current line:
+					int iStart = Arrays.binarySearch(segments, offset);
+					if (iStart < 0) {
+						iStart = -iStart - 1;
+					}
+					int i = iStart;
+					while (i < segments.length && segments[i] < end) {
+						i++;
+					}
+					int n = i - iStart;
+					if (n > 0) {
+						if (n == segments.length) {
+							event.segments = segments;
+						} else {
+							int[] lineSegments = new int[n];
+							System.arraycopy(segments, iStart, lineSegments, 0, n);
+							event.segments = lineSegments;
 						}
+						final char[] chars = new char[n];
+						Arrays.fill(chars, '\n');
+						event.segmentsChars = chars;
 					}
 				});
 			}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java
index 4ccd135140eded8242481e70e44e1ed14eb55076..7c7f7aaaab800c79212d9e0c1e5751fa6567dd49 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java
@@ -17,7 +17,6 @@ import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -42,12 +41,8 @@ import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDi
 import org.eclipse.debug.ui.ILaunchGroup;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.window.Window;
@@ -177,7 +172,7 @@ public class RunDebugPropertiesPage extends PropertyPage {
 	protected TableViewer createViewer(Composite parent){
 		TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
 		viewer.setLabelProvider(new DefaultLabelProvider());
-		viewer.setContentProvider(new ArrayContentProvider());
+		viewer.setContentProvider(ArrayContentProvider.getInstance());
 		viewer.setComparator(new LaunchConfigurationComparator());
 		Table builderTable = viewer.getTable();
 		GridData tableGridData = new GridData(GridData.FILL_BOTH);
@@ -186,27 +181,19 @@ public class RunDebugPropertiesPage extends PropertyPage {
 		builderTable.setLayoutData(tableGridData);
 		IResource resource = getResource();
 		viewer.setInput(collectConfigCandidates(resource));
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection sel = event.getSelection();
-				if(sel instanceof IStructuredSelection) {
-					IStructuredSelection ss = (IStructuredSelection) sel;
-					boolean empty = ss.isEmpty();
-					int size = ss.size();
-					fEditButton.setEnabled(!empty && size == 1);
-					fDuplicateButton.setEnabled(!empty && size == 1);
-					fDeleteButton.setEnabled(!empty);
-					setErrorMessage(null);
-				}
-			}
-		});
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent arg0) {
-				handleEdit();
+		viewer.addSelectionChangedListener(event -> {
+			ISelection sel = event.getSelection();
+			if(sel instanceof IStructuredSelection) {
+				IStructuredSelection ss = (IStructuredSelection) sel;
+				boolean empty = ss.isEmpty();
+				int size = ss.size();
+				fEditButton.setEnabled(!empty && size == 1);
+				fDuplicateButton.setEnabled(!empty && size == 1);
+				fDeleteButton.setEnabled(!empty);
+				setErrorMessage(null);
 			}
 		});
+		viewer.addDoubleClickListener(arg0 -> handleEdit());
 		return viewer;
 	}
 
@@ -254,13 +241,10 @@ public class RunDebugPropertiesPage extends PropertyPage {
 				fTypeCandidates.add(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(type));
 			}
 
-			Collections.sort(fTypeCandidates, new Comparator<ILaunchConfigurationType>() {
-				@Override
-				public int compare(ILaunchConfigurationType o1, ILaunchConfigurationType o2) {
-					ILaunchConfigurationType t1 = o1;
-					ILaunchConfigurationType t2 = o2;
-					return t1.getName().compareTo(t2.getName());
-				}
+			Collections.sort(fTypeCandidates, (o1, o2) -> {
+				ILaunchConfigurationType t1 = o1;
+				ILaunchConfigurationType t2 = o2;
+				return t1.getName().compareTo(t2.getName());
 			});
 		}
 		return fTypeCandidates.toArray(new ILaunchConfigurationType[fTypeCandidates.size()]);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java
index 6b2a900851b7f3f4d29dd30245a8a1f3c0c8a77d..b03ab1e77c5b8eb83b2b2c3aa5b5fd339cc45bf7 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java
@@ -32,10 +32,7 @@ import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jface.viewers.ColumnLayoutData;
 import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITableLabelProvider;
@@ -178,19 +175,11 @@ public class StringVariablePreferencePage extends PreferencePage implements IWor
 			}
 		});
 
-		variableTable.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				handleTableSelectionChanged(event);
-			}
-		});
+		variableTable.addSelectionChangedListener(this::handleTableSelectionChanged);
 
-		variableTable.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				if (!variableTable.getSelection().isEmpty()) {
-					handleEditButtonPressed();
-				}
+		variableTable.addDoubleClickListener(event -> {
+			if (!variableTable.getSelection().isEmpty()) {
+				handleEditButtonPressed();
 			}
 		});
 		variableTable.getTable().addKeyListener(new KeyAdapter() {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
index dbfb44d1cec7b38c4b672a2b518743c15cb3adb4..59c8333b0bb3aa2099e7dffefbf41af075311a24 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
@@ -28,11 +28,7 @@ import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.TitleAreaDialog;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.ViewerComparator;
@@ -92,29 +88,21 @@ public class AddSourceContainerDialog extends TitleAreaDialog {
 		gd = new GridData(GridData.FILL_BOTH);
 		table.setLayoutData(gd);
 
-		fViewer.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				okPressed();
-			}
-		});
+		fViewer.addDoubleClickListener(event -> okPressed());
 
 		fViewer.setLabelProvider(new SourceContainerLabelProvider());
-		fViewer.setContentProvider(new ArrayContentProvider());
+		fViewer.setContentProvider(ArrayContentProvider.getInstance());
 		fViewer.setComparator(new ViewerComparator());
-		fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = event.getStructuredSelection();
-				if (!selection.isEmpty()) {
-					ISourceContainerType type = (ISourceContainerType) selection.getFirstElement();
-					setMessage(type.getDescription());
-					getButton(IDialogConstants.OK_ID).setEnabled(true);
-				}
-				else {
-					getButton(IDialogConstants.OK_ID).setEnabled(false);
-					setMessage(SourceLookupUIMessages.AddSourceContainerDialog_select_source_container);
-				}
+		fViewer.addSelectionChangedListener(event -> {
+			IStructuredSelection selection = event.getStructuredSelection();
+			if (!selection.isEmpty()) {
+				ISourceContainerType type = (ISourceContainerType) selection.getFirstElement();
+				setMessage(type.getDescription());
+				getButton(IDialogConstants.OK_ID).setEnabled(true);
+			}
+			else {
+				getButton(IDialogConstants.OK_ID).setEnabled(false);
+				setMessage(SourceLookupUIMessages.AddSourceContainerDialog_select_source_container);
 			}
 		});
 		if(types.length != 0) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java
index 9bf4a23f9d6d09de6498e46f00a40e11d15c7c3d..75d6421f608704ad9ae8718f5e2cd385c90def0f 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java
@@ -44,19 +44,16 @@ import org.eclipse.ui.views.navigator.ResourceComparator;
  */
 public class ArchiveSourceContainerBrowser extends AbstractSourceContainerBrowser {
 
-	private ISelectionStatusValidator validator= new ISelectionStatusValidator() {
-		@Override
-		public IStatus validate(Object[] selection) {
-			if (selection.length == 0) {
+	private ISelectionStatusValidator validator= selection -> {
+		if (selection.length == 0) {
+			return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
+		}
+		for (Object f : selection) {
+			if (!(f instanceof IFile)) {
 				return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 			}
-			for (Object f : selection) {
-				if (!(f instanceof IFile)) {
-					return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
-				}
-			}
-			return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 		}
+		return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 	};
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java
index 24b6e283cdf0a873ec0a34789db1ee80dcf47e77..2c714d80bc41d5de17a98d42c4964286a959eacb 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java
@@ -26,8 +26,6 @@ import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.TitleAreaDialog;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Font;
@@ -142,12 +140,7 @@ public class DirectorySourceContainerDialog extends TitleAreaDialog {
 		data.horizontalSpan = 1;
 		fDirText.setLayoutData(data);
 		fDirText.setFont(font);
-		fDirText.addModifyListener(new ModifyListener() {
-			@Override
-			public void modifyText( ModifyEvent e ) {
-				validate();
-			}
-		});
+		fDirText.addModifyListener(e -> validate());
 
 		Button button = new Button(dirComposite, SWT.PUSH);
 		button.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_5);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java
index f23ae3eff31a418a1b51dd5d60d33eaf396f030b..4a2b07e79526d8e5cee7303fbdf10f7ad52f3579 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java
@@ -89,16 +89,13 @@ public class FolderSourceContainerDialog extends ElementTreeSelectionDialog {
 		setTitle(SourceLookupUIMessages.folderSelection_title);	//
 		setInput(ResourcesPlugin.getWorkspace().getRoot());
 		setComparator(new ResourceComparator(ResourceComparator.NAME));
-		ISelectionStatusValidator validator= new ISelectionStatusValidator() {
-			@Override
-			public IStatus validate(Object[] selection) {
-				for (Object f : selection) {
-					if (!(f instanceof IFolder)) {
-						return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), -1, SourceLookupUIMessages.sourceSearch_folderSelectionError, null); //
-					}
+		ISelectionStatusValidator validator= selection -> {
+			for (Object f : selection) {
+				if (!(f instanceof IFolder)) {
+					return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), -1, SourceLookupUIMessages.sourceSearch_folderSelectionError, null); //
 				}
-				return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 			}
+			return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 		};
 		setValidator(validator);
 		setDoubleClickSelects(true);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java
index 0a0641f9b1ceac8381e6263f73bb89379c621c8a..b7fa1d626dee8a16fe28a6ebae4dbe2ad9cb5941 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java
@@ -15,13 +15,9 @@
 package org.eclipse.debug.internal.ui.viewers.breadcrumb;
 
 import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.IOpenListener;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.OpenEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -169,48 +165,37 @@ public abstract class AbstractBreadcrumb {
 		gridLayout.horizontalSpacing= 0;
 		fComposite.setLayout(gridLayout);
 
-		fDisplayFocusListener= new Listener() {
-			@Override
-			public void handleEvent(Event event) {
-				if (fComposite.isDisposed()) return;
+		fDisplayFocusListener= event -> {
+			if (fComposite.isDisposed()) return;
 
-				if (isBreadcrumbEvent(event)) {
-					if (fHasFocus)
-						return;
+			if (isBreadcrumbEvent(event)) {
+				if (fHasFocus)
+					return;
 
-					focusGained();
-				} else {
-					if (!fHasFocus)
-						return;
+				focusGained();
+			} else {
+				if (!fHasFocus)
+					return;
 
-					focusLost();
-				}
+				focusLost();
 			}
 		};
 		Display.getCurrent().addFilter(SWT.FocusIn, fDisplayFocusListener);
 
 		fBreadcrumbViewer= createViewer(fComposite);
 
-		fBreadcrumbViewer.addDoubleClickListener(new IDoubleClickListener() {
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				Object element= ((IStructuredSelection) event.getSelection()).getFirstElement();
-				if (element == null)
-					return;
+		fBreadcrumbViewer.addDoubleClickListener(event -> {
+			Object element= ((IStructuredSelection) event.getSelection()).getFirstElement();
+			if (element == null)
+				return;
 
-				BreadcrumbItem item= (BreadcrumbItem) fBreadcrumbViewer.doFindItem(element);
-				if (item == null)
-					return;
-				item.openDropDownMenu();
-			}
+			BreadcrumbItem item= (BreadcrumbItem) fBreadcrumbViewer.doFindItem(element);
+			if (item == null)
+				return;
+			item.openDropDownMenu();
 		});
 
-		fBreadcrumbViewer.addOpenListener(new IOpenListener() {
-			@Override
-			public void open(OpenEvent event) {
-				doOpen(event.getSelection());
-			}
-		});
+		fBreadcrumbViewer.addOpenListener(event -> doOpen(event.getSelection()));
 
 		return fComposite;
 	}
@@ -269,15 +254,12 @@ public abstract class AbstractBreadcrumb {
 		//Sanity check
 		deinstallDisplayListeners();
 
-		fDisplayKeyListener= new Listener() {
-			@Override
-			public void handleEvent(Event event) {
-				if (event.keyCode != SWT.ESC)
-					return;
+		fDisplayKeyListener= event -> {
+			if (event.keyCode != SWT.ESC)
+				return;
 
-				if (!isBreadcrumbEvent(event))
-					return;
-			}
+			if (!isBreadcrumbEvent(event))
+				return;
 		};
 		Display.getDefault().addFilter(SWT.KeyDown, fDisplayKeyListener);
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java
index aa98d175fa32043899290bc9fb8b3db67a640ea6..14effd1e5fc78e76da51867fb05412f934abb266 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java
@@ -21,14 +21,8 @@ import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -76,12 +70,9 @@ class BreadcrumbItemDetails {
 		layout.marginHeight= 1;
 		layout.marginWidth= 2;
 		fImageComposite.setLayout(layout);
-		fImageComposite.addPaintListener(new PaintListener() {
-			@Override
-			public void paintControl(PaintEvent e) {
-				if (fHasFocus && !isTextVisible()) {
-					e.gc.drawFocus(e.x, e.y, e.width, e.height);
-				}
+		fImageComposite.addPaintListener(e -> {
+			if (fHasFocus && !isTextVisible()) {
+				e.gc.drawFocus(e.x, e.y, e.width, e.height);
 			}
 		});
 		installFocusComposite(fImageComposite);
@@ -99,12 +90,9 @@ class BreadcrumbItemDetails {
 		layout.marginWidth= 2;
 		fTextComposite.setLayout(layout);
 		addElementListener(fTextComposite);
-		fTextComposite.addPaintListener(new PaintListener() {
-			@Override
-			public void paintControl(PaintEvent e) {
-				if (fHasFocus && isTextVisible()) {
-					e.gc.drawFocus(e.x, e.y, e.width, e.height);
-				}
+		fTextComposite.addPaintListener(e -> {
+			if (fHasFocus && isTextVisible()) {
+				e.gc.drawFocus(e.x, e.y, e.width, e.height);
 			}
 		});
 		installFocusComposite(fTextComposite);
@@ -276,23 +264,20 @@ class BreadcrumbItemDetails {
 	 * @param composite the composite which may get focus
 	 */
 	private void installFocusComposite(Composite composite) {
-		composite.addTraverseListener(new TraverseListener() {
-			@Override
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
-					int index= fParent.getViewer().getIndexOfItem(fParent);
-					if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
-						index++;
-					} else {
-						index--;
-					}
-
-					if (index > 0 && index < fParent.getViewer().getItemCount()) {
-						fParent.getViewer().selectItem(fParent.getViewer().getItem(index));
-					}
-
-					e.doit= true;
+		composite.addTraverseListener(e -> {
+			if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
+				int index= fParent.getViewer().getIndexOfItem(fParent);
+				if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
+					index++;
+				} else {
+					index--;
+				}
+
+				if (index > 0 && index < fParent.getViewer().getItemCount()) {
+					fParent.getViewer().selectItem(fParent.getViewer().getItem(index));
 				}
+
+				e.doit= true;
 			}
 		});
 		composite.addKeyListener(new KeyListener() {
@@ -400,13 +385,10 @@ class BreadcrumbItemDetails {
 			public void mouseUp(MouseEvent e) {
 			}
 		});
-		control.addMenuDetectListener(new MenuDetectListener() {
-			@Override
-			public void menuDetected(MenuDetectEvent e) {
-				BreadcrumbViewer viewer= fParent.getViewer();
-				viewer.selectItem(fParent);
-				fParent.getViewer().fireMenuDetect(e);
-			}
+		control.addMenuDetectListener(e -> {
+			BreadcrumbViewer viewer= fParent.getViewer();
+			viewer.selectItem(fParent);
+			fParent.getViewer().fireMenuDetect(e);
 		});
 	}
 }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java
index 3f75d919105098e2b1c64bb8dc72cd3608bd16de..8d29b318719b5b05137bc2e5468fc90ff1a4f6ff 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java
@@ -29,8 +29,6 @@ import org.eclipse.swt.accessibility.AccessibleEvent;
 import org.eclipse.swt.events.ControlAdapter;
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.ShellEvent;
@@ -48,7 +46,6 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.ToolBar;
@@ -330,42 +327,39 @@ class BreadcrumbItemDropDown implements IBreadcrumbDropDownSite {
 	 * @param shell the shell to install the closer to
 	 */
 	private void installCloser(final Shell shell) {
-		final Listener focusListener= new Listener() {
-			@Override
-			public void handleEvent(Event event) {
-				Widget focusElement= event.widget;
-				boolean isFocusBreadcrumbTreeFocusWidget= focusElement == shell || focusElement instanceof Control && ((Control)focusElement).getShell() == shell;
-				boolean isFocusWidgetParentShell= focusElement instanceof Control && ((Control)focusElement).getShell().getParent() == shell;
+		final Listener focusListener= event -> {
+			Widget focusElement= event.widget;
+			boolean isFocusBreadcrumbTreeFocusWidget= focusElement == shell || focusElement instanceof Control && ((Control)focusElement).getShell() == shell;
+			boolean isFocusWidgetParentShell= focusElement instanceof Control && ((Control)focusElement).getShell().getParent() == shell;
+
+			switch (event.type) {
+				case SWT.FocusIn:
+					if (DebugUIPlugin.DEBUG_BREADCRUMB) {
+						DebugUIPlugin.trace("focusIn - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$
+					}
 
-				switch (event.type) {
-					case SWT.FocusIn:
+					if (!isFocusBreadcrumbTreeFocusWidget && !isFocusWidgetParentShell) {
 						if (DebugUIPlugin.DEBUG_BREADCRUMB) {
-							DebugUIPlugin.trace("focusIn - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$
-						}
-
-						if (!isFocusBreadcrumbTreeFocusWidget && !isFocusWidgetParentShell) {
-							if (DebugUIPlugin.DEBUG_BREADCRUMB) {
-								DebugUIPlugin.trace("==> closing shell since focus in other widget"); //$NON-NLS-1$
-							}
-							shell.close();
+							DebugUIPlugin.trace("==> closing shell since focus in other widget"); //$NON-NLS-1$
 						}
-						break;
+						shell.close();
+					}
+					break;
 
-					case SWT.FocusOut:
+				case SWT.FocusOut:
+					if (DebugUIPlugin.DEBUG_BREADCRUMB) {
+						DebugUIPlugin.trace("focusOut - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$
+					}
+					if (event.display.getActiveShell() == null) {
 						if (DebugUIPlugin.DEBUG_BREADCRUMB) {
-							DebugUIPlugin.trace("focusOut - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$
-						}
-						if (event.display.getActiveShell() == null) {
-							if (DebugUIPlugin.DEBUG_BREADCRUMB) {
-								DebugUIPlugin.trace("==> closing shell since event.display.getActiveShell() != shell"); //$NON-NLS-1$
-							}
-							shell.close();
+							DebugUIPlugin.trace("==> closing shell since event.display.getActiveShell() != shell"); //$NON-NLS-1$
 						}
-						break;
+						shell.close();
+					}
+					break;
 
-					default:
-						Assert.isTrue(false);
-				}
+				default:
+					Assert.isTrue(false);
 			}
 		};
 
@@ -390,19 +384,16 @@ class BreadcrumbItemDropDown implements IBreadcrumbDropDownSite {
 		};
 		fToolBar.getShell().addControlListener(controlListener);
 
-		shell.addDisposeListener(new DisposeListener() {
-			@Override
-			public void widgetDisposed(DisposeEvent e) {
-				if (DebugUIPlugin.DEBUG_BREADCRUMB) {
-					DebugUIPlugin.trace("==> shell disposed"); //$NON-NLS-1$
-				}
+		shell.addDisposeListener(e -> {
+			if (DebugUIPlugin.DEBUG_BREADCRUMB) {
+				DebugUIPlugin.trace("==> shell disposed"); //$NON-NLS-1$
+			}
 
-				display.removeFilter(SWT.FocusIn, focusListener);
-				display.removeFilter(SWT.FocusOut, focusListener);
+			display.removeFilter(SWT.FocusIn, focusListener);
+			display.removeFilter(SWT.FocusOut, focusListener);
 
-				if (!fToolBar.isDisposed()) {
-					fToolBar.getShell().removeControlListener(controlListener);
-				}
+			if (!fToolBar.isDisposed()) {
+				fToolBar.getShell().removeControlListener(controlListener);
 			}
 		});
 		shell.addShellListener(new ShellListener() {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java
index 3bdec56c0d1893e78c887beeaf8f333ef2703a05..83949303367ae09df0fd7bb4e2008315e5b9780d 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java
@@ -23,11 +23,9 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.viewers.IOpenListener;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ITreeSelection;
 import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.OpenEvent;
 import org.eclipse.jface.viewers.TreeExpansionEvent;
 import org.eclipse.jface.viewers.TreePath;
 import org.eclipse.jface.viewers.TreeSelection;
@@ -86,14 +84,11 @@ public abstract class TreeViewerDropDown {
 		fDropDownSite = site;
 		fDropDownViewer= createTreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL, path);
 
-		fDropDownViewer.addOpenListener(new IOpenListener() {
-			@Override
-			public void open(OpenEvent event) {
-				if (DebugUIPlugin.DEBUG_TREE_VIEWER_DROPDOWN) {
-					DebugUIPlugin.trace("BreadcrumbItemDropDown.showMenu()$treeViewer>open"); //$NON-NLS-1$
-				}
-				openElement(event.getSelection());
+		fDropDownViewer.addOpenListener(event -> {
+			if (DebugUIPlugin.DEBUG_TREE_VIEWER_DROPDOWN) {
+				DebugUIPlugin.trace("BreadcrumbItemDropDown.showMenu()$treeViewer>open"); //$NON-NLS-1$
 			}
+			openElement(event.getSelection());
 		});
 
 		final Tree tree = fDropDownViewer.getTree();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java
index d8b901e937b8a672125a29249e05965bcd234446..e92b4924baa5b8353f1b5d5867ac7069a836f13b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java
@@ -149,8 +149,9 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel
 			for (String label : labels) {
 				String text = trimLabel(label);
 				if (text != null && !text.equals(IInternalDebugCoreConstants.EMPTY_STRING)) {
-					buffer.append(text+TAB);
+					buffer.append(text);
 				}
+				buffer.append(TAB);
 			}
 			buffer.append(System.getProperty(SEPARATOR));
 		}
@@ -267,20 +268,17 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel
 		final IProgressMonitor monitor = dialog.getProgressMonitor();
 		dialog.setCancelable(true);
 
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-			@Override
-			public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException {
-				synchronized(listener) {
-					listener.fProgressMonitor = m;
-					listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size());
-				}
+		IRunnableWithProgress runnable = m -> {
+			synchronized(listener) {
+				listener.fProgressMonitor = m;
+				listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size());
+			}
 
-				while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) {
-					Thread.sleep(1);
-				}
-				synchronized(listener) {
-					listener.fProgressMonitor = null;
-				}
+			while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) {
+				Thread.sleep(1);
+			}
+			synchronized(listener) {
+				listener.fProgressMonitor = null;
 			}
 		};
 		try {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java
index 7a0f95ac49129f317ca976d1f2bc43f09fd4421a..f427d443a09ce57364f23806b2d0941de80c1b4b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java
@@ -32,7 +32,6 @@ import org.eclipse.debug.internal.ui.viewers.FindElementDialog;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
@@ -41,7 +40,6 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualItem;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -193,20 +191,17 @@ public class VirtualFindAction extends Action implements IUpdate {
 		try {
 			dialog.run(
 				true, true,
-				new IRunnableWithProgress() {
-					@Override
-					public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException {
-						synchronized(listener) {
-							listener.fProgressMonitor = m;
-							listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getText()), listener.fRemainingUpdatesCount);
-						}
-
-						while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) {
-							Thread.sleep(1);
-						}
-						synchronized(listener) {
-							listener.fProgressMonitor = null;
-						}
+				m -> {
+					synchronized(listener) {
+						listener.fProgressMonitor = m;
+						listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getText()), listener.fRemainingUpdatesCount);
+					}
+
+					while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) {
+						Thread.sleep(1);
+					}
+					synchronized(listener) {
+						listener.fProgressMonitor = null;
 					}
 				});
 		} catch (InvocationTargetException e) {
@@ -234,15 +229,12 @@ public class VirtualFindAction extends Action implements IUpdate {
 
 	private int calcUpdatesCount(IModelDelta stateDelta) {
 		final int[] count = new int[] {0};
-		stateDelta.accept( new IModelDeltaVisitor() {
-			@Override
-			public boolean visit(IModelDelta delta, int depth) {
-				if ((delta.getFlags() & IModelDelta.EXPAND) != 0) {
-					count[0] += delta.getChildCount();
-					return true;
-				}
-				return false;
+		stateDelta.accept( (delta, depth) -> {
+			if ((delta.getFlags() & IModelDelta.EXPAND) != 0) {
+				count[0] += delta.getChildCount();
+				return true;
 			}
+			return false;
 		});
 
 		// Double it to account for separate element and label update ticks.
@@ -282,14 +274,11 @@ public class VirtualFindAction extends Action implements IUpdate {
 		ModelDelta stateDelta = new ModelDelta(virtualViewer.getInput(), IModelDelta.NO_CHANGE);
 		virtualViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.SELECT);
 		// Set the force flag to all select delta in order to override model's selection policy.
-		stateDelta.accept(new IModelDeltaVisitor() {
-			@Override
-			public boolean visit(IModelDelta delta, int depth) {
-				if ((delta.getFlags() & IModelDelta.SELECT) != 0) {
-					((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.FORCE);
-				}
-				return true;
+		stateDelta.accept((delta, depth) -> {
+			if ((delta.getFlags() & IModelDelta.SELECT) != 0) {
+				((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.FORCE);
 			}
+			return true;
 		});
 		fClientViewer.updateViewer(stateDelta);
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java
index a5292887712f5e9117b4b7357d3c12edb7ab5e05..77be30fb88de663311c0915be9eac633e0a273d2 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java
@@ -33,12 +33,9 @@ public class ViewerInputService {
 	 *
 	 * @since 3.6
 	 */
-	public final static Object NULL_INPUT = new IViewerInputProvider() {
-		@Override
-		public void update(IViewerInputUpdate update) {
-			update.setInputElement(null);
-			update.done();
-		}
+	public final static Object NULL_INPUT = (IViewerInputProvider) update -> {
+		update.setInputElement(null);
+		update.done();
 	};
 
 	// previous update request, cancelled when a new request comes in
@@ -48,16 +45,13 @@ public class ViewerInputService {
 
 	private ITreeModelViewer fViewer;
 
-	private IViewerInputRequestor fProxyRequest = new IViewerInputRequestor() {
-		@Override
-		public void viewerInputComplete(final IViewerInputUpdate update) {
-			synchronized (ViewerInputService.this) {
-				if (fPendingUpdate == update) {
-					fPendingUpdate = null;
-				}
+	private IViewerInputRequestor fProxyRequest = update -> {
+		synchronized (ViewerInputService.this) {
+			if (fPendingUpdate == update) {
+				fPendingUpdate = null;
 			}
-			fRequestor.viewerInputComplete(update);
 		}
+		fRequestor.viewerInputComplete(update);
 	};
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java
index 2721701ccc06cd209c2f1d3d7a8a16686ee8dee5..c1eab47255e9440b7a3ecb870143f0e1cb259163 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java
@@ -16,7 +16,6 @@ package org.eclipse.debug.internal.ui.views.breakpoints;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -28,7 +27,6 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
 
 /**
  * Manager which provides access to the breakpoint organizers
@@ -78,10 +76,7 @@ public class BreakpointOrganizerManager {
 	 */
 	private void start(String organizerId) {
 		IBreakpointOrganizer organizer = getOrganizer(organizerId);
-		IPropertyChangeListener listener = new IPropertyChangeListener() {
-			@Override
-			public void propertyChange(PropertyChangeEvent event) {
-			}
+		IPropertyChangeListener listener = event -> {
 		};
 		organizer.addPropertyChangeListener(listener);
 		organizer.removePropertyChangeListener(listener);
@@ -122,14 +117,7 @@ public class BreakpointOrganizerManager {
 			Collection<IBreakpointOrganizer> collection = fOrganizers.values();
 			fSorted = new ArrayList<>();
 			fSorted.addAll(collection);
-			Collections.sort(fSorted, new Comparator<Object>() {
-				@Override
-				public int compare(Object o1, Object o2) {
-					IBreakpointOrganizer b1 = (IBreakpointOrganizer)o1;
-					IBreakpointOrganizer b2 = (IBreakpointOrganizer)o2;
-					return b1.getLabel().compareTo(b2.getLabel());
-				}
-			});
+			Collections.sort(fSorted, (o1, o2) -> o1.getLabel().compareTo(o2.getLabel()));
 		}
 		return fSorted.toArray(new IBreakpointOrganizer[fSorted.size()]);
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
index 31ed62c81323fdac633b24062cafe7fdc4460ac6..4a4fdefd81034d85b92a9f78bbce33c845c71b70 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
@@ -451,7 +451,6 @@ public class BreakpointsView extends VariablesView implements IBreakpointManager
 			// update the presentation context organizer
 			viewer.getPresentationContext().setProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS, fOrganizers);
 		}
-		System.out.println();
 	}
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/DeleteBreakpointMarkersOperation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/DeleteBreakpointMarkersOperation.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a1b87589837a77e4f7bacbb79db2bd2238ba5ff
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/DeleteBreakpointMarkersOperation.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Paul Pazderski and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Paul Pazderski - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.debug.internal.ui.views.breakpoints;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
+
+/**
+ * Extension of the default undoable delete marker operation to additional
+ * update the 'breakpointIsDeleted' attribute.
+ */
+public class DeleteBreakpointMarkersOperation extends DeleteMarkersOperation {
+
+	/**
+	 * Create an undoable operation that can delete the specified markers.
+	 *
+	 * @param markers the markers to be deleted
+	 * @param name    the name used to describe the operation that deletes the
+	 *                markers
+	 */
+	public DeleteBreakpointMarkersOperation(IMarker[] markers, String name) {
+		super(markers, name);
+	}
+
+	@Override
+	protected void doExecute(IProgressMonitor monitor, org.eclipse.core.runtime.IAdaptable info) throws CoreException {
+		IMarker[] markers = getMarkers();
+		if (markers != null) {
+			for (IMarker marker : markers) {
+				marker.setAttribute(DebugPlugin.ATTR_BREAKPOINT_IS_DELETED, true);
+			}
+		}
+
+		super.doExecute(monitor, info);
+	}
+
+	// Note: do not update 'breakpointIsDeleted' on doUndo (i.e. don't set
+	// breakpointIsDeleted=false on undo). It is important that the recreated
+	// breakpoint has breakpointIsDeleted=true to recognize the recreation in later
+	// code.
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
index a759e5dbc6d5cd820d87cab20ad53a45603b5768..472a894e0813157bd2d0f7fe8237de8c747ae520 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
@@ -13,6 +13,7 @@
  *     Paul Pazderski  - Bug 545769: fixed rare UTF-8 character corruption bug
  *     Paul Pazderski  - Bug 552015: console finished signaled to late if input is connected to file
  *     Paul Pazderski  - Bug 251642: add termination time in console label
+ *     Paul Pazderski  - Bug 558463: add handling of raw stream content instead of strings
  *******************************************************************************/
 package org.eclipse.debug.internal.ui.views.console;
 
@@ -53,10 +54,13 @@ import org.eclipse.core.variables.IStringVariableManager;
 import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBinaryStreamListener;
 import org.eclipse.debug.core.IDebugEventSetListener;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.ILaunchConfigurationType;
 import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IBinaryStreamMonitor;
+import org.eclipse.debug.core.model.IBinaryStreamsProxy;
 import org.eclipse.debug.core.model.IFlushableStreamMonitor;
 import org.eclipse.debug.core.model.IProcess;
 import org.eclipse.debug.core.model.IStreamMonitor;
@@ -711,11 +715,25 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe
 	 * Received output will be redirected to given {@link IOConsoleOutputStream} to
 	 * get it shown in console and to {@link #fFileOutputStream} if set.
 	 */
-	private class StreamListener implements IStreamListener {
+	private class StreamListener implements IStreamListener, IBinaryStreamListener {
 
 		private IOConsoleOutputStream fStream;
 
+		/**
+		 * The monitors from which this listener class is notified about new content.
+		 * Initial and for a long time IO handling in context of Eclipse console was
+		 * based on strings and later extended with a variant passing the raw binary
+		 * data.
+		 * <p>
+		 * As a result of this history it is expectable to have a stream monitor passing
+		 * the content decoded as string but optional to have access to the
+		 * raw/unchanged data.
+		 * <p>
+		 * Therefore the following two monitor instances either point to the same class
+		 * implementing both interfaces or the binary variant is <code>null</code>.
+		 */
 		private IStreamMonitor fStreamMonitor;
+		private IBinaryStreamMonitor fBinaryStreamMonitor;
 
 		private String fStreamId;
 
@@ -723,12 +741,16 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe
 		private boolean fStreamClosed = false;
 
 		public StreamListener(String streamIdentifier, IStreamMonitor monitor, IOConsoleOutputStream stream) {
-			this.fStreamId = streamIdentifier;
-			this.fStreamMonitor = monitor;
-			this.fStream = stream;
+			fStreamId = streamIdentifier;
+			fStreamMonitor = monitor;
+			fStream = stream;
 			fStreamMonitor.addListener(this);
-			//fix to bug 121454. Ensure that output to fast processes is processed.
-			flushAndDisableBuffer(monitor);
+			if (fStreamMonitor instanceof IBinaryStreamMonitor && fFileOutputStream != null) {
+				fBinaryStreamMonitor = (IBinaryStreamMonitor) monitor;
+				fBinaryStreamMonitor.addBinaryListener(this);
+			}
+			// fix to bug 121454. Ensure that output to fast processes is processed.
+			flushAndDisableBuffer();
 		}
 
 		/**
@@ -737,17 +759,37 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe
 		 *
 		 * @param monitor the monitor which might have buffered content
 		 */
-		private void flushAndDisableBuffer(IStreamMonitor monitor) {
+		private void flushAndDisableBuffer() {
+			byte[] data = null;
 			String contents;
-			synchronized (monitor) {
-				contents = monitor.getContents();
-				if (monitor instanceof IFlushableStreamMonitor) {
-					IFlushableStreamMonitor m = (IFlushableStreamMonitor) monitor;
+			synchronized (fStreamMonitor) {
+				if (fBinaryStreamMonitor != null) {
+					data = fBinaryStreamMonitor.getData();
+				}
+				contents = fStreamMonitor.getContents();
+				if (fStreamMonitor instanceof IFlushableStreamMonitor) {
+					IFlushableStreamMonitor m = (IFlushableStreamMonitor) fStreamMonitor;
 					m.flushContents();
 					m.setBuffered(false);
 				}
 			}
-			streamAppended(contents, monitor);
+			if (data != null) {
+				streamAppended(data, fBinaryStreamMonitor);
+			}
+			streamAppended(contents, fStreamMonitor);
+		}
+
+		@Override
+		public void streamAppended(byte[] data, IBinaryStreamMonitor monitor) {
+			if (fFileOutputStream != null) {
+				synchronized (fFileOutputStream) {
+					try {
+						fFileOutputStream.write(data);
+					} catch (IOException e) {
+						DebugUIPlugin.log(e);
+					}
+				}
+			}
 		}
 
 		@Override
@@ -755,22 +797,20 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe
 			if (text == null || text.length() == 0) {
 				return;
 			}
-			try {
-				if (fStream != null) {
+			if (fStream != null) {
+				try {
 					fStream.write(text);
+				} catch (IOException e) {
+					DebugUIPlugin.log(e);
 				}
-				if (fFileOutputStream != null) {
-					Charset charset = getCharset();
-					synchronized (fFileOutputStream) {
-						if (charset == null) {
-							fFileOutputStream.write(text.getBytes());
-						} else {
-							fFileOutputStream.write(text.getBytes(charset));
-						}
-					}
-				}
-			} catch (IOException e) {
-				DebugUIPlugin.log(e);
+			}
+			// If the monitor does not provide the raw data API and we need to redirect to
+			// a file the second best (and in the past only) option is to write the encoded
+			// text to file.
+			if (fBinaryStreamMonitor == null && fFileOutputStream != null) {
+				Charset charset = getCharset();
+				byte[] data = charset == null ? text.getBytes() : text.getBytes(charset);
+				streamAppended(data, null);
 			}
 		}
 
@@ -780,6 +820,9 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe
 			}
 			synchronized (fStreamMonitor) {
 				fStreamMonitor.removeListener(this);
+				if (fBinaryStreamMonitor != null) {
+					fBinaryStreamMonitor.removeBinaryListener(this);
+				}
 				fStreamClosed = true;
 
 				try {
@@ -842,31 +885,56 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe
 			if (fInput == null || fStreamsClosed) {
 				return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
 			}
-			Charset encoding = getCharset();
-			readingStream = fInput;
-			InputStreamReader streamReader = (encoding == null ? new InputStreamReader(readingStream)
-					: new InputStreamReader(readingStream, encoding));
-			try {
-				char[] cbuf = new char[1024];
-				int charRead = 0;
-				while (charRead >= 0 && !monitor.isCanceled()) {
-					if (fInput == null || fStreamsClosed) {
-						break;
-					}
-					if (fInput != readingStream) {
-						readingStream = fInput;
-						streamReader = (encoding == null ? new InputStreamReader(readingStream)
-								: new InputStreamReader(readingStream, encoding));
+			if (streamsProxy instanceof IBinaryStreamsProxy) {
+				// Pass data without processing. The preferred variant. There is no need for
+				// this job to know about encodings.
+				try {
+					byte[] buffer = new byte[1024];
+					int bytesRead = 0;
+					while (bytesRead >= 0 && !monitor.isCanceled()) {
+						if (fInput == null || fStreamsClosed) {
+							break;
+						}
+						if (fInput != readingStream) {
+							readingStream = fInput;
+						}
+						bytesRead = readingStream.read(buffer);
+						if (bytesRead > 0) {
+							((IBinaryStreamsProxy) streamsProxy).write(buffer, 0, bytesRead);
+						}
 					}
+				} catch (IOException e) {
+					DebugUIPlugin.log(e);
+				}
+			} else {
+				// Decode data to strings. The legacy variant used if the proxy does not
+				// implement the binary API.
+				Charset encoding = getCharset();
+				readingStream = fInput;
+				InputStreamReader streamReader = (encoding == null ? new InputStreamReader(readingStream)
+						: new InputStreamReader(readingStream, encoding));
+				try {
+					char[] cbuf = new char[1024];
+					int charRead = 0;
+					while (charRead >= 0 && !monitor.isCanceled()) {
+						if (fInput == null || fStreamsClosed) {
+							break;
+						}
+						if (fInput != readingStream) {
+							readingStream = fInput;
+							streamReader = (encoding == null ? new InputStreamReader(readingStream)
+									: new InputStreamReader(readingStream, encoding));
+						}
 
-					charRead = streamReader.read(cbuf);
-					if (charRead > 0) {
-						String s = new String(cbuf, 0, charRead);
-						streamsProxy.write(s);
+						charRead = streamReader.read(cbuf);
+						if (charRead > 0) {
+							String s = new String(cbuf, 0, charRead);
+							streamsProxy.write(s);
+						}
 					}
+				} catch (IOException e) {
+					DebugUIPlugin.log(e);
 				}
-			} catch (IOException e) {
-				DebugUIPlugin.log(e);
 			}
 			readingStream = null;
 			return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java
index f3ca1e23b7d754f6d244a109c7f68206529775f5..968aa02712ffbbf3854cdeada19fbe0d091259a9 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -40,6 +40,7 @@ import org.eclipse.ui.console.IConsole;
 import org.eclipse.ui.console.IConsoleConstants;
 import org.eclipse.ui.console.IConsolePageParticipant;
 import org.eclipse.ui.console.IConsoleView;
+import org.eclipse.ui.console.actions.ClearOutputAction;
 import org.eclipse.ui.contexts.IContextActivation;
 import org.eclipse.ui.contexts.IContextService;
 import org.eclipse.ui.handlers.IHandlerActivation;
@@ -70,10 +71,13 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I
 
 	private IConsoleView fView;
 
+	private static final String fContextId = "org.eclipse.debug.ui.console"; //$NON-NLS-1$;
 	private EOFHandler fEOFHandler;
-	private String fContextId = "org.eclipse.debug.ui.console"; //$NON-NLS-1$;
+	private ClearConsoleHandler fClearConsoleHandler;
+	private ClearOutputAction fClearConsoleAction;
 	private IContextActivation fActivatedContext;
-	private IHandlerActivation fActivatedHandler;
+	private IHandlerActivation fEOFActivatedHandler;
+	private IHandlerActivation fClearConsoleActivatedHandler;
 	/**
 	 * Handler to send EOF
 	 */
@@ -90,7 +94,19 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I
 			}
 			return null;
 		}
+	}
 
+	/**
+	 * Handler to send clear console
+	 */
+	private class ClearConsoleHandler extends AbstractHandler {
+		@Override
+		public Object execute(ExecutionEvent event) throws org.eclipse.core.commands.ExecutionException {
+			if (fClearConsoleAction != null) {
+				fClearConsoleAction.run();
+			}
+			return null;
+		}
 	}
 
 	@Override
@@ -113,8 +129,10 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I
 		IActionBars actionBars = fPage.getSite().getActionBars();
 		configureToolBar(actionBars.getToolBarManager());
 
-		// create handler and submissions for EOF
+		// create handler for EOF and clear
 		fEOFHandler = new EOFHandler();
+		fClearConsoleHandler = new ClearConsoleHandler();
+		fClearConsoleAction = new ClearOutputAction(fConsole);
 	}
 
 	@Override
@@ -223,26 +241,31 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I
 
 	@Override
 	public void activated() {
-		// add EOF submissions
+		// add EOF and clear submissions
 		IPageSite site = fPage.getSite();
-		if(fActivatedContext == null && fActivatedHandler == null) {
+		if (fActivatedContext == null) {
 			IHandlerService handlerService = site.getService(IHandlerService.class);
 			IContextService contextService = site.getService(IContextService.class);
 			fActivatedContext = contextService.activateContext(fContextId);
-			fActivatedHandler = handlerService.activateHandler("org.eclipse.debug.ui.commands.eof", fEOFHandler); //$NON-NLS-1$
+			fEOFActivatedHandler = handlerService.activateHandler("org.eclipse.debug.ui.commands.eof", fEOFHandler); //$NON-NLS-1$
+			fClearConsoleActivatedHandler = handlerService
+					.activateHandler("org.eclipse.debug.ui.commands.console.clear", fClearConsoleHandler); //$NON-NLS-1$
 		}
 	}
 
 	@Override
 	public void deactivated() {
-		// remove EOF submissions
+		// remove EOF and clear submissions
 		IPageSite site = fPage.getSite();
 		IHandlerService handlerService = site.getService(IHandlerService.class);
 		IContextService contextService = site.getService(IContextService.class);
-		handlerService.deactivateHandler(fActivatedHandler);
+		handlerService.deactivateHandler(fClearConsoleActivatedHandler);
+		handlerService.deactivateHandler(fEOFActivatedHandler);
 		contextService.deactivateContext(fActivatedContext);
 		fActivatedContext = null;
-		fActivatedHandler = null;
+		fEOFActivatedHandler = null;
+		fClearConsoleActivatedHandler = null;
+		fClearConsoleAction = null;
 	}
 
 	@Override
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
index f17597ee6fb7a93c0815acc8d8b2c9246bde24e8..d8bae0c13aa8435d6d090fef77de81ed361ecbd7 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
@@ -87,7 +87,6 @@ import org.eclipse.debug.ui.contexts.IDebugContextProvider;
 import org.eclipse.jface.action.ActionContributionItem;
 import org.eclipse.jface.action.GroupMarker;
 import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.MenuManager;
@@ -469,12 +468,7 @@ public class LaunchView extends AbstractDebugView
 	 */
 	private PageRec fDefaultPageRec = null;
 
-	private ISelectionChangedListener fTreeViewerSelectionChangedListener = new ISelectionChangedListener() {
-		@Override
-		public void selectionChanged(SelectionChangedEvent event) {
-			fTreeViewerDebugContextProvider.activate(event.getSelection());
-		}
-	};
+	private ISelectionChangedListener fTreeViewerSelectionChangedListener = event -> fTreeViewerDebugContextProvider.activate(event.getSelection());
 
 	private class ContextProviderProxy extends AbstractDebugContextProvider implements IDebugContextListener {
 		private IDebugContextProvider fActiveProvider;
@@ -750,15 +744,12 @@ public class LaunchView extends AbstractDebugView
 		modeSubmenu.add(fBreadcrumbDropDownAutoExpandAction);
 		viewMenu.add(modeSubmenu);
 
-		modeSubmenu.addMenuListener(new IMenuListener() {
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				modeSubmenu.add(fDebugViewModeActions[0]);
-				modeSubmenu.add(fDebugViewModeActions[1]);
-				modeSubmenu.add(fDebugViewModeActions[2]);
-				modeSubmenu.add(new Separator());
-				modeSubmenu.add(fBreadcrumbDropDownAutoExpandAction);
-			}
+		modeSubmenu.addMenuListener(manager -> {
+			modeSubmenu.add(fDebugViewModeActions[0]);
+			modeSubmenu.add(fDebugViewModeActions[1]);
+			modeSubmenu.add(fDebugViewModeActions[2]);
+			modeSubmenu.add(new Separator());
+			modeSubmenu.add(fBreadcrumbDropDownAutoExpandAction);
 		});
 	}
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java
index ccb12f2c158447c36706f226ca01e50def330f7d..9df8a069e442e98899fead9a0f1e1e694600567d 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java
@@ -35,8 +35,6 @@ import org.eclipse.debug.ui.contexts.AbstractDebugContextProvider;
 import org.eclipse.debug.ui.contexts.DebugContextEvent;
 import org.eclipse.debug.ui.contexts.IDebugContextListener;
 import org.eclipse.debug.ui.contexts.IDebugContextProvider;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.BaseLabelProvider;
@@ -53,8 +51,6 @@ import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.jface.viewers.ViewerLabel;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Menu;
@@ -282,12 +278,7 @@ public class LaunchViewBreadcrumb extends AbstractBreadcrumb implements IDebugCo
 	protected void createMenuManager() {
 		MenuManager menuMgr = new MenuManager("#PopUp"); //$NON-NLS-1$
 		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			@Override
-			public void menuAboutToShow(IMenuManager mgr) {
-				fView.fillContextMenu(mgr);
-			}
-		});
+		menuMgr.addMenuListener(mgr -> fView.fillContextMenu(mgr));
 		final Menu menu= menuMgr.createContextMenu(fViewer.getControl());
 
 		// register the context menu such that other plug-ins may contribute to it
@@ -296,15 +287,12 @@ public class LaunchViewBreadcrumb extends AbstractBreadcrumb implements IDebugCo
 		}
 		fView.addContextMenuManager(menuMgr);
 
-		fViewer.addMenuDetectListener(new MenuDetectListener() {
-			@Override
-			public void menuDetected(MenuDetectEvent event) {
-				menu.setLocation(event.x + 10, event.y + 10);
-				menu.setVisible(true);
-				while (!menu.isDisposed() && menu.isVisible()) {
-					if (!menu.getDisplay().readAndDispatch()) {
-						menu.getDisplay().sleep();
-					}
+		fViewer.addMenuDetectListener(event -> {
+			menu.setLocation(event.x + 10, event.y + 10);
+			menu.setVisible(true);
+			while (!menu.isDisposed() && menu.isVisible()) {
+				if (!menu.getDisplay().readAndDispatch()) {
+					menu.getDisplay().sleep();
 				}
 			}
 		});
@@ -529,14 +517,11 @@ public class LaunchViewBreadcrumb extends AbstractBreadcrumb implements IDebugCo
 					fDropDownViewer.saveElementState(TreePath.EMPTY, delta, IModelDelta.EXPAND | IModelDelta.SELECT);
 
 					// Add the IModelDelta.FORCE flag to override the current selection in view.
-					rootDelta.accept(new IModelDeltaVisitor(){
-						@Override
-						public boolean visit(IModelDelta paramDelta, int depth) {
-							if ((paramDelta.getFlags() & IModelDelta.SELECT) != 0) {
-								((ModelDelta)paramDelta).setFlags(paramDelta.getFlags() | IModelDelta.FORCE);
-							}
-							return true;
+					rootDelta.accept((paramDelta, depth) -> {
+						if ((paramDelta.getFlags() & IModelDelta.SELECT) != 0) {
+							((ModelDelta)paramDelta).setFlags(paramDelta.getFlags() | IModelDelta.FORCE);
 						}
+						return true;
 					});
 
 					// If elements in the drop-down were auto-expanded, then collapse the drop-down's sub tree in the
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
index c54bc43c30083e217bb7ff4178d71b1c09365a48..427955ba0d5bb44f51c5460ae6347461e6b5bf34 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
@@ -36,8 +36,6 @@ import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener;
 import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
 import org.eclipse.debug.ui.memory.IMemoryRenderingType;
 import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ILabelDecorator;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
@@ -47,7 +45,6 @@ import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -102,21 +99,17 @@ public class AddMemoryRenderingDialog extends SelectionDialog {
 		}
 	};
 
-	private IMemoryRenderingBindingsListener fBindingListener = new IMemoryRenderingBindingsListener() {
-		@Override
-		public void memoryRenderingBindingsChanged() {
-			UIJob job = new UIJob("refresh") { //$NON-NLS-1$
-
-				@Override
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					fViewer.refresh();
-					return Status.OK_STATUS;
-				}
-			};
-			job.setSystem(true);
-			job.schedule();
-		}
+	private IMemoryRenderingBindingsListener fBindingListener = () -> {
+		UIJob job = new UIJob("refresh") { //$NON-NLS-1$
 
+			@Override
+			public IStatus runInUIThread(IProgressMonitor monitor) {
+				fViewer.refresh();
+				return Status.OK_STATUS;
+			}
+		};
+		job.setSystem(true);
+		job.schedule();
 	};
 
 	class MemoryRenderingLabelProvider implements ILabelProvider {
@@ -319,13 +312,7 @@ public class AddMemoryRenderingDialog extends SelectionDialog {
 		listLayout.heightHint = 140;
 		fViewer.getControl().setLayoutData(listLayout);
 
-		fViewer.addDoubleClickListener(new IDoubleClickListener() {
-
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				okPressed();
-			}
-		});
+		fViewer.addDoubleClickListener(event -> okPressed());
 
 		IMemoryBlock currentBlock = getMemoryBlockToSelect(null);
 		if (currentBlock == null) {
@@ -334,17 +321,13 @@ public class AddMemoryRenderingDialog extends SelectionDialog {
 			populateDialog(currentBlock);
 		}
 
-		fSelectionChangedListener = new ISelectionChangedListener() {
+		fSelectionChangedListener = event -> {
+			ISelection selection = fViewer.getSelection();
 
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection selection = fViewer.getSelection();
-
-				if (selection.isEmpty()) {
-					getButton(IDialogConstants.OK_ID).setEnabled(false);
-				} else {
-					getButton(IDialogConstants.OK_ID).setEnabled(true);
-				}
+			if (selection.isEmpty()) {
+				getButton(IDialogConstants.OK_ID).setEnabled(false);
+			} else {
+				getButton(IDialogConstants.OK_ID).setEnabled(true);
 			}
 		};
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
index 2ca3ac384378f2453df403abaaa683a7c299a278..18a72a1b29f85b40847b9fb48e6d1928875fcfe2 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
@@ -45,8 +45,6 @@ import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
 import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.dialogs.MessageDialog;
@@ -295,13 +293,9 @@ public class MemoryBlocksTreeViewPane implements ISelectionListener, ISelectionC
 		fDebugContextListener = new TreeViewPaneContextListener();
 		DebugUITools.addPartDebugContextListener(fParent.getSite(), fDebugContextListener);
 
-		fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection treeSelected = event.getSelection();
-				fSelectionProvider.setSelection(treeSelected);
-			}
+		fTreeViewer.addSelectionChangedListener(event -> {
+			ISelection treeSelected = event.getSelection();
+			fSelectionProvider.setSelection(treeSelected);
 		});
 
 		updateRetrieval();
@@ -336,13 +330,10 @@ public class MemoryBlocksTreeViewPane implements ISelectionListener, ISelectionC
 	protected MenuManager createContextMenuManager() {
 		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
 		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				manager.add(fAddMemoryBlockAction);
-				manager.add(fRemoveMemoryBlockAction);
-				manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-			}
+		menuMgr.addMenuListener(manager -> {
+			manager.add(fAddMemoryBlockAction);
+			manager.add(fRemoveMemoryBlockAction);
+			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
 		});
 
 		// register a context menu manager, use its pane id as the menu id
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java
index 99990459162a54c9b4ee786196d1a5db0e37f883..134deea5fdaa7b2172a80dd36d895e3de70e803a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java
@@ -26,7 +26,6 @@ import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.viewers.IBasicPropertyConstants;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Control;
@@ -72,13 +71,9 @@ public class MemoryViewTab implements IMemoryViewTab, IPropertyChangeListener, L
 		fTabItem.setText(getLabel());
 		fTabItem.setImage(getImage());
 
-		fTabItem.addDisposeListener(fDisposeListener = new DisposeListener() {
-
-			@Override
-			public void widgetDisposed(DisposeEvent e) {
-				fTabItem.removeDisposeListener(fDisposeListener);
-				dispose();
-			}
+		fTabItem.addDisposeListener(fDisposeListener = e -> {
+			fTabItem.removeDisposeListener(fDisposeListener);
+			dispose();
 		});
 	}
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java
index 1d99b6bfed90c7a88f5bd1944ae4c3bcac5876c0..1b741465be764bbd3e458dee54fcdcb59f56ad13 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java
@@ -31,7 +31,6 @@ import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
 import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
 import org.eclipse.debug.internal.ui.DebugUIMessages;
 import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
 import org.eclipse.debug.ui.contexts.IDebugContextListener;
 import org.eclipse.debug.ui.memory.IMemoryRendering;
 import org.eclipse.jface.action.Action;
@@ -127,12 +126,9 @@ public class SwitchMemoryBlockAction extends Action implements IViewActionDelega
 	/**
 	 * Listens for debug context changes and updates action delegate enablement
 	 */
-	private IDebugContextListener fDebugContextListener = new IDebugContextListener() {
-		@Override
-		public void debugContextChanged(DebugContextEvent event) {
-			if (fAction != null) {
-				fUpdateJob.schedule();
-			}
+	private IDebugContextListener fDebugContextListener = event -> {
+		if (fAction != null) {
+			fUpdateJob.schedule();
 		}
 	};
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
index c09a32c9820e418c2903d7d7842657fa2a50de14..5c2d85ba344a3f8666dbc633b308af79462e0eac 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
@@ -36,9 +36,7 @@ import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener;
 import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
 import org.eclipse.debug.ui.memory.IMemoryRenderingType;
 import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.ISelection;
@@ -186,12 +184,7 @@ public class CreateRendering extends AbstractMemoryRendering implements IMemoryR
 		listLayout.horizontalSpan = 1;
 		fViewer.getControl().setLayoutData(listLayout);
 
-		fViewer.addDoubleClickListener(new IDoubleClickListener (){
-
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				addRenderings();
-			}});
+		fViewer.addDoubleClickListener(event -> addRenderings());
 
 		// listen for enter being pressed
 		fViewer.getList().addKeyListener(new KeyAdapter() {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
index 8b83c4d4f294e9c5179a86bb3d588ef1ae7249f0..fc5a907ac9a28d348d6aa14d7402ce72ea3093e9 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
@@ -78,7 +78,6 @@ import org.eclipse.debug.ui.contexts.IDebugContextListener;
 import org.eclipse.debug.ui.contexts.IDebugContextService;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.action.IToolBarManager;
@@ -114,7 +113,6 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.TreeItem;
@@ -123,7 +121,6 @@ import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.IPerspectiveDescriptor;
 import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IPropertyListener;
 import org.eclipse.ui.ISaveablePart2;
 import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.IWorkbenchActionConstants;
@@ -156,12 +153,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 	 */
 	private static class SelectionProviderWrapper implements ISelectionProvider {
 		private final ListenerList<ISelectionChangedListener> fListenerList = new ListenerList<>(ListenerList.IDENTITY);
-		private final ISelectionChangedListener fListener = new ISelectionChangedListener() {
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				fireSelectionChanged(event);
-			}
-		};
+		private final ISelectionChangedListener fListener = this::fireSelectionChanged;
 		private ISelectionProvider fActiveProvider;
 
 		private SelectionProviderWrapper(ISelectionProvider provider) {
@@ -293,12 +285,9 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 	 * Viewer input requester used to update the viewer once the viewer input has been
 	 * resolved.
 	 */
-	private IViewerInputRequestor fRequester = new IViewerInputRequestor() {
-		@Override
-		public void viewerInputComplete(IViewerInputUpdate update) {
-			if (!update.isCanceled()) {
-				viewerInputUpdateComplete(update);
-			}
+	private IViewerInputRequestor fRequester = update -> {
+		if (!update.isCanceled()) {
+			viewerInputUpdateComplete(update);
 		}
 	};
 
@@ -505,12 +494,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 		}
 
 		fDetailPane = new DetailPaneProxy(this);
-		fDetailPane.addProperyListener(new IPropertyListener() {
-			@Override
-			public void propertyChanged(Object source, int propId) {
-				firePropertyChange(propId);
-			}
-		});
+		fDetailPane.addProperyListener((source, propId) -> firePropertyChange(propId));
 		setDetailPaneOrientation(orientation);
 
 		IMemento memento = getMemento();
@@ -576,7 +560,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 			sw = memento.getInteger(SASH_DETAILS_PART);
 			if(sw != null) {
 				int details = sw.intValue();
-				if(view > -1 & details > -1) {
+				if(view > -1 && details > -1) {
 					return new int[] {view, details};
 				}
 			}
@@ -652,14 +636,11 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 			}
 		});
 		variablesViewer.getPresentationContext().addPropertyChangeListener(
-				new IPropertyChangeListener() {
-					@Override
-					public void propertyChange(PropertyChangeEvent event) {
-						if (IPresentationContext.PROPERTY_COLUMNS.equals(event.getProperty())) {
-							IAction action = getAction("ShowTypeNames"); //$NON-NLS-1$
-							if (action != null) {
-								action.setEnabled(event.getNewValue() == null);
-							}
+				event -> {
+					if (IPresentationContext.PROPERTY_COLUMNS.equals(event.getProperty())) {
+						IAction action = getAction("ShowTypeNames"); //$NON-NLS-1$
+						if (action != null) {
+							action.setEnabled(event.getNewValue() == null);
 						}
 					}
 				});
@@ -1017,23 +998,20 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 		fConfigureColumnsAction = new ConfigureColumnsAction(viewer);
 		setAction("ToggleColmns", new ToggleShowColumnsAction(viewer)); //$NON-NLS-1$
 
-		layoutSubMenu.addMenuListener(new IMenuListener() {
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				layoutSubMenu.add(fToggleDetailPaneActions[0]);
-				layoutSubMenu.add(fToggleDetailPaneActions[1]);
-				layoutSubMenu.add(fToggleDetailPaneActions[2]);
-				layoutSubMenu.add(fToggleDetailPaneActions[3]);
-				layoutSubMenu.add(new Separator());
-				IAction action = getAction("ToggleColmns"); //$NON-NLS-1$
-				((IUpdate)action).update();
-				if (action.isEnabled()) {
-					layoutSubMenu.add(action);
-				}
-				fConfigureColumnsAction.update();
-				if (fConfigureColumnsAction.isEnabled()) {
-					layoutSubMenu.add(fConfigureColumnsAction);
-				}
+		layoutSubMenu.addMenuListener(manager -> {
+			layoutSubMenu.add(fToggleDetailPaneActions[0]);
+			layoutSubMenu.add(fToggleDetailPaneActions[1]);
+			layoutSubMenu.add(fToggleDetailPaneActions[2]);
+			layoutSubMenu.add(fToggleDetailPaneActions[3]);
+			layoutSubMenu.add(new Separator());
+			IAction action = getAction("ToggleColmns"); //$NON-NLS-1$
+			((IUpdate)action).update();
+			if (action.isEnabled()) {
+				layoutSubMenu.add(action);
+			}
+			fConfigureColumnsAction.update();
+			if (fConfigureColumnsAction.isEnabled()) {
+				layoutSubMenu.add(fConfigureColumnsAction);
 			}
 		});
 	}
@@ -1099,18 +1077,15 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 	 */
 	protected ISelectionChangedListener getTreeSelectionChangedListener() {
 		if (fTreeSelectionChangedListener == null) {
-			fTreeSelectionChangedListener = new ISelectionChangedListener() {
-				@Override
-				public void selectionChanged(final SelectionChangedEvent event) {
-					if (event.getSelectionProvider().equals(getViewer())) {
-						clearStatusLine();
-						// if the detail pane is not visible, don't waste time retrieving details
-						if (fSashForm.getMaximizedControl() == getViewer().getControl()) {
-							return;
-						}
-						refreshDetailPaneContents();
-						treeSelectionChanged(event);
+			fTreeSelectionChangedListener = event -> {
+				if (event.getSelectionProvider().equals(getViewer())) {
+					clearStatusLine();
+					// if the detail pane is not visible, don't waste time retrieving details
+					if (fSashForm.getMaximizedControl() == getViewer().getControl()) {
+						return;
 					}
+					refreshDetailPaneContents();
+					treeSelectionChanged(event);
 				}
 			};
 		}
@@ -1173,12 +1148,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis
 	@Override
 	public void paneChanged(String newPaneID) {
 		if (fDetailPaneActivatedListener == null){
-			fDetailPaneActivatedListener = 	new Listener() {
-				@Override
-				public void handleEvent(Event event) {
-					fTreeHasFocus = false;
-				}
-			};
+			fDetailPaneActivatedListener = 	event -> fTreeHasFocus = false;
 		}
 		fDetailPane.getCurrentControl().addListener(SWT.Activate, fDetailPaneActivatedListener);
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java
index d7b3780ec35dbb5a91a603ed0d269fea3284ef07..0356a558df67280c02067380ffc7cdd1b46786fa 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java
@@ -52,9 +52,7 @@ import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.ITableLabelProvider;
@@ -64,7 +62,6 @@ import org.eclipse.swt.accessibility.AccessibleAdapter;
 import org.eclipse.swt.accessibility.AccessibleEvent;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -82,7 +79,6 @@ import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ContainerSelectionDialog;
 import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
 import org.eclipse.ui.ide.IDEEncoding;
 import org.eclipse.ui.model.WorkbenchContentProvider;
 import org.eclipse.ui.model.WorkbenchLabelProvider;
@@ -154,12 +150,7 @@ public class CommonTab extends AbstractLaunchConfigurationTab {
 	/**
 	 * Modify listener that simply updates the owning launch configuration dialog.
 	 */
-	private ModifyListener fBasicModifyListener = new ModifyListener() {
-		@Override
-		public void modifyText(ModifyEvent evt) {
-			scheduleUpdateJob();
-		}
-	};
+	private ModifyListener fBasicModifyListener = evt -> scheduleUpdateJob();
 
 	/**
 	 * Constructs a new tab with default context help.
@@ -214,12 +205,7 @@ public class CommonTab extends AbstractLaunchConfigurationTab {
 		table.setFont(parent.getFont());
 		fFavoritesTable.setContentProvider(new FavoritesContentProvider());
 		fFavoritesTable.setLabelProvider(new FavoritesLabelProvider());
-		fFavoritesTable.addCheckStateListener(new ICheckStateListener() {
-				@Override
-				public void checkStateChanged(CheckStateChangedEvent event) {
-					updateLaunchConfigurationDialog();
-				}
-			});
+		fFavoritesTable.addCheckStateListener(event -> updateLaunchConfigurationDialog());
 	}
 
 	/**
@@ -393,20 +379,16 @@ public class CommonTab extends AbstractLaunchConfigurationTab {
 			public void widgetSelected(SelectionEvent e) {
 				ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider());
 				dialog.setTitle(LaunchConfigurationsMessages.CommonTab_13);
-				dialog.setValidator(new ISelectionStatusValidator() {
-
-					@Override
-					public IStatus validate(Object[] selection) {
-						if (selection.length == 0) {
+				dialog.setValidator(selection -> {
+					if (selection.length == 0) {
+						return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
+					}
+					for (Object f : selection) {
+						if (!(f instanceof IFile)) {
 							return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 						}
-						for (Object f : selection) {
-							if (!(f instanceof IFile)) {
-								return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
-							}
-						}
-						return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 					}
+					return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null);
 				});
 				dialog.setMessage(LaunchConfigurationsMessages.CommonTab_18);
 				dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java
index 1f5a2675fa082831f641fd24546aa2ef7d07e45f..f24c1c9f9cbee20e9b77338564db6d2494b73870 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java
@@ -72,6 +72,7 @@ import org.eclipse.debug.internal.ui.memory.MemoryRenderingManager;
 import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupFacility;
 import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
 import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
+import org.eclipse.debug.internal.ui.views.breakpoints.DeleteBreakpointMarkersOperation;
 import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetManager;
 import org.eclipse.debug.ui.contexts.IDebugContextListener;
 import org.eclipse.debug.ui.contexts.IDebugContextManager;
@@ -101,7 +102,6 @@ import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.console.IConsole;
 import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
 import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
 
 
@@ -301,6 +301,13 @@ public class DebugUITools {
 	 * @since 3.7
 	 */
 	public static void deleteBreakpoints(IBreakpoint[] breakpoints, final Shell shell, IProgressMonitor progressMonitor) throws CoreException {
+		if (breakpoints.length == 0) {
+			// Note: this is not only a small performance optimization but also the fix for
+			// bug 344352. When removing no breakpoints the DeleteMarkersOperation will show
+			// an error dialog about missing markers.
+			return;
+		}
+
 		IMarker[] markers= new IMarker[breakpoints.length];
 		int markerCount;
 		for (markerCount= 0; markerCount < breakpoints.length; markerCount++) {
@@ -319,11 +326,6 @@ public class DebugUITools {
 		DebugPlugin.getDefault().getBreakpointManager().removeBreakpoints(breakpoints, !allowUndo);
 
 		if (allowUndo) {
-
-			for (IMarker marker : markers) {
-				marker.setAttribute(DebugPlugin.ATTR_BREAKPOINT_IS_DELETED, true);
-			}
-
 			IAdaptable context= null;
 			if (shell != null) {
 				context= new IAdaptable() {
@@ -339,7 +341,7 @@ public class DebugUITools {
 			}
 
 			String operationName= markers.length == 1 ? ActionMessages.DeleteBreakpointOperationName : ActionMessages.DeleteBreakpointsOperationName;
-			IUndoableOperation deleteMarkerOperation= new DeleteMarkersOperation(markers, operationName);
+			IUndoableOperation deleteMarkerOperation = new DeleteBreakpointMarkersOperation(markers, operationName);
 			deleteMarkerOperation.removeContext(WorkspaceUndoUtil.getWorkspaceUndoContext());
 			deleteMarkerOperation.addContext(DebugUITools.getBreakpointsUndoContext());
 			IOperationHistory operationHistory= PlatformUI.getWorkbench().getOperationSupport().getOperationHistory();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java
index a649bda36c15836ee55ce4019ba8e9b1d83bd651..528fe429e36f5377a94b98b160555ffd968a76c2 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java
@@ -16,7 +16,6 @@ package org.eclipse.debug.ui.actions;
 
 import org.eclipse.debug.core.IRequest;
 import org.eclipse.debug.internal.ui.commands.actions.DebugCommandService;
-import org.eclipse.debug.internal.ui.commands.actions.ICommandParticipant;
 import org.eclipse.debug.internal.ui.commands.actions.IEnabledTarget;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.contexts.DebugContextEvent;
@@ -117,12 +116,7 @@ public abstract class DebugCommandAction extends Action implements IDebugContext
 	private boolean execute(final Object[] targets) {
 		return fUpdateService.executeCommand(
 			getCommandType(), targets,
-			new ICommandParticipant() {
-				@Override
-				public void requestDone(org.eclipse.debug.core.IRequest request) {
-					DebugCommandAction.this.postExecute(request, targets);
-				}
-			});
+			request -> DebugCommandAction.this.postExecute(request, targets));
 	}
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
index 04cf4febd0465bf550216a2331a52fb00877b4cc..897526c27f85d547fcdefbfa27b832fc0e51cc92 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
@@ -57,14 +57,15 @@ public class FileLink implements IConsoleHyperlink {
 	/**
 	 * Constructs a hyperlink to the specified file.
 	 *
-	 * @param file the file to open when activated
-	 * @param editorId the identifier of the editor to open the file in, or
-	 * <code>null</code> if the default editor should be used
-	 * @param fileOffset the offset in the file to select when activated, or -1
-	 * @param fileLength the length of text to select in the file when activated
-	 * or -1
-	 * @param fileLineNumber the line number to select in the file when
-	 * activated, or -1
+	 * @param file           the file to open when activated
+	 * @param editorId       the identifier of the editor to open the file in, or
+	 *                       <code>null</code> if the default editor should be used
+	 * @param fileOffset     the offset in the file to select when activated, or -1
+	 * @param fileLength     the length of text to select in the file when activated
+	 *                       or -1
+	 * @param fileLineNumber the line number to select in the file when activated,
+	 *                       or -1. First line number is 1. Only used if
+	 *                       <em>fileOffset</em> is not set.
 	 */
 	public FileLink(IFile file, String editorId, int fileOffset, int fileLength, int fileLineNumber) {
 		fFile = file;
@@ -82,7 +83,7 @@ public class FileLink implements IConsoleHyperlink {
 			if (page != null) {
 				try {
 					IEditorPart editorPart = page.openEditor(new FileEditorInput(fFile), getEditorId() , true);
-					if (fFileLineNumber > 0) {
+					if (fFileLineNumber > 0 || (fFileOffset >= 0 && fFileLength >= 0)) {
 						ITextEditor textEditor = null;
 						if (editorPart instanceof ITextEditor) {
 							textEditor = (ITextEditor) editorPart;
@@ -90,8 +91,8 @@ public class FileLink implements IConsoleHyperlink {
 							textEditor = editorPart.getAdapter(ITextEditor.class);
 						}
 						if (textEditor != null) {
-							IEditorInput input = editorPart.getEditorInput();
 							if (fFileOffset < 0) {
+								IEditorInput input = editorPart.getEditorInput();
 								IDocumentProvider provider = textEditor.getDocumentProvider();
 								try {
 									provider.connect(input);
diff --git a/org.eclipse.ui.console/META-INF/MANIFEST.MF b/org.eclipse.ui.console/META-INF/MANIFEST.MF
index 1d193c1734a1abcdfc51650c14694977048e5f6f..9c3bc07da5b2212f25c3d43bb68e83aee466add3 100644
--- a/org.eclipse.ui.console/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.console/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ui.console; singleton:=true
-Bundle-Version: 3.9.200.qualifier
+Bundle-Version: 3.9.300.qualifier
 Bundle-Activator: org.eclipse.ui.console.ConsolePlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -14,7 +14,8 @@ Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.variables;bundle-version="[3.2.800,4.0.0)"
+ org.eclipse.core.variables;bundle-version="[3.2.800,4.0.0)",
+ org.eclipse.debug.core;bundle-version="[3.16.0,4.0.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Automatic-Module-Name: org.eclipse.ui.console
diff --git a/org.eclipse.ui.console/forceQualifierUpdate.txt b/org.eclipse.ui.console/forceQualifierUpdate.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e3185a3bd627646336dd678248df95de813ddb2e
--- /dev/null
+++ b/org.eclipse.ui.console/forceQualifierUpdate.txt
@@ -0,0 +1,2 @@
+# To force a version qualifier update add the bug here
+Bug 566471 - I20200828-0150 - Comparator Errors Found
diff --git a/org.eclipse.ui.console/icons/full/cview16/console_view.gif b/org.eclipse.ui.console/icons/full/cview16/console_view.gif
deleted file mode 100644
index a598f6082f6678d2125469b1b6ae05836796d04a..0000000000000000000000000000000000000000
Binary files a/org.eclipse.ui.console/icons/full/cview16/console_view.gif and /dev/null differ
diff --git a/org.eclipse.ui.console/icons/full/eview16/console_view.gif b/org.eclipse.ui.console/icons/full/eview16/console_view.gif
deleted file mode 100644
index a598f6082f6678d2125469b1b6ae05836796d04a..0000000000000000000000000000000000000000
Binary files a/org.eclipse.ui.console/icons/full/eview16/console_view.gif and /dev/null differ
diff --git a/org.eclipse.ui.console/pom.xml b/org.eclipse.ui.console/pom.xml
index 430b786963c834f4260b24601e3e1929d6fe9cda..1aca91b44f1ebab5b7eb98a9bc8b1680a7e37ab1 100644
--- a/org.eclipse.ui.console/pom.xml
+++ b/org.eclipse.ui.console/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.ui</groupId>
   <artifactId>org.eclipse.ui.console</artifactId>
-  <version>3.9.200-SNAPSHOT</version>
+  <version>3.9.300-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java
index d4442f41eb73efde85b6718588f96cd82435c3ea..56464eba5a5b688fde33371407aee0d0ed83f533 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java
@@ -16,7 +16,7 @@ package org.eclipse.ui.console;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
@@ -150,14 +150,10 @@ public class IOConsoleInputStream extends InputStream {
 	 * @param text the text to append to the buffer.
 	 */
 	public synchronized void appendData(String text) {
-		String encoding = console.getEncoding();
+		Charset charset = console.getCharset();
 		byte[] newData;
-		if (encoding!=null) {
-			try {
-				newData = text.getBytes(encoding);
-			} catch (UnsupportedEncodingException e) {
-				newData = text.getBytes();
-			}
+		if (charset != null) {
+			newData = text.getBytes(charset);
 		} else {
 			newData = text.getBytes();
 		}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
index 2faaa369245395ddf91128dd5afcda1575cb7322..bbe638bb59022e891fc97dfeab1c6d9a83d7c9a3 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
@@ -18,10 +18,10 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.Charset;
 
+import org.eclipse.debug.internal.core.StreamDecoder;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.ui.WorkbenchEncoding;
 import org.eclipse.ui.internal.console.IOConsolePartitioner;
-import org.eclipse.ui.internal.console.StreamDecoder;
 
 /**
  * OutputStream used to write to an IOConsole.
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java
index 5eea534ec440227fc79899d33c1a00bc14fde107..f23572e5adec46d1aa4d20130a4cfb6bd206bbf0 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java
@@ -151,7 +151,7 @@ public class TextConsolePage implements IPageBookViewPage, IPropertyChangeListen
 		}
 		fMenuManager= new MenuManager("#ContextMenu", id);  //$NON-NLS-1$
 		fMenuManager.setRemoveAllWhenShown(true);
-		fMenuManager.addMenuListener(m -> contextMenuAboutToShow(m));
+		fMenuManager.addMenuListener(this::contextMenuAboutToShow);
 		Menu menu = fMenuManager.createContextMenu(getControl());
 		getControl().setMenu(menu);
 
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java
index 6f593fe1bc941d9f656cb0654fb06e92586ecaff..0e448a6c1b2921d5d99d8adad2e7ef722f47e2c9 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java
@@ -98,12 +98,12 @@ public class IOConsolePartitioner
 	 * Pattern used to find supported ASCII control characters <b>except</b>
 	 * carriage return.
 	 */
-	private static final String CONTROL_CHARACTERS_PATTERN_STR = "(?:\b+|\u000b+|\f+)"; //$NON-NLS-1$
+	private static final String CONTROL_CHARACTERS_PATTERN_STR = "(?:\b+|\u0000+|\u000b+|\f+)"; //$NON-NLS-1$
 	/**
 	 * Pattern used to find supported ASCII control characters <b>including</b>
 	 * carriage return.
 	 */
-	private static final String CONTROL_CHARACTERS_WITH_CR_PATTERN_STR = "(?:\b+|\u000b+|\f+|\r+(?!\n))"; //$NON-NLS-1$
+	private static final String CONTROL_CHARACTERS_WITH_CR_PATTERN_STR = "(?:\b+|\u0000+|\u000b+|\f+|\r+(?!\n))"; //$NON-NLS-1$
 
 	/** The connected {@link IDocument} this partitioner manages. */
 	private IDocument document;
@@ -881,6 +881,7 @@ public class IOConsolePartitioner
 						applyOutputToDocument(content.toString(), nextWriteOffset, replaceLength);
 						content.setLength(0);
 						replaceLength = 0;
+						nextWriteOffset = outputOffset;
 
 						final String controlCharacterMatch = controlCharacterMatcher.group();
 						final char controlCharacter = controlCharacterMatch.charAt(0);
@@ -949,6 +950,13 @@ public class IOConsolePartitioner
 							partititonContent(pending.stream, vtab, 0, vtab.length());
 							break;
 
+						case 0:
+							// Do nothing for null bytes. The use of this is that a null byte which reach
+							// the IOConsoleViewer will truncate the line on some platforms and will disturb
+							// copying text on most platforms.
+							// This case should simply filter out any null bytes.
+							break;
+
 						default:
 							// should never happen as long as the used regex pattern is valid
 							log(IStatus.ERROR, "No implementation to handle control character 0x" //$NON-NLS-1$
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java
index 0bc54f2af6cc4ce8a32801a5be697c15485b85a2..e334aa22e3894dffd7cdb61eab79cb3058380c7a 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java
@@ -14,93 +14,17 @@
 
 package org.eclipse.ui.internal.console;
 
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
 import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CoderResult;
-import java.nio.charset.CodingErrorAction;
 
 
 /**
- * @since 3.7
+ * @deprecated class was moved to
+ *             {@link org.eclipse.debug.internal.core.StreamDecoder}
  */
-public class StreamDecoder {
-
-	static private final int BUFFER_SIZE = 4096;
-
-	private final CharsetDecoder decoder;
-	private final ByteBuffer inputBuffer;
-	private final CharBuffer outputBuffer;
-	private boolean finished;
+@Deprecated
+public class StreamDecoder extends org.eclipse.debug.internal.core.StreamDecoder {
 
 	public StreamDecoder(Charset charset) {
-		this.decoder = charset.newDecoder();
-		this.decoder.onMalformedInput(CodingErrorAction.REPLACE);
-		this.decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
-		this.inputBuffer = ByteBuffer.allocate(StreamDecoder.BUFFER_SIZE);
-		this.inputBuffer.flip();
-		this.outputBuffer = CharBuffer.allocate(StreamDecoder.BUFFER_SIZE);
-		this.finished = false;
-	}
-
-	private void consume(StringBuilder consumer) {
-		this.outputBuffer.flip();
-		consumer.append(this.outputBuffer);
-		this.outputBuffer.clear();
-	}
-
-	private void internalDecode(StringBuilder consumer, byte[] buffer, int offset, int length) {
-		assert (offset >= 0);
-		assert (length >= 0);
-		int position = offset;
-		int end = offset + length;
-		assert (end <= buffer.length);
-		boolean finishedReading = false;
-		do {
-			CoderResult result = this.decoder.decode(this.inputBuffer, this.outputBuffer, false);
-			if (result.isOverflow()) {
-				this.consume(consumer);
-			} else if (result.isUnderflow()) {
-				this.inputBuffer.compact();
-				int remaining = this.inputBuffer.remaining();
-				assert (remaining > 0);
-				int read = Math.min(remaining, end - position);
-				if (read > 0) {
-					this.inputBuffer.put(buffer, position, read);
-					position += read;
-				} else {
-					finishedReading = true;
-				}
-				this.inputBuffer.flip();
-			} else {
-				assert false;
-			}
-		} while (!finishedReading);
+		super(charset);
 	}
-
-	public void decode(StringBuilder consumer, byte[] buffer, int offset, int length) {
-		this.internalDecode(consumer, buffer, offset, length);
-		this.consume(consumer);
-	}
-
-	public void finish(StringBuilder consumer) {
-		if (this.finished) {
-			return;
-		}
-		this.finished = true;
-		CoderResult result;
-		result = this.decoder.decode(this.inputBuffer, this.outputBuffer, true);
-		assert (result.isOverflow() || result.isUnderflow());
-		do {
-			result = this.decoder.flush(this.outputBuffer);
-			if (result.isOverflow()) {
-				this.consume(consumer);
-			} else {
-				assert result.isUnderflow();
-			}
-		} while (!result.isUnderflow());
-		this.consume(consumer);
-	}
-
 }
diff --git a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java
index 6f792797d346028c7e676155fd3a267756fedf44..ab548bafd9ec2cb3b87b7d91b3e1de42c044312a 100644
--- a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java	
+++ b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java	
@@ -177,7 +177,7 @@ public class TreeAndListGroup implements ISelectionChangedListener {
 		listViewer.setContentProvider(listContentProvider);
 		listViewer.setLabelProvider(listLabelProvider);
 		listViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
-		listViewer.addSelectionChangedListener(event -> notifySelectionListeners(event));
+		listViewer.addSelectionChangedListener(this::notifySelectionListeners);
 		listViewer.addDoubleClickListener(event -> {
 			if (!event.getSelection().isEmpty()) {
 				notifyDoubleClickListeners(event);
diff --git a/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF b/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF
index ffd4660ea3c6bc269001667080511c5a880f0578..1895d0ba40aadf21fbbf73563a9fa253a0c41b2f 100644
--- a/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.ui.externaltools; singleton:=true
-Bundle-Version: 3.4.700.qualifier
+Bundle-Version: 3.4.800.qualifier
 Bundle-Activator: org.eclipse.ui.externaltools.internal.model.ExternalToolsPlugin
 Bundle-Vendor: %Plugin.providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.ui.externaltools/pom.xml b/org.eclipse.ui.externaltools/pom.xml
index 3b4d2e5be7d27c542afa7810835f6869c05e991b..dbdbf3c0a4fb1be608b6107579dc5392eed7c028 100644
--- a/org.eclipse.ui.externaltools/pom.xml
+++ b/org.eclipse.ui.externaltools/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.platform.debug</artifactId>
     <groupId>eclipse.platform.debug</groupId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.ui</groupId>
   <artifactId>org.eclipse.ui.externaltools</artifactId>
-  <version>3.4.700-SNAPSHOT</version>
+  <version>3.4.800-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/pom.xml b/pom.xml
index ac442f04078d54fb2b7e82703d9224269a4770cb..1ccfd0d076edfcd7d0bbe314582e502e692f9a1f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse</groupId>
     <artifactId>eclipse-platform-parent</artifactId>
-    <version>4.16.0-SNAPSHOT</version>
+    <version>4.17.0-SNAPSHOT</version>
     <relativePath>../eclipse-platform-parent</relativePath>
   </parent>