diff --git a/org.eclipse.jdt.debug.jdi.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jdt.debug.jdi.tests/.settings/org.eclipse.jdt.ui.prefs
index 69f7753..c9192ac 100644
--- a/org.eclipse.jdt.debug.jdi.tests/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.jdt.debug.jdi.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -68,10 +68,12 @@
 sp_cleanup.always_use_parentheses_in_expressions=false
 sp_cleanup.always_use_this_for_non_static_field_access=false
 sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
 sp_cleanup.convert_to_enhanced_for_loop=false
 sp_cleanup.correct_indentation=false
 sp_cleanup.format_source_code=true
 sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.insert_inferred_type_arguments=false
 sp_cleanup.make_local_variable_final=false
 sp_cleanup.make_parameters_final=false
 sp_cleanup.make_private_fields_final=true
@@ -87,7 +89,8 @@
 sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
@@ -100,8 +103,10 @@
 sp_cleanup.remove_unused_private_types=true
 sp_cleanup.sort_members=false
 sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
 sp_cleanup.use_blocks=true
 sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
 sp_cleanup.use_parentheses_in_expressions=false
 sp_cleanup.use_this_for_non_static_field_access=false
 sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractJDITest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractJDITest.java
index ba97d95..e60580b 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractJDITest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractJDITest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -61,7 +61,7 @@
 
 /**
  * Tests for com.sun.jdi.* and JDWP commands.
- * These tests assume that the target program is 
+ * These tests assume that the target program is
  * "org.eclipse.debug.jdi.tests.program.MainClass".
  *
  * Examples of arguments:
@@ -116,7 +116,7 @@
 	}
 	/**
 	 * Creates and returns an access watchpoint request
-	 * for the field "fBool" in 
+	 * for the field "fBool" in
 	 * org.eclipse.debug.jdi.tests.program.MainClass
 	 * NOTE: This assumes that the VM can watch field access.
 	 */
@@ -148,7 +148,7 @@
 		}
 		return result;
 	}
-	
+
 	/**
 	 * Returns if the current VM version is greater than or equal to 1.6
 	 * @return <code>true</code> if a 1.6 or higher VM
@@ -158,7 +158,7 @@
 		String ver = fVM.version();
 		return ver.indexOf("1.6") > -1 || ver.indexOf("1.7") > -1;
 	}
-	
+
 	/**
 	 * Returns an array reference.
 	 */
@@ -169,7 +169,7 @@
 		// Get value of "fArray"
 		return (ArrayReference) getMainClass().getValue(field);
 	}
-	
+
 	/**
 	 * Returns another array reference.
 	 */
@@ -180,7 +180,7 @@
 		// Get value of "fDoubleArray"
 		return (ArrayReference) getMainClass().getValue(field);
 	}
-	
+
 	/**
 	 * One-dimensional empty array reference getters
 	 */
@@ -251,7 +251,7 @@
 		Field field = getField("booleanDoubleArray");
 		return (ArrayReference) getMainClass().getValue(field);
 	}
-	
+
 	/**
 	 * Returns the array type.
 	 */
@@ -332,16 +332,16 @@
 		ArrayReference value = getBooleanDoubleArrayReference();
 		return (ArrayType) value.referenceType();
 	}
-	
+
 	/**
-	 * Creates and returns a breakpoint request in the first 
+	 * Creates and returns a breakpoint request in the first
 	 * instruction of the MainClass.triggerBreakpointEvent() method.
 	 */
 	protected BreakpointRequest getBreakpointRequest() {
 		// Create a breakpoint request
 		return fVM.eventRequestManager().createBreakpointRequest(getLocation());
 	}
-	
+
 	/**
 	 * Creates a new breakpoint request for a user specified position
 	 * @param loc the location to set the breakpoint on
@@ -358,7 +358,7 @@
 		List<?> classes = fVM.classesByName(name);
 		if (classes.size() == 0)
 			return null;
-		
+
 		return (ClassType) classes.get(0);
 	}
 	/**
@@ -379,29 +379,29 @@
 		return fVM.eventRequestManager().createExceptionRequest(null, false, true);
 	}
 	/**
-	 * Returns the static field "fObject" in 
+	 * Returns the static field "fObject" in
 	 * org.eclipse.debug.jdi.tests.program.MainClass
 	 */
 	protected Field getField() {
 		return getField("fObject");
 	}
 	/**
-	 * Returns the field with the given name in 
+	 * Returns the field with the given name in
 	 * org.eclipse.debug.jdi.tests.program.MainClass.
 	 */
 	protected Field getField(String fieldName) {
 		// Get main class
 		ClassType type = getMainClass();
 
-		// Get field 
+		// Get field
 		Field result = type.fieldByName(fieldName);
 		if (result == null)
 			throw new Error("Unknown field: " + fieldName);
-		
+
 		return result;
 	}
 	/**
-	 * Returns the n frame (starting at the top of the stack) of the thread 
+	 * Returns the n frame (starting at the top of the stack) of the thread
 	 * contained in the static field "fThread" of org.eclipse.debug.jdi.tests.program.MainClass.
 	 */
 	protected StackFrame getFrame(int n) {
@@ -450,7 +450,7 @@
 		return getClass( getMainClassName() );
 	}
 	/**
-	 * Returns the method "print(Ljava/io/OutputStream;)V" 
+	 * Returns the method "print(Ljava/io/OutputStream;)V"
 	 * in org.eclipse.debug.jdi.tests.program.MainClass
 	 */
 	protected Method getMethod() {
@@ -487,7 +487,7 @@
 		}
 		if (method == null)
 			throw new Error("Unknown method: " + name + signature);
-		
+
 		return method;
 	}
 	/**
@@ -504,7 +504,7 @@
 		return fVM.eventRequestManager().createModificationWatchpointRequest(field);
 	}
 	/**
-	 * Returns the value of the static field "fObject" in 
+	 * Returns the value of the static field "fObject" in
 	 * org.eclipse.debug.jdi.tests.program.MainClass
 	 */
 	protected ObjectReference getObjectReference() {
@@ -519,7 +519,7 @@
 	}
 	/**
 	 * Creates and returns an access watchpoint request
-	 * for the static field "fString" in 
+	 * for the static field "fString" in
 	 * org.eclipse.debug.jdi.tests.program.MainClass
 	 * NOTE: This assumes that the VM can watch field access.
 	 */
@@ -544,7 +544,7 @@
 		return fVM.eventRequestManager().createModificationWatchpointRequest(field);
 	}
 	/**
-	 * Returns the value of the static field "fString" in 
+	 * Returns the value of the static field "fString" in
 	 * org.eclipse.debug.jdi.tests.program.MainClass
 	 */
 	protected StringReference getStringReference() {
@@ -561,11 +561,11 @@
 		List<ReferenceType> classes = fVM.classesByName("java.lang.Object");
 		if (classes.size() == 0)
 			return null;
-		
+
 		return (ClassType) classes.get(0);
 	}
 	/**
-	 * Returns the thread contained in the static field "fThread" in 
+	 * Returns the thread contained in the static field "fThread" in
 	 * org.eclipse.debug.jdi.tests.program.MainClass
 	 */
 	protected ThreadReference getThread() {
@@ -595,7 +595,7 @@
 		Value value = type.getValue(field);
 		if (value == null)
 			return null;
-		
+
 		return (ThreadReference) value;
 	}
 	/**
@@ -669,7 +669,7 @@
 	/**
 	 * Parse the command {@link String} to make sure we use
 	 * {@link Runtime#exec(String[])}.
-	 * 
+	 *
 	 * @param command
 	 * @return the array of items from the command {@link String}
 	 * @since 4.3
@@ -686,7 +686,7 @@
 		}
 		return commandArray;
 	}
-	
+
 	/**
 	 * Launches the target J9 VM.
 	 */
@@ -700,7 +700,7 @@
 					+ System.getProperty("file.separator")
 					+ "bin"
 					+ System.getProperty("file.separator");
-			
+
 			proxyString[index++] = binDirectory + "j9proxy";
 			proxyString[index++] = "localhost:" + (fBackEndPort - 1);
 			proxyString[index++] = "" + fBackEndPort;
@@ -708,14 +708,14 @@
 
 			// Launch target VM
 			Vector<String> commandLine = new Vector<>();
-			
+
 			String launcher = binDirectory + "j9w.exe";
 			File vm= new File(launcher);
 			if (!vm.exists()) {
 				launcher = binDirectory + "j9";
 			}
 			commandLine.add(launcher);
-			
+
 			if (fBootPath.length() > 0)
 				commandLine.add("-bp:" + fBootPath);
 			commandLine.add("-cp:" + fClassPath);
@@ -792,7 +792,7 @@
 				commandLine.add("-bootpath");
 				commandLine.add(fBootPath);
 			}
-			
+
 			commandLine.add("-classpath");
 			commandLine.add(fClassPath);
 			commandLine.add("-Xdebug");
@@ -812,7 +812,7 @@
 	protected String getMainClassName() {
 		return "org.eclipse.debug.jdi.tests.program.MainClass";
 	}
-	
+
 	protected String getTestPrefix() {
 		return "testJDI";
 	}
@@ -827,10 +827,10 @@
 			String[] args = fVmArgs.split(",");
 			for (int i=0; i < args.length; i++) {
 				commandLine.add(args[i]);
-			}				
-		}		
+			}
+		}
 	}
-	
+
 	/**
 	 * Flattens the variable size command line and calls Runtime.exec().
 	 * @param commandLine A vector of command line argument strings.
@@ -839,18 +839,18 @@
 	 */
 	private Process exec(Vector<String> commandLine) throws IOException {
 		String[] vmString = new String[commandLine.size()];
-		commandLine.toArray(vmString);			
-		return Runtime.getRuntime().exec(vmString);		
+		commandLine.toArray(vmString);
+		return Runtime.getRuntime().exec(vmString);
 	}
 
-	
+
 	/**
 	 * Connects to the target vm.
 	 */
 	protected void connectToVM() {
 		// Start the console reader if possible so that the VM doesn't block when the stdout is full
 		startConsoleReaders();
-		
+
 
 		// Contact the VM (try 10 times)
 		for (int i = 0; i < 10; i++) {
@@ -1271,7 +1271,7 @@
 		waitUntilReady();
 	}
 	/**
-	 * Returns all tests 
+	 * Returns all tests
 	 */
 	protected Test suite() {
 		JDITestSuite suite = new JDITestSuite(this);
@@ -1328,7 +1328,7 @@
 		if (event == null)
 			throw new Error(
 				"Event for " + request + " didn't come in after " + TIMEOUT + "ms");
-		
+
 		return event;
 	}
 	/**
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractReader.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractReader.java
index ac1d57b..5db32dd 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractReader.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AbstractReader.java
Binary files differ
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AccessibleTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AccessibleTest.java
index bf7fb87..ac2a262 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AccessibleTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AccessibleTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -48,7 +48,7 @@
 	public static void main(java.lang.String[] args) {
 		new AccessibleTest().runSuite(args);
 	}
-	
+
 	/**
 	 * @see junit.framework.TestCase#getName()
 	 */
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayReferenceTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayReferenceTest.java
index 8f7cdb3..f8fb11a 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayReferenceTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayReferenceTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayTypeTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayTypeTest.java
index 76d2e4c..2e879cb 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayTypeTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ArrayTypeTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AutomatedSuite.java
index e5b9063..6d8f7cb 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AutomatedSuite.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/AutomatedSuite.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  */
 public class AutomatedSuite extends TestSuite {
-	
+
 	/**
 	 * returns an instance of AutomatedSuite
 	 * @return a new test suite
@@ -23,7 +23,7 @@
 	public static TestSuite suite() {
 		return new AutomatedSuite();
 	}
-	
+
 	/**
 	 * runs the specified tests
 	 */
@@ -62,7 +62,7 @@
 		addTest(new TestSuite(MirrorTest.class));
 
 		addTest(new TestSuite(ModificationWatchpointEventTest.class));
-			
+
 		addTest(new TestSuite(ObjectReferenceTest.class));
 		addTest(new TestSuite(PrimitiveValueTest.class));
 		addTest(new TestSuite(ReferenceTypeTest.class));
@@ -84,7 +84,7 @@
 		addTest(new TestSuite(VirtualMachineExitTest.class));
 		addTest(new TestSuite(VMDisconnectEventTest.class));
 		addTest(new TestSuite(VMDisposeTest.class));
-		
+
 	//Java 1.6 capability tests
 		addTest(new TestSuite(HeapWalkingTests.class));
 		addTest(new TestSuite(ConstantPoolTests.class));
@@ -95,5 +95,5 @@
 		addTest(new TestSuite(ProvideArgumentsTests.class));
 		addTest(new TestSuite(ContendedMonitorTests.class));
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BooleanValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BooleanValueTest.java
index ace7d1b..1c36cc2 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BooleanValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BooleanValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BreakpointRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BreakpointRequestTest.java
index 797a8b3..7afbe58 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BreakpointRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/BreakpointRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ByteValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ByteValueTest.java
index 9eccfab..5aa051e 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ByteValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ByteValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/CharValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/CharValueTest.java
index 5811025..0294525 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/CharValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/CharValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassLoaderReferenceTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassLoaderReferenceTest.java
index e2481b1..11268af 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassLoaderReferenceTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassLoaderReferenceTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventTest.java
index b730950..e42c711 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventWaiter.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventWaiter.java
index 4f53e6f..4ea5070 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventWaiter.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareEventWaiter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,7 +29,7 @@
 		super(request, shouldGo);
 		fClassName = className;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.jdi.tests.EventWaiter#classPrepare(com.sun.jdi.event.ClassPrepareEvent)
 	 */
@@ -38,7 +38,7 @@
 		if (event.referenceType().name().equals(fClassName)) {
 			notifyEvent(event);
 			return fShouldGo;
-		} 
+		}
 		return true;
 	}
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareRequestTest.java
index 5df0f3f..2af5805 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassPrepareRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassTypeTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassTypeTest.java
index 3888300..3ed6ec3 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassTypeTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassTypeTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassesByNameTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassesByNameTest.java
index 610d744..c1bd7be 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassesByNameTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ClassesByNameTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -68,9 +68,9 @@
 			classes.size() == 1
 				&& ((Type) classes.get(0)).signature().equals("[[I"));
 	}
-	
+
 	/**
-	 * tests signature for an array of long values 
+	 * tests signature for an array of long values
 	 */
 	public void testJDILongArray() {
 		List<?> classes = fVM.classesByName("long[]");
@@ -79,7 +79,7 @@
 			classes.size() == 1
 				&& ((Type) classes.get(0)).signature().equals("[J"));
 	}
-	
+
 	/**
 	 * tests signature of a two dimensional array of long values
 	 */
@@ -90,7 +90,7 @@
 			classes.size() == 1
 				&& ((Type) classes.get(0)).signature().equals("[[J"));
 	}
-	
+
 	/**
 	 * Test that there is a class object for 'java.lang.String[]'
 	 */
@@ -102,7 +102,7 @@
 				&& ((Type) classes.get(0)).signature().equals(
 					"[Ljava/lang/String;"));
 	}
-	
+
 	/**
 	 * Test that there is a class object for 'java.lang.String'
 	 */
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ConstantPoolTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ConstantPoolTests.java
index b301dc6..17bfa72 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ConstantPoolTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ConstantPoolTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,21 +14,21 @@
 import com.sun.jdi.ReferenceType;
 
 /**
- * Test cases for the implementation of providing argument information even if 
+ * Test cases for the implementation of providing argument information even if
  * no debugging information is present in the new java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class ConstantPoolTests extends AbstractJDITest {
 
 	ReferenceType fClass;
-	
+
 	/** setup test info locally **/
 	@Override
 	public void localSetUp() {}
-	
+
 	/**
-	 * test to see if we can get class file version info from a 1.6 VM, and 
+	 * test to see if we can get class file version info from a 1.6 VM, and
 	 * that we cannot from a pre-1.6 VM
 	 */
 	public void testCanGetClassFileVersion() {
@@ -39,10 +39,10 @@
 			assertTrue("Should not have classfile version info", !fVM.canGetClassFileVersion());
 		}
 	}
-	
+
 	/**
 	 * test to make sure we can get constant pool information from a 1.6 VM, and
-	 * that we cannot get it from a pre-1.6 VM 
+	 * that we cannot get it from a pre-1.6 VM
 	 */
 	public void testCanGetConstantPool() {
 		if(is16OrGreater()) {
@@ -77,7 +77,7 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to make sure that majorVersion returns 0 for an arrayType.
 	 * this test does not apply to non-16 VMs
@@ -91,10 +91,10 @@
 		int ver = type.majorVersion();
 		assertTrue("major verison should be 0", ver == 0);
 	}
-	
+
 	/**
 	 * test to make sure majorVerison works.
-	 * this test does not apply to non-1.6VMs 
+	 * this test does not apply to non-1.6VMs
 	 */
 	public void testMajorVersion() {
 		if(!fVM.canGetClassFileVersion()) {
@@ -106,9 +106,9 @@
 		int ver = fClass.majorVersion();
 		assertTrue("version cannot be equal to -1", ver != -1);
 	}
-	
+
 	/**
-	 * test to make sure that if minorVersion is unsupported an UnsupportedIOperationException 
+	 * test to make sure that if minorVersion is unsupported an UnsupportedIOperationException
 	 * is thrown
 	 */
 	public void testMinorVersionUnsupported() {
@@ -131,10 +131,10 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to make sure minorVerison works.
-	 * this test does not apply to non-1.6VMs 
+	 * this test does not apply to non-1.6VMs
 	 */
 	public void testMinorVersion() {
 		if(!fVM.canGetClassFileVersion()) {
@@ -146,9 +146,9 @@
 		int ver = fClass.minorVersion();
 		assertTrue("version cannot be equal to -1", ver != -1);
 	}
-	
+
 	/**
-	 * test to make sure that if constantPoolCount is unsupported an UnsupportedIOperationException 
+	 * test to make sure that if constantPoolCount is unsupported an UnsupportedIOperationException
 	 * is thrown
 	 */
 	public void testConstantPoolCountSupported() {
@@ -171,7 +171,7 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to ensure the constant pool count is working correctly
 	 * this test does not apply to non-1.6 VMs
@@ -187,9 +187,9 @@
 		//for now we don't care about constant pool counts, not likely to have a useful debug extension for this feature,
 		//but it is here for completeness
 	}
-	
+
 	/**
-	 * test to make sure that if constantPool is unsupported an UnsupportedIOperationException 
+	 * test to make sure that if constantPool is unsupported an UnsupportedIOperationException
 	 * is thrown
 	 */
 	public void testConstantPoolSupported() {
@@ -212,7 +212,7 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to ensure the constant pool is working correctly
 	 * this test does not apply to non-1.6 VMs
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ContendedMonitorTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ContendedMonitorTests.java
index 8448eba..66e0d80 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ContendedMonitorTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ContendedMonitorTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,15 +19,15 @@
 import com.sun.jdi.request.MonitorWaitedRequest;
 
 /**
- * Test cases for the implementation of providing argument information even if 
+ * Test cases for the implementation of providing argument information even if
  * no debugging information is present in the new java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class ContendedMonitorTests extends AbstractJDITest {
 
 	EventRequestManager erm = null;
-	
+
 	/** setup test info locally **/
 	@Override
 	public void localSetUp() {
@@ -35,7 +35,7 @@
 	}
 
 	/**
-	 * test to see if a the 1.6 VM can get monitor events info and that 
+	 * test to see if a the 1.6 VM can get monitor events info and that
 	 * a non-1.6VM cannot.
 	 */
 	public void testCanRequestMonitorEvents() {
@@ -46,7 +46,7 @@
 			assertTrue("Should not have ability to request monitor events info", !fVM.canRequestMonitorEvents());
 		}
 	}
-	
+
 	/**
 	 * test getting monitor contended enter requests from the event request manager
 	 * this test is not applicable to non 1.6 VMs
@@ -62,7 +62,7 @@
 		assertTrue("list should be of size 1", list.size() == 1);
 		assertTrue("req should be enabled", ((MonitorContendedEnterRequest)list.get(0)).isEnabled());
 	}
-	
+
 	/**
 	 * test getting monitor contended entered requests from the event request manager
 	 * this test is not applicable to non 1.6 VMs
@@ -78,7 +78,7 @@
 		assertTrue("list should be of size 1", list.size() == 1);
 		assertTrue("req should be enabled", ((MonitorContendedEnteredRequest)list.get(0)).isEnabled());
 	}
-	
+
 	/**
 	 * test getting monitor wait requests from the event request manager
 	 * this test is not applicable to non 1.6 VMs
@@ -86,7 +86,7 @@
 	public void testMonitorWaitRequest() {
 		if(!fVM.canRequestMonitorEvents()) {
 			return;
-		}	
+		}
 		MonitorWaitRequest req = erm.createMonitorWaitRequest();
 		req.enable();
 		List<?> list = erm.monitorWaitRequests();
@@ -94,7 +94,7 @@
 		assertTrue("list should be of size 1", list.size() == 1);
 		assertTrue("req should be enabled", ((MonitorWaitRequest)list.get(0)).isEnabled());
 	}
-	
+
 	/**
 	 * test getting monitor waited requests from the event request manager
 	 * this test is not applicable to non 1.6 VMs
@@ -110,5 +110,5 @@
 		assertTrue("list should be of size 1", list.size() == 1);
 		assertTrue("req should be enabled", ((MonitorWaitedRequest)list.get(0)).isEnabled());
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/DoubleValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/DoubleValueTest.java
index 2ce0262..48eb16e 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/DoubleValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/DoubleValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventListener.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventListener.java
index 794ec62..f500430 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventListener.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventReader.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventReader.java
index 07bf849..358e641 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventReader.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventReader.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestManagerTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestManagerTest.java
index 79591e2..f13c2db 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestManagerTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestManagerTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -69,12 +69,12 @@
 	public void testJDIAccessWatchpointRequest() {
 		if (!fVM.canWatchFieldAccess())
 			return;
-		
+
 		// Create an access watchpoint request
 		Field field = getField();
 		AccessWatchpointRequest request = fManager.createAccessWatchpointRequest(field);
 		assertEquals("1", field, request.field());
-	
+
 		// Get all access watchpoint requests
 		List<?> requests = fManager.accessWatchpointRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -82,13 +82,13 @@
 		while (iterator.hasNext()) {
 			assertTrue("2."+i++, iterator.next() instanceof AccessWatchpointRequest);
 		}
-		
+
 		// Delete an access watchpoint request
 		fManager.deleteEventRequest(request);
 		assertEquals("3", 0, fManager.accessWatchpointRequests().size());
 	}
 	/**
-	 * Test JDI createBreakpointRequest(Location), breakpointRequests(), 
+	 * Test JDI createBreakpointRequest(Location), breakpointRequests(),
 	 * deleteEventRequest(EventRequest) and deleteAllBreakpoints()
 	 */
 	public void testJDIBreakpointRequest() {
@@ -104,11 +104,11 @@
 			Object breakpoint = iterator.next();
 			assertTrue("3", breakpoint instanceof BreakpointRequest);
 		}
-		
+
 		// Delete a breakpoint
 		fManager.deleteEventRequest(bp);
 		assertEquals("4", 0, fManager.breakpointRequests().size());
-	
+
 		// Delete all breakpoints
 		fManager.createBreakpointRequest(location);
 		fManager.deleteAllBreakpoints();
@@ -121,7 +121,7 @@
 	public void testJDIClassPrepareRequest() {
 		// Create a class prepare request
 		ClassPrepareRequest request= fManager.createClassPrepareRequest();
-	
+
 		// Get all class prepare requests
 		List<?> requests = fManager.classPrepareRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -129,7 +129,7 @@
 		while (iterator.hasNext()) {
 			assertTrue("1."+i++, iterator.next() instanceof ClassPrepareRequest);
 		}
-		
+
 		// Delete a class prepare request
 		fManager.deleteEventRequest(request);
 		assertEquals("2", 0, fManager.classPrepareRequests().size());
@@ -141,7 +141,7 @@
 	public void testJDIClassUnloadRequest() {
 		// Create a class unload request
 		ClassUnloadRequest request= fManager.createClassUnloadRequest();
-	
+
 		// Get all class unload requests
 		List<?> requests = fManager.classUnloadRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -149,7 +149,7 @@
 		while (iterator.hasNext()) {
 			assertTrue("1."+i++, iterator.next() instanceof ClassUnloadRequest);
 		}
-		
+
 		// Delete a class unload request
 		fManager.deleteEventRequest(request);
 		assertEquals("2", 0, fManager.classUnloadRequests().size());
@@ -161,7 +161,7 @@
 	public void testJDIExceptionRequest() {
 		// Create a exception request
 		ExceptionRequest request= fManager.createExceptionRequest(null, true, true);
-	
+
 		// Get all exception requests
 		List<?> requests = fManager.exceptionRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -169,24 +169,24 @@
 		while (iterator.hasNext()) {
 			assertTrue("1."+i++, iterator.next() instanceof ExceptionRequest);
 		}
-		
+
 		// Delete a exception request
 		fManager.deleteEventRequest(request);
 		assertEquals("2", i-1, fManager.exceptionRequests().size());
 	}
 	/**
-	 * Test JDI createModificationWatchpointRequest(Field), 
+	 * Test JDI createModificationWatchpointRequest(Field),
 	 * accessWatchpointRequests() and deleteEventRequest(EventRequest)
 	 */
 	public void testJDIModificationWatchpointRequest() {
 		if (!fVM.canWatchFieldAccess())
 			return;
-	
+
 		// Create a modification watchpoint
 		Field field = getField();
 		ModificationWatchpointRequest request = fManager.createModificationWatchpointRequest(field);
 		assertEquals("1", field, request.field());
-	
+
 		// Get all modification watchpoints
 		List<?> requests = fManager.modificationWatchpointRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -194,7 +194,7 @@
 		while (iterator.hasNext()) {
 			assertTrue("2."+i++, iterator.next() instanceof ModificationWatchpointRequest);
 		}
-		
+
 		// Delete a modification watchpoint
 		fManager.deleteEventRequest(request);
 		assertEquals("3", 0, fManager.modificationWatchpointRequests().size());
@@ -206,7 +206,7 @@
 	public void testJDIStepRequest() {
 		// Create a step request
 		StepRequest request= fManager.createStepRequest(getThread(), StepRequest.STEP_LINE, StepRequest.STEP_OVER);
-	
+
 		// Get all step requests
 		List<?> requests = fManager.stepRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -214,7 +214,7 @@
 		while (iterator.hasNext()) {
 			assertTrue("1."+i++, iterator.next() instanceof StepRequest);
 		}
-		
+
 		// Delete a step request
 		fManager.deleteEventRequest(request);
 		assertEquals("2", 0, fManager.stepRequests().size());
@@ -226,7 +226,7 @@
 	public void testJDIThreadDeathRequest() {
 		// Create a ThreadDeath request
 		ThreadDeathRequest request= fManager.createThreadDeathRequest();
-	
+
 		// Get all ThreadDeath requests
 		List<?> requests = fManager.threadDeathRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -234,7 +234,7 @@
 		while (iterator.hasNext()) {
 			assertTrue("1."+i++, iterator.next() instanceof ThreadDeathRequest);
 		}
-		
+
 		// Delete a ThreadDeath request
 		fManager.deleteEventRequest(request);
 		assertEquals("2", 0, fManager.threadDeathRequests().size());
@@ -246,7 +246,7 @@
 	public void testJDIThreadStartRequest() {
 		// Create a ThreadStart request
 		ThreadStartRequest request= fManager.createThreadStartRequest();
-	
+
 		// Get all ThreadStart requests
 		List<?> requests = fManager.classUnloadRequests();
 		ListIterator<?> iterator = requests.listIterator();
@@ -254,7 +254,7 @@
 		while (iterator.hasNext()) {
 			assertTrue("1."+i++, iterator.next() instanceof ThreadStartRequest);
 		}
-		
+
 		// Delete a ThreadStart request
 		fManager.deleteEventRequest(request);
 		assertEquals("2", 0, fManager.classUnloadRequests().size());
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestTest.java
index 4c82654..354d10f 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventTest.java
index 6b3812c..7024db2 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventWaiter.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventWaiter.java
index a07ae86..6c37ef2 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventWaiter.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/EventWaiter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -101,7 +101,7 @@
 		if ((event.request() != null) && (event.request().equals(fRequest))) {
 			notifyEvent(event);
 			return fShouldGo;
-		} 
+		}
 		return true;
 	}
 	/**
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionEventTest.java
index 71118d2..7af03b8 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionRequestTest.java
index 3db8fc0..841cefd 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ExceptionRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FieldTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FieldTest.java
index d8b1987..7557c26 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FieldTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FieldTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FileConsoleReader.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FileConsoleReader.java
index 86ae903..b7562c0 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FileConsoleReader.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FileConsoleReader.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FloatValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FloatValueTest.java
index c2cf25b..c14fb84 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FloatValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/FloatValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ForceEarlyReturnTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ForceEarlyReturnTests.java
index 4880ca8..e96609c 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ForceEarlyReturnTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ForceEarlyReturnTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/package org.eclipse.debug.jdi.tests;
@@ -23,13 +23,13 @@
 import com.sun.jdi.request.EventRequest;
 
  /**
-  * Test cases for the implementation of providing argument information even if 
+  * Test cases for the implementation of providing argument information even if
   * no debugging information is present in the new java 1.6 VM
-  * 
+  *
   * @since 3.3
   */
 public class ForceEarlyReturnTests extends AbstractJDITest {
-	
+
 	/** setup test info locally **/
 	@Override
 	public void localSetUp() {}
@@ -45,7 +45,7 @@
 			assertFalse("Should not have force early return capabilities", fVM.canForceEarlyReturn());
 		}
 	}
-	
+
 	/**
 	 * test for the specifying the return type for a forced return to make sure the new return value works
 	 */
@@ -98,5 +98,5 @@
 			e.printStackTrace();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HeapWalkingTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HeapWalkingTests.java
index 70a7f06..aac353b 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HeapWalkingTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HeapWalkingTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,18 +18,18 @@
 
 /**
  * Test cases for the implementation of heap walking in the new java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class HeapWalkingTests extends AbstractJDITest {
 
 	private ReferenceType fClass, fClass1;
 	private ObjectReference fObject;
-	
+
 	/**	 setup our tests */
 	@Override
 	public void localSetUp() {}
-	
+
 	/** tear down our tests */
 	@Override
 	public void localTearDown() {
@@ -50,7 +50,7 @@
 			assertTrue("Should not have instance info", !fVM.canGetInstanceInfo());
 		}
 	}
-	
+
 	/**
 	 * tests the new method instanceCounts, to make sure it throws an NPE when required.
 	 * test is not applicable to non 1.6 VMs
@@ -65,7 +65,7 @@
 		}
 		catch (NullPointerException npe) {}
 	}
-	
+
 	/**
 	 * tests to make sure the instanceCounts method throws a not supported
 	 */
@@ -86,7 +86,7 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to collect any referring instances can be collected for the specified class.
 	 * test is not applicable to non 1.6 VMs.
@@ -109,7 +109,7 @@
 		assertTrue("count for RefClass1 should be 2", counts[0] == 2);
 		assertTrue("count for RefClass2 should be 1", counts[1] == 1);
 	}
-	
+
 	/**
 	 * test to make sure instances throws an unsupported exception for non 1.6 VMs
 	 */
@@ -132,7 +132,7 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to make sure instances throws and IllegalArgument exception for negative long arguments.
 	 * test is not applicable to non 1.6 VMs
@@ -149,10 +149,10 @@
 		}
 		catch (IllegalArgumentException iae) {}
 	}
-	
+
 	/**
 	 * test to collect a list of instances.
-	 * test is not applicable to non 1.6 VMs. 
+	 * test is not applicable to non 1.6 VMs.
 	 */
 	public void testGetInstances() {
 		if(!fVM.canGetInstanceInfo()) {
@@ -168,7 +168,7 @@
 		assertNotNull("list should not be null", list);
 		assertTrue("list should have two enrtries", list.size() == 2);
 	}
-	
+
 	/**
 	 * test to make sure referringObjects throws an unsupported exception for non-1.6 VMs
 	 */
@@ -193,7 +193,7 @@
 			catch(UnsupportedOperationException uoe) {}
 		}
 	}
-	
+
 	/**
 	 * test to make sure referringObjects throws an IllegalArgument exception for bad values of max
 	 */
@@ -213,7 +213,7 @@
 			assertTrue("Threw exception", true);
 		}
 	}
-	
+
 	/**
 	 * tests the method referring objects to ensure working to spec.
 	 * test is not applicable to non 1.6 VMs
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HotCodeReplacementTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HotCodeReplacementTest.java
index 76fdfad..50b239d 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HotCodeReplacementTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/HotCodeReplacementTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -79,7 +79,7 @@
 		}
 		assertEquals("dropTopFrame.6", stackSize - 1, newStackSize);
 	}
-	
+
 	/**
 	 * Init the fields that are used by this test only.
 	 */
@@ -223,7 +223,7 @@
 		org.eclipse.jdi.hcr.VirtualMachine vm =
 			(org.eclipse.jdi.hcr.VirtualMachine) fVM;
 
-		
+
 		// Drop the top a frame
 		try {
 			if (vm.canDoReturn()) {
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/IntegerValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/IntegerValueTest.java
index fa7a617..3a249f0 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/IntegerValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/IntegerValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/InterfaceTypeTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/InterfaceTypeTest.java
index 4c3f37f..a5f062e 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/InterfaceTypeTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/InterfaceTypeTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestCase.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestCase.java
index 3dd5445..ff0cb10 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestCase.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestCase.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestSuite.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestSuite.java
index 13332de..6314d3f 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestSuite.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/JDITestSuite.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocalVariableTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocalVariableTest.java
index 3f8c834..45f29e6 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocalVariableTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocalVariableTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocatableTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocatableTest.java
index c33353b..f47891b 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocatableTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocatableTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocationTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocationTest.java
index 3c1b2b7..7f6befd 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocationTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LocationTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LongValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LongValueTest.java
index d6aad8e..4194ca4 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LongValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/LongValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodEntryRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodEntryRequestTest.java
index 8bb7e7c..0a52b2a 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodEntryRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodEntryRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -64,7 +64,7 @@
 	}
 
 	/**
-	 * Tests a request without any filtering 
+	 * Tests a request without any filtering
 	 */
 	public void testJDIWithoutFilter() {
 		MethodEntryRequest request = getMethodEntryRequest();
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodExitRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodExitRequestTest.java
index 8dbb691..4c39397 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodExitRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodExitRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -62,7 +62,7 @@
 		return fVM.eventRequestManager().createMethodExitRequest();
 	}
 	/**
-	 * Tests a method exit request without filtering 
+	 * Tests a method exit request without filtering
 	 */
 	public void testJDIWithoutFilter() {
 		MethodExitRequest request = getMethodExitRequest();
@@ -76,7 +76,7 @@
 	}
 
 	/**
-	 * Tests a method exit request with an exclusion filter  
+	 * Tests a method exit request with an exclusion filter
 	 */
 	public void testJDIWithClassExclusionFilter() {
 		MethodExitRequest request = getMethodExitRequest();
@@ -93,7 +93,7 @@
 	}
 
 	/**
-	 * Tests a method exit request with a specific class filter 
+	 * Tests a method exit request with a specific class filter
 	 */
 	public void testJDIWithClassFilter1() {
 		MethodExitRequest request = getMethodExitRequest();
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodReturnValuesTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodReturnValuesTests.java
index 21a5b15..cfa7bcb 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodReturnValuesTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodReturnValuesTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,11 +24,11 @@
 
 /**
  * Test cases for method exit event return values in java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class MethodReturnValuesTests extends AbstractJDITest {
-	
+
 	MethodExitRequest req = null;
 	Value val = null;
 	MethodExitEvent event = null;
@@ -38,14 +38,14 @@
 	EventWaiter waiter = null;
 	BreakpointEvent bpe = null;
 	ThreadReference tref = null;
-	
-	
+
+
 	/** setup test info locally **/
 	@Override
 	public void localSetUp() {
 		erm = fVM.eventRequestManager();
 	}
-	
+
 	/** cleans up local tests **/
 	@Override
 	public void localTearDown() {
@@ -54,9 +54,9 @@
 			erm.deleteAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * test to make sure 1.6 VM supports method return values 
+	 * test to make sure 1.6 VM supports method return values
 	 */
 	public void testCanGetMethodReturnValues() {
 		if(is16OrGreater()) {
@@ -66,7 +66,7 @@
 			assertFalse("Should not have method return values capabilities", fVM.canGetMethodReturnValues());
 		}
 	}
-	
+
 	/**
 	 * test getting a void return value.
 	 * not applicable to non 1.6 VMs
@@ -108,7 +108,7 @@
 			assertTrue("thrown exception mean failure", false);
 		}
 	}
-	
+
 	/**
 	 * test to make sure that returnValue is working to spec.
 	 * test is not applicable to non 1.6 VMs
@@ -145,12 +145,12 @@
 				assertTrue("return value must be StringReferenceImpl", val instanceof StringReferenceImpl);
 				erm.deleteEventRequest(req);
 			}
-		} 
+		}
 		catch (InterruptedException e) {
 			assertTrue("thrown exception mean failure", false);
 		}
 	}
-	
+
 	/**
 	 * test to make sure that returnValue is working to spec.
 	 * test is not applicable to non 1.6 VMs
@@ -187,12 +187,12 @@
 				assertEquals("return value must be 20", val.virtualMachine().mirrorOf(20), val);
 				erm.deleteEventRequest(req);
 			}
-		} 
+		}
 		catch (InterruptedException e) {
 			assertTrue("thrown exception mean failure", false);
 		}
-	}	
-	
+	}
+
 	/**
 	 * test to make sure that returnValue is working to spec.
 	 * test is not applicable to non 1.6 VMs
@@ -229,12 +229,12 @@
 				assertEquals("return value must be true", val.virtualMachine().mirrorOf(true), val);
 				erm.deleteEventRequest(req);
 			}
-		} 
+		}
 		catch (InterruptedException e) {
 			assertTrue("thrown exception mean failure", false);
 		}
-	}		
-	
+	}
+
 	/**
 	 * test to make sure that returnValue is working to spec.
 	 * test is not applicable to non 1.6 VMs
@@ -271,9 +271,9 @@
 				assertEquals("return value must be 123", val.virtualMachine().mirrorOf(123L), val);
 				erm.deleteEventRequest(req);
 			}
-		} 
+		}
 		catch (InterruptedException e) {
 			assertTrue("thrown exception mean failure", false);
 		}
-	}			
+	}
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodTest.java
index 963c4ce..828ba43 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MethodTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MirrorTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MirrorTest.java
index f4940e9..456aa5f 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MirrorTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MirrorTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ModificationWatchpointEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ModificationWatchpointEventTest.java
index 72229fa..635cb75 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ModificationWatchpointEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ModificationWatchpointEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MonitorFrameInfoTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MonitorFrameInfoTests.java
index abe5002..a25295a 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MonitorFrameInfoTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/MonitorFrameInfoTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,9 +20,9 @@
 import com.sun.jdi.request.EventRequest;
 
 /**
- * Test cases for the implementation of providing argument information even if 
+ * Test cases for the implementation of providing argument information even if
  * no debugging information is present in the new java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class MonitorFrameInfoTests extends AbstractJDITest {
@@ -32,7 +32,7 @@
 	public void localSetUp() {}
 
 	/**
-	 * test to see if a the 1.6 VM can get monitor frame info and that 
+	 * test to see if a the 1.6 VM can get monitor frame info and that
 	 * a non-1.6VM cannot.
 	 */
 	public void testCanGetMonitorFrameInfo() {
@@ -43,7 +43,7 @@
 			assertTrue("Should not have monitor frame info", !fVM.canGetMonitorFrameInfo());
 		}
 	}
-	
+
 	/**
 	 * test to make sure the proper frames and monitors are collected for the corresponding thread ref.
 	 * this test has no effect in a non-1.6VM
@@ -73,5 +73,5 @@
 			e.printStackTrace();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NotYetImplementedException.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NotYetImplementedException.java
index 0983757..cc399ef 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NotYetImplementedException.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NotYetImplementedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
  */
 public class NotYetImplementedException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
-	
+
 	/**
 	 * NotYetImplemented constructor comment.
 	 */
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NullConsoleReader.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NullConsoleReader.java
index 7f26501..c085bf1 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NullConsoleReader.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/NullConsoleReader.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ObjectReferenceTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ObjectReferenceTest.java
index 6a5d8ae..337e685 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ObjectReferenceTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ObjectReferenceTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -85,7 +85,7 @@
 		return "com.sun.jdi.ObjectReference";
 	}
 	/**
-	 * Returns all tests 
+	 * Returns all tests
 	 */
 	@Override
 	protected Test suite() {
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/PrimitiveValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/PrimitiveValueTest.java
index 2769693..afd1ff3 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/PrimitiveValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/PrimitiveValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ProvideArgumentsTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ProvideArgumentsTests.java
index a0e8cd6..982579b 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ProvideArgumentsTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ProvideArgumentsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,9 +24,9 @@
 import com.sun.jdi.request.EventRequest;
 
 /**
- * Test cases for the implementation of providing argumebnt information even if 
+ * Test cases for the implementation of providing argumebnt information even if
  * no debugging information is present in the new java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class ProvideArgumentsTests extends AbstractJDITest {
@@ -34,10 +34,10 @@
 	/** setup test info locally **/
 	@Override
 	public void localSetUp() {}
-	
+
 	/**
 	 * tests getting argument values from a stackframe when no debugging
-	 * info is available 
+	 * info is available
 	 */
 	public void testGetArgumentValues() {
 		try {
@@ -45,7 +45,7 @@
 			BreakpointRequest br = getBreakpointRequest(method.location());
 			br.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD);
 			br.enable();
-			
+
 			EventWaiter waiter = new EventWaiter(br, true);
 			fEventReader.addEventListener(waiter);
 			triggerEvent("argvalues");
@@ -67,6 +67,6 @@
 		} catch (IncompatibleThreadStateException e) {
 			e.printStackTrace();
 		}
-		
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ReferenceTypeTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ReferenceTypeTest.java
index d6e8694..167c693 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ReferenceTypeTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ReferenceTypeTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -305,7 +305,7 @@
 		}
 	}
 	/**
-	 * Test JDI isAbstract(), isFinal() and isStatic() 
+	 * Test JDI isAbstract(), isFinal() and isStatic()
 	 * and JDWP 'Type - Get modifiers'.
 	 */
 	public void testJDIModifiers() {
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ShortValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ShortValueTest.java
index e2d8ccc..7053dbe 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ShortValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ShortValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/SourceNameFilterTests.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/SourceNameFilterTests.java
index 5f0afde..14743d9 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/SourceNameFilterTests.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/SourceNameFilterTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,9 +15,9 @@
 import com.sun.jdi.request.EventRequestManager;
 
 /**
- * Test cases for the implementation of providing argumebnt information even if 
+ * Test cases for the implementation of providing argumebnt information even if
  * no debugging information is present in the new java 1.6 VM
- * 
+ *
  * @since 3.3
  */
 public class SourceNameFilterTests extends AbstractJDITest {
@@ -25,11 +25,11 @@
 	/** setup test info locally **/
 	@Override
 	public void localSetUp() {}
-	
+
 	/**
-	 * test to see if we can use source name filters from a 1.6 VM, and 
+	 * test to see if we can use source name filters from a 1.6 VM, and
 	 * that we cannot from a pre 1.6 VM
-	 * 
+	 *
 	 */
 	public void testCanUseSourceNameFilters() {
 		if(fVM.version().indexOf("1.6") > -1) {
@@ -40,7 +40,7 @@
 			assertTrue("Should not have source name filter capabilities", !fVM.canUseSourceNameFilters());
 		}
 	}
-	
+
 	/**
 	 * test to make sure the source name filter capability is working to spec.
 	 * this test does not apply to non-1.6 VMs
@@ -57,7 +57,7 @@
 		assertNotNull("event should not be null", event);
 		assertEquals(event.referenceType().name(), "org.eclipse.debug.jdi.tests.program.TestClass1");
 		rm.deleteEventRequest(request);
-		
+
 		//filter is *Test3.java
 		request = rm.createClassPrepareRequest();
 		request.addSourceNameFilter("*TestClass3.java");
@@ -65,7 +65,7 @@
 		assertNotNull("event should not be null", event);
 		assertEquals(event.referenceType().name(), "org.eclipse.debug.jdi.tests.program.TestClass3");
 		rm.deleteEventRequest(request);
-		
+
 		//filter is *TestClazz6.java
 		request = rm.createClassPrepareRequest();
 		request.addSourceNameFilter("*TestClazz6.java");
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StackFrameTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StackFrameTest.java
index c2ab6b5..b947f6a 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StackFrameTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StackFrameTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StepEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StepEventTest.java
index 4876e48..2c727cb 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StepEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StepEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StringReferenceTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StringReferenceTest.java
index 5876905..58fd8ec 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StringReferenceTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/StringReferenceTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TestAll.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TestAll.java
index 5e1c71c..6488c06 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TestAll.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TestAll.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 	 * Returns all the test case classes (a Vector of Class) that are
 	 * relevant for the given VM information.
 	 * NB1: This doesn't include the VirtualMachineTest class.
-	 * NB2: The last element must be the VMDeathEventTest class since 
+	 * NB2: The last element must be the VMDeathEventTest class since
 	 *      it shuts the VM down.
 	 */
 	protected static Vector<Class<?>> getAllTestCases(VMInformation info) {
@@ -58,10 +58,10 @@
 		classes.addElement(MethodEntryRequestTest.class);
 		classes.addElement(MethodExitRequestTest.class);
 		classes.addElement(MirrorTest.class);
-	
+
 		if (info.fVM.canWatchFieldModification())
 			classes.addElement(ModificationWatchpointEventTest.class);
-			
+
 		classes.addElement(ObjectReferenceTest.class);
 		classes.addElement(PrimitiveValueTest.class);
 		classes.addElement(ReferenceTypeTest.class);
@@ -76,12 +76,12 @@
 		classes.addElement(TypeComponentTest.class);
 		classes.addElement(TypeTest.class);
 		classes.addElement(ValueTest.class);
-	
+
 		if (info.fVM.canWatchFieldAccess() && info.fVM.canWatchFieldModification()) {
 			classes.addElement(WatchpointEventTest.class);
 			classes.addElement(WatchpointRequestTest.class);
 		}
-	
+
 		classes.addElement(VirtualMachineExitTest.class);
 		classes.addElement(VMDisconnectEventTest.class);
 		classes.addElement(VMDisposeTest.class);	// note that this test does not restore the state properly.
@@ -96,20 +96,20 @@
 	public static void main(String[] arguments) throws Throwable {
 		// Create test result
 		TextTestResult result= new TextTestResult();
-	
+
 		// Run the VirtualMachineTest
 		AbstractJDITest test= run(result, VirtualMachineTest.class, arguments, null);
-	
+
 		// Was it possible to run the first test?
 		if (test == null)
 			return;
-		
+
 		// Get the VM info
 		VMInformation info = test.getVMInfo();
-	
+
 		// Get all test cases
 		Vector<Class<?>> classes= getAllTestCases(info);
-	
+
 		// Run the other tests
 		Enumeration<Class<?>> enumeration= classes.elements();
 		while (enumeration.hasMoreElements()) {
@@ -117,10 +117,10 @@
 			test= run(result, testClass, arguments, info);
 			info= test.getVMInfo(); // In case the test has changed this info
 		}
-	
-		// Shut down the VM 
+
+		// Shut down the VM
 		test.shutDownTarget();
-	
+
 		// Show the result
 		result.print();
 	}
@@ -150,7 +150,7 @@
 			return null;
 		test.setVMInfo(info);
 		test.setInControl(false);
-	
+
 		// Run test
 		System.out.println("\n" + new java.util.Date());
 		System.out.println("Begin testing " + test.getName() + "...");
@@ -160,7 +160,7 @@
 		long runTime= endTime-startTime;
 		System.out.println("\nTime: "+runTime/1000+"."+runTime%1000);
 		System.out.println("Done testing " + test.getName() + ".");
-		
+
 		return test;
 	}
 }
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TextTestResult.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TextTestResult.java
index 78bf225..11da194 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TextTestResult.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TextTestResult.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadDeathEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadDeathEventTest.java
index c0a8541..aa38dc0 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadDeathEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadDeathEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadGroupReferenceTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadGroupReferenceTest.java
index 1b26ea4..fb490e8 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadGroupReferenceTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadGroupReferenceTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadReferenceTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadReferenceTest.java
index 8e2053b..09edf43 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadReferenceTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadReferenceTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -175,7 +175,7 @@
 				false);
 		ThreadReference thread = event.thread();
 
-		// Create a java.lang.Throwable instance in 
+		// Create a java.lang.Throwable instance in
 		List<ReferenceType> classes = fVM.classesByName("java.lang.Throwable");
 		assertTrue("1", classes.size() != 0);
 		ClassType threadDeathClass = (ClassType) classes.get(0);
@@ -212,7 +212,7 @@
 
 	}
 	/**
-	 * Test JDI suspend() and resume() 
+	 * Test JDI suspend() and resume()
 	 * and JDWP 'Thread - Suspend' and 'Thread - Resume'.
 	 */
 	public void testJDISuspendResume() {
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadStartEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadStartEventTest.java
index fbf79aa..006e3bd 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadStartEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ThreadStartEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeComponentTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeComponentTest.java
index 257e29b..1f4ef79 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeComponentTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeComponentTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeTest.java
index ae4d70f..6a00f52 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/TypeTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
  * Tests for JDI com.sun.jdi.Type.
  */
 public class TypeTest extends AbstractJDITest {
-	private Type 		
+	private Type
 		fArrayType,
 		fClassType,
 		fInterfaceType,
@@ -47,7 +47,7 @@
 		fDoubleDoubleArrayType,
 		fCharDoubleArrayType,
 		fBooleanDoubleArrayType;
-		
+
 	/**
 	 * Creates a new test.
 	 */
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventTest.java
index ba6bebe..4360b9b 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventWaiter.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventWaiter.java
index 77aa749..cf52201 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventWaiter.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisconnectEventWaiter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
  * Listen for VMDisconnectEvent.
  */
 public class VMDisconnectEventWaiter extends EventWaiter {
-	
+
 	/**
 	 * Constructor
 	 * @param request
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisposeTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisposeTest.java
index fc3e528..0ebc157 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisposeTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMDisposeTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMInformation.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMInformation.java
index ae8e313..fde5969 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMInformation.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VMInformation.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 	AbstractReader fConsoleReader;
 	String fVMType;
 
-	/** 
+	/**
 	 * Creates a new VMInformation for the given vm, vm type, launched vm, event reader and console reader.
 	 */
 	VMInformation(VirtualMachine vm, String vmType, Process launchedVM, EventReader eventReader, AbstractReader consoleReader) {
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ValueTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ValueTest.java
index b9d49f9..c22f942 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ValueTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/ValueTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineExitTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineExitTest.java
index f4895b0..cfa20c1 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineExitTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineExitTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineTest.java
index aa30db3..3316884 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/VirtualMachineTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,7 +33,7 @@
 /**
  * Tests for JDI com.sun.jdi.VirtualMachine
  * and JDWP VM command set.
- * 
+ *
  * Example of arguments:
  *   -launcher SunVMLauncher -address c:\jdk1.2.2\ -classpath d:\target
  */
@@ -83,7 +83,7 @@
 		super.startProgram();
 	}
 	/**
-	 * Returns all tests 
+	 * Returns all tests
 	 */
 	@Override
 	protected Test suite() {
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointEventTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointEventTest.java
index 4642556..1c8b70e 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointEventTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointEventTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointRequestTest.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointRequestTest.java
index 9a24bba..088619a 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointRequestTest.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/WatchpointRequestTest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/MainClass.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/MainClass.java
index b5f6e8c..f601178 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/MainClass.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/MainClass.java
@@ -4,12 +4,12 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.debug.jdi.tests.program;
- 
+
 
 import java.io.OutputStream;
 import java.io.PrintWriter;
@@ -19,12 +19,12 @@
 
 /**
  * Main class for target VM tests.
- * This class is intended to be run by the target VM. 
+ * This class is intended to be run by the target VM.
  * It will use other classes in this package, and it will create and terminate
  * threads as a regular program would do.
  *
  * WARNING, WARNING:
- * Tests in org.eclipse.debug.jdi.tests assume the content of this class, 
+ * Tests in org.eclipse.debug.jdi.tests assume the content of this class,
  * as well as its behavior. So if this class or one of the types in this
  * package is changed, the corresponding tests must also be changed.
  */
@@ -117,7 +117,7 @@
 	public MainClass(int i, Object o1, Object o2) {
 	}
 
-	/** 
+	/**
 	 * For invocation tests
 	 * @param x the integer
 	 * @param o
@@ -130,13 +130,13 @@
 			return "";
 		}
 	}
-	/** 
+	/**
 	 * For invocation tests
 	 */
 	private static void invoke2() {
 		throw new IndexOutOfBoundsException();
 	}
-	
+
 	/**
 	 * For invocation tests
 	 * @param str
@@ -159,9 +159,9 @@
 	 * @param l
 	 */
 	private void variablesTest(long l) {}
-	
+
 	/**
-	 * Runs the test program 
+	 * Runs the test program
 	 * @param args
 	 */
 	public static void main(java.lang.String[] args) {
@@ -190,7 +190,7 @@
 		writer.println(string);
 		writer.flush();
 	}
-	
+
 	/**
 	 * Prints out a specified integer. This method is used in the force early return tests to ensure we
 	 * can specify a different, type compatible return value
@@ -206,37 +206,37 @@
 		writer.flush();
 		return num;
 	}
-	
+
 	/**
 	 * Returns 20
-	 * 
+	 *
 	 * @return 20
 	 */
 	public int getInt() {
 		int x = Math.max(20, 10);
 		return x;
 	}
-	
+
 	/**
 	 * Returns true.
-	 * 
+	 *
 	 * @return true
 	 */
 	public boolean getBoolean() {
 		boolean bool = Boolean.valueOf("true").booleanValue();
 		return bool;
 	}
-	
+
 	/**
 	 * Returns 123L.
-	 * 
+	 *
 	 * @return 123
 	 */
 	public long getLong() {
 		long l = Long.valueOf("123").longValue();
 		return l;
 	}
-	
+
 	/**
 	 * dump out a string
 	 * @return a String
@@ -246,7 +246,7 @@
 		System.out.println("foobar");
 		return "man";
 	}
-	
+
 	/**
 	 * make a sync'd method so we can stop in it to gather monitor information
 	 * @since 3.3
@@ -254,7 +254,7 @@
 	synchronized public void sync() {
 		System.out.println("sync'd to the moon");
 	}
-	
+
 	/**
 	 * suspend on the first line of the method to get the argument values from the stackframe.
 	 * used in testing the new 1.6VM capability to get argument values when no debugging info is available.
@@ -266,7 +266,7 @@
 	public void argValues(String str, int num, Object obj) {
 		System.out.println("get the arg values");
 	}
-	
+
 	/**
 	 * Prints to System.out and throws an exception to indicate readiness
 	 */
@@ -278,7 +278,7 @@
 		} catch (NegativeArraySizeException exc) {
 		}
 	}
-	
+
 	/**
 	 * @see java.lang.Runnable#run()
 	 */
@@ -460,7 +460,7 @@
 			System.out.println("Unknown event type: " + eventType);
 		}
 	}
-	
+
 	/**
 	 *	Trigger an exception event for the front-end.
 	 */
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/OtherClass.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/OtherClass.java
index a269800..25afc20 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/OtherClass.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/OtherClass.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/Printable.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/Printable.java
index 5c6c88b..8a341ff 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/Printable.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/Printable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -12,7 +12,7 @@
 
 /**
  * Interface type for target VM tests.
- * This interface is intended to be loaded by the target VM. 
+ * This interface is intended to be loaded by the target VM.
  *
  * WARNING, WARNING:
  * Tests in org.eclipse.debug.jdi.tests assume the content of this interface.
@@ -27,7 +27,7 @@
  */
 public interface Printable extends Cloneable {
 	/**
-	 * the number 1 
+	 * the number 1
 	 */
 	int CONSTANT = 1;
 	/**
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass.java
index 55cd1d4..98a31e7 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass.java
@@ -14,7 +14,7 @@
  * Test class with a static object array
  */
 public class RefClass {
-	
+
 	/**
 	 * Array of two other Ref classes
 	 */
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass2.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass2.java
index 6711704..03d4245 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass2.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/RefClass2.java
@@ -15,7 +15,7 @@
  */
 public class RefClass2 {
 	/**
-	 * A handle to the singleton <code>MainClass</code> 
+	 * A handle to the singleton <code>MainClass</code>
 	 */
 	public Object temp2 = MainClass.fObject;
 
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass.java
index 1f3e06d..b6ebce6 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass1.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass1.java
index 3c73718..8b8a0db 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass1.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass2.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass2.java
index 592fcc0..cbfc3b4 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass2.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass3.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass3.java
index 23aa1f1..8284552 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass3.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass3.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass4.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass4.java
index 2099db6..aae2626 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass4.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass4.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass5.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass5.java
index b4c6d47..17ee641 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass5.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass5.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass6.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass6.java
index f48e2fd..5bba8ca 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass6.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass6.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass7.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass7.java
index 2fbed87..2f8f975 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass7.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClass7.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz10.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz10.java
index 204da91..84a25b1 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz10.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz10.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz8.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz8.java
index 502ee93..0851b10 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz8.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz8.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz9.java b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz9.java
index 175f9e0..1af5d6d 100644
--- a/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz9.java
+++ b/org.eclipse.jdt.debug.jdi.tests/tests/org/eclipse/debug/jdi/tests/program/TestClazz9.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jdt.debug.tests/.settings/org.eclipse.jdt.ui.prefs
index 69f7753..c9192ac 100644
--- a/org.eclipse.jdt.debug.tests/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.jdt.debug.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -68,10 +68,12 @@
 sp_cleanup.always_use_parentheses_in_expressions=false
 sp_cleanup.always_use_this_for_non_static_field_access=false
 sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
 sp_cleanup.convert_to_enhanced_for_loop=false
 sp_cleanup.correct_indentation=false
 sp_cleanup.format_source_code=true
 sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.insert_inferred_type_arguments=false
 sp_cleanup.make_local_variable_final=false
 sp_cleanup.make_parameters_final=false
 sp_cleanup.make_private_fields_final=true
@@ -87,7 +89,8 @@
 sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
@@ -100,8 +103,10 @@
 sp_cleanup.remove_unused_private_types=true
 sp_cleanup.sort_members=false
 sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
 sp_cleanup.use_blocks=true
 sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
 sp_cleanup.use_parentheses_in_expressions=false
 sp_cleanup.use_this_for_non_static_field_access=false
 sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/ConsoleTerminateAllActionTests.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/ConsoleTerminateAllActionTests.java
index c2c0be1..0485e47 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/ConsoleTerminateAllActionTests.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/ConsoleTerminateAllActionTests.java
@@ -84,6 +84,6 @@
 				removeAllBreakpoints();
 			}
 		}
-			
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleEchoActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleEchoActionDelegate.java
index 410fb00..3d8bc20 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleEchoActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleEchoActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -70,33 +70,33 @@
             }
         }, "IOConsole Test Thread").start(); //$NON-NLS-1$
     }
-    
+
     /**
      * Actually runs the test
      * @param console
      */
     public void runTest(IOConsole console) {
         final Display display = Display.getDefault();
-        
+
         final IOConsoleInputStream in = console.getInputStream();
         display.asyncExec(new Runnable() {
             @Override
-			public void run() {        
+			public void run() {
                 in.setColor(display.getSystemColor(SWT.COLOR_BLUE));
             }
         });
         IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
         manager.addConsoles(new IConsole[] { console });
-        
-        final IOConsoleOutputStream out = console.newOutputStream(); 
+
+        final IOConsoleOutputStream out = console.newOutputStream();
         Display.getDefault().asyncExec(new Runnable() {
             @Override
 			public void run() {
-                out.setColor(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));     
+                out.setColor(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
                 out.setFontStyle(SWT.ITALIC);
             }
         });
-        
+
         PrintStream ps = new PrintStream(out);
         ps.println("Any text entered should be echoed back"); //$NON-NLS-1$
         for(;;) {
@@ -107,7 +107,7 @@
             } catch (IOException io) {
                 io.printStackTrace();
             }
-            
+
             try {
                 out.write(b, 0, bRead);
                 ps.println();
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleHyperlinkActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleHyperlinkActionDelegate.java
index a99e248..6c3178e 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleHyperlinkActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleHyperlinkActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,7 +36,7 @@
  * Test the hyperlink action delegate for the console
  */
 public class IOConsoleHyperlinkActionDelegate implements IActionDelegate2, IWorkbenchWindowActionDelegate {
- 
+
     /**
      * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
      */
@@ -52,7 +52,7 @@
 			public String getPattern() {
                 return "1234567890"; //$NON-NLS-1$
             }
-            
+
             @Override
 			public String getLineQualifier() {
             	return "1234567890"; //$NON-NLS-1$
@@ -80,7 +80,7 @@
 			public void disconnect() {
             }
         };
-        
+
         backingconsole.addPatternMatchListener(listener);
         IOConsoleOutputStream stream = backingconsole.newOutputStream();
         stream.setFontStyle(SWT.ITALIC | SWT.BOLD);
@@ -92,7 +92,7 @@
             }
         }).start();
     }
-    
+
     private class MyHyperlink implements IHyperlink {
         /**
          * @see org.eclipse.ui.console.IHyperlink#linkEntered()
@@ -118,19 +118,19 @@
             System.out.println("link activated");
         }
     }
-    
+
     /**
      * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
      */
     @Override
-	public void init(IAction action) {        
+	public void init(IAction action) {
     }
 
     /**
      * @see org.eclipse.ui.IActionDelegate2#dispose()
      */
     @Override
-	public void dispose() {        
+	public void dispose() {
     }
 
     /**
@@ -152,7 +152,7 @@
      * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
      */
     @Override
-	public void init(IWorkbenchWindow window) {       
+	public void init(IWorkbenchWindow window) {
     }
 
 }
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleMultipleStreamActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleMultipleStreamActionDelegate.java
index c0f3a33..9daea85 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleMultipleStreamActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleMultipleStreamActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -65,23 +65,23 @@
 	public void run(IAction action) {
         runTest();
     }
-    
+
     /**
-     * Actually runs the test 
+     * Actually runs the test
      */
     public void runTest() {
         ended = false;
-        
+
         final IOConsole console = new IOConsole("IO Test Console", null, DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_ACT_RUN)); //$NON-NLS-1$
 
 //        console.setWaterMarks(5, 10);
 
         IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
         manager.addConsoles(new IConsole[] { console });
-        
+
         final Display display = Display.getDefault();
         final IOConsoleInputStream in = console.getInputStream();
-        final IOConsoleOutputStream echo = console.newOutputStream(); 
+        final IOConsoleOutputStream echo = console.newOutputStream();
         display.asyncExec(new Runnable() {
             @Override
 			public void run() {
@@ -90,12 +90,12 @@
             }
         });
         startInputReadThread(in, echo);
-        
-        IOConsoleOutputStream out = console.newOutputStream(); 
+
+        IOConsoleOutputStream out = console.newOutputStream();
         startOutputThread(out);
     }
-        
-    private void startOutputThread(final IOConsoleOutputStream out) {   
+
+    private void startOutputThread(final IOConsoleOutputStream out) {
         new Thread(new Runnable() {
             @Override
 			public void run() {
@@ -110,11 +110,11 @@
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-                }                
+                }
             }
         }, "OUTPUT").start(); //$NON-NLS-1$
     }
-    
+
     private void startInputReadThread(final InputStream in, final OutputStream out) {
        new Thread(new Runnable() {
            @Override
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleOutputActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleOutputActionDelegate.java
index 0f40223..243ee85 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleOutputActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleOutputActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -59,7 +59,7 @@
         IOConsole console = new IOConsole("Test IOConsole", null, DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_ACT_RUN)); //$NON-NLS-1$
 		IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
 		manager.addConsoles(new IConsole[]{console});
-		OutputStream out = console.newOutputStream(); 
+		OutputStream out = console.newOutputStream();
 		final PrintStream stream = new PrintStream(out);
 		Runnable r = new Runnable() {
 			@Override
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleTests.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleTests.java
index 449ec6d..e251239 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleTests.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/IOConsoleTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
  * IOConsoleTests for the Automated suite
  */
 public class IOConsoleTests extends AbstractDebugTest implements IPatternMatchListener {
-    
+
     private int fMatchCount;
     private boolean fDisconnected = false;
 
@@ -35,7 +35,7 @@
     public IOConsoleTests(String name) {
         super(name);
     }
-    
+
     /**
      * Tests that the pattern matcher will find a specific pattern
      * @throws Exception
@@ -51,14 +51,14 @@
             stream.print("one foo bar");
             stream.println();
             stream.print("two foo bar");
-            
+
             long endTime = System.currentTimeMillis() + 1500;
             while (!fDisconnected && System.currentTimeMillis() < endTime) {
                 synchronized(this) {
                     wait(500);
                 }
             }
-            
+
             assertEquals("Should be two foo's", 2, fMatchCount);
         } finally {
             consoleManager.removeConsoles(new IConsole[]{console});
@@ -72,7 +72,7 @@
 	public String getPattern() {
         return "foo";
     }
-    
+
     /**
      * @see org.eclipse.ui.console.IPatternMatchListener#getLineQualifier()
      */
@@ -96,7 +96,7 @@
 	public int getCompilerFlags() {
 		return 0;
 	}
-	
+
     /**
      * @see org.eclipse.ui.console.IPatternMatchListenerDelegate#connect(org.eclipse.ui.console.TextConsole)
      */
@@ -112,4 +112,4 @@
         notifyAll();
     }
 }
-    
+
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestBufferredOutputActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestBufferredOutputActionDelegate.java
index 0dac974..f967b31 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestBufferredOutputActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestBufferredOutputActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestMessageConsoleActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestMessageConsoleActionDelegate.java
index 5cdfa83..b48a90a 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestMessageConsoleActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestMessageConsoleActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestShowConsoleActionDelegate.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestShowConsoleActionDelegate.java
index 60514fc..5812a07 100644
--- a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestShowConsoleActionDelegate.java
+++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/TestShowConsoleActionDelegate.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,11 +31,11 @@
  * Tests the show console drop down action delegate for the console view
  */
 public class TestShowConsoleActionDelegate implements IActionDelegate2, IWorkbenchWindowActionDelegate {
-	
+
 	MessageConsole console1;
 	MessageConsole console2;
 	IConsoleManager consoleManager;
-	
+
 	/**
 	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
 	 */
@@ -46,13 +46,13 @@
 		consoleManager = ConsolePlugin.getDefault().getConsoleManager();
 		consoleManager.addConsoles(new IConsole[]{console1, console2});
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.IActionDelegate2#dispose()
 	 */
 	@Override
 	public void dispose() {}
-	
+
 	/**
 	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
 	 */
@@ -60,7 +60,7 @@
 	public void runWithEvent(IAction action, Event event) {
 		run(action);
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
@@ -68,23 +68,23 @@
 	public void run(IAction action) {
 		final MessageConsoleStream stream1 = console1.newMessageStream();
 		final MessageConsoleStream stream2 = console2.newMessageStream();
-		
+
 		stream2.setColor(Display.getDefault().getSystemColor(SWT.COLOR_RED));
-		
+
 		new Thread(new Runnable() {
 			@Override
 			public void run() {
-				
+
 				//write to console #1, show it, write again
 				stream1.print("Testing... Testing... Testing... "); //$NON-NLS-1$
 				consoleManager.showConsoleView(console1);
 				stream1.print("More Testing"); //$NON-NLS-1$
-				
-				//write to console #2, show it, write again		
+
+				//write to console #2, show it, write again
 				stream2.print("Testing... Testing... Testing... "); //$NON-NLS-1$
 				consoleManager.showConsoleView(console2);
 				stream2.print("More Testing"); //$NON-NLS-1$
-				
+
 				try {
 					for (int i=0; i<4; i++) {
 						consoleManager.showConsoleView(console1);
@@ -95,24 +95,24 @@
 				} catch (InterruptedException e) {
 					e.printStackTrace();
 				}
-				
+
 				writeToStream(stream1, "\n\nDone"); //$NON-NLS-1$
 				writeToStream(stream2, "\n\nDone"); //$NON-NLS-1$
 			}
-			
+
 		}).start();
 	}
-	
+
 	private void writeToStream(final MessageConsoleStream stream, final String str) {
-		stream.print(str); 
+		stream.print(str);
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
 	 */
 	@Override
 	public void selectionChanged(IAction action, ISelection selection) {}
-	
+
 	/**
 	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/plugin.properties b/org.eclipse.jdt.debug.tests/plugin.properties
index 96faec0..576ac5c 100644
--- a/org.eclipse.jdt.debug.tests/plugin.properties
+++ b/org.eclipse.jdt.debug.tests/plugin.properties
@@ -53,4 +53,6 @@
 contextLabel.label = Run FOOX file
 contextLabel.label.0 = Debug FOOX file
 contextLabel.label.1 = Profile FOOX file
-launchConfigurationTabGroup.description = Test Tab Group
\ No newline at end of file
+launchConfigurationTabGroup.description = Test Tab Group
+DebugViewPerspective=DebugView
+DebugViewPerspectiveDescription=DebugView perspective description
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/plugin.xml b/org.eclipse.jdt.debug.tests/plugin.xml
index bb85d96..bc649d7 100644
--- a/org.eclipse.jdt.debug.tests/plugin.xml
+++ b/org.eclipse.jdt.debug.tests/plugin.xml
@@ -476,5 +476,15 @@
            modelIdentifier="org.eclipse.jdt.debug">
      </stepFilter>
   </extension>
-
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            name="%DebugViewPerspective"
+            class="org.eclipse.jdt.debug.tests.ui.DebugViewPerspectiveFactory"
+            id="org.eclipse.jdt.debug.tests.ui.DebugViewPerspectiveFactory">
+         <description>
+            %DebugViewPerspectiveDescription
+         </description>
+      </perspective>
+   </extension>
 </plugin>
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AccessRuleParticipant.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AccessRuleParticipant.java
index c280b59..8a8ad8c 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AccessRuleParticipant.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AccessRuleParticipant.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
 
 /**
  * Sample access rule participant.
- * 
+ *
  * @since 3.3
  */
 public class AccessRuleParticipant implements IAccessRuleParticipant {
-	
+
 	IAccessRule[] fRules = new IAccessRule[] {
 			JavaCore.newAccessRule(new Path("discouraged"), IAccessRule.K_DISCOURAGED),
 			JavaCore.newAccessRule(new Path("accessible"), IAccessRule.K_ACCESSIBLE),
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AlternateDelegate.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AlternateDelegate.java
index 5083f64..b342092 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AlternateDelegate.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/AlternateDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,7 +14,7 @@
 
 /**
  * Tests an alternate launch mode that can be combined with debug mode for Java apps.
- * 
+ *
  * @since 3.3
  */
 public class AlternateDelegate extends JavaLaunchDelegate {
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ConsoleLineTracker.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ConsoleLineTracker.java
index 3728003..8a67966 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ConsoleLineTracker.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ConsoleLineTracker.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,19 +16,19 @@
 import org.eclipse.jface.text.IRegion;
 
 /**
- * Simple console line tracker extension point that delegates messages 
+ * Simple console line tracker extension point that delegates messages
  */
 public class ConsoleLineTracker implements IConsoleLineTrackerExtension {
-	
+
 	/**
-	 * Forwards messages to the delegate when not <code>null</code> 
+	 * Forwards messages to the delegate when not <code>null</code>
 	 */
 	private static IConsoleLineTrackerExtension fDelegate;
 	private static IConsole fConsole;
-	
+
 	/**
 	 * Sets the delegate, possibly <code>null</code>
-	 *  
+	 *
 	 * @param tracker
 	 */
 	public static void setDelegate(IConsoleLineTrackerExtension tracker) {
@@ -57,7 +57,7 @@
 			fDelegate.init(console);
 		}
 	}
-	
+
 	/**
 	 * Returns the document backing this console
 	 * @return the document backingthis console
@@ -75,7 +75,7 @@
 			fDelegate.lineAppended(line);
 		}
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.console.IConsoleLineTrackerExtension#consoleClosed()
 	 */
@@ -83,7 +83,7 @@
 	public void consoleClosed() {
 		if (fDelegate != null && fConsole != null) {
 			fDelegate.consoleClosed();
-		}		
+		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ContextView.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ContextView.java
index a241d33..5d06073 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ContextView.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ContextView.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,11 +17,11 @@
 
 /**
  * Test view for debug model context view bindings.
- * 
+ *
  * @since 3.2
  */
 public class ContextView extends ViewPart {
-	
+
 	private TableViewer viewer;
 
 	/**
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementEventWaiter.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementEventWaiter.java
index b588933..56ee778 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementEventWaiter.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementEventWaiter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,9 +16,9 @@
  * Waits for an event on a specific element
  */
 public class DebugElementEventWaiter extends DebugEventWaiter {
-	
+
 	protected Object fElement;
-	
+
 	/**
 	 * Constructor
 	 * @param kind
@@ -28,7 +28,7 @@
 		super(kind);
 		fElement = element;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.debug.testplugin.DebugEventWaiter#accept(org.eclipse.debug.core.DebugEvent)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventDetailWaiter.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventDetailWaiter.java
index 7f85de0..6e7abc3 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventDetailWaiter.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventDetailWaiter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,7 +29,7 @@
 		super(eventKind, elementClass);
 		fDetail = detail;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.debug.testplugin.DebugElementKindEventWaiter#accept(org.eclipse.debug.core.DebugEvent)
 	 */
@@ -37,5 +37,5 @@
 	public boolean accept(DebugEvent event) {
 		return super.accept(event) && fDetail == event.getDetail();
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventWaiter.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventWaiter.java
index aa905a1..396af4b 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventWaiter.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugElementKindEventWaiter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,9 +18,9 @@
  */
 
 public class DebugElementKindEventWaiter extends DebugEventWaiter {
-	
+
 	protected Class<?> fElementClass;
-	
+
 	/**
 	 * Constructor
 	 * @param eventKind
@@ -30,7 +30,7 @@
 		super(eventKind);
 		fElementClass = elementClass;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.debug.testplugin.DebugEventWaiter#accept(org.eclipse.debug.core.DebugEvent)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugEventWaiter.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugEventWaiter.java
index 39755cd..9317680 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugEventWaiter.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/DebugEventWaiter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -45,7 +45,7 @@
 	 * The <code>DebugEvent</code> received.
 	 */
 	protected DebugEvent fEvent;
-	
+
 	/**
 	 * The event set that was accepted
 	 */
@@ -166,13 +166,13 @@
 	public DebugEvent getEvent() {
 		return fEvent;
 	}
-	
+
 	/**
 	 * Returns the accepted event set, if any.
 	 * @return the even if any
 	 */
 	public DebugEvent[] getEventSet() {
 		return fEventSet;
-	}	
+	}
 }
 
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EmptyClasspathProvider.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EmptyClasspathProvider.java
index e97b676..3ca91ce 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EmptyClasspathProvider.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EmptyClasspathProvider.java
@@ -4,12 +4,12 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.debug.testplugin;
- 
+
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
 import org.eclipse.jdt.launching.IRuntimeClasspathProvider;
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EvalualtionBreakpointListener.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EvalualtionBreakpointListener.java
index 9ea7ebb..1eefbec 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EvalualtionBreakpointListener.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/EvalualtionBreakpointListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -37,52 +37,52 @@
  * whether to resume a thread.
  */
 public class EvalualtionBreakpointListener implements IJavaBreakpointListener {
-	
+
 	/**
 	 * How to vote when hit
 	 */
 	public static int VOTE = IJavaBreakpointListener.DONT_CARE;
-	
+
 	/**
 	 * Whether hit
 	 */
 	public static boolean HIT = false;
-	
+
 	/**
 	 * Whether removed
 	 */
 	public static boolean REMOVED = false;
-	
+
 	/**
 	 * Expression to evaluate when hit
 	 */
 	public static String EXPRESSION;
-	
+
 	/**
 	 * Project to compile expression in
 	 */
 	public static IJavaProject PROJECT;
-	
+
 	/**
 	 * Evaluation result
 	 */
 	public static IEvaluationResult RESULT;
-	
+
 	/**
 	 * List of breakpoints with compilation errors
 	 */
 	public static List<IJavaLineBreakpoint> COMPILATION_ERRORS = new ArrayList<IJavaLineBreakpoint>();
-	
+
 	/**
 	 * Lock used to notify when a notification is received.
 	 */
 	public static Object REMOVE_LOCK = new Object();
-	
+
 	/**
 	 * List of breakpoints with runtime errors
 	 */
 	public static List<IJavaLineBreakpoint> RUNTIME_ERRORS = new ArrayList<IJavaLineBreakpoint>();
-	
+
 	public static void reset() {
 		VOTE = IJavaBreakpointListener.DONT_CARE;
 		EXPRESSION = null;
@@ -181,5 +181,5 @@
 	public int installingBreakpoint(IJavaDebugTarget target, IJavaBreakpoint breakpoint, IJavaType type) {
 		return IJavaBreakpointListener.DONT_CARE;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ExpressionWaiter.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ExpressionWaiter.java
index 353e52b..7d6cf59 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ExpressionWaiter.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ExpressionWaiter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 	public ExpressionWaiter(int kind, Object element) {
 		super(kind, element);
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.debug.testplugin.DebugElementEventWaiter#accept(org.eclipse.debug.core.DebugEvent)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/GlobalBreakpointListener.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/GlobalBreakpointListener.java
index 3ddfac2..1d03e79 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/GlobalBreakpointListener.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/GlobalBreakpointListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,13 +23,13 @@
  * Listens to all breakpoint notifications.
  */
 public class GlobalBreakpointListener implements IJavaBreakpointListener {
-	
+
 	public static IJavaBreakpoint ADDED;
 	public static IJavaBreakpoint HIT;
 	public static IJavaBreakpoint INSTALLED;
 	public static IJavaBreakpoint REMOVED;
 	public static IJavaBreakpoint INSTALLING;
-	
+
 	public static void clear() {
 		ADDED = null;
 		HIT = null;
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaAlernateModeTab.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaAlernateModeTab.java
index 4710fb6..49a4b93 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaAlernateModeTab.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaAlernateModeTab.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,11 +28,11 @@
 
 /**
  * Test tab contribution to an existing tab group.
- * 
+ *
  * @since 3.3
  */
 public class JavaAlernateModeTab extends AbstractLaunchConfigurationTab implements ILaunchConfigurationListener {
-	
+
 	private Button fAlternateModeCheckBox;
 
 	/** Returns the set of modes this tab supports
@@ -51,7 +51,7 @@
 	public String getName() {
 		return "Alternate";
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
 	 */
@@ -71,7 +71,7 @@
 	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationRemoved(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
 	@Override
-	public void launchConfigurationRemoved(ILaunchConfiguration configuration) {}	
+	public void launchConfigurationRemoved(ILaunchConfiguration configuration) {}
 
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
@@ -116,7 +116,7 @@
 		setControl(fAlternateModeCheckBox);
 		DebugPlugin.getDefault().getLaunchManager().addLaunchConfigurationListener(this);
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
 	 */
@@ -142,10 +142,10 @@
 			});
 		}
 	}
-	
+
 	/**
 	 * handles setting the checked state of the widget
-	 * must check if we are in the UI thread before calling this method, as the launch ocnfiguration 
+	 * must check if we are in the UI thread before calling this method, as the launch ocnfiguration
 	 * notification can come from the non-UI tread.
 	 * @param configuration
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaProjectHelper.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaProjectHelper.java
index 2209400..6ca7e42 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaProjectHelper.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaProjectHelper.java
@@ -8,7 +8,7 @@
  * This is an implementation of an early-draft specification developed under the Java
  * Community Process (JCP) and is made available for testing and evaluation purposes
  * only. The code is not compatible with any specification of the JCP.
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S. Møller - bug 422029: [1.8] Enable debug evaluation support for default methods
@@ -55,7 +55,7 @@
  * Helper methods to set up a IJavaProject.
  */
 public class JavaProjectHelper {
-	
+
 	public static final String SRC_DIR = "src";
 	public static final String BIN_DIR = "bin";
 	public static final String J2SE_1_4_EE_NAME = "J2SE-1.4";
@@ -63,12 +63,12 @@
 	public static final String JAVA_SE_1_6_EE_NAME = "JavaSE-1.6";
 	public static final String JAVA_SE_1_7_EE_NAME = "JavaSE-1.7";
 	public static final String JAVA_SE_1_8_EE_NAME = "JavaSE-1.8";
-	
+
 	/**
 	 * path to the test src for 'testprograms'
 	 */
 	public static final IPath TEST_SRC_DIR= new Path("testprograms");
-	
+
 	/**
 	 * path to the 1.5 test source
 	 */
@@ -81,18 +81,18 @@
 	 * path to the 1.8 test source
 	 */
 	public static final IPath TEST_1_8_SRC_DIR= new Path("java8");
-	
+
 	/**
 	 * path to the compiler error java file
 	 */
-	public static final IPath TEST_COMPILE_ERROR = new Path("testresources/CompilationError.java");	
-	
+	public static final IPath TEST_COMPILE_ERROR = new Path("testresources/CompilationError.java");
+
 	public static final String JRE_CONTAINER_NAME = "org.eclipse.jdt.launching.JRE_CONTAINER";
 
-	
+
 	/**
 	 * Returns if the currently running VM is version compatible with Java 8
-	 * 
+	 *
 	 * @return <code>true</code> if a Java 8 (or greater) VM is running <code>false</code> otherwise
 	 */
 	public static boolean isJava8Compatible() {
@@ -100,34 +100,34 @@
 	}
 	/**
 	 * Returns if the currently running VM is version compatible with Java 7
-	 * 
+	 *
 	 * @return <code>true</code> if a Java 7 (or greater) VM is running <code>false</code> otherwise
 	 */
 	public static boolean isJava7Compatible() {
 		return isCompatible(7);
 	}
-	
+
 	/**
 	 * Returns if the currently running VM is version compatible with Java 6
-	 * 
+	 *
 	 * @return <code>true</code> if a Java 6 (or greater) VM is running <code>false</code> otherwise
 	 */
 	public static boolean isJava6Compatible() {
 		return isCompatible(6);
 	}
-	
+
 	/**
 	 * Returns if the currently running VM is version compatible with Java 5
-	 * 
+	 *
 	 * @return <code>true</code> if a Java 5 (or greater) VM is running <code>false</code> otherwise
 	 */
 	public static boolean isJava5Compatible() {
 		return isCompatible(5);
 	}
-	
+
 	/**
 	 * Returns if the current running system is compatible with the given Java minor version
-	 * 
+	 *
 	 * @param ver the version to test - either 4, 5, 6, 7 or 8
 	 * @return <code>true</code> if compatible <code>false</code> otherwise
 	 */
@@ -150,11 +150,11 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Creates a new {@link IProject} with the given name unless the project already exists. If it already exists
 	 * the project is refreshed and opened (if closed)
-	 * 
+	 *
 	 * @param pname the desired name for the project
 	 * @return the new {@link IProject} handle
 	 * @throws CoreException
@@ -172,7 +172,7 @@
 		}
 		return project;
 	}
-	
+
 	/**
 	 * creates a java project with the specified name and output folder
 	 * @param projectName
@@ -198,9 +198,9 @@
 		IJavaProject jproject= JavaCore.create(project);
 		jproject.setOutputLocation(outputLocation, null);
 		jproject.setRawClasspath(new IClasspathEntry[0], null);
-		return jproject;	
+		return jproject;
 	}
-		
+
 	/**
 	 * Creates a new Java project with the specified name
 	 * @param projectName
@@ -214,9 +214,9 @@
 		}
 		IJavaProject jproject= JavaCore.create(project);
 		jproject.setRawClasspath(new IClasspathEntry[0], null);
-		return jproject;	
-	}	
-			
+		return jproject;
+	}
+
 	/**
 	 * deletes a java project
 	 * @param jproject
@@ -226,7 +226,7 @@
 		jproject.setRawClasspath(new ClasspathEntry[0], jproject.getProject().getFullPath(), null);
 		jproject.getProject().delete(true, true, null);
 	}
-		
+
 	/**
 	 * Adds a new source container specified by the container name to the source path of the specified project
 	 * @param jproject
@@ -247,12 +247,12 @@
 			container= folder;
 		}
 		IPackageFragmentRoot root= jproject.getPackageFragmentRoot(container);
-		
+
 		IClasspathEntry cpe= JavaCore.newSourceEntry(root.getPath());
-		addToClasspath(jproject, cpe);		
+		addToClasspath(jproject, cpe);
 		return root;
 	}
-	
+
 	/**
 	 * Adds a source container to a IJavaProject.
 	 * @param jproject
@@ -282,12 +282,12 @@
 				output.create(false, true, null);
 			}
 		}
-				
+
 		IClasspathEntry cpe= JavaCore.newSourceEntry(root.getPath(), new IPath[0], output.getFullPath());
-		
-		addToClasspath(jproject, cpe);		
+
+		addToClasspath(jproject, cpe);
 		return root;
-	}	
+	}
 
 	/**
 	 * Adds a source container to a IJavaProject and imports all files contained
@@ -358,11 +358,11 @@
 		IFile newFile= project.getFile(jarPath.lastSegment());
 		try (InputStream inputStream = new FileInputStream(jarPath.toFile())) {
 			newFile.create(inputStream, true, null);
-		}				
+		}
 		return addLibrary(jproject, newFile.getFullPath(), sourceAttachPath, sourceAttachRoot);
-	}	
+	}
 
-		
+
 	/**
 	 * Adds a variable entry with source attachment to a IJavaProject.
 	 * Can return null if variable can not be resolved.
@@ -382,7 +382,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Adds a container entry to the specified java project
 	 * @param project
@@ -393,13 +393,13 @@
 		IClasspathEntry cpe = JavaCore.newContainerEntry(container, false);
 		addToClasspath(project, cpe);
 	}
-	
+
 	/**
 	 * Sets the given compiler compliance on the given {@link IJavaProject}
 	 * <br><br>
-	 * See {@link JavaCore#VERSION_1_4}, {@link JavaCore#VERSION_1_5}, {@link JavaCore#VERSION_1_6}, 
+	 * See {@link JavaCore#VERSION_1_4}, {@link JavaCore#VERSION_1_5}, {@link JavaCore#VERSION_1_6},
 	 * {@link JavaCore#VERSION_1_7} and {@link JavaCore#VERSION_1_8} for more information on accepted compliances
-	 * 
+	 *
 	 * @param project
 	 * @param compliance
 	 */
@@ -410,9 +410,9 @@
 		map.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, compliance);
 		project.setOptions(map);
 	}
-	
+
 	/**
-	 * Updates the compiler compliance project setting for the given project to match the given EE. 
+	 * Updates the compiler compliance project setting for the given project to match the given EE.
 	 * I.e. J2SE-1.5 will set a 1.5 compliance for the compiler and the source level.
 	 * @param project
 	 * @param ee
@@ -431,7 +431,7 @@
 			setCompliance(project, JavaCore.VERSION_1_8);
 		}
 	}
-	
+
 	/**
 	 * Adds a required project entry.
 	 * @param jproject
@@ -441,8 +441,8 @@
 	public static void addRequiredProject(IJavaProject jproject, IJavaProject required) throws JavaModelException {
 		IClasspathEntry cpe= JavaCore.newProjectEntry(required.getProject().getFullPath());
 		addToClasspath(jproject, cpe);
-	}	
-	
+	}
+
 	/**
 	 * Removes a specified path form the specified java project
 	 * @param jproject
@@ -456,12 +456,12 @@
 		for (int i= 0 ; i < nEntries ; i++) {
 			IClasspathEntry curr= oldEntries[i];
 			if (!path.equals(curr.getPath())) {
-				list.add(curr);			
+				list.add(curr);
 			}
 		}
 		IClasspathEntry[] newEntries= list.toArray(new IClasspathEntry[list.size()]);
 		jproject.setRawClasspath(newEntries, null);
-	}	
+	}
 
 	/**
 	 * Adds the specified classpath entry to the specified java project
@@ -485,8 +485,8 @@
 		entries.add(cpe);
 		jproject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), null);
 	}
-	
-			
+
+
 	/**
 	 * Adds the specified nature to the specified project
 	 * @param proj
@@ -503,7 +503,7 @@
 		description.setNatureIds(newNatures);
 		proj.setDescription(description, monitor);
 	}
-	
+
 	/**
 	 * Imports files from the specified zip to the specified destination
 	 * @param srcZipFile
@@ -511,7 +511,7 @@
 	 * @param monitor
 	 * @throws InvocationTargetException
 	 */
-	private static void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException {		
+	private static void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException {
 		ZipFileStructureProvider structureProvider=	new ZipFileStructureProvider(srcZipFile);
 		try {
 			ImportOperation op= new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, new ImportOverwriteQuery());
@@ -520,7 +520,7 @@
 			// should not happen
 		}
 	}
-	
+
 	/**
 	 * Imports files from the specified root dir into the specified path
 	 * @param rootDir
@@ -529,7 +529,7 @@
 	 * @throws InvocationTargetException
 	 * @throws IOException
 	 */
-	public static void importFilesFromDirectory(File rootDir, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, IOException {		
+	public static void importFilesFromDirectory(File rootDir, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, IOException {
 		IImportStructureProvider structureProvider = FileSystemStructureProvider.INSTANCE;
 		List<File> files = new ArrayList<>(100);
 		addJavaFiles(rootDir, files);
@@ -545,8 +545,8 @@
 		} catch (InterruptedException e) {
 			throw new InvocationTargetException(e, "Interrupted during files import");
 		}
-	}	
-	
+	}
+
 	/**
 	 * Imports the specified file into the specified path
 	 * @param file
@@ -554,7 +554,7 @@
 	 * @param monitor
 	 * @throws InvocationTargetException
 	 */
-	public static void importFile(File file, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException {		
+	public static void importFile(File file, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException {
 		IImportStructureProvider structureProvider = FileSystemStructureProvider.INSTANCE;
 		List<File> files = new ArrayList<File>(1);
 		files.add(file);
@@ -566,7 +566,7 @@
 			// should not happen
 		}
 	}
-	
+
 	/**
 	 * Recursively adds files from the specified dir to the provided list
 	 * @param dir
@@ -591,7 +591,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Static class for an <code>IOverwriteQuery</code> implementation
 	 */
@@ -602,6 +602,6 @@
 		@Override
 		public String queryOverwrite(String file) {
 			return ALL;
-		}	
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaTestPlugin.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaTestPlugin.java
index 8e4fee3..886edee 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaTestPlugin.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/JavaTestPlugin.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,9 +28,9 @@
  * Implementation of the Test plugin
  */
 public class JavaTestPlugin extends AbstractUIPlugin {
-	
+
 	private static JavaTestPlugin fgDefault;
-	
+
 	/**
 	 * Constructor
 	 */
@@ -38,7 +38,7 @@
 		super();
 		fgDefault= this;
 	}
-	
+
 	/**
 	 * Returns the singleton instance of the plugin
 	 * @return the singleton instance of the plugin
@@ -46,7 +46,7 @@
 	public static JavaTestPlugin getDefault() {
 		return fgDefault;
 	}
-	
+
 	/**
 	 * Returns a handle to the current workspace
 	 * @return a handle to the current workspace
@@ -54,7 +54,7 @@
 	public static IWorkspace getWorkspace() {
 		return ResourcesPlugin.getWorkspace();
 	}
-	
+
 	/**
 	 * Sets autobuild to the specified boolean value
 	 * @param enable
@@ -67,7 +67,7 @@
 		desc.setAutoBuilding(enable);
 		workspace.setDescription(desc);
 	}
-	
+
 	/**
 	 * Returns the file corresponding to the specified path from within this bundle
 	 * @param path
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/NullVariableInitializer.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/NullVariableInitializer.java
index 7d53d70..2088384 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/NullVariableInitializer.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/NullVariableInitializer.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 
 	/**
 	 * Performs no initialization.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.ClasspathVariableInitializer#initialize(java.lang.String)
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ResumeBreakpointListener.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ResumeBreakpointListener.java
index 80753c9..5f1a369 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ResumeBreakpointListener.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ResumeBreakpointListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,8 +20,8 @@
 import org.eclipse.jdt.debug.core.IJavaType;
 
 public class ResumeBreakpointListener implements IJavaBreakpointListener {
-	
-	public static boolean WAS_HIT = false; 
+
+	public static boolean WAS_HIT = false;
 
 	public ResumeBreakpointListener() {
 	}
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SampleDynamicVariableResolver.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SampleDynamicVariableResolver.java
index 4c67301..4f00f69 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SampleDynamicVariableResolver.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SampleDynamicVariableResolver.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
 	public String resolveValue(IDynamicVariable variable, String argument) {
 		if (argument == null) {
 			return "no arg";
-		} 
+		}
 		return "the arg is " + argument;
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SecondaryAccessRuleParticipant.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SecondaryAccessRuleParticipant.java
index bdc1d65..acb9b07 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SecondaryAccessRuleParticipant.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SecondaryAccessRuleParticipant.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
 
 /**
  * Sample access rule participant.
- * 
+ *
  * @since 3.3
  */
 public class SecondaryAccessRuleParticipant implements IAccessRuleParticipant {
-	
+
 	IAccessRule[] fRules = new IAccessRule[] {
 			JavaCore.newAccessRule(new Path("secondary"), IAccessRule.K_DISCOURAGED)
 	};
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SpecificDebugElementEventWaiter.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SpecificDebugElementEventWaiter.java
index 931f66a..f039036 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SpecificDebugElementEventWaiter.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/SpecificDebugElementEventWaiter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,14 +14,14 @@
 import org.eclipse.debug.core.model.IDebugElement;
 
 /**
- * This event waiter is used to wait for a certain type of event (create, terminate, suspend, etc.) 
- * on a *specific* debug element.  Contrast this with DebugElementKindEventWaiter which is similar, 
+ * This event waiter is used to wait for a certain type of event (create, terminate, suspend, etc.)
+ * on a *specific* debug element.  Contrast this with DebugElementKindEventWaiter which is similar,
  * but is used to wait for a certain type of event on a *kind* of debug element (thread, debug target, etc.)
  */
 public class SpecificDebugElementEventWaiter extends DebugEventWaiter {
 
 	protected IDebugElement fDebugElement;
-	
+
 	/**
 	 * Constructor
 	 * @param eventKind
@@ -31,7 +31,7 @@
 		super(eventKind);
 		fDebugElement = element;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.debug.testplugin.DebugEventWaiter#accept(org.eclipse.debug.core.DebugEvent)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestClasspathContainerInitializer.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestClasspathContainerInitializer.java
index 178a006..db2e9ad 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestClasspathContainerInitializer.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestClasspathContainerInitializer.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 import org.eclipse.jdt.core.ClasspathContainerInitializer;
 import org.eclipse.jdt.core.IJavaProject;
 
-/** 
+/**
  * A classpath initializer that performs equality based on the project, not the container id
  */
 public class TestClasspathContainerInitializer extends ClasspathContainerInitializer {
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourceLocator.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourceLocator.java
index db40424..8bec8ce 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourceLocator.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourceLocator.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourcePathComputer.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourcePathComputer.java
index e54dafc..279797a 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourcePathComputer.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/TestSourcePathComputer.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ValueVariableInitializer.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ValueVariableInitializer.java
index d772100..ff119cc 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ValueVariableInitializer.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/ValueVariableInitializer.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/SimpleDetailPane.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/SimpleDetailPane.java
index 440bd77..b59d713 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/SimpleDetailPane.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/SimpleDetailPane.java
@@ -28,7 +28,7 @@
  * test the detail pane functionality.  Displays a colored label depending on
  * if the selected element is public/private/protected/other.  This detail
  * pane is intended to only be used for selections containing only java variables.
- * 
+ *
  * @since 3.3
  * @see DetailPaneManagerTests
  * @see TestDetailPaneFactory
@@ -38,22 +38,22 @@
 public class SimpleDetailPane implements IDetailPane {
 
 	private Label theLabel;
-	
+
 	private Color colorPrivate;
 	private Color colorProtected;
 	private Color colorPublic;
 	private Color colorOther;
-	
+
 	private static final int TYPE_PRIVATE = 1;
 	private static final int TYPE_PROTECTED = 2;
 	private static final int TYPE_PUBLIC = 3;
 	private static final int TYPE_OTHER = 4;
-	
+
 	// Do not change these constants, they are compared against strings in DetailPaneManagerTests
 	public static final String ID = "SimpleDetailPane";
 	public static final String NAME = "Example Pane: Colorful Detail Pane";
 	public static final String DESCRIPTION = "Example pane that displays a color for variables depending on their access level.";
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#createControl(org.eclipse.swt.widgets.Composite)
 	 */
@@ -64,10 +64,10 @@
 		theLabel.setLayoutData(gd);
 		return theLabel;
 	}
-	
+
 	/**
 	 * Returns the color to be used with the given type
-	 * 
+	 *
 	 * @param typeId type of variable
 	 * @return the color to use
 	 */
@@ -121,14 +121,14 @@
 					}
 					theLabel.setBackground(getColor(TYPE_OTHER));
 					return;
-					
+
 				} catch (DebugException e){
 					theLabel.setBackground(theLabel.getParent().getBackground());
 					theLabel.setText(e.getMessage());
 				}
 			}
 		}
-		
+
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TableDetailPane.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TableDetailPane.java
index 63d2f8c..f0a18a8 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TableDetailPane.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TableDetailPane.java
@@ -41,7 +41,7 @@
 /**
  * An example detail pane that creates a composite containing several controls, all of which
  * will be displayed in the detail pane.
- * 
+ *
  * @since 3.3
  * @see TestDetailPaneFactory
  * @see IDetailPane
@@ -51,22 +51,22 @@
 	public static final String ID = "org.eclipse.jdt.debug.testplugin.detailpane.TableDetailPane";
 	public static final String NAME = "Example Pane: Table Detail Pane";
 	public static final String DESCRIPTION = "Example detail pane that displays details as a composite containing several controls";
-	
+
 	IWorkbenchPartSite fWorkbenchPartSite;
 	private Table fTable;
 	private TextViewer fText;
 	private Composite fComposite;
 	private Button fWordWrapButton;
 	private IDebugModelPresentation fModelPresentation;
-	
+
 	/**
 	 * Job to calculate detail string
 	 */
 	class DetailJob implements Runnable{
-		
+
 		private IValue fValue;
 		private IValueDetailListener fListener;
-		
+
 		public DetailJob(IValue value, IValueDetailListener listener){
 			fValue = value;
 			fListener = listener;
@@ -74,21 +74,21 @@
 
 		@Override
 		public void run() {
-			fModelPresentation.computeDetail(fValue, fListener);		
+			fModelPresentation.computeDetail(fValue, fListener);
 		}
-			
+
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#init(org.eclipse.ui.IWorkbenchPartSite)
 	 */
 	@Override
 	public void init(IWorkbenchPartSite workbenchPartSite) {
 		fWorkbenchPartSite = workbenchPartSite;
-		
+
 		fModelPresentation = new VariablesViewModelPresentation();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#createControl(org.eclipse.swt.widgets.Composite)
 	 */
@@ -112,21 +112,21 @@
 					TableItem item = fTable.getItem(index);
 					if (item != null){
 						Thread detailJob = new Thread(new DetailJob((IValue)item.getData(),getValueDetailListener()));
-						detailJob.start();						
+						detailJob.start();
 					}
 					else{
 						fText.setDocument(null);
 					}
 				}
 			}
-			
-			
+
+
 		});
-		
+
 		Composite composite = new Composite(fComposite,SWT.NONE);
 		composite.setLayout(new FillLayout(SWT.VERTICAL));
 		fText = new TextViewer(composite,SWT.READ_ONLY);
-		
+
 		fWordWrapButton = new Button(composite,SWT.CHECK);
 		fWordWrapButton.setText("Word Wrap");
 		fWordWrapButton.setSelection(false);
@@ -149,28 +149,28 @@
 	 */
 	@Override
 	public void display(IStructuredSelection element) {
-		
+
 		if (element != null){
-			
+
 			fTable.removeAll();
 			fText.setDocument(null);
-			
+
 			Iterator<?> iterator = element.iterator();
 			while (iterator.hasNext()){
-				
+
 				Object selection = iterator.next();
 				if (selection != null && selection instanceof IVariable){
-				
+
 					IValue val = null;
 					try {
-						
+
 						val = ((IVariable)selection).getValue();
 						TableItem newItem = new TableItem(fTable,SWT.NONE);
 						newItem.setText(val.getValueString());
 						newItem.setData(val);
-					
+
 					} catch (DebugException e) {
-						
+
 					}
 				}
 			}
@@ -180,7 +180,7 @@
 		}
 
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#setFocus()
 	 */
@@ -233,7 +233,7 @@
 	protected IValueDetailListener getValueDetailListener(){
 		return this;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IValueDetailListener#detailComputed(org.eclipse.debug.core.model.IValue, java.lang.String)
 	 */
@@ -244,7 +244,7 @@
 			public IStatus runInUIThread(IProgressMonitor monitor) {
 				fText.setDocument(new Document(result));
 				return Status.OK_STATUS;
-				
+
 			}
 		};
 		append.setSystem(true);
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TestDetailPaneFactory.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TestDetailPaneFactory.java
index 872c650..3aadb80 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TestDetailPaneFactory.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/detailpane/TestDetailPaneFactory.java
@@ -22,7 +22,7 @@
 
 /**
  * Test detail pane factory, used by the test suite to test custom detail pane functionality.
- * 
+ *
  * @since 3.3
  * @see DetailPaneManagerTests
  * @see SimpleDetailPane
@@ -61,7 +61,7 @@
 		}
 		return possibleIDs;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPaneFactory#getDefaultDetailPane(org.eclipse.jface.viewers.IStructuredSelection)
 	 */
@@ -90,7 +90,7 @@
 		}
 		return null;
 	}
-	
+
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.views.variables.IDetailsFactory#getDescription(java.lang.String)
@@ -103,6 +103,6 @@
 		if (id.equals(SimpleDetailPane.ID)){
 			return SimpleDetailPane.DESCRIPTION;
 		}
-		return null;		
+		return null;
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab1.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab1.java
index d77cd77..b39a73f 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab1.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab2.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab2.java
index 90c1973..dd449b8 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab2.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,7 +30,7 @@
 	public void createControl(Composite parent) {
 		Label label = new Label(parent, SWT.NONE);
 		label.setText("Just testing...");
-		setControl(label);		
+		setControl(label);
 	}
 
 	/**
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab3.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab3.java
index a1365ab..a1d19d9 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab3.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ContributedTestTab3.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ParticipantLaunchShortcut.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ParticipantLaunchShortcut.java
index 1f9975d..7ed2cb1 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ParticipantLaunchShortcut.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/ParticipantLaunchShortcut.java
@@ -59,7 +59,7 @@
 		catch(CoreException ce) {DebugUIPlugin.log(ce);}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchShortcut2#getLaunchableResource(org.eclipse.jface.viewers.ISelection)
 	 */
@@ -115,6 +115,6 @@
 			}
 		}
 		catch(CoreException ce) {DebugPlugin.log(ce);}
-		
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestJavaApplicationTabGroup.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestJavaApplicationTabGroup.java
index f493298..64006fa 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestJavaApplicationTabGroup.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestJavaApplicationTabGroup.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.debug.testplugin.launching;
 
- 
+
 import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
 import org.eclipse.debug.ui.ILaunchConfigurationDialog;
 import org.eclipse.debug.ui.ILaunchConfigurationTab;
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate.java
index 6accbd0..97c0793 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,13 +26,13 @@
 
 /**
  * Tests delegation to create a launch object.
- * 
+ *
  * @since 3.0
  */
 public class TestLaunchDelegate implements ILaunchConfigurationDelegate2 {
-	
+
 	private ILaunch fLaunch = null;
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#getLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
 	 */
@@ -41,7 +41,7 @@
 		fLaunch = new Launch(configuration, mode, null);
 		return fLaunch;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -67,7 +67,7 @@
 	public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
 		return true;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#finalLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -75,7 +75,7 @@
 	public boolean finalLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) {
 		return true;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#preLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate1.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate1.java
index 9e9383c..b2f7206 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate1.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 
 /**
  * Dummy launch delegate class that applies to mode 'alternate2' and the local java launch config type
- * 
+ *
  * @since 3.3
  */
 public class TestLaunchDelegate1 implements ILaunchConfigurationDelegate {
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate2.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate2.java
index 808cf11..5872bb7 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate2.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchDelegate2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 
 /**
  * Dummy launch delegate class that applies to mode 'alternate2' and the local java launch config type
- * 
+ *
  * @since 3.3
  */
 public class TestLaunchDelegate2 implements ILaunchConfigurationDelegate {
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchShortcut.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchShortcut.java
index f691249..7766ad1 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchShortcut.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLaunchShortcut.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestModeLaunchDelegate.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestModeLaunchDelegate.java
index d87eff5..441202c 100755
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestModeLaunchDelegate.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestModeLaunchDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
  * Contributed for local java application launch configs.
  */
 public class TestModeLaunchDelegate implements ILaunchConfigurationDelegate {
-	
+
 	// the test case to call back when launch is invoked
 	private static LaunchModeTests fgTestCase;
 
@@ -36,10 +36,10 @@
 			if (fgTestCase == null) {
 				throw new CoreException(new Status(IStatus.ERROR, "org.eclipse.jdt.debug.tests",
 				 0, "No test case registered.", null));
-			} 
+			}
 			fgTestCase.launch(configuration, mode);
 	}
-	
+
 	/**
 	 * @param testCase
 	 */
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestTabGroup.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestTabGroup.java
index 968986b..62b788a 100644
--- a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestTabGroup.java
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestTabGroup.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/ForceReturnTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/ForceReturnTests.java
index 35cd42d..839e737 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/ForceReturnTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/ForceReturnTests.java
@@ -25,30 +25,30 @@
 
 /**
  * Tests forcing return from method.
- * 
+ *
  * @since 3.3
  */
 public class ForceReturnTests extends AbstractDebugTest {
 
 	/**
 	 * Creates test case.
-	 * 
+	 *
 	 * @param name test name
 	 */
 	public ForceReturnTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests forcing the return of an integer from top stack frame
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testForceIntReturnTopFrame() throws Exception {
 		String typeName = "ForceReturnTests";
 		ILineBreakpoint bp2 = createLineBreakpoint(22, typeName);
 		ILineBreakpoint bp = createLineBreakpoint(31, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -75,19 +75,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests forcing the return of an integer from non-top stack frame
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testForceIntReturn() throws Exception {
 		String typeName = "ForceReturnTestsTwo";
 		ILineBreakpoint bp2 = createLineBreakpoint(23, typeName);
 		ILineBreakpoint bp = createLineBreakpoint(37, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -116,19 +116,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests forcing the return of a string from top frame
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testForceStringReturnTopFrame() throws Exception {
 		String typeName = "ForceReturnTests";
 		ILineBreakpoint bp2 = createLineBreakpoint(24, typeName);
 		ILineBreakpoint bp = createLineBreakpoint(36, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -156,19 +156,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests forcing the return of a string from a non top frame
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testForceStringReturn() throws Exception {
 		String typeName = "ForceReturnTestsTwo";
 		ILineBreakpoint bp2 = createLineBreakpoint(25, typeName);
 		ILineBreakpoint bp = createLineBreakpoint(46, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -197,19 +197,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
+		}
+	}
 
 	/**
 	 * Tests forcing the return of an object from top frame.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testForceObjectReturnTopFrame() throws Exception {
 		String typeName = "ForceReturnTests";
 		ILineBreakpoint bp2 = createLineBreakpoint(26, typeName);
 		ILineBreakpoint bp = createLineBreakpoint(43, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -237,19 +237,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests forcing the return of an object from non-top frame.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testForceObjectReturn() throws Exception {
 		String typeName = "ForceReturnTestsTwo";
 		ILineBreakpoint bp2 = createLineBreakpoint(27, typeName);
 		ILineBreakpoint bp = createLineBreakpoint(56, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -278,18 +278,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that an incompatible type causes an exception in top frame
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testIncompatibleReturnTypeTopFrame() throws Exception {
 		String typeName = "ForceReturnTests";
 		ILineBreakpoint bp = createLineBreakpoint(43, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -309,18 +309,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that an incompatible type causes an exception in non top frame
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testIncompatibleReturnType() throws Exception {
 		String typeName = "ForceReturnTestsTwo";
 		ILineBreakpoint bp = createLineBreakpoint(46, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -341,6 +341,6 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepFilterTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepFilterTests.java
index 12a6ec5..ea0b6b8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepFilterTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepFilterTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper Steen Moller - Enhancement 254677 - filter getters/setters
@@ -36,7 +36,7 @@
 	public StepFilterTests(String name) {
 		super(name);
 		fOriginalActiveFilters = getPrefStore().getString(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST);
-		fOriginalInactiveFilters = getPrefStore().getString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST);		
+		fOriginalInactiveFilters = getPrefStore().getString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST);
 	}
 
 	/**
@@ -48,7 +48,7 @@
 		String typeName = "StepFilterOne";
 		ILineBreakpoint bp = createLineBreakpoint(23, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, true);
@@ -61,14 +61,14 @@
 			}
 			assertEquals("Wrong receiving type", "StepFilterOne", recTypeName);
 			int lineNumber = stackFrame.getLineNumber();
-			assertEquals("Wrong line number", 24, lineNumber);			
+			assertEquals("Wrong line number", 24, lineNumber);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Tests a simple step filter
 	 * @throws Exception
@@ -78,7 +78,7 @@
 		String typeName = "StepFilterOne";
 		ILineBreakpoint bp = createLineBreakpoint(24, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, true);
@@ -91,14 +91,14 @@
 			}
 			assertEquals("Wrong receiving type", "StepFilterOne", recTypeName);
 			int lineNumber = stackFrame.getLineNumber();
-			assertEquals("Wrong line number", 25, lineNumber);			
+			assertEquals("Wrong line number", 25, lineNumber);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests a step filter that is not active
 	 * @throws Exception
@@ -108,7 +108,7 @@
 		String typeName = "StepFilterOne";
 		ILineBreakpoint bp = createLineBreakpoint(23, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -121,14 +121,14 @@
 			}
 			assertEquals("Wrong receiving type", "StepFilterTwo", recTypeName);
 			int lineNumber = stackFrame.getLineNumber();
-			assertEquals("Wrong line number", 25, lineNumber);			
+			assertEquals("Wrong line number", 25, lineNumber);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}						
+		}
 	}
-	
+
 	/**
 	 * Tests a deep step filter, i.e. a step filter that is more than one stack frame deep on the current
 	 * suspended thread
@@ -139,7 +139,7 @@
 		String typeName = "StepFilterOne";
 		ILineBreakpoint bp = createLineBreakpoint(24, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -152,13 +152,13 @@
 			}
 			assertEquals("Wrong receiving type", "StepFilterThree", recTypeName);
 			int lineNumber = stackFrame.getLineNumber();
-			assertEquals("Wrong line number", 19, lineNumber);			
+			assertEquals("Wrong line number", 19, lineNumber);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
-	}	
+		}
+	}
 
 	/**
 	 * Tests a simple step return filter
@@ -169,7 +169,7 @@
 		String typeName = "StepFilterOne";
 		ILineBreakpoint bp = createLineBreakpoint(19, "StepFilterThree");
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -182,14 +182,14 @@
 			}
 			assertEquals("Wrong receiving type", "StepFilterOne", recTypeName);
 			int lineNumber = stackFrame.getLineNumber();
-			assertEquals("Wrong line number", 23, lineNumber);			
+			assertEquals("Wrong line number", 23, lineNumber);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Tests a simple step over filter
 	 * @throws Exception
@@ -199,7 +199,7 @@
 		String typeName = "StepFilterOne";
 		ILineBreakpoint bp = createLineBreakpoint(19, "StepFilterThree");
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -212,13 +212,13 @@
 			}
 			assertEquals("Wrong receiving type", "StepFilterOne", recTypeName);
 			int lineNumber = stackFrame.getLineNumber();
-			assertEquals("Wrong line number", 23, lineNumber);			
+			assertEquals("Wrong line number", 23, lineNumber);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
-	}	
+		}
+	}
 
 	/**
 	 * Tests filtering of getter methods
@@ -230,7 +230,7 @@
 		String typeName = "StepFilterFour";
 		ILineBreakpoint bp = createLineBreakpoint(91, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -238,22 +238,22 @@
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
 			String recTypeName = stackFrame.getReceivingTypeName();
 			assertEquals("Wrong receiving type", "StepFilterFour", recTypeName);
-			assertEquals("Wrong line number", 92, stackFrame.getLineNumber());			
+			assertEquals("Wrong line number", 92, stackFrame.getLineNumber());
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
-			assertEquals("Wrong line number", 96, stackFrame.getLineNumber());			
+			assertEquals("Wrong line number", 96, stackFrame.getLineNumber());
 			// now step into the line with the call to sum() which is not a simple getter
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
-			assertEquals("Wrong line number", 71, stackFrame.getLineNumber());			
-			assertEquals("Should be in sum()", "sum", stackFrame.getMethodName());			
+			assertEquals("Wrong line number", 71, stackFrame.getLineNumber());
+			assertEquals("Should be in sum()", "sum", stackFrame.getMethodName());
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
-	}	
+		}
+	}
 
 	/**
 	 * Tests filtering of setter methods
@@ -265,7 +265,7 @@
 		String typeName = "StepFilterFour";
 		ILineBreakpoint bp = createLineBreakpoint(84, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp, false);
@@ -277,22 +277,22 @@
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
-			assertEquals("Wrong line number", 91, stackFrame.getLineNumber());			
+			assertEquals("Wrong line number", 91, stackFrame.getLineNumber());
 			// now step into the line with the call to getI() which is a simple getter
 			// since we're not filtering getters, we should end up in getI
 			stackFrame = (IJavaStackFrame)stepIntoWithFilters(stackFrame).getTopStackFrame();
-			assertEquals("Wrong line number", 34, stackFrame.getLineNumber());			
-			assertEquals("Should be in getI()", "getI", stackFrame.getMethodName());			
+			assertEquals("Wrong line number", 34, stackFrame.getLineNumber());
+			assertEquals("Should be in getI()", "getI", stackFrame.getMethodName());
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			resetStepFilters();
-		}				
-	}	
+		}
+	}
 
 	/**
 	 * Tests filtering from a contributed filter
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8.300
 	 */
@@ -334,7 +334,7 @@
 	 * @return
 	 */
 	protected IPreferenceStore getPrefStore() {
-		return JDIDebugUIPlugin.getDefault().getPreferenceStore();		
+		return JDIDebugUIPlugin.getDefault().getPreferenceStore();
 	}
 }
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionTests.java
index b8af4da..15f509d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Ivan Popov - [Bug 193488] org.eclipse.jdt.debug.test.stepping.StepIntoSelectionTests
@@ -26,136 +26,136 @@
  * Tests 'step into selection'
  */
 public class StepIntoSelectionTests extends AbstractDebugTest {
-	
+
 	/**
-	 * Constructor 
+	 * Constructor
 	 */
 	public StepIntoSelectionTests(String name) {
 		super(name);
-	}	
-	
+	}
+
 	/**
 	 * Step into 'new StepIntoSelectionClass()'
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoSourceConstructor() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
-		createLineBreakpoint(21, typeName);		
-		
+		createLineBreakpoint(21, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "StepIntoSelectionClass.java");
 			IType type = cu.getType("StepIntoSelectionClass");
 			IMethod method = type.getMethod("StepIntoSelectionClass", new String[0]);
 			assertTrue("Could not find constructor", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in constructor", "<init>", frame.getMethodName());
-			
-						
+
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Step into 'step()'
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoSourceMethod() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
-		createLineBreakpoint(23, typeName);		
-		
+		createLineBreakpoint(23, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "StepIntoSelectionClass.java");
 			IType type = cu.getType("StepIntoSelectionClass");
 			IMethod method = type.getMethod("step", new String[0]);
 			assertTrue("Could not find method 'step'", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in method 'step'", "step", frame.getMethodName());
-			
-						
+
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Step into 'method1(int[], String[])'
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoSourceMethodWithParameters() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
-		createLineBreakpoint(36, typeName);		
-		
+		createLineBreakpoint(36, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "StepIntoSelectionClass.java");
 			IType type = cu.getType("StepIntoSelectionClass");
 			IMethod method = type.getMethod("method1", new String[] {"[I", "[QString;"});
 			assertTrue("Could not find method 'method1'", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in method 'step'", "method1", frame.getMethodName());
-			
-						
+
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Step into 'Vector.addElement(Object)'
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoBinaryMethod() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
-		createLineBreakpoint(34, typeName);		
-		
+		createLineBreakpoint(34, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IType type = get14Project().findType("java.util.Vector");
 			IMethod method = type.getMethod("addElement", new String[]{"Ljava.lang.Object;"});
 			//for 1.5 compliance, addElement has a type 'E' not an object as the param type
@@ -163,56 +163,56 @@
 				method = type.getMethod("addElement", new String[] {"TE;"});
 			}
 			assertTrue("Could not find method 'addElement'", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in method 'addElement'", "addElement", frame.getMethodName());
-			
-						
+
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Step into 'new Integer(i)'
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoBinaryConstructor() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
-		createLineBreakpoint(34, typeName);		
-		
+		createLineBreakpoint(34, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IType type = get14Project().findType("java.lang.Integer");
 			IMethod method = type.getMethod("Integer", new String[]{"I"});
 			assertTrue("Could not find method constructor", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in constructor", "<init>", frame.getMethodName());
-			
-						
+
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionWithGenerics.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionWithGenerics.java
index b8e0fa0..e060991 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionWithGenerics.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepIntoSelectionWithGenerics.java
@@ -32,7 +32,7 @@
 	private String pname = "a.b.c";
 	private String jname = "StepIntoSelectionWithGenerics.java";
 	private String mname = "hello";
-	
+
 	/**
 	 * Constructor
 	 */
@@ -47,19 +47,19 @@
 	protected IJavaProject getProjectContext() {
 		return get15Project();
 	}
-	
+
 	/**
 	 * Tests stepping into a method of a top-level class that is generified
 	 * @throws Exception
 	 */
 	public void testStepIntoSelection1() throws Exception {
-		createLineBreakpoint(30, qtypename);		
-		
+		createLineBreakpoint(30, qtypename);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(qtypename);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			ICompilationUnit cu = getCompilationUnit(get15Project(), "src", pname, jname);
 			IJavaProject jp = cu.getJavaProject();
 			NullProgressMonitor monitor = new NullProgressMonitor();
@@ -67,37 +67,37 @@
 			assertTrue("The top-level type"+qtypename+" must exist", type.exists());
 			IMethod method = type.getMethod(mname, new String[0]);
 			assertTrue("Could not find method "+mname+" in type "+qtypename, method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in StepIntoSelectionWithGenerics."+mname, mname, frame.getMethodName());
 			assertEquals("Should be stopped on line", 26, frame.getLineNumber());
-						
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests stepping into a method of an inner class that is generified
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoSelection2() throws Exception {
-		createLineBreakpoint(31, qtypename);		
-		
+		createLineBreakpoint(31, qtypename);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(qtypename);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			ICompilationUnit cu = getCompilationUnit(get15Project(), "src", pname, jname);
 			IJavaProject jp = cu.getJavaProject();
 			NullProgressMonitor monitor = new NullProgressMonitor();
@@ -107,18 +107,18 @@
 			assertNotNull("The iner type InnerClazz must not be null", type);
 			IMethod method = type.getMethod(mname, new String[0]);
 			assertTrue("Could not find method "+mname+" in type InnerClazz", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in InnerClazz."+mname, mname, frame.getMethodName());
 			assertEquals("Should be stopped on line", 21, frame.getLineNumber());
-						
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
@@ -127,17 +127,17 @@
 
 	/**
 	 * Tests stepping into a method of an inner-inner class that is generified
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepIntoSelection3() throws Exception {
-		createLineBreakpoint(32, qtypename);		
-		
+		createLineBreakpoint(32, qtypename);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(qtypename);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			ICompilationUnit cu = getCompilationUnit(get15Project(), "src", pname, jname);
 			IJavaProject jp = cu.getJavaProject();
 			NullProgressMonitor monitor = new NullProgressMonitor();
@@ -147,18 +147,18 @@
 			assertNotNull("The inner type InnerClazz2 must not be null", type);
 			IMethod method = type.getMethod(mname, new String[0]);
 			assertTrue("Could not find method "+mname+" in type InnerClazz2", method.exists());
-			
+
 			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			handler.step();
 			Object source = waiter.waitForEvent();
 			assertEquals("Step did not complete", thread, source);
 			thread = (IJavaThread)source;
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should be in InnerClazz2."+mname, mname, frame.getMethodName());
 			assertEquals("Should be stopped on line", 17, frame.getLineNumber());
-						
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepResultTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepResultTests.java
index 1c0fb56..82df334 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepResultTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StepResultTests.java
@@ -85,7 +85,7 @@
 
 	/**
 	 * test that if the step return is aborted by some other break point, no return value of a recursive invocation is shown
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testNoReturnValueAfterAbortedStepReturn() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/TestContributedStepFilter.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/TestContributedStepFilter.java
index c3d855b..9bf2848 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/TestContributedStepFilter.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/TestContributedStepFilter.java
@@ -20,7 +20,7 @@
 public class TestContributedStepFilter implements IStepFilter {
 
 	/**
-	 * 
+	 *
 	 */
 	public TestContributedStepFilter() {
 	}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java
index 48de2f9..a60561e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 	public AbstractDebugPerformanceTest(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Overridden to create a default performance meter for this test case.
 	 * @throws Exception
@@ -54,7 +54,7 @@
 	 * Mark the scenario of this test case
 	 * to be included into the global performance summary. The summary shows
 	 * the given dimension of the scenario and labels the scenario with the short name.
-	 * 
+	 *
 	 * @param shortName a short (shorter than 40 characters) descriptive name of the scenario
 	 * @param dimension the dimension to show in the summary
 	 */
@@ -62,10 +62,10 @@
 		Performance performance= Performance.getDefault();
 		performance.tagAsGlobalSummary(fPerformanceMeter, shortName, new Dimension[] { dimension } );
 	}
-	
+
 	/**
 	 * Sets a degradation comment on this test.
-	 * 
+	 *
 	 * @param comment the reason for degradation.
 	 */
 	public void setDegradationComment(String comment) {
@@ -77,7 +77,7 @@
 	 * Mark the scenario represented by the given PerformanceMeter
 	 * to be included into the global performance summary. The summary shows
 	 * the given dimensions of the scenario and labels the scenario with the short name.
-	 * 
+	 *
 	 * @param shortName a short (shorter than 40 characters) descritive name of the scenario
 	 * @param dimensions an array of dimensions to show in the summary
 	 */
@@ -85,24 +85,24 @@
 		Performance performance= Performance.getDefault();
 		performance.tagAsGlobalSummary(fPerformanceMeter, shortName, dimensions );
 	}
-	
+
 	/**
 	 * Mark the scenario of this test case
 	 * to be included into the component performance summary. The summary shows
 	 * the given dimension of the scenario and labels the scenario with the short name.
-	 * 
+	 *
 	 * @param shortName a short (shorter than 40 characters) descritive name of the scenario
 	 * @param dimension the dimension to show in the summary
 	 */
 	public void tagAsSummary(String shortName, Dimension dimension) {
 		tagAsSummary(shortName, new Dimension[]{dimension});
 	}
-	
+
 	/**
 	 * Mark the scenario of this test case
 	 * to be included into the component performance summary. The summary shows
 	 * the given dimension of the scenario and labels the scenario with the short name.
-	 * 
+	 *
 	 * @param shortName a short (shorter than 40 characters) descritive name of the scenario
 	 * @param dimensions an array of dimensions to show in the summary
 	 */
@@ -110,7 +110,7 @@
 		Performance performance= Performance.getDefault();
 		performance.tagAsSummary(fPerformanceMeter, shortName, dimensions);
 	}
-	
+
 	/**
 	 * Called from within a test case immediately before the code to measure is run.
 	 * It starts capturing of performance data.
@@ -120,18 +120,18 @@
 	protected void startMeasuring() {
 		fPerformanceMeter.start();
 	}
-	
+
 	protected void stopMeasuring() {
 		fPerformanceMeter.stop();
 	}
-	
+
 	protected void commitMeasurements() {
-		fPerformanceMeter.commit(); 
+		fPerformanceMeter.commit();
 	}
 
 	/**
 	 * Asserts default properties of the measurements captured for this test case.
-	 * 
+	 *
 	 * @throws RuntimeException if the properties do not hold
 	 */
 	protected void assertPerformance() {
@@ -142,7 +142,7 @@
 	 * Asserts that the measurement specified by the given dimension
 	 * is within a certain range with respect to some reference value.
 	 * If the specified dimension isn't available, the call has no effect.
-	 * 
+	 *
 	 * @param dim the Dimension to check
 	 * @param lowerPercentage a negative number indicating the percentage the measured value is allowed to be smaller than some reference value
 	 * @param upperPercentage a positive number indicating the percentage the measured value is allowed to be greater than some reference value
@@ -151,7 +151,7 @@
 	protected void assertPerformanceInRelativeBand(Dimension dim, int lowerPercentage, int upperPercentage) {
 		Performance.getDefault().assertPerformanceInRelativeBand(fPerformanceMeter, dim, lowerPercentage, upperPercentage);
 	}
-    
+
     /**
      * Sets a comment to explain performance degradation.
      * @param comment the explanation for a performance degradation.
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
index c8335ed..6f52d2b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
@@ -26,7 +26,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.TimeUnit;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
@@ -58,6 +57,7 @@
 import org.eclipse.debug.core.ILaunchDelegate;
 import org.eclipse.debug.core.ILaunchManager;
 import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.IDebugTarget;
 import org.eclipse.debug.core.model.ILineBreakpoint;
 import org.eclipse.debug.core.model.IProcess;
 import org.eclipse.debug.core.model.IThread;
@@ -126,6 +126,7 @@
 import org.eclipse.jdt.debug.tests.core.LiteralTests17;
 import org.eclipse.jdt.debug.tests.refactoring.MemberParser;
 import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
+import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
 import org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine;
 import org.eclipse.jdt.internal.debug.ui.BreakpointUtils;
 import org.eclipse.jdt.internal.debug.ui.IJDIPreferencesConstants;
@@ -174,7 +175,7 @@
  */
 @SuppressWarnings("deprecation")
 public abstract class AbstractDebugTest extends TestCase implements  IEvaluationListener {
-	
+
 	public static final String MULTI_OUTPUT_PROJECT_NAME = "MultiOutput";
 	public static final String BOUND_EE_PROJECT_NAME = "BoundEE";
 	public static final String ONE_FOUR_PROJECT_NAME = "DebugTests";
@@ -190,10 +191,10 @@
 			"HitCountLooper", "CompileError", "MultiThreadedLoop", "HitCountException", "MultiThreadedException", "MultiThreadedList", "MethodLoop", "StepFilterOne",
 			"StepFilterFour", "EvalArrayTests", "EvalSimpleTests", "EvalTypeTests", "EvalNestedTypeTests", "EvalTypeHierarchyTests",
 			"EvalAnonymousClassVariableTests", "WorkingDirectoryTest",
-			"OneToTen", "OneToTenPrint", "FloodConsole", "ConditionalStepReturn", "VariableChanges", "DefPkgReturnType", "InstanceFilterObject", "org.eclipse.debug.tests.targets.CallStack", 
-			"org.eclipse.debug.tests.targets.ThreadStack", "org.eclipse.debug.tests.targets.HcrClass", "org.eclipse.debug.tests.targets.StepIntoSelectionClass", 
-			"WatchItemTests", "ArrayTests", "ByteArrayTests", "PerfLoop", "Console80Chars", "ConsoleStackTrace", "ConsoleVariableLineLength", "StackTraces", 
-			"ConsoleInput", "PrintConcatenation", "VariableDetails", "org.eclipse.debug.tests.targets.ArrayDetailTests", "ArrayDetailTestsDef", "ForceReturnTests", 
+			"OneToTen", "OneToTenPrint", "FloodConsole", "ConditionalStepReturn", "VariableChanges", "DefPkgReturnType", "InstanceFilterObject", "org.eclipse.debug.tests.targets.CallStack",
+			"org.eclipse.debug.tests.targets.ThreadStack", "org.eclipse.debug.tests.targets.HcrClass", "org.eclipse.debug.tests.targets.StepIntoSelectionClass",
+			"WatchItemTests", "ArrayTests", "ByteArrayTests", "PerfLoop", "Console80Chars", "ConsoleStackTrace", "ConsoleVariableLineLength", "StackTraces",
+			"ConsoleInput", "PrintConcatenation", "VariableDetails", "org.eclipse.debug.tests.targets.ArrayDetailTests", "ArrayDetailTestsDef", "ForceReturnTests",
 			"ForceReturnTestsTwo", "LogicalStructures", "BreakpointListenerTest", "LaunchHistoryTest", "LaunchHistoryTest2", "RunnableAppletImpl", "java6.AllInstancesTests",
 			"bug329294", "bug401270", "org.eclipse.debug.tests.targets.HcrClass2", "org.eclipse.debug.tests.targets.HcrClass3", "org.eclipse.debug.tests.targets.HcrClass4",
 			"org.eclipse.debug.tests.targets.HcrClass5", "org.eclipse.debug.tests.targets.HcrClass6", "org.eclipse.debug.tests.targets.HcrClass7", "org.eclipse.debug.tests.targets.HcrClass8",
@@ -206,7 +207,7 @@
 	 * the default timeout
 	 */
 	public static final int DEFAULT_TIMEOUT = 30000;
-	
+
 	//constants
 	protected static final String JAVA = "java"; //$NON-NLS-1$
 	protected static final String JAVA_EXTENSION = ".java"; //$NON-NLS-1$
@@ -215,12 +216,12 @@
 	protected static final String LOCAL_JAVA_APPLICATION_TYPE_ID = "org.eclipse.jdt.launching.localJavaApplication"; //$NON-NLS-1$
 	protected static final String JAVA_LAUNCH_SHORTCUT_ID = "org.eclipse.jdt.debug.ui.localJavaShortcut"; //$NON-NLS-1$
 	protected static final String TEST_LAUNCH_SHORTCUT = "org.eclipse.jdt.debug.tests.testShortCut";
-	
+
 	/**
 	 * an evaluation result
 	 */
 	public IEvaluationResult fEvaluationResult;
-	
+
 	/**
 	 * The last relevant event set - for example, that caused
 	 * a thread to suspend
@@ -236,7 +237,7 @@
 	private static boolean loadedJRE = false;
 	private static boolean loadedMulti = false;
 	private static boolean welcomeClosed = false;
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -247,13 +248,10 @@
 		ErrorDialog.AUTOMATED_MODE = true;
 		SafeRunnable.setIgnoreErrors(true);
 	}
-	
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
+
 	@Override
 	protected void setUp() throws Exception {
+		TestUtil.log(IStatus.INFO, getName(), "setUp");
 		super.setUp();
 		setPreferences();
 		IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(ONE_FOUR_PROJECT_NAME);
@@ -283,14 +281,14 @@
 	        debugUIPreferences.setValue(IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD, MessageDialogWithToggle.ALWAYS);
 	        debugUIPreferences.setValue(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR, MessageDialogWithToggle.ALWAYS);
 	        debugUIPreferences.setValue(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH, MessageDialogWithToggle.NEVER);
-	        
+
 	        String property = System.getProperty("debug.workbenchActivation");
-	        boolean activate = property != null && property.equals("on"); 
+	        boolean activate = property != null && property.equals("on");
 	        debugUIPreferences.setValue(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR, activate);
 	        debugUIPreferences.setValue(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT, activate);
 	        debugUIPreferences.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, activate);
 	        debugUIPreferences.setValue(IDebugUIConstants.PREF_ACTIVATE_WORKBENCH, activate);
-	
+
 	        IPreferenceStore jdiUIPreferences = JDIDebugUIPlugin.getDefault().getPreferenceStore();
 	        // Turn off suspend on uncaught exceptions
 	        jdiUIPreferences.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
@@ -304,7 +302,7 @@
 	        JDIDebugModel.getPreferences().setDefault(JDIDebugModel.PREF_REQUEST_TIMEOUT, 10000);
 	        // turn off monitor information
 	        jdiUIPreferences.setValue(IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO, false);
-	        
+
 	        // turn off workbench heap monitor
 	        PrefUtil.getAPIPreferenceStore().setValue(IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR, false);
 	        IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
@@ -314,7 +312,7 @@
 	                ((WorkbenchWindow) window).showHeapStatus(false);
 	            }
 	        }
-	        
+
 	        //make sure we are auto-refreshing external workspace changes
 	        IEclipsePreferences node = InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES);
 	        if(node != null) {
@@ -325,7 +323,7 @@
 	        loadedPrefs = true;
 		}
     }
-	
+
 	/**
 	 * Creates the Java 1.4 compliant project
 	 */
@@ -348,17 +346,17 @@
 		        JavaProjectHelper.importFilesFromDirectory(root, src.getPath(), null);
 		        IPath path = src.getPath().append("A.jar");
 		        JavaProjectHelper.addLibrary(jp, path);
-		        
+
 		        //add a closed project optional classpath entry
 		        //see https://bugs.eclipse.org/bugs/show_bug.cgi?id=380918
 		        IClasspathEntry entry = JavaCore.newProjectEntry(
-		        		new Path(ONE_FOUR_PROJECT_CLOSED_NAME).makeAbsolute(), 
-		        		new IAccessRule[0], 
-		        		false, 
-		        		new IClasspathAttribute[] {JavaCore.newClasspathAttribute(IClasspathAttribute.OPTIONAL, Boolean.TRUE.toString())}, 
+		        		new Path(ONE_FOUR_PROJECT_CLOSED_NAME).makeAbsolute(),
+		        		new IAccessRule[0],
+		        		false,
+		        		new IClasspathAttribute[] {JavaCore.newClasspathAttribute(IClasspathAttribute.OPTIONAL, Boolean.TRUE.toString())},
 		        		false);
 		        JavaProjectHelper.addToClasspath(jp, entry);
-		        
+
 		        // create launch configurations
 		        for (int i = 0; i < LAUNCH_CONFIG_NAMES_1_4.length; i++) {
 		        	cfgs.add(createLaunchConfiguration(jp, LAUNCH_CONFIG_NAMES_1_4[i]));
@@ -382,12 +380,12 @@
 			handleProjectCreationException(e, ONE_FOUR_PROJECT_NAME, jp);
         }
     }
-	
+
 	/**
 	 * Creates the Java 1.5 compliant project
 	 */
 	void assert15Project() {
-		IJavaProject jp = null; 
+		IJavaProject jp = null;
 		ArrayList<ILaunchConfiguration> cfgs = new ArrayList<ILaunchConfiguration>(1);
         try {
 	        if (!loaded15) {
@@ -419,7 +417,7 @@
 			handleProjectCreationException(e, ONE_FIVE_PROJECT_NAME, jp);
         }
 	}
-	
+
 	/**
 	 * Creates the Java 1.7 compliant project
 	 */
@@ -449,7 +447,7 @@
 			handleProjectCreationException(e, ONE_SEVEN_PROJECT_NAME, jp);
         }
 	}
-	
+
 	/**
 	 * Creates the Java 1.8 compliant project
 	 */
@@ -481,12 +479,12 @@
 			handleProjectCreationException(e, ONE_SEVEN_PROJECT_NAME, jp);
         }
 	}
-	
+
 	/**
 	 * Creates the 'BoundJRE' project used for the JRE testing
 	 */
 	synchronized void assertBoundJreProject() {
-		IJavaProject jp = null; 
+		IJavaProject jp = null;
 		try {
 	        if (!loadedJRE) {
 		        jp =JavaProjectHelper.createJavaProject(BOUND_JRE_PROJECT_NAME);
@@ -510,7 +508,7 @@
 			handleProjectCreationException(e, BOUND_JRE_PROJECT_NAME, jp);
         }
 	}
-	
+
 	/**
 	 * Creates the 'BoundEE' project for EE testing
 	 */
@@ -521,7 +519,7 @@
 		        // create project with two src folders and output locations
 		        jp = JavaProjectHelper.createJavaProject(BOUND_EE_PROJECT_NAME);
 		        JavaProjectHelper.addSourceContainer(jp, JavaProjectHelper.SRC_DIR, JavaProjectHelper.BIN_DIR);
-	
+
 		        // add VM specific JRE container
 		        IExecutionEnvironment j2se14 = JavaRuntime.getExecutionEnvironmentsManager().getEnvironment(JavaProjectHelper.J2SE_1_4_EE_NAME);
 		        assertNotNull("Missing J2SE-1.4 environment", j2se14);
@@ -543,7 +541,7 @@
 			handleProjectCreationException(e, BOUND_EE_PROJECT_NAME, jp);
         }
 	}
-	
+
 	/**
 	 * Creates the 'MultiOutput' project for source / binary output testing
 	 */
@@ -555,7 +553,7 @@
 		        jp = JavaProjectHelper.createJavaProject(MULTI_OUTPUT_PROJECT_NAME);
 		        JavaProjectHelper.addSourceContainer(jp, "src1", "bin1");
 		        JavaProjectHelper.addSourceContainer(jp, "src2", "bin2");
-	
+
 		        // add rt.jar
 		        IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		        assertNotNull("No default JRE", vm);
@@ -576,38 +574,50 @@
 			handleProjectCreationException(e, MULTI_OUTPUT_PROJECT_NAME, jp);
         }
 	}
-	
+
 	/**
 	 * Ensure the welcome screen is closed because in 4.x the debug perspective opens a giant fast-view causing issues
-	 *  
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
 	protected final void assertWelcomeScreenClosed() throws Exception {
 		if(!welcomeClosed && PlatformUI.isWorkbenchRunning()) {
 			final IWorkbench wb = PlatformUI.getWorkbench();
-			if(wb != null) {
-				UIJob job = new UIJob("close welcome screen for debug test suite") {
-					@Override
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-						if(window != null) {
-							IIntroManager im = wb.getIntroManager();
-							IIntroPart intro = im.getIntro();
-							if(intro != null) {
-								welcomeClosed = im.closeIntro(intro);
-							}
-						}
-						return Status.OK_STATUS;
-					}
-				};
-				job.setPriority(Job.INTERACTIVE);
-				job.setSystem(true);
-				job.schedule();
+			if (wb == null) {
+				return;
+			}
+			// In UI thread we don't need to run a job
+			if (Display.getCurrent() != null) {
+				closeIntro(wb);
+				return;
+			}
+
+			UIJob job = new UIJob("close welcome screen for debug test suite") {
+				@Override
+				public IStatus runInUIThread(IProgressMonitor monitor) {
+					closeIntro(wb);
+					return Status.OK_STATUS;
+				}
+
+			};
+			job.setPriority(Job.INTERACTIVE);
+			job.setSystem(true);
+			job.schedule();
+		}
+	}
+
+	private static void closeIntro(final IWorkbench wb) {
+		IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
+		if (window != null) {
+			IIntroManager im = wb.getIntroManager();
+			IIntroPart intro = im.getIntro();
+			if (intro != null) {
+				welcomeClosed = im.closeIntro(intro);
 			}
 		}
 	}
-	
+
 	void handleProjectCreationException(Exception e, String pname, IJavaProject jp) {
 		StringWriter buf = new StringWriter();
 		String msg = e.getMessage();
@@ -620,7 +630,7 @@
 		e.printStackTrace(new PrintWriter(buf));
 		fail(buf.toString());
 	}
-	
+
 	/**
 	 * Sets the contents of the given {@link ICompilationUnit} to be the new contents provided
 	 * @param unit
@@ -634,7 +644,7 @@
 		unit.save(null, true);
 		waitForBuild();
 	}
-	
+
 	/**
 	 * Sets the last relevant event set
 	 *
@@ -643,44 +653,44 @@
 	protected void setEventSet(DebugEvent[] set) {
 		fEventSet = set;
 	}
-	
+
 	/**
 	 * Returns the last relevant event set
-	 * 
+	 *
 	 * @return event set
 	 */
 	protected DebugEvent[] getEventSet() {
 		return fEventSet;
 	}
-	
+
 	/**
 	 * Returns the launch manager
-	 * 
+	 *
 	 * @return launch manager
 	 */
 	protected ILaunchManager getLaunchManager() {
 		return DebugPlugin.getDefault().getLaunchManager();
 	}
-	
+
 	/**
 	 * Returns the singleton instance of the <code>LaunchConfigurationManager</code>
-	 * 
+	 *
 	 * @return the singleton instance of the <code>LaunchConfigurationManager</code>
 	 * @since 3.3
 	 */
 	protected LaunchConfigurationManager getLaunchConfigurationManager() {
 		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
 	}
-	
+
 	/**
 	 * Returns the breakpoint manager
-	 * 
+	 *
 	 * @return breakpoint manager
 	 */
 	protected IBreakpointManager getBreakpointManager() {
 		return DebugPlugin.getDefault().getBreakpointManager();
-	}	
-	
+	}
+
 	/**
 	 * Returns the project context for the current test - each
 	 * test must implement this method
@@ -688,17 +698,17 @@
 	protected IJavaProject getProjectContext() {
 		return get14Project();
 	}
-	
+
 	/**
 	 * Returns the 'DebugTests' project.
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject get14Project() {
 		assert14Project();
 		return getJavaProject(ONE_FOUR_PROJECT_NAME);
 	}
-	
+
 	/**
 	 * Returns the {@link IBreakpointOrganizer} with the given id or <code>null</code>
 	 * if no such organizer exists
@@ -709,20 +719,20 @@
 	protected IBreakpointOrganizer getOrganizer(String id) {
 		return BreakpointOrganizerManager.getDefault().getOrganizer(id);
 	}
-	
+
 	/**
 	 * Returns the 'OneFive' project.
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject get15Project() {
 		assert15Project();
 		return getJavaProject(ONE_FIVE_PROJECT_NAME);
 	}
-	
+
 	/**
 	 * Returns the 'OneSeven' project.
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject get17Project() {
@@ -732,47 +742,47 @@
 
 	/**
 	 * Returns the 'OneSeven' project.
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject get18Project() {
 		assert18Project();
 		return getJavaProject(ONE_EIGHT_PROJECT_NAME);
 	}
-	
+
 	/**
 	 * Returns the 'BoundJRE' project
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject getBoundJreProject() {
 		assertBoundJreProject();
 		return getJavaProject(BOUND_JRE_PROJECT_NAME);
 	}
-	
+
 	/**
 	 * Returns the 'BoundEE' project
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject getBoundEeProject() {
 		assertBoundeEeProject();
 		return getJavaProject(BOUND_EE_PROJECT_NAME);
 	}
-	
+
 	/**
 	 * Returns the 'MultiOutput' project
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected IJavaProject getMultiOutputProject() {
 		assertMultioutputProject();
 		return getJavaProject(MULTI_OUTPUT_PROJECT_NAME);
 	}
-	
+
 	/**
 	 * Returns the Java project with the given name.
-	 * 
+	 *
 	 * @param name project name
 	 * @return the Java project with the given name
 	 */
@@ -780,14 +790,14 @@
 		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
 		return JavaCore.create(project);
 	}
-	
+
 	/**
-	 * Creates a new {@link IJavaProject} with the given name and optionally initializing it from the given 
+	 * Creates a new {@link IJavaProject} with the given name and optionally initializing it from the given
 	 * resource path from the testing bundle.
 	 * <br><br>
 	 * The project has the default <code>src</code> and <code>bin</code> folders. It is also created with a default
 	 * <code>launchConfigurations</code> folder.
-	 * 
+	 *
 	 * @param name the name for the project
 	 * @param contentpath the path within the jdt.debug test bundle to initialize the source from
 	 * @param ee the level of execution environment to use
@@ -816,10 +826,10 @@
         assertNotNull("The EE ["+ee+"] does not exist", environment);
 		IPath containerPath = JavaRuntime.newJREContainerPath(environment);
         JavaProjectHelper.addContainerEntry(jp, containerPath);
-        pro = jp.getProject();  
-        
+        pro = jp.getProject();
+
         JavaProjectHelper.updateCompliance(jp, ee);
-        
+
         // create launch configuration folder
         IFolder folder = pro.getFolder("launchConfigurations");
         if (!folder.exists()) {
@@ -827,14 +837,14 @@
         }
         return jp;
 	}
-	
+
 	/**
-	 * Creates a new {@link IJavaProject} with the given name and initializes the contents from the given 
+	 * Creates a new {@link IJavaProject} with the given name and initializes the contents from the given
 	 * resource path from the testing bundle.
 	 * <br><br>
 	 * The project has the default <code>src</code> and <code>bin</code> folders. It is also created with a default
 	 * <code>launchConfigurations</code> folder.
-	 * 
+	 *
 	 * @param name the name for the project
 	 * @param contentpath the path within the jdt.debug test bundle to initialize the source from
 	 * @param ee the level of execution environment to use
@@ -844,24 +854,25 @@
 	 */
 	protected IJavaProject createJavaProjectClone(String name, String contentpath, String ee, boolean delete) throws Exception {
 		IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+		String owner = "Creating project: " + name;
         if (pro.exists() && delete) {
 			pro.delete(true, true, null);
-			TestUtil.waitForJobs(300, TimeUnit.MINUTES.toMillis(3));
+			TestUtil.waitForJobs(owner, 100, 10000);
 			TestUtil.runEventLoop();
         }
         // create project and import source
         IJavaProject jp = JavaProjectHelper.createJavaProject(name, JavaProjectHelper.BIN_DIR);
-		TestUtil.waitForJobs(100, TimeUnit.MINUTES.toMillis(3));
+		TestUtil.waitForJobs(owner, 100, 10000);
 		TestUtil.runEventLoop();
 
         JavaProjectHelper.addSourceContainer(jp, JavaProjectHelper.SRC_DIR);
-		TestUtil.waitForJobs(100, TimeUnit.MINUTES.toMillis(3));
+		TestUtil.waitForJobs(owner, 100, 10000);
 		TestUtil.runEventLoop();
 
         File root = JavaTestPlugin.getDefault().getFileInPlugin(new Path(contentpath));
         JavaProjectHelper.importFilesFromDirectory(root, jp.getPath(), null);
 
-		TestUtil.waitForJobs(100, TimeUnit.MINUTES.toMillis(3));
+		TestUtil.waitForJobs(owner, 100, 10000);
 		TestUtil.runEventLoop();
 
         // add the EE library
@@ -871,22 +882,22 @@
         assertNotNull("The EE ["+ee+"] does not exist", environment);
 		IPath containerPath = JavaRuntime.newJREContainerPath(environment);
         JavaProjectHelper.addContainerEntry(jp, containerPath);
-        pro = jp.getProject();  
-        
+        pro = jp.getProject();
+
         // create launch configuration folder
         IFolder folder = pro.getFolder("launchConfigurations");
         if (!folder.exists()) {
         	folder.create(true, true, null);
         }
-		TestUtil.waitForJobs(300, TimeUnit.MINUTES.toMillis(3));
+		TestUtil.waitForJobs(owner, 100, 10000);
 		TestUtil.runEventLoop();
         return jp;
 	}
-	
+
 	/**
-	 * Creates a new {@link IProject} with the given name and initializes the contents from the given 
+	 * Creates a new {@link IProject} with the given name and initializes the contents from the given
 	 * resource path from the testing bundle.
-	 * 
+	 *
 	 * @param name the name for the project
 	 * @param contentpath the path within the jdt.debug test bundle to initialize the source from
 	 * @param if an existing project should be deleted
@@ -895,29 +906,30 @@
 	 */
 	protected IProject createProjectClone(String name, String contentpath, boolean delete) throws Exception {
 		IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+		String owner = "Creating project: " + name;
         if (pro.exists() && delete) {
 			pro.delete(true, true, null);
-			TestUtil.waitForJobs(100, TimeUnit.MINUTES.toMillis(3));
+			TestUtil.waitForJobs(owner, 100, 10000);
 			TestUtil.runEventLoop();
         }
         // create project and import source
         IProject pj = JavaProjectHelper.createProject(name);
-		TestUtil.waitForJobs(100, TimeUnit.MINUTES.toMillis(3));
+		TestUtil.waitForJobs(owner, 100, 10000);
 		TestUtil.runEventLoop();
 
         File root = JavaTestPlugin.getDefault().getFileInPlugin(new Path(contentpath));
         JavaProjectHelper.importFilesFromDirectory(root, pj.getFullPath(), null);
-		TestUtil.waitForJobs(100, TimeUnit.MINUTES.toMillis(3));
+		TestUtil.waitForJobs(owner, 100, 10000);
 		TestUtil.runEventLoop();
         return pj;
 	}
-	
+
 	/**
 	 * Returns the launch shortcut with the given id
 	 * @param id
-	 * @return the <code>LaunchShortcutExtension</code> with the given id, 
+	 * @return the <code>LaunchShortcutExtension</code> with the given id,
 	 * or <code>null</code> if none
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	protected LaunchShortcutExtension getLaunchShortcutExtension(String id) {
@@ -931,16 +943,16 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * New to 3.3 is the ability to have multiple delegates for a variety of overlapping mode combinations.
-	 * As such, for tests that launch specific configurations, must be check to ensure that there is a preferred 
+	 * As such, for tests that launch specific configurations, must be check to ensure that there is a preferred
 	 * launch delegate available for the launch in the event there are duplicates. Otherwise the tests
 	 * will hang waiting for a user to select a resolution action.
 	 * @param configuration
 	 * @param modes
 	 * @throws CoreException
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	protected void ensurePreferredDelegate(ILaunchConfiguration configuration, Set<String> modes) throws CoreException {
@@ -950,7 +962,7 @@
 			type.setPreferredDelegate(modes, getDelegateById(type.getIdentifier(), LOCAL_JAVA_APPLICATION_TYPE_ID));
 		}
 	}
-	
+
 	/**
 	 * Returns the LaunchDelegate for the specified ID
 	 * @param delegateId the id of the delegate to search for
@@ -967,10 +979,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the source folder with the given name in the given project.
-	 * 
+	 *
 	 * @param project
 	 * @param name source folder name
 	 * @return package fragment root
@@ -979,7 +991,7 @@
 		IProject p = project.getProject();
 		return project.getPackageFragmentRoot(p.getFolder(name));
 	}
-	
+
 	/**
 	 * Returns the <code>IHyperLink</code> at the given offset in the specified document
 	 * or <code>null</code> if the offset does not point to an <code>IHyperLink</code>
@@ -1005,12 +1017,12 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Launches the given configuration and waits for an event. Returns the
 	 * source of the event. If the event is not received, the launch is
 	 * terminated and an exception is thrown.
-	 * 
+	 *
 	 * @param configuration the configuration to launch
 	 * @param waiter the event waiter to use
 	 * @return Object the source of the event
@@ -1019,12 +1031,12 @@
 	protected Object launchAndWait(ILaunchConfiguration configuration, DebugEventWaiter waiter) throws CoreException {
 	    return launchAndWait(configuration, waiter, true);
 	}
-	
+
 	/**
-	 * Launches the given configuration in debug mode and waits for an event. 
-	 * Returns the source of the event. If the event is not received, the 
+	 * Launches the given configuration in debug mode and waits for an event.
+	 * Returns the source of the event. If the event is not received, the
 	 * launch is terminated and an exception is thrown.
-	 * 
+	 *
 	 * @param configuration the configuration to launch
 	 * @param waiter the event waiter to use
 	 * @param register whether to register the launch
@@ -1034,12 +1046,12 @@
 	protected Object launchAndWait(ILaunchConfiguration configuration, DebugEventWaiter waiter, boolean register) throws CoreException {
 		return launchAndWait(configuration, ILaunchManager.DEBUG_MODE, waiter, register);
 	}
-	
+
 	/**
 	 * Launches the given configuration and waits for an event. Returns the
 	 * source of the event. If the event is not received, the launch is
 	 * terminated and an exception is thrown.
-	 * 
+	 *
 	 * @param configuration the configuration to launch
 	 * @param mode the mode to launch the configuration in
 	 * @param waiter the event waiter to use
@@ -1082,16 +1094,16 @@
 		}
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend, launch terminated.", suspendee); //$NON-NLS-1$
-		return suspendee;		
+		return suspendee;
 	}
-	
-	
-	
+
+
+
 	/**
 	 * Launches the type with the given name, and waits for a
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @return thread in which the first suspend event occurred
 	 */
@@ -1102,50 +1114,50 @@
 	}
 
 	/**
-	 * Launches the given configuration in debug mode, and waits for a 
+	 * Launches the given configuration in debug mode, and waits for a
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param config the configuration to launch
 	 * @return thread in which the first suspend event occurred
-	 */	
+	 */
 	protected IJavaThread launchAndSuspend(ILaunchConfiguration config) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.SUSPEND, IJavaThread.class);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
 		Object suspendee = launchAndWait(config, waiter);
-		return (IJavaThread)suspendee;		
+		return (IJavaThread)suspendee;
 	}
-	
+
 	/**
-	 * Launches the type with the given name, and waits for a breakpoint-caused 
+	 * Launches the type with the given name, and waits for a breakpoint-caused
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @return thread in which the first suspend event occurred
 	 */
 	protected IJavaThread launchToBreakpoint(String mainTypeName) throws Exception {
 		return launchToBreakpoint(getProjectContext(), mainTypeName);
 	}
-	
+
 	/**
-	 * Launches the type with the given name, and waits for a breakpoint-caused 
+	 * Launches the type with the given name, and waits for a breakpoint-caused
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param project the project the type is in
 	 * @param mainTypeName the program to launch
 	 * @return thread in which the first suspend event occurred
 	 */
 	protected IJavaThread launchToBreakpoint(IJavaProject project, String mainTypeName) throws Exception {
 		return launchToBreakpoint(project, mainTypeName, true);
-	}	
-	
+	}
+
 	/**
-	 * Launches the type with the given name, and waits for a breakpoint-caused 
+	 * Launches the type with the given name, and waits for a breakpoint-caused
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @param register whether to register the launch
 	 * @return thread in which the first suspend event occurred
@@ -1153,12 +1165,12 @@
 	protected IJavaThread launchToBreakpoint(String mainTypeName, boolean register) throws Exception {
 		return launchToBreakpoint(getProjectContext(), mainTypeName, register);
 	}
-	
+
 	/**
-	 * Launches the type with the given name, and waits for a breakpoint-caused 
+	 * Launches the type with the given name, and waits for a breakpoint-caused
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @param register whether to register the launch
 	 * @return thread in which the first suspend event occurred
@@ -1167,43 +1179,43 @@
 		ILaunchConfiguration config = getLaunchConfiguration(project, mainTypeName);
 		assertNotNull("Could not locate launch configuration for " + mainTypeName, config); //$NON-NLS-1$
 		return launchToBreakpoint(config, register);
-	}	
+	}
 
 	/**
-	 * Launches the given configuration in debug mode, and waits for a breakpoint-caused 
+	 * Launches the given configuration in debug mode, and waits for a breakpoint-caused
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param config the configuration to launch
 	 * @return thread in which the first suspend event occurred
-	 */	
+	 */
 	protected IJavaThread launchToBreakpoint(ILaunchConfiguration config) throws CoreException {
 	    return launchToBreakpoint(config, true);
 	}
-	
+
 	/**
-	 * Launches the given configuration in debug mode, and waits for a breakpoint-caused 
+	 * Launches the given configuration in debug mode, and waits for a breakpoint-caused
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param config the configuration to launch
 	 * @param whether to register the launch
 	 * @return thread in which the first suspend event occurred
-	 */	
+	 */
 	protected IJavaThread launchToBreakpoint(ILaunchConfiguration config, boolean register) throws CoreException {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
 
 		Object suspendee= launchAndWait(config, waiter, register);
 		assertTrue("suspendee was not an IJavaThread", suspendee instanceof IJavaThread); //$NON-NLS-1$
-		return (IJavaThread)suspendee;		
-	}	
-	
+		return (IJavaThread)suspendee;
+	}
+
 	/**
 	 * Launches the type with the given name, and waits for a terminate
 	 * event in that program. Returns the debug target in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @param timeout the number of milliseconds to wait for a terminate event
 	 * @return debug target in which the terminate event occurred
@@ -1218,42 +1230,42 @@
 	 * Launches the given configuration in debug mode, and waits for a terminate
 	 * event in that program. Returns the debug target in which the terminate
 	 * event occurred.
-	 * 
+	 *
 	 * @param config the configuration to launch
 	 * @param timeout the number of milliseconds to wait for a terminate event
 	 * @return thread in which the first suspend event occurred
-	 */	
+	 */
 	protected IJavaDebugTarget launchAndTerminate(ILaunchConfiguration config, int timeout) throws Exception {
-		return launchAndTerminate(config, timeout, true);	
+		return launchAndTerminate(config, timeout, true);
 	}
-	
+
 	/**
 	 * Launches the given configuration in debug mode, and waits for a terminate
 	 * event in that program. Returns the debug target in which the terminate
 	 * event occurred.
-	 * 
+	 *
 	 * @param config the configuration to launch
 	 * @param timeout the number of milliseconds to wait for a terminate event
 	 * @param register whether to register the launch
 	 * @return thread in which the first suspend event occurred
-	 */	
+	 */
 	protected IJavaDebugTarget launchAndTerminate(ILaunchConfiguration config, int timeout, boolean register) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.TERMINATE, IJavaDebugTarget.class);
 		waiter.setTimeout(timeout);
 
-		Object terminatee = launchAndWait(config, waiter, register);		
+		Object terminatee = launchAndWait(config, waiter, register);
 		assertNotNull("Program did not terminate.", terminatee); //$NON-NLS-1$
 		assertTrue("terminatee is not an IJavaDebugTarget", terminatee instanceof IJavaDebugTarget); //$NON-NLS-1$
 		IJavaDebugTarget debugTarget = (IJavaDebugTarget) terminatee;
 		assertTrue("debug target is not terminated", debugTarget.isTerminated() || debugTarget.isDisconnected()); //$NON-NLS-1$
-		return debugTarget;		
-	}	
-	
+		return debugTarget;
+	}
+
 	/**
 	 * Launches the type with the given name, and waits for a line breakpoint suspend
 	 * event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @param bp the breakpoint that should cause a suspend event
 	 * @return thread in which the first suspend event occurred
@@ -1266,7 +1278,7 @@
 	 * Launches the type with the given name, and waits for a line breakpoint suspend
 	 * event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param mainTypeName the program to launch
 	 * @param bp the breakpoint that should cause a suspend event
 	 * @param register whether to register the launch
@@ -1277,16 +1289,16 @@
 		assertNotNull("Could not locate launch configuration for " + mainTypeName, config); //$NON-NLS-1$
 		return launchToLineBreakpoint(config, bp, register);
 	}
-	
+
 	/**
-	 * Launches the given configuration in debug mode, and waits for a line breakpoint 
+	 * Launches the given configuration in debug mode, and waits for a line breakpoint
 	 * suspend event in that program. Returns the thread in which the suspend
 	 * event occurred.
-	 * 
+	 *
 	 * @param config the configuration to launch
 	 * @param bp the breakpoint that should cause a suspend event
 	 * @return thread in which the first suspend event occurred
-	 */	
+	 */
 	protected IJavaThread launchToLineBreakpoint(ILaunchConfiguration config, ILineBreakpoint bp, boolean register) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
@@ -1302,49 +1314,49 @@
 		int lineNumber = breakpoint.getLineNumber();
 		int stackLine = thread.getTopStackFrame().getLineNumber();
 		assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine); //$NON-NLS-1$
-		
-		return thread;		
+
+		return thread;
 	}
-	
+
 	/**
 	 * Returns the standard java launch tab group
 	 * @return the standard java launch tab group
 	 * @throws CoreException
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	protected ILaunchConfigurationTabGroup getJavaLaunchGroup() throws CoreException {
-		ILaunchConfigurationType javaType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); 
+		ILaunchConfigurationType javaType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		ILaunchConfigurationTabGroup standardGroup = LaunchConfigurationPresentationManager.getDefault().getTabGroup(javaType, ILaunchManager.DEBUG_MODE);
 		return standardGroup;
 	}
-	
+
 	/**
 	 * Returns an instance of the launch configuration dialog on the the specified launch mode
 	 * @param modeid the id of the mode to open the launch dialog on
 	 * @return an new instance of <code>IlaunchConfigurationDialog</code>
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	protected ILaunchConfigurationDialog getLaunchConfigurationDialog(String modeid) {
 		return new LaunchConfigurationsDialog(null, DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(modeid));
 	}
-	
+
 	/**
 	 * Resumes the given thread, and waits for another breakpoint-caused suspend event.
 	 * Returns the thread in which the suspend event occurs.
-	 * 
+	 *
 	 * @param thread thread to resume
 	 * @return thread in which the first suspend event occurs
 	 */
 	protected IJavaThread resume(IJavaThread thread) throws Exception {
 	    return resume(thread, DEFAULT_TIMEOUT);
-	}	
-	
+	}
+
 	/**
 	 * Resumes the given thread, and waits for another breakpoint-caused suspend event.
 	 * Returns the thread in which the suspend event occurs.
-	 * 
+	 *
 	 * @param thread thread to resume
 	 * @param timeout timeout in milliseconds
 	 * @return thread in which the first suspend event occurs
@@ -1352,26 +1364,26 @@
 	protected IJavaThread resume(IJavaThread thread, int timeout) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
 		waiter.setTimeout(timeout);
-		
+
 		thread.resume();
 
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
 		return (IJavaThread)suspendee;
-	}	
-	
+	}
+
 	/**
 	 * Resumes the given thread, and waits for a suspend event caused by the specified
 	 * line breakpoint.  Returns the thread in which the suspend event occurs.
-	 * 
+	 *
 	 * @param thread thread to resume
 	 * @return thread in which the first suspend event occurs
 	 */
 	protected IJavaThread resumeToLineBreakpoint(IJavaThread resumeThread, ILineBreakpoint bp) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		resumeThread.resume();
 
 		Object suspendee= waiter.waitForEvent();
@@ -1387,38 +1399,38 @@
 		int lineNumber = breakpoint.getLineNumber();
 		int stackLine = thread.getTopStackFrame().getLineNumber();
 		assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine); //$NON-NLS-1$
-		
+
 		return (IJavaThread)suspendee;
-	}	
-	
+	}
+
 	/**
 	 * Resumes the given thread, and waits for the debug target
 	 * to terminate (i.e. finish/exit the program).
-	 * 
+	 *
 	 * @param thread thread to resume
 	 */
 	protected void exit(IJavaThread thread) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.TERMINATE, IProcess.class);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		thread.resume();
 
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not terminate.", suspendee); //$NON-NLS-1$
-	}	
-		
+	}
+
 	/**
 	 * Resumes the given thread, and waits the associated debug
 	 * target to terminate.
-	 * 
+	 *
 	 * @param thread thread to resume
 	 * @return the terminated debug target
 	 */
 	protected IJavaDebugTarget resumeAndExit(IJavaThread thread) throws Exception {
 		DebugEventWaiter waiter= new DebugElementEventWaiter(DebugEvent.TERMINATE, thread.getDebugTarget());
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		thread.resume();
 
 		Object suspendee= waiter.waitForEvent();
@@ -1427,21 +1439,21 @@
 		IJavaDebugTarget target = (IJavaDebugTarget)suspendee;
 		assertTrue("program should have exited", target.isTerminated() || target.isDisconnected()); //$NON-NLS-1$
 		return target;
-	}	
-		
+	}
+
 	/**
 	 * Returns the launch configuration for the given main type
-	 * 
+	 *
 	 * @param mainTypeName program to launch
 	 * @see ProjectCreationDecorator
 	 */
 	protected ILaunchConfiguration getLaunchConfiguration(String mainTypeName) {
 		return getLaunchConfiguration(getProjectContext(), mainTypeName);
 	}
-	
+
 	/**
 	 * Returns the launch configuration for the given main type
-	 * 
+	 *
 	 * @param mainTypeName program to launch
 	 * @see ProjectCreationDecorator
 	 */
@@ -1451,11 +1463,11 @@
 		assertNotNull("the configuration cannot be null", config);
 		assertTrue("Could not find launch configuration for " + mainTypeName, config.exists()); //$NON-NLS-1$
 		return config;
-	}	
-	
+	}
+
 	/**
 	 * Returns the launch configuration in the specified folder in the given project, for the given main type
-	 * 
+	 *
 	 * @param project the project to look in
 	 * @param containername the name of the container in the specified project to look for the config
 	 * @param mainTypeName program to launch
@@ -1468,7 +1480,7 @@
 		assertTrue("Could not find launch configuration for " + mainTypeName, config.exists()); //$NON-NLS-1$
 		return config;
 	}
-	
+
 	/**
 	 * Returns the corresponding <code>IResource</code> from the <code>IJavaElement</code> with the
 	 * specified name
@@ -1482,12 +1494,12 @@
 		IResource resource = element.getCorrespondingResource();
 		if (resource == null) {
 			resource = getProjectContext().getProject();
-		}		
+		}
 		return resource;
 	}
-	
+
 	/**
-	 * Returns the resource from the specified type or the project from the testing java project in the 
+	 * Returns the resource from the specified type or the project from the testing java project in the
 	 * event there is no resource from the specified type
 	 * @param type
 	 * @return
@@ -1500,14 +1512,14 @@
 		IResource resource = type.getResource();
 		if (resource == null) {
 			resource = type.getJavaProject().getProject();
-		}		
+		}
 		return resource;
-	}	
-	
+	}
+
 	/**
 	 * Creates and returns a line breakpoint at the given line number in the type with the
 	 * given name.
-	 * 
+	 *
 	 * @param lineNumber line number
 	 * @param typeName type name
 	 */
@@ -1516,7 +1528,7 @@
 		assertNotNull("Could not find the requested IType: "+typeName, type);
 		return createLineBreakpoint(type, lineNumber);
 	}
-	
+
 	/**
 	 * Creates am  new java line breakpoint
 	 * @param lineNumber
@@ -1526,7 +1538,7 @@
 	 * @param fullTargetName
 	 * @return a new line breakpoint
 	 */
-	protected IJavaLineBreakpoint createLineBreakpoint(int lineNumber, String root, String packageName, String cuName, 
+	protected IJavaLineBreakpoint createLineBreakpoint(int lineNumber, String root, String packageName, String cuName,
 			String fullTargetName) throws Exception{
 		IJavaProject javaProject = getProjectContext();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
@@ -1534,14 +1546,14 @@
 		IType targetType = (IType)(new MemberParser()).getDeepest(cunit,fullTargetName);
 		assertNotNull("did not find requested type", targetType); //$NON-NLS-1$
 		assertTrue("did not find type to install breakpoint in", targetType.exists()); //$NON-NLS-1$
-		
+
 		return createLineBreakpoint(targetType, lineNumber);
 	}
 
-	
+
 	/**
 	 * Creates a line breakpoint in the given type (may be a top level non public type)
-	 * 
+	 *
 	 * @param lineNumber line number to create the breakpoint at
 	 * @param packageName fully qualified package name containing the type, example "a.b.c"
 	 * @param cuName simple name of compilation unit containing the type, example "Something.java"
@@ -1554,10 +1566,10 @@
 		assertNotNull("Could not find the requested IType: "+typeName, type);
 		return createLineBreakpoint(type, lineNumber);
 	}
-	
+
 	/**
 	 * Creates a line breakpoint in the given type at the given line number.
-	 * 
+	 *
 	 * @param type type in which to install the breakpoint
 	 * @param lineNumber line number to install the breakpoint at
 	 * @return line breakpoint
@@ -1592,10 +1604,10 @@
 		forceDeltas(bp);
 		return bp;
 	}
-	
+
 	/**
 	 * Forces marker deltas to be sent based on breakpoint creation.
-	 * 
+	 *
 	 * @param breakpoint
 	 */
 	private void forceDeltas(IBreakpoint breakpoint) throws CoreException {
@@ -1604,11 +1616,11 @@
 			project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null);
 		}
 	}
-	
+
 	/**
-	 * Returns the type in the test project based on the given name. The type name may refer to a 
+	 * Returns the type in the test project based on the given name. The type name may refer to a
 	 * top level non public type.
-	 * 
+	 *
 	 * @param packageName package name, example "a.b.c"
 	 * @param cuName simple compilation unit name within the package, example "Something.java"
 	 * @param typeName simple dot qualified type name, example "Something" or "NonPublic" or "Something.Inner"
@@ -1633,11 +1645,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Creates and returns a map of java element breakpoint attributes for a breakpoint on the
 	 * given java element, or <code>null</code> if none
-	 * 
+	 *
 	 * @param element java element the breakpoint is associated with
 	 * @return map of breakpoint attributes or <code>null</code>
 	 * @throws Exception
@@ -1658,12 +1670,12 @@
 			return map;
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Creates and returns a line breakpoint at the given line number in the type with the
 	 * given name and sets the specified condition on the breakpoint.
-	 * 
+	 *
 	 * @param lineNumber line number
 	 * @param typeName type name
 	 * @param condition condition
@@ -1675,11 +1687,11 @@
 		bp.setConditionSuspendOnTrue(suspendOnTrue);
 		return bp;
 	}
-	
+
 	/**
 	 * Creates and returns a pattern breakpoint at the given line number in the
 	 * source file with the given name.
-	 * 
+	 *
 	 * @param lineNumber line number
 	 * @param sourceName name of source file
 	 * @param pattern the pattern of the class file name
@@ -1687,22 +1699,22 @@
 	protected IJavaPatternBreakpoint createPatternBreakpoint(int lineNumber, String sourceName, String pattern) throws Exception {
 		return JDIDebugModel.createPatternBreakpoint(getProjectContext().getProject(), sourceName, pattern, lineNumber, -1, -1, 0, true, null);
 	}
-	
+
 	/**
 	 * Creates and returns a target pattern breakpoint at the given line number in the
 	 * source file with the given name.
-	 * 
+	 *
 	 * @param lineNumber line number
 	 * @param sourceName name of source file
 	 */
 	protected IJavaTargetPatternBreakpoint createTargetPatternBreakpoint(int lineNumber, String sourceName) throws Exception {
 		return JDIDebugModel.createTargetPatternBreakpoint(getProjectContext().getProject(), sourceName, lineNumber, -1, -1, 0, true, null);
-	}	
-	
+	}
+
 	/**
 	 * Creates and returns a stratum breakpoint at the given line number in the
 	 * source file with the given name.
-	 * 
+	 *
 	 * @param lineNumber line number
 	 * @param sourceName name of source file
 	 * @param stratum the stratum of the source file
@@ -1710,10 +1722,10 @@
 	protected IJavaStratumLineBreakpoint createStratumBreakpoint(int lineNumber, String sourceName, String stratum) throws Exception {
 		return JDIDebugModel.createStratumBreakpoint(getProjectContext().getProject(), stratum, sourceName, null, null, lineNumber, -1, -1, 0, true, null);
 	}
-	
+
 	/**
 	 * Creates and returns a method breakpoint
-	 * 
+	 *
 	 * @param typeNamePattern type name pattern
 	 * @param methodName method name
 	 * @param methodSignature method signature or <code>null</code>
@@ -1722,11 +1734,11 @@
 	 */
 	protected IJavaMethodBreakpoint createMethodBreakpoint(String typeNamePattern, String methodName, String methodSignature, boolean entry, boolean exit) throws Exception {
 		return createMethodBreakpoint(getProjectContext(), typeNamePattern, methodName, methodSignature, entry, exit);
-	}	
-	
+	}
+
 	/**
 	 * Creates and returns a method breakpoint
-	 * 
+	 *
 	 * @param project java project
 	 * @param typeNamePattern type name pattern
 	 * @param methodName method name
@@ -1748,11 +1760,11 @@
 		IJavaMethodBreakpoint bp = JDIDebugModel.createMethodBreakpoint(resource, typeNamePattern, methodName, methodSignature, entry, exit,false, -1, -1, -1, 0, true, map);
 		forceDeltas(bp);
 		return bp;
-	}	
-	
+	}
+
 	/**
 	 * Creates a method breakpoint in a fully specified type (potentially non public).
-	 * 
+	 *
 	 * @param packageName package name containing type to install breakpoint in, example "a.b.c"
 	 * @param cuName simple compilation unit name within package, example "Something.java"
 	 * @param typeName $ qualified type name within compilation unit, example "Something" or
@@ -1778,10 +1790,10 @@
 		forceDeltas(bp);
 		return bp;
 	}
-		
+
 
 	/**
-	 * Creates a MethodBreakPoint on the method specified at the given path. 
+	 * Creates a MethodBreakPoint on the method specified at the given path.
 	 * Syntax:
 	 * Type$InnerType$MethodNameAndSignature$AnonymousTypeDeclarationNumber$FieldName
 	 * eg:<code>
@@ -1792,7 +1804,7 @@
 	 * 			{
 	 * 				Object anon = new Object(){
 	 * 					int anIntField;
-	 * 					String anonTypeMethod() {return "an Example";}				
+	 * 					String anonTypeMethod() {return "an Example";}
 	 * 				}
 	 * 			}
 	 * 		}
@@ -1800,9 +1812,9 @@
 	 * Syntax to get the anonymous toString would be: Foo$Inner$aMethod()V$1$anonTypeMethod()QString
 	 * so, createMethodBreakpoint(packageName, cuName, "Foo$Inner$aMethod()V$1$anonTypeMethod()QString",true,false);
 	 */
-	protected IJavaMethodBreakpoint createMethodBreakpoint(String root, String packageName, String cuName, 
+	protected IJavaMethodBreakpoint createMethodBreakpoint(String root, String packageName, String cuName,
 									String fullTargetName, boolean entry, boolean exit) throws Exception {
-		
+
 		IJavaProject javaProject = getProjectContext();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		assertNotNull("did not find requested Compilation Unit", cunit); //$NON-NLS-1$
@@ -1811,13 +1823,13 @@
 		assertTrue("Given method does not exist", targetMethod.exists()); //$NON-NLS-1$
 		IType methodParent = (IType)targetMethod.getParent();//safe - method's only parent = Type
 		assertNotNull("did not find type to install breakpoint in", methodParent); //$NON-NLS-1$
-				
+
 		Map<String, Object> map = getExtraBreakpointAttributes(targetMethod);
 		IJavaMethodBreakpoint bp = JDIDebugModel.createMethodBreakpoint(getBreakpointResource(methodParent), methodParent.getFullyQualifiedName(),targetMethod.getElementName(), targetMethod.getSignature(), entry, exit,false, -1, -1, -1, 0, true, map);
 		forceDeltas(bp);
 		return bp;
-	}		
-	
+	}
+
 	/**
 	 * @param cu the Compilation where the target resides
 	 * @param target the full name of the target, as per MemberParser syntax
@@ -1827,21 +1839,21 @@
 		IMember toReturn = (new MemberParser()).getDeepest(cu,target);
 		return toReturn;
 	}
-	
+
 	/**
 	 * Delegate method to get a resource with a specific name from the testing workspace 'src' folder
 	 * @param name the name of the <code>IResource</code> to get
 	 * @return the specified <code>IResource</code> or <code>null</code> if it does not exist
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	protected IResource getResource(String name) {
 		return ResourcesPlugin.getWorkspace().getRoot().findMember(new Path("/DebugTests/src/"+name));
 	}
-	
+
 	/**
 	 * Creates and returns a class prepare breakpoint on the type with the given fully qualified name.
-	 * 
+	 *
 	 * @param typeName type on which to create the breakpoint
 	 * @return breakpoint
 	 * @throws Exception
@@ -1849,10 +1861,10 @@
 	protected IJavaClassPrepareBreakpoint createClassPrepareBreakpoint(String typeName) throws Exception {
 		return createClassPrepareBreakpoint(getType(typeName));
 	}
-	
+
 	/**
 	 * Creates and returns a class prepare breakpoint on the type with the given fully qualified name.
-	 * 
+	 *
 	 * @param typeName type on which to create the breakpoint
 	 * @return breakpoint
 	 * @throws Exception
@@ -1863,23 +1875,23 @@
 		IType type = (IType)getMember(cunit,fullTargetName);
 		assertTrue("Target type not found", type.exists()); //$NON-NLS-1$
 		return createClassPrepareBreakpoint(type);
-	}	
-	
+	}
+
 	/**
 	 * Creates a class prepare breakpoint in a fully specified type (potentially non public).
-	 * 
+	 *
 	 * @param packageName package name containing type to install breakpoint in, example "a.b.c"
 	 * @param cuName simple compilation unit name within package, example "Something.java"
 	 * @param typeName $ qualified type name within compilation unit, example "Something" or
 	 *  "NonPublic" or "Something$Inner"
-	 */	
+	 */
 	protected IJavaClassPrepareBreakpoint createClassPrepareBreakpoint(String packageName, String cuName, String typeName) throws Exception {
 		return createClassPrepareBreakpoint(getType(packageName, cuName, typeName));
 	}
-	
+
 	/**
 	 * Creates a class prepare breakpoint for the given type
-	 * 
+	 *
 	 * @param type type
 	 * @return class prepare breakpoint
 	 * @throws Exception
@@ -1895,11 +1907,11 @@
 		forceDeltas(bp);
 		return bp;
 	}
-	
+
 	/**
 	 * Returns the Java model type from the test project with the given name or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param typeName
 	 * @return type or <code>null</code>
 	 * @throws Exception
@@ -1907,27 +1919,27 @@
 	protected IType getType(String typeName) throws Exception {
 		return getProjectContext().findType(typeName);
 	}
-	
+
 	/**
 	 * Creates and returns a watchpoint
-	 * 
+	 *
 	 * @param typeNmae type name
 	 * @param fieldName field name
 	 * @param access whether to suspend on field access
 	 * @param modification whether to suspend on field modification
-	 */	
+	 */
 	protected IJavaWatchpoint createWatchpoint(String typeName, String fieldName, boolean access, boolean modification) throws Exception {
 		IType type = getType(typeName);
 		return createWatchpoint(type, fieldName, access, modification);
 	}
-	
+
 	/**
 	 * Creates and returns an exception breakpoint
-	 * 
+	 *
 	 * @param exName exception name
 	 * @param caught whether to suspend in caught locations
 	 * @param uncaught whether to suspend in uncaught locations
-	 */	
+	 */
 	protected IJavaExceptionBreakpoint createExceptionBreakpoint(String exName, boolean caught, boolean uncaught) throws Exception {
 		IType type = getType(exName);
 		Map<String, Object> map = getExtraBreakpointAttributes(type);
@@ -1935,15 +1947,15 @@
 		forceDeltas(bp);
 		return bp;
 	}
-	
+
 	/**
 	 * Creates and returns a watchpoint
-	 * 
+	 *
 	 * @param typeNmae type name
 	 * @param fieldName field name
 	 * @param access whether to suspend on field access
 	 * @param modification whether to suspend on field modification
-	 */	
+	 */
 /*	protected IJavaWatchpoint createWatchpoint(String typeName, String fieldName, boolean access, boolean modification) throws Exception {
 		IType type = getType(typeName);
 		return createWatchpoint(type, fieldName, access, modification);
@@ -1953,17 +1965,17 @@
 	/**
 	 * Creates a WatchPoint on the field specified at the given path.
 	 * Will create watchpoints on fields within anonymous types, inner types,
-	 * local (non-public) types, and public types.  
+	 * local (non-public) types, and public types.
 	 * @param root
 	 * @param packageName package name containing type to install breakpoint in, example "a.b.c"
 	 * @param cuName simple compilation unit name within package, example "Something.java"
 	 * @param fullTargetName - see below
-	 * @param access whether to suspend on access 
+	 * @param access whether to suspend on access
 	 * @param modification whether to suspend on modification
 	 * @return a watchpoint
 	 * @throws Exception
 	 * @throws CoreException
-	 * 
+	 *
 	 * <p>
 	 * <pre>
 	 * Syntax example:
@@ -1976,17 +1988,17 @@
 	 * 			{
 	 * 				Object anon = new Object(){
 	 * 					int anIntField;
-	 * 					String anonTypeMethod() {return "an Example";}				
+	 * 					String anonTypeMethod() {return "an Example";}
 	 * 				}
 	 * 			}
 	 * 		}
 	 * }</pre>
 	 * </p>
-	 * To get the anonymous toString, syntax of fullTargetName would be: <code>Foo$Inner$aMethod()V$1$anIntField</code> 
+	 * To get the anonymous toString, syntax of fullTargetName would be: <code>Foo$Inner$aMethod()V$1$anIntField</code>
 	 */
-	protected IJavaWatchpoint createNestedTypeWatchPoint(String root, String packageName, String cuName, 
+	protected IJavaWatchpoint createNestedTypeWatchPoint(String root, String packageName, String cuName,
 			String fullTargetName, boolean access, boolean modification) throws Exception, CoreException {
-		
+
 		ICompilationUnit cunit = getCompilationUnit(getProjectContext(), root, packageName, cuName);
 		IField field = (IField)getMember(cunit,fullTargetName);
 		assertNotNull("Path to field is not valid", field); //$NON-NLS-1$
@@ -1994,27 +2006,27 @@
 		IType type = (IType)field.getParent();
 		return createWatchpoint(type, field.getElementName(), access, modification);
 	}
-	
+
 
 	/**
 	 * Creates a watchpoint in a fully specified type (potentially non public).
-	 * 
+	 *
 	 * @param packageName package name containing type to install breakpoint in, example "a.b.c"
 	 * @param cuName simple compilation unit name within package, example "Something.java"
 	 * @param typeName $ qualified type name within compilation unit, example "Something" or
 	 *  "NonPublic" or "Something$Inner"
 	 * @param fieldName name of the field
-	 * @param access whether to suspend on access 
+	 * @param access whether to suspend on access
 	 * @param modification whether to suspend on modification
-	 */		
+	 */
 	protected IJavaWatchpoint createWatchpoint(String packageName, String cuName, String typeName, String fieldName, boolean access, boolean modification) throws Exception {
 		IType type = getType(packageName, cuName, typeName);
 		return createWatchpoint(type, fieldName, access, modification);
 	}
-	
+
 	/**
 	 * Creates a watchpoint on the specified field.
-	 * 
+	 *
 	 * @param type type containing the field
 	 * @param fieldName name of the field
 	 * @param access whether to suspend on access
@@ -2031,8 +2043,8 @@
 		wp.setModification(modification);
 		forceDeltas(wp);
 		return wp;
-	}	
-		
+	}
+
 	/**
 	 * Terminates the given thread and removes its launch
 	 */
@@ -2041,10 +2053,10 @@
 			terminateAndRemove((IJavaDebugTarget)thread.getDebugTarget());
 		}
 	}
-	
+
 	/**
 	 * Terminates the given debug target and removes its launch.
-	 * 
+	 *
 	 * NOTE: all breakpoints are removed, all threads are resumed, and then
 	 * the target is terminated. This avoids defunct processes on Linux.
 	 */
@@ -2054,7 +2066,7 @@
 		if (!(debugTarget.isTerminated() || debugTarget.isDisconnected())) {
 			IPreferenceStore jdiUIPreferences = JDIDebugUIPlugin.getDefault().getPreferenceStore();
 			jdiUIPreferences.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
-			
+
 			DebugEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.TERMINATE, debugTarget);
 			try {
 				removeAllBreakpoints();
@@ -2079,7 +2091,7 @@
         DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(this, DebugEvent.MODEL_SPECIFIC)});
         waiter.waitForEvent();
 	}
-	
+
 	/**
 	 * Deletes all existing breakpoints
 	 */
@@ -2090,11 +2102,11 @@
 		} catch (CoreException e) {
 		}
 	}
-	
+
 	/**
 	 * Returns the first breakpoint the given thread is suspended
 	 * at, or <code>null</code> if none.
-	 * 
+	 *
 	 * @return the first breakpoint the given thread is suspended
 	 * at, or <code>null</code> if none
 	 */
@@ -2105,11 +2117,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Evaluates the given snippet in the context of the given stack frame and returns
 	 * the result.
-	 * 
+	 *
 	 * @param snippet code snippet
 	 * @param frame stack frame context
 	 * @return evaluation result
@@ -2117,11 +2129,11 @@
 	protected IEvaluationResult evaluate(String snippet, IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.SUSPEND, IJavaThread.class);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		IAstEvaluationEngine engine = EvaluationManager.newAstEvaluationEngine(getProjectContext(), (IJavaDebugTarget)frame.getDebugTarget());
 		try {
 			engine.evaluate(snippet, frame, this, DebugEvent.EVALUATION, true);
-	
+
 			Object suspendee= waiter.waitForEvent();
 			setEventSet(waiter.getEventSet());
 			if(suspendee == null) {
@@ -2133,8 +2145,8 @@
 		finally {
 			engine.dispose();
 		}
-	}		
-	
+	}
+
 	/**
 	 * Runs an evaluation using an embedded listener and the {@link #DEFAULT_TIMEOUT} for the operation
 	 * @param snippet the snippet to evaluate
@@ -2167,7 +2179,7 @@
 			engine.dispose();
 		}
 	}
-	
+
 	/**
 	 * @see IEvaluationListener#evaluationComplete(IEvaluationResult)
 	 */
@@ -2175,96 +2187,96 @@
 	public void evaluationComplete(IEvaluationResult result) {
 		fEvaluationResult = result;
 	}
-	
+
 	/**
 	 * Performs a step over in the given stack frame and returns when complete.
-	 * 
+	 *
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepOver(IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.STEP_END);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		frame.stepOver();
-		
+
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
 		return (IJavaThread) suspendee;
 	}
-	
+
 	/**
 	 * Performs a step over in the given stack frame and returns when a breakpoint is hit.
-	 * 
+	 *
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepOverToBreakpoint(IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		frame.stepOver();
-		
+
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
 		return (IJavaThread) suspendee;
-	}	
+	}
 
 	/**
 	 * Performs a step into in the given stack frame and returns when complete.
-	 * 
+	 *
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepInto(IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.STEP_END);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		frame.stepInto();
-		
+
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
-		return (IJavaThread) suspendee;		
+		return (IJavaThread) suspendee;
 	}
-	
+
 	/**
 	 * Performs a step return in the given stack frame and returns when complete.
-	 * 
+	 *
 	 * @param frame stack frame to step return from
 	 */
 	protected IJavaThread stepReturn(IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.STEP_END);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		frame.stepReturn();
-		
+
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
 		return (IJavaThread) suspendee;
-	}	
-	
+	}
+
 	/**
 	 * Performs a step into with filters in the given stack frame and returns when
 	 * complete.
-	 * 
+	 *
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepIntoWithFilters(IJavaStackFrame frame) throws Exception {
 		return stepIntoWithFilters(frame, true);
 	}
-	
+
 	/**
 	 * Performs a step into with filters in the given stack frame and returns when
 	 * complete.
-	 * 
+	 *
 	 * @param whether to step thru or step return from a filtered location
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepIntoWithFilters(IJavaStackFrame frame, boolean stepThru) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.SUSPEND, IJavaThread.class);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		// turn filters on
 		IJavaDebugTarget target = (IJavaDebugTarget) frame.getDebugTarget();
 		try {
@@ -2283,18 +2295,18 @@
 			target.setStepThruFilters(true);
 		}
 		return null;
-	}	
+	}
 
 	/**
 	 * Performs a step return with filters in the given stack frame and returns when
 	 * complete.
-	 * 
+	 *
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepReturnWithFilters(IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.SUSPEND, IJavaThread.class);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		// turn filters on
 		IJavaDebugTarget target = (IJavaDebugTarget) frame.getDebugTarget();
 		try {
@@ -2306,24 +2318,24 @@
 			// turn filters off
 			target.setStepFiltersEnabled(false);
 		}
-		
-		
+
+
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
-		return (IJavaThread) suspendee;		
-	}	
-	
+		return (IJavaThread) suspendee;
+	}
+
 	/**
 	 * Performs a step over with filters in the given stack frame and returns when
 	 * complete.
-	 * 
+	 *
 	 * @param frame stack frame to step in
 	 */
 	protected IJavaThread stepOverWithFilters(IJavaStackFrame frame) throws Exception {
 		DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.SUSPEND, IJavaThread.class);
 		waiter.setTimeout(DEFAULT_TIMEOUT);
-		
+
 		// turn filters on
 		IJavaDebugTarget target = (IJavaDebugTarget) frame.getDebugTarget();
 		try {
@@ -2335,17 +2347,17 @@
 			// turn filters off
 			target.setStepFiltersEnabled(false);
 		}
-		
-		
+
+
 		Object suspendee= waiter.waitForEvent();
 		setEventSet(waiter.getEventSet());
 		assertNotNull("Program did not suspend.", suspendee); //$NON-NLS-1$
-		return (IJavaThread) suspendee;		
+		return (IJavaThread) suspendee;
 	}
 
 	/**
 	 * Returns the compilation unit with the given name.
-	 * 
+	 *
 	 * @param project the project containing the CU
 	 * @param root the name of the source folder in the project
 	 * @param pkg the name of the package (empty string for default package)
@@ -2357,7 +2369,7 @@
 		IResource r = p.getFolder(root);
 		return project.getPackageFragmentRoot(r).getPackageFragment(pkg).getCompilationUnit(name);
 	}
-	
+
     /**
      * Wait for builds to complete
      */
@@ -2374,9 +2386,9 @@
                 wasInterrupted = true;
             }
         } while (wasInterrupted);
-    }	
-    
-    
+    }
+
+
     /**
      * Finds the specified variable within the context of the specified stackframe. Returns null if a variable with
      * the given name does not exist
@@ -2411,7 +2423,7 @@
         }
         return variable;
     }
-	
+
 	/**
 	 * Returns if the local filesystem is case-sensitive or not
 	 * @return true if the local filesystem is case-sensitive, false otherwise
@@ -2419,14 +2431,14 @@
 	protected boolean isFileSystemCaseSensitive() {
 		return Platform.OS_MACOSX.equals(Platform.getOS()) ? false : new File("a").compareTo(new File("A")) != 0; //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
     /**
      * Creates a shared launch configuration for the type with the given name.
      */
     protected ILaunchConfiguration createLaunchConfiguration(String mainTypeName) throws Exception {
         return createLaunchConfiguration(getProjectContext(), mainTypeName);
     }
-    
+
     /**
      * Creates a shared launch configuration for the type with the given name.
      */
@@ -2447,7 +2459,7 @@
         map.put(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, JAVA);
         config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);
         return config.doSave();
-    }    
+    }
 
     /**
      * Creates a shared launch configuration for the type with the given name.
@@ -2470,7 +2482,7 @@
         config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);
         return config.doSave();
     }
-    
+
 	/**
 	 * When a test throws the 'try again' exception, try it again.
 	 * @see junit.framework.TestCase#runBare()
@@ -2485,20 +2497,37 @@
 				super.runBare();
 				tryAgain = false;
 			} catch (TestAgainException e) {
-				Status status = new Status(IStatus.ERROR, "org.eclipse.jdt.debug.tests", "Test failed attempt " + attempts + ". Re-testing: " + this.getName(), e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				TestUtil.cleanUp();
-				DebugPlugin.log(status);
+				TestUtil.log(IStatus.ERROR, getName(), "Test failed attempt " + attempts + ". Re-testing.", e);
+				TestUtil.cleanUp(getName());
 				if (attempts > 5) {
 					tryAgain = false;
 				}
 			}
 		}
 	}
-    
+
+	@Override
+	protected void tearDown() throws Exception {
+		TestUtil.log(IStatus.INFO, getName(), "tearDown");
+		shutdownDebugTargets();
+		TestUtil.cleanUp(getName());
+		super.tearDown();
+	}
+
+	protected void shutdownDebugTargets() {
+		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+		IDebugTarget[] targets = launchManager.getDebugTargets();
+		for (IDebugTarget target : targets) {
+			if (target instanceof JDIDebugTarget) {
+				((JDIDebugTarget) target).shutdown();
+			}
+		}
+	}
+
 	/**
 	 * Opens and returns an editor on the given file or <code>null</code>
 	 * if none. The editor will be activated.
-	 * 
+	 *
 	 * @param file
 	 * @return editor or <code>null</code>
 	 */
@@ -2525,14 +2554,14 @@
 		job.join();
 		return parts[0];
 	}
-	
+
 	/**
 	 * Opens the {@link IDebugView} with the given id, does nothing if no such view exists.
 	 * This method can return <code>null</code>
-	 * 
+	 *
 	 * @param viewId
 	 * @return the handle to the {@link IDebugView} with the given id
-	 * @throws PartInitException 
+	 * @throws PartInitException
 	 * @throws InterruptedException
 	 * @since 3.8.100
 	 */
@@ -2561,7 +2590,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Opens a debug view
 	 * @param viewId
@@ -2578,11 +2607,11 @@
 		}
 		return null;
 	}
- 	
+
 	/**
 	 * Toggles a breakpoint in the editor at the given line number returning the breakpoint
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param editor
 	 * @param lineNumber
 	 * @return returns the created breakpoint or <code>null</code> if none.
@@ -2624,7 +2653,7 @@
 		manager.removeBreakpointListener(listener);
 		return breakpoints[0];
 	}
-	
+
 	/**
 	 * Closes all editors in the active workbench page.
 	 */
@@ -2639,11 +2668,11 @@
         Display display = DebugUIPlugin.getStandardDisplay();
         display.syncExec(closeAll);
 	}
-    
+
 	/**
 	 * Returns the version level of the class files being run, based on the system property <code>java.class.version</code>
 	 * @return the version level of the class files being run in the current VM
-	 *  
+	 *
 	 *  @since 3.6
 	 */
 	protected String getClassFileVersion() {
@@ -2656,11 +2685,11 @@
 		}
 		return JavaCore.VERSION_1_6;
 	}
-	
+
 	/**
 	 * Determines if the test should be attempted again based on the error code.
 	 * See bug 297071.
-	 * 
+	 *
 	 * @param e Debug Exception
 	 * @throws TestAgainException
 	 * @throws DebugException
@@ -2675,7 +2704,7 @@
 		}
 		throw e;
 	}
-	
+
 	/**
 	 * Perform the actual evaluation (inspect)
 	 * @param thread
@@ -2685,12 +2714,12 @@
 	protected IValue doEval(IJavaThread thread, String snippet) throws Exception{
 		class Listener implements IEvaluationListener {
 			IEvaluationResult fResult;
-			
+
 			@Override
 			public void evaluationComplete(IEvaluationResult result) {
 				fResult= result;
 			}
-			
+
 			public IEvaluationResult getResult() {
 				return fResult;
 			}
@@ -2717,6 +2746,6 @@
 			engine.dispose();
 		}
 	}
-	
+
 }
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
index 294d34d..be248dc 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
@@ -133,7 +133,7 @@
  * Tests for integration and nightly builds.
  */
 public class AutomatedSuite extends DebugSuite {
-	
+
 	/**
 	 * Returns the suite.  This is required to
 	 * use the JUnit Launcher.
@@ -148,9 +148,9 @@
 	 */
 	public AutomatedSuite() {
 		addTest(new TestSuite(ProjectCreationDecorator.class));
-			
+
 	//Launching tests
-		
+
 		addTest(new TestSuite(LaunchModeTests.class));
 		addTest(new TestSuite(LaunchDelegateTests.class));
 		addTest(new TestSuite(LaunchShortcutTests.class));
@@ -164,12 +164,12 @@
 		addTest(new TestSuite(LaunchConfigurationManagerTests.class));
 		addTest(new TestSuite(LaunchConfigurationTests.class));
 		addTest(new TestSuite(ProjectClasspathVariableTests.class));
-		
+
 	//mac specific tests
 		if(Platform.OS_MACOSX.equals(Platform.getOS())) {
 			addTest(new TestSuite(PListParserTests.class));
 		}
-		
+
 	//Breakpoints tests
 		addTest(new TestSuite(TypeNameBreakpointTests.class));
 		addTest(new TestSuite(DeferredBreakpointTests.class));
@@ -205,7 +205,7 @@
 			addTest(new TestSuite(DetailFormatterTests.class));
 			addTest(new TestSuite(AlternateStratumTests.class));
 		}
-		
+
 	//Sourcelookup tests
 		addTest(new TestSuite(SourceLookupTests.class));
 		addTest(new TestSuite(FolderSourceContainerTests.class));
@@ -220,7 +220,7 @@
 		addTest(new TestSuite(SourceLocationTests.class));
 		addTest(new TestSuite(TypeResolutionTests.class));
 		addTest(new TestSuite(JarSourceLookupTests.class));
-		
+
 	// Variable tests
 		addTest(new TestSuite(InstanceVariableTests.class));
 		addTest(new TestSuite(LocalVariableTests.class));
@@ -232,7 +232,7 @@
 		if(JavaProjectHelper.isJava7Compatible()) {
 			addTest(new TestSuite(LiteralTests17.class));
 		}
-		
+
 	//Stepping tests
 		addTest(new TestSuite(StepFilterTests.class));
 		addTest(new TestSuite(StepIntoSelectionTests.class));
@@ -240,7 +240,7 @@
 		if (JavaProjectHelper.isJava6Compatible()) {
 			addTest(new TestSuite(ForceReturnTests.class));
 		}
-		
+
 	//Classpath tests
 		addTest(new TestSuite(JavaLibraryPathTests.class));
 		addTest(new TestSuite(ClasspathVariableTests.class));
@@ -249,7 +249,7 @@
 		addTest(new TestSuite(ClasspathProviderTests.class));
 		addTest(new TestSuite(BootpathTests.class));
 		addTest(new TestSuite(EEDefinitionTests.class));
-		
+
 	//VM Install/Environment tests
 		addTest(new TestSuite(VMInstallTests.class));
 		addTest(new TestSuite(StringSubstitutionTests.class));
@@ -274,7 +274,7 @@
 		addTest(new TestSuite(StratumTests.class));
 		addTest(new TestSuite(JavaDebugTargetTests.class));
 		addTest(new TestSuite(WorkingDirectoryTests.class));
-		
+
 	// Refactoring tests
 		//TODO: project rename
 		//TODO: package move
@@ -302,29 +302,29 @@
 		//addTest(new TestSuite(ConvertPublicAnonymousTypeToNestedUnitTests.class));
 		//addTest(new TestSuite(ConvertInnerAnonymousTypeToNestedUnitTests.class));
 		//addTest(new TestSuite(ConvertNonPublicAnonymousTypeToNestedUnitTests.class));
-		
+
 	// JDWP tests
 		addTest(new TestSuite(JDWPTests.class));
 		addTest(new TestSuite(MultipleConnectionsTest.class));
 	// Refresh state tests
 		addTest(new TestSuite(RefreshStateTests.class));
-		
+
 	// HCR tests are last - they modify resources
 		addTest(new TestSuite(HcrTests.class));
-		
+
 	// Layout tests
 		addTest(new TestSuite(ViewManagementTests.class));
-		
+
 	// Leak tests
 		addTest(new TestSuite(InstructionPointerTests.class));
-		
+
 	// Variables View Detail Pane tests
 		addTest(DetailPaneManagerTests.suite());
 		addTest(new TestSuite(ModelPresentationTests.class));
 
 	// Open from Clipboard action tests - Need to use #suite() because the test has a custom setup
 		addTest(OpenFromClipboardTests.suite());
-	
+
 	//add the complete eval suite
 		addTest(new TestSuite(GeneralEvalTests.class));
 		//addTest(EvalTestSuite.suite());
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java
index 3ca96e3..7c4345a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
  * Debug test suite framework that runs test in a non UI thread.
  */
 public abstract class DebugSuite extends TestSuite {
-	
+
 	/**
 	 * Flag that indicates test are in progress
 	 */
@@ -34,7 +34,7 @@
 	 */
 	public DebugSuite() {
 	}
-	
+
 	/**
 	 * Runs the tests and collects their result in a TestResult.
 	 * The debug tests cannot be run in the UI thread or the event
@@ -55,7 +55,7 @@
 						}
 						Test test= e.nextElement();
 						runTest(test, result);
-					}					
+					}
 					fTesting = false;
 					display.wake();
 				}
@@ -65,7 +65,7 @@
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-				
+
 		while (fTesting) {
 			try {
 				if (!display.readAndDispatch()) {
@@ -73,8 +73,8 @@
 				}
 			} catch (Throwable e) {
 				e.printStackTrace();
-			}			
-		}		
+			}
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/EvalTestSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/EvalTestSuite.java
index 414aeac..7cd7ae8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/EvalTestSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/EvalTestSuite.java
@@ -4,11 +4,11 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- *  
+ *
  * This is an implementation of an early-draft specification developed under the Java
  * Community Process (JCP) and is made available for testing and evaluation purposes
  * only. The code is not compatible with any specification of the JCP.
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S. Møller - bug 422029: [1.8] Enable debug evaluation support for default methods
@@ -141,7 +141,7 @@
 		addTest(new TestSuite(TestsNestedTypes2.class));
 		addTest(new TestSuite(TestsTypeHierarchy1.class));
 		addTest(new TestSuite(TestsTypeHierarchy2.class));
-		
+
 		// Extended evaluation tests
 		addTest(new TestSuite(BooleanOperatorsTests.class));
 		addTest(new TestSuite(ByteOperatorsTests.class));
@@ -224,18 +224,18 @@
 		addTest(new TestSuite(TypeHierarchy_68_3.class));
 		addTest(new TestSuite(TypeHierarchy_119_1.class));
 		addTest(new TestSuite(TypeHierarchy_146_1.class));
-		
+
 		addTest(new TestSuite(TestsNumberLiteral.class));
 
 		addTest(new TestSuite(VariableDeclarationTests.class));
 		addTest(new TestSuite(LoopTests.class));
 		addTest(new TestSuite(LabelTests.class));
 		addTest(new TestSuite(TestsAnonymousClassVariable.class));
-		
+
 		addTest(new TestSuite(TestsBreakpointConditions.class));
 
 	}
-	
+
 	/**
 	 * Runs the tests and collects their result in a TestResult.
 	 * The debug tests cannot be run in the UI thread or the event
@@ -255,7 +255,7 @@
 							break;
 						}
 						runTest(e.nextElement(), result);
-					}					
+					}
 					fTesting = false;
 					display.wake();
 				}
@@ -265,7 +265,7 @@
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-				
+
 		while (fTesting) {
 			try {
 				if (!display.readAndDispatch()) {
@@ -273,8 +273,8 @@
 				}
 			} catch (Throwable e) {
 				e.printStackTrace();
-			}			
-		}		
+			}
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ManualSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ManualSuite.java
index d9a35fb..6b51e91 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ManualSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ManualSuite.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
  * automated tests.
  */
 public class ManualSuite extends TestSuite {
-	
+
 	/**
 	 * Flag that indicates test are in progress
 	 */
@@ -44,7 +44,7 @@
 	 */
 	public ManualSuite() {
 		addTest(new TestSuite(ProjectCreationDecorator.class));
-		
+
 		/**
 		 * This test appears in the manual suite as wee need to be able to specify ports
 		 * and security settings to make sure the client can connect
@@ -52,7 +52,7 @@
 		addTest(new TestSuite(RemoteJavaApplicationTests.class));
 
 	}
-	
+
 	/**
 	 * Runs the tests and collects their result in a TestResult.
 	 * The debug tests cannot be run in the UI thread or the event
@@ -73,7 +73,7 @@
 						}
 						Test test= e.nextElement();
 						runTest(test, result);
-					}					
+					}
 					fTesting = false;
 					display.wake();
 				}
@@ -83,7 +83,7 @@
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-				
+
 		while (fTesting) {
 			try {
 				if (!display.readAndDispatch()) {
@@ -91,8 +91,8 @@
 				}
 			} catch (Throwable e) {
 				e.printStackTrace();
-			}			
-		}		
+			}
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java
index 91c4ddd..d37c7d3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java
index 08d07c2..ed12c13 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java
@@ -40,17 +40,17 @@
     public ProjectCreationDecorator() {
         super("Project creation decorator tests");
     }
-    
+
     /* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.tests.AbstractDebugTest#getProjectContext()
 	 */
 	@Override
 	protected IJavaProject getProjectContext() {
 		return get14Project();
-	}	
-    
+	}
+
     /**
-     * 
+     *
      */
     public void testPerspectiveSwtich() {
         DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestAgainException.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestAgainException.java
index b8767df..25125bf 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestAgainException.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestAgainException.java
@@ -12,7 +12,7 @@
 
 /**
  * Exception to indicate a test should be run again when it fails.
- * 
+ *
  * @since 3.3
  */
 public class TestAgainException extends RuntimeException {
@@ -26,7 +26,7 @@
 	}
 
 	/**
-	 * Generated serial version id 
+	 * Generated serial version id
 	 */
 	private static final long serialVersionUID = 1848804390493463729L;
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java
index 7b3b088..c9417c4 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java
@@ -10,30 +10,53 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.tests;
 
-import java.util.concurrent.TimeUnit;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
 import org.eclipse.swt.widgets.Display;
 import org.junit.Assert;
 
 public class TestUtil {
+
 	/**
 	 * Call this in the tearDown method of every test to clean up state that can
 	 * otherwise leak through SWT between tests.
 	 */
-	public static void cleanUp() {
+	public static void cleanUp(String owner) {
 		// Ensure that the Thread.interrupted() flag didn't leak.
 		Assert.assertFalse("The main thread should not be interrupted at the end of a test", Thread.interrupted());
+
 		// Wait for any outstanding jobs to finish. Protect against deadlock by
 		// terminating the wait after a timeout.
-		boolean timedOut = waitForJobs(0, TimeUnit.MINUTES.toMillis(3));
-		Assert.assertFalse("Some Job did not terminate at the end of the test", timedOut);
-		// Wait for any pending *syncExec calls to finish
-		runEventLoop();
+		boolean timedOut = waitForJobs(owner, 5, 5000);
+		if (timedOut) {
+			// We don't expect any extra jobs run during the test: try to cancel them
+			log(IStatus.INFO, owner, "Trying to cancel running jobs: " + getRunningOrWaitingJobs(null));
+			getRunningOrWaitingJobs(null).forEach(job -> job.cancel());
+			waitForJobs(owner, 5, 1000);
+		}
+
 		// Ensure that the Thread.interrupted() flag didn't leak.
 		Assert.assertFalse("The main thread should not be interrupted at the end of a test", Thread.interrupted());
 	}
 
+	public static void log(int severity, String owner, String message, Throwable... optionalError) {
+		message = "[" + owner + "] " + message;
+		Throwable error = null;
+		if (optionalError != null && optionalError.length > 0) {
+			error = optionalError[0];
+		}
+		Status status = new Status(severity, JavaTestPlugin.getDefault().getBundle().getSymbolicName(), message, error);
+		JavaTestPlugin.getDefault().getLog().log(status);
+	}
+
 	/**
 	 * Process all queued UI events. If called from background thread, does
 	 * nothing.
@@ -48,19 +71,37 @@
 	}
 
 	/**
-	 * 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
-	 * given minimum wait time. While this method is waiting for jobs, UI events
-	 * are processed.
+	 * 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
+	 * given minimum wait time. While this method is waiting for jobs, UI events are processed.
 	 *
+	 * @param owner
+	 *            name of the caller which will be logged as prefix if the wait times out
 	 * @param minTimeMs
 	 *            minimum wait time in milliseconds
 	 * @param maxTimeMs
 	 *            maximum wait time in milliseconds
-	 * @return true if the method timed out, false if all the jobs terminated
-	 *         before the timeout
+	 * @return true if the method timed out, false if all the jobs terminated before the timeout
 	 */
-	public static boolean waitForJobs(long minTimeMs, long maxTimeMs) {
+	public static boolean waitForJobs(String owner, long minTimeMs, long maxTimeMs) {
+		return waitForJobs(owner, minTimeMs, maxTimeMs, (Object[]) null);
+	}
+
+	/**
+	 * 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
+	 * given minimum wait time. While this method is waiting for jobs, UI events are processed.
+	 *
+	 * @param owner
+	 *            name of the caller which will be logged as prefix if the wait times out
+	 * @param minTimeMs
+	 *            minimum wait time in milliseconds
+	 * @param maxTimeMs
+	 *            maximum wait time in milliseconds
+	 * @param excludedFamilies
+	 *            optional list of job families to NOT wait for
+	 *
+	 * @return true if the method timed out, false if all the jobs terminated before the timeout
+	 */
+	public static boolean waitForJobs(String owner, long minTimeMs, long maxTimeMs, Object... excludedFamilies) {
 		if (maxTimeMs < minTimeMs) {
 			throw new IllegalArgumentException("Max time is smaller as min time!");
 		}
@@ -68,22 +109,89 @@
 		while (System.currentTimeMillis() - start < minTimeMs) {
 			runEventLoop();
 			try {
-				Thread.sleep(100);
+				Thread.sleep(Math.min(10, minTimeMs));
 			} catch (InterruptedException e) {
 				// Uninterruptable
 			}
 		}
 		while (!Job.getJobManager().isIdle()) {
+			List<Job> jobs = getRunningOrWaitingJobs(null, excludedFamilies);
+			if (jobs.isEmpty()) {
+				// only uninteresting jobs running
+				break;
+			}
+
+			if (!Collections.disjoint(runningJobs, jobs)) {
+				// There is a job which runs already quite some time, don't wait for it to avoid test timeouts
+				dumpRunningOrWaitingJobs(owner, jobs);
+				return true;
+			}
+
 			if (System.currentTimeMillis() - start >= maxTimeMs) {
+				dumpRunningOrWaitingJobs(owner, jobs);
 				return true;
 			}
 			runEventLoop();
 			try {
-				Thread.sleep(100);
+				Thread.sleep(10);
 			} catch (InterruptedException e) {
 				// Uninterruptable
 			}
 		}
+		runningJobs.clear();
 		return false;
 	}
+
+	static Set<Job> runningJobs = new LinkedHashSet<>();
+
+	private static void dumpRunningOrWaitingJobs(String owner, List<Job> jobs) {
+		String message = "Some job is still running or waiting to run: " + dumpRunningOrWaitingJobs(jobs);
+		log(IStatus.ERROR, owner, message);
+	}
+
+	private static String dumpRunningOrWaitingJobs(List<Job> jobs) {
+		if (jobs.isEmpty()) {
+			return "";
+		}
+		// clear "old" running jobs, we only remember most recent
+		runningJobs.clear();
+		StringBuilder sb = new StringBuilder();
+		for (Job job : jobs) {
+			runningJobs.add(job);
+			sb.append("'").append(job.getName()).append("'/");
+			sb.append(job.getClass().getName());
+			sb.append(", ");
+		}
+		sb.setLength(sb.length() - 2);
+		return sb.toString();
+	}
+
+	private static List<Job> getRunningOrWaitingJobs(Object jobFamily, Object... excludedFamilies) {
+		List<Job> running = new ArrayList<>();
+		Job[] jobs = Job.getJobManager().find(jobFamily);
+		for (Job job : jobs) {
+			if (isRunningOrWaitingJob(job) && !belongsToFamilies(job, excludedFamilies)) {
+				running.add(job);
+			}
+		}
+		return running;
+	}
+
+	private static boolean isRunningOrWaitingJob(Job job) {
+		int state = job.getState();
+		return (state == Job.RUNNING || state == Job.WAITING);
+	}
+
+	private static boolean belongsToFamilies(Job job, Object... excludedFamilies) {
+		if (excludedFamilies == null || excludedFamilies.length == 0) {
+			return false;
+		}
+		for (Object family : excludedFamilies) {
+			if (job.belongsTo(family)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/VerticalRulerInfoStub.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/VerticalRulerInfoStub.java
index 57b62e2..758e4d9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/VerticalRulerInfoStub.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/VerticalRulerInfoStub.java
@@ -14,12 +14,12 @@
 import org.eclipse.swt.widgets.Control;
 
 /**
- * 
+ *
  */
 public class VerticalRulerInfoStub implements IVerticalRulerInfo {
-	
+
 	private int fLineNumber = -1;
-	
+
 	public VerticalRulerInfoStub(int line) {
 		fLineNumber = line;
 	}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractBreakpointWorkingSetTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractBreakpointWorkingSetTest.java
index 3453a03..51f2f01 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractBreakpointWorkingSetTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractBreakpointWorkingSetTest.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 
 /**
  * Common code for breakpoint working set tests.
- *  
+ *
  * @since 3.2
  */
 public abstract class AbstractBreakpointWorkingSetTest extends AbstractDebugTest {
@@ -31,11 +31,11 @@
 	public AbstractBreakpointWorkingSetTest(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Creates and returns a breakpoint working set with the given name if not
 	 * already in existence.
-	 * 
+	 *
 	 * @param name working set name
 	 */
 	protected IWorkingSet createSet(String name) {
@@ -51,7 +51,7 @@
 
 	/**
 	 * Retruns the working set manager.
-	 * 
+	 *
 	 * @return working set manager
 	 */
 	protected IWorkingSetManager getWorkingSetManager() {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractToggleBreakpointsTarget.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractToggleBreakpointsTarget.java
index fa67722..9a07b6f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractToggleBreakpointsTarget.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/AbstractToggleBreakpointsTarget.java
@@ -37,9 +37,9 @@
  * Tests the Java debugger's 'toggle breakpoints target'.
  */
 public abstract class AbstractToggleBreakpointsTarget extends AbstractDebugTest {
-	
+
 	class Listener implements IBreakpointListener {
-		
+
 		List<IBreakpoint> added = new ArrayList<IBreakpoint>();
 		List<IBreakpoint> removed = new ArrayList<IBreakpoint>();
 
@@ -62,7 +62,7 @@
 		@Override
 		public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
 		}
-		
+
 		public IBreakpoint getAdded() throws Exception {
 			synchronized (added) {
 				if (added.isEmpty()) {
@@ -72,7 +72,7 @@
 			assertFalse("Breakpoint not added", added.isEmpty());
 			return added.get(0);
 		}
-		
+
 		public boolean isEmpty() throws Exception{
 			synchronized (added) {
 				if (added.isEmpty()) {
@@ -83,7 +83,7 @@
 			return false;
 
 		}
-		
+
 		public IBreakpoint getRemoved() throws Exception {
 			synchronized (removed) {
 				if (removed.isEmpty()) {
@@ -93,18 +93,18 @@
 			assertFalse("Breakpoint not removed", removed.isEmpty());
 			return removed.get(0);
 		}
-		
-		
+
+
 	}
 
 	public AbstractToggleBreakpointsTarget(String name) {
 		super(name);
 	}
-	
-		
+
+
 	/**
 	 * Opens an editor on the given external file and toggles a breakpoint.
-	 * 
+	 *
 	 * @param externalFile path to external file in the test plug-in
 	 * @param line line number (1 based)
 	 * @throws Exception on failure
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointFieldLocator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointFieldLocator.java
index 4ab5c19..9242b10 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointFieldLocator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointFieldLocator.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,11 +29,11 @@
  * Compute the name of field declared at a given position from an JDOM CompilationUnit.
  */
 public class BreakpointFieldLocator extends ASTVisitor {
-	
+
 	private int fPosition;
-	
+
 	private String fTypeName;
-	
+
 	private String fFieldName;
 
 	private boolean fFound;
@@ -62,7 +62,7 @@
 	public String getTypeName() {
 		return fTypeName;
 	}
-	
+
 	private boolean containsPosition(ASTNode node) {
 		int startPosition= node.getStartPosition();
 		int endPosition = startPosition + node.getLength();
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointListenerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointListenerTests.java
index 08eedd5..fc33a1f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointListenerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointListenerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,9 +28,9 @@
  * Tests breakpoint creation/deletion and listener interfaces.
  */
 public class BreakpointListenerTests extends AbstractDebugTest implements IBreakpointListener, IBreakpointsListener {
-	
+
 	/**
-	 * the number of add callbacks 
+	 * the number of add callbacks
 	 */
 	public int fAddCallbacks = 0;
 	/**
@@ -53,7 +53,7 @@
 	 * the total changed
 	 */
 	public int fTotalChanged = 0;
-		
+
 	/**
 	 * Constructor
 	 * @param name
@@ -66,16 +66,16 @@
 		waitForBuild();
 		fAddCallbacks = 0;
 		fTotalAdded = 0;
-	
+
 		fRemoveCallbacks = 0;
 		fTotalRemoved = 0;
-	
+
 		fChangeCallabcks = 0;
-		fTotalChanged = 0;		
+		fTotalChanged = 0;
 	}
 	/**
 	 * Creates sample breakpoints
-	 * 
+	 *
 	 * @return List
 	 */
 	protected List<IJavaLineBreakpoint> createBreakpoints(String typeName) throws Exception {
@@ -104,7 +104,7 @@
 		bps.add(createUnregisteredLineBreakpoint(72, typeName));
 		// instance method
 		bps.add(createUnregisteredLineBreakpoint(107, typeName));
-		// static method 
+		// static method
 		bps.add(createUnregisteredLineBreakpoint(53, typeName));
 		// case statement
 		bps.add(createUnregisteredLineBreakpoint(133, typeName));
@@ -118,7 +118,7 @@
 		bps.add(createUnregisteredLineBreakpoint(118, typeName));
 		// while
 		bps.add(createUnregisteredLineBreakpoint(97, typeName));
-		
+
 		return bps;
 	}
 
@@ -126,84 +126,84 @@
 	 * Tests a single breakpoint listener
 	 * @throws Exception
 	 */
-	public void testSingleListener() throws Exception {		
+	public void testSingleListener() throws Exception {
 		List<IJavaLineBreakpoint> bps = createBreakpoints("Breakpoints");
-		
+
 		try {
-			getBreakpointManager().addBreakpointListener((IBreakpointListener)this);		
-			
+			getBreakpointManager().addBreakpointListener((IBreakpointListener)this);
+
 			resetCallbacks();
 			getBreakpointManager().addBreakpoints(bps.toArray(new IBreakpoint[bps.size()]));
 			assertEquals("Should have received individual add notifications", bps.size(), fAddCallbacks);
 			assertEquals("Number of breakpoints added incorrect", bps.size(), fTotalAdded);
 			//assertEquals("Should be change callbacks for IMarker.MESSAGE updates", bps.size(), fChangeCallabcks);
 			assertEquals("Should be no removes", 0, fRemoveCallbacks);
-			
+
 			resetCallbacks();
 			getBreakpointManager().removeBreakpoints(bps.toArray(new IBreakpoint[bps.size()]), true);
 			assertEquals("Should have received individual remove notifications", bps.size(), fRemoveCallbacks);
 			assertEquals("Should of breakpoints removed incorrect", bps.size(), fTotalRemoved);
 			assertEquals("Should be no changes", 0, fChangeCallabcks);
 			assertEquals("Should be no additions", 0, fAddCallbacks);
-			
+
 		} finally {
 			getBreakpointManager().removeBreakpointListener((IBreakpointListener)this);
 			removeAllBreakpoints();
 		}
-		
+
 	}
-	
+
 	/**
 	 * Tests more than one simultaneous breakpoint listener
 	 * @throws Exception
 	 */
-	public void testMultiListener() throws Exception {		
+	public void testMultiListener() throws Exception {
 		List<IJavaLineBreakpoint> bps = createBreakpoints("Breakpoints");
-		
+
 		try {
-			getBreakpointManager().addBreakpointListener((IBreakpointsListener)this);		
-			
+			getBreakpointManager().addBreakpointListener((IBreakpointsListener)this);
+
 			resetCallbacks();
 			getBreakpointManager().addBreakpoints(bps.toArray(new IBreakpoint[bps.size()]));
 			assertEquals("Should have received one add notification", 1, fAddCallbacks);
 			assertEquals("Number of breakpoints added incorrect", bps.size(), fTotalAdded);
 			//assertEquals("Should be 1 change for IMarker.MESSAGE update", 1, fChangeCallabcks);
 			assertEquals("Should be no removes", 0, fRemoveCallbacks);
-			
+
 			resetCallbacks();
 			getBreakpointManager().removeBreakpoints(bps.toArray(new IBreakpoint[bps.size()]), true);
 			assertEquals("Should have received one remove notification", 1, fRemoveCallbacks);
 			assertEquals("Should of breakpoints removed incorrect", bps.size(), fTotalRemoved);
 			assertEquals("Should be no changes", 0, fChangeCallabcks);
 			assertEquals("Should be no additions", 0, fAddCallbacks);
-			
+
 		} finally {
 			getBreakpointManager().removeBreakpointListener((IBreakpointsListener)this);
 			removeAllBreakpoints();
 		}
-		
-	}	
-	
+
+	}
+
 	/**
 	 * Test multiple breakpoint listeners over a project open and close
 	 * @throws Exception
 	 */
-	public void testMultiListenerProjectCloseOpen() throws Exception {		
+	public void testMultiListenerProjectCloseOpen() throws Exception {
 		List<IJavaLineBreakpoint> bps = createBreakpoints("Breakpoints");
-		
+
 		try {
 			// close all editors before closing project: @see bug 204023
 			closeAllEditors();
-			
-			getBreakpointManager().addBreakpointListener((IBreakpointsListener)this);		
-			
+
+			getBreakpointManager().addBreakpointListener((IBreakpointsListener)this);
+
 			resetCallbacks();
 			getBreakpointManager().addBreakpoints(bps.toArray(new IBreakpoint[bps.size()]));
 			assertEquals("Should have received one add notification", 1, fAddCallbacks);
 			assertEquals("Number of breakpoints added incorrect", bps.size(), fTotalAdded);
 			//assertEquals("Should be 1 change for IMarker.MESSAGE update", 1, fChangeCallabcks);
 			assertEquals("Should be no removes", 0, fRemoveCallbacks);
-			
+
 			resetCallbacks();
 			get14Project().getProject().close(null);
 			waitForBuild();
@@ -211,28 +211,28 @@
 			assertEquals("Should of breakpoints removed incorrect", bps.size(), fTotalRemoved);
 			assertEquals("Should be no changes", 0, fChangeCallabcks);
 			assertEquals("Should be no additions", 0, fAddCallbacks);
-			
+
 			resetCallbacks();
 			get14Project().getProject().open(null);
 			waitForBuild();
 			assertEquals("Should have received one add notification", 1, fAddCallbacks);
 			assertEquals("Number of breakpoints added incorrect", bps.size(), fTotalAdded);
 			assertEquals("Should be no changes", 0, fChangeCallabcks);
-			assertEquals("Should be no removes", 0, fRemoveCallbacks);			
-			
+			assertEquals("Should be no removes", 0, fRemoveCallbacks);
+
 		} finally {
 			get14Project().getProject().open(null);
 			getBreakpointManager().removeBreakpointListener((IBreakpointsListener)this);
 			removeAllBreakpoints();
 		}
-		
-	}		
+
+	}
 
 	/**
 	 * Tests multiple breakpoint listeners over a compilation move operation
 	 * @throws Exception
 	 */
-	public void testMultiListenerMoveCompilationUnit() throws Exception {	
+	public void testMultiListenerMoveCompilationUnit() throws Exception {
 		IJavaProject project = get14Project();
 		ICompilationUnit cu = (ICompilationUnit)project.findElement(new Path("Breakpoints.java"));
 		assertNotNull("Did not find compilation unit", cu);
@@ -241,10 +241,10 @@
 		List<IJavaLineBreakpoint> bps = createBreakpoints("BreakpointsCopyA");
 		cu = (ICompilationUnit)project.findElement(new Path("BreakpointsCopyA.java"));
 		assertNotNull("Did not find compilation unit copy", cu);
-		
+
 		try {
-			getBreakpointManager().addBreakpointListener((IBreakpointsListener)this);		
-			
+			getBreakpointManager().addBreakpointListener((IBreakpointsListener)this);
+
 			resetCallbacks();
 			getBreakpointManager().addBreakpoints(bps.toArray(new IBreakpoint[bps.size()]));
 			waitForBuild();
@@ -252,7 +252,7 @@
 			assertEquals("Number of breakpoints added incorrect", bps.size(), fTotalAdded);
 			//assertEquals("Should be 1 change callback for IMarker.MESSAGE update", 1, fChangeCallabcks);
 			assertEquals("Should be no removes", 0, fRemoveCallbacks);
-			
+
 			resetCallbacks();
 			cu.rename("BreakpointsCopyTwoA.java", false, null);
 			waitForBuild();
@@ -260,24 +260,24 @@
 			assertEquals("Number of breakpoints removed incorrect", bps.size(), fTotalRemoved);
 			assertEquals("Should be no changes", 0, fChangeCallabcks);
 			assertEquals("Should be no additions", 0, fAddCallbacks);
-			
+
 			cu = (ICompilationUnit)project.findElement(new Path("BreakpointsCopyTwoA.java"));
 			assertNotNull("Did not find CU", cu);
 			cu.delete(false, null);
 			waitForBuild();
-			
+
 		} finally {
 			getBreakpointManager().removeBreakpointListener((IBreakpointsListener)this);
 			removeAllBreakpoints();
 		}
-		
-	}		
-	
+
+	}
+
 	/**
 	 * Tests a single breakpoint listener over the move of a compilation unit
 	 * @throws Exception
 	 */
-	public void testSingleListenerMoveCompilationUnit() throws Exception {	
+	public void testSingleListenerMoveCompilationUnit() throws Exception {
 		IJavaProject project = get14Project();
 		ICompilationUnit cu = (ICompilationUnit)project.findElement(new Path("Breakpoints.java"));
 		assertNotNull("Did not find compilation unit", cu);
@@ -286,10 +286,10 @@
 		List<IJavaLineBreakpoint> bps = createBreakpoints("BreakpointsCopy");
 		cu = (ICompilationUnit)project.findElement(new Path("BreakpointsCopy.java"));
 		assertNotNull("Did not find compilation unit copy", cu);
-		
+
 		try {
-			getBreakpointManager().addBreakpointListener((IBreakpointListener)this);		
-			
+			getBreakpointManager().addBreakpointListener((IBreakpointListener)this);
+
 			resetCallbacks();
 			getBreakpointManager().addBreakpoints(bps.toArray(new IBreakpoint[bps.size()]));
 			waitForBuild();
@@ -297,7 +297,7 @@
 			assertEquals("Number of breakpoints added incorrect", bps.size(), fTotalAdded);
 			//assertEquals("Should be no changes", 0, fChangeCallabcks);
 			assertEquals("Should be no removes", 0, fRemoveCallbacks);
-			
+
 			resetCallbacks();
 			cu.rename("BreakpointsCopyTwo.java", false, null);
 			waitForBuild();
@@ -305,23 +305,23 @@
 			assertEquals("Incorrect number of breakpoints removed", bps.size(), fTotalRemoved);
 			assertEquals("Should be no changes", 0, fChangeCallabcks);
 			assertEquals("Should be no additions", 0, fAddCallbacks);
-			
+
 			cu = (ICompilationUnit)project.findElement(new Path("BreakpointsCopyTwo.java"));
-			assertNotNull("Did not find CU", cu);			
+			assertNotNull("Did not find CU", cu);
 			cu.delete(false, null);
 			waitForBuild();
-			
+
 		} finally {
 			getBreakpointManager().removeBreakpointListener((IBreakpointListener)this);
 			removeAllBreakpoints();
 		}
-		
-	}			
+
+	}
 
 	/**
 	 * Creates and returns a line breakpoint at the given line number in the type with the
 	 * given name, that is <b>not</b> registered with the breakpoint manager.
-	 * 
+	 *
 	 * @param lineNumber line number
 	 * @param typeName type name
 	 */
@@ -362,7 +362,7 @@
 	@Override
 	public void breakpointsAdded(IBreakpoint[] breakpoints) {
 		fAddCallbacks++;
-		fTotalAdded += breakpoints.length;		
+		fTotalAdded += breakpoints.length;
 	}
 
 	/**
@@ -380,6 +380,6 @@
 	@Override
 	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
 		fRemoveCallbacks++;
-		fTotalRemoved += breakpoints.length;			
+		fTotalRemoved += breakpoints.length;
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointLocationVerificationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointLocationVerificationTests.java
index 6aa2be2..a3f9983 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointLocationVerificationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointLocationVerificationTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
  * Tests breakpoint location locator.
  */
 public class BreakpointLocationVerificationTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -47,7 +47,7 @@
 		parser.setResolveBindings(true);
 		return (CompilationUnit) parser.createAST(null);
 	}
-	
+
 	/**
 	 * Tests that the predefined location is locatable in the specified type
 	 * @param lineToTry
@@ -58,7 +58,7 @@
 	private void testLocation(int lineToTry, int expectedLineNumber, String expectedTypeName) throws JavaModelException {
 		testLocation(lineToTry, expectedLineNumber, expectedTypeName, expectedTypeName, false);
 	}
-	
+
 	/**
 	 * Tests that the predefined location is locatable in the specified type
 	 * @param lineToTry
@@ -74,7 +74,7 @@
 		CompilationUnit compilationUnit= parseCompilationUnit(type.getCompilationUnit());
 		ValidBreakpointLocationLocator locator= new ValidBreakpointLocationLocator(compilationUnit, lineToTry, true, bestmatch);
 		compilationUnit.accept(locator);
-		int lineNumber= locator.getLineLocation();		
+		int lineNumber= locator.getLineLocation();
 		assertEquals("Wrong line number", expectedLineNumber, lineNumber);
 		String typeName= locator.getFullyQualifiedTypeName();
 		if (typeName != null) {
@@ -89,101 +89,101 @@
 
 	/**
 	 * Tests setting a line breakpoint on a final field that is initialized
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl() throws Exception {
 		testLocation(14, 14, "FinalBreakpointLocations");
 	}
-	
+
 	/**
 	 * Tests setting a line breakpoint on a final field that is initialized looking for best match
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecla() throws Exception {
 		testLocation(14, 14, "FinalBreakpointLocations", "FinalBreakpointLocations", true);
 	}
-	
+
 	/**
-	 * Tests setting a line breakpoint on an inner type member for the initializer of 
+	 * Tests setting a line breakpoint on an inner type member for the initializer of
 	 * a final local field variable
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl3() throws Exception {
 		testLocation(17, 17, "FinalBreakpointLocations");
 	}
-	
+
 	/**
 	 * Tests setting a line breakpoint on an inner type member for the initializer of looking
-	 * for best match 
+	 * for best match
 	 * a final local field variable
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl3a() throws Exception {
 		testLocation(17, 17, "FinalBreakpointLocations", "FinalBreakpointLocations", true);
 	}
-	
+
 	/**
-	 * Tests setting a line breakpoint on an inner-inner type member for the initializer of 
+	 * Tests setting a line breakpoint on an inner-inner type member for the initializer of
 	 * a final local field variable
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl4() throws Exception {
 		testLocation(20, 20, "FinalBreakpointLocations");
 	}
-	
+
 	/**
-	 * Tests setting a line breakpoint on an inner-inner type member for the initializer of 
+	 * Tests setting a line breakpoint on an inner-inner type member for the initializer of
 	 * a final local field variable looking for best match
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl4a() throws Exception {
 		testLocation(20, 20, "FinalBreakpointLocations", "FinalBreakpointLocations", true);
 	}
-	
+
 	/**
 	 * Tests setting a line breakpoint on a final field that has not been initialized
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl5() throws Exception {
 		testLocation(27, 30, "FinalBreakpointLocations");
 	}
-	
+
 	/**
 	 * Tests setting a line breakpoint on a final field that has not been initialized looking
 	 * for best match
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=376354
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalFieldWithTypeDecl5a() throws Exception {
 		testLocation(27, 30, "FinalBreakpointLocations", "FinalBreakpointLocations", true);
 	}
-	
+
 	/**
 	 * Test line before type declaration
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testLineBeforeTypeDeclaration() throws Exception {
 		testLocation(9, 18, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -191,7 +191,7 @@
 	public void testLineMethodSignature() throws Exception {
 		testLocation(32, 33, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -199,7 +199,7 @@
 	public void testLineInInnerType() throws Exception {
 		testLocation(25, 25, "BreakpointsLocation.InnerClass");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -207,7 +207,7 @@
 	public void testLineInAnnonymousType() throws Exception {
 		testLocation(39, 39, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -217,7 +217,7 @@
 		testLocation(82, -1, "BreakpointsLocation");
 		// ******************************
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -225,7 +225,7 @@
 	public void testLineVariableDeclarationWithAssigment() throws Exception {
 		testLocation(43, 46, "BreakpointsLocation");
 	}
-    
+
 	/**
 	 * Tests that a breakpoint is not set on a final field
 	 * @throws Exception
@@ -233,16 +233,16 @@
 	public void testFieldLocationOnFinalField() throws Exception {
 		testLocation(13, 13, "org.eclipse.debug.tests.targets.BreakpointsLocationBug344984");
 	}
-	
+
 	/**
-	 * Tests that a breakpoint is not set on a final field looking 
+	 * Tests that a breakpoint is not set on a final field looking
 	 * for best match
 	 * @throws Exception
 	 */
 	public void testFieldLocationOnFinalFielda() throws Exception {
 		testLocation(13, 13, "org.eclipse.debug.tests.targets.BreakpointsLocationBug344984", "org.eclipse.debug.tests.targets.BreakpointsLocationBug344984", true);
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -250,7 +250,7 @@
     public void testEmptyLabel() throws Exception {
         testLocation(15, 16, "LabelTest");
     }
-	
+
     /**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -258,7 +258,7 @@
     public void testNestedEmptyLabels() throws Exception {
         testLocation(19, 21, "LabelTest");
     }
-    
+
     /**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -266,7 +266,7 @@
     public void testLabelWithCode() throws Exception {
         testLocation(21, 21, "LabelTest");
     }
-    
+
     /**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -274,7 +274,7 @@
 	public void testLineFieldDeclarationWithAssigment() throws Exception {
 		testLocation(51, 55, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -282,7 +282,7 @@
 	public void testLineExpressionReplacedByConstant1() throws Exception {
 		testLocation(62, 62, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -290,7 +290,7 @@
 	public void testLineExpressionReplacedByConstant2() throws Exception {
 		testLocation(64, 62, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -298,7 +298,7 @@
 	public void testLineExpressionNotReplacedByConstant1() throws Exception {
 		testLocation(70, 70, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -306,7 +306,7 @@
 	public void testLineExpressionNotReplacedByConstant2() throws Exception {
 		testLocation(72, 72, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -314,7 +314,7 @@
 	public void testLineLitteral1() throws Exception {
 		testLocation(46, 46, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -322,7 +322,7 @@
 	public void testLineLitteral2() throws Exception {
 		testLocation(55, 55, "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests a specific breakpoint location
 	 * @throws Exception
@@ -358,7 +358,7 @@
 		String typeName= locator.getTypeName();
 		assertEquals("Wrong Type Name", expectedTypeName, typeName);
 	}
-	
+
 	/**
 	 * Tests that a specific filed is at the correct location
 	 * @throws Exception
@@ -366,7 +366,7 @@
 	public void testFieldLocationOnField() throws Exception {
 		testField(30, 20, "fList", "BreakpointsLocation");
 	}
-	
+
 	/**
 	 * Tests that a specific filed is at the correct location
 	 * @throws Exception
@@ -374,7 +374,7 @@
 	public void testFieldLocationNotOnField() throws Exception {
 		testField(33, 18, null, null);
 	}
-	
+
 	/**
 	 * Tests that a specific method is locatable in the specified type at the given offset and line
 	 * @param line
@@ -399,7 +399,7 @@
 		String methodSignature= locator.getMethodSignature();
 		assertEquals("Wrong method signature", expectedMethodSignature, methodSignature);
 	}
-	
+
 	/**
 	 * Tests that a specific method is locatable in a specific location
 	 * @throws Exception
@@ -407,7 +407,7 @@
 	public void testMethodOnSignature() throws Exception {
 		testMethod(17, 20, "test1", "BreakpointsLocation", "()V");
 	}
-	
+
 	/**
 	 * Tests that a specific method is locatable in a specific location
 	 * @throws Exception
@@ -415,7 +415,7 @@
 	public void testMethodOnCode() throws Exception {
 		testMethod(19, 17, "test1", "BreakpointsLocation", "()V");
 	}
-	
+
 	/**
 	 * Tests that a specific method is locatable in a specific location
 	 * @throws Exception
@@ -423,7 +423,7 @@
 	public void testMethodNotOnMethod() throws Exception {
 		testMethod(30, 1, null, null, null);
 	}
-	
+
 	/**
 	 * Tests that a specific method is locatable in a specific location
 	 * @throws Exception
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointMethodLocator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointMethodLocator.java
index 05b4251..c77c93a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointMethodLocator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointMethodLocator.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,13 +32,13 @@
  * Compute the name of field declared at a given position from an JDOM CompilationUnit.
  */
 public class BreakpointMethodLocator extends ASTVisitor {
-	
+
 	private int fPosition;
-	
+
 	private String fTypeName;
-	
+
 	private String fMethodName;
-	
+
 	private String fMethodSignature;
 
 	private boolean fFound;
@@ -80,13 +80,13 @@
 	public String getTypeName() {
 		return fTypeName;
 	}
-	
+
 	private boolean containsPosition(ASTNode node) {
 		int startPosition= node.getStartPosition();
 		int endPosition = startPosition + node.getLength();
 		return startPosition <= fPosition && fPosition <= endPosition;
 	}
-	
+
 	private String computeMethodSignature(MethodDeclaration node) {
 		if (node.getExtraDimensions() != 0 || Modifier.isAbstract(node.getModifiers())) {
 			return null;
@@ -112,7 +112,7 @@
 		}
 		return signature.toString();
 	}
-	
+
 	private void appendTypeLetter(StringBuffer signature, PrimitiveType type) {
 		PrimitiveType.Code code= type.getPrimitiveTypeCode();
 		if (code == PrimitiveType.BYTE) {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointWorkingSetTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointWorkingSetTests.java
index 5e5e517..02f2d5a 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointWorkingSetTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/BreakpointWorkingSetTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 
 /**
  * Tests adding breakpoints and automatic addition to working sets.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointWorkingSetTests extends AbstractBreakpointWorkingSetTest {
@@ -57,7 +57,7 @@
 			getWorkingSetManager().removeWorkingSet(set);
 		}
 	}
-	
+
 	/**
 	 * Tests adding a breakpoint with no default working set
 	 * @throws Exception
@@ -74,14 +74,14 @@
 			removeAllBreakpoints();
 			getWorkingSetManager().removeWorkingSet(set);
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests that we can have N working set shown in the view and add additional breakpoints
 	 * to the default ones without causing exceptions
-	 * 
+	 *
 	 * In this test we have to open / show the view to cause the insert update to occur
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=380614
 	 * @throws Exception
 	 * @since 3.8.100
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsTests.java
index 17209a9..581cde2 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
  * Tests conditional breakpoints.
  */
 public class ConditionalBreakpointsTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -39,7 +39,7 @@
 	public void testSimpleConditionalBreakpoint() throws Exception {
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createConditionalLineBreakpoint(16, typeName, "i == 3", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -47,17 +47,17 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
 			assertTrue("value of 'i' should be '3', but was " + iValue, iValue == 3);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -67,7 +67,7 @@
 	public void testStaticMethodCallConditionalBreakpoint() throws Exception {
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createConditionalLineBreakpoint(16, typeName, "ArgumentsTests.fact(i) == 24", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -75,17 +75,17 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
 			assertTrue("value of 'i' should be '4', but was " + iValue, iValue == 4);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -95,7 +95,7 @@
 	public void testSimpleConditionalBreakpointSuspendOnChange() throws Exception {
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createConditionalLineBreakpoint(16, typeName, "i != 9", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -103,28 +103,28 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
 			assertEquals(0, iValue);
-			
+
 			resumeToLineBreakpoint(thread, bp);
-			
+
 			frame = (IJavaStackFrame)thread.getTopStackFrame();
 			var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			iValue = value.getIntValue();
 			assertEquals(9, iValue);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -135,7 +135,7 @@
 		String typeName = "ConditionalStepReturn";
 		IJavaLineBreakpoint lineBreakpoint = createLineBreakpoint(17, typeName);
 		createConditionalLineBreakpoint(18, typeName, "!bool", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, lineBreakpoint);
@@ -146,20 +146,20 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
 	 * Tests a breakpoint condition *is* evaluated when it coincides with a step end.
 	 * See bug 265714.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalConditionOnStep() throws Exception {
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
 		IJavaLineBreakpoint bp2 = createConditionalLineBreakpoint(17, typeName, "i = 3; return true;", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -168,35 +168,35 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
 			assertEquals("'i' has wrong value", 3, iValue);
-			
+
 			// breakpoint should still be available from thread, even though not eval'd
 			IBreakpoint[] breakpoints = thread.getBreakpoints();
 			assertEquals("Wrong number of breakpoints", 1, breakpoints.length);
 			assertEquals("Wrong breakpoint", bp2, breakpoints[0]);
-			
+
 			bp.delete();
 			bp2.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that a thread can be suspended when executing a long-running condition.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSuspendLongRunningCondition() throws Exception {
 		String typeName = "MethodLoop";
 		IJavaLineBreakpoint first = createLineBreakpoint(19, typeName);
 		createConditionalLineBreakpoint(29, typeName, "for (int x = 0; x < 1000; x++) { System.out.println(x);} Thread.sleep(200); return true;", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, first);
@@ -212,13 +212,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tests that a conditional breakpoint with an expression that will hit a breakpoint
 	 * will complete the conditional expression evaluation (bug 269231).
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testConditionalExpressionIgnoresBreakpoint() throws Exception {
@@ -235,9 +235,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -245,7 +245,7 @@
 	public void testConditionalMultiInfix1() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "(true==true==true==true==true)", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -253,9 +253,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -263,7 +263,7 @@
 	public void testConditionalMultiInfix2() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "!(true==true==true==true==true)", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -271,9 +271,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -281,7 +281,7 @@
 	public void testConditionalMultiInfix3() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "(true&&true&&true&&true&&true)", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -289,9 +289,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -299,7 +299,7 @@
 	public void testConditionalMultiInfix4() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "!(true&&true&&true&&true&&true)", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -307,9 +307,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -317,7 +317,7 @@
 	public void testConditionalMultiInfix5() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "true&&true||false", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -325,9 +325,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -335,7 +335,7 @@
 	public void testConditionalMultiInfix6() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "(1<=2==true||false)", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -343,9 +343,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -353,7 +353,7 @@
 	public void testConditionalMultiInfix7() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "!(1<=2==true||false)", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -361,9 +361,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -371,7 +371,7 @@
 	public void testConditionalMultiInfix8() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "(true != false && false)", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -379,9 +379,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -389,7 +389,7 @@
 	public void testConditionalMultiInfix9() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "!(true != false && false)", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -397,9 +397,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -407,7 +407,7 @@
 	public void testConditionalMultiInfix10() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "(true||true||true||true||true)", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -415,9 +415,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -425,7 +425,7 @@
 	public void testConditionalMultiInfix11() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "!(true||true||true||true||true)", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -433,9 +433,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -443,7 +443,7 @@
 	public void testConditionalMultiInfix12() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "(true==true||true!=true&&true)", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -451,9 +451,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -461,7 +461,7 @@
 	public void testConditionalMultiInfix13() throws Exception {
 		String typeName = "ConditionalStepReturn";
 		createConditionalLineBreakpoint(17, typeName, "!(true==true||true!=true&&true)", false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -469,12 +469,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
 
 	/**
 	 * Tests a breakpoint with a simple systrace Launch should don't suspend for simple systrace
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSystracelBreakpoint() throws Exception {
@@ -496,7 +496,7 @@
 
 	/**
 	 * Tests a breakpoint with a simple code which returns Integer Object, Launch should don't suspend for non true boolean returns
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testConditionBreakpointReturnNonBooleanObject() throws Exception {
@@ -518,7 +518,7 @@
 
 	/**
 	 * Tests a breakpoint with a simple code which returns Boolean Object with true, Launch should suspend for true Boolean returns
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testConditionBreakpointReturnBooleanObjectTrue() throws Exception {
@@ -539,7 +539,7 @@
 
 	/**
 	 * Tests a breakpoint with a simple code which returns Boolean Object with false, Launch should not suspend for false Boolean returns
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testConditionBreakpointReturnBooleanObjectFalse() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsWithGenerics.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsWithGenerics.java
index d3872e1..68d4138 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsWithGenerics.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ConditionalBreakpointsWithGenerics.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Jesper Steen Moller - initial API and implementation, adapted from
  *     Stefan Mandels contribution in bug 341232, and existing debug tests
@@ -21,7 +21,7 @@
  * Tests conditional breakpoints.
  */
 public class ConditionalBreakpointsWithGenerics extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -41,7 +41,7 @@
 	/**
 	 * Tests a breakpoint with a simple condition does not cause errors
 	 * multiple use of the same generic type 'T'
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -51,20 +51,20 @@
 		createConditionalLineBreakpoint(33, typeName, "false", true);
 		createConditionalLineBreakpoint(44, typeName, "false", true);
 		ILineBreakpoint bp = createConditionalLineBreakpoint(56, innerTypeName, "true", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp); // If compiled correctly, this will jump over bp1-bp3 !!
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a simple condition does not cause errors
 	 * with many inner types with generics
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -81,11 +81,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a simple condition does not cause errors
 	 * with many inner types with generics
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -102,11 +102,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a simple condition does not cause errors
 	 * with many inner types with generics
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -123,11 +123,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a simple condition does not cause errors
 	 * with multiple generic types 'T', 'E', 'K'
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -144,11 +144,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a simple condition does not cause errors
 	 * with multiple generic types 'T', 'E', 'K'
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -165,10 +165,10 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a condition that includes generics
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -188,11 +188,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a generified condition in a type that includes
 	 * duplicate generic declarations
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -211,10 +211,10 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a condition that includes generics from nested classes
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232
 	 * @throws Exception
 	 */
@@ -236,10 +236,10 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a breakpoint with a condition that includes generics from nested classes
-	 * 
+	 *
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
 	 * @throws Exception
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/DeferredBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/DeferredBreakpointTests.java
index 90b3f63..d65f6ca 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/DeferredBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/DeferredBreakpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
  * Tests deferred breakpoints.
  */
 public class DeferredBreakpointTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -57,7 +57,7 @@
 				22,		// inner class
 				72,		// return true
 				107,	// instance method
-				53,		// static method 
+				53,		// static method
 				133,	// case statement
 				140,	// default statement
 				146,	// synchronized blocks
@@ -66,7 +66,7 @@
 				97		// while
 		};
 		createBreakpoints(typeName, bps, lines);
-		
+
 		IJavaThread thread= null;
 		try {
 			// do not register launch - see bug 130911
@@ -90,9 +90,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	private void createBreakpoints(String typeName, List<IBreakpoint> breakpoints, int[] lineNumbers) throws Exception {
 		IType type = get14Project().findType(typeName);
 		assertNotNull(type);
@@ -114,14 +114,14 @@
 		String typeName = "Breakpoints";
 		ILineBreakpoint bp = createLineBreakpoint(52, typeName);
 		bp.setEnabled(false);
-		
+
 		IJavaDebugTarget debugTarget = null;
 		try {
 			debugTarget= launchAndTerminate(typeName);
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}				
+		}
 	}
 
 	/**
@@ -132,7 +132,7 @@
 		String typeName = "HitCountLooper";
 		ILineBreakpoint bp = createLineBreakpoint(16, typeName);
 		bp.setEnabled(true);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -141,9 +141,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Tests skipping a single line breakpoint
 	 * @throws Exception
@@ -152,7 +152,7 @@
 		String typeName = "Breakpoints";
 		ILineBreakpoint bp = createLineBreakpoint(52, typeName);
 		createLineBreakpoint(54, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 		    thread= launchToLineBreakpoint(typeName, bp);
@@ -162,6 +162,6 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			getBreakpointManager().setEnabled(true);
-		}			    
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ExceptionBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ExceptionBreakpointTests.java
index d06926f..0a9aa61 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ExceptionBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ExceptionBreakpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
  */
 
 public class ExceptionBreakpointTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name the name of the test
@@ -38,13 +38,13 @@
 	 */
 	public void testCaughtException() throws Exception {
 		String typeName = "ThrowsException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);		
-		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("suspended, but not by exception breakpoint", ex ,hit);
@@ -52,22 +52,22 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * tests that breakpoint suspends on uncaught exceptions
 	 * @throws Exception
 	 */
 	public void testUncaughtException() throws Exception {
 		String typeName = "HitCountException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", false, true);		
-		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", false, true);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("suspended, but not by exception breakpoint", ex ,hit);
@@ -77,18 +77,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDisabledCaughtException() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setEnabled(false);
-		
+
 		IJavaDebugTarget debugTarget= null;
 		try {
 			debugTarget= launchAndTerminate(typeName);
@@ -96,18 +96,18 @@
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
-	 * tests that the breakpoint does not suspend for disabled breakpoint set for uncaught exceptions 
+	 * tests that the breakpoint does not suspend for disabled breakpoint set for uncaught exceptions
 	 * @throws Exception
 	 */
 	public void testDisabledUncaughtNPE() throws Exception {
 		String typeName = "MultiThreadedException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", false, true);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", false, true);
 		ex.setEnabled(false);
-		
+
 		IJavaDebugTarget debugTarget= null;
 		try {
 			debugTarget= launchAndTerminate(typeName);
@@ -115,23 +115,23 @@
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * tests that the breakpoint will only suspend on a breakpoint in the inclusion filters
 	 * @throws Exception
 	 */
 	public void testInclusiveScopedException() throws Exception {
 		String typeName = "ThrowsException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);
 		ex.setInclusionFilters(new String[] {"ThrowsException"});
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("suspended, but not by exception breakpoint", ex ,hit);
@@ -139,7 +139,7 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -148,9 +148,9 @@
 	 */
 	public void testExclusiveScopedException() throws Exception {
 		String typeName = "ThrowsException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);
 		ex.setExclusionFilters(new String[] {"ThrowsException"});
-		
+
 		IJavaDebugTarget debugTarget = null;
 		try {
 			debugTarget = launchAndTerminate(typeName);
@@ -158,7 +158,7 @@
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -167,22 +167,22 @@
 	 */
 	public void testHitCountException() throws Exception {
 		String typeName = "HitCountException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, true);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, true);
 		ex.setHitCount(2);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			IJavaStackFrame frame= (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("Should have been suspended at linenumber", 35, frame.getLineNumber());
-			
+
 			ex.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * tests that the breakpoint will suspend at an NPE with more than one exclusion filter, just not suspend in either
 	 * of the classes for the exclusion filter
@@ -190,9 +190,9 @@
 	 */
 	public void testMultiExclusiveScopedExceptionHit() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setExclusionFilters(new String[] {"TestIO", "Breakpoints"});
-		
+
 		IJavaThread thread = null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -202,18 +202,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * tests that the breakpoint does not suspend for multiple exclusion filters
 	 * @throws Exception
 	 */
 	public void testMultiExclusiveScopedExceptionMissed() throws Exception {
 		String typeName = "ThrowsException";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false);
 		ex.setExclusionFilters(new String[] {"ThrowsException2", "ThrowsException"});
-		
+
 		IJavaDebugTarget target= null;
 		try {
 			target = launchAndTerminate(typeName);
@@ -221,18 +221,18 @@
 		} finally {
 			terminateAndRemove(target);
 			removeAllBreakpoints();
-		}		
-	}			
-	
+		}
+	}
+
 	/**
 	 * tests that a breakpoint is hit with multiple inclusion filters set
 	 * @throws Exception
 	 */
 	public void testMultiInclusiveScopedExceptionHit() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setInclusionFilters(new String[] {"ThrowsNPE", "Breakpoints"});
-		
+
 		IJavaThread thread = null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -242,18 +242,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * tests that the breakpoint does not suspend with multiple inclusion filters
 	 * @throws Exception
 	 */
 	public void testMultiInclusiveScopedExceptionMissed() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setInclusionFilters(new String[] {"TestIO", "Breakpoints"});
-		
+
 		IJavaDebugTarget target= null;
 		try {
 			target = launchAndTerminate(typeName);
@@ -261,19 +261,19 @@
 		} finally {
 			terminateAndRemove(target);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * test that breakpoint suspends with multi inclusion and exclusion filters
 	 * @throws Exception
 	 */
 	public void testMultiInclusiveExclusiveScopedExceptionHit() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setInclusionFilters(new String[] {"ThrowsNPE", "Breakpoints"});
 		ex.setExclusionFilters(new String[] {"HitCountException", "MethodLoop"});
-		
+
 		IJavaThread thread = null;
 		try {
 			thread = launchToBreakpoint(typeName);
@@ -283,19 +283,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * tests that breakpoint does not suspend with multi inclusion and exclusion filters
 	 * @throws Exception
 	 */
 	public void testMultiInclusiveExclusiveScopedExceptionMissed() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setInclusionFilters(new String[] {"TestIO", "Breakpoints"});
 		ex.setExclusionFilters(new String[] {"ThrowsNPE", "MethodLoop"});
-		
+
 		IJavaDebugTarget target= null;
 		try {
 			target = launchAndTerminate(typeName);
@@ -303,29 +303,29 @@
 		} finally {
 			terminateAndRemove(target);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * tests that breakpoint is skipped when told to do so
 	 * @throws Exception
 	 */
 	public void testSkipExceptionBreakpoint() throws Exception {
 		String typeName = "ThrowsNPE";
-		createExceptionBreakpoint("java.lang.NullPointerException", true, false);	
+		createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		IJavaLineBreakpoint lineBreakpoint = createLineBreakpoint(15, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, lineBreakpoint);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			getBreakpointManager().setEnabled(false);
 			resumeAndExit(thread);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			getBreakpointManager().setEnabled(true);
-		}		
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/HitCountBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/HitCountBreakpointsTests.java
index b625ea0..399f54b 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/HitCountBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/HitCountBreakpointsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,7 +38,7 @@
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
 		bp.setHitCount(3);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -46,30 +46,30 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
 			assertTrue("value of 'i' should be '2', but was " + iValue, iValue == 2);
-			
+
 			bp.setHitCount(2);
 			IJavaThread thread2 = resumeToLineBreakpoint(thread, bp);
-			assertTrue("second suspended thread not the same as first", thread == thread2);			
-			
+			assertTrue("second suspended thread not the same as first", thread == thread2);
+
 			frame = (IJavaStackFrame)thread2.getTopStackFrame();
 			var = findVariable(frame, "i");
 			value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			iValue = value.getIntValue();
 			assertTrue("value of 'i' should be '4', but was " + iValue, iValue == 4);
-			
+
 			resumeAndExit(thread2);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -81,7 +81,7 @@
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
 		bp.setHitCount(3);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -89,18 +89,18 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
 			assertTrue("value of 'i' should be '2', but was " + iValue, iValue == 2);
-			
+
 			resumeAndExit(thread);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ImportBreakpointsTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ImportBreakpointsTest.java
index 3f5885d..0ff0a73 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ImportBreakpointsTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ImportBreakpointsTest.java
@@ -31,7 +31,7 @@
 
 /**
  * Tests the import operations of the breakpoint import export feature
- * 
+ *
  * @since 3.2
  */
 public class ImportBreakpointsTest extends AbstractBreakpointWorkingSetTest {
@@ -43,7 +43,7 @@
 	public ImportBreakpointsTest(String name) {super(name);}
 
 	/**
-	 * Tests import operation from a file. 
+	 * Tests import operation from a file.
 	 * @throws Exception catch all passed to framework
 	 */
 	public void testBreakpointImportFile() throws Exception {
@@ -75,15 +75,15 @@
 				assertEquals("Missing imported breakpoint", breakpoint, getBreakpointManager().getBreakpoint(breakpoint.getMarker()));
 			}
 			file.delete();
-		} 
+		}
 		finally {
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tests import operation from a string buffer.
-	 *  
+	 *
 	 * @throws Exception catch all passed to framework
 	 */
 	public void testBreakpointImportBuffer() throws Exception {
@@ -105,12 +105,12 @@
 			ImportBreakpointsOperation op2 = new ImportBreakpointsOperation(buffer, true, true);
 			op2.run(new NullProgressMonitor());
 			assertEquals("manager does not contain 6 breakpoints", 6, getBreakpointManager().getBreakpoints().length);
-		} 
+		}
 		finally {
 			removeAllBreakpoints();
-		}	
-	}	
-	
+		}
+	}
+
 	/**
 	 * tests and overwrote without remove all
 	 * @throws Exception catch all to pass back to framework
@@ -137,15 +137,15 @@
 			op2.run(new NullProgressMonitor());
 			assertEquals("manager does not contain 6 breakpoints", 6, getBreakpointManager().getBreakpoints().length);
 			file.delete();
-		} 
+		}
 		finally {
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a bad filename passed to the import operation
-	 * 
+	 *
 	 * @throws Exception catch all to pass back to framework
 	 */
 	public void testBreakpointImportBadFilename() throws Exception {
@@ -163,10 +163,10 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * tests importing breakpoints with working sets
-	 * 
+	 *
 	 * @throws Exception catch all to be passed back to the framework
 	 */
 	public void testBreakpointImportWithWorkingsets() throws Exception {
@@ -179,7 +179,7 @@
 			IWorkingSet set = createSet(setName);
 			assertNotNull("workingset does not exist", wsmanager.getWorkingSet(setName));
 			WorkingSetCategory category = new WorkingSetCategory(set);
-			
+
 			bporg.addBreakpoint(createClassPrepareBreakpoint(typeName), category);
 			bporg.addBreakpoint(createLineBreakpoint(32, typeName), category);
 			bporg.addBreakpoint(createLineBreakpoint(28, typeName), category);
@@ -192,7 +192,7 @@
 			assertNotNull("Invalid path", path);
 			ExportBreakpointsOperation op = new ExportBreakpointsOperation(getBreakpointManager().getBreakpoints(), path.toOSString());
 			op.run(new NullProgressMonitor());
-		
+
 			//remove bps and working set and do the import
 			removeAllBreakpoints();
 			set.setElements(new IAdaptable[] {});
@@ -215,7 +215,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests importing breakpoints to resources that do not exist
 	 * @throws Exception catch all passed to framework
@@ -228,16 +228,16 @@
 			ImportBreakpointsOperation op = new ImportBreakpointsOperation(file.getCanonicalPath(), true, true);
 			op.run(new NullProgressMonitor());
 			assertEquals("should be no breakpoints imported", 0, getBreakpointManager().getBreakpoints().length);
-		} 
+		}
 		finally {
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * tests importing breakpoints with working sets where the breakpoints are restored to 
+	 * tests importing breakpoints with working sets where the breakpoints are restored to
 	 * another working set and removed from the current one
-	 * 
+	 *
 	 * @throws Exception catch all to be passed back to the framework
 	 */
 	public void testImportWithWorkingsets() throws Exception {
@@ -251,7 +251,7 @@
 			IWorkingSet set = createSet(setname1);
 			assertNotNull("workingset does not exist", wsmanager.getWorkingSet(setname1));
 			WorkingSetCategory category = new WorkingSetCategory(set);
-			
+
 			bporg.addBreakpoint(createClassPrepareBreakpoint(typeName), category);
 			bporg.addBreakpoint(createLineBreakpoint(32, typeName), category);
 			bporg.addBreakpoint(createLineBreakpoint(28, typeName), category);
@@ -264,12 +264,12 @@
 			assertNotNull("Invalid path", path);
 			ExportBreakpointsOperation op = new ExportBreakpointsOperation(getBreakpointManager().getBreakpoints(), path.toOSString());
 			op.run(new NullProgressMonitor());
-		
+
 			//copy items to the alternate working set
 			IWorkingSet set2 = createSet(setname2);
 			set2.setElements(set.getElements());
 			assertNotNull("workingset does not exist", wsmanager.getWorkingSet(setname2));
-			
+
 			//remove bps and working set and do the import
 			removeAllBreakpoints();
 			set.setElements(new IAdaptable[] {});
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/JavaBreakpointListenerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/JavaBreakpointListenerTests.java
index 78a57c7..4fdc793 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/JavaBreakpointListenerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/JavaBreakpointListenerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -45,35 +45,35 @@
  * Tests breakpoint creation/deletion and listener interfaces.
  */
 public class JavaBreakpointListenerTests extends AbstractDebugTest implements IJavaBreakpointListener {
-	
+
 	/**
 	 * count of add callbacks
 	 */
 	public int fAddCallbacks = 0;
-	
+
 	/**
 	 * count of remove callbacks
 	 */
 	public int fRemoveCallbacks = 0;
-	
+
 	/**
 	 * count of installed callbacks
 	 */
 	public int fInstalledCallbacks = 0;
-	
-	/** 
+
+	/**
 	 * a java breakpoint
 	 */
 	public IJavaBreakpoint fBreakpoint;
-	
+
 	/**
 	 * Used to test breakpoint install/suspend voting.
 	 */
 	class SuspendVoter implements IJavaBreakpointListener {
-		
+
 		int fVote;
 		IJavaBreakpoint fTheBreakpoint;
-		
+
 		/**
 		 * Constructor
 		 * @param suspendVote
@@ -83,7 +83,7 @@
 			fVote = suspendVote;
 			fTheBreakpoint = breakpoint;
 		}
-		
+
 		/**
 		 * @see org.eclipse.jdt.debug.core.IJavaBreakpointListener#addingBreakpoint(org.eclipse.jdt.debug.core.IJavaDebugTarget, org.eclipse.jdt.debug.core.IJavaBreakpoint)
 		 */
@@ -139,12 +139,12 @@
 		}
 
 	}
-	
+
 	/**
 	 * Aids in the voting for a breakpoint to be installed
 	 */
 	class InstallVoter extends SuspendVoter {
-		
+
 		/**
 		 * Constructor
 		 * @param installVote
@@ -153,7 +153,7 @@
 		public InstallVoter(int installVote, IJavaBreakpoint breakpoint) {
 			super(installVote, breakpoint);
 		}
-		
+
 		/**
 		 * @see org.eclipse.jdt.debug.tests.breakpoints.JavaBreakpointListenerTests.SuspendVoter#installingBreakpoint(org.eclipse.jdt.debug.core.IJavaDebugTarget, org.eclipse.jdt.debug.core.IJavaBreakpoint, org.eclipse.jdt.debug.core.IJavaType)
 		 */
@@ -165,12 +165,12 @@
 			return DONT_CARE;
 		}
 	}
-	
+
 	/**
 	 * Collects hit breakpoints.
 	 */
 	class Collector implements IJavaBreakpointListener {
-		
+
 		public List<IJavaBreakpoint> HIT = new ArrayList<IJavaBreakpoint>();
 		public List<IJavaLineBreakpoint> COMPILATION_ERRORS = new ArrayList<IJavaLineBreakpoint>();
 		public List<IJavaLineBreakpoint> RUNTIME_ERRORS = new ArrayList<IJavaLineBreakpoint>();
@@ -196,7 +196,7 @@
 		}
 
 		@Override
-		public void breakpointInstalled(IJavaDebugTarget target, IJavaBreakpoint breakpoint) {			
+		public void breakpointInstalled(IJavaDebugTarget target, IJavaBreakpoint breakpoint) {
 		}
 
 		@Override
@@ -207,9 +207,9 @@
 		public int installingBreakpoint(IJavaDebugTarget target, IJavaBreakpoint breakpoint, IJavaType type) {
 			return DONT_CARE;
 		}
-		
+
 	}
-			
+
 	/**
 	 * Constructor
 	 * @param name
@@ -223,195 +223,195 @@
 	 */
 	protected void resetCallbacks() {
 		fAddCallbacks = 0;
-	
+
 		fRemoveCallbacks = 0;
-	
-		fInstalledCallbacks = 0;	
+
+		fInstalledCallbacks = 0;
 	}
-	
+
 	/**
 	 * Tests the functionality of a single line breakpoint
 	 * @throws Exception
 	 */
-	public void testLineBreakpoint() throws Exception {		
+	public void testLineBreakpoint() throws Exception {
 		IJavaLineBreakpoint breakpoint = createLineBreakpoint(54, "Breakpoints");
 		fBreakpoint = breakpoint;
 		resetCallbacks();
-		
+
 		IJavaThread thread = null;
 		try {
-			JDIDebugModel.addJavaBreakpointListener(this);		
+			JDIDebugModel.addJavaBreakpointListener(this);
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			// breakpoint should be added & installed
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);	
+			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
 
 			// disable and re-enable the breakpoint
 			breakpoint.setEnabled(false);
 			breakpoint.setEnabled(true);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
 			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
-			
+
 			// change the hit count
 			breakpoint.setHitCount(34);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
 			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
-			
+
 			// delete the breakpoint
 			breakpoint.delete();
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			
+
 			// and removed
-			assertEquals("Breakpoint should be removed", 1, fRemoveCallbacks);								
-			
+			assertEquals("Breakpoint should be removed", 1, fRemoveCallbacks);
+
 		} finally {
 			JDIDebugModel.removeJavaBreakpointListener(this);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
-		
-	}	
-	
+
+	}
+
 	/**
 	 * Tests the functionality of an exception breakpoint
 	 * @throws Exception
 	 */
-	public void testExceptionBreakpoint() throws Exception {		
+	public void testExceptionBreakpoint() throws Exception {
 		IJavaExceptionBreakpoint breakpoint = createExceptionBreakpoint("java.lang.NullPointerException", true, true);
 		fBreakpoint = breakpoint;
 		resetCallbacks();
-		
+
 		IJavaThread thread = null;
 		try {
-			JDIDebugModel.addJavaBreakpointListener(this);		
+			JDIDebugModel.addJavaBreakpointListener(this);
 			thread = launchToBreakpoint("ThrowsNPE");
 			assertNotNull(thread);
 			// breakpoint should be added & installed
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);	
+			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
 
 			// disable and re-enable the breakpoint
 			breakpoint.setEnabled(false);
 			breakpoint.setEnabled(true);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
 			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
-			
+
 			// change the hit count
 			breakpoint.setHitCount(34);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
 			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
-			
+
 			// toggle caught/uncaught
 			breakpoint.setCaught(false);
 			breakpoint.setUncaught(false);
 			breakpoint.setCaught(true);
 			breakpoint.setUncaught(true);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);			
-			
+			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
+
 			// delete the breakpoint
 			breakpoint.delete();
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			
+
 			// and removed
-			assertEquals("Breakpoint should be removed", 1, fRemoveCallbacks);								
-			
+			assertEquals("Breakpoint should be removed", 1, fRemoveCallbacks);
+
 		} finally {
 			JDIDebugModel.removeJavaBreakpointListener(this);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
-		
-	}	
-	
+
+	}
+
 	/**
 	 * Tests the functionality of a method breakpoint
 	 * @throws Exception
 	 */
-	public void testMethodBreakpoint() throws Exception {		
+	public void testMethodBreakpoint() throws Exception {
 		IJavaMethodBreakpoint breakpoint = createMethodBreakpoint("DropTests", "method4", "()V", true, false);
 		fBreakpoint = breakpoint;
 		resetCallbacks();
-		
+
 		IJavaThread thread = null;
 		try {
-			JDIDebugModel.addJavaBreakpointListener(this);		
+			JDIDebugModel.addJavaBreakpointListener(this);
 			thread = launchToBreakpoint("DropTests");
 			assertNotNull(thread);
 			// breakpoint should be added & installed
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);	
+			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
 
 			// disable and re-enable the breakpoint
 			breakpoint.setEnabled(false);
 			breakpoint.setEnabled(true);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
 			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
-			
+
 			// change the hit count
 			breakpoint.setHitCount(34);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
 			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
-			
+
 			// toggle entry/exit
 			breakpoint.setExit(true);
 			breakpoint.setEntry(false);
 			breakpoint.setExit(false);
 			breakpoint.setEnabled(true);
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);			
-			
+			assertEquals("Breakpoint should not be removed", 0, fRemoveCallbacks);
+
 			// delete the breakpoint
 			breakpoint.delete();
-			
+
 			// should still be installed/added once
 			assertEquals("Breakpoint should be added", 1, fAddCallbacks);
 			assertEquals("Breakpoint should be installed", 1, fInstalledCallbacks);
-			
+
 			// and removed
-			assertEquals("Breakpoint should be removed", 1, fRemoveCallbacks);								
-			
+			assertEquals("Breakpoint should be removed", 1, fRemoveCallbacks);
+
 		} finally {
 			JDIDebugModel.removeJavaBreakpointListener(this);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Vote: Install 3, Don't Care 0, Don't Install 0 == INSTALL
 	 * @throws Exception
@@ -425,7 +425,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -435,9 +435,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Vote: Install 0, Don't Care 3, Don't Install 0 == INSTALL
 	 * @throws Exception
@@ -451,7 +451,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -461,9 +461,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Vote: Install 1, Don't Care 2, Don't Install 0 == INSTALL
 	 * @throws Exception
@@ -477,7 +477,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -487,9 +487,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
-		
+		}
+	}
+
 	/**
 	 * Vote: Install 1, Don't Care 0, Don't Install 2 == INSTALL
 	 * @throws Exception
@@ -503,7 +503,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -513,9 +513,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Vote: Install 0, Don't Care 1, Don't Install 2 = RESUME
 	 * @throws Exception
@@ -530,7 +530,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint2, thread.getBreakpoints()[0]);
@@ -540,9 +540,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Vote: Suspend 3, Don't Care 0, Don't Suspend 0 == SUSPEND
 	 * @throws Exception
@@ -556,7 +556,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -566,9 +566,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Vote: Suspend 0, Don't Care 3, Don't Suspend 0 == SUSPEND
 	 * @throws Exception
@@ -582,7 +582,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -592,9 +592,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Vote: Suspend 1, Don't Care 2, Don't Suspend 0 == SUSPEND
 	 * @throws Exception
@@ -608,7 +608,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -618,9 +618,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
-		
+		}
+	}
+
 	/**
 	 * Vote: Suspend 1, Don't Care 0, Don't Suspend 2 == SUSPEND
 	 * @throws Exception
@@ -634,7 +634,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint, thread.getBreakpoints()[0]);
@@ -644,9 +644,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Vote: Suspend 0, Don't Care 1, Don't Suspend 2 = RESUME
 	 * @throws Exception
@@ -661,7 +661,7 @@
 		JDIDebugModel.addJavaBreakpointListener(v2);
 		JDIDebugModel.addJavaBreakpointListener(v3);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("Breakpoints");
 			assertNotNull(thread);
 			assertEquals(breakpoint2, thread.getBreakpoints()[0]);
@@ -671,9 +671,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v3);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Vote: Suspend 0, Don't Care 1 (java debug options manager), Don't Suspend 1 = RESUME
 	 * @throws Exception
@@ -684,7 +684,7 @@
 		SuspendVoter v1 = new SuspendVoter(DONT_SUSPEND, breakpoint1);
 		JDIDebugModel.addJavaBreakpointListener(v1);
 		IJavaThread thread = null;
-		try {		
+		try {
 			thread = launchToBreakpoint("DropTests");
 			assertNotNull(thread);
 			assertEquals(breakpoint2, thread.getBreakpoints()[0]);
@@ -692,9 +692,9 @@
 			JDIDebugModel.removeJavaBreakpointListener(v1);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
-	
+		}
+	}
+
 	/**
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpointListener#breakpointHasCompilationErrors(org.eclipse.jdt.debug.core.IJavaLineBreakpoint, org.eclipse.jdt.core.dom.Message[])
 	 */
@@ -743,7 +743,7 @@
 		IJavaDebugTarget target,
 		IJavaBreakpoint breakpoint) {
 			if (breakpoint == fBreakpoint) {
-				fRemoveCallbacks++;				
+				fRemoveCallbacks++;
 			}
 	}
 
@@ -781,7 +781,7 @@
 		EvalualtionBreakpointListener.PROJECT = get14Project();
 		EvalualtionBreakpointListener.EXPRESSION = "return new Integer(i);";
 		EvalualtionBreakpointListener.VOTE = IJavaBreakpointListener.SUSPEND;
-			
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -805,13 +805,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}			
+		}
 	}
-	
+
 	/**
 	 * Tests that a step end that lands on a breakpoint listener that votes to resume
 	 * results in the step completing and suspending.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepEndResumeVote() throws Exception {
@@ -819,7 +819,7 @@
 		IJavaLineBreakpoint first = createLineBreakpoint(16, typeName);
 		IJavaLineBreakpoint second = createLineBreakpoint(17, typeName);
 		second.addBreakpointListener("org.eclipse.jdt.debug.tests.resumeListener");
-			
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, first);
@@ -830,13 +830,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}					
+		}
 	}
-	
+
 	/**
 	 * Test that a step over hitting a breakpoint deeper up the stack with a listener
 	 * can perform an evaluation and resume to complete the step.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepOverHitsNestedEvaluationHandlerResume() throws Exception {
@@ -851,7 +851,7 @@
 		EvalualtionBreakpointListener.EXPRESSION = "return new Integer(sum);";
 		EvalualtionBreakpointListener.VOTE = IJavaBreakpointListener.DONT_SUSPEND;
 		EvalualtionBreakpointListener.RESULT = null;
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, first);
@@ -885,11 +885,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Test that a step over hitting a breakpoint deeper up the stack with a listener
 	 * can perform an evaluation and suspend to abort the step.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testStepOverHitsNestedEvaluationHandlerSuspend() throws Exception {
@@ -904,7 +904,7 @@
 		EvalualtionBreakpointListener.EXPRESSION = "return new Integer(sum);";
 		EvalualtionBreakpointListener.VOTE = IJavaBreakpointListener.SUSPEND;
 		EvalualtionBreakpointListener.RESULT = null;
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, first);
@@ -938,12 +938,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Suspends an evaluation. Ensures we're returned to the proper top frame.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSuspendEvaluation() throws Exception {
@@ -956,7 +956,7 @@
 		EvalualtionBreakpointListener.EXPRESSION = "for (int x = 0; x < 1000; x++) { System.out.println(x);} Thread.sleep(200);";
 		EvalualtionBreakpointListener.VOTE = IJavaBreakpointListener.DONT_SUSPEND;
 		EvalualtionBreakpointListener.RESULT = null;
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, first);
@@ -972,19 +972,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Test that a global listener gets notifications.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGlobalListener() throws Exception {
 		GlobalBreakpointListener.clear();
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -994,18 +994,18 @@
 			assertEquals("Should be INSTALLED", bp, GlobalBreakpointListener.INSTALLED);
 			assertEquals("Should be HIT", bp, GlobalBreakpointListener.HIT);
 			assertNull("Should not be REMOVED", GlobalBreakpointListener.REMOVED);
-						
+
 			bp.delete();
 			assertEquals("Should be REMOVED", bp, GlobalBreakpointListener.REMOVED);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Tests that breakpoint listeners are only notified when condition is true.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testListenersOnConditionalBreakpoint() throws Exception {
@@ -1014,7 +1014,7 @@
 		JDIDebugModel.addJavaBreakpointListener(collector);
 		IJavaLineBreakpoint bp = createConditionalLineBreakpoint(16, typeName, "return false;", true);
 		IJavaLineBreakpoint second = createConditionalLineBreakpoint(17, typeName, "i == 3", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, second);
@@ -1027,11 +1027,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests that breakpoint listeners are only notified when condition is true
 	 * while stepping to a breakpoint.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testListenersOnConditionalBreakpointStepping() throws Exception {
@@ -1040,7 +1040,7 @@
 		JDIDebugModel.addJavaBreakpointListener(collector);
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
 		IJavaLineBreakpoint second = createConditionalLineBreakpoint(17, typeName, "i == 1", true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -1050,7 +1050,7 @@
 			assertTrue("Wrong breakpoint hit", collector.HIT.contains(bp));
 			assertFalse("Wrong breakpoint hit", collector.HIT.contains(second));
 			collector.HIT.clear();
-			
+
 			// resume to line breakpoint again
 			thread = resumeToLineBreakpoint(thread, bp);
 			// step over to next line with conditional (should be true && hit)
@@ -1058,18 +1058,18 @@
 			assertEquals("Wrong number of breakpoints hit", 2, collector.HIT.size());
 			assertTrue("Wrong breakpoint hit", collector.HIT.contains(bp));
 			assertTrue("Wrong breakpoint hit", collector.HIT.contains(second));
-			
+
 		} finally {
 			JDIDebugModel.removeJavaBreakpointListener(collector);
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests that breakpoint listeners are not notified of "hit" when condition has compilation
 	 * errors. Also they should be notified of the compilation errors.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testListenersOnCompilationError() throws Exception {
@@ -1077,7 +1077,7 @@
 		IJavaLineBreakpoint bp = createConditionalLineBreakpoint(17, typeName, "x == 1", true);
 		bp.addBreakpointListener("org.eclipse.jdt.debug.tests.evalListener");
 		EvalualtionBreakpointListener.reset();
-			
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -1088,13 +1088,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that breakpoint listeners are not notified of "hit" when condition has compilation
 	 * errors. Also they should be notified of the compilation errors.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testListenersOnRuntimeError() throws Exception {
@@ -1102,7 +1102,7 @@
 		IJavaLineBreakpoint bp = createConditionalLineBreakpoint(17, typeName, "(new String()).charAt(34) == 'c'", true);
 		bp.addBreakpointListener("org.eclipse.jdt.debug.tests.evalListener");
 		EvalualtionBreakpointListener.reset();
-			
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -1113,51 +1113,51 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Tests addition and removal of breakpoint listeners to a breakpoint.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAddRemoveListeners() throws Exception {
 		try {
 			String typeName = "HitCountLooper";
 			IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
-			
+
 			String[] listeners = bp.getBreakpointListeners();
 			assertEquals(0, listeners.length);
-			
+
 			bp.addBreakpointListener("a");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(1, listeners.length);
 			assertEquals("a", listeners[0]);
-			
+
 			bp.addBreakpointListener("b");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(2, listeners.length);
 			assertEquals("a", listeners[0]);
 			assertEquals("b", listeners[1]);
-			
+
 			bp.addBreakpointListener("c");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(3, listeners.length);
 			assertEquals("a", listeners[0]);
 			assertEquals("b", listeners[1]);
 			assertEquals("c", listeners[2]);
-			
+
 			bp.removeBreakpointListener("a");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(2, listeners.length);
 			assertEquals("b", listeners[0]);
 			assertEquals("c", listeners[1]);
-			
+
 			bp.removeBreakpointListener("c");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(1, listeners.length);
 			assertEquals("b", listeners[0]);
-			
+
 			bp.removeBreakpointListener("b");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(0, listeners.length);
@@ -1165,30 +1165,30 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests addition of duplicate breakpoint listeners to a breakpoint.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAddDuplicateListeners() throws Exception {
 		try {
 			String typeName = "HitCountLooper";
 			IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
-			
+
 			String[] listeners = bp.getBreakpointListeners();
 			assertEquals(0, listeners.length);
-			
+
 			bp.addBreakpointListener("a");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(1, listeners.length);
 			assertEquals("a", listeners[0]);
-			
+
 			bp.addBreakpointListener("a");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(1, listeners.length);
-			assertEquals("a", listeners[0]);		
-			
+			assertEquals("a", listeners[0]);
+
 			bp.addBreakpointListener("b");
 			listeners = bp.getBreakpointListeners();
 			assertEquals(2, listeners.length);
@@ -1197,40 +1197,40 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests that listeners can be retrieved after breakpoint deletion.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetListenersAfterDelete() throws Exception {
 		try {
 			String typeName = "HitCountLooper";
 			IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
-			
+
 			String[] listeners = bp.getBreakpointListeners();
 			assertEquals(0, listeners.length);
-			
+
 			bp.addBreakpointListener("a");
 			bp.addBreakpointListener("b");
-			
+
 			listeners = bp.getBreakpointListeners();
 			assertEquals(2, listeners.length);
 			assertEquals("a", listeners[0]);
 			assertEquals("b", listeners[1]);
-			
+
 			bp.delete();
 			listeners = bp.getBreakpointListeners();
 			assertEquals(2, listeners.length);
 			assertEquals("a", listeners[0]);
 			assertEquals("b", listeners[1]);
-			
+
 		} finally {
 			removeAllBreakpoints();
 		}
-	}		
-	
+	}
+
 	/**
 	 * Tests a breakpoint listener extension gets removal notification when the underlying
 	 * marker is deleted.
@@ -1241,11 +1241,11 @@
 		bp.addBreakpointListener("org.eclipse.jdt.debug.tests.evalListener");
 		EvalualtionBreakpointListener.reset();
 		EvalualtionBreakpointListener.VOTE = SUSPEND;
-			
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
-			assertTrue(EvalualtionBreakpointListener.HIT);			
+			assertTrue(EvalualtionBreakpointListener.HIT);
 			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
 				@Override
 				public void run(IProgressMonitor monitor) throws CoreException {
@@ -1266,7 +1266,7 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}					
-	}	
-	
+		}
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests.java
index e8bb51a..bbcca75 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,7 +32,7 @@
  * Tests method breakpoints.
  */
 public class MethodBreakpointTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -51,30 +51,30 @@
 		bps.add(createMethodBreakpoint(typeName, "method4", "()V", true, false));
 		// method 1 - exit
 		bps.add(createMethodBreakpoint(typeName, "method1", "()V", false, true));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", bps.get(0),hit);
 
-			// onto the next breakpoint			
+			// onto the next breakpoint
 			thread = resume(thread);
-			
+
 			hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
-			assertEquals("should hit exit breakpoint second", bps.get(1), hit);			
+			assertEquals("should hit exit breakpoint second", bps.get(1), hit);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests the 'stop in main' launching preference
 	 * {@link IJavaLaunchConfigurationConstants#ATTR_STOP_IN_MAIN}
@@ -86,27 +86,27 @@
 		assertNotNull("Could not find launch config", config);
 		ILaunchConfigurationWorkingCopy wc = config.copy("DropTests - Stop in main");
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_STOP_IN_MAIN, true);
-		config = wc.doSave();		
-		
+		config = wc.doSave();
+
 		IJavaThread thread= null;
 		try {
 			thread= launchAndSuspend(config);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertTrue("Should be in 'main'", frame.getMethodName().equals("main") && frame.isStatic());
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
-	 * Tests disabled method entry and exit breakpoints 
+	 * Tests disabled method entry and exit breakpoints
 	 * @throws Exception
 	 */
 	public void testDisabledEntryAndExitBreakpoints() throws Exception {
@@ -116,17 +116,17 @@
 		bp1.setEnabled(false);
 		// method 1 - exit
 		IBreakpoint bp2 = createMethodBreakpoint(typeName, "method1", "()V", false, true);
-		bp2.setEnabled(false);		
-		
+		bp2.setEnabled(false);
+
 		IJavaDebugTarget debugTarget= null;
 		try {
 			debugTarget= launchAndTerminate(typeName);
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that a method is NOT hit in an inner class
 	 * @throws Exception
@@ -136,26 +136,26 @@
 		List<IJavaMethodBreakpoint> bps = new ArrayList<IJavaMethodBreakpoint>();
 		// method b - entry
 		bps.add(createMethodBreakpoint(typeNamePattern, "b", "()V", true, false));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeNamePattern);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", bps.get(0),hit);
 
-		
+
 			resumeAndExit(thread);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that a given method IS hit in an inner class
 	 * @throws Exception
@@ -165,13 +165,13 @@
 		List<IJavaMethodBreakpoint> bps = new ArrayList<IJavaMethodBreakpoint>();
 		// method b - entry
 		bps.add(createMethodBreakpoint(typeNamePattern, "b", "()V", true, false));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint("A");
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", bps.get(0),hit);
@@ -185,17 +185,17 @@
 			hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", bps.get(0),hit);
-			
+
 			thread= resume(thread);
 			hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", bps.get(0),hit);
-			
+
 			resumeAndExit(thread);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -206,26 +206,26 @@
 		String typeName = "MethodLoop";
 		IJavaMethodBreakpoint bp = createMethodBreakpoint(typeName, "calculateSum", "()V", true, false);
 		bp.setHitCount(3);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Method entry breakpoint not hit within timeout period", thread);
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "sum");
 			assertNotNull("Could not find variable 'sum'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'sum' has no value", value);
 			int iValue = value.getIntValue();
-			assertTrue("value of 'sum' should be '3', but was " + iValue, iValue == 3);			
-			
+			assertTrue("value of 'sum' should be '3', but was " + iValue, iValue == 3);
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -236,28 +236,28 @@
 		String typeName = "MethodLoop";
 		IJavaMethodBreakpoint bp = createMethodBreakpoint(typeName, "calculateSum", "()V", false, true);
 		bp.setHitCount(3);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Method exit breakpoint not hit within timeout period", thread);
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "sum");
 			assertNotNull("Could not find variable 'sum'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'sum' has no value", value);
 			int iValue = value.getIntValue();
-			assertTrue("value of 'sum' should be '6', but was " + iValue, iValue == 6);			
-			
+			assertTrue("value of 'sum' should be '6', but was " + iValue, iValue == 6);
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests an inclusive thread filter on a method breakpoint
 	 * @throws Exception
@@ -266,29 +266,29 @@
 		String typeName = "MethodLoop";
 		IJavaMethodBreakpoint methodBp = createMethodBreakpoint(typeName, "calculateSum", "()V", true, false);
 		createLineBreakpoint(18, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName, false);
 			assertNotNull("breakpoint not hit within timeout period", thread);
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
-			
+
 			// set a thread filter (to the main thread)
 			methodBp.setThreadFilter(thread);
-			
+
 			thread = resume(thread);
 			assertNotNull("breakpoint not hit", thread);
-			
+
 			frame = (IJavaStackFrame)thread.getTopStackFrame();
 			assertEquals("should be in 'calucateSum'", "calculateSum", frame.getMethodName());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests an exclusive thread filter on a method breakpoint
 	 * @throws Exception
@@ -297,14 +297,14 @@
 		String typeName = "MethodLoop";
 		IJavaMethodBreakpoint methodBp = createMethodBreakpoint(typeName, "calculateSum", "()V", true, false);
 		createLineBreakpoint(18, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName, false);
 			assertNotNull("breakpoint not hit within timeout period", thread);
-			
+
 			thread.getTopStackFrame();
-			
+
 			// set a thread filter (*not* the main thread)
 			IThread[] threads = thread.getDebugTarget().getThreads();
 			for (int i = 0; i < threads.length; i++) {
@@ -315,14 +315,14 @@
 				}
 			}
 			assertNotNull("Did not set thread filter",methodBp.getThreadFilter((IJavaDebugTarget)thread.getDebugTarget()));
-			
+
 			resumeAndExit(thread);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Test for bug 33551
 	 * Tests that a method breakpoint is hit properly in the default package
@@ -330,13 +330,13 @@
 	 */
 	public void testEntryDefaultPackageReturnType() throws Exception {
 		String typeName = "DefPkgReturnType";
-		IJavaMethodBreakpoint bp = createMethodBreakpoint(typeName, "self", "()LDefPkgReturnType;", true, false);		
-		
+		IJavaMethodBreakpoint bp = createMethodBreakpoint(typeName, "self", "()LDefPkgReturnType;", true, false);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint", bp,hit);
@@ -344,9 +344,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Test for bug 43611
 	 * Tests that the debug model presentation is returning the correct signature for a specific method breakpoint
@@ -364,7 +364,7 @@
 			modelPresentation.dispose();
 		}
 	}
-	
+
 	/**
 	 * Test for bug 43611
 	 * Tests that the debug model presentation handles a label with no name for a specific method breakpoint
@@ -381,8 +381,8 @@
 			removeAllBreakpoints();
 			modelPresentation.dispose();
 		}
-	}	
-	
+	}
+
 	/**
 	 * Test for bug 43611
 	 * Tests that the debug model presentation handles no signature or method name for a specific
@@ -400,8 +400,8 @@
 			removeAllBreakpoints();
 			modelPresentation.dispose();
 		}
-	}		
-	
+	}
+
 	/**
 	 * Tests that a specific method breakpoint is skipped when set to do so
 	 * @throws Exception
@@ -413,23 +413,23 @@
 		bps.add(createMethodBreakpoint(typeName, "method4", "()V", true, false));
 		// method 1 - exit
 		bps.add(createMethodBreakpoint(typeName, "method1", "()V", false, true));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", bps.get(0),hit);
 
-			getBreakpointManager().setEnabled(false);			
+			getBreakpointManager().setEnabled(false);
 			resumeAndExit(thread);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			getBreakpointManager().setEnabled(true);
-		}		
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests15.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests15.java
index fcb5d4e..7d29f20 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests15.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MethodBreakpointTests15.java
@@ -27,7 +27,7 @@
  * Tests method breakpoints for 1.5 source code.
  */
 public class MethodBreakpointTests15 extends AbstractDebugTest {
-	
+
 	public MethodBreakpointTests15(String name) {
 		super(name);
 	}
@@ -38,30 +38,30 @@
 	@Override
 	protected IJavaProject getProjectContext() {
 		return get15Project();
-	}	
-	
+	}
+
 	public void testStaticTypeParameter() throws Exception {
 		IJavaMethodBreakpoint breakpoint  = createBreakpoint(25);
 		assertEquals("Wrong method", "staticTypeParameter", breakpoint.getMethodName());
-		runToBreakpoint(getTypeName(), breakpoint);		
+		runToBreakpoint(getTypeName(), breakpoint);
 	}
-	
+
 	public void testTypeParameter() throws Exception {
 		IJavaMethodBreakpoint breakpoint  = createBreakpoint(29);
 		assertEquals("Wrong method", "typeParameter", breakpoint.getMethodName());
 		runToBreakpoint(getTypeName(), breakpoint);
 	}
-	
+
 	public void testMethodTypeParameter() throws Exception {
 		IJavaMethodBreakpoint breakpoint  = createBreakpoint(34);
 		assertEquals("Wrong method", "methodTypeParameter", breakpoint.getMethodName());
-		runToBreakpoint(getTypeName(), breakpoint);	
-	}	
-	
+		runToBreakpoint(getTypeName(), breakpoint);
+	}
+
 	private String getTypeName() {
 		return "a.b.c.MethodBreakpoints";
 	}
-	
+
 	private IJavaMethodBreakpoint createBreakpoint(int line) throws Exception {
 		IType type = get15Project().findType(getTypeName());
 		assertNotNull("Missing file", type);
@@ -78,7 +78,7 @@
 		try {
 			thread= launchToBreakpoint(get15Project(), typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("should hit entry breakpoint first", mbp,hit);
@@ -87,7 +87,7 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
-	}	
+	}
 
 	/**
 	 * @throws Exception
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java
index e5cb2e7..ce57fc9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,11 +24,11 @@
  */
 public class MiscBreakpointsTests extends AbstractDebugTest {
 
-	private static final String COMPILE_ERROR_CONTENTS = 
+	private static final String COMPILE_ERROR_CONTENTS =
 	 "public class CompileError {\npublic static void main(String[] args) {\nString foo = \"foo\" + bar;\n}	\n}";
 
 	private static final String ORIGINAL_CONTENTS = "public class CompileError {\npublic static void main(String[] args) {\n}\n}";
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -45,19 +45,19 @@
 	public void testSuspendOnUncaughtExceptions() throws Exception {
 		String typeName = "ThrowsNPE";
 		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, true);
-				
+
 		IJavaThread javaThread = null;
 		try {
 			javaThread= launchAndSuspend(typeName);
-			
+
 			int stackLine = javaThread.getTopStackFrame().getLineNumber();
 			assertTrue("line number should be '26', but was " + stackLine, stackLine == 26);
-		
+
 		} finally {
             getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
 			terminateAndRemove(javaThread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -68,19 +68,19 @@
 	public void testSuspendOnCompilationErrors() throws Exception {
 		String typeName = "CompileError";
 		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
-		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, true);		
-		
+		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, true);
+
 		IType type = get14Project().findType(typeName);
 		ICompilationUnit cu = type.getCompilationUnit();
 		setFileContents(cu, COMPILE_ERROR_CONTENTS);
-		
+
 		IJavaThread javaThread = null;
 		try {
 			javaThread= launchAndSuspend(typeName);
-			
+
 			int stackLine = javaThread.getTopStackFrame().getLineNumber();
 			assertTrue("line number should be '3', but was " + stackLine, stackLine == 3);
-		
+
 		} finally {
             getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
             getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, false);
@@ -88,7 +88,7 @@
 			removeAllBreakpoints();
 			//restore the file to remove compile errors
 			setFileContents(cu, ORIGINAL_CONTENTS);
-		}		
+		}
 	}
 
 	/**
@@ -99,12 +99,12 @@
 	public void testDontSuspendOnCompilationErrors() throws Exception {
 		String typeName = "CompileError";
 		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
-		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, false);		
-		
+		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, false);
+
 		IType type = get14Project().findType(typeName);
 		ICompilationUnit cu = type.getCompilationUnit();
 		setFileContents(cu, COMPILE_ERROR_CONTENTS);
-		
+
 		IJavaDebugTarget debugTarget = null;
 		try {
 			debugTarget= launchAndTerminate(typeName);
@@ -112,7 +112,7 @@
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
 			setFileContents(cu, ORIGINAL_CONTENTS);
-		}		
+		}
 	}
 
 	/**
@@ -122,22 +122,22 @@
 	 */
 	public void testDontSuspendOnUncaughtExceptions() throws Exception {
 		String typeName = "ThrowsNPE";
-		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);		
-		
+		getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, false);
+
 		IJavaDebugTarget debugTarget= null;
 		try {
 			debugTarget = launchAndTerminate(typeName);
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Returns the <code>JDIDebugUIPlugin</code> preference store
 	 * @return
 	 */
 	protected IPreferenceStore getPrefStore() {
-		return JDIDebugUIPlugin.getDefault().getPreferenceStore();		
+		return JDIDebugUIPlugin.getDefault().getPreferenceStore();
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PatternBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PatternBreakpointTests.java
index 95c8412..f9d3e87 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PatternBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PatternBreakpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
  */
 @SuppressWarnings("deprecation")
 public class PatternBreakpointTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -66,7 +66,7 @@
 		bps.add(createPatternBreakpoint(72, sourceName, pattern));
 		// instance method
 		bps.add(createPatternBreakpoint(107, sourceName, pattern));
-		// static method 
+		// static method
 		bps.add(createPatternBreakpoint(53, sourceName, pattern));
 		// case statement
 		bps.add(createPatternBreakpoint(133, sourceName, pattern));
@@ -80,8 +80,8 @@
 		bps.add(createPatternBreakpoint(118, sourceName, pattern));
 		// while
 		bps.add(createPatternBreakpoint(97, sourceName, pattern));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint("Breakpoints", false);
@@ -104,9 +104,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Bug 74108 - enable/disable a stratum breakpoint that is not yet installed
 	 * @throws Exception
@@ -135,9 +135,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Bug 74108 - enable/disable a pattern breakpoint that is not yet installed
 	 * @throws Exception
@@ -166,9 +166,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that a pattern breakpoint is skipped when set to do so
 	 * @throws Exception
@@ -201,7 +201,7 @@
 		bps.add(createPatternBreakpoint(72, sourceName, pattern));
 		// instance method
 		bps.add(createPatternBreakpoint(107, sourceName, pattern));
-		// static method 
+		// static method
 		bps.add(createPatternBreakpoint(53, sourceName, pattern));
 		// case statement
 		bps.add(createPatternBreakpoint(133, sourceName, pattern));
@@ -215,8 +215,8 @@
 		bps.add(createPatternBreakpoint(118, sourceName, pattern));
 		// while
 		bps.add(createPatternBreakpoint(97, sourceName, pattern));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint("Breakpoints");
@@ -227,6 +227,6 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			getBreakpointManager().setEnabled(true);
-		}		
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PreLaunchBreakpointTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PreLaunchBreakpointTest.java
index 8ab5b75..c7e35ea 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PreLaunchBreakpointTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/PreLaunchBreakpointTest.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
  * Tests launch notification.
  */
 public class PreLaunchBreakpointTest extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -34,17 +34,17 @@
 	public PreLaunchBreakpointTest(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests that the perspective will switch if breakpoints are detected and the program was launched in
 	 * 'run' mode
 	 * @throws Exception
 	 */
 	public void testRunModeLaunchWithBreakpoints() throws Exception {
-		String typeName = "Breakpoints";		
-		
+		String typeName = "Breakpoints";
+
 		ILaunchConfiguration configuration = getLaunchConfiguration(typeName);
-		
+
 		IPreferenceStore preferenceStore = DebugUIPlugin.getDefault().getPreferenceStore();
 		preferenceStore.setValue(IInternalDebugUIConstants.PREF_RELAUNCH_IN_DEBUG_MODE, MessageDialogWithToggle.ALWAYS);
 		IJavaThread thread = null;
@@ -56,7 +56,7 @@
 			Object suspendee= waiter.waitForEvent();
 			assertTrue("Program did not suspend", suspendee instanceof IJavaThread);
 			thread = (IJavaThread) suspendee;
-			
+
 		} catch (Exception e) {
 			e.printStackTrace();
 		} finally {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RunToLineTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RunToLineTests.java
index a49961b..22da8a3 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RunToLineTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RunToLineTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,7 +38,7 @@
  * Tests run to line debug functionality
  */
 public class RunToLineTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -49,7 +49,7 @@
 
 	private Object fLock = new Object();
 	private IEditorPart fEditor = null;
-	
+
 	class MyListener implements IPerspectiveListener2 {
 
 		/**
@@ -76,43 +76,43 @@
 		 * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
 		 */
 		@Override
-		public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {			
+		public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
 		}
 	}
 
 	/**
 	 * Test a run to line, with no extra breakpoints.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testRunToLine() throws Exception {
 	    runToLine(55, 55, true);
 	}
-	
+
 	/**
 	 * Test a run to line, with an extra breakpoint, and preference to skip
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testRunToLineSkipBreakpoint() throws Exception {
 	    createLineBreakpoint(53, "Breakpoints");
 	    runToLine(55, 55, true);
-	}	
-	
+	}
+
 	/**
 	 * Test a run to line, with an extra breakpoint, and preference to *not* skip
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testRunToLineHitBreakpoint() throws Exception {
 	    createLineBreakpoint(53, "Breakpoints");
 	    runToLine(55, 53, false);
-	}	
+	}
 
 	/**
 	 * Runs to the given line number in the 'Breakpoints' source file, after stopping at the
 	 * first line in the main method.
-	 * 
+	 *
 	 * @param lineNumber line number to run to, ONE BASED
 	 * @param expectedLineNumber the line number to be on after run-to-line (may differ from
 	 *  the target line number if the option to skip breakpoints is off).
@@ -122,7 +122,7 @@
 	public void runToLine(final int lineNumber, int expectedLineNumber, boolean skipBreakpoints) throws Exception {
 		String typeName = "Breakpoints";
 		IJavaLineBreakpoint breakpoint = createLineBreakpoint(52, typeName);
-		
+
 		boolean restore = DebugUITools.getPreferenceStore().getBoolean(IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE);
 		DebugUITools.getPreferenceStore().setValue(IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE, skipBreakpoints);
 		IJavaThread thread= null;
@@ -139,7 +139,7 @@
             };
             Display display = DebugUIPlugin.getStandardDisplay();
             display.syncExec(closeAll);
-            
+
 			thread= launchToLineBreakpoint(typeName, breakpoint);
 			// wait for editor to open
 			synchronized (fLock) {
@@ -148,20 +148,20 @@
 			    }
             }
 			if (fEditor == null) {
-				Runnable r = new Runnable() {				
+				Runnable r = new Runnable() {
 					@Override
 					public void run() {
 						IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
 	                    IEditorPart activeEditor = activeWorkbenchWindow.getActivePage().getActiveEditor();
                         if (activeEditor != null) {
-                            System.out.println("ACTIVE: " + activeEditor.getTitle());    
+                            System.out.println("ACTIVE: " + activeEditor.getTitle());
                         }
 					}
 				};
 				display.syncExec(r);
 			}
 			assertNotNull("Editor did not open", fEditor);
-			
+
 			final Exception[] exs = new Exception[1];
 			final IJavaThread suspendee = thread;
 			Runnable r = new Runnable() {
@@ -204,7 +204,7 @@
                 }
             };
             Display display = DebugUIPlugin.getStandardDisplay();
-            display.syncExec(cleanup);			
-		}		
+            display.syncExec(cleanup);
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/SuspendVMBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/SuspendVMBreakpointsTests.java
index 3cdeebe..07ef5ec 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/SuspendVMBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/SuspendVMBreakpointsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -44,18 +44,18 @@
 		String typeName = "MultiThreadedLoop";
 		IJavaLineBreakpoint bp = createLineBreakpoint(40, typeName);
 		bp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
-			
+
 			verifyAllThreadsSuspended(thread);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -64,37 +64,37 @@
 	 */
 	public void testSuspendVmExceptionBreakpoint() throws Exception {
 		String typeName = "ThrowsNPE";
-		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);		
+		IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false);
 		ex.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("suspended, but not by exception breakpoint", ex ,hit);
-			
+
 			verifyAllThreadsSuspended(thread);
-			
+
 			ex.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that the VM is suspended when a specific access watchpoint is hit
 	 * @throws Exception
 	 */
 	public void testSuspendVmAccessWatchpointBreakpoint() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, false);
 		wp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -104,16 +104,16 @@
 			IStackFrame frame = thread.getTopStackFrame();
 			assertNotNull("No breakpoint", hit);
 			assertTrue("Should be an access", wp.isAccessSuspend(thread.getDebugTarget()));
-			assertEquals("Should be line 30", 30, frame.getLineNumber());			
-			
+			assertEquals("Should be line 30", 30, frame.getLineNumber());
+
 			verifyAllThreadsSuspended(thread);
-			
+
 			wp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Tests that the VM is suspended when a specific modification watchpoint is hit
@@ -121,10 +121,10 @@
 	 */
 	public void testSuspendVmModificationWatchpointBreakpoint() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", false, true);
 		wp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -133,21 +133,21 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			IStackFrame frame = thread.getTopStackFrame();
 			assertNotNull("No breakpoint", hit);
-			
+
 			// should be modification
 			assertTrue("First hit should be modification", !wp.isAccessSuspend(thread.getDebugTarget()));
 			// line 27
 			assertEquals("Should be on line 27", 27, frame.getLineNumber());
-			
+
 			verifyAllThreadsSuspended(thread);
-			
+
 			wp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that the VM is suspended when a specific method entry breakpoint is hit
 	 * @throws Exception
@@ -156,50 +156,50 @@
 		String typeName = "DropTests";
 		IJavaBreakpoint bp = createMethodBreakpoint(typeName, "method4", "()V", true, false);
 		bp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertTrue("breakpoint was not a method breakpoint", hit instanceof IJavaMethodBreakpoint);
 
 			verifyAllThreadsSuspended(thread);
-			
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that the VM is suspended when a specific method exit breakpoint is hit
 	 * @throws Exception
 	 */
 	public void testSuspendVmMethodExitBreakpoint() throws Exception {
 		String typeName = "DropTests";
-		IJavaBreakpoint bp = createMethodBreakpoint(typeName, "method1", "()V", false, true);		
+		IJavaBreakpoint bp = createMethodBreakpoint(typeName, "method1", "()V", false, true);
 		bp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertTrue("breakpoint was not a method breakpoint", hit instanceof IJavaMethodBreakpoint);
 
 			verifyAllThreadsSuspended(thread);
-						
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Verifies that all of the threads of the related debug target are suspended
 	 * @param thread
@@ -210,9 +210,9 @@
 			IThread[] threads = debugTarget.getThreads();
 			for (int i = 0; i < threads.length; i++) {
 				assertTrue("Thread wasn't suspended when a SUSPEND_VM breakpoint was hit, thread=" + threads[i].getName(), threads[i].isSuspended());
-			}		
+			}
 		} catch (DebugException e) {
 			fail(e.getMessage());
 		}
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TargetPatternBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TargetPatternBreakpointTests.java
index c384f43..87d0a2f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TargetPatternBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TargetPatternBreakpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,7 +32,7 @@
  * Tests deferred target pattern breakpoints.
  */
 public class TargetPatternBreakpointTests extends AbstractDebugTest implements IJavaBreakpointListener {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -47,7 +47,7 @@
 	 */
 	public void testTargetPatternBreakpoints() throws Exception {
 		JDIDebugPlugin.getDefault().addJavaBreakpointListener(this);
-		
+
 		String sourceName = "Breakpoints.java";
 		List<IJavaTargetPatternBreakpoint> bps = new ArrayList<IJavaTargetPatternBreakpoint>();
 		// anonymous class
@@ -74,7 +74,7 @@
 		bps.add(createTargetPatternBreakpoint(72, sourceName));
 		// instance method
 		bps.add(createTargetPatternBreakpoint(107, sourceName));
-		// static method 
+		// static method
 		bps.add(createTargetPatternBreakpoint(53, sourceName));
 		// case statement
 		bps.add(createTargetPatternBreakpoint(133, sourceName));
@@ -88,8 +88,8 @@
 		bps.add(createTargetPatternBreakpoint(118, sourceName));
 		// while
 		bps.add(createTargetPatternBreakpoint(97, sourceName));
-		
-		
+
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint("Breakpoints", false);
@@ -113,7 +113,7 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			JDIDebugPlugin.getDefault().removeJavaBreakpointListener(this);
-		}		
+		}
 	}
 	/**
 	 * @see IJavaBreakpointListener#addingBreakpoint(IJavaDebugTarget, IJavaBreakpoint)
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget.java
index 5099803..7da9341 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget.java
@@ -25,11 +25,11 @@
 	public TestToggleBreakpointsTarget(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests that qualified names get created for line breakpoints in external
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testExternalLineBreakpoint() throws Exception {
@@ -49,11 +49,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests that qualified names get created for watchpoints in external
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testExternalWatchpoint() throws Exception {
@@ -72,12 +72,12 @@
 			manager.removeBreakpointListener(listener);
 			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests that qualified names get created for method breakpoints in external
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testExternalMethodBreakpoint() throws Exception {
@@ -99,6 +99,6 @@
 			manager.removeBreakpointListener(listener);
 			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget8.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget8.java
index 59394df..d864bac 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget8.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TestToggleBreakpointsTarget8.java
@@ -20,10 +20,10 @@
  * Tests the Java debugger's 'toggle breakpoints target'.
  */
 public class TestToggleBreakpointsTarget8 extends AbstractToggleBreakpointsTarget {
-	
-	
-	
-	
+
+
+
+
 	public TestToggleBreakpointsTarget8(String name) {
 		super(name);
 		// TODO Auto-generated constructor stub
@@ -32,7 +32,7 @@
 	/**
 	 * Tests that qualified names get created for method breakpoints in default method of Java 8 interface
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInterfaceDefaultMethodBreakpoint() throws Exception {
@@ -53,11 +53,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests that qualified names get created for method breakpoints in Static method of Java 8 interface
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInterfaceStaticMethodBreakpoint() throws Exception {
@@ -78,12 +78,12 @@
 			removeAllBreakpoints();
 		}
 	}
-	
-		
+
+
 	/**
 	 * Tests that qualified names does get created for method breakpoints in unimplemented method of Java 8 interface
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInterfaceUnimplementedMethodBreakpoint() throws Exception {
@@ -99,11 +99,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests that qualified names get created for line breakpoints in Interface implemented method
 	 * files.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInterfaceLineBreakpoint() throws Exception {
@@ -123,5 +123,5 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ThreadFilterBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ThreadFilterBreakpointsTests.java
index 5bd71bd..dab9328 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ThreadFilterBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ThreadFilterBreakpointsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,19 +36,19 @@
 	public void testSimpleThreadFilterBreakpoint() throws Exception {
 		String typeName = "HitCountLooper";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
 
 			bp.setThreadFilter(thread);
 			resumeToLineBreakpoint(thread, bp);
-						
+
 			bp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -58,23 +58,23 @@
 	public void testMultiThreadFilterBreakpoint() throws Exception {
 		String typeName = "MultiThreadedLoop";
 		IJavaLineBreakpoint bp1 = createLineBreakpoint(17, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp1);
-			
+
 			IJavaLineBreakpoint bp2 = createLineBreakpoint(40, typeName);
 			bp2.setThreadFilter(thread);
-			
+
 			thread = resumeToLineBreakpoint(thread, bp2);
 			assertTrue("Suspended thread should have been '1stThread'", thread.getName().equals("1stThread"));
-						
+
 			bp1.delete();
 			bp2.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
@@ -84,23 +84,23 @@
 	public void testExceptionThreadFilterBreakpoint() throws Exception {
 		String typeName = "MultiThreadedException";
 		IJavaLineBreakpoint bp1 = createLineBreakpoint(17, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp1);
 			IJavaExceptionBreakpoint ex1 = createExceptionBreakpoint("java.lang.NullPointerException", false, true);
 			ex1.setThreadFilter(thread);
-			
+
 			thread = resume(thread);
 			assertTrue("Suspended thread should have been '1stThread'", thread.getName().equals("1stThread"));
-			
+
 			bp1.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-			
+
 	/**
 	 * Tests that a thread filter works for a specific watchpoint
 	 * @throws Exception
@@ -108,24 +108,24 @@
 	public void testAccessWatchpointThreadFilterBreakpoint() throws Exception {
 		String typeName = "MultiThreadedList";
 		IJavaLineBreakpoint bp1 = createLineBreakpoint(21, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp1);
-			IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, false);			
-			wp.setThreadFilter(thread);			
-			
+			IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, false);
+			wp.setThreadFilter(thread);
+
 			thread = resume(thread);
 			assertTrue("Suspended thread should have been '1stThread'", thread.getName().equals("1stThread"));
-			
+
 			bp1.delete();
 			wp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-			
+
 	/**
 	 * Tests that a thread filter is working for a specific modification watchpoint
 	 * @throws Exception
@@ -133,21 +133,21 @@
 	public void testModificationWatchpointThreadFilterBreakpoint() throws Exception {
 		String typeName = "MultiThreadedList";
 		IJavaLineBreakpoint bp1 = createLineBreakpoint(22, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp1);
-			IJavaWatchpoint wp = createWatchpoint(typeName, "i", false, true);			
-			wp.setThreadFilter(thread);			
-			
+			IJavaWatchpoint wp = createWatchpoint(typeName, "i", false, true);
+			wp.setThreadFilter(thread);
+
 			thread = resume(thread);
 			assertTrue("Suspended thread should have been '1stThread'", thread.getName().equals("1stThread"));
-			
+
 			bp1.delete();
 			wp.delete();
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TriggerPointBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TriggerPointBreakpointsTests.java
index 37cc3d7..91b519e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TriggerPointBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TriggerPointBreakpointsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,7 +32,7 @@
 
 	/**
 	 * Tests the trigger point
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testTriggerPointBreakpoint() throws Exception {
@@ -40,7 +40,7 @@
 		IJavaLineBreakpoint bp1 = createLineBreakpoint(25, typeName);
 		IJavaLineBreakpoint bp2 = createLineBreakpoint(30, typeName);
 		bp2.setTriggerPoint(true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread = launchToLineBreakpoint(typeName, bp2);
@@ -48,7 +48,7 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable var = findVariable(frame, "i");
 			assertNotNull("Could not find variable 'i'", var);
-			
+
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull("variable 'i' has no value", value);
 			int iValue = value.getIntValue();
@@ -56,7 +56,7 @@
 
 			var = findVariable(frame, "j");
 			assertNotNull("Could not find variable 'j'", var);
-			
+
 			value = (IJavaPrimitiveValue) var.getValue();
 			assertNotNull("variable 'j' has no value", value);
 			int jValue = value.getIntValue();
@@ -67,6 +67,6 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TypeNameBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TypeNameBreakpointTests.java
index 212d404..e19efdb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TypeNameBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/TypeNameBreakpointTests.java
@@ -34,7 +34,7 @@
 
 /**
  * Tests getting and setting the type name for Java breakpoints
- * 
+ *
  * @since 3.8.200
  */
 public class TypeNameBreakpointTests extends AbstractDebugTest {
@@ -72,7 +72,7 @@
 
 	/**
 	 * Tests the {@link JavaDebugUtils#typeNamesEqual(String, String)} method
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testTypeNamesEqual() throws Exception {
@@ -84,7 +84,7 @@
 
 	/**
 	 * Returns the {@link IResource} for the class HitCountLooper
-	 * 
+	 *
 	 * @return the {@link IResource} for HitCountLooper
 	 */
 	IResource getTestResource() throws Exception {
@@ -93,7 +93,7 @@
 
 	/**
 	 * Util to get a line breakpoint with a null type name
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -105,7 +105,7 @@
 
 	/**
 	 * Util to get an exception breakpoint with a null type
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -117,7 +117,7 @@
 
 	/**
 	 * Util to get a method entry breakpoint with a null type
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -129,7 +129,7 @@
 
 	/**
 	 * Util to get a stratum line breakpoint with no type
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -141,7 +141,7 @@
 
 	/**
 	 * Util to get a class prepare breakpoint with a null type
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -153,7 +153,7 @@
 
 	/**
 	 * Util to get a watchpoint with a null type
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -167,7 +167,7 @@
 
 	/**
 	 * Util to get a method breakpoint with a null type
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -180,7 +180,7 @@
 	/**
 	 * Tests {@link JDIDebugModel#createLineBreakpoint(org.eclipse.core.resources.IResource, String, int, int, int, int, boolean, java.util.Map)} with
 	 * a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testCreateLineBPNullTypeName() throws Exception {
@@ -197,7 +197,7 @@
 	 * Tests the
 	 * {@link JDIDebugModel#createMethodBreakpoint(IResource, String, String, String, boolean, boolean, boolean, int, int, int, int, boolean, java.util.Map)}
 	 * method with null type infos
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testCreateMethodBPNullTypeName() throws Exception {
@@ -213,7 +213,7 @@
 	/**
 	 * Tests the {@link JDIDebugModel#createExceptionBreakpoint(IResource, String, boolean, boolean, boolean, boolean, java.util.Map)} method with
 	 * null type infos
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testCreateExceptionBPNullTypeName() throws Exception {
@@ -229,7 +229,7 @@
 	/**
 	 * Tests the {@link JDIDebugModel#createClassPrepareBreakpoint(IResource, String, int, int, int, boolean, java.util.Map)} method with null type
 	 * infos
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testCreateClassPrepareBPNullTypeName() throws Exception {
@@ -245,7 +245,7 @@
 	/**
 	 * Tests the {@link JDIDebugModel#createWatchpoint(IResource, String, String, int, int, int, int, boolean, java.util.Map)} method with null type
 	 * infos
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testCreateWatchpointBPNullTypeName() throws Exception {
@@ -261,7 +261,7 @@
 	/**
 	 * Tests the {@link JDIDebugModel#createStratumBreakpoint(IResource, String, String, String, String, int, int, int, int, boolean, java.util.Map)}
 	 * method with null type infos
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testCreateStratumBPNullTypeName() throws Exception {
@@ -277,7 +277,7 @@
 	/**
 	 * Tests the {@link JDIDebugModel#createMethodEntryBreakpoint(IResource, String, String, String, int, int, int, int, boolean, java.util.Map)}
 	 * method with null type infos
-	 * 
+	 *
 	 * @throws Excpetion
 	 */
 	public void testCreateMethodEntryBPNullTypeName() throws Exception {
@@ -292,7 +292,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getMarkerTypeName}
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationNullTypeName() throws Exception {
@@ -308,7 +308,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getExceptionBreakpointText} with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationTypeNameNull2() throws Exception {
@@ -324,7 +324,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getLineBreakpointText} with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationTypeNameNull3() throws Exception {
@@ -340,7 +340,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getClassPrepareBreakpointText} with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationTypeNameNull4() throws Exception {
@@ -356,7 +356,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getWatchpointText} with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationTypeNameNull5() throws Exception {
@@ -372,7 +372,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getMethodBreakpointText} with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationTypeNameNull6() throws Exception {
@@ -388,7 +388,7 @@
 
 	/**
 	 * Tests the {@link JDIModelPresentation#getStratumLineBreakpointText} with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetPresentationTypeNameNull7() throws Exception {
@@ -404,7 +404,7 @@
 
 	/**
 	 * Tests the {@link JDIDebugModel#lineBreakpointExists(String, int)} method
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testJDIDebugModelTypeName2() throws Exception {
@@ -419,7 +419,7 @@
 
 	/**
 	 * Tests the {@link JDIDebugModel#lineBreakpointExists(String, int)} method with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testJDIModelTypeNameNull1() throws Exception {
@@ -434,7 +434,7 @@
 
 	/**
 	 * Tests that launching with a null typed breakpoint does not suspend and does not cause a failure while trying to create requests
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testLaunchNullTypeLineBreakpoint() throws Exception {
@@ -452,7 +452,7 @@
 
 	/**
 	 * Tests launching with an exception breakpoint with a null type name
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testLaunchNullTypeExceptionBreakpoint() throws Exception {
@@ -470,7 +470,7 @@
 
 	/**
 	 * Tests launching with a watchpoint with a null type
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testLaunchNullTypeWatchpoint() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/WatchpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/WatchpointTests.java
index abea61a..985f124 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/WatchpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/WatchpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
  * Tests watchpoint, both modification and access watchpoints
  */
 public class WatchpointTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -41,9 +41,9 @@
 	 */
 	public void testAccessAndModification() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -52,12 +52,12 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			IStackFrame frame = thread.getTopStackFrame();
 			assertNotNull("No breakpoint", hit);
-			
+
 			// should be modification
 			assertTrue("First hit should be modification", !wp.isAccessSuspend(thread.getDebugTarget()));
 			// line 27
 			assertEquals("Should be on line 27", 27, frame.getLineNumber());
-			
+
 			// should hit access 10 times
 			int count = 10;
 			while (count > 0) {
@@ -73,24 +73,24 @@
 				assertEquals("Should be line 30", 30, frame.getLineNumber());
 				count--;
 			}
-			
+
 			resumeAndExit(thread);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that a modification breakpoint suspends correctly
 	 * @throws Exception
 	 */
 	public void testModification() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", false, true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -99,48 +99,48 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			IStackFrame frame = thread.getTopStackFrame();
 			assertNotNull("No breakpoint", hit);
-			
+
 			// should be modification
 			assertTrue("First hit should be modification", !wp.isAccessSuspend(thread.getDebugTarget()));
 			// line 27
 			assertEquals("Should be on line 27", 27, frame.getLineNumber());
-			
+
 			resumeAndExit(thread);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that a disabled modification watchpoint is NOT hit
 	 * @throws Exception
 	 */
 	public void testDisabledModification() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", false, true);
 		wp.setEnabled(false);
-		
+
 		IJavaDebugTarget debugTarget= null;
 		try {
 			debugTarget= launchAndTerminate(typeName);
 		} finally {
 			terminateAndRemove(debugTarget);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that an access watchpoint is hit
 	 * @throws Exception
 	 */
 	public void testAccess() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -150,8 +150,8 @@
 			IStackFrame frame = thread.getTopStackFrame();
 			assertNotNull("No breakpoint", wp);
 			assertTrue("Should be an access", wp.isAccessSuspend(thread.getDebugTarget()));
-			assertEquals("Should be line 30", 30, frame.getLineNumber());			
-			
+			assertEquals("Should be line 30", 30, frame.getLineNumber());
+
 			// should hit access 9 more times
 			int count = 9;
 			while (count > 0) {
@@ -167,14 +167,14 @@
 				assertEquals("Should be line 30", 30, frame.getLineNumber());
 				count--;
 			}
-			
+
 			resumeAndExit(thread);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Tests that a disabled access watchpoint is not hit
@@ -182,9 +182,9 @@
 	 */
 	public void testDisabledAccess() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, false);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -198,17 +198,17 @@
 				throw new TestAgainException("Retest - the debug target is terminated or disconnected");
 			}
 			assertTrue("Should be an access", wp.isAccessSuspend(thread.getDebugTarget()));
-			assertEquals("Should be line 30", 30, frame.getLineNumber());			
-			
+			assertEquals("Should be line 30", 30, frame.getLineNumber());
+
 			wp.setEnabled(false);
-						
+
 			resumeAndExit(thread);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Tests that an access watchpoint suspends when it count is hit
@@ -216,10 +216,10 @@
 	 */
 	public void testHitCountAccess() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, false);
 		wp.setHitCount(4);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -229,18 +229,18 @@
 			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
 			assertNotNull("No breakpoint", hit);
 			assertTrue("Should be an access", wp.isAccessSuspend(thread.getDebugTarget()));
-			assertEquals("Should be line 30", 30, frame.getLineNumber());			
+			assertEquals("Should be line 30", 30, frame.getLineNumber());
 			IVariable var = findVariable(frame, "value");
 			assertNotNull("Could not find variable 'value'", var);
-			
+
 			// retrieve an instance var
 			IJavaPrimitiveValue value = (IJavaPrimitiveValue)var.getValue();
 			assertNotNull(value);
 			int varValue = value.getIntValue();
-			assertTrue("'value' should be 7", varValue == 7);			
-			
+			assertTrue("'value' should be 7", varValue == 7);
+
 			wp.setHitCount(0);
-			
+
 			// should hit access 6 more times
 			int count = 6;
 			while (count > 0) {
@@ -256,24 +256,24 @@
 				assertEquals("Should be line 30", 30, frame.getLineNumber());
 				count--;
 			}
-			
+
 			resumeAndExit(thread);
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tests that a watchpoint set to be skipped is indeed skipped
 	 * @throws Exception
 	 */
 	public void testSkipWatchpoint() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.Watchpoint";
-		
+
 		IJavaWatchpoint wp = createWatchpoint(typeName, "list", true, true);
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -282,12 +282,12 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			IStackFrame frame = thread.getTopStackFrame();
 			assertNotNull("No breakpoint", hit);
-			
+
 			// should be modification
 			assertTrue("First hit should be modification", !wp.isAccessSuspend(thread.getDebugTarget()));
 			// line 27
 			assertEquals("Should be on line 27", 27, frame.getLineNumber());
-			
+
 			getBreakpointManager().setEnabled(false);
 			resumeAndExit(thread);
 
@@ -295,12 +295,12 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			getBreakpointManager().setEnabled(true);
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Tests that a watchpoint set to be skipped is indeed skipped
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFinalWatchpoint() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/connectors/MultipleConnectionsTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/connectors/MultipleConnectionsTest.java
index caf70b7..4735c7d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/connectors/MultipleConnectionsTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/connectors/MultipleConnectionsTest.java
@@ -63,7 +63,7 @@
 	/**
 	 * Ensure out-of-the-box settings mimics previous behaviour of accepting a
 	 * single connection
-	 * 
+	 *
 	 * @throws IOException
 	 */
 	@Test
@@ -80,7 +80,7 @@
 
 	/**
 	 * Ensure connector accepts a single connection
-	 * 
+	 *
 	 * @throws InterruptedException
 	 */
 	@Test
@@ -99,7 +99,7 @@
 	/**
 	 * Ensure out-of-the-box settings mimics previous behaviour of accepting a
 	 * single connection
-	 * 
+	 *
 	 * @throws InterruptedException
 	 */
 	@Test
@@ -118,7 +118,7 @@
 	/**
 	 * Ensure out-of-the-box settings mimics previous behaviour of accepting a
 	 * single connection
-	 * 
+	 *
 	 * @throws InterruptedException
 	 */
 	@Test
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java
index af118f9..dbdce7f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
 
 	/**
 	 * Test available strata on a type with alternate strata
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAvailableStrata() throws Exception {
@@ -64,7 +64,7 @@
 
 	/**
 	 * Test default stratum on a type with alternate strata.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDefaultStratum() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java
index 56689e1..286cf49 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,7 +36,7 @@
  * Tests for program and VM arguments
  */
 public class ArgumentTests extends AbstractDebugTest {
-    
+
     private Object fLock = new Object();
 
 	private class ConsoleArgumentOutputRetriever implements IConsoleLineTrackerExtension {
@@ -44,7 +44,7 @@
 		StringBuffer buffer;
 		IDocument document;
 		boolean closed = false;
-		
+
 		/**
 		 * @see org.eclipse.debug.ui.console.IConsoleLineTracker#dispose()
 		 */
@@ -67,13 +67,13 @@
 		public void lineAppended(IRegion line) {
 			try {
                 assertNotNull("received notification of invalid line", line);
-                assertNotNull("buffer is null", buffer); 
+                assertNotNull("buffer is null", buffer);
                 buffer.append(document.get(line.getOffset(), line.getLength()));
 			} catch (BadLocationException e) {
 				e.printStackTrace();
 			}
 		}
-		
+
 		/**
 		 * @see org.eclipse.debug.ui.console.IConsoleLineTrackerExtension#consoleClosed()
 		 */
@@ -99,11 +99,11 @@
 		    	}
 		    }
 		    if (!closed) {
-				// output contents to console in case of error 
+				// output contents to console in case of error
 				if (buffer != null) {
 				    System.out.println();
 				    System.out.println(ArgumentTests.this.getName());
-				    System.out.println("\treceived " + buffer.length() + " chars: " + buffer.toString()); 
+				    System.out.println("\treceived " + buffer.length() + " chars: " + buffer.toString());
 				}
 		    }
 		    assertNotNull("Line tracker did not receive init notification", buffer);
@@ -121,7 +121,7 @@
 		super(name);
 	}
 
-	/** 
+	/**
 	 * Creates and returns a new launch config the given name
 	 */
 	protected ILaunchConfigurationWorkingCopy newConfiguration(IContainer container, String name) throws CoreException {
@@ -167,7 +167,7 @@
 	}
 	/**
 	 * Test a VM argument with the quoting style we recommended as a workaround
-	 * to a bug (now fixed) that we suggested in the past. 
+	 * to a bug (now fixed) that we suggested in the past.
 	 * Program output should be: foo bar
 	 * @throws CoreException
 	 */
@@ -200,7 +200,7 @@
 	public void testVMArgEmbeddedCreativeQuotes() throws CoreException {
 		testWithVMArg("-Dfoo=fo\"\\\"o b\\\"\"ar", "fo\"o b\"ar");
 	}
-	
+
 	/*
 	 * Program argument tests
 	 */
@@ -262,7 +262,7 @@
 	public void testProgramArgCreativeEmbeddedQuotes() throws CoreException {
 		testWithProgramArg("f\\\"o\\\"o", "f\"o\"o");
 	}
-	
+
 	/**
 	 * Test a program argument with one empty string
      *
@@ -274,28 +274,28 @@
 		// assert that it's really the empty string:
 		testWithProgramArg("\"\"", "");
 	}
-	
+
 	/**
 	 * Test a program with an empty string among other args.
-	 * 
+	 *
 	 * Program output should be: 4
 	 * @throws CoreException
 	 */
 	public void testProgramArgEmptyStringWithOthers() throws CoreException {
 		testProgramArgCount("word1 \"\" \"part1 part2\" word2", "4");
 	}
-	
+
 	/**
 	 * Test a program argument with one double quote. We should pass in the
 	 * empty string to match Java console behavior.
-	 * 
+	 *
 	 * Program output should be: 1
 	 * @throws CoreException
 	 */
 	public void testProgramArgOneQuote() throws CoreException {
 		testProgramArgCount("\"", "1");
 	}
-	
+
 	/**
 	 * Runs the FooPropertyPrinter with the given VM arguments and checks for
 	 * the given output.
@@ -305,7 +305,7 @@
 	private void testWithVMArg(String argString, String outputValue) throws CoreException {
 		testOutput("FooPropertyPrinter", argString, null, outputValue);
 	}
-	
+
 	/**
 	 * Runs the ArgumentPrinter with the given program arguments
 	 * @param argString
@@ -315,7 +315,7 @@
 	private void testWithProgramArg(String argString, String outputValue) throws CoreException {
 		testOutput("ArgumentPrinter", null, argString, outputValue);
 	}
-	
+
 	/**
 	 * Runs the ArgumentCounter with the given program arguments
 	 * @param argString
@@ -324,8 +324,8 @@
 	 */
 	private void testProgramArgCount(String argString, String outputValue) throws CoreException {
 		testOutput("ArgumentCounter", null, argString, outputValue);
-	}	
-	
+	}
+
 	/**
 	 * Runs the given program with the given VM arguments and the given program arguments and
 	 * asserts that the output matches the given output.
@@ -349,7 +349,7 @@
 		Map<String, String> map = new HashMap<String, String>(1);
 		map.put(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, "java");
 		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);
-		
+
 		ConsoleArgumentOutputRetriever retriever = new ConsoleArgumentOutputRetriever();
 		ConsoleLineTracker.setDelegate(retriever);
 		IProcess process = null;
@@ -383,7 +383,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Tests the default VM args
 	 * @throws CoreException
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArrayTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArrayTests.java
index 98bb1ff..3a03a7c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArrayTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArrayTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -34,7 +34,7 @@
 	public void testGetSize() throws Exception {
 		String typeName = "ArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(19, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -47,14 +47,14 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
-	
-	
+
+
 	public void testGetVariable() throws Exception {
 		String typeName = "ArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(19, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -70,13 +70,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
-	
+		}
+	}
+
 	public void testGetVariableRange() throws Exception {
 		String typeName = "ArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(19, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -91,17 +91,17 @@
 			for (int i = 0; i < 15; i++) {
 				assertEquals("Wrong value", ((IJavaDebugTarget)frame.getDebugTarget()).newValue(50 + i), variables[i].getValue());
 			}
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
-	
+		}
+	}
+
 	public void testSetValueRange() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(27, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -132,13 +132,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	public void testCreateArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -157,7 +157,7 @@
 			IJavaArray javaArray = type.newInstance(6000);
 			v.setValue(javaArray);
 			IJavaArray  array = (IJavaArray) v.getValue();
-			
+
 			IJavaValue[] replacements = new IJavaValue[6000];
 			for (int i = 0; i < replacements.length; i++) {
 				replacements[i] = target.newValue((byte)23);
@@ -173,9 +173,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}	
-	
+		}
+	}
+
 	/**
 	 * Sets a zero-length array as the new values
 	 * @throws Exception
@@ -184,7 +184,7 @@
 	public void testSetZeroLengthArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -198,7 +198,7 @@
 			IJavaArray javaArray = type.newInstance(1);
 			v.setValue(javaArray);
 			IJavaArray  array = (IJavaArray) v.getValue();
-			
+
 			IJavaValue[] replacements = new IJavaValue[0];
 			array.setValues(replacements);
 			// the overall size of the array will never change size, and trying to set no values has not effect
@@ -206,19 +206,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}	
-	
+		}
+	}
+
 	/**
 	 * Tries to set a new array with a starting index of -1
-	 * 
+	 *
 	 * @throws Exception
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=359450
 	 */
 	public void testSetBadLowerIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -233,7 +233,7 @@
 			IJavaArray javaArray = type.newInstance(1);
 			v.setValue(javaArray);
 			IJavaArray  array = (IJavaArray) v.getValue();
-			
+
 			IJavaValue[] replacements = {target.nullValue()};
 			try {
 				array.setValues(-1, 0, replacements, 0);
@@ -246,9 +246,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with an index greater than the total length of the source array
 	 * @throws Exception
@@ -257,7 +257,7 @@
 	public void testSetBadUpperIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -271,7 +271,7 @@
 			IJavaArray javaArray = type.newInstance(1);
 			v.setValue(javaArray);
 			IJavaArray  array = (IJavaArray) v.getValue();
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget) frame.getDebugTarget();
 			IJavaValue bite = target.newValue((byte)-1);
 			IJavaValue[] replacements = {bite};
@@ -286,9 +286,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with an index greater than the total length of the soure array
 	 * @throws Exception
@@ -297,7 +297,7 @@
 	public void testSetExactUpperIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -326,9 +326,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with a source index greater than the total length of the new values array
 	 * @throws Exception
@@ -337,7 +337,7 @@
 	public void testSetBadLowerSrcIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -366,9 +366,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with a source index greater than the total length of the new values array
 	 * @throws Exception
@@ -377,7 +377,7 @@
 	public void testSetBadUpperSrcIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -406,9 +406,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with a source index greater than the total length of the new values array
 	 * @throws Exception
@@ -417,7 +417,7 @@
 	public void testSetExactSrcIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -446,9 +446,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with a length less than -1
 	 * @throws Exception
@@ -457,7 +457,7 @@
 	public void testSetBadLowerLengthArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -486,9 +486,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array with a length equal to -1
 	 * @throws Exception
@@ -497,7 +497,7 @@
 	public void testSetMinus1LengthArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -524,18 +524,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
-	 * Tries to set an array where the given length and index combined exceed the length of the array 
+	 * Tries to set an array where the given length and index combined exceed the length of the array
 	 * @throws Exception
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=359450
 	 */
 	public void testSetBadLengthPlusIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -564,18 +564,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
-	 * Tries to set an array where the given length and source index combined exceed the length of the array 
+	 * Tries to set an array where the given length and source index combined exceed the length of the array
 	 * @throws Exception
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=359450
 	 */
 	public void testSetBadLengthPlusSrcIndexArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -603,9 +603,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Tries to set an array where the source array is longer than the array to set the values into
 	 * @throws Exception
@@ -614,7 +614,7 @@
 	public void testSetLongerSrcArray() throws Exception {
 		String typeName = "ByteArrayTests";
 		ILineBreakpoint bp = createLineBreakpoint(32, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -640,6 +640,6 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/BootpathTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/BootpathTests.java
index c1f1218..fc822d6 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/BootpathTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/BootpathTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,14 +28,14 @@
  * Tests bootpath settings
  */
 public class BootpathTests extends AbstractDebugTest {
-	
+
 	public BootpathTests(String name) {
 		super(name);
 	}
 
 	public void testDefaultBootpath() throws Exception {
 		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
-		
+
 		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
 		String[] path = delegate.getBootpath(config);
 		assertNull("Default bootpath should be null", path);
@@ -46,13 +46,13 @@
 		assertNull("Main bootpath should be null", pathInfo[1]);
 		assertNull("Append bootpath should be null", pathInfo[2]);
 	}
-	
+
 	public void testEmptyBootpath() throws Exception {
 		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
 		ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
-		
+
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
-		
+
 		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
 		String[] path = delegate.getBootpath(wc);
 		assertNotNull("Empty bootpath should be empty array", path);
@@ -64,7 +64,7 @@
 		assertNull("Main bootpath should be empty array", pathInfo[1]);
 		assertNull("Append bootpath should be null", pathInfo[2]);
 	}
-	
+
 	public void testPrependBootpath() throws Exception {
 		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
 		ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
@@ -80,10 +80,10 @@
 			IRuntimeClasspathEntry entry = newpath[i];
 			mementos.add(entry.getMemento());
 		}
-		
+
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, mementos);
-		
+
 		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
 		Map<String, Object> map = delegate.getVMSpecificAttributesMap(wc);
 		assertNotNull("Missing VM specific attributes map", map);
@@ -91,6 +91,6 @@
 		assertNotNull("Missing bootpath prepend", pre);
 		assertEquals("Incorrect number of prepends", 1, prepath.length);
 		assertEquals("wrong prepended path", jar.getLocation().toOSString(), prepath[0]);
-	}	
-		
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathContainerTests.java
index 70a4014..250f578 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -37,9 +37,9 @@
  * Tests JRE classpath container
  */
 public class ClasspathContainerTests extends AbstractDebugTest {
-	
+
 	class FakeContainer implements IClasspathContainer {
-		
+
 		IClasspathEntry[] entries = new IClasspathEntry[0];
 		/**
 		 * @see org.eclipse.jdt.core.IClasspathContainer#getClasspathEntries()
@@ -72,7 +72,7 @@
 		public IPath getPath() {
 			return new Path(JavaRuntime.JRE_CONTAINER);
 		}
-		
+
 		/**
 		 * @param cpe
 		 */
@@ -81,7 +81,7 @@
 		}
 
 	}
-	
+
 	/**
 	 * @param name
 	 */
@@ -107,11 +107,11 @@
 		standin.setJavadocLocation(def.getJavadocLocation());
 		standin.setLibraryLocations(JavaRuntime.getLibraryLocations(def));
 		standin.convertToRealVM();
-		
+
 		// ensure the new VM exists
 		IVMInstall newVM = def.getVMInstallType().findVMInstall(vmId);
 		assertNotNull("Failed to create new VM", newVM);
-		
+
 		JREContainer container = new JREContainer(newVM, containerPath, get14Project());
 		JREContainerInitializer initializer = new JREContainerInitializer();
 		// store the current library settings
@@ -119,22 +119,22 @@
 		assertTrue("Libraries should not be empty", originalLibs.length > 0);
 		IClasspathEntry[] originalEntries = container.getClasspathEntries();
 		assertEquals("Libraries should be same size as classpath entries", originalLibs.length, originalEntries.length);
-		
+
 		// ensure we can update
 		assertTrue("Initializer will not accept update", initializer.canUpdateClasspathContainer(containerPath, get14Project()));
-		
+
 		// update to an empty set of libraries
 		FakeContainer fakeContainer = new FakeContainer();
 		initializer.requestClasspathContainerUpdate(containerPath, get14Project(), fakeContainer);
-		
+
 		// ensure the library locations are now empty on the new VM
 		LibraryLocation[] newLibs = JavaRuntime.getLibraryLocations(newVM);
 		assertEquals("Libraries should be empty", 0, newLibs.length);
-		
+
 		// re-set to original libraries
 		fakeContainer.setEntries(originalEntries);
 		initializer.requestClasspathContainerUpdate(containerPath, get14Project(), fakeContainer);
-		
+
 		// ensure libraries are restored
 		newLibs = JavaRuntime.getLibraryLocations(newVM);
 		assertEquals("Libraries should be restored", originalLibs.length, newLibs.length);
@@ -142,13 +142,13 @@
 			LibraryLocation location = newLibs[i];
 			LibraryLocation origi = originalLibs[i];
 			assertEquals("Library should be the equal", origi.getSystemLibraryPath().toFile(), location.getSystemLibraryPath().toFile());
-		} 
+		}
 	}
-	
-	
+
+
 	/**
 	 * Tests library comparison case sensitivity.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testLibraryCaseSensitivity() {
@@ -166,17 +166,17 @@
 			set1[i] = new LibraryLocation(p1, null, null);
 			set2[i] = new LibraryLocation(p2, null, null);
 		}
-		boolean equal = JRERuntimeClasspathEntryResolver.isSameArchives(set1, set2); 
+		boolean equal = JRERuntimeClasspathEntryResolver.isSameArchives(set1, set2);
 		if (caseSensitive) {
 			assertFalse("Libraries should *not* be equal on case sensitive platform", equal);
 		} else {
 			assertTrue("Libraries *should* be equal on case sensitive platform", equal);
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests that an index can be added to a {@link LibraryLocation}
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399098
 	 * @since 3.8.100
 	 */
@@ -214,11 +214,11 @@
 		// and it should have a value of the original indexURL in its string form.
 		assertEquals(indexURL.toString(), indexloc);
 	}
-	
+
 	/**
 	 * Tests that an index can be added to a {@link LibraryLocation} and that successive calls to
 	 * {@link JavaRuntime#getLibraryLocations(IVMInstall)} does not erase the index infos
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399098
 	 * @since 3.8.100
 	 */
@@ -254,5 +254,5 @@
 		// return the index URL
 		URL indexURL = indexPath.toFile().toURI().toURL();
 		return indexURL;
-	} 
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathProviderTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathProviderTests.java
index 3538ae5..f6c5e0c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathProviderTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathProviderTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -35,7 +35,7 @@
  * Tests runtime classpath provider extension point
  */
 public class ClasspathProviderTests extends AbstractDebugTest {
-	
+
 	public ClasspathProviderTests(String name) {
 		super(name);
 	}
@@ -43,20 +43,20 @@
 	public void testEmptyProvider() throws Exception {
 		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
 		ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
-		
+
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, "org.eclipse.jdt.debug.tests.EmptyClasspathProvider");
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, "org.eclipse.jdt.debug.tests.EmptyClasspathProvider");
-		
+
 		IRuntimeClasspathProvider cpProvider = JavaRuntime.getClasspathProvider(wc);
 		IRuntimeClasspathProvider spProvider = JavaRuntime.getSourceLookupPathProvider(wc);
-		
+
 		assertNotNull("Did not retrieve classpath provider", cpProvider);
 		assertNotNull("Did not retrieve source path provider", spProvider);
-		
+
 		assertEquals("Classpath should be empty", 0, cpProvider.computeUnresolvedClasspath(config).length);
 		assertEquals("Source path should be empty", 0, spProvider.computeUnresolvedClasspath(config).length);
 	}
-	
+
 	/**
 	 * Test that a variable set to the location of an archive resolves properly.
 	 */
@@ -72,7 +72,7 @@
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
 	}
-	
+
 	/**
 	 * Test that a variable set to the location of an archive via variable
 	 * extension resolves properly.
@@ -91,7 +91,7 @@
 	}
 
 	// BOOTPATH TESTS
-		
+
 	/**
 	 * Test that a variable added to the bootpath is resolved to be on the bootpath.
 	 */
@@ -107,12 +107,12 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());			
+		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that an extended variable added to the bootpath is resolved to be on the bootpath.
-	 */	
+	 */
 	public void testBootpathVariableExtensionResolution() throws Exception {
 		IResource archive = get14Project().getProject().getFolder("src").getFile("A.jar");
 		IProject root = get14Project().getProject();
@@ -125,9 +125,9 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());			
+		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a project added to the bootpath is resolved to be on the bootpath.
 	 */
@@ -140,9 +140,9 @@
 		IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveRuntimeClasspathEntry(runtimeClasspathEntry, get14Project());
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", outputFolder.getLocation().toOSString(), resolved[0].getLocation());
-		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a container added to the bootpath is resolved to have all entries on
 	 * the boothpath.
@@ -155,7 +155,7 @@
 			assertEquals("Entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[i].getClasspathProperty());
 		}
 	}
-	
+
 	/**
 	 * Test that a jar added to the bootpath is resolved to be on the bootpath.
 	 */
@@ -169,12 +169,12 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a folder added to the bootpath is resolved to be on the bootpath.
-	 */	
+	 */
 	public void testBootpathFolderResolution() throws Exception {
 		IResource folder = get14Project().getProject().getFolder("src");
 		assertTrue("Folder does not exist", folder.exists());
@@ -185,9 +185,9 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", folder.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", folder.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a project with non-default output locations placed on the bootpath
 	 * resolves to entries on the bootpath.
@@ -203,11 +203,11 @@
 			IRuntimeClasspathEntry entry = resolved[i];
 			assertEquals("Resolved entry should be on bootpath", IRuntimeClasspathEntry.BOOTSTRAP_CLASSES, entry.getClasspathProperty());
 		}
-				
+
 	}
-	
+
 	// USER CLASSES TESTS
-		
+
 	/**
 	 * Test that a variable added to the user application classpath is resolved to be on
 	 * the user application classpath.
@@ -224,13 +224,13 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());			
+		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that an extended variable added to the user classpath is resolved to be
 	 * on the user classpath.
-	 */	
+	 */
 	public void testUserClassesVariableExtensionResolution() throws Exception {
 		IResource archive = get14Project().getProject().getFolder("src").getFile("A.jar");
 		IProject root = get14Project().getProject();
@@ -243,9 +243,9 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());			
+		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a project added to the user classpath is resolved to be on the
 	 * user classpath.
@@ -259,9 +259,9 @@
 		IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveRuntimeClasspathEntry(runtimeClasspathEntry, get14Project());
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", outputFolder.getLocation().toOSString(), resolved[0].getLocation());
-		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a container added to the user classpath is resolved to have all
 	 * entries on the user classpath.
@@ -274,7 +274,7 @@
 			assertEquals("Entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[i].getClasspathProperty());
 		}
 	}
-	
+
 	/**
 	 * Test that a jar added to the user classpath is resolved to be on the user classpath.
 	 */
@@ -288,13 +288,13 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a folder added to the user classpath is resolved to be on the
 	 * user classpath.
-	 */	
+	 */
 	public void testUserClassesFolderResolution() throws Exception {
 		IResource folder = get14Project().getProject().getFolder("src");
 		assertTrue("Folder does not exist", folder.exists());
@@ -305,9 +305,9 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", folder.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", folder.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a project with non-default output locations placed on the user classpath
 	 * resolves to entries on the user classpath.
@@ -323,11 +323,11 @@
 			IRuntimeClasspathEntry entry = resolved[i];
 			assertEquals("Resolved entry should be on user classpath", IRuntimeClasspathEntry.USER_CLASSES, entry.getClasspathProperty());
 		}
-				
+
 	}
-	
+
 	// STANDARD CLASSES TESTS
-		
+
 	/**
 	 * Test that a variable added to the default bootpath is resolved to be on
 	 * the default bootpath.
@@ -344,13 +344,13 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());			
+		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that an extended variable added to the default bootpath is resolved to be
 	 * on the default bootpath.
-	 */	
+	 */
 	public void testStandardClassesVariableExtensionResolution() throws Exception {
 		IResource archive = get14Project().getProject().getFolder("src").getFile("A.jar");
 		IProject root = get14Project().getProject();
@@ -363,9 +363,9 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());			
+		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a project added to the default bootpath is resolved to be on the
 	 * default bootpath.
@@ -379,9 +379,9 @@
 		IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveRuntimeClasspathEntry(runtimeClasspathEntry, get14Project());
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", outputFolder.getLocation().toOSString(), resolved[0].getLocation());
-		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a container added to the default bootpath is resolved to have all
 	 * entries on the default bootpath.
@@ -394,7 +394,7 @@
 			assertEquals("Entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[i].getClasspathProperty());
 		}
 	}
-	
+
 	/**
 	 * Test that a jar added to the default bootpath is resolved to be on the
 	 * default bootpath.
@@ -409,13 +409,13 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a folder added to the default bootpath is resolved to be on the
 	 * default bootpath.
-	 */	
+	 */
 	public void testStandardClassesFolderResolution() throws Exception {
 		IResource folder = get14Project().getProject().getFolder("src");
 		assertTrue("Folder does not exist", folder.exists());
@@ -426,9 +426,9 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Resolved path not correct", folder.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", folder.getLocation(), new Path(resolved[0].getLocation()));
-		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());		
+		assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, resolved[0].getClasspathProperty());
 	}
-	
+
 	/**
 	 * Test that a project with non-default output locations placed on the default bootpath
 	 * resolves to entries on the default bootpath.
@@ -444,13 +444,13 @@
 			IRuntimeClasspathEntry entry = resolved[i];
 			assertEquals("Resolved entry should be on default bootpath", IRuntimeClasspathEntry.STANDARD_CLASSES, entry.getClasspathProperty());
 		}
-				
-	}	
-	
+
+	}
+
 	/**
 	 * Tests that default classpath computation works for a project with mulitple
 	 * output locations.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testMultiOutputDefaultClasspath() throws Exception {
@@ -461,42 +461,42 @@
 		IFolder bin2 = p.getFolder("bin2");
 		String location1 = bin1.getLocation().toOSString();
 		String location2 = bin2.getLocation().toOSString();
-		
+
 		List<String> list = new ArrayList<String>();
 		for (int i = 0; i < entries.length; i++) {
 			list.add(entries[i]);
 		}
-		
+
 		assertTrue("Classpath is missing " + location1, list.contains(location1));
 		assertTrue("Classpath is missing " + location2, list.contains(location2));
-				
+
 	}
-	
+
 	/**
 	 * Tests that default classpath computation works for a project with a default
 	 * output location.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSingleOutputDefaultClasspath() throws Exception {
 		IJavaProject project = get14Project();
 		String[] entries = JavaRuntime.computeDefaultRuntimeClassPath(project);
-		
+
 		IFolder bin = ResourcesPlugin.getWorkspace().getRoot().getFolder(project.getOutputLocation());
 		String location = bin.getLocation().toOSString();
-		
+
 		List<String> list = new ArrayList<String>();
 		for (int i = 0; i < entries.length; i++) {
 			list.add(entries[i]);
 		}
-		
+
 		assertTrue("Classpath is missing " + location, list.contains(location));
-				
-	}	
-	
+
+	}
+
 	/**
 	 * Tests that a buildpath with a relative (../..) classpath entry will resolve properly.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testRelativeClasspathEntry() throws Exception {
@@ -513,7 +513,7 @@
         JavaProjectHelper.addContainerEntry(project, path);
         // add relative entry - point to A.jar in DebugTests/src
         JavaProjectHelper.addLibrary(project, new Path("../DebugTests/src/A.jar"));
-     
+
         // test runtime class path resolution
         String[] entries = JavaRuntime.computeDefaultRuntimeClassPath(project);
         String jarPath = get14Project().getProject().getLocation().append("src").append("A.jar").toOSString();
@@ -521,16 +521,16 @@
 		for (int i = 0; i < entries.length; i++) {
 			list.add(entries[i]);
 		}
-        
+
         // delete the project
         pro.delete(false, null);
-        
+
         assertTrue("Classpath is missing " + jarPath, list.contains(jarPath));
 	}
-	
+
 	/**
 	 * Tests that a variable with a relative (../..) path will resolve properly.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testVariableWithRelativePath() throws Exception {
@@ -547,9 +547,9 @@
         JavaProjectHelper.addContainerEntry(project, path);
         // add relative entry - point to A.jar in DebugTests/src
         String varName = "RELATIVE_DEBUG_TESTS";
-		JavaCore.setClasspathVariable(varName, new Path("../DebugTests"), null);        
+		JavaCore.setClasspathVariable(varName, new Path("../DebugTests"), null);
 		JavaProjectHelper.addVariableEntry(project, new Path("RELATIVE_DEBUG_TESTS/src/A.jar"), null, null);
-     
+
         // test runtime class path resolution
         String[] entries = JavaRuntime.computeDefaultRuntimeClassPath(project);
         String jarPath = get14Project().getProject().getLocation().append("src").append("A.jar").toOSString();
@@ -557,10 +557,10 @@
 		for (int i = 0; i < entries.length; i++) {
 			list.add(entries[i]);
 		}
-        
+
         // delete the project
         pro.delete(false, null);
-        
+
         assertTrue("Classpath is missing " + jarPath, list.contains(jarPath));
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathVariableTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathVariableTests.java
index 2f98533..a0129d3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathVariableTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ClasspathVariableTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
  * Tests for classpath variables
  */
 public class ClasspathVariableTests extends AbstractDebugTest {
-		
+
 	/**
 	 * Constructor
 	 * @param name the name of the test
@@ -48,7 +48,7 @@
 		assertEquals("Should be one resolved entry", 1, resolved.length);
 		assertEquals("Entries should be equal", entry, resolved[0]);
 	}
-	
+
 	/**
 	 * test JRE resolution
 	 * @throws CoreException
@@ -64,7 +64,7 @@
 		assertTrue("no default libs", libs.length > 0);
 		assertEquals("Should resolve to location of local JRE", libs[0].getSystemLibraryPath().toOSString().toLowerCase(), resolved[0].getPath().toOSString().toLowerCase());
 	}
-	
+
 	/**
 	 * Test that a variable set to the location of an archive via variable
 	 * extension resolves properly, with a null source attachment.
@@ -83,8 +83,8 @@
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
 		assertNull("Should be null source attachment", resolved[0].getSourceAttachmentPath());
-	}	
-	
+	}
+
 	/**
 	 * Test that a variable set to the location of an archive via variable
 	 * extension resolves properly, with a source attachment rooted with a null
@@ -104,11 +104,11 @@
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
 		assertNull("Should be null source attachment", resolved[0].getSourceAttachmentPath());
-	}	
-	
+	}
+
 	/**
 	 * Test a class path entry with variable extensions for archive and source attachment.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testVariableArchiveAndSourceAttachmentWithExtension() throws Exception {
@@ -124,11 +124,11 @@
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
 		assertEquals("Resolved source attachment not correct", archive.getLocation(), new Path(resolved[0].getSourceAttachmentLocation()));
-	}	
-	
+	}
+
 	/**
 	 * Test a class path entry with variable extensions for archive and source attachment.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testProjectResolutionWithVariableArchiveAndSourceAttachmentWithExtension() throws Exception {
@@ -145,5 +145,5 @@
 		assertEquals("Resolved path not correct", archive.getFullPath(), resolved[0].getPath());
 		assertEquals("Resolved path not correct", archive.getLocation(), new Path(resolved[0].getLocation()));
 		assertEquals("Resolved source attachment not correct", archive.getLocation(), new Path(resolved[0].getSourceAttachmentLocation()));
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleInputTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleInputTests.java
index 263ba0f..f147e17 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleInputTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleInputTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,38 +36,38 @@
  * Tests console input.
  */
 public class ConsoleInputTests extends AbstractDebugTest implements IConsoleLineTrackerExtension {
-	
+
 	protected List<String> fLinesRead = new ArrayList<String>();
-	
+
 	protected boolean fStarted = false;
-	
+
 	protected boolean fStopped = false;
-	
+
 	protected IConsole fConsole = null;
-	
+
 	protected Object fConsoleLock = new Object();
 	protected Object fLock = new Object();
-	
-	
+
+
 	public static TestSuite suite() {
 		return new OrderedTestSuite(ConsoleInputTests.class, new String[] {
-				"testMultiLineInput",	
+				"testMultiLineInput",
 				"testEOF",
 				"testDeleteAllEnteredText"
 		});
 	}
-	
+
 	public ConsoleInputTests(String name) {
 		super(name);
 	}
-	
+
     @Override
 	protected void setUp() throws Exception {
         super.setUp();
         fStarted = false;
         fStopped = false;
     }
-    
+
     /**
      * Writes text to the console with line feeds (like pasting multiple lines).
      * The lines with line delimiters should be echoed back. The text remaining
@@ -88,7 +88,7 @@
 			assertNotNull("Console is null", fConsole);
 			String[] list = appendAndGet(fConsole, "one\ntwo\nexit", 4);
 			verifyOutput(new String[]{"one", "two", "exitone", "two"}, list);
-			
+
 			// end the program
 			list = appendAndGet(fConsole, "three\n", 3);
 			verifyOutput(new String[]{"three", "exitthree", IInternalDebugCoreConstants.EMPTY_STRING}, list);
@@ -97,8 +97,8 @@
 			ConsoleLineTracker.setDelegate(null);
 			launch.getProcesses()[0].terminate();
 		}
-	} 
-	
+	}
+
     /**
      * Tests closing standard in
      */
@@ -116,7 +116,7 @@
 			assertNotNull("Console is null", fConsole);
 			String[] list = appendAndGet(fConsole, "one\ntwo\n", 4);
 			verifyOutput(new String[]{"one", "two", "one", "two"}, list);
-			
+
 			// send EOF
 			IStreamsProxy streamsProxy = launch.getProcesses()[0].getStreamsProxy();
 			assertTrue("should be an IStreamsProxy2", streamsProxy instanceof IStreamsProxy2);
@@ -143,19 +143,19 @@
 			ConsoleLineTracker.setDelegate(null);
 			launch.getProcesses()[0].terminate();
 		}
-	} 	
-	
+	}
+
 	private void verifyOutput(String[] expected, String[] actual) {
 		for (int i = 0; i < actual.length; i++) {
 			assertEquals("Wrong message", expected[i], actual[i]);
 		}
 	}
-	
+
 	/**
 	 * Appends the given text to the given console and waits for the number
 	 * of lines to be written to the console. Returns the lines written to
 	 * the console.
-	 * 
+	 *
 	 * @param console
 	 * @param text
 	 * @param linesExpected
@@ -175,7 +175,7 @@
                 }
             }
         });
-		
+
 		int attempts = 0;
 		while (fLinesRead.size() < linesExpected) {
 			spinEventLoop();
@@ -192,10 +192,10 @@
 		assertEquals("Wrong number of lines", linesExpected, fLinesRead.size());
 		return fLinesRead.toArray(new String[0]);
 	}
-	
+
 	/**
 	 * Appends the given text to the given console. Text should not have new lines.
-	 * 
+	 *
 	 * @param console
 	 * @param text
 	 * @throws Exception
@@ -213,11 +213,11 @@
             }
         });
 		spinEventLoop();
-	}	
-		
+	}
+
 	/**
 	 * Deletes all text in the given console.
-	 * 
+	 *
 	 * @param console
 	 * @throws Exception
 	 */
@@ -235,7 +235,7 @@
         });
 		spinEventLoop();
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.console.IConsoleLineTracker#dispose()
 	 */
@@ -283,11 +283,11 @@
 			fLock.notifyAll();
         }
 	}
-	
+
 	/**
 	 * Tests the scenario reported in bug 241394 - 'a', backspace, 'b', backspace, 'c', Enter.
 	 * Result should be 'c'.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDeleteAllEnteredText() throws Exception {
@@ -308,11 +308,11 @@
 			deleteAll(fConsole);
 			String[] list = appendAndGet(fConsole, "c\n", 2);
 			verifyOutput(new String[]{"c", "c"}, list);
-			
+
 		} finally {
 			ConsoleLineTracker.setDelegate(null);
 			launch.getProcesses()[0].terminate();
-		}		
+		}
 	}
 
 	private void spinEventLoop() {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleTests.java
index 8190f1f..2af5a90 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ConsoleTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,38 +25,38 @@
  * Tests console line tracker.
  */
 public class ConsoleTests extends AbstractDebugTest {
-	
+
 	public ConsoleTests(String name) {
 		super(name);
 	}
-	
+
 	class TestConsole extends MessageConsole {
-	    
+
 	    public boolean fInit = false;
 	    public boolean fDispose = false;
 
         public TestConsole(boolean autoLifecycle) {
             super("Life's like that", null, autoLifecycle);
         }
-        
+
         @Override
 		protected void init() {
             super.init();
             fInit = true;
         }
-        
+
         @Override
 		protected void dispose() {
             super.dispose();
             fDispose = true;
         }
-	    
+
 	}
-	
-	/** 
+
+	/**
 	 * Test that when a process is removed from a launch, the associated
 	 * console is closed.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testRemoveProcess() throws Exception {
@@ -84,12 +84,12 @@
 					IConsole console = DebugUITools.getConsole(otherTarget);
 					assertNull("Console should no longer exist", console);
 				}
-			});			
+			});
 		} finally {
 			terminateAndRemove(target);
-		}				
-	} 
-	
+		}
+	}
+
 	public void testAutoLifecycle() {
 	    TestConsole console = new TestConsole(true);
 	    IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
@@ -98,7 +98,7 @@
 	    assertTrue("Console was not initialized", console.fInit);
 	    assertTrue("Console was not disposed", console.fDispose);
 	}
-	
+
 	public void testManualLifecycle() {
 	    TestConsole console = new TestConsole(false);
 	    IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
@@ -107,6 +107,6 @@
 	    assertTrue("Console was initialized", !console.fInit);
 	    assertTrue("Console was disposed", !console.fDispose);
 	    console.dispose();
-	}	
+	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/DebugEventTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/DebugEventTests.java
index e52119d..524771b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/DebugEventTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/DebugEventTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,19 +27,19 @@
 	public DebugEventTests(String name) {
 		super(name);
 	}
-	
+
 	/**
-	 * Ensure that a model specific event can be dispatched 
+	 * Ensure that a model specific event can be dispatched
 	 */
 	public void testModelSpecificEvent() {
 		DebugEvent event = new DebugEvent(this, DebugEvent.MODEL_SPECIFIC, 5000);
 		event.setData("TEST");
-		
+
 		DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.MODEL_SPECIFIC);
 		DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
 		waiter.waitForEvent();
 		DebugEvent received = waiter.getEvent();
-		
+
 		assertEquals("Incorrect detail", 5000, received.getDetail());
 		assertEquals("incorrect user data", "TEST", received.getData());
 		assertEquals("incorrect source", this, received.getSource());
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EEDefinitionTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EEDefinitionTests.java
index 0503e6d..3b5b0b1 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EEDefinitionTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EEDefinitionTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Bug 421938: [1.8] ExecutionEnvironmentDescription#getVMArguments does not preserve VM arguments
@@ -37,20 +37,20 @@
  * Tests for ".ee" files - installed JRE definition files
  */
 public class EEDefinitionTests extends AbstractDebugTest {
-	
+
 	public static IPath TEST_EE_FILE = null;
 	{
 		if (Platform.OS_WIN32.equals(Platform.getOS())) {
-			TEST_EE_FILE = new Path("testfiles/test-jre/bin/test-foundation11-win32.ee"); 
+			TEST_EE_FILE = new Path("testfiles/test-jre/bin/test-foundation11-win32.ee");
 		} else {
 			TEST_EE_FILE = new Path("testfiles/test-jre/bin/test-foundation11.ee");
 		}
 	}
-		
+
 	public EEDefinitionTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests that the EE file is a valid file
 	 */
@@ -61,7 +61,7 @@
 		IStatus status = EEVMType.validateDefinitionFile(description);
 		assertTrue("Invalid install location", status.isOK());
 	}
-	
+
 	/**
 	 * Tests that the EE install location validation returns an INFO status.
 	 */
@@ -72,8 +72,8 @@
 		assertNotNull("Missing EE VM type", vmType);
 		IStatus status = vmType.validateInstallLocation(file);
 		assertTrue("Invalid install location", status.getSeverity() == IStatus.INFO);
-	}	
-	
+	}
+
 	/**
 	 * Tests libraries for the EE file
 	 */
@@ -87,11 +87,11 @@
 		for (int i = 0; i < expected.length; i++) {
 			if (i == 4) {
 				// ext1 and ext2 can be in either order due to file system ordering
-				assertTrue("Wrong library", expected[i].equals(libs[i].getSystemLibraryPath().lastSegment()) || 
+				assertTrue("Wrong library", expected[i].equals(libs[i].getSystemLibraryPath().lastSegment()) ||
 						expected[i].equals(libs[i+1].getSystemLibraryPath().lastSegment()));
 			} else if (i == 5) {
 				// ext1 and ext2 can be in either order due to file system ordering
-				assertTrue("Wrong library", expected[i].equals(libs[i].getSystemLibraryPath().lastSegment()) || 
+				assertTrue("Wrong library", expected[i].equals(libs[i].getSystemLibraryPath().lastSegment()) ||
 						expected[i].equals(libs[i-1].getSystemLibraryPath().lastSegment()));
 			} else {
 				assertEquals("Wrong library", expected[i], libs[i].getSystemLibraryPath().lastSegment());
@@ -101,7 +101,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Tests source attachments
 	 */
@@ -115,11 +115,11 @@
 		for (int i = 0; i < expected.length; i++) {
 			if (i == 4) {
 				// ext1 and ext2 can be in either order due to file system ordering
-				assertTrue("Wrong attachment", expected[i].equals(libs[i].getSystemLibrarySourcePath().lastSegment()) || 
+				assertTrue("Wrong attachment", expected[i].equals(libs[i].getSystemLibrarySourcePath().lastSegment()) ||
 						expected[i].equals(libs[i+1].getSystemLibrarySourcePath().lastSegment()));
 			} else if (i == 5) {
 				// ext1 and ext2 can be in either order due to file system ordering
-				assertTrue("Wrong attachment", expected[i].equals(libs[i].getSystemLibrarySourcePath().lastSegment()) || 
+				assertTrue("Wrong attachment", expected[i].equals(libs[i].getSystemLibrarySourcePath().lastSegment()) ||
 						expected[i].equals(libs[i-1].getSystemLibrarySourcePath().lastSegment()));
 			} else if (i == 6){
 				assertEquals("Wrong attachment", Path.EMPTY, libs[i].getSystemLibrarySourcePath());
@@ -127,8 +127,8 @@
 				assertEquals("Wrong attachment", expected[i], libs[i].getSystemLibrarySourcePath().lastSegment());
 			}
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests default libraries for an EE VM type are empty.
 	 */
@@ -140,7 +140,7 @@
 		LibraryLocation[] libs = vmType.getDefaultLibraryLocations(file);
 		assertEquals("Wrong number of libraries", 0, libs.length);
 	}
-	
+
 	/**
 	 * Tests that a javadoc location can be specified.
 	 */
@@ -157,10 +157,10 @@
 		}
 		assertEquals("Incorrect javadoc location", expectedLocation, location);
 	}
-	
+
 	/**
 	 * Tests asking for the index from the EE file
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.9.0
 	 */
@@ -177,7 +177,7 @@
 		}
 		assertEquals("Incorrect index location", expectedLocation, location);
 	}
-	
+
 	/**
 	 * Tests that a name with spaces can be specified.
 	 */
@@ -187,8 +187,8 @@
 		ExecutionEnvironmentDescription ee = new ExecutionEnvironmentDescription(file);
 		String name = ee.getProperty(ExecutionEnvironmentDescription.EE_NAME);
 		assertEquals("Incorrect vm name", "Eclipse JDT Test JRE Definition", name);
-	}	
-	
+	}
+
 	/**
 	 * Tests default VM arguments. All arguments from the EE file should get passed through in the
 	 * same order to the command line.
@@ -211,7 +211,7 @@
 			prev = next;
 		}
 	}
-	
+
 	/**
 	 * Test compatible environments
 	 */
@@ -224,7 +224,7 @@
 			assertNotNull("Missing EE VM type", vmType);
 			VMStandin standin = JavaRuntime.createVMFromDefinitionFile(file, "test-ee-file", "test-ee-file-id");
 			install = standin.convertToRealVM();
-			
+
 			IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
 			IExecutionEnvironment[] envs = manager.getExecutionEnvironments();
 			boolean found11 = false;
@@ -244,18 +244,18 @@
 			}
 		}
 	}
-		
+
 	protected File getEEFile() {
 		return JavaTestPlugin.getDefault().getFileInPlugin(TEST_EE_FILE);
 	}
-	
+
 	protected IVMInstallType getVMInstallType() {
 		return JavaRuntime.getVMInstallType(EEVMType.ID_EE_VM_TYPE);
 	}
-	
+
 	/**
 	 * Tests raw EE properties map.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testParseProperties() throws CoreException {
@@ -263,19 +263,19 @@
 		assertNotNull("Missing EE file", file);
 		ExecutionEnvironmentDescription desc = new ExecutionEnvironmentDescription(file);
 		Map<String, String> map = desc.getProperties();
-		
+
 		// validate expected properties
 		validateProperty(ExecutionEnvironmentDescription.EXECUTABLE, "jrew.txt" , map);
 		validateProperty(ExecutionEnvironmentDescription.EXECUTABLE_CONSOLE, "jre.txt", map);
 		validateProperty("-XspecialArg:123", "", map);
 		validateProperty("-XspecialArg2", "456", map);
-		
+
 	}
-	
+
 	protected void validateProperty(String key, String value, Map<String, String> properties) {
 		assertEquals("Unexpeted value for: " + key, value, properties.get(key));
 	}
-	
+
 	/**
 	 * Tests that a name with spaces can be specified.
 	 */
@@ -284,5 +284,5 @@
 		assertNotNull("Missing EE file", file);
 		ExecutionEnvironmentDescription ee = new ExecutionEnvironmentDescription(file);
 		validateProperty("-Dee.empty", "", ee.getProperties());
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EnvironmentTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EnvironmentTests.java
index b4bcbc8..0b0ad85 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EnvironmentTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EnvironmentTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 import org.eclipse.osgi.service.environment.Constants;
 
 public class EnvironmentTests extends AbstractDebugTest {
-	
+
 	public EnvironmentTests(String name) {
 		super(name);
 	}
@@ -41,7 +41,7 @@
 			assertEquals("env vars should be case insensitive", path1, path2);
 		}
 	}
-	
+
 	/**
 	 * Test that we can override a variable in a case insensitive way on Windows
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EventSetTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EventSetTests.java
index ab340f9..294fdd1 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EventSetTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/EventSetTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
  * Tests event sets.
  */
 public class EventSetTests extends AbstractDebugTest {
-	
+
 	public EventSetTests(String name) {
 		super(name);
 	}
@@ -34,7 +34,7 @@
 		// add two breakpoints at the same location
 		bps.add(createLineBreakpoint(88, typeName));
 		bps.add(createLineBreakpoint(88, typeName));
-		
+
 
 		IJavaThread thread= null;
 		try {
@@ -52,11 +52,11 @@
 					bps.remove(hits[i]);
 				}
 				assertTrue("breakpoint collection should now be empty", bps.isEmpty());
-				
+
 			}
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExecutionEnvironmentTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExecutionEnvironmentTests.java
index 0edd82b..354c32a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExecutionEnvironmentTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExecutionEnvironmentTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,11 +30,11 @@
  * Tests for execution environments
  */
 public class ExecutionEnvironmentTests extends AbstractDebugTest {
-		
+
 	public ExecutionEnvironmentTests(String name) {
 		super(name);
 	}
-	
+
 	public void testGetEnvironments() throws Exception {
 		IExecutionEnvironment[] executionEnvironments = JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments();
 		assertTrue("Should be at least one environment", executionEnvironments.length > 0);
@@ -46,11 +46,11 @@
 		}
 		assertTrue("Did not find environment J2SE-1.4", false);
 	}
-	
+
 	public void testAnalyze() throws Exception {
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
-				
+
 		IExecutionEnvironment environment = manager.getEnvironment(JavaProjectHelper.J2SE_1_4_EE_NAME);
 		assertNotNull("Missing environment J2SE-1.4", environment);
 		IVMInstall[] installs = environment.getCompatibleVMs();
@@ -63,7 +63,7 @@
 		}
 		assertTrue("vm should be J2SE-1.4 compliant", false);
 	}
-	
+
 	public void testAccessRuleParticipants() throws Exception {
 		IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
 		IExecutionEnvironment environment = manager.getEnvironment("org.eclipse.jdt.debug.tests.environment.j2se14x");
@@ -82,7 +82,7 @@
 			assertEquals("Wrong rule", "non_accessible", rules[3].getPattern().toString());
 		}
 	}
-	
+
 	public void testNoAccessRuleParticipants() throws Exception {
 		IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
 		IExecutionEnvironment environment = manager.getEnvironment("org.eclipse.jdt.debug.tests.environment.j2se13x");
@@ -96,8 +96,8 @@
 			IAccessRule[] rules = accessRules[i];
 			assertEquals("wrong number of rules for lib", 0, rules.length);
 		}
-	}	
-	
+	}
+
 	public void testAccessRuleParticipantsWithShortCircut() throws Exception {
 		IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
 		IExecutionEnvironment environment = manager.getEnvironment("org.eclipse.jdt.debug.tests.environment.j2se15x");
@@ -113,7 +113,7 @@
 			assertEquals("Wrong rule", "**/*", rules[0].getPattern().toString());
 		}
 	}
-	
+
 	/**
 	 * Tests that a project bound to an EE has access rules.
 	 */
@@ -140,7 +140,7 @@
 		}
 		assertTrue("did not find JRE libs on classpath", foundLib);
 	}
-	
+
 	/**
 	 * Tests that a project bound to a specific JRE has no access rules.
 	 */
@@ -165,12 +165,12 @@
 				}
 			}
 		}
-		assertTrue("did not find JRE library on classpath", foundLib);		
-	}	
-	
+		assertTrue("did not find JRE library on classpath", foundLib);
+	}
+
 	/**
 	 * Tests that default access rules appear for system packages when a profile file is specified.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDefaultSystemPackageAccessRules() throws Exception {
@@ -189,12 +189,12 @@
 			assertEquals("Wrong rule", "one/two/*", rules[1].getPattern().toString());
 			assertEquals("Wrong rule", "three/four/*", rules[2].getPattern().toString());
 			assertEquals("Wrong rule", "**/*", rules[3].getPattern().toString());
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that a location can be resolved for ${ee_home:J2SE-1.4}
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEEHomeVariable() throws Exception {
@@ -205,10 +205,10 @@
 		IVMInstall install = JavaRuntime.getVMInstall(JavaRuntime.newJREContainerPath(ee));
 		assertEquals(install.getInstallLocation().getAbsolutePath(), result);
 	}
-	
+
 	/**
 	 * Tests that a location cannot be resolved for ${ee_home}
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEEHomeVariableMissingArgument() throws Exception {
@@ -220,10 +220,10 @@
 		}
 		assertNotNull("Test should have thrown an exception", null);
 	}
-	
+
 	/**
 	 * Tests that a location cannot be resolved for ${ee_home:bogus}
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEEHomeVariableInvalidArgument() throws Exception {
@@ -234,5 +234,5 @@
 			return; // expected
 		}
 		assertNotNull("Test should have thrown an exception", null);
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/HcrTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/HcrTests.java
index 82c4ecd..70a3a7d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/HcrTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/HcrTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,9 +29,9 @@
  * Tests hot code replace
  */
 public class HcrTests extends AbstractDebugTest {
-	
+
 	class HCRListener implements IJavaHotCodeReplaceListener {
-		
+
 		boolean notified = false;
 		IJavaDebugTarget target = null;
 
@@ -62,19 +62,19 @@
 			notified = true;
 			notifyAll();
 		}
-		
+
 		/**
 		 * Returns whether notified (yet).
-		 * 
+		 *
 		 * @return whether notified
 		 */
 		public synchronized boolean wasNotified() {
 			return notified;
 		}
-		
+
 		/**
 		 * Waits for notification and returns whether notified.
-		 * 
+		 *
 		 * @return
 		 */
 		public synchronized boolean waitNotification() {
@@ -86,17 +86,17 @@
 			}
 			return notified;
 		}
-		
+
 	}
-	
+
 	public HcrTests(String name) {
 		super(name);
 	}
-	
+
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Revert the source file after the test.
-	 * 
+	 *
 	 * @see junit.framework.TestCase#tearDown()
 	 */
 	@Override
@@ -116,17 +116,18 @@
 			cu.commitWorkingCopy(true, null);
 			waitForBuild();
 		}
-	}	
+		super.tearDown();
+	}
 
 	public void testSimpleHcr() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass";
-		createLineBreakpoint(39, typeName);		
-		
+		createLineBreakpoint(39, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 
@@ -150,13 +151,13 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Two\"" + contents.substring(index + 5);
 				buffer.setContents(newCode);
-				
+
 				// save contents
 				DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
 				waiter.waitForEvent();
-	
+
 				// should have dropped to frame 'one'
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull("No top stack frame", frame);
@@ -168,11 +169,11 @@
 					throw new TestAgainException("Retest - the correct method name was not present after HCR");
 				}
 				assertEquals("Should have dropped to method 'one'", "one", frame.getMethodName());
-				
+
 				// resume to breakpoint
 				createLineBreakpoint(39, typeName);
 				thread = resume(thread);
-				
+
 				// value of 'x' should now be "Two"
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				variable = findVariable(frame, "x");
@@ -184,24 +185,24 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	/**
 	 * Tests a general (plug-in) listener.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGeneralHcrListener() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass";
-		createLineBreakpoint(39, typeName);		
+		createLineBreakpoint(39, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				// look at the value of 'x' - it should be "One"
@@ -223,7 +224,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Two\"" + contents.substring(index + 5);
 				buffer.setContents(newCode);
-				
+
 				// save contents
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -235,17 +236,17 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that a target specific listener overrides a generic listener.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSpecificHcrListener() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass";
-		createLineBreakpoint(39, typeName);		
+		createLineBreakpoint(39, typeName);
 		HCRListener listener = new HCRListener();
 		HCRListener listener2 = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
@@ -253,7 +254,7 @@
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				target.addHotCodeReplaceListener(listener2);
@@ -276,7 +277,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Two\"" + contents.substring(index + 5);
 				buffer.setContents(newCode);
-				
+
 				// save contents
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -289,18 +290,18 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
-		}		
-	}	
-	
+		}
+	}
+
 	/**
-	 * Tests HCR in a local type with the same name as the enclosing 
+	 * Tests HCR in a local type with the same name as the enclosing
 	 * method
 	 * @throws Exception
 	 * @since 3.8.100
 	 */
 	public void testHCRLocalType() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass2";
-		createLineBreakpoint(33, typeName);		
+		createLineBreakpoint(33, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -324,7 +325,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Local#run\"" + contents.substring(index + 13);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -344,16 +345,16 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR in a local type
 	 * @throws Exception
-	 * 
+	 *
 	 * @since 3.8.100
 	 */
 	public void testHCRLocalType2() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass2";
-		createLineBreakpoint(37, typeName);		
+		createLineBreakpoint(37, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -377,7 +378,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Local#run2\"" + contents.substring(index + 14);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -397,16 +398,16 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR in a local type defined in a constructor
 	 * @throws Exception
-	 * 
+	 *
 	 * @since 3.8.100
 	 */
 	public void testHCRLocalType3() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass2";
-		createLineBreakpoint(19, typeName);		
+		createLineBreakpoint(19, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -430,7 +431,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"CLocal#run\"" + contents.substring(index + 14);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -450,17 +451,17 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
-	 * Tests HCR in an anonymous type with the same name as the method 
+	 * Tests HCR in an anonymous type with the same name as the method
 	 * where the anonymous type was defined
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8.100
 	 */
 	public void testHCRAnonymousType() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass3";
-		createLineBreakpoint(34, typeName);		
+		createLineBreakpoint(34, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -484,7 +485,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"NEW_CODE\"" + contents.substring(index + 11);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -505,7 +506,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR in an anonymous type defined in a method
 	 * @throws Exception
@@ -513,7 +514,7 @@
 	 */
 	public void testHCRAnonymousType2() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass3";
-		createLineBreakpoint(44, typeName);		
+		createLineBreakpoint(44, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -537,7 +538,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"NEW_CODE\"" + contents.substring(index + 11);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -557,7 +558,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR in an anonymous type defined in a constructor
 	 * @throws Exception
@@ -565,7 +566,7 @@
 	 */
 	public void testHCRAnonymousType3() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass3";
-		createLineBreakpoint(24, typeName);		
+		createLineBreakpoint(24, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -589,7 +590,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"NEW_CODE\"" + contents.substring(index + 11);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -609,7 +610,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on a method called from a constructor
 	 * @throws Exception
@@ -617,7 +618,7 @@
 	 */
 	public void testHCRConstructor() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass4";
-		createLineBreakpoint(21, typeName);		
+		createLineBreakpoint(21, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -641,7 +642,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"HcrClass4#run\"" + contents.substring(index + 17);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -661,7 +662,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR within a constructor
 	 * @throws Exception
@@ -669,7 +670,7 @@
 	 */
 	public void testHCRConstructor2() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass4";
-		createLineBreakpoint(16, typeName);		
+		createLineBreakpoint(16, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
@@ -693,7 +694,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Construct\"" + contents.substring(index + 13);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -714,7 +715,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on an inner type method with the same name as the enclosing type
 	 * method it was called from
@@ -723,14 +724,14 @@
 	 */
 	public void testHCRInnerType() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass5";
-		createLineBreakpoint(23, typeName);		
+		createLineBreakpoint(23, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -749,7 +750,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"InnerClass#run\"" + contents.substring(index + 18);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -770,7 +771,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on an inner type method
 	 * @throws Exception
@@ -778,14 +779,14 @@
 	 */
 	public void testHCRInnerType2() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass5";
-		createLineBreakpoint(27, typeName);		
+		createLineBreakpoint(27, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -804,7 +805,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"InnerClass#run2\"" + contents.substring(index + 19);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -825,7 +826,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on a constructor in an inner type
 	 * @throws Exception
@@ -833,14 +834,14 @@
 	 */
 	public void testHCRInnerType3() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass5";
-		createLineBreakpoint(18, typeName);		
+		createLineBreakpoint(18, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -859,7 +860,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Construct\"" + contents.substring(index + 13);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -881,7 +882,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on an enclosing method called from an inner type
 	 * method with the same name
@@ -890,14 +891,14 @@
 	 */
 	public void testHCRInnerType4() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass5";
-		createLineBreakpoint(33, typeName);		
+		createLineBreakpoint(33, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -916,7 +917,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"LocalHCR#run\"" + contents.substring(index + 16);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -937,7 +938,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on an enclosing method called from an inner type
 	 * method
@@ -946,14 +947,14 @@
 	 */
 	public void testHCRInnerType5() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass5";
-		createLineBreakpoint(37, typeName);		
+		createLineBreakpoint(37, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -972,7 +973,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"LocalHCR#outerrun\"" + contents.substring(index +21);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -993,7 +994,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on a local type defined in an inner type
 	 * @throws Exception
@@ -1001,14 +1002,14 @@
 	 */
 	public void testHCRLocalInner() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass9";
-		createLineBreakpoint(19, typeName);		
+		createLineBreakpoint(19, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -1027,7 +1028,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Inner$Local#run\"" + contents.substring(index +19);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -1048,7 +1049,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on a local type defined in an anonymous type
 	 * @throws Exception
@@ -1056,14 +1057,14 @@
 	 */
 	public void testHCRLocalAnonymous() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass8";
-		createLineBreakpoint(24, typeName);		
+		createLineBreakpoint(24, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -1082,7 +1083,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Inner$Local#run\"" + contents.substring(index +19);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -1103,7 +1104,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on an inner type defined in a local type
 	 * @throws Exception
@@ -1111,14 +1112,14 @@
 	 */
 	public void testHCRInnerLocal() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass7";
-		createLineBreakpoint(19, typeName);		
+		createLineBreakpoint(19, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -1137,7 +1138,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Local$Inner#run\"" + contents.substring(index +19);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
@@ -1158,7 +1159,7 @@
 			JDIDebugModel.removeHotCodeReplaceListener(listener);
 		}
 	}
-	
+
 	/**
 	 * Tests HCR on an anonymous type defined in a local type
 	 * @throws Exception
@@ -1166,14 +1167,14 @@
 	 */
 	public void testHCRAnnonymousLocal() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.HcrClass6";
-		createLineBreakpoint(23, typeName);		
+		createLineBreakpoint(23, typeName);
 		HCRListener listener = new HCRListener();
 		JDIDebugModel.addHotCodeReplaceListener(listener);
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			if (target.supportsHotCodeReplace()) {
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
@@ -1192,7 +1193,7 @@
 				assertTrue("Could not find code to replace", index > 0);
 				String newCode = contents.substring(0, index) + "\"Local$Inner#run\"" + contents.substring(index +19);
 				buffer.setContents(newCode);
-				
+
 				DebugEventWaiter waiter = new DebugEventWaiter(DebugEvent.SUSPEND);
 				cu.commitWorkingCopy(true, null);
 				waitForBuild();
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceFilterTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceFilterTests.java
index fc7a221..9d3f330 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceFilterTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceFilterTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,19 +26,19 @@
 
 /**
  * Tests instance filters on breakpoints.
- * 
+ *
  * These tests only "run" on VMs that support instance breakpoints,
  * such as JDK 1.4.1.
  */
 public class InstanceFilterTests extends AbstractDebugTest {
-	
+
 	public InstanceFilterTests(String name) {
 		super(name);
 	}
 
 	/**
 	 * Instance filter on a line breakpoint
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testLineBreakpoint() throws Exception {
@@ -46,8 +46,8 @@
 		// main
 		IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
 		// simpleMethod
-		IJavaLineBreakpoint simpleMethod = createLineBreakpoint(19, typeName);		
-		
+		IJavaLineBreakpoint simpleMethod = createLineBreakpoint(19, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -55,7 +55,7 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("hit wrong breakpoint", mainBreakpoint, hit);
-			
+
 			// can only do test if the VM supports instance filters
 			if (supportsInstanceBreakpoints(thread)) {
 				// restrict breakpoint in simpleMethod to object 1
@@ -69,15 +69,15 @@
 				IJavaObject object2 = (IJavaObject)var2.getValue();
 				assertNotNull(object1);
 				assertNotNull(object2);
-				
+
 				simpleMethod.addInstanceFilter(object1);
-				
+
 				// resume the thread
 				thread= resume(thread);
 				IBreakpoint[] breakpoints = thread.getBreakpoints();
 				assertEquals("should be a breakpoint", 1, breakpoints.length);
 				assertEquals("should be in simpleMethod", simpleMethod, breakpoints[0]);
-				
+
 				// receiver should be object1
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull(frame);
@@ -87,12 +87,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Instance filter on a method entry breakpoint
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testMethodEntryBreakpoint() throws Exception {
@@ -100,8 +100,8 @@
 		// main
 		IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
 		// simpleMethod
-		IJavaMethodBreakpoint simpleMethod = createMethodBreakpoint(typeName, "simpleMethod", "()V", true, false);		
-		
+		IJavaMethodBreakpoint simpleMethod = createMethodBreakpoint(typeName, "simpleMethod", "()V", true, false);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -109,7 +109,7 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("hit wrong breakpoint", mainBreakpoint, hit);
-			
+
 			// can only do test if the VM supports instance filters
 			if (supportsInstanceBreakpoints(thread)) {
 				// restrict breakpoint in simpleMethod to object 1
@@ -123,15 +123,15 @@
 				IJavaObject object2 = (IJavaObject)var2.getValue();
 				assertNotNull(object1);
 				assertNotNull(object2);
-				
+
 				simpleMethod.addInstanceFilter(object1);
-				
+
 				// resume the thread
 				thread= resume(thread);
 				IBreakpoint[] breakpoints = thread.getBreakpoints();
 				assertEquals("should be a breakpoint", 1, breakpoints.length);
 				assertEquals("should be in simpleMethod", simpleMethod, breakpoints[0]);
-				
+
 				// receiver should be object1
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull(frame);
@@ -146,12 +146,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
-	
+		}
+	}
+
 	/**
 	 * Instance filter on a method exit breakpoint
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testMethodExitBreakpoint() throws Exception {
@@ -159,8 +159,8 @@
 		// main
 		IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
 		// simpleMethod
-		IJavaMethodBreakpoint simpleMethod = createMethodBreakpoint(typeName, "simpleMethod", "()V", false, true);		
-		
+		IJavaMethodBreakpoint simpleMethod = createMethodBreakpoint(typeName, "simpleMethod", "()V", false, true);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -168,7 +168,7 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("hit wrong breakpoint", mainBreakpoint, hit);
-			
+
 			// can only do test if the VM supports instance filters
 			if (supportsInstanceBreakpoints(thread)) {
 				// restrict breakpoint in simpleMethod to object 1
@@ -182,15 +182,15 @@
 				IJavaObject object2 = (IJavaObject)var2.getValue();
 				assertNotNull(object1);
 				assertNotNull(object2);
-				
+
 				simpleMethod.addInstanceFilter(object1);
-				
+
 				// resume the thread
 				thread= resume(thread);
 				IBreakpoint[] breakpoints = thread.getBreakpoints();
 				assertEquals("should be a breakpoint", 1, breakpoints.length);
 				assertEquals("should be in simpleMethod", simpleMethod, breakpoints[0]);
-				
+
 				// receiver should be object1
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull(frame);
@@ -205,12 +205,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
+		}
+	}
 
 	/**
 	 * Instance filter on an exception breakpoint
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testExceptionBreakpoint() throws Exception {
@@ -218,8 +218,8 @@
 		// main
 		IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
 		// exception breakpoint
-		IJavaExceptionBreakpoint npe = createExceptionBreakpoint("java.lang.NullPointerException", true, true);		
-		
+		IJavaExceptionBreakpoint npe = createExceptionBreakpoint("java.lang.NullPointerException", true, true);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -227,7 +227,7 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("hit wrong breakpoint", mainBreakpoint, hit);
-			
+
 			// can only do test if the VM supports instance filters
 			if (supportsInstanceBreakpoints(thread)) {
 				// restrict breakpoint in simpleMethod to object 1
@@ -241,15 +241,15 @@
 				IJavaObject object2 = (IJavaObject)var2.getValue();
 				assertNotNull(object1);
 				assertNotNull(object2);
-				
+
 				npe.addInstanceFilter(object1);
-				
+
 				// resume the thread
 				thread= resume(thread);
 				IBreakpoint[] breakpoints = thread.getBreakpoints();
 				assertEquals("should be a breakpoint", 1, breakpoints.length);
 				assertEquals("should be in throwNPE", npe, breakpoints[0]);
-				
+
 				// receiver should be object1
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull(frame);
@@ -259,12 +259,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Instance filter on an access watchpoint
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAccessWatchpoint() throws Exception {
@@ -272,8 +272,8 @@
 		// main
 		IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
 		// exception breakpoint
-		IJavaWatchpoint watchpoint = createWatchpoint(typeName, "field", true, false);		
-		
+		IJavaWatchpoint watchpoint = createWatchpoint(typeName, "field", true, false);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -281,7 +281,7 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("hit wrong breakpoint", mainBreakpoint, hit);
-			
+
 			// can only do test if the VM supports instance filters
 			if (supportsInstanceBreakpoints(thread)) {
 				// restrict breakpoint in simpleMethod to object 1
@@ -295,20 +295,20 @@
 				IJavaObject object2 = (IJavaObject)var2.getValue();
 				assertNotNull(object1);
 				assertNotNull(object2);
-				
+
 				watchpoint.addInstanceFilter(object1);
-				
+
 				// resume the thread
 				thread= resume(thread);
 				IBreakpoint[] breakpoints = thread.getBreakpoints();
 				assertEquals("should be a breakpoint", 1, breakpoints.length);
 				assertEquals("should be in access method", watchpoint, breakpoints[0]);
-				
-				// in "accessField" 
+
+				// in "accessField"
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull(frame);
 				assertEquals("should be in access method", "accessField", frame.getMethodName());
-				
+
 				// receiver should be object1
 				IJavaObject receiver = frame.getThis();
 				assertEquals("should be in object1 context", object1, receiver);
@@ -316,12 +316,12 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Instance filter on an modification watchpoint
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testModificationWatchpoint() throws Exception {
@@ -331,8 +331,8 @@
 		// exception breakpoint
 		IJavaWatchpoint watchpoint = createWatchpoint(typeName, "field", false, true);
 		// disable to avoid variable initializer
-		watchpoint.setEnabled(false);		
-		
+		watchpoint.setEnabled(false);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -340,7 +340,7 @@
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			assertEquals("hit wrong breakpoint", mainBreakpoint, hit);
-			
+
 			// can only do test if the VM supports instance filters
 			if (supportsInstanceBreakpoints(thread)) {
 				// restrict breakpoint in simpleMethod to object 1
@@ -354,23 +354,23 @@
 				IJavaObject object2 = (IJavaObject)var2.getValue();
 				assertNotNull(object1);
 				assertNotNull(object2);
-				
+
 				watchpoint.addInstanceFilter(object1);
-				
+
 				// enable watchpoint
 				watchpoint.setEnabled(true);
-				
+
 				// resume the thread
 				thread= resume(thread);
 				IBreakpoint[] breakpoints = thread.getBreakpoints();
 				assertEquals("should be a breakpoint", 1, breakpoints.length);
 				assertEquals("should be in modification method", watchpoint, breakpoints[0]);
-				
-				// in "modifyField" 
+
+				// in "modifyField"
 				frame = (IJavaStackFrame)thread.getTopStackFrame();
 				assertNotNull(frame);
 				assertEquals("should be in modify method", "modifyField", frame.getMethodName());
-				
+
 				// receiver should be object1
 				IJavaObject receiver = frame.getThis();
 				assertEquals("should be in object1 context", object1, receiver);
@@ -378,17 +378,17 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
-	
+		}
+	}
+
 	/**
 	 * Returns whether the associated target supports instance breakpoints
-	 * 
+	 *
 	 * @param thread
 	 * @return boolean
 	 */
 	private boolean supportsInstanceBreakpoints(IJavaThread thread) {
 		IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 		return target.supportsInstanceBreakpoints();
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceVariableTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceVariableTests.java
index f538fb1..b4bf175 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceVariableTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstanceVariableTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,16 +25,16 @@
 import org.eclipse.jdt.debug.tests.AbstractDebugTest;
 
 public class InstanceVariableTests extends AbstractDebugTest {
-	
+
 	public InstanceVariableTests(String name) {
 		super(name);
 	}
 
 	public void testGetField() throws Exception {
 		String typeName = "InstanceVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(30, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(30, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -42,42 +42,42 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable ivt = findVariable(frame, "ivt");
 			assertNotNull("Could not find variable 'ivt'", ivt);
-			
+
 			// retrieve an instance var
 			IJavaObject value = (IJavaObject)ivt.getValue();
 			assertNotNull(value);
 			IJavaVariable pubStr = value.getField("pubStr", false);
 			assertNotNull(pubStr);
 			assertEquals("value should be 'redefined public'", pubStr.getValue().getValueString(), "redefined public");
-			
+
 			// retrieve an instance var in superclass
 			IJavaVariable privStr = value.getField("privStr", false);
 			assertNotNull(privStr);
-			assertEquals("value should be 'private'", privStr.getValue().getValueString(), "private");			
-			
+			assertEquals("value should be 'private'", privStr.getValue().getValueString(), "private");
+
 			// retrieve an instance var in super class with same name
 			pubStr = value.getField("pubStr", true);
 			assertNotNull(pubStr);
-			assertEquals("value should be 'public'", pubStr.getValue().getValueString(), "public");			
+			assertEquals("value should be 'public'", pubStr.getValue().getValueString(), "public");
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	public void testGetDeclaredFieldNames() throws Exception {
 		String typeName = "InstanceVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(28, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(28, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
-	
+
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IJavaObject object = frame.getThis();
 			assertNotNull("'this' is null", object);
-			
+
 			String[] names = ((IJavaReferenceType)object.getJavaType()).getDeclaredFieldNames();
 			assertEquals("Should be 7 declared fields", 7, names.length);
 			List<String> fields = new ArrayList<String>();
@@ -95,14 +95,14 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	public void testGetDeclaredFieldNamesInSubclass() throws Exception {
 		String typeName = "InstanceVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(30, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(30, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -111,7 +111,7 @@
 			IVariable ivt = findVariable(frame, "ivt");
 			assertNotNull("Could not find variable 'ivt'", ivt);
 			IJavaObject object = (IJavaObject)ivt.getValue();
-			
+
 			String[] names = ((IJavaReferenceType)object.getJavaType()).getDeclaredFieldNames();
 			assertEquals("Should be 3 declared fields", 3, names.length);
 			List<String> fields = new ArrayList<String>();
@@ -125,14 +125,14 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	public void testGetAllFieldNamesInSubclass() throws Exception {
 		String typeName = "InstanceVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(30, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(30, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -141,21 +141,21 @@
 			IVariable ivt = findVariable(frame, "ivt");
 			assertNotNull("Could not find variable 'ivt'", ivt);
 			IJavaObject object = (IJavaObject)ivt.getValue();
-			
+
 			String[] names = ((IJavaReferenceType)object.getJavaType()).getAllFieldNames();
 			assertTrue("Should be at least 10 fields", names.length >= 10);
 			// note: can be > 10 if Object defines any inst vars (depends on class libs)
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
-	
+		}
+	}
+
 	public void testEvaluationAssignments() throws Exception {
 		String typeName = "InstanceVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(28, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(28, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -164,11 +164,11 @@
 			IVariable pubStr = findVariable(frame, "pubStr");
 			assertNotNull("Could not find variable 'pubStr'", pubStr);
 			assertEquals("'pubStr' value should be 'public'", "public", pubStr.getValue().getValueString());
-			
-			evaluate("pubStr = \"hello\";", frame);			
+
+			evaluate("pubStr = \"hello\";", frame);
 			// the value should have changed
 			assertEquals("'pubStr' value should be 'hello'", "hello", pubStr.getValue().getValueString());
-			
+
 			evaluate("pubStr = null;", frame);
 			// the value should have changed
 			assertEquals("'pubStr' value should be 'null'", ((IJavaDebugTarget)frame.getDebugTarget()).nullValue(), pubStr.getValue());
@@ -176,14 +176,14 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	public void testValueHasChanged() throws Exception {
 		String typeName = "VariableChanges";
-		
-		ILineBreakpoint bp = createLineBreakpoint(21, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(21, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -191,27 +191,27 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable count = findVariable(frame, "count");
 			IVariable i = findVariable(frame, "i");
-			
+
 			assertNotNull("could not find variable 'count'", count);
 			assertNotNull("could not find variable 'i'", i);
-			
+
 			// on first suspend, change should be false
 			count.getValue();
 			i.getValue();
 			assertFalse("count should not have changed", count.hasValueChanged());
 			assertFalse("i should not have changed", i.hasValueChanged());
-			
+
 			// after a step over "count++" it should have changed
 			stepOver(frame);
-			
+
 			// count should have changed, and i should not
 			count.getValue();
-			i.getValue();			
+			i.getValue();
 			assertTrue("count should have changed value", count.hasValueChanged());
 			assertFalse("i should still be the same", i.hasValueChanged());
-			
+
 			stepOver(frame);
-			
+
 			// now count should be the same, and i should have changed
 			count.getValue();
 			i.getValue();
@@ -221,6 +221,6 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstructionPointerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstructionPointerTests.java
index 959194f..86fae60 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstructionPointerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/InstructionPointerTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JDWPTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JDWPTests.java
index 0ac88e9..4f35bf7 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JDWPTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JDWPTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 
 /**
  * Tests raw JDWP commands sent to a target.
- * 
+ *
  * @since 3.3
  */
 public class JDWPTests extends AbstractDebugTest {
@@ -41,13 +41,13 @@
 
 	/**
 	 * Sends a request to the VirtualMachine Command Set (byte 1) to ask for
-	 * the VM Capabilities (byte 12) 
+	 * the VM Capabilities (byte 12)
 	 * @throws Exception
 	 */
 	public void testCapabilities() throws Exception {
 		String typeName = "Breakpoints";
 		ILineBreakpoint bp = createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -57,29 +57,29 @@
 			// VM capabilities
 			byte[] reply = jdiTarget.sendCommand((byte)1, (byte)12, null);
 			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
-			
+
 			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
 			DataInputStream replyData = packet.dataInStream();
 			// should be 7 booleans in reply
 			for (int i = 0; i < 7; i++) {
 				replyData.readBoolean();
 			}
-			assertEquals("Should be no available bytes", 0, replyData.available());			
+			assertEquals("Should be no available bytes", 0, replyData.available());
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
-	
+
 	/**
-	 * Sends a request to the VirtualMachine Command Set (byte 1) to ask 
+	 * Sends a request to the VirtualMachine Command Set (byte 1) to ask
 	 * for ClassesBySignature (byte 2)
 	 * @throws Exception
 	 */
 	public void testClassesBySingature() throws Exception {
 		String typeName = "Breakpoints";
 		ILineBreakpoint bp = createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -95,11 +95,11 @@
 			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
 			DataInputStream replyData = packet.dataInStream();
 			// should be 1 type in reply
-			assertEquals("Wrong number of types", 1, replyData.readInt());			
+			assertEquals("Wrong number of types", 1, replyData.readInt());
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
-	
+		}
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaDebugTargetTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaDebugTargetTests.java
index 463f1ca..e45d6e0 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaDebugTargetTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaDebugTargetTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 
 /**
  * Tests IJavaDebugTarget API
- * 
+ *
  * @since 3.4
  */
 public class JavaDebugTargetTests extends AbstractDebugTest {
@@ -28,7 +28,7 @@
 	public void testGetVMName() throws Exception {
 		String typeName = "Breakpoints";
 		createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			// do not register launch - see bug 130911
@@ -42,11 +42,11 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	public void testGetVersion() throws Exception {
 		String typeName = "Breakpoints";
 		createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread= null;
 		try {
 			// do not register launch - see bug 130911
@@ -59,6 +59,6 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaLibraryPathTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaLibraryPathTests.java
index 3460a65..3a63a1c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaLibraryPathTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/JavaLibraryPathTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -41,15 +41,15 @@
 
 /**
  * Tests for native classpath entries.
- * 
+ *
  * @since 3.1
  */
 public class JavaLibraryPathTests extends AbstractDebugTest {
-	
+
 	public JavaLibraryPathTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Create test projects "PathTests1/2/3"
 	 */
@@ -59,14 +59,14 @@
 		createProject("PathTests1");
 		createProject("PathTests2");
 	}
-	
+
 	@Override
 	protected void tearDown() throws Exception {
-		super.tearDown();
 		deleteProject("PathTests1");
 		deleteProject("PathTests2");
+		super.tearDown();
 	}
-	
+
 	private IJavaProject createProject(String name) throws Exception {
 		IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
 		if (pro.exists()) {
@@ -75,14 +75,14 @@
 		IJavaProject project = JavaProjectHelper.createJavaProject(name, "bin");
 		return project;
 	}
-	
+
 	private void deleteProject(String name) throws Exception {
 		IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
 		if (pro.exists()) {
 			pro.delete(true, true, null);
 		}
 	}
-	
+
 	private void addToClasspath(IJavaProject jproject, IClasspathEntry cpe) throws JavaModelException {
 		IClasspathEntry[] oldEntries= jproject.getRawClasspath();
 		for (int i= 0; i < oldEntries.length; i++) {
@@ -95,8 +95,8 @@
 		System.arraycopy(oldEntries, 0, newEntries, 0, nEntries);
 		newEntries[nEntries]= cpe;
 		jproject.setRawClasspath(newEntries, null);
-	}	
-	
+	}
+
 	public void testRequiredProjectExplicitPath() throws Exception {
 		// add required project with one java library path entry
 		IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation();
@@ -105,12 +105,12 @@
 		addToClasspath(getJavaProject("PathTests2"), entry);
 		entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute());
 		addToClasspath(getJavaProject("PathTests1"), entry);
-		
+
 		String[] strings = JavaRuntime.computeJavaLibraryPath(getJavaProject("PathTests1"), true);
 		assertEquals("Wrong number of entries", 1, strings.length);
 		assertEquals("Wrong entry", path.toFile().getCanonicalPath(), new File(strings[0]).getCanonicalPath());
 	}
-	
+
 	public void testVMArgsForRequiredProjectExplicitPath() throws Exception {
 		// add required project with one java library path entry
 		IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation();
@@ -119,7 +119,7 @@
 		addToClasspath(getJavaProject("PathTests2"), entry);
 		entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute());
 		addToClasspath(getJavaProject("PathTests1"), entry);
-		
+
 		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
 		ILaunchConfigurationType type = manager.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, "testVMArgsForRequiredProjectExplicitPath");
@@ -131,8 +131,8 @@
 		String arguments = launcher.getVMArguments(workingCopy);
 		String expect = "-Djava.library.path=\"" + path.toFile().getAbsolutePath() + "\"";
 		assertTrue("wrong VM args", arguments.indexOf(expect) >= 0);
-	}	
-	
+	}
+
 	public void testMultiVMArgsForRequiredProjectExplicitPath() throws Exception {
 		// add required project with one java library path entry
 		IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation();
@@ -142,7 +142,7 @@
 		addToClasspath(getJavaProject("PathTests2"), entry);
 		entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute());
 		addToClasspath(getJavaProject("PathTests1"), entry);
-		
+
 		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
 		ILaunchConfigurationType type = manager.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, "testVMArgsForRequiredProjectExplicitPath");
@@ -154,7 +154,7 @@
 		String arguments = launcher.getVMArguments(workingCopy);
 		String expect = "-Djava.library.path=\"" + path.toFile().getAbsolutePath() + File.pathSeparator + path2.toFile().getAbsolutePath() + "\"";
 		assertTrue("wrong VM args", arguments.indexOf(expect) >= 0);
-	}		
+	}
 
 	public void testNoRequiredProjectExplicitPath() throws Exception {
 		// add required project with one java library path entry
@@ -164,11 +164,11 @@
 		addToClasspath(getJavaProject("PathTests2"), entry);
 		entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute());
 		addToClasspath(getJavaProject("PathTests1"), entry);
-		
+
 		String[] strings = JavaRuntime.computeJavaLibraryPath(getJavaProject("PathTests1"), false);
 		assertEquals("Wrong number of entries", 0, strings.length);
 	}
-	
+
 	public void testStringVariablePath() throws Exception {
 		//add A.jar
 		File jar = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testjars" + File.separator + "A.jar"));
@@ -182,7 +182,7 @@
 			IClasspathAttribute attribute = JavaRuntime.newLibraryPathsAttribute(new String[]{path});
 			IClasspathEntry entry = JavaCore.newLibraryEntry(new Path(jar.getAbsolutePath()), null, null, new IAccessRule[0], new IClasspathAttribute[]{attribute}, false);
 			addToClasspath(getJavaProject("PathTests1"), entry);
-		
+
 			String[] strings = JavaRuntime.computeJavaLibraryPath(getJavaProject("PathTests1"), false);
 			assertEquals("Wrong number of entries", 1, strings.length);
 			assertEquals("Wrong entry", jar.getCanonicalFile().getCanonicalPath(), new File(strings[0]).getCanonicalPath());
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LineTrackerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LineTrackerTests.java
index d0f3693..bbffc19 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LineTrackerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LineTrackerTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,47 +38,47 @@
  * Tests console line tracker.
  */
 public class LineTrackerTests extends AbstractDebugTest implements IConsoleLineTrackerExtension {
-	
+
 	protected String[] fLines = new String[] {
 		"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"
 	};
-	
+
 	protected IJavaDebugTarget fTarget;
-	
+
 	protected List<String> fLinesRead = new ArrayList<String>();
-	
+
 	protected boolean fStarted = false;
-	
+
 	protected boolean fStopped = false;
-	
+
 	protected IConsole fConsole = null;
-	
+
 	protected Object fLock = new Object();
-	
+
 	public LineTrackerTests(String name) {
 		super(name);
 	}
-	
+
     @Override
 	protected void setUp() throws Exception {
         super.setUp();
         fStarted = false;
         fStopped = false;
     }
-    
+
     @Override
 	protected void tearDown() throws Exception {
-        super.tearDown();
         // delete references and gc to free memory.
         fConsole = null;
         fLines = null;
         fLinesRead.clear();
         fLinesRead = null;
-        
+
         System.gc();
-    }   
-    
-    
+		super.tearDown();
+    }
+
+
 	public void testSimpleLineCounter() throws Exception {
 		ConsoleLineTracker.setDelegate(this);
 		fTarget = null;
@@ -95,15 +95,15 @@
 			// there are 10 lines and one "empty line" (i.e. the last "new line")
 			assertEquals("Wrong number of lines output", 11, fLinesRead.size());
 			for (int i = 0; i < 10; i++) {
-				assertEquals("Line " + i + " not equal", fLines[i], fLinesRead.get(i));			
+				assertEquals("Line " + i + " not equal", fLines[i], fLinesRead.get(i));
 			}
 			assertEquals("Should be an empty last line", IInternalDebugCoreConstants.EMPTY_STRING, fLinesRead.get(10));
 		} finally {
 			ConsoleLineTracker.setDelegate(null);
 			terminateAndRemove(fTarget);
 		}
-	} 
-	
+	}
+
 	/**
 	 * This program prints the final line without a new line
 	 * @throws Exception
@@ -123,17 +123,17 @@
 			assertTrue("Did not receive 'stopped' notification", fStopped);
 			assertEquals("Wrong number of lines", 10, fLinesRead.size());
 			for (int i = 0; i < 10; i++) {
-				assertEquals("Line " + i + " not equal", fLines[i], fLinesRead.get(i));			
+				assertEquals("Line " + i + " not equal", fLines[i], fLinesRead.get(i));
 			}
 		} finally {
 			ConsoleLineTracker.setDelegate(null);
 			terminateAndRemove(fTarget);
 		}
-	} 
-	
+	}
+
 	/**
 	 * Test 10,000 lines of output.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFlood() throws Exception {
@@ -143,7 +143,7 @@
 			ILaunchConfiguration config = getLaunchConfiguration("FloodConsole");
 			assertNotNull("Could not locate launch configuration", config);
 			launch = config.launch(ILaunchManager.RUN_MODE, null);
-			
+
 			synchronized (fLock) {
 			    if (!fStopped) {
 			        fLock.wait(480000);
@@ -158,8 +158,8 @@
 			launch.getProcesses()[0].terminate();
 			DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
 		}
-	} 	
-	
+	}
+
 	public void testHyperLink() throws Exception {
 	    try {
 			ConsoleLineTracker.setDelegate(this);
@@ -212,7 +212,7 @@
 			fLock.notifyAll();
         }
 	}
-	
+
 	/**
 	 * Tests that stack traces appear with hyperlinks
 	 */
@@ -249,9 +249,9 @@
 			ConsoleLineTracker.setDelegate(null);
 			jdiUIPreferences.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, suspendOnException);
 			terminateAndRemove(fTarget);
-		}	    
+		}
 	}
-	
+
 	public void testStringConcatenation() throws Exception {
 	    ConsoleLineTracker.setDelegate(this);
 	    String typeName = "PrintConcatenation";
@@ -275,7 +275,7 @@
 	        terminateAndRemove(fTarget);
 	    }
 	}
-	
+
 	public void testIntConcatenation() throws Exception {
 	    ConsoleLineTracker.setDelegate(this);
 	    String typeName = "PrintConcatenation";
@@ -299,7 +299,7 @@
 	        terminateAndRemove(fTarget);
 	    }
 	}
-	
+
 	private void dumpOnError(int expectedLines) {
         if (fLinesRead.size() != expectedLines) {
 	    	Iterator<String> lines = fLinesRead.iterator();
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LiteralTests17.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LiteralTests17.java
index 9aa129a..8501b07 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LiteralTests17.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LiteralTests17.java
@@ -20,13 +20,13 @@
 
 /**
  * Tests that the new forms allowed in literals in Java 7 work as expected
- * 
+ *
  * @since 3.1.200
  */
 public class LiteralTests17 extends AbstractDebugTest {
 
 	public static final String LITERAL_TYPE_NAME = "Literals17";
-	
+
 	/**
 	 * Constructor
 	 */
@@ -41,7 +41,7 @@
 	protected IJavaProject getProjectContext() {
 		return get17Project();
 	}
-	
+
 	/**
 	 * Perform the evaluation on the given snippet and return the value
 	 * @param snippet
@@ -56,19 +56,19 @@
 			IEvaluationResult result = evaluate(snippet, thread);
 			assertNotNull("There must be an evaluation result", result);
 			assertTrue("There must be no errors in the result", !result.hasErrors());
-			return result.getValue(); 
+			return result.getValue();
 		}
 		finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * Runs evaluations on the two given snippets returning the value from the second snippet. This method allows us to 
+	 * Runs evaluations on the two given snippets returning the value from the second snippet. This method allows us to
 	 * run two snippets on the same thread where the second snippet may or may not depend on the state change from the
 	 * first snippet
-	 * 
+	 *
 	 * @param snippet
 	 * @param snippet2
 	 * @return the {@link IEvaluationResult}
@@ -85,17 +85,17 @@
 			result = evaluate(snippet2, thread);
 			assertNotNull("There must be an evaluation result", result);
 			assertTrue("There must be no errors in the result", !result.hasErrors());
-			return result.getValue(); 
+			return result.getValue();
 		}
 		finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with an int with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreIntEval() throws Exception {
@@ -105,10 +105,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 11", val.getIntValue() == 11);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to an int with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreIntVarAssignment() throws Exception {
@@ -118,10 +118,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 12", val.getIntValue() == 12);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a short with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreShortEval() throws Exception {
@@ -131,10 +131,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new short value should be 11", val.getShortValue() == 11);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a short with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreShortVarAssignment() throws Exception {
@@ -144,10 +144,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new short value should be 12", val.getShortValue() == 12);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a byte with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreByteEval() throws Exception {
@@ -157,10 +157,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new byte value should be 9", val.getByteValue() == 9);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a short with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreByteVarAssignment() throws Exception {
@@ -170,10 +170,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new byte value should be 12", val.getByteValue() == 12);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a long with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreLongEval() throws Exception {
@@ -183,10 +183,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new long value should be 11", val.getLongValue() == 11);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a long with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreLongVarAssignment() throws Exception {
@@ -196,10 +196,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new long value should be 12", val.getLongValue() == 12);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a float with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreFloatEval() throws Exception {
@@ -209,10 +209,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new float value should be 4.1415", val.getFloatValue() == 4.1415F);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a float with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreFloatVarAssignment() throws Exception {
@@ -222,10 +222,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new float value should be 7.1415", val.getFloatValue() == 7.1415F);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a double with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreDoubleEval() throws Exception {
@@ -235,10 +235,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new double value should be 11.556", val.getDoubleValue() == 11.556D);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a double with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreDoubleVarAssignment() throws Exception {
@@ -248,10 +248,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new double value should be 16.556", val.getDoubleValue() == 16.555999999999997D);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a binary literal with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreBinaryEval() throws Exception {
@@ -261,10 +261,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 9", val.getIntValue() == 9);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a binary literal with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreBinaryVarAssignment() throws Exception {
@@ -274,10 +274,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 17", val.getIntValue() == 17);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with a hex with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreHexEval() throws Exception {
@@ -287,10 +287,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 17", val.getIntValue() == 17);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to a hex with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreHexVarAssignment() throws Exception {
@@ -300,10 +300,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 257", val.getIntValue() == 257);
 	}
-	
+
 	/**
 	 * Tests that an addition evaluation with an octal with underscores in it works
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreOctEval() throws Exception {
@@ -313,10 +313,10 @@
 		JDIPrimitiveValue val = (JDIPrimitiveValue) value;
 		assertTrue("The new integer value should be 9", val.getIntValue() == 9);
 	}
-	
+
 	/**
 	 * Tests that we can assign a variable value to an octal with underscores
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnderscoreOctVarAssignment() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LocalVariableTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LocalVariableTests.java
index c8a2477..952e9cc 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LocalVariableTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LocalVariableTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,9 +26,9 @@
 import org.eclipse.jdt.internal.debug.core.model.JDINullValue;
 
 public class LocalVariableTests extends AbstractDebugTest implements IValueDetailListener {
-	
+
 	String fDetail = null;
-	
+
 	public LocalVariableTests(String name) {
 		super(name);
 	}
@@ -40,8 +40,8 @@
 	 */
 	public void testFindConflicting1() throws Exception {
 		String typeName = "LocalVariableTests2";
-		ILineBreakpoint bp = createLineBreakpoint(21, typeName);		
-		
+		ILineBreakpoint bp = createLineBreakpoint(21, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -56,9 +56,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests if the correct parameter variable is found when it shadows a field variable
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=384458
@@ -66,8 +66,8 @@
 	 */
 	public void testFindConflicting2() throws Exception {
 		String typeName = "LocalVariableTests2";
-		ILineBreakpoint bp = createLineBreakpoint(25, typeName);		
-		
+		ILineBreakpoint bp = createLineBreakpoint(25, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -79,14 +79,14 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	public void testSimpleVisibility() throws Exception {
 		String typeName = "LocalVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(18, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(18, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -94,37 +94,37 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IJavaVariable[] vars = frame.getLocalVariables();
 			assertEquals("Should be no visible locals", 0, vars.length);
-			
+
 			stepOver(frame);
 			frame = (IJavaStackFrame)thread.getTopStackFrame();
 			stepOver(frame);
 			frame = (IJavaStackFrame)thread.getTopStackFrame();
-			
+
 			vars = frame.getLocalVariables();
-			assertEquals("Should be one visible local", 1, vars.length);			
+			assertEquals("Should be one visible local", 1, vars.length);
 			assertEquals("Visible var should be 'i1'", "i1", vars[0].getName());
-			
+
 			stepOver(frame);
 			frame = (IJavaStackFrame)thread.getTopStackFrame();
 			stepOver(frame);
 			frame = (IJavaStackFrame)thread.getTopStackFrame();
-			
+
 			vars = frame.getLocalVariables();
-			assertEquals("Should be two visible locals", 2, vars.length);			
-			assertEquals("Visible var 1 should be 'i1'", "i1", vars[0].getName());			
+			assertEquals("Should be two visible locals", 2, vars.length);
+			assertEquals("Visible var 1 should be 'i1'", "i1", vars[0].getName());
 			assertEquals("Visible var 2 should be 'i2'", "i2", vars[1].getName());
 
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	public void testEvaluationAssignments() throws Exception {
 		String typeName = "LocalVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(22, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(22, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -134,35 +134,35 @@
 			IVariable i1 = findVariable(frame, "i1");
 			assertNotNull("Could not find variable 'i1'", i1);
 			assertEquals("'i1' value should be '0'", target.newValue(0), i1.getValue());
-			
+
 			IVariable i2 = findVariable(frame, "i2");
 			assertNotNull("Could not find variable 'i2'", i2);
 			assertEquals("'i2' value should be '1'", target.newValue(1), i2.getValue());
-						
-			evaluate("i1 = 73;", frame);			
+
+			evaluate("i1 = 73;", frame);
 			// the value should have changed
 			assertEquals("'i1' value should be '73'", target.newValue(73), i1.getValue());
-			
+
 			evaluate("i2 = i1;", frame);
 			// the value should have changed
 			assertEquals("'i2' value should be '73'", target.newValue(73), i2.getValue());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}		
-	
+		}
+	}
+
 	protected void doArrayDetailTestNonDefPkg(String varName, String expectedDetails) throws Exception {
 		doArrayDetailTest(varName, expectedDetails, "org.eclipse.debug.tests.targets.ArrayDetailTests", 64);
 	}
-	
+
 	protected void doArrayDetailTestDefPkg(String varName, String expectedDetails) throws Exception {
 		doArrayDetailTest(varName, expectedDetails, "ArrayDetailTestsDef", 63);
-	}	
-	
+	}
+
 	protected void doArrayDetailTest(String varName, String expectedDetails, String mainName, int lineNumber) throws Exception {
-		ILineBreakpoint bp = createLineBreakpoint(lineNumber, mainName);		
+		ILineBreakpoint bp = createLineBreakpoint(lineNumber, mainName);
 		IDebugModelPresentation presentation = DebugUITools.newDebugModelPresentation();
 		IJavaThread thread= null;
 		try {
@@ -173,7 +173,7 @@
 			IVariable var = findVariable(frame, varName);
 			assertNotNull("Could not find variable " + varName, var);
 			IValue value = var.getValue();
-			
+
 			synchronized (this) {
 				fDetail = null;
 				presentation.computeDetail(value, this);
@@ -181,13 +181,13 @@
 			}
 			assertNotNull("Details not computed", fDetail);
 			assertEquals(expectedDetails, fDetail);
-			
+
 		} finally {
 			presentation.dispose();
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	@Override
 	public void detailComputed(IValue value, String result) {
@@ -195,54 +195,54 @@
 			fDetail = result;
 			notifyAll();
 		}
-		
+
 	}
-	
+
 	public void testStringArrayDetails() throws Exception {
 		doArrayDetailTestNonDefPkg("strings", "[0, 1, 10, 11, 100]");
 	}
-	
+
 	public void testIntArrayDetails() throws Exception {
 		doArrayDetailTestNonDefPkg("primitives", "[0, 1, 2, 3, 4]");
 	}
-	
+
 	public void testTopLevelTypeArrayDetails() throws Exception {
 		doArrayDetailTestNonDefPkg("outers", "[OutermostObject, OutermostObject, OutermostObject, OutermostObject, OutermostObject]");
 	}
-	
+
 	public void testInnerTypeDetails() throws Exception {
 		doArrayDetailTestNonDefPkg("middle", "[anInnerObject, anInnerObject, anInnerObject, anInnerObject, anInnerObject]");
 	}
-	
+
 	public void testNestedInnerTypeDetails() throws Exception {
 		doArrayDetailTestNonDefPkg("inners", "[aSecondInnerObject, aSecondInnerObject, aSecondInnerObject, aSecondInnerObject, aSecondInnerObject]");
 	}
-	
+
 	public void testInterfaceTypeDetails() throws Exception {
 		doArrayDetailTestNonDefPkg("runs", "[Runnable, Runnable, Runnable, Runnable, Runnable]");
 	}
-	
+
 	public void testStringArrayDetailsDefPkg() throws Exception {
 		doArrayDetailTestDefPkg("strings", "[0, 1, 10, 11, 100]");
 	}
-	
+
 	public void testIntArrayDetailsDefPkg() throws Exception {
 		doArrayDetailTestDefPkg("primitives", "[0, 1, 2, 3, 4]");
 	}
-	
+
 	public void testTopLevelTypeArrayDetailsDefPkg() throws Exception {
 		doArrayDetailTestDefPkg("outers", "[OutermostObject, OutermostObject, OutermostObject, OutermostObject, OutermostObject]");
 	}
-	
+
 	public void testInnerTypeDetailsDefPkg() throws Exception {
 		doArrayDetailTestDefPkg("middle", "[anInnerObject, anInnerObject, anInnerObject, anInnerObject, anInnerObject]");
 	}
-	
+
 	public void testNestedInnerTypeDetailsDefPkg() throws Exception {
 		doArrayDetailTestDefPkg("inners", "[aSecondInnerObject, aSecondInnerObject, aSecondInnerObject, aSecondInnerObject, aSecondInnerObject]");
 	}
-	
+
 	public void testInterfaceTypeDetailsDefPkg() throws Exception {
 		doArrayDetailTestDefPkg("runs", "[Runnable, Runnable, Runnable, Runnable, Runnable]");
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ProcessTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ProcessTests.java
index ff4174e..c0d867e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ProcessTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ProcessTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
  * Tests IProcess.
  */
 public class ProcessTests extends AbstractDebugTest {
-	
+
 	public ProcessTests(String name) {
 		super(name);
 	}
@@ -31,7 +31,7 @@
 	public void testExitValueNormal() throws Exception {
 		String typeName = "Breakpoints";
 		ILineBreakpoint bp = createLineBreakpoint(43, typeName);
-				
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -51,13 +51,13 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that an already terminated java.lang.Process behaves properly when
 	 * wrapped in an IProcess.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAlreadyTerminatedProcess() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RemoteJavaApplicationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RemoteJavaApplicationTests.java
index c236a33..ed1a22b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RemoteJavaApplicationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RemoteJavaApplicationTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
  * Tests attaching to a remote java application
  */
 public class RemoteJavaApplicationTests extends AbstractDebugTest {
-	
+
 	public RemoteJavaApplicationTests(String name) {
 		super(name);
 	}
@@ -51,7 +51,7 @@
 	public void testAttach() throws Exception {
 		String typeName = "Breakpoints";
 		createLineBreakpoint(52, typeName);
-		
+
 		// create launch config to launch VM in debug mode waiting for attach
 		ILaunchConfigurationType type = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		ILaunchConfigurationWorkingCopy config = type.newInstance(null, "Launch Remote VM");
@@ -61,9 +61,9 @@
 		// use 'java' instead of 'javaw' to launch tests (javaw is problematic on JDK1.4.2)
 		Map<String, String> map = new HashMap<String, String>(1);
 		map.put(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, "java");
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);		
+		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);
 		ILaunchConfiguration launchRemoteVMConfig = config.doSave();
-		
+
 		// create a launch config to do the attach
 		type = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_REMOTE_JAVA_APPLICATION);
 		config = type.newInstance(null, "Remote Breakpoints");
@@ -77,15 +77,15 @@
 		while (iter.hasNext()) {
 			String key = iter.next();
 			Connector.Argument arg = def.get(key);
-			argMap.put(key, arg.toString()); 
+			argMap.put(key, arg.toString());
 		}
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, argMap);		
-		ILaunchConfiguration attachConfig = config.doSave();		
-			
+		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, argMap);
+		ILaunchConfiguration attachConfig = config.doSave();
+
 		// launch remote VM
 		ILaunch launch = launchRemoteVMConfig.launch(ILaunchManager.RUN_MODE, null);
-		
-		// attach	
+
+		// attach
 		IJavaThread thread= null;
 		try {
 			CoreException exception = null;
@@ -119,9 +119,9 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests a Standard (Socket Listen) VM connection.
 	 * @throws Exception
@@ -129,7 +129,7 @@
 	public void testListen() throws Exception {
 		String typeName = "Breakpoints";
 		createLineBreakpoint(52, typeName);
-		
+
 		// create a launch config to listen for the vm
 		ILaunchConfigurationType type = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_REMOTE_JAVA_APPLICATION);
 		ILaunchConfigurationWorkingCopy config = type.newInstance(null, "Remote Breakpoints");
@@ -143,10 +143,10 @@
 		while (iter.hasNext()) {
 			String key = iter.next();
 			Connector.Argument arg = def.get(key);
-			argMap.put(key, arg.toString()); 
+			argMap.put(key, arg.toString());
 		}
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, argMap);		
-		ILaunchConfiguration listenConfig = config.doSave();		
+		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, argMap);
+		ILaunchConfiguration listenConfig = config.doSave();
 
 		// create launch config to launch VM that will connect to the waiting listener
 		type = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
@@ -157,18 +157,18 @@
 		// use 'java' instead of 'javaw' to launch tests (javaw is problematic on JDK1.4.2)
 		Map<String, String> map = new HashMap<String, String>(1);
 		map.put(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, "java");
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);		
+		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, map);
 		ILaunchConfiguration launchRemoteVMConfig = config.doSave();
-				
+
 		ILaunch listenerLaunch = null;
 		IJavaThread thread = null;
-		
-		
+
+
 		try {
-			
+
 			DebugEventWaiter waiter= new DebugElementKindEventDetailWaiter(DebugEvent.MODEL_SPECIFIC, IProcess.class, IJavaLaunchConfigurationConstants.DETAIL_CONFIG_READY_TO_ACCEPT_REMOTE_VM_CONNECTION);
 			waiter.setTimeout(DEFAULT_TIMEOUT);
-			
+
 			IProcess process = null;
 			CoreException exception = null;
 			int attempts = 0;
@@ -188,14 +188,14 @@
 			if (exception != null) {
 				throw exception;
 			}
-			
+
 			assertNotNull("Launch of the not successful", process);
 			listenerLaunch = process.getLaunch();
-			
-			
+
+
 			waiter= new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
 			waiter.setTimeout(DEFAULT_TIMEOUT);
-			
+
 			exception = null;
 			attempts = 0;
 			connected = false;
@@ -223,8 +223,8 @@
 			int stackLine = thread.getTopStackFrame().getLineNumber();
 			assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine);
 			breakpoint.delete();
-			
-			
+
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RuntimeClasspathEntryTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RuntimeClasspathEntryTests.java
index af0bc8e..7e09c26 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RuntimeClasspathEntryTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/RuntimeClasspathEntryTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
  * Tests runtime classpath entry creation/restoration.
  */
 public class RuntimeClasspathEntryTests extends AbstractDebugTest {
-	
+
 	public RuntimeClasspathEntryTests(String name) {
 		super(name);
 	}
@@ -32,53 +32,53 @@
 	public void testProjectEntry() throws Exception {
 		IProject project = get14Project().getProject();
 		IRuntimeClasspathEntry entry = JavaRuntime.newProjectRuntimeClasspathEntry(get14Project());
-	
+
 		assertEquals("Paths should be equal", project.getFullPath(), entry.getPath());
 		assertEquals("Resources should be equal", project, entry.getResource());
 		assertEquals("Should be of type project", IRuntimeClasspathEntry.PROJECT, entry.getType());
 		assertEquals("Should be a user entry", IRuntimeClasspathEntry.USER_CLASSES, entry.getClasspathProperty());
-		
+
 		String memento = entry.getMemento();
 		IRuntimeClasspathEntry restored = JavaRuntime.newRuntimeClasspathEntry(memento);
 		assertEquals("Entries should be equal", entry, restored);
 	}
-	
+
 	public void testJRELIBVariableEntry() throws Exception {
 		IClasspathEntry cpe = JavaCore.newVariableEntry(new Path(JavaRuntime.JRELIB_VARIABLE), new Path(JavaRuntime.JRESRC_VARIABLE), new Path(JavaRuntime.JRESRCROOT_VARIABLE));
 
 		IRuntimeClasspathEntry entry = JavaRuntime.newVariableRuntimeClasspathEntry(new Path(JavaRuntime.JRELIB_VARIABLE));
 		entry.setSourceAttachmentPath(cpe.getSourceAttachmentPath());
 		entry.setSourceAttachmentRootPath(cpe.getSourceAttachmentRootPath());
-	
+
 		assertEquals("Paths should be equal", cpe.getPath(), entry.getPath());
 		assertNull("Resource should be null", entry.getResource());
 		assertEquals("Should be of type varirable", IRuntimeClasspathEntry.VARIABLE, entry.getType());
 		assertEquals("Should be a standard entry", IRuntimeClasspathEntry.STANDARD_CLASSES, entry.getClasspathProperty());
-		
+
 		String memento = entry.getMemento();
 		IRuntimeClasspathEntry restored = JavaRuntime.newRuntimeClasspathEntry(memento);
 		assertEquals("Entries should be equal", entry, restored);
-		
+
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		LibraryLocation[] libs = vm.getLibraryLocations();
 		if (libs == null) {
 			libs = vm.getVMInstallType().getDefaultLibraryLocations(vm.getInstallLocation());
 		}
 		assertTrue("there is at least one system lib", libs.length >= 1);
-		
-	}	
-	
+
+	}
+
 	/**
 	 * Tests that a project can be launched if it contains the JRE_CONTAINER variable
 	 * instead of JRE_LIB
-	 * 
+	 *
 	 * XXX: test waiting for bug fix in JCORE - unable to bind container if there
 	 * is no corresponding classpath entry.
 	 *//*
 	public void testJREContainerEntry() throws Exception {
 		ILaunchConfiguration lc = getLaunchConfiguration("Breakpoints");
 		ILaunchConfigurationWorkingCopy wc = lc.copy("Breakpoints_JRE_CONTAINER");
-		
+
 		IRuntimeClasspathEntry[] cp = JavaRuntime.getClasspathProvider(lc).computeUnresolvedClasspath(lc);
 		IRuntimeClasspathEntry removed = null;
 		List entries = new ArrayList(cp.length);
@@ -86,16 +86,16 @@
 		for (int i = 0; i < cp.length; i++) {
 			if (cp[i].getType() == IRuntimeClasspathEntry.VARIABLE) {
 				removed = cp[i];
-				cp[i] = JavaRuntime.newRuntimeContainerClasspathEntry(new Path(JavaRuntime.JRE_CONTAINER), IRuntimeClasspathEntry.STANDARD_CLASSES);	
+				cp[i] = JavaRuntime.newRuntimeContainerClasspathEntry(new Path(JavaRuntime.JRE_CONTAINER), IRuntimeClasspathEntry.STANDARD_CLASSES);
 			}
 			entries.add(cp[i].getMemento());
 		}
-		
+
 		assertNotNull("Did not replace entry", removed);
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, entries);
 		lc = wc.doSave();
-		
+
 		createLineBreakpoint(52, "Breakpoints");
 		IJavaThread thread= null;
 		try {
@@ -106,22 +106,22 @@
 			removeAllBreakpoints();
 		}
 	}	*/
-	
+
 	public void testJREContainerEquality() throws Exception {
 		IRuntimeClasspathEntry entry1 = JavaRuntime.newRuntimeContainerClasspathEntry(new Path(JavaRuntime.JRE_CONTAINER), IRuntimeClasspathEntry.STANDARD_CLASSES, get14Project());
 		IRuntimeClasspathEntry entry2 = JavaRuntime.newRuntimeContainerClasspathEntry(new Path(JavaRuntime.JRE_CONTAINER), IRuntimeClasspathEntry.STANDARD_CLASSES, getMultiOutputProject());
 		assertEquals("JRE containers should be equal no matter which project", entry1, entry2);
 	}
-	
+
 	public void testExampleContainerEqualityNegative() throws Exception {
 		IRuntimeClasspathEntry entry1 = JavaRuntime.newRuntimeContainerClasspathEntry(new Path("org.eclipse.jdt.debug.tests.TestClasspathContainer"), IRuntimeClasspathEntry.USER_CLASSES, get14Project());
 		IRuntimeClasspathEntry entry2 = JavaRuntime.newRuntimeContainerClasspathEntry(new Path("org.eclipse.jdt.debug.tests.TestClasspathContainer"), IRuntimeClasspathEntry.USER_CLASSES, getMultiOutputProject());
 		assertFalse("Example containers should *not* be equal for different projects", entry1.equals(entry2));
 	}
-	
+
 	public void testExampleContainerEqualityPositive() throws Exception {
 		IRuntimeClasspathEntry entry1 = JavaRuntime.newRuntimeContainerClasspathEntry(new Path("org.eclipse.jdt.debug.tests.TestClasspathContainer"), IRuntimeClasspathEntry.USER_CLASSES, get14Project());
 		IRuntimeClasspathEntry entry2 = JavaRuntime.newRuntimeContainerClasspathEntry(new Path("org.eclipse.jdt.debug.tests.TestClasspathContainer"), IRuntimeClasspathEntry.USER_CLASSES, get14Project());
 		assertEquals("Example containers should be equal for same project", entry1, entry2);
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StaticVariableTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StaticVariableTests.java
index c47128a..d8a8617 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StaticVariableTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StaticVariableTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,16 +18,16 @@
 import org.eclipse.jdt.debug.tests.AbstractDebugTest;
 
 public class StaticVariableTests extends AbstractDebugTest {
-	
+
 	public StaticVariableTests(String name) {
 		super(name);
 	}
 
 	public void testSetValue() throws Exception {
 		String typeName = "StaticVariablesTests";
-		
-		ILineBreakpoint bp = createLineBreakpoint(40, typeName);		
-		
+
+		ILineBreakpoint bp = createLineBreakpoint(40, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -35,14 +35,14 @@
 			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 			IVariable pubStr = findVariable(frame, "pubStr");
 			assertNotNull("Could not find variable 'pubStr'", pubStr);
-			
+
 			assertEquals("Value should be 'public'","public", pubStr.getValue().getValueString());
 			pubStr.setValue(((IJavaDebugTarget)frame.getDebugTarget()).newValue("test"));
 			assertEquals("Value should be 'test'","test", pubStr.getValue().getValueString());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StratumTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StratumTests.java
index 9a223bc..ffe9f36 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StratumTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StratumTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,20 +20,20 @@
  * Tests strata.
  */
 public class StratumTests extends AbstractDebugTest {
-	
+
 	public StratumTests(String name) {
 		super(name);
 	}
 
 	/**
 	 * Test available strata on a type.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAvailableStrata() throws Exception {
 		String typeName = "Breakpoints";
-		createLineBreakpoint(81, typeName);		
-		
+		createLineBreakpoint(81, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -45,18 +45,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Test default stratum on a type.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDefaultStratum() throws Exception {
 		String typeName = "Breakpoints";
-		createLineBreakpoint(81, typeName);		
-		
+		createLineBreakpoint(81, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -67,18 +67,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
-	}	
+		}
+	}
 
 	/**
 	 * Test set / get default stratum on a java debug target.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSetGetDefaultStratum() throws Exception {
 		String typeName = "Breakpoints";
-		createLineBreakpoint(81, typeName);		
-		
+		createLineBreakpoint(81, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -92,7 +92,7 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 	public void testGetLineInStratum() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StringSubstitutionTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StringSubstitutionTests.java
index e6be05d..f662d3e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StringSubstitutionTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/StringSubstitutionTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -43,12 +43,12 @@
  * Tests string substitutions
  */
 public class StringSubstitutionTests extends AbstractDebugTest implements IValueVariableListener {
-	
+
 	// change notification
 	public IValueVariable[] fAdded;
 	public IValueVariable[] fChanged;
 	public IValueVariable[] fRemoved;
-	
+
 	public StringSubstitutionTests(String name) {
 		super(name);
 	}
@@ -56,27 +56,27 @@
 	/**
 	 * Returns the value variable with the given name or <code>null</code>
 	 * if none.
-	 * 
-	 * @param name variable name 
+	 *
+	 * @param name variable name
 	 * @return value variable with the given name or <code>null</code>
 	 * if none
 	 */
 	protected IValueVariable getValueVariable(String name) {
 		return VariablesPlugin.getDefault().getStringVariableManager().getValueVariable(name);
 	}
-	
+
 	/**
 	 * Returns the context variable with the given name or <code>null</code>
 	 * if none.
-	 * 
-	 * @param name variable name 
+	 *
+	 * @param name variable name
 	 * @return context variable with the given name or <code>null</code>
 	 * if none
 	 */
 	protected IDynamicVariable getContextVariable(String name) {
 		return VariablesPlugin.getDefault().getStringVariableManager().getDynamicVariable(name);
-	}	
-	
+	}
+
 	/**
 	 * Tests value variable initializer
 	 */
@@ -84,8 +84,8 @@
 		IValueVariable variable = getValueVariable("VALUE_VAR_WITH_INITIALIZER");
 		checkValueVariableProperties(variable, "VALUE_VAR_WITH_INITIALIZER", "sample value variable", "initial-value", true, false);
 		assertEquals("Contributing plugin ID was incorrect.","org.eclipse.jdt.debug.tests",VariablesPlugin.getDefault().getStringVariableManager().getContributingPluginId(variable));
-	}	
-	
+	}
+
 	/**
 	 * Tests value variable with an initial value
 	 */
@@ -94,7 +94,7 @@
 		checkValueVariableProperties(variable, "VALUE_VAR_WITH_VALUE", "sample value variable", "initial-value", true, false);
 		assertEquals("Contributing plugin ID was incorrect.","org.eclipse.jdt.debug.tests",VariablesPlugin.getDefault().getStringVariableManager().getContributingPluginId(variable));
 	}
-	
+
 	/**
 	 * Tests value variable initializer set to read only
 	 */
@@ -102,8 +102,8 @@
 		IValueVariable variable = getValueVariable("VALUE_VAR_WITH_INITIALIZER_READ_ONLY");
 		checkValueVariableProperties(variable, "VALUE_VAR_WITH_INITIALIZER_READ_ONLY", "sample value variable", "initial-value", true, true);
 		assertEquals("Contributing plugin ID was incorrect.","org.eclipse.jdt.debug.tests",VariablesPlugin.getDefault().getStringVariableManager().getContributingPluginId(variable));
-	}	
-	
+	}
+
 	/**
 	 * Tests value variable with an initial value set to read only
 	 */
@@ -112,31 +112,31 @@
 		checkValueVariableProperties(variable, "VALUE_VAR_WITH_VALUE_READ_ONLY", "sample value variable", "initial-value", true, true);
 		assertEquals("Contributing plugin ID was incorrect.","org.eclipse.jdt.debug.tests",VariablesPlugin.getDefault().getStringVariableManager().getContributingPluginId(variable));
 	}
-	
+
 	/**
 	 * Tests value variables created using string variable manager API
 	 */
 	public void testCreatedValueVariables() throws Exception {
 		IValueVariable variable = VariablesPlugin.getDefault().getStringVariableManager().newValueVariable("createdVariable", "sample value variable");
 		checkValueVariableProperties(variable, "createdVariable", "sample value variable", null, false, false);
-		
+
 		variable = VariablesPlugin.getDefault().getStringVariableManager().newValueVariable("createdVariable", "sample value variable");
 		variable.setValue("initial-value");
 		checkValueVariableProperties(variable, "createdVariable", "sample value variable", "initial-value", false, false);
-				
+
 		variable = VariablesPlugin.getDefault().getStringVariableManager().newValueVariable("createdVariable2", "sample value variable",false,"initial-value");
 		checkValueVariableProperties(variable, "createdVariable2", "sample value variable", "initial-value", false, false);
-		
+
 		variable = VariablesPlugin.getDefault().getStringVariableManager().newValueVariable("createdVariable3", "sample value variable",true,"initial-value");
 		checkValueVariableProperties(variable, "createdVariable3", "sample value variable", "initial-value", false, true);
 	}
-	
+
 	protected IValueVariable copy(IValueVariable variable) {
 		IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
 		IValueVariable variable2 = manager.newValueVariable(variable.getName(), variable.getDescription(), variable.isReadOnly(), variable.getValue());
 		return variable2;
 	}
-		
+
 	/**
 	 * Tests the setValue and setDescription methods of value variables
 	 */
@@ -150,7 +150,7 @@
 		copy.setValue("new value");
 		assertEquals("new description", copy.getDescription());
 		assertEquals("new value", copy.getValue());
-		
+
 		variable = getValueVariable("VALUE_VAR_WITH_VALUE");
 		copy = copy(variable);
 		assertEquals(variable.getDescription(), copy.getDescription());
@@ -159,7 +159,7 @@
 		copy.setValue("new value");
 		assertEquals("new description", copy.getDescription());
 		assertEquals("new value", copy.getValue());
-		
+
 		variable = VariablesPlugin.getDefault().getStringVariableManager().newValueVariable("createdVariable", "A variable created in code");
 		copy = copy(variable);
 		assertEquals(variable.getDescription(), copy.getDescription());
@@ -168,7 +168,7 @@
 		copy.setValue("new value");
 		assertEquals("new description", copy.getDescription());
 		assertEquals("new value", copy.getValue());
-		
+
 		variable = VariablesPlugin.getDefault().getStringVariableManager().newValueVariable("createdVariable3", "A variable created in code",true,"initial-value");
 		copy = copy(variable);
 		assertEquals(variable.getDescription(), copy.getDescription());
@@ -176,9 +176,9 @@
 		copy.setDescription("new description");
 		copy.setValue("new value");  // Value shouldn't change because variable is read only.
 		assertEquals("new description", copy.getDescription());
-		assertEquals(variable.getValue(), copy.getValue());	
+		assertEquals(variable.getValue(), copy.getValue());
 	}
-		
+
 	/**
 	 * Tests that the properties of the passed variable match the expected values passed as parameters
 	 */
@@ -200,17 +200,17 @@
 		String value = variable.getValue("ONE");
 		assertEquals("the arg is ONE", value);
 	}
-	
+
 	/**
 	 * Tests a context variable with no argument
-	 */	
+	 */
 	public void testContextWithoutArg() throws CoreException {
 		IDynamicVariable variable = getContextVariable("SAMPLE_DYNAMIC_VAR");
 		assertNotNull("Missing SAMPLE_DYNAMIC_VAR", variable);
 		String value = variable.getValue(null);
-		assertEquals("no arg", value);		
+		assertEquals("no arg", value);
 	}
-	
+
 	/**
 	 * Test an expression with no variable references
 	 */
@@ -219,7 +219,7 @@
 		String result = doSubs(expression);
 		assertEquals(expression, result);
 	}
-	
+
 	/**
 	 * Test an expression with a value variable reference
 	 */
@@ -228,7 +228,7 @@
 		String result = doSubs(expression);
 		assertEquals("something initial-value else", result);
 	}
-	
+
 	/**
 	 * Test an expression with a context variable reference
 	 */
@@ -237,7 +237,7 @@
 		String result = doSubs(expression);
 		assertEquals("something no arg else", result);
 	}
-	
+
 	/**
 	 * Test an expression with a context variable reference and arg
 	 */
@@ -245,8 +245,8 @@
 		String expression = "something ${SAMPLE_DYNAMIC_VAR:TWO} else";
 		String result = doSubs(expression);
 		assertEquals("something the arg is TWO else", result);
-	}	
-	
+	}
+
 	/**
 	 * Test an expression with multiple references
 	 */
@@ -254,11 +254,11 @@
 		String expression = "${SAMPLE_DYNAMIC_VAR:TWO} ${VALUE_VAR_WITH_INITIALIZER} ${VALUE_VAR_WITH_VALUE}";
 		String result = doSubs(expression);
 		assertEquals("the arg is TWO initial-value initial-value", result);
-	}	
-		
+	}
+
 	/**
 	 * Perform substitutions on the given expression.
-	 * 
+	 *
 	 * @param expression source expression
 	 * @return the result after performing substitutions
 	 */
@@ -275,7 +275,7 @@
 		String result = doSubs(expression);
 		assertEquals("the arg is initial-value", result);
 	}
-	
+
 	/**
 	 * Test recursive resolution
 	 */
@@ -292,7 +292,7 @@
 			manager.removeVariables(new IValueVariable[]{variable});
 		}
 	}
-	
+
 	/**
 	 * Test for simple cycling references like ${A} -> ${B} -> ${A}
 	 */
@@ -312,13 +312,13 @@
 				IStatus status = ce.getStatus();
 				if (status.getSeverity() != IStatus.ERROR || status.getCode() != VariablesPlugin.REFERENCE_CYCLE_ERROR) {
 					throw ce;
-				}				
+				}
 			}
 		} finally {
 			manager.removeVariables(new IValueVariable[]{var1, var2});
 		}
 	}
-	
+
 	/**
 	 * Test for cycling references in cases where original expression is never duplicated
 	 * eg. ${A} -> ${B}z -> ${A}z -> ${B}zz
@@ -339,20 +339,20 @@
 				IStatus status = ce.getStatus();
 				if (status.getSeverity() != IStatus.ERROR || status.getCode() != VariablesPlugin.REFERENCE_CYCLE_ERROR) {
 					throw ce;
-				}				
+				}
 			}
 		} finally {
 			manager.removeVariables(new IValueVariable[]{var1, var2});
 		}
 	}
-	
+
 	/**
 	 * Test for proper handling of infinite variable reference cycles in cases where
 	 * resolving two variables results in a third
 	 * eg 	${A} = "${"
 	 * 		${B} = "C}
 	 * 		${C} = ${A}${B}
-	 * 		In this case any references to ${C} or ${A}${B} cannot be resolved 
+	 * 		In this case any references to ${C} or ${A}${B} cannot be resolved
 	 */
 	public void testDividedRecursiveReferenceCycles() throws CoreException {
 		IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
@@ -372,13 +372,13 @@
 				IStatus status = ce.getStatus();
 				if (status.getSeverity() != IStatus.ERROR || status.getCode() != VariablesPlugin.REFERENCE_CYCLE_ERROR) {
 					throw ce;
-				}				
+				}
 			}
 		} finally {
 			manager.removeVariables(new IValueVariable[]{var1, var2, var3});
-		}		
+		}
 	}
-	
+
 	/**
 	 * Test a string with an open ended reference. The open ended expression
 	 * will not be translated.
@@ -388,10 +388,10 @@
 		String result = doSubs(expression);
 		assertEquals("${SAMPLE_DYNAMIC_VAR:initial-value", result);
 	}
-	
+
 	/**
 	 * Test that we receive proper add notification.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testAddNotificaiton() throws CoreException {
@@ -412,10 +412,10 @@
 			manager.removeVariables(new IValueVariable[]{one, two});
 		}
 	}
-	
+
 	/**
 	 * Test that we receive proper change notification.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testChangeNotificaiton() throws CoreException {
@@ -431,15 +431,15 @@
 			two.setValue("2");
 			assertNotNull("no change notifications", fChanged);
 			assertEquals("should be 1 change notification", 1, fChanged.length);
-			assertEquals(two, fChanged[0]);			
+			assertEquals(two, fChanged[0]);
 		} finally {
 			manager.removeVariables(new IValueVariable[]{one, two});
 		}
-	}	
-	
+	}
+
 	/**
 	 * Test that we receive proper remove notification.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testRemoveNotificaiton() throws CoreException {
@@ -460,7 +460,7 @@
 		} finally {
 			manager.removeVariables(new IValueVariable[]{one, two});
 		}
-	}	
+	}
 	/* (non-Javadoc)
 	 * @see junit.framework.TestCase#setUp()
 	 */
@@ -479,12 +479,12 @@
 	 */
 	@Override
 	protected void tearDown() throws Exception {
-		super.tearDown();
 		IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
 		manager.removeValueVariableListener(this);
 		fAdded = null;
 		fChanged = null;
 		fRemoved = null;
+		super.tearDown();
 	}
 
 	/* (non-Javadoc)
@@ -510,7 +510,7 @@
 	public void variablesRemoved(IValueVariable[] variables) {
 		fRemoved = variables;
 	}
-	
+
 	/**
 	 * Test the <code>${workspace_loc}</code> variable.
 	 */
@@ -528,7 +528,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getFolder("src").getLocation().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${project_loc}</code> variable with a project name argument
 	 */
@@ -537,7 +537,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getLocation().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${project_loc}</code> variable with a folder path argument
 	 */
@@ -546,7 +546,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getLocation().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${project_loc}</code> variable with a folder selected
 	 */
@@ -557,7 +557,7 @@
 		String result = doSubs(expression);
 		assertEquals(resource.getProject().getLocation().toOSString(), result);
 	}
-		
+
 	/**
 	 * Test the <code>${project_path}</code> variable with a project name argument
 	 */
@@ -566,7 +566,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getFullPath().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${project_path}</code> variable with a file selected
 	 */
@@ -576,8 +576,8 @@
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getProject().getFullPath().toOSString(), result);
-	}				
-	
+	}
+
 	/**
 	 * Test the <code>${project_path}</code> variable with a folder path argument
 	 */
@@ -586,7 +586,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getFullPath().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${project_name}</code> variable with a project name argument
 	 */
@@ -595,7 +595,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getName(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${project_name}</code> variable with a project selected
 	 */
@@ -605,8 +605,8 @@
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getProject().getName(), result);
-	}				
-	
+	}
+
 	/**
 	 * Test the <code>${project_name}</code> variable with a folder path argument
 	 */
@@ -615,7 +615,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getName(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${container_loc}</code> variable with a folder name argument.
 	 * Will resolve to the container of the specified folder.
@@ -625,7 +625,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getLocation().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${container_loc}</code> variable with a folder selected.
 	 * Will resolve to the container of the specified folder.
@@ -637,7 +637,7 @@
 		String result = doSubs(expression);
 		assertEquals(resource.getParent().getLocation().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${container_path}</code> variable with a folder name argument.
 	 * Will resolve to the container of the specified folder.
@@ -647,19 +647,19 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getFullPath().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${container_path}</code> variable with a folder selected.
 	 * Will resolve to the container of the specified folder.
 	 */
 	public void testContainerPathSelectFolder() throws CoreException {
 		String expression = "${container_path}";
-		IResource resource = get14Project().getProject().getFolder("src"); 
+		IResource resource = get14Project().getProject().getFolder("src");
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getParent().getFullPath().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${container_name}</code> variable with a folder name argument.
 	 * Will resolve to the container of the specified folder.
@@ -669,19 +669,19 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getName(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${container_name}</code> variable with a folder selected.
 	 * Will resolve to the container of the specified folder.
 	 */
 	public void testContainerNameSelectFolder() throws CoreException {
 		String expression = "${container_name}";
-		IResource resource = get14Project().getProject().getFolder("src"); 
+		IResource resource = get14Project().getProject().getFolder("src");
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getParent().getName(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${resource_loc}</code> variable with a folder name argument.
 	 */
@@ -690,7 +690,7 @@
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getFolder("src").getLocation().toOSString(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${resource_loc}</code> variable with a folder selected.
 	 */
@@ -700,8 +700,8 @@
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getLocation().toOSString(), result);
-	}	
-		
+	}
+
 	/**
 	 * Test the <code>${resource_path}</code> variable with a folder name argument.
 	 */
@@ -716,12 +716,12 @@
 	 */
 	public void testResourcePathSelectFile() throws CoreException {
 		String expression = "${resource_path}";
-		IResource resource = get14Project().getProject().getFile(".classpath"); 
+		IResource resource = get14Project().getProject().getFile(".classpath");
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getFullPath().toOSString(), result);
-	}	
-	
+	}
+
 	/**
 	 * Test the <code>${resource_name}</code> variable with a folder name argument.
 	 */
@@ -729,7 +729,7 @@
 		String expression = "${resource_name:DebugTests/src}";
 		String result = doSubs(expression);
 		assertEquals(get14Project().getProject().getFolder("src").getName(), result);
-	}	
+	}
 
 	/**
 	 * Test the <code>${resource_name}</code> variable with a file selected.
@@ -749,25 +749,25 @@
 	public void testLocalJavaApplicationParameters() throws CoreException {
 		IResource resource = get14Project().getProject().getFile(".classpath");
 		setSelection(resource);
-		
+
 		ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
 		ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, "${project_name}");
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "${resource_name}");
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, "${project_loc}");
-		
+
 		JavaLaunchDelegate delegate = new JavaLaunchDelegate();
-		
+
 		assertEquals(resource.getProject().getName(), delegate.getProgramArguments(wc));
 		assertEquals(resource.getName(), delegate.getVMArguments(wc));
 		File workingDir = delegate.getWorkingDirectory(wc);
 		assertNotNull(workingDir);
 		assertEquals(resource.getProject().getLocation().toOSString(), workingDir.toString());
 	}
-	
+
 	/**
 	 * Sets the selected resource in the navigator view.
-	 * 
+	 *
 	 * @param resource resource to select or <code>null</code> if empty
 	 */
 	protected void setSelection(final IResource resource) {
@@ -794,23 +794,23 @@
 				} catch (PartInitException e) {
 					assertNotNull("Failed to open navigator view", null);
 				}
-				
+
 			}
 		};
 		DebugUIPlugin.getStandardDisplay().syncExec(r);
 	}
-	
+
 	/**
 	 * Test the <code>${selected_resource_path}</code> variable with a file selected.
 	 */
 	public void testSelectedResourcePathFile() throws CoreException {
 		String expression = "${selected_resource_path}";
-		IResource resource = get14Project().getProject().getFile(".classpath"); 
+		IResource resource = get14Project().getProject().getFile(".classpath");
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getFullPath().toOSString(), result);
-	}		
-	
+	}
+
 	/**
 	 * Test the <code>${selected_resource_name}</code> variable with a file selected.
 	 */
@@ -821,7 +821,7 @@
 		String result = doSubs(expression);
 		assertEquals(resource.getName(), result);
 	}
-	
+
 	/**
 	 * Test the <code>${selected_resource_loc}</code> variable with a folder selected.
 	 */
@@ -831,8 +831,8 @@
 		setSelection(resource);
 		String result = doSubs(expression);
 		assertEquals(resource.getLocation().toOSString(), result);
-	}	
-	
+	}
+
 	/**
 	 * Test the <code>${selected_resource_loc}</code> variable an empty selection
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/TypeTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/TypeTests.java
index 7f77e4e..afa2b26 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/TypeTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/TypeTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
  * Tests equality of Java types.
  */
 public class TypeTests extends AbstractDebugTest {
-	
+
 	public TypeTests(String name) {
 		super(name);
 	}
@@ -41,8 +41,8 @@
 		// threading
 		bps.add(createLineBreakpoint(66, typeName));
 		// InnerRunnable.run
-		bps.add(createLineBreakpoint(61, typeName));		
-		
+		bps.add(createLineBreakpoint(61, typeName));
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -56,15 +56,15 @@
 				int lineNumber = breakpoint.getLineNumber();
 				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
 				types[index] = frame.getReferenceType();
-				
+
 				if (index == 1) {
 					assertEquals("First two types should be the same", types[0], types[1]);
 				}
-				
+
 				if (index == 2) {
 					assertTrue("Last two types should be different", !types[0].equals(types[2]));
 				}
-				
+
 				index++;
 				int stackLine = frame.getLineNumber();
 				assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine);
@@ -77,9 +77,9 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-    
+
     public void testClassLoader() throws Exception {
         String typeName = "Breakpoints";
         List<IJavaLineBreakpoint> bps = new ArrayList<IJavaLineBreakpoint>();
@@ -88,7 +88,7 @@
         bps.add(createLineBreakpoint(88, typeName));
         IJavaObject[] loaders = new IJavaObject[2];
         int index = 0;
-        
+
         IJavaThread thread= null;
         try {
             thread= launchToBreakpoint(typeName);
@@ -103,11 +103,11 @@
                 IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
                 loaders[index] = frame.getReferenceType().getClassLoaderObject();
                 assertNotNull("class loader cannot be null", loaders[index]);
-                
+
                 if (index == 1) {
                     assertEquals("First two class loaders should be the same", loaders[0], loaders[1]);
                 }
-                                
+
                 index++;
                 int stackLine = frame.getLineNumber();
                 assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine);
@@ -120,7 +120,7 @@
         } finally {
             terminateAndRemove(thread);
             removeAllBreakpoints();
-        }               
+        }
     }
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
index bbbe697..f7a9b46 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
@@ -38,7 +38,7 @@
 	public VMInstallTests() {
 		super("VM Install tests");
 	}
-	
+
 	/**
 	 * Constructor
 	 * @param name the name of the test
@@ -57,7 +57,7 @@
         String javaVersion = vm2.getJavaVersion();
         assertNotNull("default VM is missing java.version", javaVersion);
 	}
-	
+
 	/**
 	 * Test acquiring the set of system properties
 	 * @throws CoreException
@@ -72,7 +72,7 @@
 		String value = map.get("user.home");
 		assertNotNull("missing user.home", value);
 	}
-	
+
 	/**
 	 * Test acquiring the set of system properties that have been asked for - they should be cached in JDT launching
 	 * @throws CoreException
@@ -89,17 +89,17 @@
 		//check the prefs
 		String key = getSystemPropertyKey(def, "user.home");
 		value = Platform.getPreferencesService().getString(
-				LaunchingPlugin.ID_PLUGIN, 
-				key, 
-				null, 
+				LaunchingPlugin.ID_PLUGIN,
+				key,
+				null,
 				null);
 		assertNotNull("'user.home' system property should be cached", value);
 	}
-	
+
 	/**
 	 * Tests the new support for {@link ILibraryLocationResolver}s asking for {@link LibraryLocation}s
 	 * using the {@link JavaRuntime#getLibraryLocations(IVMInstall)}s API
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
 	 * @throws Exception
 	 */
@@ -107,7 +107,7 @@
 		VMInstallTestsLibraryLocationResolver.isTesting = true;
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		assertNotNull("There must be a default VM", vm);
-		
+
 		//invalidate it, causing a reset, then collect it again
 		vm.getVMInstallType().disposeVMInstall(vm.getId());
 		vm = JavaRuntime.getDefaultVMInstall();
@@ -123,10 +123,10 @@
 			vm.getVMInstallType().disposeVMInstall(vm.getId());
 		}
 	}
-	
+
 	/**
 	 * Tests the {@link ILibraryLocationResolver} asking for libs using an EE description file
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
 	 * @throws Exception
 	 */
@@ -146,10 +146,10 @@
 			VMInstallTestsLibraryLocationResolver.isTesting = false;
 		}
 	}
-	
+
 	/**
 	 * Tests the {@link ILibraryLocationResolver} asking for libs directly from the backing type of the {@link IVMInstall}
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
 	 * @throws Exception
 	 */
@@ -162,7 +162,7 @@
 			vm.getVMInstallType().disposeVMInstall(vm.getId());
 			vm = JavaRuntime.getDefaultVMInstall();
 			assertNotNull("There must be a default VM", vm);
-			
+
 			LibraryLocation[] locs = vm.getVMInstallType().getDefaultLibraryLocations(vm.getInstallLocation());
 			assertResolvedLibraryLocations(locs);
 		}
@@ -171,11 +171,11 @@
 			vm.getVMInstallType().disposeVMInstall(vm.getId());
 		}
 	}
-	
+
 	/**
 	 * Tests the {@link ILibraryLocationResolver} asking for libs using an EE description file that provides
 	 * a source path for the ext dirs does *not* get overridden by the resolver
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
 	 * @throws Exception
 	 */
@@ -203,10 +203,10 @@
 			VMInstallTestsLibraryLocationResolver.isTesting = false;
 		}
 	}
-	
+
 	/**
 	 * Checks the given {@link LibraryLocation}s to ensure they reference the testing resolver paths
-	 * 
+	 *
 	 * @param locs
 	 */
 	void assertResolvedLibraryLocations(LibraryLocation[] locs) {
@@ -221,16 +221,16 @@
 				assertTrue("The source root path should be 'src' for ext lib ["+locpath+"]", root.toString().equals("src"));
 				URL url = locs[i].getJavadocLocation();
 				assertNotNull("There should be a Javadoc URL set for ext lib ["+locpath+"]", url);
-				assertTrue("There should be a javadoc path of test_resolver_javadoc.zip on the ext lib ["+locpath+"]", 
+				assertTrue("There should be a javadoc path of test_resolver_javadoc.zip on the ext lib ["+locpath+"]",
 						url.getPath().indexOf("test_resolver_javadoc.zip") > -1);
 				url = locs[i].getIndexLocation();
 				assertNotNull("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", url);
-				assertTrue("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", 
+				assertTrue("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]",
 						url.getPath().indexOf("test_resolver_index.index") > -1);
 			}
 		}
 	}
-	
+
 	/**
 	 * Creates a {@link VMStandin} for the given EE file. Does not return <code>null</code>
 	 * @param filename
@@ -244,11 +244,11 @@
 		assertNotNull("the VM standin should exist for "+filename, vm);
 		return vm;
 	}
-	
+
 	/**
 	 * Generates a key used to cache system property for this VM in this plug-ins
 	 * preference store.
-	 * 
+	 *
 	 * @param property system property name
 	 * @return preference store key
 	 */
@@ -263,5 +263,5 @@
 		buffer.append(property);
 		return buffer.toString();
 	}
-	
+
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java
index 08c779a..e4ec68e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java
@@ -32,7 +32,7 @@
 		if (!isTesting) {
 			return false;
 		}
-	
+
 		for (int i = 0; i < path.segmentCount(); i++) {
 			if ("ext".equals(path.segment(i))) {
 				return !JavaFxLibraryResolver.JFXRT_JAR.equals(path.lastSegment());
@@ -43,7 +43,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getPackageRoot(org.eclipse.core.runtime.IPath)
 	 */
 	@Override
@@ -56,7 +56,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getSourcePath(org.eclipse.core.runtime.IPath)
 	 */
 	@Override
@@ -72,7 +72,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getJavadocLocation(org.eclipse.core.runtime.IPath)
 	 */
 	@Override
@@ -93,7 +93,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getIndexLocation(org.eclipse.core.runtime.IPath)
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WatchExpressionTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WatchExpressionTests.java
index 3d1d081..96ea0ee 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WatchExpressionTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WatchExpressionTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -35,11 +35,11 @@
  * WatchExpressionTests
  */
 public class WatchExpressionTests extends AbstractDebugTest {
-	
+
 	public WatchExpressionTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Test a watch expression that is created before a program is executed.
 	 */
@@ -53,7 +53,7 @@
 			DebugElementEventWaiter waiter = new ExpressionWaiter(DebugEvent.CHANGE, expression);
 			waiter.setTimeout(60000);
 			thread= launchToBreakpoint(typeName);
-			assertNotNull("Breakpoint not hit within timeout period", thread); 
+			assertNotNull("Breakpoint not hit within timeout period", thread);
 			Object source = waiter.waitForEvent();
 			assertNotNull("Watch expression did not change", source);
 			IValue value = expression.getValue();
@@ -65,16 +65,16 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			removeAllExpressions();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Test a watch expression that is created while a program is suspended.
-     * 
+     *
      * see bug 81519. This test is flawed as expressions added to the manager
      * are note updated automatically. They are updated by the action that
      * creates the expression, or when a selection change occurrs in the debug view.
-     * This test can pass as the ordering of expression addition and selection 
+     * This test can pass as the ordering of expression addition and selection
      * change events can vary. However, it it attempting to test behavior that
      * does not exist, and is removed from the test suite.
 	 */
@@ -86,12 +86,12 @@
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			// create the expression, waiter, and then add it (to be evaluated)
 			expression = getExpressionManager().newWatchExpression("((Integer)fVector.get(3)).intValue()");
 			DebugElementEventWaiter waiter = new ExpressionWaiter(DebugEvent.CHANGE, expression);
 			getExpressionManager().addExpression(expression);
-			 
+
 			Object source = waiter.waitForEvent();
 			assertNotNull("Watch expression did not change", source);
 			IValue value = expression.getValue();
@@ -103,12 +103,12 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			removeAllExpressions();
-		}				
+		}
 	}
-	
+
 	/**
 	 * Test a watch expression updates while stepping.
-	 * 
+	 *
 	 * THIS TEST HAS BEEN DISABLED DUE TO BUG 228400
 	 */
 	public void DisabledtestStepping() throws Exception {
@@ -121,7 +121,7 @@
 			DebugElementEventWaiter waiter = new ExpressionWaiter(DebugEvent.CHANGE, expression);
 			waiter.setTimeout(60000);
 			thread= launchToBreakpoint(typeName);
-			assertNotNull("Breakpoint not hit within timeout period", thread); 
+			assertNotNull("Breakpoint not hit within timeout period", thread);
 			Object source = waiter.waitForEvent();
 			assertNotNull("Watch expression did not change", source);
 			IValue value = expression.getValue();
@@ -129,42 +129,42 @@
 			IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
 			IJavaValue compare = target.newValue(0);
 			assertEquals("Watch expression should be 0", compare, value);
-			
+
 			// now step once - should still be 0
 			waiter = new ExpressionWaiter(DebugEvent.CHANGE, expression);
 			stepOver((IJavaStackFrame)thread.getTopStackFrame());
 			source = waiter.waitForEvent();
 			assertNotNull("Watch expression did not change", source);
-			
+
 			// check for errors
 			dumpErrors(expression);
 			assertFalse("Should not have errors in expression", expression.hasErrors());
-			
+
 			// now step again - should be 1
 			waiter = new ExpressionWaiter(DebugEvent.CHANGE, expression);
 			stepOver((IJavaStackFrame)thread.getTopStackFrame());
 			source = waiter.waitForEvent();
 			assertNotNull("Watch expression did not change", source);
-			
+
 			// check for errors
 			dumpErrors(expression);
 			assertFalse("Should not have errors in expression", expression.hasErrors());
-			
-			value = expression.getValue();			
+
+			value = expression.getValue();
 			// create comparison value
 			compare = target.newValue(1);
 			assertEquals("Watch expression should be 1", compare, value);
-						
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			removeAllExpressions();
-		}				
+		}
 	}
-		
+
 	/**
 	 * Dumps any error messages to the console.
-	 * 
+	 *
      * @param expression
      */
     private void dumpErrors(IWatchExpression expression) {
@@ -179,13 +179,13 @@
 
     /**
 	 * Returns the expression manager
-	 * 
+	 *
 	 * @return expression manager
 	 */
 	protected IExpressionManager getExpressionManager() {
 		return DebugPlugin.getDefault().getExpressionManager();
 	}
-	
+
 	/**
 	 * Ensure the expression view is visible
 	 */
@@ -207,7 +207,7 @@
 			}
 		});
 	}
-	
+
 	/**
 	 * Removes all expressions from the manager
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkingDirectoryTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkingDirectoryTests.java
index f1d6c16..d439db5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkingDirectoryTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkingDirectoryTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,15 +25,15 @@
  * Tests working directories.
  */
 public class WorkingDirectoryTests extends AbstractDebugTest {
-	
+
 	public WorkingDirectoryTests(String name) {
 		super(name);
 	}
 
 	public void testDefaultWorkingDirectory() throws Exception {
 		String typeName = "WorkingDirectoryTest";
-		createLineBreakpoint(16, typeName);		
-		
+		createLineBreakpoint(16, typeName);
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
@@ -43,15 +43,15 @@
 			IVariable var = thread.findVariable("dir");
 			String dir = var.getValue().getValueString();
 			IPath path = new Path(dir);
-			assertEquals("default working dir should be the project directory.", get14Project().getProject().getLocation(), path); 
+			assertEquals("default working dir should be the project directory.", get14Project().getProject().getLocation(), path);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
-	 * Sets the working directory attribute of the test launch config 
+	 * Sets the working directory attribute of the test launch config
 	 * @param path
 	 */
 	protected void setWorkingDirectory(IPath path) throws CoreException {
@@ -88,7 +88,7 @@
 			setWorkingDirectory(null);
 		}
 	}
-	
+
 	public void testAbsoluteWorkingDirectory() throws Exception {
 		String typeName = "WorkingDirectoryTest";
 		createLineBreakpoint(16, typeName);
@@ -110,5 +110,5 @@
 			removeAllBreakpoints();
 			setWorkingDirectory(null);
 		}
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkspaceSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkspaceSourceContainerTests.java
index e64bfec..7d6e4f9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkspaceSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/WorkspaceSourceContainerTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
  * Tests source containers
  */
 public class WorkspaceSourceContainerTests extends AbstractDebugTest {
-	
+
 	public WorkspaceSourceContainerTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Returns a workspace source container.
 	 */
@@ -36,10 +36,10 @@
 		WorkspaceSourceContainer container = new WorkspaceSourceContainer();
 		director.setSourceContainers(new ISourceContainer[]{container});
 		return container;
-	}	
+	}
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testWorkspaceSourceContainerMemento() throws Exception {
@@ -47,7 +47,7 @@
 		String memento = container.getType().getMemento(container);
 		ISourceContainer restore = container.getType().createSourceContainer(memento);
 		assertEquals("Workspace source container memento failed", container, restore);
-	}		
+	}
 
 	public void testSimpleSourceLookupPositive() throws Exception {
 		IFolder folder = get14Project().getProject().getFolder("src");
@@ -56,13 +56,13 @@
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", folder.getFile("Breakpoints.java"), objects[0]);
 	}
-	
+
 	public void testSimpleSourceLookupNegative() throws Exception {
 		WorkspaceSourceContainer container = getContainer(false);
 		Object[] objects = container.findSourceElements("FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
-	
+	}
+
 	public void testQualifiedSourceLookupPositive() throws Exception {
 		IFolder folder = get14Project().getProject().getFolder("src");
 		WorkspaceSourceContainer container = getContainer(false);
@@ -70,13 +70,13 @@
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", folder.getFile("org/eclipse/debug/tests/targets/InfiniteLoop.java"), objects[0]);
 	}
-	
+
 	public void testQualifiedSourceLookupNegative() throws Exception {
 		WorkspaceSourceContainer container = getContainer(false);
 		Object[] objects = container.findSourceElements("a/b/c/FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
-	
+	}
+
 	public void testCaseSensitiveQualifiedSourceLookup() throws Exception {
 		IFolder folder = get14Project().getProject().getFolder("src");
 		WorkspaceSourceContainer container = getContainer(false);
@@ -89,5 +89,5 @@
 			assertEquals("Expected 1 result", 1, objects.length);
 			assertEquals("Wrong file", folder.getFile("org/eclipse/debug/tests/targets/InfiniteLoop.java"), objects[0]);
 		}
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAllocationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAllocationTests.java
index f7ca16e..8e77db0 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAllocationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAllocationTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAssignmentTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAssignmentTests.java
index 08223e1..efafb75 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAssignmentTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayAssignmentTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayInitializationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayInitializationTests.java
index c96799f..20f9c2d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayInitializationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayInitializationTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayValueTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayValueTests.java
index 5b53ae3..8cf01cd 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayValueTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ArrayValueTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanAssignmentOperatorsTests.java
index a0c237a..8574f07 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanOperatorsTests.java
index e7190bc..a01bafa 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/BooleanOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteAssignmentOperatorsTests.java
index 9013e8a..627b695 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteOperatorsTests.java
index 83a7aed..219b96e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ByteOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharAssignmentOperatorsTests.java
index 085d478..336829a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharOperatorsTests.java
index 4ab00ef..28edace 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/CharOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleAssignmentOperatorsTests.java
index 9a1f714..5bd05cb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleOperatorsTests.java
index 00e3142..9651386 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/DoubleOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FieldValueTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FieldValueTests.java
index 58d2bf6..1d2827a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FieldValueTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FieldValueTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatAssignmentOperatorsTests.java
index aa38415..1f0ad83 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatOperatorsTests.java
index abc4f19..9ee50f5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/FloatOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java
index 4c15a2b..6dfdd34 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java
@@ -16,12 +16,12 @@
 
 /**
  * Tests that evaluations in non-generified source
- * 
+ *
  * @since 3.8.100
  */
 public class GeneralEvalTests extends AbstractDebugTest {
 
-	
+
 	/**
 	 * @param name
 	 */
@@ -48,7 +48,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -68,7 +68,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -88,7 +88,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -108,7 +108,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -129,7 +129,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -150,7 +150,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -171,7 +171,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -192,7 +192,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -213,7 +213,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -234,7 +234,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -255,7 +255,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -276,7 +276,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -297,7 +297,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -318,7 +318,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -339,7 +339,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -360,7 +360,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -381,7 +381,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -402,7 +402,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -423,7 +423,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=401270
 	 * @throws Exception
@@ -444,7 +444,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
 	 * @throws Exception
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java
index f7c2c65..7d98177 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java
@@ -17,7 +17,7 @@
 
 /**
  * Group of tests that evaluate operations involving generics
- * 
+ *
  * @since 3.8
  */
 public class GenericsEvalTests extends AbstractDebugTest {
@@ -33,11 +33,11 @@
 	protected IJavaProject getProjectContext() {
 		return get15Project();
 	}
-	
+
 	/**
-	 * Evaluates a generified snippet with a simple single 
+	 * Evaluates a generified snippet with a simple single
 	 * generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalGenerics1() throws Exception {
@@ -55,11 +55,11 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
-	 * Evaluates a generified snippet with a simple single 
+	 * Evaluates a generified snippet with a simple single
 	 * generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalGenerics2() throws Exception {
@@ -77,11 +77,11 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
-	 * Evaluates a generified snippet with a simple single 
+	 * Evaluates a generified snippet with a simple single
 	 * generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalGenerics3() throws Exception {
@@ -99,7 +99,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGenerics4() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -115,7 +115,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGenerics5() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -131,7 +131,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGenerics6() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -147,7 +147,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGenerics7() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -163,7 +163,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGenerics8() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -179,7 +179,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGenerics9() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -195,7 +195,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGeneric10() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -211,7 +211,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGeneric11() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -227,7 +227,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGeneric12() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -244,7 +244,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	public void testEvalGeneric13() throws Exception {
 		IJavaThread thread = null;
 		try {
@@ -261,7 +261,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -281,7 +281,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -301,7 +301,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -321,7 +321,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -341,7 +341,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -361,7 +361,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -381,7 +381,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -401,7 +401,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
@@ -421,7 +421,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
 	 * @throws Exception
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntAssignmentOperatorsTests.java
index 1330be1..52eb6e5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntOperatorsTests.java
index e0f29c5..7d853e2 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/IntOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Java8Tests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Java8Tests.java
index 1b04c09..9603f96 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Java8Tests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Java8Tests.java
@@ -8,7 +8,7 @@
  * This is an implementation of an early-draft specification developed under the Java
  * Community Process (JCP) and is made available for testing and evaluation purposes
  * only. The code is not compatible with any specification of the JCP.
- * 
+ *
  * Contributors:
  *     Jesper S. Møller - initial API and implementation
  *     Jesper Steen Møller - bug 426903: [1.8] Cannot evaluate super call to default method
@@ -25,7 +25,7 @@
 
 /**
  * Group of tests that evaluate operations involving generics
- * 
+ *
  * @since 3.8
  */
 public class Java8Tests extends AbstractDebugTest {
@@ -41,11 +41,11 @@
 	protected IJavaProject getProjectContext() {
 		return get18Project();
 	}
-	
+
 	/**
-	 * Evaluates a generified snippet with a simple single 
+	 * Evaluates a generified snippet with a simple single
 	 * generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalDefaultMethod() throws Exception {
@@ -66,7 +66,7 @@
 
 	/**
 	 * Evaluates a snippet in the context of interface method generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalInterfaceMethod() throws Exception {
@@ -85,10 +85,10 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * Evaluates a snippet in the context of interface method generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testBugEvalIntfSuperDefault() throws Exception {
@@ -111,7 +111,7 @@
 
 	/**
 	 * Evaluates a static method on an object generic statement
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEvalStatictMethod() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LabelTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LabelTests.java
index 3b9a98f..73e9c76 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LabelTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LabelTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 	protected void end() throws Exception {
 		destroyFrame();
 	}
-	
+
 	// if break
 	public void testIfBreak() throws Throwable {
 		try {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarAssignmentTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarAssignmentTests.java
index 5bfb4a0..14baacb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarAssignmentTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarAssignmentTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 		destroyFrame();
 	}
 
-	// 
+	//
 
 	public void testByte() throws Throwable {
 		try {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarValueTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarValueTests.java
index 5024f73..ad9de1f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarValueTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LocalVarValueTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 		destroyFrame();
 	}
 
-	// 
+	//
 
 	public void testByte() throws Throwable {
 		try {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongAssignmentOperatorsTests.java
index bcd98de..418e6e7 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongOperatorsTests.java
index 78a7717..fc128ed 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LongOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LoopTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LoopTests.java
index 47484b2..cc08acb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LoopTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LoopTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -68,7 +68,7 @@
 			end();
 		}
 	}
-	
+
 	// while break
 	public void testWhileBreak() throws Throwable {
 		try {
@@ -110,7 +110,7 @@
 			end();
 		}
 	}
-	
+
 	// while continue
 	public void testWhileContinue() throws Throwable {
 		try {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_120.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_120.java
index 3c44d49..b528500 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_120.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_120.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_145.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_145.java
index 8cdf0f5..a222ebb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_145.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_145.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_155.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_155.java
index 53dadfa..96d9200 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_155.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_155.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_179.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_179.java
index cd3efca..af76bbe 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_179.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_179.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_203.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_203.java
index abba283..a1b0993 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_203.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_203.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_214.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_214.java
index 5d08005..a19f2b6 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_214.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_214.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_252.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_252.java
index 0f52c4f..1830d00 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_252.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_252.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_279.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_279.java
index ed4df56..4f8b7b8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_279.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_279.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_304.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_304.java
index df00470..37bcccc 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_304.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_304.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_315.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_315.java
index c5cd5d9..0ae9a66 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_315.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_315.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_354.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_354.java
index 8c3cc32..57ebb01 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_354.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_354.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_381.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_381.java
index c440ff0..aa19f60 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_381.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_381.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_406.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_406.java
index 3e3f6a2..75d9805 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_406.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_406.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_417.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_417.java
index 89ebabf..385c917 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_417.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_417.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_455.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_455.java
index 94de64e..25aa07a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_455.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_455.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_481.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_481.java
index 1044c2e..0481dc9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_481.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_481.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_506.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_506.java
index ef0b70d..6db2849 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_506.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_506.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_517.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_517.java
index d26d682..9a289ae 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_517.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_517.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_529.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_529.java
index 53ed194..482aca1 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_529.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_529.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_566.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_566.java
index a721dba..f4b8587 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_566.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_566.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_592.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_592.java
index ec2e2fc..28d5008 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_592.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_592.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_616.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_616.java
index e292b5d..bce39a5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_616.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_616.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_626.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_626.java
index 01e82b2..63d7f3e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_626.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_626.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_65.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_65.java
index d4979ad..511b17e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_65.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_65.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_664.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_664.java
index 8d0f789..ca65243 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_664.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_664.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_69.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_69.java
index 453178f..fbd25a2 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_69.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_69.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_690.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_690.java
index 471fa99..c0b0308 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_690.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_690.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_714.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_714.java
index 33447ab..68198f3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_714.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_714.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_724.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_724.java
index ff0cf21..a645556 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_724.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_724.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_739.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_739.java
index 7d8ee2a..697b256 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_739.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_739.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_94.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_94.java
index b46e9cb..f6b64c1 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_94.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NestedTypeFieldValue_94.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NumericTypesCastTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NumericTypesCastTests.java
index bd50c04..7db1324 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NumericTypesCastTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/NumericTypesCastTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedFieldValueTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedFieldValueTests.java
index 4c5e819..e029bc6 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedFieldValueTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedFieldValueTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests.java
index c7a1d24..5bd79b6 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests2.java
index 8931f4c..086dfa1 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/QualifiedStaticFieldValueTests2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortAssignmentOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortAssignmentOperatorsTests.java
index 161e8c5..561fca8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortAssignmentOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortAssignmentOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortOperatorsTests.java
index eb3a262..72fc416 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/ShortOperatorsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests.java
index defe22b..9321ef8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests2.java
index 4075ff5..71c0002 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StaticFieldValueTests2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusAssignmentOpTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusAssignmentOpTests.java
index f5b4558..7260deb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusAssignmentOpTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusAssignmentOpTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusOpTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusOpTests.java
index 311864a..e58613d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusOpTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/StringPlusOpTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Tests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Tests.java
index 2e455f6..1ae02ac 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Tests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/Tests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
 	static final String xString = "\"minus three\"";
 	static final String xBoolean = "true";
 	static final String xNull = "null";
-	
+
 	static byte xByteValue = (byte)-3;
 	static char xCharValue = (char)-3;
 	static short xShortValue = (short)-3;
@@ -61,7 +61,7 @@
 	static final String xVarString = "xVarString";
 	static final String xVarBoolean = "xVarBoolean";
 //	static final String xVarNull = "xVarNull";
-	
+
 	static final byte xVarByteValue = (byte)-5;
 	static final char xVarCharValue = (char)-5;
 	static final short xVarShortValue = (short)-5;
@@ -94,7 +94,7 @@
 	static final String yStringValue = "eight";
 	static final boolean yBooleanValue = false;
 	static final Object yNullValue = null;
-	
+
 	static final String yVarByte = "yVarByte";
 	static final String yVarChar = "yVarChar";
 	static final String yVarShort = "yVarShort";
@@ -105,7 +105,7 @@
 	static final String yVarString = "yVarString";
 	static final String yVarBoolean = "yVarBoolean";
 //	static final String yVarNull = "yVarNull";
-	
+
 	static final byte yVarByteValue = (byte)7;
 	static final char yVarCharValue = (char)7;
 	static final short yVarShortValue = (short)7;
@@ -116,7 +116,7 @@
 	static final String yVarStringValue = "seven";
 	static final boolean yVarBooleanValue = false;
 //	static final Object yVarNullValue = null;
-	
+
 	static final String xFieldByte = "xFieldByte";
 	static final String xFieldChar = "xFieldChar";
 	static final String xFieldShort = "xFieldShort";
@@ -156,7 +156,7 @@
 	static final String yStaticFieldDouble = "yStaticFieldDouble";
 	static final String yStaticFieldString = "yStaticFieldString";
 	static final String yStaticFieldBoolean = "yStaticFieldBoolean";
-	
+
 	static final byte xFieldByteValue = -2;
 	static final char xFieldCharValue = (char)-2;
 	static final short xFieldShortValue = -2;
@@ -196,7 +196,7 @@
 	static final double yStaticFieldDoubleValue = 6.5;
 	static final String yStaticFieldStringValue = "six";
 	static final boolean yStaticFieldBooleanValue = false;
-	
+
 	static final String xArrayByte = "xArrayByte";
 	static final String xArrayChar = "xArrayChar";
 	static final String xArrayShort = "xArrayShort";
@@ -236,8 +236,8 @@
 	static final double[] yArrayDoubleValue = new double[]{7.6, 8.7, 9.8};
 	static final String[] yArrayStringValue = new String[]{"seven", "eight", "nine"};
 	static final boolean[] yArrayBooleanValue = new boolean[]{false, true, false};
-		
-	
+
+
 	static final String plusOp = "+";
 	static final String minusOp = "-";
 	static final String multiplyOp = "*";
@@ -273,8 +273,8 @@
 	static final String postfixPlusPlusOp = "++";
 	static final String prefixMinusMinusOp = "--";
 	static final String postfixMinusMinusOp = "--";
-	
-	
+
+
 	static final String aInt = "a";
 	static final String bInt = "b";
 	static final String cInt = "c";
@@ -347,7 +347,7 @@
 	static final String hStringValue_2 = "eight";
 	static final String iStringValue_2 = "nine";
 	static final String jStringValue_2 = "zero";
-	
+
 	static final String EMPTY= "";
 	static final String THIS= "this.";
 	static final String T_T= "EvalNestedTypeTests.";
@@ -401,7 +401,7 @@
 	static final String I_FB= "i_fb.";
 	static final String I_FC= "i_fc.";
 	static final String I_FD= "i_fd.";
-	
+
 
 	/**
 	 * Constructor for Tests.
@@ -412,24 +412,24 @@
 	}
 
 	static protected IJavaThread fSuspendeeThread;
-	
+
 	static protected IJavaStackFrame fFrame;
-	
+
 	static protected ICompilationUnit fCu;
-	
+
 	static protected IEvaluationEngine fEngine;
-	
+
 
 	static protected IValue eval(String command) {
-		
+
 		class Listener implements IEvaluationListener {
 			IEvaluationResult fResult;
-			
+
 			@Override
 			public void evaluationComplete(IEvaluationResult result) {
 				fResult= result;
 			}
-			
+
 			public IEvaluationResult getResult() {
 				return fResult;
 			}
@@ -463,19 +463,19 @@
 		}
 		return result.getValue();
 	}
-	
+
 	protected void initializeFrame(String testClass, int breakPointLine, int numberFrames) throws Exception {
 		fFrame = getStackFrame(breakPointLine, numberFrames, 0, 0, testClass);
 
 		fEngine = getEvaluationEngine((IJavaDebugTarget)fFrame.getDebugTarget(), get14Project());
 	}
-	
+
 	protected void initializeFrame(String testClass, int breakPointLine, int numberFrames, int hitCount) throws Exception {
 		fFrame = getStackFrame(breakPointLine, numberFrames, 0, hitCount, testClass);
 
 		fEngine = getEvaluationEngine((IJavaDebugTarget)fFrame.getDebugTarget(), get14Project());
 	}
-	
+
 	protected void destroyFrame() throws Exception {
 		try {
 			terminateAndRemove(fSuspendeeThread);
@@ -487,13 +487,13 @@
 		}
 		fFrame = null;
 	}
-	
-	
+
+
 	protected IEvaluationEngine getEvaluationEngine(IJavaDebugTarget vm, IJavaProject project) {
 		IEvaluationEngine engine = EvaluationManager.newAstEvaluationEngine(project, vm);
 		return engine;
-	}		
-	
+	}
+
 	protected IJavaStackFrame getStackFrame(int breakpointLine, int numberFrames, int frameNumber, int hitCount, String testClass) throws Exception {
 		IJavaLineBreakpoint breakpoint= createLineBreakpoint(breakpointLine, testClass);
 		breakpoint.setHitCount(hitCount);
@@ -503,5 +503,5 @@
 		IStackFrame stackFrame= stackFrames[frameNumber];
 		return (IJavaStackFrame)stackFrame;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsAnonymousClassVariable.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsAnonymousClassVariable.java
index 53217e8..6e81696 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsAnonymousClassVariable.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsAnonymousClassVariable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 public class TestsAnonymousClassVariable extends Tests {
 	/**
 	 * Constructor for TestsAnonymousClassVariable.
-	 * 
+	 *
 	 * @param name
 	 */
 	public TestsAnonymousClassVariable(String name) {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsArrays.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsArrays.java
index 93cbe54..d409581 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsArrays.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsArrays.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsBreakpointConditions.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsBreakpointConditions.java
index 55cb146..d00abe6 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsBreakpointConditions.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsBreakpointConditions.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes1.java
index 7cc1b53..08808eb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes2.java
index 68586c1..d0a1883 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNestedTypes2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNumberLiteral.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNumberLiteral.java
index c20b366..fe293f3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNumberLiteral.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsNumberLiteral.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators1.java
index 915500f..b3c918c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators2.java
index 7395651..24e789f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsOperators2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy1.java
index b3eaae6..550fb10 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy2.java
index 39468cb..a54b2d5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TestsTypeHierarchy2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_119_1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_119_1.java
index fd21425..d840282 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_119_1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_119_1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_146_1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_146_1.java
index 73891d1..c18101b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_146_1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_146_1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_1.java
index 66fcdfb..fc31093 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_2.java
index a46a805..80b1029 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_3.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_3.java
index 6513de7..ed44acb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_3.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_3.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_4.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_4.java
index 3954994..69055ed 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_4.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_4.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_5.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_5.java
index 70fddb1..b3dca8f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_5.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_5.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_6.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_6.java
index 1df5827..f5b131c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_6.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_32_6.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_1.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_1.java
index 3bc0d5b..f89c236 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_1.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_2.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_2.java
index 5cdad0e..76a9e3d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_2.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_3.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_3.java
index 6a43401..8539848 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_3.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/TypeHierarchy_68_3.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/VariableDeclarationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/VariableDeclarationTests.java
index 048b0de..cf0f5b8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/VariableDeclarationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/VariableDeclarationTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/XfixOperatorsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/XfixOperatorsTests.java
index 800d623..2d14d0f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/XfixOperatorsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/XfixOperatorsTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/NestedTypeTestGenerator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/NestedTypeTestGenerator.java
index e738261..63236e9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/NestedTypeTestGenerator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/NestedTypeTestGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -70,13 +70,13 @@
 	static final int I_FC= 37;
 	static final int I_FD= 38;
 
-	static final String[] qualifiers= 
+	static final String[] qualifiers=
 		{"T_T",     "T_T_A",    "T_A",    "T_T_A_AA", "T_A_AA",   "T_AA",   "T_T_this", "T_T_Athis", "T_A_this", "T_B_this",
 		"T_C_this", "T_E_this", "I_A",    "I_AA",     "I_AB",     "I_AC",   "I_AD",     "I_AE",      "I_AF",     "I_B",
 		"I_BB",     "I_BC",     "I_BD",   "I_C",      "I_CB",     "I_CC",   "I_CD",     "I_D",       "I_DB",     "I_DC",
 		"I_DD",     "I_E",      "I_EB",   "I_EC",     "I_ED",     "I_F",    "I_FB",     "I_FC",      "I_FD",     "T_T_B",
 		"T_B",      "T_T_B_BB", "T_B_BB", "T_BB",     "T_T_A_AB", "T_A_AB", "T_AB"};
-	
+
 	static final int [] qualifiersLevel=
 		{0, 1, 1, 2, 2, 2, 0, 1, 1, 1,
 		 1, 1, 1, 2, 2, 2, 2, 2, 2, 1,
@@ -118,10 +118,10 @@
 		gen_evalNestedTypeTestStatic();
 		System.out.println("done");
 	}
-	
+
 	public static void gen_AA_aa() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('c', 2, code);
 		createTest('d', 2, code);
@@ -137,13 +137,13 @@
 		createTestThis('i', 2, code);
 		createTestThis('j', 2, code);
 		createTestsStaticFields_A(code);
-		
+
 		createJavaFile(code, 65, 4);
 	}
-	
+
 	public static void gen_AA_aaStatic() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('d', 2, code);
 		createTest('f', 2, code);
@@ -153,10 +153,10 @@
 
 		createJavaFile(code, 69, 4);
 	}
-	
+
 	public static void gen_AB_ab() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('c', 2, code);
 		createTest('d', 2, code);
@@ -177,13 +177,13 @@
 		createTestQualifier(T_A_this, 'd', code);
 		createTestQualifier(T_A_this, 'g', code);
 		createTestQualifier(T_A_this, 'h', code);
-		
+
 		createJavaFile(code, 94, 4);
 	}
 
 	public static void gen_AC_ac() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('g', 2, code);
 		createTest('h', 2, code);
@@ -192,13 +192,13 @@
 		createTestQualifier(T_A_this, 'd', code);
 		createTestQualifier(T_A_this, 'g', code);
 		createTestQualifier(T_A_this, 'h', code);
-		
+
 		createJavaFile(code, 120, 4);
 	}
-	
+
 	public static void gen_AD_ad() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('g', 2, code);
 		createTest('h', 2, code);
@@ -207,13 +207,13 @@
 		createTestQualifier(T_A_this, 'd', code);
 		createTestQualifier(T_A_this, 'g', code);
 		createTestQualifier(T_A_this, 'h', code);
-		
+
 		createJavaFile(code, 145, 4);
 	}
-	
+
 	public static void gen_A_a() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 1, code);
 		createTest('c', 1, code);
 		createTest('d', 1, code);
@@ -231,33 +231,33 @@
 		createTestQualifier(I_AB, 'f', code);
 		createTestQualifier(I_AB, 'i', code);
 		createTestQualifier(I_AB, 'j', code);
-		
+
 		createJavaFile(code, 155, 3);
 	}
-	
+
 	public static void gen_AE_ae() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('h', 2, code);
 		createTestsStaticFields_A(code);
-		
+
 		createJavaFile(code, 179, 4);
 	}
-	
+
 	public static void gen_AF_af() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTest('h', 2, code);
 		createTestsStaticFields_A(code);
-		
+
 		createJavaFile(code, 203, 4);
 	}
-	
+
 	public static void gen_A_aStatic() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 1, code);
 		createTest('d', 1, code);
 		createTest('f', 1, code);
@@ -269,13 +269,13 @@
 		createTestQualifier(I_AA, 'f', code);
 		createTestQualifier(I_AA, 'i', code);
 		createTestQualifier(I_AA, 'j', code);
-		
+
 		createJavaFile(code, 214, 3);
 	}
-	
+
 	public static void gen_BB_bb() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTest('c', 2, code);
@@ -303,13 +303,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 252, 4);
 	}
 
 	public static void gen_BC_bc() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTest('g', 2, code);
@@ -325,13 +325,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 279, 4);
 	}
 
 	public static void gen_BD_bd() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTest('g', 2, code);
@@ -347,13 +347,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 304, 4);
 	}
 
 	public static void gen_B_b() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 1, code);
 		createTest('b', 1, code);
 		createTest('c', 1, code);
@@ -379,13 +379,13 @@
 		createTestQualifier(I_BB, 'f', code);
 		createTestQualifier(I_BB, 'i', code);
 		createTestQualifier(I_BB, 'j', code);
-		
+
 		createJavaFile(code, 315, 3);
 	}
 
 	public static void gen_CB_cb() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
@@ -395,13 +395,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 354, 4);
 	}
 
 	public static void gen_CC_cc() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
@@ -411,13 +411,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 381, 4);
 	}
 
 	public static void gen_CD_cd() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
@@ -427,13 +427,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 406, 4);
 	}
 
 	public static void gen_C_c() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 1, code);
 		createTest('b', 1, code);
 		createTest('e', 1, code);
@@ -445,13 +445,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 417, 3);
 	}
 
 	public static void gen_DB_db() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
@@ -461,13 +461,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 455, 4);
 	}
 
 	public static void gen_DC_dc() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
@@ -477,13 +477,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 481, 4);
 	}
 
 	public static void gen_DD_dd() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 2, code);
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
@@ -493,13 +493,13 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 506, 4);
 	}
 
 	public static void gen_D_d() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('a', 1, code);
 		createTest('b', 1, code);
 		createTest('e', 1, code);
@@ -511,14 +511,14 @@
 		createTestQualifier(T_T_this, 'd', code);
 		createTestQualifier(T_T_this, 'e', code);
 		createTestQualifier(T_T_this, 'f', code);
-		
+
 		createJavaFile(code, 517, 3);
 	}
-	
+
 	public static void gen_evalNestedTypeTest() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
-		
+
+
 		createTest('a', 0, code);
 		createTest('b', 0, code);
 		createTest('c', 0, code);
@@ -542,87 +542,87 @@
 		createTestQualifier(I_BB, 'f', code);
 		createTestQualifier(I_BB, 'i', code);
 		createTestQualifier(I_BB, 'j', code);
-		
+
 		createJavaFile(code, 529, 2);
 	}
 
 	public static void gen_EB_eb() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 566, 4);
 	}
 
 	public static void gen_EC_ec() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 592, 4);
 	}
 
 	public static void gen_ED_ed() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 616, 4);
 	}
 
 	public static void gen_E_e() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 1, code);
 		createTest('f', 1, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 626, 3);
 	}
-	
+
 	public static void gen_FB_fb() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 664, 4);
 	}
 
 	public static void gen_FC_fc() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 690, 4);
 	}
 
 	public static void gen_FD_fd() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 2, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 714, 4);
 	}
 
 	public static void gen_F_f() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 1, code);
 		createTest('f', 1, code);
 		createTestsStaticFields(code);
-		
+
 		createJavaFile(code, 724, 3);
 	}
-	
+
 	public static void gen_evalNestedTypeTestStatic() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTest('b', 0, code);
 		createTest('d', 0, code);
 		createTest('f', 0, code);
@@ -643,20 +643,20 @@
 		createTestQualifier(I_AB, 'f', code);
 		createTestQualifier(I_AB, 'i', code);
 		createTestQualifier(I_AB, 'j', code);
-		
+
 		createJavaFile(code, 739, 2);
 	}
-	
+
 	public static void gen_main() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTestsStaticFields(code);
 
 		createJavaFile(code, 745, 1);
 	}
 
 	// ------------------------------
-	
+
 	public static void createTestsStaticFields(StringBuffer code) {
 		createTestQualifier(T_T, 'b', code);
 		createTestQualifier(T_T, 'd', code);
@@ -688,7 +688,7 @@
 		createTestQualifier(T_B_BB, 'f', code);
 		createTestQualifier(T_B_BB, 'j', code);
 	}
-	
+
 	public static void createTestsStaticFields_A(StringBuffer code) {
 		createTestsStaticFields(code);
 		createTestQualifier(T_AA, 'd', code);
@@ -698,76 +698,76 @@
 		createTestQualifier(T_AB, 'f', code);
 		createTestQualifier(T_AB, 'j', code);
 	}
-	
+
 	public static void createTestsStaticFields_B(StringBuffer code) {
 		createTestsStaticFields(code);
 		createTestQualifier(T_BB, 'd', code);
 		createTestQualifier(T_BB, 'f', code);
 		createTestQualifier(T_BB, 'j', code);
 	}
-	
+
 	// ------------------------------
-	
+
 	public static void createTest(char variable, int level, StringBuffer code) {
 		code.append("\tpublic void testEvalNestedTypeTest_" + variable + "() throws Throwable {\n");
 		tryBlockBegin(code);
-		
+
 		genCodeEval(IInternalDebugCoreConstants.EMPTY_STRING + variable + "Int", true, code);
 		genCodeReturnTypeCheck(IInternalDebugCoreConstants.EMPTY_STRING + variable, "int", true, code);
 		genCodeReturnValueCheckPrimitiveType(IInternalDebugCoreConstants.EMPTY_STRING + variable, "int", "Int", variable + "IntValue_" + level, true, code);
 		code.append("\n");
-		
+
 		genCodeEval(IInternalDebugCoreConstants.EMPTY_STRING + variable + "String", false, code);
 		genCodeReturnTypeCheck(IInternalDebugCoreConstants.EMPTY_STRING + variable, "java.lang.String", false, code);
 		genCodeReturnValueCheckStringType(IInternalDebugCoreConstants.EMPTY_STRING + variable, variable + "StringValue_" + level, true, code);
-		
+
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void createTestThis(char variable, int level, StringBuffer code) {
 		code.append("\tpublic void testEvalNestedTypeTest_this_" + variable + "() throws Throwable {\n");
 		tryBlockBegin(code);
-		
+
 		genCodeEval("THIS + " + variable + "Int", true, code);
 		genCodeReturnTypeCheck(IInternalDebugCoreConstants.EMPTY_STRING + variable, "int", true, code);
 		genCodeReturnValueCheckPrimitiveType(IInternalDebugCoreConstants.EMPTY_STRING + variable, "int", "Int", variable + "IntValue_" + level, true, code);
 		code.append("\n");
-		
+
 		genCodeEval("THIS + " + variable + "String", false, code);
 		genCodeReturnTypeCheck(IInternalDebugCoreConstants.EMPTY_STRING + variable, "java.lang.String", false, code);
 		genCodeReturnValueCheckStringType(IInternalDebugCoreConstants.EMPTY_STRING + variable, variable + "StringValue_" + level, true, code);
-		
+
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
-	
-	
+
+
+
 	public static void createTestQualifier(int qualifier, char variable, StringBuffer code) {
 		String strQualifier= qualifiers[qualifier];
 		code.append("\tpublic void testEvalNestedTypeTest_" + strQualifier + "_" + variable + "() throws Throwable {\n");
 		tryBlockBegin(code);
-		
+
 		genCodeEval(strQualifier + " + " + variable + "Int", true, code);
 		genCodeReturnTypeCheck(IInternalDebugCoreConstants.EMPTY_STRING + strQualifier + "_" + variable, "int", true, code);
 		genCodeReturnValueCheckPrimitiveType(IInternalDebugCoreConstants.EMPTY_STRING + strQualifier + "_" + variable, "int", "Int", variable + "IntValue_" + qualifiersLevel[qualifier], true, code);
 		code.append("\n");
-		
+
 		genCodeEval(strQualifier + " + " + variable + "String", false, code);
 		genCodeReturnTypeCheck(IInternalDebugCoreConstants.EMPTY_STRING + strQualifier + "_" + variable, "java.lang.String", false, code);
 		genCodeReturnValueCheckStringType(IInternalDebugCoreConstants.EMPTY_STRING + strQualifier + "_" + variable, variable + "StringValue_" + qualifiersLevel[qualifier], true, code);
-		
+
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	//---------------------
-	
+
 	public static void createJavaFile(StringBuffer tests, int lineNumber, int numberFrames) throws Exception {
-		
+
 		StringBuffer code= new StringBuffer();
-		
+
 		code.append("/*******************************************************************************\n");
 		code.append(" * Copyright (c) 2002, 2003 IBM Corporation and others.\n");
 		code.append(" * All rights reserved. This program and the accompanying materials \n");
@@ -796,11 +796,11 @@
 		code.append("\tprotected void end() throws Exception {\n");
 		code.append("\t\tdestroyFrame();\n");
 		code.append("\t}\n\n");
-		
+
 		code.append(tests.toString());
-		
+
 		code.append("}\n");
-		
+
 		try (Writer file = new FileWriter(new File("NestedTypeFieldValue_" + lineNumber + ".java").getAbsoluteFile())) {
 			file.write(code.toString());
 		}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/OtherTestsGenerator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/OtherTestsGenerator.java
index d93e356..b34c075 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/OtherTestsGenerator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/OtherTestsGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,7 +17,7 @@
 public class OtherTestsGenerator extends TestGenerator {
 
 	public static void main(String[] args) throws Exception {
-		
+
 		genTestsOperators1();
 		genTestsOperators2();
 		genTestsArray();
@@ -26,7 +26,7 @@
 		genTestsTypeHierarchy1();
 		genTestsTypeHierarchy2();
 		genTestNumberLiteral();
-		
+
 		genInstanceOfTests();
 
 		System.out.println("done");
@@ -34,29 +34,29 @@
 
 	public static void genTestsOperators1() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		genTestTypeBinaryOpTypeBinaryPromotion(T_int, Op_plus, T_int, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(T_String, Op_plus, T_String, code);
 		genTestLocalVarValue(T_int, code);
 		genTestLocalVarValue(T_String, code);
-		
+
 		createJavaFile(code, "TestsOperators1", "EvalSimpleTests", 37, 1, 1);
 	}
 
 	public static void genTestsOperators2() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		genTestLocalVarAssignment(T_int, code);
 		genTestLocalVarAssignment(T_String, code);
 		genTestTypeAssignmentOpType(T_int, Op_plusAss, T_int, code);
 		genTestTypeAssignmentOpType(T_String, Op_plusAss, T_String, code);
-		
+
 		createJavaFile(code, "TestsOperators2", "EvalSimpleTests", 37, 1, 1);
 	}
-	
+
 	public static void genTestsArray() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		genTestArrayValue(T_int, code);
 		genTestArrayLength(T_int, code);
 		genTestArrayAssignment(T_int, code);
@@ -66,13 +66,13 @@
 		genTestArrayLength(T_String, code);
 		genTestArrayAssignment(T_String, code);
 		genTestArrayInitialization(T_String, code);
-		
+
 		createJavaFile(code, "TestsArrays", "EvalArrayTests", 37, 1, 1);
 	}
 
 	public static void genTestsNestedTypes1() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		NestedTypeTestGenerator.createTest('a', 2, code);
 		NestedTypeTestGenerator.createTest('d', 2, code);
 		NestedTypeTestGenerator.createTest('e', 2, code);
@@ -104,7 +104,7 @@
 
 	public static void genTestsNestedTypes2() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		NestedTypeTestGenerator.createTest('f', 0, code);
 		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T, 'b', code);
 		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A, 'd', code);
@@ -131,7 +131,7 @@
 
 	public static void genTestsTypeHierarchy1() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.IAA, TypeHierarchyTestsGenerator.M1, code);
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.AA, TypeHierarchyTestsGenerator.M2, code);
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.AB, TypeHierarchyTestsGenerator.S2, code);
@@ -146,7 +146,7 @@
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.CC, TypeHierarchyTestsGenerator.M2, code);
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.CC, TypeHierarchyTestsGenerator.M4, code);
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.CC, TypeHierarchyTestsGenerator.M6, code);
-		
+
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_A, TypeHierarchyTestsGenerator.M1, code);
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_B, TypeHierarchyTestsGenerator.M1, code);
 		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_B, TypeHierarchyTestsGenerator.M2, code);
@@ -162,7 +162,7 @@
 		StringBuffer code= new StringBuffer();
 
 		TypeHierarchyTestsGenerator.createTest_TestC(code, TypeHierarchyTestsGenerator.CC);
-		
+
 		createJavaFile(code, "TestsTypeHierarchy2", "EvalTypeHierarchyTests",   119, 2, 1, false);
 	}
 
@@ -190,7 +190,7 @@
 		createTestNumberLiteral1("0xDadaCafe", T_int, code);
 		createTestNumberLiteral1("1996", T_int, code);
 		createTestNumberLiteral1("0x00FF00FF", T_int, code);
-		
+
 		createTestNumberLiteral1("0L", T_long, code);
 		createTestNumberLiteral1("00L", T_long, code);
 		createTestNumberLiteral1("0x0L", T_long, code);
@@ -208,7 +208,7 @@
 		createTestNumberLiteral1("0x100000000L", T_long, code);
 		createTestNumberLiteral1("2147483648L", T_long, code);
 		createTestNumberLiteral1("0xC0B0L", T_long, code);
-		
+
 		createTestNumberLiteral2("3.40282347e+38f", T_float, code);
 		createTestNumberLiteral2("1.40239846e-45f", T_float, code);
 		createTestNumberLiteral2("1e1f", T_float, code);
@@ -236,7 +236,7 @@
 	 */
 	private static void createTestNumberLiteral1(String literal, int type, StringBuffer code) {
 		String tName= fTypeName[type];
-		
+
 		code.append("\tpublic void test" + literal.replace('-', 'N').replace('.', '_').replace('+', 'P') + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeEval("\"" + literal + '"', true, code);
@@ -251,7 +251,7 @@
 	 */
 	private static void createTestNumberLiteral2(String literal, int type, StringBuffer code) {
 		String tName= fTypeName[type];
-		
+
 		code.append("\tpublic void test" + literal.replace('-', 'N').replace('.', '_').replace('+', 'P') + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeEval("\"" + literal + '"', true, code);
@@ -268,11 +268,11 @@
 	public static void createJavaFile(StringBuffer tests, String className, String testClass, int lineNumber, int numberFrames, int hitCount) throws Exception {
 		createJavaFile(tests, className, testClass, lineNumber, numberFrames, hitCount, true);
 	}
-		
+
 	public static void createJavaFile(StringBuffer tests, String className, String testClass, int lineNumber, int numberFrames, int hitCount, boolean importJDIObjectValue) throws Exception {
-		
+
 		StringBuffer code= new StringBuffer();
-		
+
 		code.append("/*******************************************************************************\n");
 		code.append(" * Copyright (c) 2002, 2003 IBM Corporation and others.\n");
 		code.append(" * All rights reserved. This program and the accompanying materials \n");
@@ -303,14 +303,14 @@
 		code.append("\tprotected void end() throws Exception {\n");
 		code.append("\t\tdestroyFrame();\n");
 		code.append("\t}\n\n");
-		
+
 		code.append(tests.toString());
-		
+
 		code.append("}\n");
-		
+
 		try (Writer file = new FileWriter(new File(className + ".java").getAbsoluteFile())) {
 			file.write(code.toString());
 		}
-		
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TestGenerator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TestGenerator.java
index 749bd32..46622de 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TestGenerator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TestGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,15 +17,15 @@
 import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
 
 public class TestGenerator {
-	
+
 	static protected int getPromotionType(int left, int right) {
 		return fTypeTable[left][right];
 	}
-	
+
 	static protected int getUnaryPromotionType(int type) {
 		return fTypeTable[type][T_int];
 	}
-	
+
 	static protected boolean needCast(int type1, int type2) {
 		if (type1 == type2) {
 			return false;
@@ -62,7 +62,7 @@
 	static final int T_int = 10;
 	static final int T_String = 11;
 	static final int T_null = 12;
-	
+
 	private static final int[][] fTypeTable= {
 /* undefined */	{T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined},
 /* object */	{T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_String, T_undefined},
@@ -78,11 +78,11 @@
 /* String */	{T_undefined, T_String, T_String, T_String, T_String, T_String, T_undefined, T_String, T_String, T_String, T_String, T_String, T_String},
 /* null */		{T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_undefined, T_String, T_undefined},
 	};
-	
+
 	static final String[] fTypeName = new String[] {"undefined", "java.lang.Object", "char", "byte", "short", "boolean", "void", "long", "double", "float", "int", "java.lang.String", "null"};
 
 	static final String[] typeUpperName = new String[] {"Undefined", "Object", "Char", "Byte", "Short", "Boolean", "Void", "Long", "Double", "Float", "Int", "String", "Null"};
-	
+
 	static final int Op_plus = 0;
 	static final int Op_minus = 1;
 	static final int Op_multiply = 2;
@@ -118,17 +118,17 @@
 	static final int Op_postfixPlusPlus = 32;
 	static final int Op_prefixMinusMinus = 33;
 	static final int Op_postfixMinusMinus = 34;
-	
+
 	static final String[] opSymbol = new String[] {"+", "-", "*", "/", "%", ">", ">=", "<", "<=", "==", "!=", "<<", ">>", ">>>", "|", "&", "^", "~", "!", "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "|=", "&=", "^=", "++", "++", "--", "--"};
-	
+
 	static final String[] opName = new String[] {"plus", "minus", "multiply", "divide", "remainder", "greater", "greaterEqual", "less", "lessEqual", "equalEqual", "notEqual", "leftShift", "rightShift", "unsignedRightShift", "or", "and", "xor", "twiddle", "not", "equal", "plusAssignment", "minusAssignment", "multiplyAssignment", "divideAssignment", "remainderAssignment", "leftShiftAssignment", "rightShiftAssignment", "unsignedRightShiftAssignment", "orAssignment", "andAssignment", "xorAssignment", "prefixPlusPlus", "postfixPlusPlus", "prefixMinusMinus", "postfixMinusMinus"};
-	
+
 	static final String[] opUpperName = new String[] {"Plus", "Minus", "Multiply", "Divide", "Remainder", "Greater", "GreaterEqual", "Less", "LessEqual", "EqualEqual", "NotEqual", "LeftShift", "RightShift", "UnsignedRightShift", "Or", "And", "Xor", "Twiddle", "Not", "Equal", "PlusAssignment", "MinusAssignment", "MultiplyAssignment", "DivideAssignment", "RemainderAssignment", "LeftShiftAssignment", "RightShiftAssignment", "UnsignedRightShiftAssignment", "OrAssignment", "AndAssignment", "XorAssignment", "PrefixPlusPlus", "PostfixPlusPlus", "PrefixMinusMinus", "PostfixMinusMinus"};
-	
+
 	static final String[] immediate = new String[] {"x", "y"};
-	
+
 	static final String[] fVariable = new String[] {"xVar", "yVar", "xArray", "yArray"};
-	
+
 	static final String[] field = new String[] {"xField", "yField", "xStaticField", "yStaticField"};
 
 	static final String[] prefixList = new String[] {"foo.", "EvalTypeTests.", IInternalDebugCoreConstants.EMPTY_STRING};
@@ -138,7 +138,7 @@
 	 * in the correct package location.
 	 */
 	static public void main(String[] args) throws Exception {
-		
+
 		genTestsNumericTypeAllOpsAllTypes(T_byte);
 		genTestsNumericTypeAllOpsAllTypes(T_char);
 		genTestsNumericTypeAllOpsAllTypes(T_short);
@@ -148,11 +148,11 @@
 		genTestsNumericTypeAllOpsAllTypes(T_double);
 		genTestsBooleanAllOpsBoolean();
 		genTestsStringPlusOpAllTypes();
-		
+
 		genTestsLocalVarValue();
-		
+
 		genTestsLocalVarAssignment();
-		
+
 		genTestsNumericTypeAllAssignmentOpsAllTypes(T_byte);
 		genTestsNumericTypeAllAssignmentOpsAllTypes(T_char);
 		genTestsNumericTypeAllAssignmentOpsAllTypes(T_short);
@@ -162,33 +162,33 @@
 		genTestsNumericTypeAllAssignmentOpsAllTypes(T_double);
 		genTestsBooleanAllAssignmentOpsBoolean();
 		genTestsStringPlusAssignmentOpAllTypes();
-		
+
 		genTestsNumericTypeCast();
-		
+
 		genTestsAllIntegerTypesAllXfixOps();
-		
+
 		genTestsQualifiedFieldValue();
 		genTestsQualifiedStaticFieldValue();
 		genTestsFieldValue();
 		genTestsStaticFieldValue();
-		
+
 		genTestsArrayValue();
 		genTestsArrayAssignment();
 		genTestsArrayAllocation();
 		genTestsArrayInitialization();
 
 		System.out.println("done");
-		
+
 	}
 
 	//-------------------------------
-	
+
 	public static void genTestsNumericTypeAllOpsAllTypes(int type) throws Exception {
-		
+
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = typeUpperName[type] + "OperatorsTests";
-		
+
 		genTestsNumericTypeArithmeticOpNumericTypes(type, Op_plus, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, Op_plus, T_String, code);
 		genTestsNumericTypeArithmeticOpNumericTypes(type, Op_minus, code);
@@ -209,36 +209,36 @@
 			genTestsIntegerTypeBooleanOpIntegerTypes(type, Op_and, code);
 			genTestsIntegerTypeBooleanOpIntegerTypes(type, Op_xor, code);
 		}
-		
+
 		genTestUnaryOpNumericType(type, Op_plus, code);
 		genTestUnaryOpNumericType(type, Op_minus, code);
 		if (type != T_float && type != T_double) {
 			genTestUnaryOpNumericType(type, Op_twiddle, code);
 		}
-		
+
 		createJavaFile(className, "EvalSimpleTests", 15, 1, true, code);
 
 	}
-	
+
 	public static void genTestsBooleanAllOpsBoolean() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "BooleanOperatorsTests";
-		
+
 		genTestBooleanBinaryOpBoolean(Op_or, code);
 		genTestBooleanBinaryOpBoolean(Op_and, code);
 		genTestBooleanBinaryOpBoolean(Op_xor, code);
 		genTestUnaryOpBoolean(Op_not, code);
-		
+
 		createJavaFile(className, "EvalSimpleTests", 15, 1, false, code);
 	}
-	
+
 	public static void genTestsStringPlusOpAllTypes() throws Exception {
-		
+
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "StringPlusOpTests";
-		
+
 		code.append("\t// " + fTypeName[T_String] + " " + opSymbol[Op_plus] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_String] + ", " + fTypeName[T_null] + "}\n" +
 					"\n");
 
@@ -251,18 +251,18 @@
 		genTestTypeBinaryOpTypeBinaryPromotion(T_String, Op_plus, T_boolean, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(T_String, Op_plus, T_String, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(T_String, Op_plus, T_null, code);
-		
+
 		createJavaFile(className, "EvalSimpleTests", 15, 1, true, false, code);
 	}
-	
+
 	public static void genTestsLocalVarValue() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "LocalVarValueTests";
-		
+
 		code.append("\t// \n" +
 					"\n");
-					
+
 		genTestLocalVarValue(T_byte, code);
 		genTestLocalVarValue(T_char, code);
 		genTestLocalVarValue(T_short, code);
@@ -276,15 +276,15 @@
 
 		createJavaFile(className, "EvalSimpleTests", 37, 1, true, code);
 	}
-	
+
 	public static void genTestsLocalVarAssignment() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "LocalVarAssignmentTests";
-		
+
 		code.append("\t// \n" +
 					"\n");
-					
+
 		genTestLocalVarAssignment(T_byte, code);
 		genTestLocalVarAssignment(T_char, code);
 		genTestLocalVarAssignment(T_short, code);
@@ -294,16 +294,16 @@
 		genTestLocalVarAssignment(T_double, code);
 		genTestLocalVarAssignment(T_String, code);
 		genTestLocalVarAssignment(T_boolean, code);
-					
+
 		createJavaFile(className, "EvalSimpleTests", 37, 1, true, code);
 	}
-	
+
 	public static void genTestsNumericTypeAllAssignmentOpsAllTypes(int type) throws Exception {
-		
+
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = typeUpperName[type] + "AssignmentOperatorsTests";
-		
+
 		genTestsNumericTypeArithmeticAssignmentOpNumericTypes(type, Op_plusAss, code);
 		genTestsNumericTypeArithmeticAssignmentOpNumericTypes(type, Op_minusAss, code);
 		genTestsNumericTypeArithmeticAssignmentOpNumericTypes(type, Op_multiplyAss, code);
@@ -317,38 +317,38 @@
 			genTestsIntegerTypeArithmeticAssignmentOpIntegerTypes(type, Op_andAss, code);
 			genTestsIntegerTypeArithmeticAssignmentOpIntegerTypes(type, Op_xorAss, code);
 		}
-		
-		
+
+
 		createJavaFile(className, "EvalSimpleTests", 37, 1, false, code);
 
 	}
 
 	public static void genTestsBooleanAllAssignmentOpsBoolean() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "BooleanAssignmentOperatorsTests";
-		
+
 		code.append("\t// " + fTypeName[T_boolean] + " " + opSymbol[Op_orAss] + " " + fTypeName[T_boolean] + "\n" +
 					"\n");
 		genTestTypeAssignmentOpType(T_boolean, Op_orAss, T_boolean, code);
-		
+
 		code.append("\t// " + fTypeName[T_boolean] + " " + opSymbol[Op_andAss] + " " + fTypeName[T_boolean] + "\n" +
 					"\n");
 		genTestTypeAssignmentOpType(T_boolean, Op_andAss, T_boolean, code);
-		
+
 		code.append("\t// " + fTypeName[T_boolean] + " " + opSymbol[Op_xorAss] + " " + fTypeName[T_boolean] + "\n" +
 					"\n");
 		genTestTypeAssignmentOpType(T_boolean, Op_xorAss, T_boolean, code);
-		
+
 		createJavaFile(className, "EvalSimpleTests", 37, 1, false, code);
 	}
-	
+
 	public static void genTestsStringPlusAssignmentOpAllTypes() throws Exception {
-		
+
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "StringPlusAssignmentOpTests";
-		
+
 		code.append("\t// " + fTypeName[T_String] + " " + opSymbol[Op_plusAss] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_String] + ", " + fTypeName[T_null] + "}\n" +
 					"\n");
 
@@ -361,15 +361,15 @@
 		genTestTypeAssignmentOpType(T_String, Op_plusAss, T_double, code);
 		genTestTypeAssignmentOpType(T_String, Op_plusAss, T_String, code);
 		genTestTypeAssignmentOpType(T_String, Op_plusAss, T_null, code);
-		
+
 		createJavaFile(className, "EvalSimpleTests", 37, 1, true, false, code);
 	}
-	
+
 	public static void genTestsNumericTypeCast() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "NumericTypesCastTests";
-		
+
 		genTestsNumericTypeCast(T_byte, code);
 		genTestsNumericTypeCast(T_char, code);
 		genTestsNumericTypeCast(T_short, code);
@@ -377,15 +377,15 @@
 		genTestsNumericTypeCast(T_long, code);
 		genTestsNumericTypeCast(T_float, code);
 		genTestsNumericTypeCast(T_double, code);
-					
+
 		createJavaFile(className, "EvalSimpleTests", 15, 1, false, code);
 	}
-	
+
 	public static void genTestsAllIntegerTypesAllXfixOps() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "XfixOperatorsTests";
-		
+
 		genTestsNumericTypeAllXfixOps(T_byte, code);
 		genTestsNumericTypeAllXfixOps(T_char, code);
 		genTestsNumericTypeAllXfixOps(T_short, code);
@@ -393,15 +393,15 @@
 		genTestsNumericTypeAllXfixOps(T_long, code);
 		genTestsNumericTypeAllXfixOps(T_float, code);
 		genTestsNumericTypeAllXfixOps(T_double, code);
-		
+
 		createJavaFile(className, "EvalSimpleTests", 37, 1, false, code);
 	}
-	
+
 	public static void genTestsQualifiedFieldValue() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "QualifiedFieldValueTests";
-		
+
 		genTestFieldValue(T_byte, 0, code);
 		genTestFieldValue(T_char, 0, code);
 		genTestFieldValue(T_short, 0, code);
@@ -414,12 +414,12 @@
 
 		createJavaFile(className, "EvalTypeTests", 73, 1, true, code);
 	}
-		
+
 	public static void genTestsQualifiedStaticFieldValue() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "QualifiedStaticFieldValueTests";
-		
+
 		genTestStaticFieldValue(T_byte, 0, code);
 		genTestStaticFieldValue(T_char, 0, code);
 		genTestStaticFieldValue(T_short, 0, code);
@@ -433,9 +433,9 @@
 		createJavaFile(className, "EvalTypeTests", 73, 1, true, code);
 
 		code = new StringBuffer();
-		
+
 		className = "QualifiedStaticFieldValueTests2";
-		
+
 		genTestStaticFieldValue(T_byte, 1, code);
 		genTestStaticFieldValue(T_char, 1, code);
 		genTestStaticFieldValue(T_short, 1, code);
@@ -448,12 +448,12 @@
 
 		createJavaFile(className, "EvalTypeTests", 73, 1, true, code);
 	}
-		
+
 	public static void genTestsFieldValue() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "FieldValueTests";
-		
+
 		genTestFieldValue(T_byte, 2, code);
 		genTestFieldValue(T_char, 2, code);
 		genTestFieldValue(T_short, 2, code);
@@ -466,12 +466,12 @@
 
 		createJavaFile(className, "EvalTypeTests", 63, 2, true, code);
 	}
-		
+
 	public static void genTestsStaticFieldValue() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "StaticFieldValueTests";
-		
+
 		genTestStaticFieldValue(T_byte, 2, code);
 		genTestStaticFieldValue(T_char, 2, code);
 		genTestStaticFieldValue(T_short, 2, code);
@@ -485,15 +485,15 @@
 		createJavaFile(className, "EvalTypeTests", 63, 2, true, code);
 
 		className = "StaticFieldValueTests2";
-		
+
 		createJavaFile(className, "EvalTypeTests", 67, 2, true, code);
 	}
-		
+
 	public static void genTestsArrayValue() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "ArrayValueTests";
-		
+
 		genTestArrayLength(T_byte, code);
 		genTestArrayLength(T_char, code);
 		genTestArrayLength(T_short, code);
@@ -516,12 +516,12 @@
 
 		createJavaFile(className, "EvalArrayTests", 37, 1, true, code);
 	}
-		
+
 	public static void genTestsArrayAssignment() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "ArrayAssignmentTests";
-		
+
 		genTestArrayAssignment(T_byte, code);
 		genTestArrayAssignment(T_char, code);
 		genTestArrayAssignment(T_short, code);
@@ -534,12 +534,12 @@
 
 		createJavaFile(className, "EvalArrayTests", 37, 1, true, code);
 	}
-		
+
 	public static void genTestsArrayAllocation() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "ArrayAllocationTests";
-		
+
 		genTestArrayAllocation(T_byte, code);
 		genTestArrayAllocation(T_char, code);
 		genTestArrayAllocation(T_short, code);
@@ -552,12 +552,12 @@
 
 		createJavaFile(className, "EvalArrayTests", 37, 1, false, code);
 	}
-		
+
 	public static void genTestsArrayInitialization() throws Exception {
 		StringBuffer code = new StringBuffer();
-		
+
 		String className = "ArrayInitializationTests";
-		
+
 		genTestArrayInitialization(T_byte, code);
 		genTestArrayInitialization(T_char, code);
 		genTestArrayInitialization(T_short, code);
@@ -571,12 +571,12 @@
 		createJavaFile(className, "EvalArrayTests", 37, 1, true, code);
 	}
 	//----------------------------
-	
+
 	public static void genTestsNumericTypeArithmeticOpNumericTypes(int type, int op, StringBuffer code) {
-		
+
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_float] + ", " + fTypeName[T_double] + "}\n" +
 					"\n");
-		
+
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_byte, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_char, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_short, code);
@@ -584,14 +584,14 @@
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_long, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_float, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_double, code);
-		
+
 	}
-	
+
 	public static void genTestsNumericTypeComparisonOpNumericTypes(int type, int op, StringBuffer code) {
-		
+
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_float] + ", " + fTypeName[T_double] + "}\n" +
 					"\n");
-		
+
 		genTestTypeBinaryOpTypeBooleanResult(type, op, T_byte, code);
 		genTestTypeBinaryOpTypeBooleanResult(type, op, T_char, code);
 		genTestTypeBinaryOpTypeBooleanResult(type, op, T_short, code);
@@ -599,35 +599,35 @@
 		genTestTypeBinaryOpTypeBooleanResult(type, op, T_long, code);
 		genTestTypeBinaryOpTypeBooleanResult(type, op, T_float, code);
 		genTestTypeBinaryOpTypeBooleanResult(type, op, T_double, code);
-		
+
 	}
-	
+
 	public static void genTestsIntegerTypeShiftOpIntegerTypes(int type, int op, StringBuffer code) {
-		
+
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + "}\n" +
 					"\n");
-		
+
 		genTestTypeBinaryOpTypeUnaryPromotion(type, op, T_byte, code);
 		genTestTypeBinaryOpTypeUnaryPromotion(type, op, T_char, code);
 		genTestTypeBinaryOpTypeUnaryPromotion(type, op, T_short, code);
 		genTestTypeBinaryOpTypeUnaryPromotion(type, op, T_int, code);
 		genTestTypeBinaryOpTypeUnaryPromotion(type, op, T_long, code);
-		
+
 	}
-	
+
 	public static void genTestsIntegerTypeBooleanOpIntegerTypes(int type, int op, StringBuffer code) {
-		
+
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + "}\n" +
 					"\n");
-		
+
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_byte, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_char, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_short, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_int, code);
 		genTestTypeBinaryOpTypeBinaryPromotion(type, op, T_long, code);
-		
+
 	}
-	
+
 	public static void genTestsNumericTypeArithmeticAssignmentOpNumericTypes(int type, int op, StringBuffer code) {
 
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_float] + ", " + fTypeName[T_double] + "}\n" +
@@ -642,7 +642,7 @@
 		genTestTypeAssignmentOpType(type, op, T_double, code);
 
 	}
-	
+
 	public static void genTestsIntegerTypeArithmeticAssignmentOpIntegerTypes(int type, int op, StringBuffer code) {
 
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_float] + ", " + fTypeName[T_double] + "}\n" +
@@ -655,12 +655,12 @@
 		genTestTypeAssignmentOpType(type, op, T_long, code);
 
 	}
-	
+
 	public static void genTestsNumericTypeCast(int type, StringBuffer code) {
-		
+
 		code.append("\t// (" + fTypeName[type] + ") {" + fTypeName[T_byte] + ", " + fTypeName[T_char] + ", " + fTypeName[T_short] + ", " + fTypeName[T_int] + ", " + fTypeName[T_long] + ", " + fTypeName[T_float] + ", " + fTypeName[T_double] + "}\n" +
 					"\n");
-		
+
 		genTestNumericTypeCast(type, T_byte, code);
 		genTestNumericTypeCast(type, T_char, code);
 		genTestNumericTypeCast(type, T_short, code);
@@ -668,31 +668,31 @@
 		genTestNumericTypeCast(type, T_long, code);
 		genTestNumericTypeCast(type, T_float, code);
 		genTestNumericTypeCast(type, T_double, code);
-		
+
 	}
 
 	public static void genTestsNumericTypeAllXfixOps(int type, StringBuffer code) {
-		
+
 		code.append("\t// {" + opSymbol[Op_prefixPlusPlus] + ", " + opSymbol[Op_prefixMinusMinus] + "} " + fTypeName[type] + "\n" +
 					"\t// " + fTypeName[type] + " {" + opSymbol[Op_postfixPlusPlus] + ", " + opSymbol[Op_postfixMinusMinus] + "}\n" +
 					"\n");
-					
+
 		genTestNumericTypePrefixOp(type, Op_prefixPlusPlus, code);
 		genTestNumericTypePrefixOp(type, Op_prefixMinusMinus, code);
 		genTestNumericTypePostfixOp(type, Op_postfixPlusPlus, code);
 		genTestNumericTypePostfixOp(type, Op_postfixMinusMinus, code);
 	}
-		
+
 	//----------------------------
 
 	public static void genTestTypeBinaryOpTypeBinaryPromotion(int type1, int op, int type2, StringBuffer code) {
-		
+
 		int promotedType = getPromotionType(type1, type2);
-		
+
 		String t1UName = typeUpperName[type1];
 		String t2UName = typeUpperName[type2];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\tpublic void test" + t1UName + oUName + t2UName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeBinaryOp(type1, op, type2, promotedType, 0, 1, true, code);
@@ -703,13 +703,13 @@
 	}
 
 	public static void genTestTypeBinaryOpTypeBooleanResult(int type1, int op, int type2, StringBuffer code) {
-		
+
 		int promotedType = T_boolean;
-		
+
 		String t1UName = typeUpperName[type1];
 		String t2UName = typeUpperName[type2];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\tpublic void test" + t1UName + oUName + t2UName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeBinaryOp(type1, op, type2, promotedType, 0, 1, true, code);
@@ -723,13 +723,13 @@
 	}
 
 	public static void genTestTypeBinaryOpTypeUnaryPromotion(int type1, int op, int type2, StringBuffer code) {
-		
+
 		int promotedType = getUnaryPromotionType(type1);
-		
+
 		String t1UName = typeUpperName[type1];
 		String t2UName = typeUpperName[type2];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\tpublic void test" + t1UName + oUName + t2UName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeBinaryOp(type1, op, type2, promotedType, 0, 1, true, code);
@@ -738,17 +738,17 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestBooleanBinaryOpBoolean(int op, StringBuffer code) {
-		
+
 		int type = T_boolean;
-		
+
 		String uName = typeUpperName[type];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\t// " + fTypeName[type] + " " + opSymbol[op] + " " + fTypeName[type] + "\n" +
 					"\n");
-		
+
 		code.append("\tpublic void test" + uName + oUName + uName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeBinaryOp(type, op, type, type, 0, 0, true, code);
@@ -764,17 +764,17 @@
 	}
 
 	public static void genTestUnaryOpNumericType(int type, int op, StringBuffer code) {
-		
+
 		int promotedType = getUnaryPromotionType(type);
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String oSymbol = opSymbol[op];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\t// " + oSymbol + " " + tName + "\n" +
 					"\n");
-		
+
 		code.append("\tpublic void test" + oUName + tUName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeUnaryOp(type, op, promotedType, 0, true, code);
@@ -785,15 +785,15 @@
 	}
 
 	public static void genTestUnaryOpBoolean(int op, StringBuffer code) {
-		
+
 		int type = T_boolean;
-		
+
 		String uName = typeUpperName[type];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\t// " + opSymbol[op] + " " + fTypeName[type] + "\n" +
 					"\n");
-		
+
 		code.append("\tpublic void test" + oUName + uName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeUnaryOp(type, op, type, 0, true, code);
@@ -806,7 +806,7 @@
 
 	public static void genTestLocalVarValue(int type, StringBuffer code ) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeLocalVarValue(type, 0, true, code);
@@ -815,10 +815,10 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestLocalVarAssignment(int type, StringBuffer code) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeLocalVarAssignment(type, 0, 0, true, code);
@@ -831,13 +831,13 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestTypeAssignmentOpType(int type1, int op, int type2, StringBuffer code) {
-		
+
 		String t1UName = typeUpperName[type1];
 		String t2UName = typeUpperName[type2];
 		String oUName = opUpperName[op];
-		
+
 		code.append("\tpublic void test" + t1UName + oUName + t2UName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeSetTmp("tmp" + fVariable[0], type1, Op_equal, fVariable[0] + t1UName + "Value", true, code);
@@ -856,12 +856,12 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestNumericTypeCast(int type1, int type2, StringBuffer code) {
-		
+
 		String t1UName = typeUpperName[type1];
 		String t2UName = typeUpperName[type2];
-		
+
 		code.append("\tpublic void test" + t1UName + "Cast" + t2UName + "() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeCast(type1, type2, 0, true, code);
@@ -869,9 +869,9 @@
 		genCodeCast(type1, type2, 1, false, code);
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
-		
+
 	}
-		
+
 	public static void genTestNumericTypePrefixOp(int type, int op, StringBuffer code) {
 
 		String tUName = typeUpperName[type];
@@ -902,7 +902,7 @@
 
 	public static void genTestFieldValue(int type, int prefix, StringBuffer code ) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "FieldValue() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeFieldValue(type, 0, prefix, true, code);
@@ -911,10 +911,10 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestStaticFieldValue(int type, int prefix, StringBuffer code ) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "StaticFieldValue() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeFieldValue(type, 2, prefix, true, code);
@@ -923,10 +923,10 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestArrayValue(int type, StringBuffer code ) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "ArrayValue() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeArrayValue(type, 2, 0, true, code);
@@ -943,10 +943,10 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestArrayLength(int type, StringBuffer code ) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "ArrayLength() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeArrayLength(type, 2, true, code);
@@ -955,10 +955,10 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestArrayAssignment(int type, StringBuffer code ) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "ArrayAssignment() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeArrayAssignment(type, 2, 0, 0, true, code);
@@ -975,10 +975,10 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	public static void genTestArrayAllocation(int type, StringBuffer code) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "ArrayAllocation() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeArrayAllocation(type, 2, 0, true, code);
@@ -990,7 +990,7 @@
 
 	public static void genTestArrayInitialization(int type, StringBuffer code) {
 		String tUName = typeUpperName[type];
-		
+
 		code.append("\tpublic void test" + tUName + "ArrayAllocation() throws Throwable {\n");
 		tryBlockBegin(code);
 		genCodeArrayInitialization(type, 2, true, code);
@@ -1003,7 +1003,7 @@
 	//-------------------------------
 
 	public static void genCodeBinaryOp(int type1, int op, int type2, int resultType, int var1, int var2, boolean first, StringBuffer code) {
-		
+
 		String t1Name = fTypeName[type1];
 		String t1UName = typeUpperName[type1];
 		String t2Name = fTypeName[type2];
@@ -1014,7 +1014,7 @@
 		String oSymbol = opSymbol[op];
 		String v1Name = immediate[var1];
 		String v2Name = immediate[var2];
-		
+
 		genCodeEval(v1Name + t1UName + " + " + oName + "Op + " + v2Name + t2UName, first, code);
 		genCodeReturnTypeCheck(t1Name + " " + oName + " " + t2Name, resName, first, code);
 		switch (resultType) {
@@ -1032,7 +1032,7 @@
 	}
 
 	public static void genCodeUnaryOp(int type, int op, int resultType, int var, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String resName = fTypeName[resultType];
@@ -1049,7 +1049,7 @@
 			genCodeReturnValueCheckPrimitiveType(oName + " " + tName, resName, resUName, oSymbol + " " + vName + tUName + "Value", first, code);
 		}
 	}
-	
+
 	public static void genCodeLocalVarValue(int type, int var, boolean first, StringBuffer code) {
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
@@ -1058,7 +1058,7 @@
 	}
 
 	public static void genCodeLocalVarValue(int type, int var, String referenceExpression, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
@@ -1078,9 +1078,9 @@
 				break;
 		}
 	}
-	
+
 	public static void genCodeLocalVarAssignment(int type, int var, int imm, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
@@ -1103,7 +1103,7 @@
 		}
 		genCodeLocalVarValue(type, var, iName + tUName + "Value", false, code);
 	}
-	
+
 	public static void genCodeAssignmentOp(int type1, int op, int type2, int var, int imm, boolean first, StringBuffer code) {
 		String t1Name = fTypeName[type1];
 		String t1UName = typeUpperName[type1];
@@ -1112,7 +1112,7 @@
 		String oName = opName[op];
 		String vName = fVariable[var];
 		String iName = immediate[imm];
-		
+
 		genCodeEval(vName + t1UName + " + " + oName + "Op + " + iName + t2UName, first, code);
 		genCodeReturnTypeCheck(t1Name + " " + oName + " " + t2Name, t1Name, first, code);
 		switch (type1) {
@@ -1129,7 +1129,7 @@
 		}
 		genCodeLocalVarValue(type1, var, "tmp" + vName, false, code);
 	}
-	
+
 	public static void genCodeCast(int type1, int type2, int imm, boolean first, StringBuffer code) {
 		String t1Name = fTypeName[type1];
 		String t1UName = typeUpperName[type1];
@@ -1145,14 +1145,14 @@
 			genCodeReturnValueCheckPrimitiveType("(" + t1Name + ") " + t2Name, t1Name, t1UName, (needCast(type1, type2) ? "( " + t1Name + ") " : IInternalDebugCoreConstants.EMPTY_STRING) + iName + t2UName + "Value", first, code);
 		}
 	}
-	
+
 	public static void genCodePrefixOp(int type, int op, int var, boolean first, StringBuffer code) {
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
 		String oName = opName[op];
 		String oSymbol = opSymbol[op];
-		
+
 		genCodeSetTmp("tmp" + vName, type, Op_equal, vName + tUName + "Value", true, code);
 		genCodeEval(oName + "Op + " + vName + tUName, first, code);
 		genCodeReturnTypeCheck(oName + " " + tName, tName, first, code);
@@ -1163,14 +1163,14 @@
 		}
 		genCodeLocalVarValue(type, var, "tmp" + vName, false, code);
 	}
-	
+
 	public static void genCodePostfixOp(int type, int op, int var, boolean first, StringBuffer code) {
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
 		String oName = opName[op];
 		String oSymbol = opSymbol[op];
-		
+
 		genCodeSetTmp("tmp" + vName, type, Op_equal, vName + tUName + "Value", true, code);
 		genCodeEval(vName + tUName + " + " + oName + "Op", first, code);
 		genCodeReturnTypeCheck(tName + " " + oName, tName, first, code);
@@ -1181,7 +1181,7 @@
 		}
 		genCodeLocalVarValue(type, var, "tmp" + vName, false, code);
 	}
-	
+
 	public static void genCodeFieldValue(int type, int var, int prefix, boolean first, StringBuffer code) {
 		String tUName = typeUpperName[type];
 		String fName = field[var];
@@ -1190,7 +1190,7 @@
 	}
 
 	public static void genCodeFieldValue(int type, int var, int prefix, String referenceExpression, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String fName = field[var];
@@ -1211,18 +1211,18 @@
 				break;
 		}
 	}
-	
+
 	public static void genCodeArrayLength(int type, int var, boolean first, StringBuffer code) {
-		
+
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
-		
+
 		genCodeArrayLength(type, var, vName + tUName + "Value.length", first, code);
-		
+
 	}
 
 	public static void genCodeArrayLength(int type, int var, String referenceExpression, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
@@ -1231,9 +1231,9 @@
 		genCodeReturnTypeCheck(tName + " array length", fTypeName[T_int], first,code);
 		genCodeReturnValueCheckPrimitiveType(tName + " array length", fTypeName[T_int], typeUpperName[T_int], referenceExpression, first, code);
 	}
-	
+
 	public static void genCodeArrayValue(int type, int var, int index, boolean first, StringBuffer code) {
-		
+
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
 
@@ -1241,7 +1241,7 @@
 	}
 
 	public static void genCodeArrayValue(int type, int var, int index, String referenceExpression, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
@@ -1261,9 +1261,9 @@
 				break;
 		}
 	}
-	
+
 	public static void genCodeArrayAssignment(int type, int var, int index, int imm, boolean first, StringBuffer code) {
-		
+
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
 		String vName = fVariable[var];
@@ -1286,7 +1286,7 @@
 		}
 		genCodeArrayValue(type, var, index, iName + tUName + "Value", false, code);
 	}
-	
+
 	public static void genCodeArrayAllocation(int type, int var, int dim, boolean first, StringBuffer code) {
 		String tName = fTypeName[type];
 		String tUName = typeUpperName[type];
@@ -1309,7 +1309,7 @@
 		String vName = fVariable[var];
 		String oName = opName[Op_equal];
 		String i1Name = immediate[(var + 1) % 2];
-		
+
 		String value = IInternalDebugCoreConstants.EMPTY_STRING;
 		boolean f = true;
 		for (int i = 0; i < var; i ++) {
@@ -1334,18 +1334,18 @@
 			genCodeArrayValue(type, var, i, immediate[i % 2] + tUName + "Value", false, code);
 		}
 	}
-	
+
 	//----------------------------
-	
+
 	public static void genCodeEval(String expression, boolean first, StringBuffer code) {
 		code.append("\t\t" + ((first)? "IValue " : IInternalDebugCoreConstants.EMPTY_STRING) + "value = eval(" + expression + ");\n");
 	}
-	
+
 	public static void genCodeReturnTypeCheck(String test, String typeName, boolean first, StringBuffer code) {
 		code.append("\t\t" + ((first)? "String " : IInternalDebugCoreConstants.EMPTY_STRING) + "typeName = value.getReferenceTypeName();\n" +
 					"\t\tassertEquals(\"" + test + " : wrong type : \", \"" + typeName + "\", typeName);\n");
 	}
-	
+
 	public static void genCodeReturnValueCheckPrimitiveType(String test, String resType, String uResType, String referenceExpression, boolean first, StringBuffer code) {
 		code.append("\t\t" + ((first)? resType + " " : IInternalDebugCoreConstants.EMPTY_STRING) + resType + "Value = ((IJavaPrimitiveValue)value).get" + uResType + "Value();\n" +
 					"\t\tassertEquals(\"" + test + " : wrong result : \", " + referenceExpression + ", " + resType+ "Value);\n");
@@ -1369,8 +1369,8 @@
 	public static void genCodeSetTmp(String varName, int type, int op, String value, boolean init , StringBuffer code) {
 		code.append("\t\t" + ((init)? fTypeName[type] + " " : IInternalDebugCoreConstants.EMPTY_STRING) + varName + " " + opSymbol[op] + " " + value + ";\n");
 	}
-	
-	
+
+
 	public static void tryBlockBegin(StringBuffer code) {
 		code.append("\t\ttry {\n\t\tinit();\n");
 	}
@@ -1384,11 +1384,11 @@
 	public static void createJavaFile(String className, String testClass, int breakPointLine, int frameNumber, boolean importJDIObjectValue, StringBuffer tests) throws Exception {
 		createJavaFile(className, testClass, breakPointLine, frameNumber, importJDIObjectValue, true, tests);
 	}
-	
+
 	public static void createJavaFile(String className, String testClass, int breakPointLine, int frameNumber, boolean importJDIObjectValue, boolean importIJavaPrimitiveValue, StringBuffer tests) throws Exception {
-		
+
 		StringBuffer code = new StringBuffer();
-		
+
 		code.append("/*******************************************************************************\n");
 		code.append(" * Copyright (c) 2002, 2003 IBM Corporation and others.\n");
 		code.append(" * All rights reserved. This program and the accompanying materials \n");
@@ -1401,7 +1401,7 @@
 		code.append(" *******************************************************************************/\n");
 		code.append("package org.eclipse.jdt.debug.tests.eval;\n\n" +
 					"import org.eclipse.debug.core.model.IValue;\n");
-					
+
 		if (importIJavaPrimitiveValue) {
 			code.append("import org.eclipse.jdt.debug.core.IJavaPrimitiveValue;\n");
 		}
@@ -1422,14 +1422,14 @@
 					"\tprotected void end() throws Exception {\n" +
 					"\t\tdestroyFrame();\n" +
 					"\t}\n\n");
-					
+
 		code.append(tests);
-					
+
 		code.append("\n}\n");
-					
+
 		try (Writer file = new FileWriter(new File(className + ".java").getAbsoluteFile())) {
 			file.write(code.toString());
 		}
-		
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TypeHierarchyTestsGenerator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TypeHierarchyTestsGenerator.java
index 8b00b30..aa38e5a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TypeHierarchyTestsGenerator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/generator/TypeHierarchyTestsGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,10 +33,10 @@
 	static int N_A= 12;
 	static int N_B= 13;
 	static int N_C= 14;
-	
+
 	static int SUPER_A= 15;
 	static int SUPER_B= 16;
-	
+
 	static int M1= 0;
 	static int M2= 1;
 	static int S2= 2;
@@ -46,13 +46,13 @@
 	static int M5= 6;
 	static int M6= 7;
 	static int S6= 8;
-	
+
 	static String[] qualifiers= new String[] {
 		"iaa", "iab", "iac",     "aa",      "ab",      "ac", "ibb", "ibc", "bb", "bc",
 		"icc", "cc",  "new A()", "new B()", "new C()" ,"super" , "super"};
-		
+
 	static String[] methods= new String[] {"m1", "m2", "s2", "m3", "m4", "s4", "m5", "m6", "s6"};
-	
+
 	static int[] staticLevel= new int[] {
 		0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
 		2, 2, 0, 1, 2, 0, 1};
@@ -60,7 +60,7 @@
 	static int[] instanceLevel= new int[] {
 		0, 1, 2, 0, 1, 2, 1, 2, 1, 2,
 		2, 2, 0, 1, 2, 0, 1};
-		
+
 	static int[][] values= new int[][] {
 		{ 1, 2, 9},
 		{ 11, 22, 99, 33, 44, 88},
@@ -79,13 +79,13 @@
 		gen_cc_testA();
 		gen_cc_testB();
 		gen_cc_testC();
-		
+
 		System.out.println("done");
 	}
-	
+
 	public static void  gen_main() throws Exception {
 		StringBuffer code= new StringBuffer();
-		
+
 		createTestQualifier(IAA, M1, code);
 		createTestQualifier(IAB, M1, code);
 		createTestQualifier(IAC, M1, code);
@@ -126,7 +126,7 @@
 		createTestQualifier(CC, M5, code);
 		createTestQualifier(CC, M6, code);
 		createTestQualifier(CC, S6, code);
-		
+
 		createTestQualifier(N_A, M1, code);
 		createTestQualifier(N_A, M2, code);
 		createTestQualifier(N_A, S2, code);
@@ -148,12 +148,12 @@
 
 		createJavaFile(code, 146, 1, 1);
 	}
-	
+
 	public static void gen_aa_testA() throws Exception {
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestA(code, AA);
-		
+
 		createJavaFile(code, 32, 2, 1);
 	}
 
@@ -161,7 +161,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestA(code, AB);
-		
+
 		createJavaFile(code, 32, 2, 2);
 	}
 
@@ -169,7 +169,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestA(code, AC);
-		
+
 		createJavaFile(code, 32, 2, 3);
 	}
 
@@ -177,7 +177,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestA(code, BB);
-		
+
 		createJavaFile(code, 32, 2, 4);
 	}
 
@@ -185,7 +185,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestA(code, BC);
-		
+
 		createJavaFile(code, 32, 2, 5);
 	}
 
@@ -193,7 +193,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestA(code, CC);
-		
+
 		createJavaFile(code, 32, 2, 6);
 	}
 
@@ -201,7 +201,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestB(code, BB);
-		
+
 		createJavaFile(code, 68, 2, 1);
 	}
 
@@ -209,7 +209,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestB(code, BC);
-		
+
 		createJavaFile(code, 68, 2, 2);
 	}
 
@@ -217,7 +217,7 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestB(code, CC);
-		
+
 		createJavaFile(code, 68, 2, 3);
 	}
 
@@ -225,11 +225,11 @@
 		StringBuffer code= new StringBuffer();
 
 		createTest_TestC(code, CC);
-		
+
 		createJavaFile(code, 119, 2, 1);
 	}
 
-	//-------------	
+	//-------------
 
 	public static void createTest_TestA(StringBuffer code, int qualifier) {
 		createTest(instanceLevel[qualifier], M1, code);
@@ -270,7 +270,7 @@
 		String strMethod= methods[method];
 		code.append("\tpublic void testEvalNestedTypeTest_" + strMethod + "() throws Throwable {\n");
 		tryBlockBegin(code);
-		
+
 		genCodeEval("\"" + strMethod + "()\"", true, code);
 		genCodeReturnTypeCheck(strMethod, "int", true, code);
 		genCodeReturnValueCheckPrimitiveType(strMethod, "int", "Int", IInternalDebugCoreConstants.EMPTY_STRING + values[level][method], true, code);
@@ -278,8 +278,8 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
-	
+
+
 	public static void createTestQualifier(int qualifier, int method, StringBuffer code) {
 		String strQualifier= qualifiers[qualifier];
 		String nameQualifier= strQualifier.replace('(', '_').replace(')', '_').replace(' ', '_');
@@ -287,7 +287,7 @@
 		int[] level= ((method + 1) % 3 == 0) ? staticLevel : instanceLevel;
 		code.append("\tpublic void testEvalNestedTypeTest_" + nameQualifier + "_" + strMethod + "() throws Throwable {\n");
 		tryBlockBegin(code);
-		
+
 		genCodeEval("\"" + strQualifier + "." + strMethod + "()\"", true, code);
 		genCodeReturnTypeCheck(strQualifier + "." + strMethod, "int", true, code);
 		genCodeReturnValueCheckPrimitiveType(strQualifier + "." + strMethod, "int", "Int", IInternalDebugCoreConstants.EMPTY_STRING + values[level[qualifier]][method], true, code);
@@ -295,14 +295,14 @@
 		tryBlockEnd(code);
 		code.append("\t}\n\n");
 	}
-	
+
 	//------------
-	
-	
+
+
 	public static void createJavaFile(StringBuffer tests, int lineNumber, int numberFrames, int hitCount) throws Exception {
-		
+
 		StringBuffer code= new StringBuffer();
-		
+
 		code.append("/*******************************************************************************\n");
 		code.append(" * Copyright (c) 2002, 2003 IBM Corporation and others.\n");
 		code.append(" * All rights reserved. This program and the accompanying materials \n");
@@ -330,14 +330,14 @@
 		code.append("\tprotected void end() throws Exception {\n");
 		code.append("\t\tdestroyFrame();\n");
 		code.append("\t}\n\n");
-		
+
 		code.append(tests.toString());
-		
+
 		code.append("}\n");
-		
+
 		try (Writer file = new FileWriter(new File("TypeHierarchy_" + lineNumber + "_" + hitCount + ".java").getAbsoluteFile())) {
 			file.write(code.toString());
 		}
-		
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationEncodingTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationEncodingTests.java
index 5b18b41..7efa453 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationEncodingTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationEncodingTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 import org.eclipse.jdt.debug.tests.AbstractDebugTest;
 
 /**
- * Tests for the new capability of getting the file encoding for a launch configuration given a variety of 
+ * Tests for the new capability of getting the file encoding for a launch configuration given a variety of
  * scenarios
  * @since 3.4
  */
@@ -42,7 +42,7 @@
 	protected Preferences getResourcesPreferences() {
 		return ResourcesPlugin.getPlugin().getPluginPreferences();
 	}
-	
+
 	/**
 	 * Returns the default workbench encoding
 	 * @return the default workbench encoding
@@ -50,7 +50,7 @@
 	protected String getDefaultEncoding() {
 		return getResourcesPreferences().getDefaultString(ResourcesPlugin.PREF_ENCODING);
 	}
-	
+
 	/**
 	 * Tests that if no encoding is set on the configuration and there is no encoding changes to the workspace pref
 	 * than the encoding retrieved for the configuration matches the system encoding
@@ -74,7 +74,7 @@
 			System.setProperty("file.encoding", oldsystemencoding);
 		}
 	}
-	
+
 	/**
 	 * Tests that if a specific encoding is set for the workspace and there is no encoding set on the configuration
 	 * than the returned encoding matches the workspace pref
@@ -95,7 +95,7 @@
 			getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, (oldencoding == null ? getDefaultEncoding() : oldencoding));
 		}
 	}
-	
+
 	/**
 	 * Tests that if a specific encoding is set on the configuration itself that that is the encoding returned
 	 */
@@ -125,7 +125,7 @@
 			copy.doSave();
 		}
 	}
-	
+
 	/**
 	 * Tests that if there is no specified encoding for the config itself, and there is a mapped resource,
 	 * the encoding will come from the mapped resource (if a specific one is set)
@@ -156,9 +156,9 @@
 			copy.doSave();
 		}
 	}
-	
+
 	/**
-	 * Tests that if there is no specific encoding set on the config and there is more than one mapped resource, 
+	 * Tests that if there is no specific encoding set on the config and there is more than one mapped resource,
 	 * the first mapped resource is used to derive the encoding
 	 */
 	public void testGetSpecificResourcesEncoding() throws CoreException {
@@ -196,5 +196,5 @@
 			copy.doSave();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationResourceMappingTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationResourceMappingTests.java
index 4d2265a..a819723 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationResourceMappingTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ConfigurationResourceMappingTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,7 +29,7 @@
 	public ConfigurationResourceMappingTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests that setting the mapped resources to <code>null</code> removes
 	 * the resource mapping
@@ -58,9 +58,9 @@
 			copy.doSave();
 		}
 	}
-	
+
 	/**
-	 * Tests that setting the resource mapping to an empty array of <code>IResource</code> removes 
+	 * Tests that setting the resource mapping to an empty array of <code>IResource</code> removes
 	 * the resource mapping
 	 */
 	public void testRemovingMappedResources2() throws CoreException {
@@ -87,7 +87,7 @@
 			copy.doSave();
 		}
 	}
-	
+
 	/**
 	 * Tests that a single element array can be set as a mapped resource
 	 */
@@ -139,5 +139,5 @@
 			copy.doSave();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ContributedTabTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ContributedTabTests.java
index ddc551f..b85f4e5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ContributedTabTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ContributedTabTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 /**
  * This test class provides test methods for contributing tabs to a given (existing)
  * tab group and their relative placement (if applicable)
- * 
+ *
  * @since 3.3
  */
 public class ContributedTabTests extends AbstractDebugTest {
@@ -39,9 +39,9 @@
 	public ContributedTabTests(String name) {
 		super(name);
 	}
-	
+
 	/**
-	 * Checks to make sure that all of the contributed tabs to the java tab group are present 
+	 * Checks to make sure that all of the contributed tabs to the java tab group are present
 	 * @throws CoreException
 	 */
 	public void testContributedTab() throws CoreException {
@@ -59,7 +59,7 @@
 		contribs.add(JavaAlernateModeTab.class);
 		assertTrue("java tab group should contain all contributed tabs", tabset.containsAll(contribs)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Checks to make sure that a contributed tab with a relative placement to an existing tab is in the correct place
 	 * @throws CoreException
@@ -81,7 +81,7 @@
 		assertTrue("The TestTab1 must appear in the tab listing", found);
 		assertTrue("The TestTab1 must appear after the MainTab", idx > 0); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Checks to see that if a contributor supplies a bad tab id as a placement id that the tab will be added
 	 * to the end of the group
@@ -94,9 +94,9 @@
 		ILaunchConfigurationTab[] tabs = javagroup.getTabs();
 		assertTrue("Alternate tab should be the last tab in the group", tabs[tabs.length-1].getClass().equals(JavaAlernateModeTab.class)); //$NON-NLS-1$
 	}
-	
+
 	/**
-	 * Checks to see that the two tabs following the arguments tab are TestTab2, and TestTab3. They can be in either order depending 
+	 * Checks to see that the two tabs following the arguments tab are TestTab2, and TestTab3. They can be in either order depending
 	 * on when they were loaded, so this test only checks that they are the next two following tabs not their order
 	 * @throws CoreException
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationManagerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationManagerTests.java
index bfb1e5f..df7eac9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationManagerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationManagerTests.java
@@ -27,19 +27,19 @@
 
 /**
  * This class tests all the public methods of the launch configuration manager
- * @since 3.4 
+ * @since 3.4
  */
 public class LaunchConfigurationManagerTests extends AbstractDebugTest {
 
 	private LaunchConfigurationManager fLCM = DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	
+
 	public LaunchConfigurationManagerTests(String name) {
 		super(name);
 	}
 
 	/**
 	 * Asserts that the given array of shortcut identifiers appear in the given list of {@link LaunchShortcutExtension}s
-	 * 
+	 *
 	 * @param ids the shortcut identifiers
 	 * @param shortcuts the complete list of shortcuts of type {@link LaunchShortcutExtension}
 	 */
@@ -56,7 +56,7 @@
 			assertTrue("the launch shortcut "+ids[i]+" was not found", found);
 		}
 	}
-	
+
 	/**
 	 * Asserts that the given list of {@link ILaunchConfigurationType} identifiers all appear in the given list of {@link ILaunchConfigurationType} identifiers
 	 * @param ids the list of {@link ILaunchConfigurationType} identifiers
@@ -74,7 +74,7 @@
 			assertTrue("the launch configuration type "+ids[i]+" was not found", found);
 		}
 	}
-	
+
 	/**
 	 * tests that the singleton object returned is always the same
 	 */
@@ -82,7 +82,7 @@
 		assertNotNull("The launch configuration manager cannot be null", fLCM);
 		assertEquals("The retruned instance of the manager should always be the same", fLCM, DebugUIPlugin.getDefault().getLaunchConfigurationManager());
 	}
-	
+
 	/**
 	 * tests that shortcut extensions are loaded properly by the manager
 	 */
@@ -91,7 +91,7 @@
 		List<LaunchShortcutExtension> list = fLCM.getLaunchShortcuts();
 		assertTrue("The listing of shortcuts cannot be empty", list.size() > 2);
 	}
-	
+
 	/**
 	 * tests that the java shortcut is found for a resource with a main method
 	 */
@@ -102,7 +102,7 @@
 		List<LaunchShortcutExtension> list = fLCM.getLaunchShortcuts(resource);
 		assertShortcuts(new String[] {"org.eclipse.jdt.debug.ui.localJavaShortcut"}, list);
 	}
-	
+
 	/**
 	 * tests that the applet shortcut is found for a resource that extends applet
 	 */
@@ -113,7 +113,7 @@
 		List<LaunchShortcutExtension> list = fLCM.getLaunchShortcuts(resource);
 		assertShortcuts(new String[] {"org.eclipse.jdt.debug.ui.javaAppletShortcut"}, list);
 	}
-	
+
 	/**
 	 * test that the correct shortcuts are returned for a resource which is an applet and has a main method
 	 */
@@ -124,7 +124,7 @@
 		List<LaunchShortcutExtension> list = fLCM.getLaunchShortcuts(resource);
 		assertShortcuts(new String[] {"org.eclipse.jdt.debug.ui.localJavaShortcut", "org.eclipse.jdt.debug.ui.javaAppletShortcut"}, list);
 	}
-	
+
 	/**
 	 * tests that shortcuts for given categories are returned, in this case the 'testing' category
 	 */
@@ -133,7 +133,7 @@
 		List<LaunchShortcutExtension> list = fLCM.getLaunchShortcuts("testing");
 		assertTrue("there should be the testing shortcut", list.size() == 1);
 	}
-	
+
 	/**
 	 * tests that a specific launch group can be found given its id
 	 */
@@ -142,7 +142,7 @@
 		LaunchGroupExtension ext = fLCM.getLaunchGroup("org.eclipse.debug.ui.launchGroup.run");
 		assertNotNull("the run launch group should exist", ext);
 	}
-	
+
 	/**
 	 * tests that a launch group exists for a given configuration and mode,
 	 * in this case we are testing that a group exists for a java application config
@@ -155,7 +155,7 @@
 		ILaunchGroup group = DebugUITools.getLaunchGroup(configuration, "debug");
 		assertNotNull("the launch group for a java app config in debug mode should exist", group);
 	}
-	
+
 	/**
 	 * tests that all of the launch groups can be acquired, there should be at least 3 of
 	 * them (run, debug, profile)
@@ -166,7 +166,7 @@
 		assertNotNull("the listing of launch groups cannot be null", groups);
 		assertTrue("there shoulod be at least 3 launch groups", groups.length > 2);
 	}
-	
+
 	/**
 	 * tests that the default launch group for run mode is the launch group
 	 * contributed by debug
@@ -177,7 +177,7 @@
 		assertNotNull("the default launch group cannot be null", group);
 		assertTrue("the default launch group for run mode should be the debug contribution", group.getIdentifier().equals("org.eclipse.debug.ui.launchGroup.run"));
 	}
-	
+
 	/**
 	 * tests that the default launch group for debug mode is the launch group
 	 * contributed by debug
@@ -188,7 +188,7 @@
 		assertNotNull("the default launch group cannot be null", group);
 		assertTrue("the default launch group for debug mode should be the debug contribution", group.getIdentifier().equals("org.eclipse.debug.ui.launchGroup.debug"));
 	}
-	
+
 	/**
 	 * tests that the correct corresponding launch config types are found for a given resource,
 	 * in this test the applet and local java types should be found
@@ -200,7 +200,7 @@
 		String[] types = fLCM.getApplicableConfigurationTypes(resource);
 		assertTypes(new String[] {"org.eclipse.jdt.launching.localJavaApplication", "org.eclipse.jdt.launching.javaApplet"}, types);
 	}
-	
+
 	/**
 	 * tests that configuration applicable to specific resources can be found
 	 */
@@ -212,7 +212,7 @@
 		assertNotNull("the listing cannot be null", list);
 		assertTrue("there should be at least one configuration for this resource", list.length > 0);
 	}
-	
+
 	/**
 	 * Tests that a launch group does not exist for a given configuration and mode that it does not support.
 	 * In this case we are testing that a group does not exist for a java application config
@@ -224,5 +224,5 @@
 		assertNotNull("the ThrowsNPE configuration should exist", configuration);
 		ILaunchGroup group = DebugUITools.getLaunchGroup(configuration, ILaunchManager.PROFILE_MODE);
 		assertNull("the launch group for a java app config in profile mode should *not* exist", group);
-	}	
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationTests.java
index 13f3ed4..1f66299 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchConfigurationTests.java
@@ -33,22 +33,22 @@
 		protected TestConfiguration(String name, IContainer container) {
 			super(name, container);
 		}
-		
+
 		public String getSimpleNameProxy(String fileName) {
 			return getSimpleName(fileName);
 		}
-		
+
 		public void setNameProxy(String name) {
 			setName(name);
 		}
-		
+
 		public String getFileNameProxy() {
 			return getFileName();
 		}
 	}
-	
+
 	TestConfiguration config = new TestConfiguration("Test", null);
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -59,7 +59,7 @@
 
 	/**
 	 * Tests the {@link LaunchConfiguration#getSimpleName} method
-	 * 
+	 *
 	 * @throws Exception
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=332410
 	 */
@@ -79,10 +79,10 @@
 		name = config.getSimpleNameProxy("launch.foo.bar");
 		assertEquals("Did not get expected name: 'launch.foo.bar'", "launch.foo.bar", name);
 	}
-	
+
 	/**
 	 * Tests the {@link LaunchConfiguration#setName} method
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSetName() throws Exception {
@@ -92,10 +92,10 @@
 		//reset the name
 		config.setNameProxy("Test");
 	}
-	
+
 	/**
 	 * Tests the {@link LaunchConfiguration#getFileName} method
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetFileName() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchDelegateTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchDelegateTests.java
index 1d6aea4..b7944b5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchDelegateTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchDelegateTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,7 +31,7 @@
  * Tests for launch delegates
  */
 public class LaunchDelegateTests extends AbstractDebugTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -39,7 +39,7 @@
 	public LaunchDelegateTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Ensures a launch delegate can provide a launch object for
 	 * a launch.
@@ -54,7 +54,7 @@
 		ILaunch launch = workingCopy.launch(ILaunchManager.DEBUG_MODE, null);
 		manager.removeLaunch(launch);
 	}
-	
+
 	/**
 	 * Tests that a delegate extension can provide the source path computer.
 	 */
@@ -65,7 +65,7 @@
 		ISourcePathComputer sourcePathComputer = configurationType.getSourcePathComputer();
 		assertEquals("Wrong source path computer", "org.eclipse.jdt.debug.tests.testSourcePathComputer", sourcePathComputer.getId()); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Tests that a delegate extension can provide the source locator.
 	 */
@@ -76,10 +76,10 @@
 		String sourceLocatorId = configurationType.getSourceLocatorId();
 		assertEquals("Wrong source locater id", "org.eclipse.jdt.debug.tests.testSourceLocator", sourceLocatorId); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Test launch delegate for mixed launch mode.
-	 * @throws CoreException 
+	 * @throws CoreException
 	 */
 	public void testMixedModeDelegate() throws CoreException {
 		ILaunchManager manager = getLaunchManager();
@@ -94,7 +94,7 @@
 		assertEquals("Wrong number of delegates", 1, delegates.length); //$NON-NLS-1$
 		assertTrue("Wrong delegate", delegates[0].getDelegate() instanceof AlternateDelegate); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests if the java launch delegate was found as one of the delegates for debug mode.
 	 * @throws CoreException
@@ -117,7 +117,7 @@
 		}
 		assertTrue("The java launch delegate was not one of the returned delegates", found);		 //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests correct delegate is found for alternate mode.
 	 * @throws CoreException
@@ -133,8 +133,8 @@
 		assertTrue("missing delegate", delegates.length > 0); //$NON-NLS-1$
 		assertEquals("Wrong number of delegates", 1, delegates.length); //$NON-NLS-1$
 		assertTrue("Wrong delegate", delegates[0].getDelegate() instanceof AlternateDelegate);		 //$NON-NLS-1$
-	}	
-	
+	}
+
 	/**
 	 * Checks that the delegate definition is collecting and parsing mode combination information properly from both the delegate
 	 * contribution and from modeCombination child elements
@@ -155,7 +155,7 @@
 			assertTrue("Wrong delegate", delegates[0].getDelegate() instanceof AlternateDelegate);	 //$NON-NLS-1$
 		}
 	}
-	
+
 	/**
 	 * Checks that all applicable delegates are found for given types and mode combinations
 	 * @throws CoreException
@@ -177,7 +177,7 @@
 		HashSet<Object> ds = new HashSet<Object>(Arrays.asList(new Object[] {TestLaunchDelegate1.class, TestLaunchDelegate2.class}));
 		assertTrue("There must be only TestLaunchDelegate1 and TestLaunchDelegate2 as registered delegates for the mode alternate2 and the local java type", ds.containsAll(dels)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Checks to see the even with a partial match of a mode combination it will indicate that it does not support the specified modes
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchModeTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchModeTests.java
index 0079725..460398c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchModeTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchModeTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -47,7 +47,7 @@
  * LaunchModeTests
  */
 public class LaunchModeTests extends AbstractDebugTest {
-	
+
 	private ILaunchConfiguration fConfiguration;
 	private String fMode;
 
@@ -60,7 +60,7 @@
 
 	/**
 	 * Called by launch "TestModeLaunchDelegate" delegate when launch method invoked.
-	 * 
+	 *
 	 * @param configuration
 	 * @param mode
 	 */
@@ -73,7 +73,7 @@
 	/**
 	 * Tests that launch delegate for "TEST_MODE" and Java applications is invoked when
 	 * "TEST_MODE" is used.
-	 * 
+	 *
 	 * @throws CoreException
 	 * @see TestModeLaunchDelegate
 	 */
@@ -97,7 +97,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the launch configuration set by the TestModeLaunchDelegate, or <code>null</code>
 	 * if no launch configuration was set (the correct delegate was not called).
@@ -111,10 +111,10 @@
 				System.err.println("Interrupted waiting for launch configuration"); //$NON-NLS-1$
 			}
 		}
-		
+
 		return fConfiguration;
 	}
-	
+
 	/**
 	 * Ensure our contributed launch mode exists.
 	 */
@@ -130,7 +130,7 @@
 		assertContains("Missing run mode", ids, ILaunchManager.RUN_MODE); //$NON-NLS-1$
 		assertContains("Missing TEST_MODE", ids, "alternate"); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Asserts that the array contains the given object
 	 * @param message
@@ -141,10 +141,10 @@
 		for (int i = 0; i < array.length; i++) {
 			if (array[i].equals(object)) {
 				return;
-			}			
+			}
 		}
 		throw new AssertionFailedError(message);
-	}	
+	}
 
 	/**
 	 * Ensure our contributed mode is supported.
@@ -155,41 +155,41 @@
 		assertNotNull(configuration);
 		assertTrue("Java application configuration should support TEST_MODE", configuration.supportsMode("TEST_MODE")); //$NON-NLS-1$ //$NON-NLS-2$
 		assertTrue("Java application type should support TEST_MODE", configuration.getType().supportsMode("TEST_MODE")); //$NON-NLS-1$ //$NON-NLS-2$
-		
+
 		assertTrue("Java application configuration should support debug mode", configuration.supportsMode(ILaunchManager.DEBUG_MODE)); //$NON-NLS-1$
 		assertTrue("Java application type should support debug mode", configuration.getType().supportsMode(ILaunchManager.DEBUG_MODE)); //$NON-NLS-1$
-		
+
 		assertTrue("Java application configuration should support run mode", configuration.supportsMode(ILaunchManager.RUN_MODE)); //$NON-NLS-1$
 		assertTrue("Java application type should support run mode", configuration.getType().supportsMode(ILaunchManager.RUN_MODE));		 //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that mode specific tab group contributions work.
 	 * @throws CoreException
 	 */
 	public void testModeSpecificTabGroups() throws CoreException {
-		ILaunchConfigurationType javaType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); 
+		ILaunchConfigurationType javaType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		ILaunchConfigurationTabGroup standardGroup = LaunchConfigurationPresentationManager.getDefault().getTabGroup(javaType, ILaunchManager.DEBUG_MODE);
 		ILaunchConfigurationTabGroup testGroup = LaunchConfigurationPresentationManager.getDefault().getTabGroup(javaType, "TEST_MODE"); //$NON-NLS-1$
 		ILaunchConfigurationDialog dialog = new LaunchConfigurationsDialog(null, DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
 		standardGroup.createTabs(dialog, ILaunchManager.DEBUG_MODE);
 		testGroup.createTabs(dialog, "TEST_MODE"); //$NON-NLS-1$
-		
+
 		ILaunchConfigurationTab[] tabs = standardGroup.getTabs();
 		HashSet<Class<? extends ILaunchConfigurationTab>> tabset = new HashSet<Class<? extends ILaunchConfigurationTab>>();
 		for(int i = 0; i< tabs.length; i++) {
 			tabset.add(tabs[i].getClass());
 		}
 		Class<?>[] classes = new Class<?>[] {
-				JavaMainTab.class, 
-				JavaArgumentsTab.class, 
-				JavaJRETab.class, 
+				JavaMainTab.class,
+				JavaArgumentsTab.class,
+				JavaJRETab.class,
 				JavaClasspathTab.class,
-				SourceLookupTab.class, 
-				EnvironmentTab.class, 
+				SourceLookupTab.class,
+				EnvironmentTab.class,
 				CommonTab.class};
 		assertTrue("Tab set does not contain all default java tabs", tabset.containsAll(new HashSet<Class<?>>(Arrays.asList(classes)))); //$NON-NLS-1$
-		
+
 		tabs = testGroup.getTabs();
 		assertEquals("Wrong number of tabs in the test group", 4, tabs.length); //$NON-NLS-1$
 		tabset = new HashSet<Class<? extends ILaunchConfigurationTab>>();
@@ -197,15 +197,15 @@
 			tabset.add(tabs[i].getClass());
 		}
 		classes = new Class<?>[] {
-				JavaMainTab.class, 
-				JavaArgumentsTab.class, 
-				JavaJRETab.class, 
+				JavaMainTab.class,
+				JavaArgumentsTab.class,
+				JavaJRETab.class,
 				JavaClasspathTab.class};
 		assertTrue("Test tab set does not contain all default tabs", tabset.containsAll(new HashSet<Class<?>>(Arrays.asList(classes)))); //$NON-NLS-1$
 		standardGroup.dispose();
 		testGroup.dispose();
 	}
-	
+
 	/**
 	 * Tests that the default debug perspective for java applications is debug.
 	 */
@@ -213,12 +213,12 @@
 		ILaunchConfigurationType javaType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		assertEquals("Java debug perspective should be debug", IDebugUIConstants.ID_DEBUG_PERSPECTIVE, DebugUITools.getLaunchPerspective(javaType, ILaunchManager.DEBUG_MODE)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Test that the default debug perspective for Java Application types is debug.
 	 * Same notion as <code>testDefaultDebugLaunchPerspective()</code>, but using the new API
 	 * for getting perspectives
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testDefaultDebugLaunchPerspective2() {
@@ -227,20 +227,20 @@
 		modes.add(ILaunchManager.DEBUG_MODE);
 		assertEquals("Java debug perspective should be debug", IDebugUIConstants.ID_DEBUG_PERSPECTIVE, DebugUITools.getLaunchPerspective(javaType, null, modes)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that the default run perspective for java applications is none (<code>null</code>).
 	 */
 	public void testDefaultRunLaunchPerspective() {
 		ILaunchConfigurationType javaType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 		assertNull("Java run perspective should be null", DebugUITools.getLaunchPerspective(javaType, ILaunchManager.RUN_MODE)); //$NON-NLS-1$
-	}	
-	
+	}
+
 	/**
 	 * Tests that the default run perspective for java applications is none (<code>null</code>).
 	 * Same notion as <code>testDefaultRunLaunchPerspective()</code>, but using the new API for getting
 	 * launch perspectives
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testDefaultRunLaunchPerspective2() {
@@ -249,7 +249,7 @@
 		modes.add(ILaunchManager.RUN_MODE);
 		assertNull("Java run perspective should be null", DebugUITools.getLaunchPerspective(javaType, null, modes)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that the default debug perspective can be over-ridden and reset
 	 */
@@ -265,14 +265,14 @@
 		DebugUITools.setLaunchPerspective(javaType, ILaunchManager.DEBUG_MODE, IDebugUIConstants.PERSPECTIVE_DEFAULT);
 		assertEquals("Java debug perspective should now be debug", IDebugUIConstants.ID_DEBUG_PERSPECTIVE, //$NON-NLS-1$
 			DebugUITools.getLaunchPerspective(javaType, ILaunchManager.DEBUG_MODE));
-				
-	}	
-	
+
+	}
+
 	/**
 	 * Tests that the default debug perspective can be over-ridden and reset.
 	 * Same notion as <code>testResetDebugLaunchPerspective()</code>, but using the new API
 	 * for setting an resetting perspectives.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testResetDebugLaunchPerspective2() {
@@ -286,14 +286,14 @@
 		// re-set to default
 		DebugUITools.setLaunchPerspective(javaType, null, modes, IDebugUIConstants.PERSPECTIVE_DEFAULT);
 		assertEquals("Java debug perspective should now be debug", IDebugUIConstants.ID_DEBUG_PERSPECTIVE, DebugUITools.getLaunchPerspective(javaType, null, modes)); //$NON-NLS-1$
-				
-	}	
-	
+
+	}
+
 	/**
 	 * Tests that the default debug perspective can be over-ridden and reset
-	 * Same notion as <code>testResetDebugLaunchPerspective2()</code>, but using the 
+	 * Same notion as <code>testResetDebugLaunchPerspective2()</code>, but using the
 	 * JDT Java launch delegate instead of <code>null</code>
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testResetDebugPerspectiveJavaLaunchDelegate() {
@@ -310,7 +310,7 @@
 		DebugUITools.setLaunchPerspective(javaType, null, modes, IDebugUIConstants.PERSPECTIVE_DEFAULT);
 		assertEquals("Java debug perspective should now be debug", IDebugUIConstants.ID_DEBUG_PERSPECTIVE, DebugUITools.getLaunchPerspective(javaType, delegate, modes)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that the default run perspective can be over-ridden and reset
 	 */
@@ -325,14 +325,14 @@
 		// re-set to default
 		DebugUITools.setLaunchPerspective(javaType, ILaunchManager.RUN_MODE, IDebugUIConstants.PERSPECTIVE_DEFAULT);
 		assertNull("Java run perspective should now be null",  //$NON-NLS-1$
-			DebugUITools.getLaunchPerspective(javaType, ILaunchManager.RUN_MODE));		
-	}	
-	
+			DebugUITools.getLaunchPerspective(javaType, ILaunchManager.RUN_MODE));
+	}
+
 	/**
 	 * Tests that the default run perspective can be over-ridden and reset.
 	 * Same notion as <code>testResetRunLaunchPerspective()</code>, but using the new API
 	 * for getting/setting/re-setting perspective settings.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testResetRunLaunchPerspective2() {
@@ -346,13 +346,13 @@
 		// re-set to default
 		DebugUITools.setLaunchPerspective(javaType, ILaunchManager.RUN_MODE, IDebugUIConstants.PERSPECTIVE_DEFAULT);
 		assertNull("Java run perspective should now be null", DebugUITools.getLaunchPerspective(javaType, null, modes));		 //$NON-NLS-1$
-	}	
-	
+	}
+
 	/**
 	 * Tests that the default debug perspective can be over-ridden and reset
-	 * Same notion as <code>testResetRunLaunchPerspective2()</code>, but using the 
+	 * Same notion as <code>testResetRunLaunchPerspective2()</code>, but using the
 	 * JDT Java launch delegate instead of <code>null</code>
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testResetRunPerspectiveJavaLaunchDelegate() {
@@ -369,11 +369,11 @@
 		DebugUITools.setLaunchPerspective(javaType, null, modes, IDebugUIConstants.PERSPECTIVE_DEFAULT);
 		assertNull("Java run perspective should now be null", DebugUITools.getLaunchPerspective(javaType, delegate, modes)); //$NON-NLS-1$
 	}
-	
+
 	/**
-	 * Tests that the default launch perspective for the 'debug' modeset and java launch delegate is 
+	 * Tests that the default launch perspective for the 'debug' modeset and java launch delegate is
 	 * <code>ILaunchManager.DEBUG_MODE</code> using the new API.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testDefaultDebugPerspectiveJavaLaunchDelegate() {
@@ -385,11 +385,11 @@
 		String p = DebugUITools.getLaunchPerspective(javaType, delegate, modes);
 		assertEquals("Java debug perspective should be debug", IDebugUIConstants.ID_DEBUG_PERSPECTIVE, p); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that the default launch perspective for the 'run' modeset and java launch delegate
 	 * is <code>null/code> using the new API
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public void testDefaultRunPerspectiveJavaLaunchDelegate() {
@@ -401,7 +401,7 @@
 		String p = DebugUITools.getLaunchPerspective(javaType, delegate, modes);
 		assertNull("Java run perspective should be null", p); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests a perspective contributed with a launch tab group.
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchShortcutTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchShortcutTests.java
index a364ed4..fabc034 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchShortcutTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchShortcutTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,14 +20,14 @@
 
 /**
  * Tests the capabilities of launch shortcuts from the <code>LaunchShortcuts</code> extension point
- * 
+ *
  * @since 3.3
  */
 @SuppressWarnings("deprecation")
 public class LaunchShortcutTests extends AbstractDebugTest {
 
 	private static String TESTING = "testing"; //$NON-NLS-1$
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -35,7 +35,7 @@
 	public LaunchShortcutTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests to see that the local java launch shortcut supports the java
 	 * application launch configuration type
@@ -56,7 +56,7 @@
 		String typeid = "org.eclipse.jdt.launching.foo"; //$NON-NLS-1$
 		assertTrue("local java app shortcut should not support foo", !ext.getAssociatedConfigurationTypes().contains(typeid)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that the java app shortcut supports debug and java perspectives
 	 */
@@ -65,7 +65,7 @@
 		assertNotNull("java app shortcut not found", ext); //$NON-NLS-1$
 		assertTrue("java app shortcut should support debug perspective", ext.getPerspectives().contains("org.eclipse.debug.ui.DebugPerspective")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Tests that the local java app shortcut does not support some fake perspective foo
 	 */
@@ -74,7 +74,7 @@
 		assertNotNull("test shortcut not found", ext); //$NON-NLS-1$
 		assertTrue("java app shortcut should not support foo perspective", !ext.getPerspectives().contains("org.eclipse.debug.ui.FooPerspective")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Tests that the testing launch shortcut can be found based on specified perspective and category
 	 */
@@ -83,7 +83,7 @@
 		assertNotNull("launch configuration manager cannot be null", lcm); //$NON-NLS-1$
 		assertTrue("there should be one shortcut for the debug perspective and testing category", lcm.getLaunchShortcuts("org.eclipse.debug.ui.DebugPerspective", TESTING).size() == 1); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Tests that the testing launch shortcut can be found based on the specified category
 	 */
@@ -92,7 +92,7 @@
 		assertNotNull("launch configuration manager cannot be null", lcm); //$NON-NLS-1$
 		assertTrue("there should be one shortcut for the testing category", lcm.getLaunchShortcuts(TESTING).size() == 1); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests that shortcuts can be found based on the specified launch configuration type id.
 	 * For this test there should be a minimum of two shortcuts found.
@@ -100,7 +100,7 @@
 	public void testGetApplicableLaunchShortcuts() {
 		assertTrue("there should be 2 or more shortcuts", getApplicableLaunchShortcuts("org.eclipse.jdt.launching.localJavaApplication").size() >= 2); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Tests that a description can be retrieved for a specified mode when it is the general description,
 	 * i.e. that the description has been provided in the shortcut definition and is NOT a description child element
@@ -116,10 +116,10 @@
 		assertNotNull("The description should not be null for debug mode", descr); //$NON-NLS-1$
 		assertTrue("The description should match the general one: General Description", descr.equals("General Description")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
-	 * Test that the general shortcut description provided is over-loaded with the one 
-	 * specifically provided for the run mode. i.e. the run mode description is provided as a 
+	 * Test that the general shortcut description provided is over-loaded with the one
+	 * specifically provided for the run mode. i.e. the run mode description is provided as a
 	 * child element for the launch shortcut
 	 * @since 3.3
 	 */
@@ -133,14 +133,14 @@
 		assertNotNull("The description should not be null for run mode", descr); //$NON-NLS-1$
 		assertTrue("The description should match the specific run one: Run Description", descr.equals("Run Description")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Returns a listing of all applicable <code>LaunchShortcutExtension</code>s for the given
 	 * launch configuration type id.
 	 * @param typeid the id of the launch configuration
 	 * @return a listing of <code>LaunchShortcutExtension</code>s that are associated with the specified launch configuration
 	 * type id or an empty list, never <code>null</code>
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public List<LaunchShortcutExtension> getApplicableLaunchShortcuts(String typeid) {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchTests.java
index 19c4f68..820d110 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,11 +25,11 @@
  * Tests launch notification.
  */
 public class LaunchTests extends AbstractDebugTest implements ILaunchListener {
-	
+
 	private boolean added = false;
 	private boolean removed = false;
-	private boolean terminated = false; 
-	
+	private boolean terminated = false;
+
 	/**
 	 * Constructor
 	 * @param name the name of the test
@@ -73,9 +73,9 @@
 			}
 		}
 		assertTrue("Launch should have been terminated", terminated); //$NON-NLS-1$
-		
+
 		getLaunchManager().removeLaunch(launch);
-		
+
 		synchronized (this) {
 			if (!removed) {
 				try {
@@ -86,10 +86,10 @@
 		}
 		assertTrue("Launch should have been removed", removed);		 //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Tests launching an unregistered launch.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnregisteredLaunch() throws Exception {
@@ -104,7 +104,7 @@
        } finally {
            terminateAndRemove(thread);
            removeAllBreakpoints();
-       }	   
+       }
 	}
 
 	/**
@@ -124,7 +124,7 @@
 		added = true;
 		notifyAll();
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchesTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchesTests.java
index 1076711..989b61e 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchesTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/LaunchesTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
  * Tests launch notification plural
  */
 public class LaunchesTests extends AbstractDebugTest implements ILaunchesListener2 {
-	
+
 	private boolean added = false;
 	private boolean removed = false;
-	private boolean terminated = false; 
-	
+	private boolean terminated = false;
+
 	/**
 	 * Constructor
 	 * @param name the name of the test
@@ -33,14 +33,14 @@
 	public LaunchesTests(String name) {
 		super(name);
 	}
-	
-	
+
+
 
 	@Override
 	protected void setUp() throws Exception {
 		added = false;
 		removed = false;
-		terminated = false; 
+		terminated = false;
 		super.setUp();
 	}
 
@@ -53,7 +53,7 @@
 	public void testDebugMode() throws CoreException {
 		doMode(ILaunchManager.DEBUG_MODE);
 	}
-	
+
 	/**
 	 * Tests launch notification in run mode.
 	 * @throws CoreException
@@ -61,7 +61,7 @@
 	public void testRunMode() throws CoreException {
 		doMode(ILaunchManager.RUN_MODE);
 	}
-	
+
 	protected void doMode(String mode) throws CoreException {
 		String typeName = "Breakpoints";		 //$NON-NLS-1$
 		ILaunchConfiguration configuration = getLaunchConfiguration(typeName);
@@ -86,9 +86,9 @@
 			}
 		}
 		assertTrue("Launch should have been terminated", terminated); //$NON-NLS-1$
-		
+
 		getLaunchManager().removeLaunch(launch);
-		
+
 		synchronized (this) {
 			if (!removed) {
 				try {
@@ -97,7 +97,7 @@
 				}
 			}
 		}
-		assertTrue("Launch should have been removed", removed);		 //$NON-NLS-1$		
+		assertTrue("Launch should have been removed", removed);		 //$NON-NLS-1$
 	}
 
 	/**
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/MigrationDelegateTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/MigrationDelegateTests.java
index ee74a68..68c94a8 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/MigrationDelegateTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/MigrationDelegateTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,13 +16,13 @@
 
 /**
  * Class to test the migration delegate for java type launch configuration migrations
- * Java types in this context only include Local Java Applications, Java Applets, and Remote Java Applications 
- * 
+ * Java types in this context only include Local Java Applications, Java Applets, and Remote Java Applications
+ *
  * @since 3.2
  *
  */
 public class MigrationDelegateTests extends AbstractDebugTest {
-	
+
 	/**
 	 * constructor
 	 * @param name the name of the test
@@ -30,7 +30,7 @@
 	public MigrationDelegateTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Runs a normal migration with no problems
 	 * @throws Exception
@@ -38,7 +38,7 @@
 	public void testStandardMigration() throws Exception {
 		createLaunchConfiguration("MigrationTests"); //$NON-NLS-1$
 		ILaunchConfiguration config = getLaunchConfiguration("MigrationTests"); //$NON-NLS-1$
-		try{ 
+		try{
 			assertTrue("LC: "+config.getName()+" should be a candidate for migration", config.isMigrationCandidate()); //$NON-NLS-1$ //$NON-NLS-2$
 			config.migrate();
 			IResource[] mappedResources = config.getMappedResources();
@@ -49,7 +49,7 @@
 			config = null;
 		}
 	}
-	
+
 	/**
 	 * Tests to see if the previously migrated launch configurations are still considered candidates
 	 * @throws Exception
@@ -57,7 +57,7 @@
 	public void testMigrationAlreadyPerformed() throws Exception {
 		createLaunchConfiguration("MigrationTests2"); //$NON-NLS-1$
 		ILaunchConfiguration config = getLaunchConfiguration("MigrationTests2"); //$NON-NLS-1$
-		try{ 
+		try{
 			assertTrue("LC: "+config.getName()+" should be a candidate for migration", config.isMigrationCandidate()); //$NON-NLS-1$ //$NON-NLS-2$
 			config.migrate();
 			assertTrue("LC: "+config.getName()+" should not be a candidate for migration", !config.isMigrationCandidate()); //$NON-NLS-1$ //$NON-NLS-2$
@@ -66,5 +66,5 @@
 			config = null;
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/PListParserTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/PListParserTests.java
index a938b35..a583941 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/PListParserTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/PListParserTests.java
@@ -28,16 +28,16 @@
 
 	/**
 	 * Constructs a test
-	 * 
+	 *
 	 * @param name test name
 	 */
 	public PListParserTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests parsing of a sample installed JREs plist from the Mac.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testParseJREs() throws Exception {
@@ -61,7 +61,7 @@
 			map.put("test", Boolean.FALSE);
 			map.put("testint", new Integer(42));
 			assertEquals("Incorrect values parsed", map, jres[0]);
-			
+
 			map = new HashMap<String, Comparable<?>>();
 			map.put("JVMArch", "x86_64");
 			map.put("JVMBundleID", "com.apple.javajdk16");
@@ -72,7 +72,7 @@
 			map.put("JVMPlatformVersion", "1.6");
 			map.put("JVMVersion", "1.6.0_20");
 			assertEquals("Incorrect values parsed", map, jres[1]);
-			
+
 			map = new HashMap<String, Comparable<?>>();
 			map.put("JVMArch", "x86_64");
 			map.put("JVMBundleID", "com.apple.javajdk15");
@@ -90,7 +90,7 @@
 
 	/**
 	 * Tests that we parse out the correct number of raw entries from the 'lion' plist output
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -102,15 +102,15 @@
 		if (obj instanceof Object[]) {
 			Object[] jres = (Object[]) obj;
 			assertEquals("Should be 8 entries in the array", 8, jres.length);
-			
+
 		} else {
 			assertTrue("Top level object should be an array", false);
 		}
 	}
-	
+
 	/**
 	 * Tests that we parse out the correct number of raw entries from the 'now leopard' plist output
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -122,16 +122,16 @@
 		if (obj instanceof Object[]) {
 			Object[] jres = (Object[]) obj;
 			assertEquals("Should be 2 entries in the array", 2, jres.length);
-			
+
 		} else {
 			assertTrue("Top level object should be an array", false);
 		}
 	}
-	
+
 	/**
 	 * Tests that we can parse out certain {@link VMStandin}s from the 'old' style
 	 * of plist output.
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -142,11 +142,11 @@
 		VMStandin[] desc = MacInstalledJREs.parseJREInfo(new FileInputStream(file), null);
 		assertEquals("There should be 2 JRE descriptions", 2, desc.length);
 	}
-	
+
 	/**
 	 * Tests that we can parse out certain {@link VMStandin}s from the 'snow leopard' style
 	 * of plist output.
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -157,11 +157,11 @@
 		VMStandin[] desc = MacInstalledJREs.parseJREInfo(new FileInputStream(file), null);
 		assertEquals("There should be 1 JRE description", 1, desc.length);
 	}
-	
+
 	/**
 	 * Tests that we can parse out certain {@link VMStandin}s from the 'lion' style
 	 * of plist output.
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -172,14 +172,14 @@
 		VMStandin[] desc = MacInstalledJREs.parseJREInfo(new FileInputStream(file), null);
 		assertEquals("There should be 4 JRE descriptions", 4, desc.length);
 	}
-	
+
 	/**
 	 * Tests that we can parse out certain {@link VMStandin}s from the plist
 	 * output known to be bad - wrong data types.
 	 * <br><br>
-	 * <code>plist-bad1.xml</code> has a boolean value in place of the VM name for the 1.6 VM, 
+	 * <code>plist-bad1.xml</code> has a boolean value in place of the VM name for the 1.6 VM,
 	 * but we should still recover the remainder of the VMs defined (3 of them)
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -191,13 +191,13 @@
 		VMStandin[] desc = MacInstalledJREs.parseJREInfo(new FileInputStream(file), null);
 		assertEquals("There should be 3 JRE descriptions", 3, desc.length);
 	}
-	
+
 	/**
 	 * Tests that we can parse out certain {@link VMStandin}s from the plist
 	 * output known to be bad - missing element.
 	 * <br><br>
 	 * <code>plist-bad2.xml</code> is missing a key element - but still has the value for the key.
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -209,13 +209,13 @@
 		VMStandin[] desc = MacInstalledJREs.parseJREInfo(new FileInputStream(file), null);
 		assertEquals("There should be 3 JRE descriptions", 3, desc.length);
 	}
-	
+
 	/**
 	 * Tests that we can parse out certain {@link VMStandin}s from the plist
 	 * output known to be bad - corrupt XML syntax.
 	 * <br><br>
 	 * <code>plist-bad3.xml</code> has corrupt XML syntax
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ProjectClasspathVariableTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ProjectClasspathVariableTests.java
index 83d7850..de033d5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ProjectClasspathVariableTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ProjectClasspathVariableTests.java
@@ -29,17 +29,17 @@
 import org.eclipse.ui.PartInitException;
 
 /**
- * Tests for the ${project_classpath} variable 
+ * Tests for the ${project_classpath} variable
  */
 public class ProjectClasspathVariableTests extends AbstractDebugTest {
 
 	public ProjectClasspathVariableTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Sets the selected resource in the navigator view.
-	 * 
+	 *
 	 * @param resource resource to select or <code>null</code> if empty
 	 */
 	protected void setSelection(final IResource resource) {
@@ -66,15 +66,15 @@
 				} catch (PartInitException e) {
 					assertNotNull("Failed to open navigator view", null);
 				}
-				
+
 			}
 		};
 		DebugUIPlugin.getStandardDisplay().syncExec(r);
 	}
-	
+
 	/**
 	 * Tests that a project name must be specified.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testMissingProjectName() throws Exception {
@@ -87,10 +87,10 @@
 		}
 		assertNotNull("Test should have thrown an exception due to missing project name", null);
 	}
-	
+
 	/**
 	 * Tests the selected project's classpath.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSelectedProject() throws Exception {
@@ -105,10 +105,10 @@
 		buffer.append(get14Project().getProject().getFolder("src").getFile("A.jar").getLocation().toOSString());
 		assertEquals("Wrong classpath", buffer.toString(), cp);
 	}
-	
+
 	/**
 	 * Tests that a Java project must exist
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testProjectDoesNotExist() throws Exception {
@@ -120,7 +120,7 @@
 		}
 		assertNotNull("Test should have thrown an exception due to project does not exist", null);
 	}
-	
+
 	public void testProjectClasspath() throws Exception {
 		IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
 		String projectName = get14Project().getElementName();
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/TabGroupWrapperTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/TabGroupWrapperTests.java
index ab7ae88..3404c04 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/TabGroupWrapperTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/TabGroupWrapperTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 /**
  * test class tests the returnable methods of the new <code>LaunchConfigurationTabGroupWrapper</code> to ensure that it returns existing tab group
  * elements and all contributions
- * 
+ *
  * @since 3.3
  */
 public class TabGroupWrapperTests extends AbstractDebugTest {
@@ -43,7 +43,7 @@
 		javagroup.createTabs(getLaunchConfigurationDialog(IDebugUIConstants.ID_RUN_LAUNCH_GROUP), ILaunchManager.RUN_MODE);
 		assertTrue("There must be at least 11 tabs", javagroup.getTabs().length >= 11); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Checks to make sure that all of the controls of the tabs (including contributed ones) are disposed on a call to the tab group
 	 * wrapper class
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/BreakpointManagerPerfTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/BreakpointManagerPerfTests.java
index b08e4a2..72f1551 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/BreakpointManagerPerfTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/BreakpointManagerPerfTests.java
@@ -24,11 +24,11 @@
 
 /**
  * Tests the performance of various parts of the {@link BreakpointManager}
- * 
+ *
  * @since 3.8
  */
 public class BreakpointManagerPerfTests extends AbstractDebugPerformanceTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -39,10 +39,10 @@
 
 	static IBreakpoint[] NO_BREAKPOINTS = new IBreakpoint[0];
 	static String fgTypeName = "BPManagerPerf";
-	
+
 	/**
 	 * Create the given number of breakpoints in the given resource starting from the given line
-	 *  
+	 *
 	 * @param count
 	 * @throws Exception
 	 * @return the collection of breakpoints
@@ -72,7 +72,7 @@
 		assertEquals("the should have been "+count+" breakpoints created", count, bps.size());
 		return bps.toArray(new IBreakpoint[bps.size()]);
 	}
-	
+
 	/**
 	 * Tests the time required to start the {@link BreakpointManager}
 	 * @throws Exception
@@ -102,7 +102,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests the time required to start the {@link BreakpointManager}
 	 * @throws Exception
@@ -132,7 +132,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests the time required to start the {@link BreakpointManager}
 	 * @throws Exception
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfBreakpointTests.java
index b9a86c4..a700790 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfBreakpointTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -53,7 +53,7 @@
         IJavaLineBreakpoint bp = createLineBreakpoint(14, typeName);
         IJavaThread thread = launchToBreakpoint(typeName, false);
         bp.delete();
-        
+
         try {
             DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
 
@@ -61,13 +61,13 @@
             for (int i = 0; i < lineNumbers.length; i++) {
                 lineNumbers[i] = 15 + i;
             }
-            
+
             for (int i = 0; i < 10; i++) {
                 createLineBreakpoints(resource, typeName, lineNumbers);
                 waitForBreakpointCount(lineNumbers.length);
                 removeAllBreakpoints();
                 waitForBreakpointCount(0);
-                breakpointCount = 0;  
+                breakpointCount = 0;
             }
 
             for (int i = 0; i < 100; i++) {
@@ -85,7 +85,7 @@
         } finally {
             DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
             removeAllBreakpoints();
-            
+
             terminateAndRemove(thread);
         }
     }
@@ -117,7 +117,7 @@
                 IBreakpoint[] breakpoints = manager.getBreakpoints();
                 manager.removeBreakpoints(breakpoints, true);
                 waitForBreakpointCount(0);
-                
+
             }
 
             lineNumbers = new int[250];
@@ -134,14 +134,14 @@
                 manager.removeBreakpoints(breakpoints, true);
                 waitForBreakpointCount(0);
                 stopMeasuring();
-                
+
             }
             commitMeasurements();
             assertPerformance();
         } finally {
             manager.removeBreakpointListener(this);
             removeAllBreakpoints();
-            
+
             terminateAndRemove(thread);
         }
     }
@@ -154,7 +154,7 @@
         tagAsSummary("Install Method Entry Breakpoints", Dimension.ELAPSED_PROCESS);
         String typeName = "LargeSourceFile";
         IProject project = get14Project().getProject();
-        
+
         IJavaLineBreakpoint bp = createLineBreakpoint(14, typeName);
         IJavaThread thread = launchToBreakpoint(typeName, false);
         bp.delete();
@@ -173,7 +173,7 @@
                 waitForBreakpointCount(methods.length);
                 removeAllBreakpoints();
                 waitForBreakpointCount(0);
-                
+
             }
 
             for (int i = 0; i < 100; i++) {
@@ -183,7 +183,7 @@
                 waitForBreakpointCount(methods.length);
                 stopMeasuring();
                 removeAllBreakpoints();
-                
+
                 breakpointCount = 0;
             }
             commitMeasurements();
@@ -191,9 +191,9 @@
         } finally {
             DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
             removeAllBreakpoints();
-            
+
             terminateAndRemove(thread);
-        }        
+        }
     }
 
     /**
@@ -204,7 +204,7 @@
         tagAsSummary("Install Watchpoints", Dimension.ELAPSED_PROCESS);
         String typeName = "LotsOfFields";
         IResource resource = getBreakpointResource(typeName);
-        
+
         IJavaLineBreakpoint bp = createLineBreakpoint(516, typeName);
         IJavaThread thread = launchToBreakpoint(typeName, false);
         bp.delete();
@@ -232,7 +232,7 @@
                 waitForBreakpointCount(fields.length);
                 stopMeasuring();
                 removeAllBreakpoints();
-                
+
                 breakpointCount = 0;
             }
             commitMeasurements();
@@ -240,11 +240,11 @@
         } finally {
             DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
             removeAllBreakpoints();
-            
+
             terminateAndRemove(thread);
-        }        
+        }
     }
-    
+
     /**
      * Waits for the specified breakpoint count to be hit
      * @param i
@@ -284,7 +284,7 @@
             JDIDebugModel.createMethodBreakpoint(project, typeName, methodName, "()V", true, false, false, -1, -1, -1, 0, true, null);
         }
     }
-    
+
     /**
      * Creates watchpoints on the specified fields of the specified resource with the given type name
      * @param resource
@@ -299,7 +299,7 @@
             wp.setModification(true);
         }
     }
-    
+
     /**
      * @see org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint)
      */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java
index 94f3ddc..866a4ee 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConsoleTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConsoleTests.java
index 523ebf0..1684275 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConsoleTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConsoleTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -55,7 +55,7 @@
         tagAsSummary("Process Console 10,000 lines: plain output", Dimension.ELAPSED_PROCESS);
         runConsole80CharsTest(10000, 75);
     }
-    
+
     /**
      * Tests the performance of 10000 lines of stack trace output to the console
      * @throws Exception
@@ -66,7 +66,7 @@
     }
 
     /**
-     * Tests the performance of 10000 lines of wrapped process console output to the console 
+     * Tests the performance of 10000 lines of wrapped process console output to the console
      * @throws Exception
      */
     public void testProcessConsoleWrappedOutput10000Lines() throws Exception {
@@ -95,7 +95,7 @@
     }
 
     /**
-     * Runs the 
+     * Runs the
      * @param lines
      * @param repeatTest
      * @throws Exception
@@ -194,9 +194,9 @@
                 DebugUITools.launch(workingCopy, ILaunchManager.RUN_MODE);
             }
         };
-        
+
         DebugUIPlugin.getStandardDisplay().asyncExec(runnable);
-        
+
         synchronized (fLock) {
             if (!fStopped) {
                 fLock.wait(360000);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfContextualLaunchMenu.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfContextualLaunchMenu.java
index f915848..669e850 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfContextualLaunchMenu.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfContextualLaunchMenu.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,10 +21,10 @@
 import org.eclipse.swt.widgets.Shell;
 
 /**
- * Tests the performance of the contextual launch menu population 
+ * Tests the performance of the contextual launch menu population
  */
 public class PerfContextualLaunchMenu extends AbstractDebugPerformanceTest {
-    
+
     /**
      * Constructor
      * @param name
@@ -40,18 +40,18 @@
     public void testContextualLaunchMenu() throws Exception {
     	setDegradationComment("This test is unreliable as it improved 10x during 3.3 (vs 3.2), and needs to be replaced.");
         final PerfTestContextualLaunchAction launchaction = new PerfTestContextualLaunchAction();
-        
-        ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");        
+
+        ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
         StructuredSelection selection = new StructuredSelection(new Object[] {cu});
         launchaction.selectionChanged(new BogusAction(), selection);
-        
+
         DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
             @Override
 			public void run() {
                 Shell shell = DebugUIPlugin.getStandardDisplay().getActiveShell();
                 Menu menu = launchaction.getMenu(new Menu(shell));
                 showMenu(launchaction, menu, 5);
-                
+
                 for(int i=0; i<10; i++) {
                     try {
                     System.gc();
@@ -77,10 +77,10 @@
         commitMeasurements();
         assertPerformance();
     }
-    
+
     private class BogusAction extends Action {
     }
-    
+
     private class PerfTestContextualLaunchAction extends ContextualLaunchAction {
         /**
          * Constructor
@@ -88,7 +88,7 @@
         public PerfTestContextualLaunchAction() {
             super(ILaunchManager.RUN_MODE);
         }
-        
+
         void showMenu(Menu menu) {
         	fillMenu(menu);
         }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfDebugBaselineTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfDebugBaselineTest.java
index bacc100..1d52314 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfDebugBaselineTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfDebugBaselineTest.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,12 +33,12 @@
             buffer.append("at org.eclipse.jdt.internal.debug.core.model.JDILocalVariable.retrieveValue(JDILocalVariable.java:56\n");
         }
         String text = buffer.toString();
-        
+
         //ensure class loading and JIT is done.
         for (int i= 0; i < 5; i++) {
             findMatches(text);
         }
-        
+
         try {
             for (int i= 0; i < 10; i++) {
                 fPerformanceMeter.start();
@@ -60,7 +60,7 @@
     private int findMatches(String text) {
         Pattern pattern = Pattern.compile("\\w\\S*\\(\\S*\\.java:\\S*\\)");
         Matcher matcher = pattern.matcher(text);
-        
+
         int count = 0;
         while (matcher.find()) {
             count++;
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java
index adab869..ce6c674 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
  * Tests performance of stepping.
  */
 public class PerfSteppingTests extends AbstractDebugPerformanceTest {
-	
+
 	/**
 	 * Constructor
 	 * @param name
@@ -29,9 +29,9 @@
 	public PerfSteppingTests(String name) {
 		super(name);
 	}
-	
+
 	class MyFilter implements IDebugEventFilter {
-		
+
 		private IJavaThread fThread = null;
 		private Object fLock;
 		private DebugEvent[] EMPTY = new DebugEvent[0];
@@ -45,7 +45,7 @@
 			fThread = thread;
 			fLock = lock;
 		}
-		
+
 		/**
 		 * @see org.eclipse.debug.core.IDebugEventFilter#filterDebugEvents(org.eclipse.debug.core.DebugEvent[])
 		 */
@@ -64,7 +64,7 @@
 			}
 			return events;
 		}
-		
+
 		/**
 		 * performs a step operation
 		 */
@@ -81,24 +81,24 @@
 					assertTrue(e.getMessage(), false);
 				}
 			}
-			 
+
 		}
-		
+
 	}
 
 	/**
 	 * Tests stepping over without taking into account event processing in the UI.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testBareStepOver() throws Exception {
 		String typeName = "PerfLoop";
 		createLineBreakpoint(20, typeName);
-		
+
 		IJavaThread thread= null;
-		try {			
+		try {
 			thread= launchToBreakpoint(typeName, false);
-			
+
 			// warm up
 			Object lock = new Object();
 			MyFilter filter = new MyFilter(thread, lock);
@@ -108,14 +108,14 @@
 				for (int i = 0; i < 100; i++) {
 					filter.step();
 				}
-			}			
-			DebugPlugin.getDefault().removeDebugEventFilter(filter);			
-			
+			}
+			DebugPlugin.getDefault().removeDebugEventFilter(filter);
+
 			// real test
 			lock = new Object();
 			filter = new MyFilter(thread, lock);
 			DebugPlugin.getDefault().addDebugEventFilter(filter);
-			
+
 			thread.getTopStackFrame();
 			for (int n= 0; n < 150; n++) {
 				startMeasuring();
@@ -127,11 +127,11 @@
 			}
 			commitMeasurements();
 			assertPerformance();
-			
+
 			DebugPlugin.getDefault().removeDebugEventFilter(filter);
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfVariableDetailTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfVariableDetailTests.java
index e578db7..f303798 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfVariableDetailTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfVariableDetailTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 public class PerfVariableDetailTests extends AbstractDebugPerformanceTest implements IValueDetailListener {
 
     private Object fLock = new Object();
-    
+
     /**
      * Constructor
      * @param name
@@ -45,9 +45,9 @@
     		fLock.notifyAll();
 		}
 	}
-    
+
     /**
-     * Tests the performance of calculating the 'toString' method 
+     * Tests the performance of calculating the 'toString' method
      * @throws Exception
      */
     public void testToStringDetails() throws Exception {
@@ -66,7 +66,7 @@
         	assertNotNull("Missing variable 'v'", variable);
         	IDebugModelPresentation presentation = DebugUITools.newDebugModelPresentation("org.eclipse.jdt.debug");
         	IValue value = variable.getValue();
-        	
+
         	// warm up
         	for (int i = 0; i < 100; i++) {
         		synchronized (fLock) {
@@ -74,7 +74,7 @@
         			fLock.wait(30000);
         		}
         	}
-        	
+
         	// test
         	for (int i = 0; i < 300; i++) {
         		startMeasuring();
@@ -86,10 +86,10 @@
         		}
         		stopMeasuring();
         	}
-        	
+
         	commitMeasurements();
         	assertPerformance();
-        	
+
         } finally {
         	removeAllBreakpoints();
         	terminateAndRemove(thread);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/AbstractRefactoringDebugTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/AbstractRefactoringDebugTest.java
index 1f04ca3..4636962 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/AbstractRefactoringDebugTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/AbstractRefactoringDebugTest.java
@@ -34,7 +34,7 @@
 
 /**
  * Common refactoring utils.
- * 
+ *
  * @since 3.2
  */
 public class AbstractRefactoringDebugTest extends AbstractDebugTest {
@@ -42,7 +42,7 @@
 	public AbstractRefactoringDebugTest(String name) {
 		super(name);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.tests.AbstractDebugTest#setUp()
 	 */
@@ -51,11 +51,11 @@
 		super.setUp();
 		cleanTestFiles();
 	}
-	
+
 	/**
 	 * Performs the given refactoring. If a {@link ResourceException} occurs during the refactoring,
 	 * we trap it and throw a {@link TestAgainException} to try the test again.
-	 * 
+	 *
 	 * @param refactoring
 	 * @throws Exception
 	 */
@@ -86,7 +86,7 @@
 			throw new TestAgainException(ce.getLocalizedMessage());
 		}
 	}
-	
+
 	/**
 	 * Clean up all the test files
 	 * @throws CoreException
@@ -116,7 +116,7 @@
 		if (!fragment.exists()) {
 			root.createPackageFragment("a.b.c", true, new NullProgressMonitor());
 		}
-		
+
 	// cleanup MoveeSource / Movee.java
 		IFile target = project.getFile("src/a/b/Movee.java");
 		if (target.exists()) {
@@ -144,7 +144,7 @@
 		if (target.exists()) {
 			target.delete(true, false, null);
 		}
-		
+
 	// cleanup MoveeChildSource / MoveeChild.java
 		target = project.getFile("src/a/b/MoveeChild.java");
 		if (target.exists()) {
@@ -166,14 +166,14 @@
 		SearchEngine engine = new SearchEngine();
 		IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
 		try {
-			engine.searchAllTypeNames(null, 
-					SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE, 
-					"!@$#!@".toCharArray(), 
-					SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE, 
-					IJavaSearchConstants.CLASS, 
-					scope, 
-					new TypeNameRequestor() {}, 
-					IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, 
+			engine.searchAllTypeNames(null,
+					SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE,
+					"!@$#!@".toCharArray(),
+					SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE,
+					IJavaSearchConstants.CLASS,
+					scope,
+					new TypeNameRequestor() {},
+					IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
 					null);
 		} catch (CoreException e) {
 		}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeAnonymousTypeMethodSignatureUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeAnonymousTypeMethodSignatureUnitTests.java
index bd7b30e..c6ef6cf 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeAnonymousTypeMethodSignatureUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeAnonymousTypeMethodSignatureUnitTests.java
@@ -28,10 +28,10 @@
 		super(name);
 	}
 
-	
+
 	public void testAnonymousTypeMethodChange() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V$1$anonTypeMethod()QString",
@@ -55,16 +55,16 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-		
+	}//end testBreakPoint
+
 	private Refactoring setupRefactor(String root, String packageName, String cuName, String fullTargetName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IMethod method = (IMethod)(getMember(cunit,fullTargetName));
-		
+
         ChangeSignatureProcessor processor = new ChangeSignatureProcessor(method);
         ProcessorBasedRefactoring ref= new ProcessorBasedRefactoring(processor);
-        
+
         //configure the processor a little more here!
         processor.setNewMethodName("changedMethod");
         processor.setNewReturnTypeName("Object");
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeMethodSignatureUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeMethodSignatureUnitTests.java
index 849cdf4..e1497f3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeMethodSignatureUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ChangeMethodSignatureUnitTests.java
@@ -32,7 +32,7 @@
 
 	public void testPublicTypeMethodChange() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "Movee.java",
 					type = "Movee",
@@ -60,7 +60,7 @@
 
 	public void testInnerTypeMethodChange() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "Movee.java",
 					type = "Movee$InnerType",
@@ -85,10 +85,10 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	public void testNonPublicTypeMethodChange() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "Movee.java",
 					type = "NonPublicType",
@@ -96,7 +96,7 @@
 					methodSig = "()V";
 			//create breakpoint to test
 			createMethodBreakpoint(pack,cunit,type,methodName,methodSig,true, false);
-			
+
 			//refactor
 			Refactoring ref = setupRefactor(src, pack, cunit, type, methodName, methodSig);
 			performRefactor(ref);
@@ -113,18 +113,18 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-	
-	
-//////////////////////////////////////////////////////////////////////////////////////	
+	}//end testBreakPoint
+
+
+//////////////////////////////////////////////////////////////////////////////////////
 	private Refactoring setupRefactor(String root, String targetPackageName, String cuName, String typeName, String methodName, String methodSig) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, targetPackageName, cuName);
 		IType type = getLowestType(cunit, typeName);
-		
+
 		IMethod method = type.getMethod(methodName, Signature.getParameterTypes(methodSig));
-		
+
         ChangeSignatureProcessor processor = new ChangeSignatureProcessor(method);
         ProcessorBasedRefactoring ref= new ProcessorBasedRefactoring(processor);
 
@@ -143,10 +143,10 @@
 	}
 
 	/**
-	 * 
+	 *
 	 * @param cu the CompilationUnit containing the toplevel Type
-	 * @param input - the type, possibly including inner type, 
-	 * separated by $. 
+	 * @param input - the type, possibly including inner type,
+	 * separated by $.
 	 * eg: EnclosingType$InnerType
 	 * @return the Lowest level inner type specified in input
 	 */
@@ -163,14 +163,14 @@
 		}
 		//has no inner type
 		return cu.getType(input);
-		
+
 	}
-	
+
 	/**
 	 * Helper method for getLowestType (ICompilationUnit cu, String input)
 	 * @param enclosing name of enclosing Type
-	 * @param name the typename, possibly including inner type, 
-	 * separated by $. 
+	 * @param name the typename, possibly including inner type,
+	 * separated by $.
 	 * eg: EnclosingType$InnerType
 	 * @return
 	 */
@@ -184,7 +184,7 @@
 			}
 		}
 		//has no inner type
-		return enclosing.getType(name);		
-		
+		return enclosing.getType(name);
+
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertInnerAnonymousTypeToNestedUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertInnerAnonymousTypeToNestedUnitTests.java
index a319c4d..d8e7a2d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertInnerAnonymousTypeToNestedUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertInnerAnonymousTypeToNestedUnitTests.java
@@ -30,10 +30,10 @@
 		super(name);
 	}
 
-	
+
 	public void testLineBreakpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
@@ -41,7 +41,7 @@
 					newAnonTypeName = "a.b.c.MoveeChild$InnerChildType$NewAnonymousClass";
 			int lineNumber = 40,
 				newLineNumber = 44;
-			
+
 			//create breakpoint to test
 			IJavaLineBreakpoint breakpoint = createLineBreakpoint(lineNumber, src, pack, cunit, fullTargetName);
 			//refactor
@@ -59,16 +59,16 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
+	}//end testBreakPoint
 
 	public void testMethodBreakpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anonTypeMethod()V",
 					targetParentType = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
-					methodName = "anonTypeMethod",					
+					methodName = "anonTypeMethod",
 					newAnonTypeName = "a.b.c.MoveeChild$InnerChildType$NewAnonymousClass";
 			//create breakpoint to test
 			IJavaMethodBreakpoint breakpoint = createMethodBreakpoint(src, pack, cunit,fullTargetName, true, false);
@@ -88,17 +88,17 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	public void testWatchpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anAnonInt",
 					targetParentType = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
-					fieldName = "anAnonInt",					
+					fieldName = "anAnonInt",
 					newAnonTypeName = "a.b.c.MoveeChild$InnerChildType$NewAnonymousClass";
-						
+
 			//create breakpoint to test
 			IJavaWatchpoint breakpoint = createNestedTypeWatchPoint(src, pack, cunit, fullTargetName, true, true);
 			//refactor
@@ -116,17 +116,17 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-		
+	}//end testBreakPoint
+
 	public void testClassLoadpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
 					targetParentType = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
 					newAnonTypeName = "a.b.c.MoveeChild$InnerChildType$NewAnonymousClass";
-					
+
 			//create breakpoint to test
 			IJavaClassPrepareBreakpoint breakpoint = createClassPrepareBreakpoint(src, pack, cunit, fullTargetName);
 			//refactor
@@ -143,23 +143,23 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-			
-//////////////////////////////////////////////////////////////////////////////////////	
+	}//end testBreakPoint
+
+//////////////////////////////////////////////////////////////////////////////////////
 	private Refactoring setupRefactor(String root, String packageName, String cuName, String targetName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IType type = (IType)getMember(cunit,targetName);
-		
+
 		//IDocument compUnitSource = new Document(cunit.getSource());
-				
+
 		ISourceRange typeInfo = type.getSourceRange();
-		int target = typeInfo.getOffset(); 
-		
+		int target = typeInfo.getOffset();
+
 		ConvertAnonymousToNestedRefactoring ref= new ConvertAnonymousToNestedRefactoring(cunit, target, 0);
 		//configure the ref a little more here!
-		ref.setClassName("NewAnonymousClass");			
-		
+		ref.setClassName("NewAnonymousClass");
+
 		RefactoringStatus preconditionResult= ref.checkInitialConditions(new NullProgressMonitor());
 		if(!preconditionResult.isOK())
 		{
@@ -167,7 +167,7 @@
 			return null;
 		}
 		//configure the ref a little more here!
-		ref.setClassName("NewAnonymousClass");		
+		ref.setClassName("NewAnonymousClass");
 		return ref;
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertNonPublicAnonymousTypeToNestedUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertNonPublicAnonymousTypeToNestedUnitTests.java
index 44920ec..dd6e688 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertNonPublicAnonymousTypeToNestedUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertNonPublicAnonymousTypeToNestedUnitTests.java
@@ -29,10 +29,10 @@
 	public ConvertNonPublicAnonymousTypeToNestedUnitTests(String name) {
 		super(name);
 	}
-	
+
 	public void testLineBreakpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1",
@@ -40,7 +40,7 @@
 					newAnonTypeName = "a.b.c.NonPublicChildType$NewAnonymousClass";
 			int lineNumber = 56,
 				newLineNumber = 60;///////VERIFY NEW LINE NUMBER
-			
+
 			//create breakpoint to test
 			IJavaLineBreakpoint breakpoint = createLineBreakpoint(lineNumber, src, pack, cunit, fullTargetName);
 			//refactor
@@ -58,11 +58,11 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
+	}//end testBreakPoint
 
 	public void testMethodBreakpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anonTypeMethod()V",
@@ -87,17 +87,17 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	public void testWatchpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anAnonInt",
 					targetParentType = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					newAnonTypeName = "a.b.c.NonPublicChildType$NewAnonymousClass",
 					fieldName = "anAnonInt";
-						
+
 			//create breakpoint to test
 			IJavaWatchpoint breakpoint = createNestedTypeWatchPoint(src, pack, cunit, fullTargetName, true, true);
 			//refactor
@@ -115,17 +115,17 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-		
+	}//end testBreakPoint
+
 	public void testClassLoadpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					targetParentType = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					newAnonTypeName = "a.b.c.NonPublicChildType$NewAnonymousClass";
-					
+
 			//create breakpoint to test
 			IJavaClassPrepareBreakpoint breakpoint = createClassPrepareBreakpoint(src, pack, cunit, fullTargetName);
 			//refactor
@@ -142,23 +142,23 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-			
-//////////////////////////////////////////////////////////////////////////////////////	
+	}//end testBreakPoint
+
+//////////////////////////////////////////////////////////////////////////////////////
 	private Refactoring setupRefactor(String root, String packageName, String cuName, String targetName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IType type = (IType)getMember(cunit,targetName);
-		
+
 		//IDocument compUnitSource = new Document(cunit.getSource());
-				
+
 		ISourceRange typeInfo = type.getSourceRange();
-		int target = typeInfo.getOffset(); 
-		
+		int target = typeInfo.getOffset();
+
 		ConvertAnonymousToNestedRefactoring ref= new ConvertAnonymousToNestedRefactoring(cunit, target, 0);
 		//configure the ref a little more here!
-		ref.setClassName("ThisWillBeErased");//must have *A* name...			
-		
+		ref.setClassName("ThisWillBeErased");//must have *A* name...
+
 		//the below actually resets the refactoring fields to defaults.
 		RefactoringStatus preconditionResult= ref.checkInitialConditions(new NullProgressMonitor());
 		if(!preconditionResult.isOK())
@@ -167,7 +167,7 @@
 			return null;
 		}
 		//configure the actual new name
-		ref.setClassName("NewAnonymousClass");		
+		ref.setClassName("NewAnonymousClass");
 		return ref;
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertPublicAnonymousTypeToNestedUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertPublicAnonymousTypeToNestedUnitTests.java
index de761e5..c3b52eb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertPublicAnonymousTypeToNestedUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ConvertPublicAnonymousTypeToNestedUnitTests.java
@@ -32,7 +32,7 @@
 
 	public void testLineBreakpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V$1",
@@ -40,7 +40,7 @@
 					newAnonTypeName = "a.b.c.MoveeChild$NewAnonymousClass";
 			int lineNumber = 26,
 				newLineNumber = 30;
-			
+
 			//create breakpoint to test
 			IJavaLineBreakpoint breakpoint = createLineBreakpoint(lineNumber, src, pack, cunit, fullTargetName);
 			//refactor
@@ -58,16 +58,16 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
+	}//end testBreakPoint
 
 	public void testMethodBreakpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V$1$anonTypeMethod()QString",
 					targetParentType = "MoveeChild$childsMethod()V$1",
-					methodName = "anonTypeMethod",					
+					methodName = "anonTypeMethod",
 					newAnonTypeName = "a.b.c.MoveeChild$NewAnonymousClass";
 			//create breakpoint to test
 			IJavaMethodBreakpoint breakpoint = createMethodBreakpoint(src, pack, cunit,fullTargetName, true, false);
@@ -87,17 +87,17 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	public void testWatchpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V$1$anAnonInt",
 					targetParentType = "MoveeChild$childsMethod()V$1",
-					fieldName = "anAnonInt",					
+					fieldName = "anAnonInt",
 					newAnonTypeName = "a.b.c.MoveeChild$NewAnonymousClass";
-						
+
 			//create breakpoint to test
 			IJavaWatchpoint breakpoint = createNestedTypeWatchPoint(src, pack, cunit, fullTargetName, true, true);
 			//refactor
@@ -115,17 +115,17 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-		
+	}//end testBreakPoint
+
 	public void testClassLoadpoint() throws Exception {
 		try {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V$1",
 					targetParentType = "MoveeChild$childsMethod()V$1",
 					newAnonTypeName = "a.b.c.MoveeChild$NewAnonymousClass";
-			
+
 			//create breakpoint to test
 			IJavaClassPrepareBreakpoint breakpoint = createClassPrepareBreakpoint(src, pack, cunit, fullTargetName);
 			//refactor
@@ -142,20 +142,20 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testBreakPoint	
-			
+	}//end testBreakPoint
+
 	private Refactoring setupRefactor(String root, String packageName, String cuName, String targetName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IType type = (IType)getMember(cunit,targetName);
-		
+
 		ISourceRange typeInfo = type.getSourceRange();
-		int target = typeInfo.getOffset(); 
-		
+		int target = typeInfo.getOffset();
+
 		ConvertAnonymousToNestedRefactoring ref= new ConvertAnonymousToNestedRefactoring(cunit, target, 0);
 		//configure the ref a little more here!
-		ref.setClassName("NewAnonymousClass");			
-		
+		ref.setClassName("NewAnonymousClass");
+
 		RefactoringStatus preconditionResult= ref.checkInitialConditions(new NullProgressMonitor());
 		if(!preconditionResult.isOK())
 		{
@@ -163,7 +163,7 @@
 			return null;
 		}
 		//configure the ref a little more here!
-		ref.setClassName("NewAnonymousClass");		
+		ref.setClassName("NewAnonymousClass");
 		return ref;
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ExtractMethodUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ExtractMethodUnitTests.java
index 195ff56..a99f719 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ExtractMethodUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/ExtractMethodUnitTests.java
@@ -51,7 +51,7 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	public void testExtractionFromNonPublicType() throws Exception {
 		try {
 			int lineNumber = 40;
@@ -75,7 +75,7 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	public void testExtractionFromInternalType() throws Exception {
 		try {
 			int lineNumber = 29;
@@ -98,21 +98,21 @@
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testLineBreakPoint	
-	
-	
+	}//end testLineBreakPoint
+
+
 /////////////////////////////////////////
-	
+
 	private Refactoring setupRefactor(int lineNumber, String root, String targetPackageName, String cuName) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, targetPackageName, cuName);
-				
+
 		IDocument sourceCUnit = new Document(cunit.getSource());
-		IRegion lineInfo = sourceCUnit.getLineInformation(lineNumber-1);//-1 Document considers lineNumber different than createBreakpoint 
-						
+		IRegion lineInfo = sourceCUnit.getLineInformation(lineNumber-1);//-1 Document considers lineNumber different than createBreakpoint
+
 		ExtractMethodRefactoring ref= new ExtractMethodRefactoring(cunit,lineInfo.getOffset(), lineInfo.getLength());
-		
+
 		RefactoringStatus preconditionResult= ref.checkInitialConditions(new NullProgressMonitor());
 		if(!preconditionResult.isOK())
 		{
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/IntroduceParameterUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/IntroduceParameterUnitTests.java
index f2b26f7..0d05231 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/IntroduceParameterUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/IntroduceParameterUnitTests.java
@@ -73,7 +73,7 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	public void testExtractionFromInternalType() throws Exception {
 		try {
 			int lineNumber = 29;
@@ -89,26 +89,26 @@
 			assertTrue("Breakpoint Marker has ceased existing",methodBreakpoint.getMarker().exists());
 			assertEquals("wrong method Signature", "(QString;)V", methodBreakpoint.getMethodSignature());
 			assertEquals("wrong type name", "a.b.c.Movee$InnerType", methodBreakpoint.getTypeName());
-			assertEquals("breakpoint attached to wrong method","innerTypeMethod",methodBreakpoint.getMethodName());		
+			assertEquals("breakpoint attached to wrong method","innerTypeMethod",methodBreakpoint.getMethodName());
 		} catch (Exception e) {
 			throw e;
 		} finally {
 			removeAllBreakpoints();
 		}
-	}//end testLineBreakPoint	
-	
-//////////////////////////////////////////////////////////////////////////////////////	
+	}//end testLineBreakPoint
+
+//////////////////////////////////////////////////////////////////////////////////////
 	private Refactoring setupRefactor(int lineNumber, String root, String targetPackageName, String cuName) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, targetPackageName, cuName);
 		IDocument sourceCUnit = new Document(cunit.getSource());
 		IRegion lineInfo = sourceCUnit.getLineInformation(lineNumber-1);//-1 Document considers lineNumber different than createBreakpoint
 		int allowanceForBrackets = 4;
-		int itemOffset = lineInfo.getOffset() + lineInfo.getLength() - allowanceForBrackets; 
-						
+		int itemOffset = lineInfo.getOffset() + lineInfo.getLength() - allowanceForBrackets;
+
 		IntroduceParameterRefactoring ref= new IntroduceParameterRefactoring(cunit,itemOffset, 0);//0, no length
-		
+
 		RefactoringStatus preconditionResult= ref.checkInitialConditions(new NullProgressMonitor());
 		if(!preconditionResult.isOK())
 		{
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MemberParser.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MemberParser.java
index 66b1f0f..6d7badb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MemberParser.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MemberParser.java
@@ -32,7 +32,7 @@
 import org.eclipse.jdt.internal.core.SourceType;
 
 /**
- * Contains methods to find an IMember within a given path subdivided by the '$' character. 
+ * Contains methods to find an IMember within a given path subdivided by the '$' character.
  * Syntax:
  * Type$InnerType$MethodNameAndSignature$AnonymousTypeDeclarationNumber$FieldName
  * eg:<code>
@@ -43,7 +43,7 @@
  * 			{
  * 				Object anon = new Object(){
  * 					int anIntField;
- * 					String anonTypeMethod() {return "an Example";}				
+ * 					String anonTypeMethod() {return "an Example";}
  * 				}
  * 			}
  * 		}
@@ -54,7 +54,7 @@
  * eg:<code>1MyType</code>
  */
 public class MemberParser{
-	
+
 	/**
 	 * @param typeQualifiedName
 	 * @return
@@ -83,7 +83,7 @@
 			if(fragments[fragmentNum].containsJavaResources()){
 				ICompilationUnit cunits[] = fragments[fragmentNum].getCompilationUnits();
 				for (int cunitNum = 0; cunitNum < cunits.length; cunitNum++) {
-					results.add(cunits[cunitNum]);								
+					results.add(cunits[cunitNum]);
 				}
 			}
 		}
@@ -91,7 +91,7 @@
 			return null;
 		return results.toArray(new ICompilationUnit[results.size()]);
 	}
-	
+
 	/**
 	 * @param projects the scope of which you wish to return compilation units
 	 * @return a handle to all compilation units contained by the given projects
@@ -99,12 +99,12 @@
 	 */
 	private static ICompilationUnit[] getAllCompilationUnits(IProject[] projects)  throws JavaModelException{
 		return getAllCompilationUnits(getAllPackageFragments(projects));
-	}	
-	
+	}
+
 	private static ICompilationUnit[] getAllCompilationUnits(String packageName, IProject[] projects)throws JavaModelException {
 		return getAllCompilationUnits(getAllPackageFragments(packageName, projects));
-	}	
-	
+	}
+
 	/**
 	 * @param types
 	 * @return an array of all declared methods for the given types
@@ -113,7 +113,7 @@
 	private static IMethod[] getAllMethods(IType[] types) throws JavaModelException{
 		if(types==null)
 			return null;
-		
+
 		final Set<IMethod> results = new HashSet<IMethod>();
 		for (int typeNum = 0; typeNum < types.length; typeNum++) {
 			IMethod[] methods = types[typeNum].getMethods();
@@ -125,7 +125,7 @@
 			return null;
 		return results.toArray(new SourceMethod[results.size()]);
 	}
-	
+
 	/**
 	 * @param projects the scope of the return
 	 * @return all package fragments in the scope
@@ -152,7 +152,7 @@
 	private static IProject[] getAllProjects(){
 		return ResourcesPlugin.getWorkspace().getRoot().getProjects();
 	}
-	
+
 	/**
 	 * @param cunits the scope of the search
 	 * @return all types within the scope
@@ -161,7 +161,7 @@
 	private static IType[] getAllTypes(ICompilationUnit[] cunits) throws JavaModelException {
 		if(cunits == null)
 			return null;
-		
+
 		final Set<IType> results = new HashSet<IType>();
 		for (int cunitNum = 0; cunitNum < cunits.length; cunitNum++) {
 			IType types[] = cunits[cunitNum].getTypes(); //get all topLevel types
@@ -170,10 +170,10 @@
 			}
 		}
 		if(results.isEmpty())
-			return null;	   
+			return null;
 		return results.toArray(new IType[results.size()]);
 	}
-	
+
 	/**
 	 * @param methods the scope of the search
 	 * @return an array of all types declared within the given methods.
@@ -194,8 +194,8 @@
 			return null;
 		return results.toArray(new SourceType[results.size()]);
 	}
-	
-	/**Will search within the given type and all of it's children - including methods 
+
+	/**Will search within the given type and all of it's children - including methods
 	 * and anonymous types for other types.
 	 * @param types the scope of the search
 	 * @return all types within the given scope
@@ -223,11 +223,11 @@
 		//else
 		return results.toArray(new SourceType[results.size()]);//possibly change to new IType
 	}
-	
-	
+
+
 	/**
 	 * Returns the Java project with the given name.
-	 * 
+	 *
 	 * @param name project name
 	 * @return the Java project with the given name
 	 */
@@ -235,7 +235,7 @@
 		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject();
 		return JavaCore.create(project);
 	}
-	
+
 	/**
 	 * @param packageName name of the package
 	 * @param projects where to search
@@ -259,11 +259,11 @@
 		//else
 		return results.toArray(new IPackageFragment[results.size()]);
 	}
-	
+
 	private static IProject getProject(String projectName){
 		return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
 	}
-	
+
 	private static IType getType(ArrayList<String> typeList, ICompilationUnit[] cunits) throws JavaModelException{
 		IType[] types = getAllTypes(cunits);
 		//if 1st letter is a number, it's anonymous
@@ -295,20 +295,20 @@
 				else
 					typeNum++;//check the next type
 			}
-			
+
 			//else, it is not in the top-level types - check in methods
 			types = getAllTypes(getAllMethods(types));
 			if(types==null)
 				return null;//couldn't find it.
-		}//end while		
+		}//end while
 	}
-	
+
 	/**
-	 * Will search the workspace and return the requested type. The more information given, 
+	 * Will search the workspace and return the requested type. The more information given,
 	 * the faster the search
 	 * @param typeName the name of the type, with or without qualifiers - it cannot be null
-	 * 		e.g. "aType.innerType.1.typeInAnonymousType" or even just "typeInAnonymousType" 
-	 * 		or "innerType.1.typeInAnonymousType". 
+	 * 		e.g. "aType.innerType.1.typeInAnonymousType" or even just "typeInAnonymousType"
+	 * 		or "innerType.1.typeInAnonymousType".
 	 * @param packageName the elemental name of the package containing the given type - may be null
 	 * @param projectName the elemental name of the project containing the given type - may be null
 	 * @return the IType handle to the requested type
@@ -327,7 +327,7 @@
 		else{
 			projects = getAllProjects();
 		}
-		
+
 		//get the Comp.units for those projects
 		ICompilationUnit cunits[] = null;
 		if(packageName!=null && packageName.length()>0){
@@ -336,14 +336,14 @@
 		else{
 			cunits = getAllCompilationUnits(projects);
 		}
-		
+
 		return getType(typeList, cunits);
 	}
-	
-	
+
+
 	/**
 	 * @param cu the CompilationUnit containing the toplevel Type
-	 * @param target - the IMember target, listed in full Syntax, as noted in MemberParser 
+	 * @param target - the IMember target, listed in full Syntax, as noted in MemberParser
 	 * eg: EnclosingType$InnerType
 	 * @return the Lowest level inner type specified in input
 	 */
@@ -361,14 +361,14 @@
 		}
 		//has no inner type
 		return cu.getType(target);
-		
+
 	}
-	
+
 	/**
 	 * Helper method for getLowestType (ICompilationUnit cu, String input)
 	 * @param top name of enclosing Type
-	 * @param tail the typename, possibly including inner type, 
-	 * separated by $. 
+	 * @param tail the typename, possibly including inner type,
+	 * separated by $.
 	 * eg: EnclosingType$InnerType
 	 * @return the designated type, or null if type not found.
 	 */
@@ -376,10 +376,10 @@
 		String newtail = tail;
 		if(newtail==null || newtail.length()==0 )
 			return top;
-		
+
 		if(!top.exists())
 			return null;
-		
+
 		//check if there are more nested elements
 		String head=null;
 		for(int i=0;i<newtail.length();i++)
@@ -387,7 +387,7 @@
 			if(newtail.charAt(i)=='$')//nested Item?
 			{//Enclosing$Inner$MoreInner
 				head = newtail.substring(0,i);
-				newtail = newtail.substring(i+1);	
+				newtail = newtail.substring(i+1);
 				break;//found next item
 			}
 		}
@@ -396,19 +396,19 @@
 			head = newtail;
 			newtail = null;
 		}
-		
+
 		if(top instanceof IType)
 			return getNextFromType(top, head, newtail);
-		else 
+		else
 			if(top instanceof IMethod)
 				return getNextFromMethod(top, head, newtail);
 			else
 				if(top instanceof IField)
 					return getNextFromField(top, head, newtail);
 		//else there is a problem!
-		return getDeepest(top,newtail);			
+		return getDeepest(top,newtail);
 	}
-	
+
 	/**
 	 * @param head the string to parse for a name
 	 * @return the name in the type, given in the format "Occurance#Type"
@@ -421,11 +421,11 @@
 			{
 				return head.substring(i);
 			}
-			
+
 		}
-		return IInternalDebugCoreConstants.EMPTY_STRING;//entire thing is a number 
+		return IInternalDebugCoreConstants.EMPTY_STRING;//entire thing is a number
 	}
-	
+
 	/**
 	 * @param head the string to parse for an occurrence
 	 * @return the name in the type, given in the format "Occurance#Type"
@@ -439,7 +439,7 @@
 		}
 		return Integer.parseInt(head);//entire thing is a number
 	}
-	
+
 	/**
 	 * @param head name of method w/ signature at the end
 	 * @return simply the name of the given method, using format:
@@ -454,7 +454,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * @param top the field in which to search
 	 * @param head the next member to find
@@ -463,14 +463,14 @@
 	 */
 	protected IMember getNextFromField(IMember top, String head, String tail) {
 		IField current = (IField)top;
-		
+
 		IType type = current.getType(getLocalTypeName(head),getLocalTypeOccurrence(head));
-		if(type.exists())	
+		if(type.exists())
 			return getDeepest(type,tail);
 		//else
-		return null;//something failed.								
+		return null;//something failed.
 	}
-	
+
 	/**
 	 * @param top the member in which to search
 	 * @param head the next member to find
@@ -480,15 +480,15 @@
 	protected IMember getNextFromMethod(IMember top, String head, String tail) {
 		//must be a local or anonymous type
 		IMethod current = (IMethod)top;
-		
+
 		//is next part a Type?
 		IType type = current.getType(getLocalTypeName(head), getLocalTypeOccurrence(head));
-		if(type.exists())	
+		if(type.exists())
 			return getDeepest(type,tail);
 		//else
 		return null;
 	}
-	
+
 	/**
 	 * @param top the member in which to search
 	 * @param head the next member to find
@@ -497,10 +497,10 @@
 	 */
 	protected IMember getNextFromType(IMember top, String head, String tail) {
 		IType current = (IType)top;
-		
+
 		//is next part a Type?
 		IMember next = current.getType(head);
-		if(next.exists())	
+		if(next.exists())
 			return getDeepest(next,tail);
 		//else, is next part a Field?
 		next = current.getField(head);
@@ -513,7 +513,7 @@
 		//else
 		return null;//something failed.
 	}
-	
+
 	/**
 	 * @param head name of method w/ signature at the end
 	 * @return simply the ParameterTypeSignature, using format:
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveCompilationUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveCompilationUnitTests.java
index 5acd60a..bd36ecf 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveCompilationUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveCompilationUnitTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,28 +26,28 @@
 import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgDestinationFactory;
 import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory;
 import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MoveCompilationUnitTests extends AbstractRefactoringDebugTest {
 
 	public MoveCompilationUnitTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Performs a move refactoring.
-	 * 
+	 *
 	 * @param element element to move
 	 * @param destination destination of move
 	 * @throws Exception
 	 */
 	protected void move(IJavaElement element, IJavaElement destination) throws Exception {
 		IMovePolicy movePolicy= ReorgPolicyFactory.createMovePolicy(
-				new IResource[0], 
+				new IResource[0],
 				new IJavaElement[] {element});
 		JavaMoveProcessor processor= new JavaMoveProcessor(movePolicy);
 		processor.setDestination(ReorgDestinationFactory.createDestination(destination));
@@ -55,9 +55,9 @@
 		if(processor.canUpdateJavaReferences()) {
 			processor.setUpdateReferences(true);
 		}
-		performRefactor(new MoveRefactoring(processor));			
+		performRefactor(new MoveRefactoring(processor));
 	}
-	
+
 	/**
 	 * Tests if a LineBreakPoint was moved appropriately.
 	 * @throws Exception
@@ -82,19 +82,19 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	/**
 	 * Tests if a MethodBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */	
+	 */
 	public void testMethodBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-				
+
 		try {
 			//create an EntryMethod Breakpoint to test
 			createMethodBreakpoint("a.b.c.Movee", "testMethod1", "()V", true, false);
-			IPackageFragment destination= getPackageFragmentRoot(javaProject, "src").createPackageFragment("a.b", false, null); 
+			IPackageFragment destination= getPackageFragmentRoot(javaProject, "src").createPackageFragment("a.b", false, null);
 			move(cunit, destination);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
@@ -105,22 +105,22 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests if a WatchPointBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */		
+	 */
 	public void testWatchPointBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-				
+
 		try {
 			//create a watchPoint to test
 			createWatchpoint("a.b.c.Movee", "anInt", true, true);
-			IPackageFragment destination= getPackageFragmentRoot(javaProject, "src").createPackageFragment("a.b", false, null); 
-			move(cunit, destination);	
+			IPackageFragment destination= getPackageFragmentRoot(javaProject, "src").createPackageFragment("a.b", false, null);
+			move(cunit, destination);
 			IBreakpoint[] breakPoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of watchpoints", 1, breakPoints .length);
 			IJavaWatchpoint watchPoint = (IJavaWatchpoint) breakPoints [0];
@@ -130,21 +130,21 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}			
+		}
 	}
-	
+
 	/**
 	 * Tests if a ClassLoadBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */			
+	 */
 	public void testClassLoadBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-				
+
 		try {
 			//create a classLoad breakpoint to test
 			createClassPrepareBreakpoint("a.b.c.Movee");
-			IPackageFragment destination= getPackageFragmentRoot(javaProject, "src").createPackageFragment("a.b", false, null); 
+			IPackageFragment destination= getPackageFragmentRoot(javaProject, "src").createPackageFragment("a.b", false, null);
 			move(cunit, destination);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
@@ -154,6 +154,6 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}				
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveFieldUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveFieldUnitTests.java
index c08ad8f..894665f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveFieldUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveFieldUnitTests.java
@@ -16,33 +16,33 @@
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.debug.core.IJavaWatchpoint;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MoveFieldUnitTests extends MoveRefactoringTest {
 
 	public MoveFieldUnitTests(String name) {
 		super(name);
 	}
-		
+
 	/**
 	 * Tests if a WatchPointBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */		
+	 */
 	public void testPublicTypeFieldMove() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IJavaElement type = cunit.getType("Movee").getField("anInt");
-			
+
 		try {
 			//create a watchPoint to test
 			createWatchpoint("a.b.c.Movee", "anInt", true, true);
-			
-			refactor(javaProject, type);		
-			
+
+			refactor(javaProject, type);
+
 			IBreakpoint[] breakPoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of watchpoints", 1, breakPoints .length);
 			IJavaWatchpoint watchPoint = (IJavaWatchpoint) breakPoints [0];
@@ -52,24 +52,24 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}			
+		}
 	}
-	
+
 	/**
 	 * Tests if a WatchPointBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */		
+	 */
 	public void testInnerTypeFieldMove() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IJavaElement type = cunit.getType("Movee").getType("InnerType").getField("innerTypeInt");
-			
+
 		try {
 			//create a watchPoint to test
 			createWatchpoint("a.b.c.Movee.InnerType", "innerTypeInt", true, true);
-			
-			refactor(javaProject, type);		
-			
+
+			refactor(javaProject, type);
+
 			IBreakpoint[] breakPoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of watchpoints", 1, breakPoints .length);
 			IJavaWatchpoint watchPoint = (IJavaWatchpoint) breakPoints [0];
@@ -79,24 +79,24 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}			
+		}
 	}
-	
+
 	/**
 	 * Tests if a WatchPointBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */		
+	 */
 	public void testNonPublicTypeFieldMove() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IJavaElement type = cunit.getType("NonPublicType").getField("differentInt");
-			
+
 		try {
 			//create a watchPoint to test
 			createWatchpoint("a.b.c","Movee.java", "NonPublicType", "differentInt", true, true);
-			
-			refactor(javaProject, type);		
-			
+
+			refactor(javaProject, type);
+
 			IBreakpoint[] breakPoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of watchpoints", 1, breakPoints .length);
 			IJavaWatchpoint watchPoint = (IJavaWatchpoint) breakPoints [0];
@@ -106,6 +106,6 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}			
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeMethodUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeMethodUnitTests.java
index 15c26f2..520175c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeMethodUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeMethodUnitTests.java
@@ -18,11 +18,11 @@
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MoveInnerTypeMethodUnitTests extends MoveRefactoringTest {
 
@@ -42,7 +42,7 @@
 			int newLineNumber = 20;
 			//create lineBreakpoint to test
 			createLineBreakpoint(lineNumber, "a.b.c.Movee$InnerType");
-			refactor(javaProject, type);		
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaLineBreakpoint lineBreakpoint = (IJavaLineBreakpoint) breakpoints[0];
@@ -55,20 +55,20 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	/**
 	 * Tests if a MethodBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */	
+	 */
 	public void testMethodBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IJavaElement type = cunit.getType("Movee").getType("InnerType").getMethods()[0];
-			
+
 		try {
 			//create an EntryMethod Breakpoint to test & do so
 			createMethodBreakpoint("a.b.c.Movee$InnerType", "innerTypeMethod", "()V", true, false);
-			refactor(javaProject, type);	
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0];
@@ -78,7 +78,7 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}		
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeToNewFileUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeToNewFileUnitTests.java
index 3c1ff7a..6932cb0 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeToNewFileUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeToNewFileUnitTests.java
@@ -49,8 +49,8 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
-	
+
+
 	public void testMethodBreakPoint() throws Exception {
 		try {
 			//create Breakpoint to test
@@ -70,7 +70,7 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	public void testWatchPoint() throws Exception {
 		try {
 			//create Breakpoint to test
@@ -90,7 +90,7 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	public void testClassLoadBreakPoint() throws Exception {
 		try {
 			//create Breakpoint to test
@@ -109,12 +109,12 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-	
+
 	private Refactoring setupRefactor(String parentClassName, String className, String root, String targetPackageName, String cuName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		IType parentClas= getCompilationUnit(javaProject, root, targetPackageName, cuName).getType(parentClassName);
 		IType clas= parentClas.getType(className);
-		
+
 		MoveInnerToTopRefactoring ref= new MoveInnerToTopRefactoring(clas, JavaPreferencesSettings.getCodeGenerationSettings(clas.getJavaProject()));
 		ref.checkInitialConditions(new NullProgressMonitor());
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeUnitTests.java
index 40f4e15..939946b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveInnerTypeUnitTests.java
@@ -19,11 +19,11 @@
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaWatchpoint;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MoveInnerTypeUnitTests extends MoveRefactoringTest {
 
@@ -42,7 +42,7 @@
 			int lineNumber = 38;
 			//create lineBreakpoint to test
 			createLineBreakpoint(lineNumber, "a.b.c.Movee$InnerType");
-			refactor(javaProject, type);		
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaLineBreakpoint lineBreakpoint = (IJavaLineBreakpoint) breakpoints[0];
@@ -55,20 +55,20 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	/**
 	 * Tests if a MethodBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */	
+	 */
 	public void testMethodBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IType type = cunit.getType("Movee").getType("InnerType");
-		
+
 		try {
 			//create an EntryMethod Breakpoint to test & do so
 			createMethodBreakpoint("a.b.c.Movee$InnerType", "innerTypeMethod", "()V", true, false);
-			refactor(javaProject, type);	
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0];
@@ -78,21 +78,21 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests if a WatchPointBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */		
+	 */
 	public void testWatchPointBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-		IType type = cunit.getType("Movee").getType("InnerType");		
+		IType type = cunit.getType("Movee").getType("InnerType");
 		try {
 			//create a watchPoint to test
 			createWatchpoint("a.b.c.Movee$InnerType", "innerTypeInt", true, true);
-			refactor(javaProject, type);		
+			refactor(javaProject, type);
 			IBreakpoint[] breakPoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of watchpoints", 1, breakPoints .length);
 			IJavaWatchpoint watchPoint = (IJavaWatchpoint) breakPoints [0];
@@ -102,24 +102,24 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}			
+		}
 	}
-	
+
 	/**
 	 * Tests if a ClassLoadBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */			
+	 */
 	public void testClassLoadBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-		IType type = cunit.getType("Movee").getType("InnerType");		
-		
+		IType type = cunit.getType("Movee").getType("InnerType");
+
 		try {
 			//create a classLoad breakpoint to test
 			createClassPrepareBreakpoint("a.b.c.Movee$InnerType");
-			
-			refactor(javaProject, type);	
-			
+
+			refactor(javaProject, type);
+
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaClassPrepareBreakpoint classPrepareBreakpoint = (IJavaClassPrepareBreakpoint) breakpoints[0];
@@ -128,6 +128,6 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}				
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeMethodUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeMethodUnitTests.java
index b8a3f98..30bc260 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeMethodUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeMethodUnitTests.java
@@ -18,11 +18,11 @@
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MoveNonPublicTypeMethodUnitTests extends MoveRefactoringTest {
 
@@ -42,7 +42,7 @@
 			int newLineNumber = 20;
 			//create lineBreakpoint to test
 			createLineBreakpoint(lineNumber,"a.b.c","Movee.java","NonPublicType");
-			refactor(javaProject, type);		
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaLineBreakpoint lineBreakpoint = (IJavaLineBreakpoint) breakpoints[0];
@@ -55,20 +55,20 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	/**
 	 * Tests if a MethodBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */	
+	 */
 	public void testMethodBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IJavaElement type = cunit.getType("NonPublicType").getMethods()[0];//1st method is nonPublicMethod
-		
+
 		try {
 			//create an EntryMethod Breakpoint to test & do so
 			createMethodBreakpoint("a.b.c","Movee.java","NonPublicType","nonPublicMethod","()V",true, false);
-			refactor(javaProject, type);	
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0];
@@ -78,7 +78,7 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeUnitTests.java
index 1f5133e..5c17e4d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveNonPublicTypeUnitTests.java
@@ -19,11 +19,11 @@
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaWatchpoint;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MoveNonPublicTypeUnitTests extends MoveRefactoringTest {
 
@@ -42,7 +42,7 @@
 			int lineNumber = 31;
 			//create lineBreakpoint to test
 			createLineBreakpoint(lineNumber,"a.b.c","Movee.java","NonPublicType");
-			refactor(javaProject, type);		
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaLineBreakpoint lineBreakpoint = (IJavaLineBreakpoint) breakpoints[0];
@@ -55,20 +55,20 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	/**
 	 * Tests if a MethodBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */	
+	 */
 	public void testMethodBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IType type = cunit.getType("NonPublicType");
-		
+
 		try {
 			//create an EntryMethod Breakpoint to test & do so
 			createMethodBreakpoint("a.b.c","Movee.java","NonPublicType","nonPublicMethod","()V",true, false);
-			refactor(javaProject, type);	
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0];
@@ -78,23 +78,23 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests if a WatchPointBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */		
+	 */
 	public void testWatchPointBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-		IType type = cunit.getType("NonPublicType");		
+		IType type = cunit.getType("NonPublicType");
 		try {
 			//create a watchPoint to test
 			createNestedTypeWatchPoint("src", "a.b.c", "Movee.java", "NonPublicType$differentInt", true, true);
-			
-			refactor(javaProject, type);		
-			
+
+			refactor(javaProject, type);
+
 			IBreakpoint[] breakPoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of watchpoints", 1, breakPoints .length);
 			IJavaWatchpoint watchPoint = (IJavaWatchpoint) breakPoints [0];
@@ -104,24 +104,24 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}			
+		}
 	}
-	
+
 	/**
 	 * Tests if a ClassLoadBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */			
+	 */
 	public void testClassLoadBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
-		IType type = cunit.getType("NonPublicType");		
-		
+		IType type = cunit.getType("NonPublicType");
+
 		try {
 			//create a classLoad breakpoint to test
 			createClassPrepareBreakpoint("a.b.c","Movee.java","NonPublicType");
-			
-			refactor(javaProject, type);	
-			
+
+			refactor(javaProject, type);
+
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaClassPrepareBreakpoint classPrepareBreakpoint = (IJavaClassPrepareBreakpoint) breakpoints[0];
@@ -130,6 +130,6 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}				
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MovePublicTypeMethodUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MovePublicTypeMethodUnitTests.java
index 54bdb68..16c84f0 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MovePublicTypeMethodUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MovePublicTypeMethodUnitTests.java
@@ -18,11 +18,11 @@
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint;
-// 
+//
 //then check number of and location of created breakpoint
 /**
- * A set of tests which moves a CompilationUnit and verifies if 
- * various breakpoints associated with that C.U. were moved. 
+ * A set of tests which moves a CompilationUnit and verifies if
+ * various breakpoints associated with that C.U. were moved.
  */
 public class MovePublicTypeMethodUnitTests extends MoveRefactoringTest {
 
@@ -42,7 +42,7 @@
 			int newLineNumber = 19;
 			//create lineBreakpoint to test
 			createLineBreakpoint(lineNumber, "a.b.c.Movee");
-			refactor(javaProject, type);		
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaLineBreakpoint lineBreakpoint = (IJavaLineBreakpoint) breakpoints[0];
@@ -55,20 +55,20 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
+
 	/**
 	 * Tests if a MethodBreakPoint was moved appropriately.
 	 * @throws Exception
-	 */	
+	 */
 	public void testMethodBreakPoint() throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit= getCompilationUnit(javaProject, "src", "a.b.c", "Movee.java");
 		IJavaElement type = cunit.getType("Movee").getMethods()[0];
-		
+
 		try {
 			//create an EntryMethod Breakpoint to test & do so
 			createMethodBreakpoint("a.b.c.Movee", "testMethod1", "()V", true, false);
-			refactor(javaProject, type);	
+			refactor(javaProject, type);
 			IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints();
 			assertEquals("wrong number of breakpoints", 1, breakpoints.length);
 			IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0];
@@ -78,6 +78,6 @@
 			throw e;
 		} finally {
 			removeAllBreakpoints();
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveRefactoringTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveRefactoringTest.java
index e470673..5debf3d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveRefactoringTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/MoveRefactoringTest.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 
 /**
  * Common code for setting up and performing a move refactoring.
- * 
+ *
  * @since 3.4
  */
 public class MoveRefactoringTest extends AbstractRefactoringDebugTest {
@@ -42,17 +42,17 @@
 	 */
 	protected JavaMoveProcessor setupRefactor(IJavaProject javaProject, IJavaElement type) throws JavaModelException {
 		IMovePolicy movePolicy= ReorgPolicyFactory.createMovePolicy(
-				new IResource[0], 
+				new IResource[0],
 				new IJavaElement[] {type});
 		JavaMoveProcessor processor= new JavaMoveProcessor(movePolicy);
-		IJavaElement destination= getPackageFragmentRoot(javaProject, "src").getPackageFragment("a.b").getCompilationUnit("MoveeRecipient.java"); 
+		IJavaElement destination= getPackageFragmentRoot(javaProject, "src").getPackageFragment("a.b").getCompilationUnit("MoveeRecipient.java");
 		processor.setDestination(ReorgDestinationFactory.createDestination(destination));
 		processor.setReorgQueries(new MockReorgQueries());
 		if(processor.canUpdateJavaReferences())
 			processor.setUpdateReferences(true);//assuming is properly set otherwise
 		return processor;
 	}
-	
+
 	/** Sets up a refactoring and executes it.
 	 * @param javaProject
 	 * @param cunit
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownFieldUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownFieldUnitTests.java
index 4cd97f9..d010b9d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownFieldUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownFieldUnitTests.java
@@ -45,10 +45,10 @@
 			removeAllBreakpoints();
 		}
 	}
-		
-	
+
+
 /////////////////////////////////////////
-	
+
 	/**
 	 * @param parentClassName
 	 * @param className
@@ -59,11 +59,11 @@
 	 * @throws Exception
 	 */
 	private Refactoring setupRefactor(String parentClassName, String className, String root, String targetPackageName, String cuName) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		IType parentClas= getCompilationUnit(javaProject, root, targetPackageName, cuName).getType(parentClassName);
 		IField clas= parentClas.getField("anInt");
-		
+
         PushDownRefactoringProcessor processor = new PushDownRefactoringProcessor(new IField[] {clas});
 		ProcessorBasedRefactoring ref= new ProcessorBasedRefactoring(processor);
 		ref.checkInitialConditions(new NullProgressMonitor());
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownMethodUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownMethodUnitTests.java
index 2916480..6e4db05 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownMethodUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/PushDownMethodUnitTests.java
@@ -49,8 +49,8 @@
 			removeAllBreakpoints();
 		}
 	}//end testLineBreakPoint
-	
-	
+
+
 	public void testMethodBreakPoint() throws Exception {
 		try {
 			//create Breakpoint to test
@@ -70,8 +70,8 @@
 			removeAllBreakpoints();
 		}
 	}//end testBreakPoint
-		
-	
+
+
 	private Refactoring setupRefactor(String parentClassName, String className, String root, String targetPackageName, String cuName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		IType parentClas= getCompilationUnit(javaProject, root, targetPackageName, cuName).getType(parentClassName);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameCompilationUnitUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameCompilationUnitUnitTests.java
index 442a245..d572b02 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameCompilationUnitUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameCompilationUnitUnitTests.java
@@ -57,7 +57,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -87,7 +87,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -147,47 +147,47 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	private Refactoring setupRefactor(String root, String packageName, String cuName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		JavaRenameProcessor proc = new RenameCompilationUnitProcessor(cunit);
 		proc.setNewElementName("RenamedCompilationUnit.java");
 		RenameRefactoring ref= new RenameRefactoring(proc);
-		
+
 		//setup final refactoring conditions
 		RefactoringStatus refactoringStatus= ref.checkAllConditions(new NullProgressMonitor());
 		if(!refactoringStatus.isOK())
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
-	
+
 	public void testInnerAnonmyousTypeClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType$1";
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage);
-	}//end testBreakPoint	
+	}//end testBreakPoint
 
 	public void testInnerAnonymousTypeLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType$1";
 			int lineNumber = 40;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, lineNumber);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerAnonymousTypeMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anonTypeMethod()V",
@@ -195,126 +195,126 @@
 					methodName = "anonTypeMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, methodName);
 	}//end testBreakPoint
-	
+
 	public void testInnerAnonymousTypeWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anAnonInt",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType$1",
 					fieldName = "anAnonInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, newTargetLineage, fieldName);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType";
-	
+
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testInnerLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType";
 			int lineNumber = 35;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, lineNumber);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType",
 					methodName = "innerChildsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, methodName);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildInt",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit$InnerChildType",
 					fieldName = "innerChildInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, newTargetLineage, fieldName);
-	}//end testBreakPoint		
+	}//end testBreakPoint
 
 	public void testNonPublicAnonymousTypeClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					newTargetLineage = pack+"."+"NonPublicChildType$1";
-	
+
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testNonPublicAnonymousTypeLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					newTargetLineage = pack+"."+"NonPublicChildType$1";
 			int lineNumber = 56;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, lineNumber);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testNonPublicAnonymousTypeMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anonTypeMethod()V",
 					newTargetLineage = pack+"."+"NonPublicChildType$1",
 					methodName = "anonTypeMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, methodName);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testNonPublicAnonymousTypeWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anAnonInt",
 					newTargetLineage = pack+"."+"NonPublicChildType$1",
 					fieldName = "anAnonInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, newTargetLineage, fieldName);
-	}//end testBreakPoint	
-		
+	}//end testBreakPoint
+
 	public void testNonPublicClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType",
 					newTargetLineage = pack+"."+"NonPublicChildType";
-	
-					
+
+
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage);
-	}//end testBreakPoint			
-	
+	}//end testBreakPoint
+
 	public void testNonPublicLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType",
 					newTargetLineage = pack+"."+"NonPublicChildType";
 			int lineNumber = 51;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, lineNumber);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testNonPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$",
@@ -324,100 +324,100 @@
 	}//end testBreakPoint
 
 	public void testNonPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildInt",
 					newTargetLineage = pack+"."+"NonPublicChildType",
 					fieldName = "nonPublicChildInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, newTargetLineage, fieldName);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testPublicAnonymousTypeClassLoadpoint() throws Exception {
-		
-		String 	src = "src", 
+
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1",
 		newTargetLineage = pack+"."+"RenamedCompilationUnit$1";
 
 		runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicAnonymousTypeLineBreakpoint() throws Exception {
-					
-		String 	src = "src", 
+
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1",
 		newTargetLineage = pack+"."+"RenamedCompilationUnit$1";
 		int lineNumber = 26;
-		
+
 		runLineBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, lineNumber);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicAnonymousTypeMethodBreakpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1$anonTypeMethod()V",
 		newTargetLineage = pack+"."+"RenamedCompilationUnit$1",
 		methodName = "anonTypeMethod";
-		
+
 		runMethodBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, methodName);
 	}//end testBreakPoint
-			
+
 	public void testPublicAnonymousTypeWatchpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1$anAnonInt",
 		newTargetLineage = pack+"."+"RenamedCompilationUnit$1",
 		fieldName = "anAnonInt";
-			
+
 		runWatchPointTest(src, pack, cunit, fullTargetName, newTargetLineage, fieldName);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit";
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 public void testPublicLineBreakpoint() throws Exception {
 
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit";
 			int lineNumber = 21;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, lineNumber);
-	}//end testBreakPoint			
-	
+	}//end testBreakPoint
+
 	public void testPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit",
 					methodName = "childsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, newTargetLineage, methodName);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$aChildInt",
 					newTargetLineage = pack+"."+"RenamedCompilationUnit",
 					fieldName = "aChildInt";
 			runWatchPointTest(src, pack, cunit, fullTargetName, newTargetLineage, fieldName);
-	}//end testBreakPoint			
-	
+	}//end testBreakPoint
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameFieldUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameFieldUnitTests.java
index 214a915..d70ff3b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameFieldUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameFieldUnitTests.java
@@ -57,87 +57,87 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	protected Refactoring setupRefactor(String root, String packageName, String cuName, String fullTargetName) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IField field = (IField)getMember(cunit, fullTargetName);
 		JavaRenameProcessor proc = new RenameFieldProcessor(field);
 		proc.setNewElementName("renamedField");
-		
+
 		RenameRefactoring ref= new RenameRefactoring(proc);
-		
+
 		//setup final refactoring conditions
 		RefactoringStatus refactoringStatus= ref.checkAllConditions(new NullProgressMonitor());
 		if(!refactoringStatus.isOK())
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
-	
-	//////////////////////////////////////////////////////////////////////////////////////	
-	
+
+	//////////////////////////////////////////////////////////////////////////////////////
+
 	public void testInnerAnonymousTypeWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anAnonInt",
 					targetLineage = pack+"."+"MoveeChild$InnerChildType$1";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildInt",
 					targetLineage = pack+"."+"MoveeChild$InnerChildType";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint		
+	}//end testBreakPoint
 
 	public void testNonPublicAnonymousTypeWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anAnonInt",
 					targetLineage = pack+"."+"NonPublicChildType$1";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint	
-		
+	}//end testBreakPoint
+
 	public void testNonPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildInt",
 					targetLineage = pack+"."+"NonPublicChildType";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testPublicAnonymousTypeWatchpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1$anAnonInt",
 		targetLineage = pack+"."+"MoveeChild$1";
-			
+
 		runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$aChildInt",
 					targetLineage = pack+"."+"MoveeChild";
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint			
-	
+	}//end testBreakPoint
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameInnerTypeUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameInnerTypeUnitTests.java
index 451b133..15546e1 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameInnerTypeUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameInnerTypeUnitTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -60,7 +60,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -90,7 +90,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -150,9 +150,9 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * @param root
 	 * @param packageName
 	 * @param cuName
@@ -167,7 +167,7 @@
 		//if this was a non-typed test, get's it's parent type
 		if(!(target instanceof IType))
 			target = (IMember)target.getParent();
-		
+
 		IType targetType = (IType)target;
 		JavaRenameProcessor proc = new RenameTypeProcessor(targetType);
 		proc.setNewElementName("RenamedType");
@@ -178,58 +178,58 @@
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
-	
+
 	//////////////////////////////////////////////////////////////////////////////////////
-	
+
 	public void testInnerClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType",
 					targetLineage = "MoveeChild$RenamedType";
-	
+
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testInnerLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType",
 					targetLineage = "MoveeChild$RenamedType";
 			int lineNumber = 35;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V",
 					targetLineage = "MoveeChild$RenamedType",
 					methodName = "innerChildsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
-	}//end testBreakPoint	
-	
+	}//end testBreakPoint
+
 	public void testInnerWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildInt",
 					targetLineage = "MoveeChild$RenamedType",
 					fieldName = "innerChildInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}//end testBreakPoint		
+	}//end testBreakPoint
 
 
 	/**
-	 * Creates an exception breakpoint and adds a filter. Refactors & checks 
+	 * Creates an exception breakpoint and adds a filter. Refactors & checks
 	 * if the filter changed appropriately w/ the refactor.
 	 * @param src
 	 * @param pack
@@ -259,11 +259,11 @@
 
 
 	public void testPublicExceptionBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					refactoringTargetName = "MoveeChild$InnerChildType",
 					exceptionName = "java.lang.NullPointerException";
 			runExceptionBreakpointTest(src, pack, cunit, refactoringTargetName,exceptionName);
-	}//end testBreakPoint		
+	}//end testBreakPoint
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameMethodUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameMethodUnitTests.java
index d31210a..4d79a00 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameMethodUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameMethodUnitTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 	public RenameMethodUnitTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -60,7 +60,7 @@
 	}
 
 	/**
-	 * Will setup the refactoring for Methods and members declared within 
+	 * Will setup the refactoring for Methods and members declared within
 	 * members (i.e. members of anonymous classes)
 	 * @param root
 	 * @param packageName
@@ -70,30 +70,30 @@
 	 * @throws Exception
 	 */
 	protected Refactoring setupRefactor(String root, String packageName, String cuName, String fullName) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IMember member = getMember(cunit, fullName);
 		IMethod method = (IMethod)member;
-		
+
 		JavaRenameProcessor proc = new RenameNonVirtualMethodProcessor(method);
 		proc.setNewElementName("renamedMethod");
-		
+
 		RenameRefactoring ref= new RenameRefactoring(proc);
-		
+
 		//setup final refactoring conditions
 		RefactoringStatus refactoringStatus= ref.checkAllConditions(new NullProgressMonitor());
 		if(!refactoringStatus.isOK())
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
 
 	public void testInnerAnonymousTypeMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anonTypeMethod()V",
@@ -102,49 +102,49 @@
 	}//end testBreakPoint
 
 	public void testInnerMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V",
 					targetLineage = pack+"."+"MoveeChild$InnerChildType";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint	
+	}//end testBreakPoint
 
 	public void testNonPublicAnonymousTypeMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anonTypeMethod()V",
 					targetLineage = pack+"."+"NonPublicChildType$1";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint		
+	}//end testBreakPoint
 
 	public void testNonPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$",
 					targetLineage = pack+"."+"NonPublicChildType";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
 	}//end testBreakPoint
-	
+
 	public void testPublicAnonymousTypeMethodBreakpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1$anonTypeMethod()V",
 		targetLineage = pack+"."+"MoveeChild$1";
-		
+
 		runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
 	}//end testBreakPoint
 
 	public void testPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V",
 					targetLineage = pack+"."+"MoveeChild";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameNonPublicTypeUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameNonPublicTypeUnitTests.java
index 527d5ae..86e8c7b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameNonPublicTypeUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenameNonPublicTypeUnitTests.java
@@ -32,7 +32,7 @@
 	public RenameNonPublicTypeUnitTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -61,7 +61,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -92,7 +92,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -154,9 +154,9 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * @param root
 	 * @param packageName
 	 * @param cuName
@@ -166,75 +166,75 @@
 	 */
 	protected Refactoring setupRefactor(String root, String packageName, String cuName,
 			String type) throws Exception {
-		
+
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
 		IMember target = getMember(cunit, type);
 		//if this was a non-typed test, get's it's parent type
 		if(!(target instanceof IType))
 			target = (IMember)target.getParent();
-		
+
 		IType targetType = (IType)target;
-				
+
 		JavaRenameProcessor proc = new RenameTypeProcessor(targetType);
 		proc.setNewElementName("RenamedType");
-			
+
 		RenameRefactoring ref= new RenameRefactoring(proc);
-		
+
 		//setup final refactoring conditions
 		RefactoringStatus refactoringStatus= ref.checkAllConditions(new NullProgressMonitor());
 		if(!refactoringStatus.isOK())
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
-	
+
 	//////////////////////////////////////////////////////////////////////////////////////
-	
+
 	public void testNonPublicClassLoadpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 				pack = "a.b.c",
 				cunit = "MoveeChild.java",
 				fullTargetName = "NonPublicChildType";
 
 		runClassLoadBreakpointTest(src, pack, cunit, fullTargetName);
-	}//end testBreakPoint			
-	
+	}//end testBreakPoint
+
 	public void testNonPublicLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType";
 			int lineNumber = 51;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, lineNumber);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testNonPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V",
 					methodName = "nonPublicChildsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, methodName);
 	}//end testBreakPoint
-	
+
 	public void testNonPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildInt",
 					fieldName = "nonPublicChildInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, fieldName);
-	}//end testBreakPoint	
+	}//end testBreakPoint
 
 
 	/**
-	 * Creates an exception breakpoint and adds a filter. Refactors & checks 
+	 * Creates an exception breakpoint and adds a filter. Refactors & checks
 	 * if the filter changed appropriately w/ the refactor.
 	 * @param src
 	 * @param pack
@@ -266,11 +266,11 @@
 
 
 	public void testPublicExceptionBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					targetName = "MoveeChild";
 			runExceptionBreakpointTest(src, pack, cunit, targetName);
-	}//end testBreakPoint		
-		
+	}//end testBreakPoint
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePackageUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePackageUnitTests.java
index 9cc9b31..4b30f62 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePackageUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePackageUnitTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,7 +32,7 @@
 	public RenamePackageUnitTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -60,7 +60,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -90,7 +90,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -150,7 +150,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	protected Refactoring setupRefactor(String root, String packageName, String cuName) throws Exception {
 		IJavaProject javaProject = get14Project();
 		ICompilationUnit cunit = getCompilationUnit(javaProject, root, packageName, cuName);
@@ -158,42 +158,42 @@
 		JavaRenameProcessor proc = new RenamePackageProcessor(packageFragment);
 		proc.setNewElementName("renamedPackage");
 		RenameRefactoring ref= new RenameRefactoring(proc);
-		
+
 		//setup final refactoring conditions
 		RefactoringStatus refactoringStatus= ref.checkAllConditions(new NullProgressMonitor());
 		if(!refactoringStatus.isOK())
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
-	
-	//////////////////////////////////////////////////////////////////////////////////////	
-	
+
+	//////////////////////////////////////////////////////////////////////////////////////
+
 	public void testInnerAnonmyousTypeClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType$1";
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}	
+	}
 
 	public void testInnerAnonymousTypeLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType$1";
 			int lineNumber = 40;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}	
-	
+	}
+
 	public void testInnerAnonymousTypeMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anonTypeMethod()V",
@@ -201,126 +201,126 @@
 					methodName = "anonTypeMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
 	}
-	
+
 	public void testInnerAnonymousTypeWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V$1$anAnonInt",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType$1",
 					fieldName = "anAnonInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}	
-	
+	}
+
 	public void testInnerClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType";
-	
+
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}		
-	
+	}
+
 	public void testInnerLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType";
 			int lineNumber = 35;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}	
-	
+	}
+
 	public void testInnerMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildsMethod()V",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType",
 					methodName = "innerChildsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
-	}	
-	
+	}
+
 	public void testInnerWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$InnerChildType$innerChildInt",
 					targetLineage = "renamedPackage"+"."+"MoveeChild$InnerChildType",
 					fieldName = "innerChildInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}		
+	}
 
 	public void testNonPublicAnonymousTypeClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType$1";
-			
+
 				runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}		
-	
+	}
+
 	public void testNonPublicAnonymousTypeLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType$1";
 			int lineNumber = 56;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}	
-	
+	}
+
 	public void testNonPublicAnonymousTypeMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anonTypeMethod()V",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType$1",
 					methodName = "anonTypeMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
-	}		
-	
+	}
+
 	public void testNonPublicAnonymousTypeWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$1$anAnonInt",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType$1",
 					fieldName = "anAnonInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}	
-		
+	}
+
 	public void testNonPublicClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType";
-	
-					
+
+
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}			
-	
+	}
+
 	public void testNonPublicLineBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType";
 			int lineNumber = 51;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}		
-	
+	}
+
 	public void testNonPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildsMethod()V$",
@@ -330,100 +330,100 @@
 	}
 
 	public void testNonPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "NonPublicChildType$nonPublicChildInt",
 					targetLineage = "renamedPackage"+"."+"NonPublicChildType",
 					fieldName = "nonPublicChildInt";
-						
+
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}	
-	
+	}
+
 	public void testPublicAnonymousTypeClassLoadpoint() throws Exception {
-		
-		String 	src = "src", 
+
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1",
 		targetLineage = "renamedPackage"+"."+"MoveeChild$1";
 
 		runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}		
-	
+	}
+
 	public void testPublicAnonymousTypeLineBreakpoint() throws Exception {
-					
-		String 	src = "src", 
+
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1",
 		targetLineage = "renamedPackage"+"."+"MoveeChild$1";
 		int lineNumber = 26;
-		
+
 		runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}		
-	
+	}
+
 	public void testPublicAnonymousTypeMethodBreakpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1$anonTypeMethod()V",
 		targetLineage = "renamedPackage"+"."+"MoveeChild$1",
 		methodName = "anonTypeMethod";
-		
+
 		runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
 	}
-			
+
 	public void testPublicAnonymousTypeWatchpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 		pack = "a.b.c",
 		cunit = "MoveeChild.java",
 		fullTargetName = "MoveeChild$childsMethod()V$1$anAnonInt",
 		targetLineage = "renamedPackage"+"."+"MoveeChild$1",
 		fieldName = "anAnonInt";
-			
+
 		runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}		
-	
+	}
+
 	public void testPublicClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild",
 					targetLineage = "renamedPackage"+"."+"MoveeChild";
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}		
-	
+	}
+
 	public void testPublicLineBreakpoint() throws Exception {
 
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild",
 					targetLineage = "renamedPackage"+"."+"MoveeChild";
 			int lineNumber = 21;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}			
-	
+	}
+
 	public void testPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V",
 					targetLineage = "renamedPackage"+"."+"MoveeChild",
 					methodName = "childsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
-	}		
-	
+	}
+
 	public void testPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$aChildInt",
 					targetLineage = "renamedPackage"+"."+"MoveeChild",
 					fieldName = "aChildInt";
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}		
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePublicTypeUnitTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePublicTypeUnitTests.java
index 965b684..602c0e9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePublicTypeUnitTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/refactoring/RenamePublicTypeUnitTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -60,12 +60,12 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * Creates an exception breakpoint and adds a filter. Refactors & checks 
+	 * Creates an exception breakpoint and adds a filter. Refactors & checks
 	 * if the filter changed appropriately w/ the refactor.
 	 * @param src name of src file
-	 * @param pack 
+	 * @param pack
 	 * @param cunit
 	 * @param targetName
 	 * @param exceptionName TODO
@@ -75,7 +75,7 @@
 		try {
 			//create breakpoint to test
 			IJavaExceptionBreakpoint breakpoint = createExceptionBreakpoint(exceptionName, true, true);
-			
+
 			//refactor
 			Refactoring ref = setupRefactor(src, pack, cunit, targetName);
 			performRefactor(ref);
@@ -91,7 +91,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -151,7 +151,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * @param src
 	 * @param pack
@@ -181,9 +181,9 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * @param root
 	 * @param packageName
 	 * @param cuName
@@ -198,12 +198,12 @@
 		//if this was a non-typed test, get's it's parent type
 		if(!(target instanceof IType))
 			target = (IMember)target.getParent();
-		
+
 		IType targetType = (IType)target;
-				
+
 		JavaRenameProcessor proc = new RenameTypeProcessor(targetType);
 		proc.setNewElementName("RenamedType");
-			
+
 		RenameRefactoring ref= new RenameRefactoring(proc);
 		//setup final refactoring conditions
 		RefactoringStatus refactoringStatus= ref.checkAllConditions(new NullProgressMonitor());
@@ -211,60 +211,60 @@
 		{
 			System.out.println(refactoringStatus.getMessageMatchingSeverity(refactoringStatus.getSeverity()));
 			return null;
-		}		
-		
+		}
+
 		return ref;
 	}
-	
+
 	public void testPublicClassLoadpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild",
 					targetLineage = pack+"."+"RenamedType";
 			runClassLoadBreakpointTest(src, pack, cunit, fullTargetName, targetLineage);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicLineBreakpoint() throws Exception {
 
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild",
 					targetLineage = "RenamedType";
 			int lineNumber = 21;
-			
+
 			runLineBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, lineNumber);
-	}//end testBreakPoint			
-	
+	}//end testBreakPoint
+
 	public void testPublicMethodBreakpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$childsMethod()V",
 					targetLineage = pack+"."+"RenamedType",
 					methodName = "childsMethod";
 			runMethodBreakpointTest(src, pack, cunit, fullTargetName, targetLineage, methodName);
-	}//end testBreakPoint		
-	
+	}//end testBreakPoint
+
 	public void testPublicExceptionBreakpoint() throws Exception {
-		String 	src = "src", 
+		String 	src = "src",
 				pack = "a.b.c",
 				cunit = "MoveeChild.java",
 				typeName = "MoveeChild",
 				exceptionName = "java.lang.NullPointerException";
 		runExceptionBreakpointTest(src, pack, cunit, typeName, exceptionName);
-}//end testBreakPoint		
+}//end testBreakPoint
 
 
 
 	public void testPublicWatchpoint() throws Exception {
-			String 	src = "src", 
+			String 	src = "src",
 					pack = "a.b.c",
 					cunit = "MoveeChild.java",
 					fullTargetName = "MoveeChild$aChildInt",
 					targetLineage = pack+"."+"RenamedType",
 					fieldName = "aChildInt";
 			runWatchPointTest(src, pack, cunit, fullTargetName, targetLineage, fieldName);
-	}//end testBreakPoint		
+	}//end testBreakPoint
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ArchiveSourceLookupTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ArchiveSourceLookupTests.java
index 2dc7cdf..6943bfc 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ArchiveSourceLookupTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ArchiveSourceLookupTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,97 +23,97 @@
  */
 @SuppressWarnings("deprecation")
 public class ArchiveSourceLookupTests extends AbstractDebugTest {
-	
+
 	public ArchiveSourceLookupTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests source lookup in a top level type, in the default package.
 	 */
 	public void testDefTopLevelType() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("Breakpoints");
 		assertEquals("Did not find source", "Breakpoints.java", storage.getName());
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type, the default package.
 	 */
 	public void testDefInnerType() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("Breakpoints$InnerRunnable");
 		assertEquals("Did not find source", "Breakpoints.java", storage.getName());
 	}
-	
-	
+
+
 	/**
 	 * Tests source lookup in a top level type.
 	 */
 	public void testTopLevelType() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup");
-		assertEquals("Did not find source", "SourceLookup.java", storage.getName());		
+		assertEquals("Did not find source", "SourceLookup.java", storage.getName());
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type.
 	 */
 	public void testInnerType() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner");
 		assertEquals("Did not find source", "SourceLookup.java", storage.getName());
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner, inner type.
 	 */
 	public void testNestedType() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner$Nested");
 		assertEquals("Did not find source", "SourceLookup.java", storage.getName());
 	}
-		
+
 	/**
 	 * Tests source lookup in a top level type, with a $ named class
 	 */
 	public void testTopLevel$Type() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup");
 		assertEquals("Did not find source", "Source_$_Lookup.java", storage.getName());
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type in a $ named class.
 	 */
 	public void testInner$Type() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner");
 		assertEquals("Did not find source", "Source_$_Lookup.java", storage.getName());
-	}	
-	
+	}
+
 	/**
 	 * Tests source lookup in an inner type in a $ named class.
 	 */
 	public void testInnerNested$Type() throws Exception {
 		File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/testJarWithOutRoot.jar"));
 		ArchiveSourceLocation location = new ArchiveSourceLocation(file.getAbsolutePath(), null);
-				
+
 		ZipEntryStorage storage = (ZipEntryStorage) location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner$Nested");
 		assertEquals("Did not find source", "Source_$_Lookup.java", storage.getName());
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DefaultSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DefaultSourceContainerTests.java
index dfcea15..f97ed89 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DefaultSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DefaultSourceContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,20 +20,20 @@
  * Tests default source containers
  */
 public class DefaultSourceContainerTests extends AbstractDebugTest {
-	
+
 	public DefaultSourceContainerTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDefaultSourceContainerMemento() throws Exception {
 		JavaSourceLookupDirector director = new JavaSourceLookupDirector();
 		ILaunchConfiguration configuration = getLaunchConfiguration("Breakpoints");
-		director.initializeDefaults(configuration);		
+		director.initializeDefaults(configuration);
 		ISourceContainer[] containers = director.getSourceContainers();
 		assertEquals("expected one default container", 1, containers.length);
 		assertTrue("Wrond default container", containers[0] instanceof DefaultSourceContainer);
@@ -43,5 +43,5 @@
 		director2.initializeFromMemento(memento, configuration);
 		DefaultSourceContainer restore = (DefaultSourceContainer) director2.getSourceContainers()[0];
 		assertEquals("Default source container memento failed", container, restore);
-	}			
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceContainerTests.java
index 54c27de..5d067f4 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,11 +24,11 @@
  * Tests directory source containers
  */
 public class DirectorySourceContainerTests extends AbstractDebugTest {
-	
+
 	public DirectorySourceContainerTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Returns a directory source container.
 	 */
@@ -41,10 +41,10 @@
 		director.setSourceContainers(new ISourceContainer[]{container});
 		return container;
 	}
-	
+
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testDirectorySourceContainerMemento() throws Exception {
@@ -54,7 +54,7 @@
 		ISourceContainer restore = container.getType().createSourceContainer(memento);
 		assertEquals("Directory source container memento failed", container, restore);
 		assertTrue(restore.isComposite());
-	}	
+	}
 
 	public void testSimpleSourceLookupPositive() throws Exception {
 		DirectorySourceContainer container = getContainer(false, false);
@@ -62,46 +62,46 @@
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", new File(container.getDirectory(), "Breakpoints.java"), ((LocalFileStorage)objects[0]).getFile());
 	}
-	
+
 	public void testSimpleSourceLookupNegative() throws Exception {
 		DirectorySourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
-	
+	}
+
 	public void testSimpleNestedSourceLookupPositive() throws Exception {
 		DirectorySourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("InfiniteLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
-		assertEquals("Wrong file", new File(container.getDirectory(), "org/eclipse/debug/tests/targets/InfiniteLoop.java"), ((LocalFileStorage)objects[0]).getFile());		
+		assertEquals("Wrong file", new File(container.getDirectory(), "org/eclipse/debug/tests/targets/InfiniteLoop.java"), ((LocalFileStorage)objects[0]).getFile());
 	}
-	
+
 	public void testSimpleNestedSourceLookupNegative() throws Exception {
 		DirectorySourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("FileNotFound.java");
-		assertEquals("Expected 0 files", 0, objects.length);		
+		assertEquals("Expected 0 files", 0, objects.length);
 	}
-	
+
 	public void testQualifiedSourceLookupPositive() throws Exception {
 		DirectorySourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("org/eclipse/debug/tests/targets/InfiniteLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", new File(container.getDirectory(), "org/eclipse/debug/tests/targets/InfiniteLoop.java"), ((LocalFileStorage)objects[0]).getFile());
 	}
-	
+
 	public void testQualifiedSourceLookupNegative() throws Exception {
 		DirectorySourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("a/b/c/FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
 	}
-	
+
 	public void testPartiallyQualifiedNestedSourceLookupPositive() throws Exception {
 		DirectorySourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("debug/tests/targets/InfiniteLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", new File(container.getDirectory(), "org/eclipse/debug/tests/targets/InfiniteLoop.java"), ((LocalFileStorage)objects[0]).getFile());
-	}	
-	
+	}
+
 	public void testCaseSensitiveQualifiedSourceLookup() throws Exception {
 		DirectorySourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("oRg/eClIpSe/dEbUg/tEsTs/tArGeTs/INfInItELOop.jaVa");
@@ -117,5 +117,5 @@
 				assertEquals("Wrong file", new File(container.getDirectory(), "org/eclipse/debug/tests/targets/InfiniteLoop.java"), ((LocalFileStorage)objects[0]).getFile());
 			}
 		}
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceLookupTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceLookupTests.java
index ed8ca4a..9aa1c75 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceLookupTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/DirectorySourceLookupTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,11 +25,11 @@
  */
 @SuppressWarnings("deprecation")
 public class DirectorySourceLookupTests extends AbstractDebugTest {
-	
+
 	public DirectorySourceLookupTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Tests source lookup in a top level type, in the default package.
 	 */
@@ -37,14 +37,14 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
 		assertTrue("did not find compilation unit for Breakpoints.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type, the default package.
 	 */
@@ -52,15 +52,15 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
 		assertTrue("did not find compilation unit for Breakpoints.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints$InnerRunnable"));
 	}
-	
-	
+
+
 	/**
 	 * Tests source lookup in a top level type.
 	 */
@@ -68,14 +68,14 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
 		assertTrue("did not find compilation unit for SourceLookup.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type.
 	 */
@@ -83,14 +83,14 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
 		assertTrue("did not find compilation unit for SourceLookup.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner, inner type.
 	 */
@@ -98,14 +98,14 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
 		assertTrue("did not find compilation unit for SourceLookup.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner$Nested"));
 	}
-		
+
 	/**
 	 * Tests source lookup in a top level type, with a $ named class
 	 */
@@ -113,14 +113,14 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
 		assertTrue("did not find compilation unit for Source_$_Lookup.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type in a $ named class.
 	 */
@@ -128,14 +128,14 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
 		assertTrue("did not find compilation unit for Source_$_Lookup.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner"));
-	}	
-	
+	}
+
 	/**
 	 * Tests source lookup in an inner type in a $ named class.
 	 */
@@ -143,11 +143,11 @@
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		File rootFile = root.getResource().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);
-		
+
 		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
 		assertTrue("did not find compilation unit for Source_$_Lookup.java", cu.exists());
 		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner$Nested"));
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ExternalArchiveSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ExternalArchiveSourceContainerTests.java
index f00d58b..682c75f 100755
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ExternalArchiveSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ExternalArchiveSourceContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,14 +28,14 @@
  * Tests external archive source containers
  */
 public class ExternalArchiveSourceContainerTests extends AbstractDebugTest {
-	
+
 	public ExternalArchiveSourceContainerTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Returns the JREs source archive.
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -56,7 +56,7 @@
 		assertTrue("Did not find JRE source archive. This failure is expected if you are running the tests with a JRE that does not contain source.", false);
 		return null;
 	}
-	
+
 	/**
 	 * Returns the source archive at the specified path within this plug-in.
 	 */
@@ -70,11 +70,11 @@
 		ExternalArchiveSourceContainer container = new ExternalArchiveSourceContainer(file.getAbsolutePath(), detect);
 		director.setSourceContainers(new ISourceContainer[]{container});
 		return container;
-	}	
-	
+	}
+
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testArchiveSourceContainerMemento() throws Exception {
@@ -86,7 +86,7 @@
 		assertEquals("Directory source container memento failed", container, restore);
 		assertFalse(restore.isComposite());
 		assertTrue(restore.isDetectRoot());
-	}	
+	}
 
 	public void testAutoDetectRootSourceLookupPositive() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer(true, false);
@@ -95,13 +95,13 @@
 		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
 		assertEquals("Wrong file", "Object.java", storage.getName());
 	}
-	
+
 	public void testAutoDetectRootSourceLookupNegative() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("java/lang/FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
-	
+	}
+
 	public void testSourceLookupPositive() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("java/lang/Object.java");
@@ -109,21 +109,21 @@
 		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
 		assertEquals("Wrong file", "Object.java", storage.getName());
 	}
-	
+
 	public void testSourceLookupNegative() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("java/lang/FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
 	}
-		
+
 	public void testPartiallyQualifiedSourceLookupPositive() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("lang/Object.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
 		assertEquals("Wrong file", "Object.java", storage.getName());
-	}	
-	
+	}
+
 	public void testAutoDetectUnqualifiedSourceLookupPositive() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer(true, false);
 		// force detection
@@ -134,7 +134,7 @@
 		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
 		assertEquals("Wrong file", "Object.java", storage.getName());
 	}
-	
+
 	public void testAutoDetectMultipleRoots() throws Exception {
 		ExternalArchiveSourceContainer container = getContainer("testresources/source-test.zip", true, false);
 		// find .java file
@@ -149,6 +149,6 @@
 		// find another .txt file
 		objects = container.findSourceElements("folder/file-c.txt");
 		storage = (ZipEntryStorage) objects[0];
-		assertEquals("Wrong file", "file-c.txt", storage.getName());		
-	}		
+		assertEquals("Wrong file", "file-c.txt", storage.getName());
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/FolderSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/FolderSourceContainerTests.java
index fd75698..d4dccf9 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/FolderSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/FolderSourceContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
  * Tests folder source containers
  */
 public class FolderSourceContainerTests extends AbstractDebugTest {
-	
+
 	public FolderSourceContainerTests(String name) {
 		super(name);
 	}
@@ -46,7 +46,7 @@
 	}
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testFolderSourceContainerMemento() throws Exception {
@@ -57,53 +57,53 @@
 		assertEquals("Folder source container memento failed", container, restore);
 		assertTrue(restore.isComposite());
 	}
-	
+
 	public void testSimpleSourceLookupPositive() throws Exception {
 		FolderSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("Breakpoints.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", getFolder(container).getFile("Breakpoints.java"), objects[0]);
 	}
-	
+
 	public void testSimpleSourceLookupNegative() throws Exception {
 		FolderSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
-	
+	}
+
 	public void testSimpleNestedSourceLookupPositive() throws Exception {
 		FolderSourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("InfiniteLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
-		assertEquals("Wrong file", getFolder(container).getFile(new Path("org/eclipse/debug/tests/targets/InfiniteLoop.java")), objects[0]);		
+		assertEquals("Wrong file", getFolder(container).getFile(new Path("org/eclipse/debug/tests/targets/InfiniteLoop.java")), objects[0]);
 	}
-	
+
 	public void testSimpleNestedSourceLookupNegative() throws Exception {
 		FolderSourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("FileNotFound.java");
-		assertEquals("Expected 0 files", 0, objects.length);		
+		assertEquals("Expected 0 files", 0, objects.length);
 	}
-	
+
 	public void testQualifiedSourceLookupPositive() throws Exception {
 		FolderSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("org/eclipse/debug/tests/targets/InfiniteLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", getFolder(container).getFile(new Path("org/eclipse/debug/tests/targets/InfiniteLoop.java")), objects[0]);
 	}
-	
+
 	public void testQualifiedSourceLookupNegative() throws Exception {
 		FolderSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("a/b/c/FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
 	}
-	
+
 	public void testPartiallyQualifiedNestedSourceLookupPositive() throws Exception {
 		FolderSourceContainer container = getContainer(true, false);
 		Object[] objects = container.findSourceElements("debug/tests/targets/InfiniteLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", getFolder(container).getFile(new Path("org/eclipse/debug/tests/targets/InfiniteLoop.java")), objects[0]);
-	}	
-	
+	}
+
 	public void testCaseSensitiveQualifiedSourceLookup() throws Exception {
 		FolderSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("oRg/eClIpSe/dEbUg/tEsTs/tArGeTs/INfInItELOop.jaVa");
@@ -115,8 +115,8 @@
 			assertEquals("Expected 1 result", 1, objects.length);
 			assertEquals("Wrong file", getFolder(container).getFile(new Path("org/eclipse/debug/tests/targets/InfiniteLoop.java")), objects[0]);
 		}
-	}	
-	
+	}
+
 	public void testRelativePathName() throws Exception {
 		FolderSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements(".."+File.separatorChar+".classpath");
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JarSourceLookupTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JarSourceLookupTests.java
index 0aa7d56..0476ded 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JarSourceLookupTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JarSourceLookupTests.java
@@ -17,6 +17,7 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.ILaunchConfiguration;
@@ -44,17 +45,17 @@
 	private static final String SAMPLE_JAR_PATH = "/JarProject/lib/sample.jar";
 	public static final String A_RUN_JAR = "testJar.RunJar";
 	static IJavaProject fgJarProject = null;
-	
+
 	String RefPjName = "JarRefProject";
 	String fJarProject = "JarProject";
-	
+
 	/**
 	 * Constructor
 	 */
 	public JarSourceLookupTests() {
 		super("JarSourceLookupTests");
 	}
-	
+
 	/**
 	 * Disposes all source containers after a test, ensures no containers are still holding open Jar references, which can lead to {@link ResourceException}s
 	 * when we try to delete / setup following tests
@@ -67,17 +68,17 @@
 			}
 		}
 	}
-	
+
 	@Override
 	protected IJavaProject getProjectContext() {
 		return fgJarProject;
 	}
-	
+
 	@Override
 	protected void setUp() throws Exception {
+		TestUtil.log(IStatus.INFO, getName(), "setUp");
 		assertWelcomeScreenClosed();
-		TestUtil.runEventLoop();
-		TestUtil.cleanUp();
+		TestUtil.cleanUp(getName());
 		IPath testrpath = new Path("testresources");
 		IProject jarProject = createProjectClone(fJarProject, testrpath.append(fJarProject).toString(), true);
 
@@ -104,22 +105,21 @@
 		}
 		waitForBuild();
 	}
-	
+
 	@Override
 	protected void tearDown() throws Exception {
 		removeAllBreakpoints();
 		if (fgJarProject.exists()) {
 			fgJarProject.getProject().delete(true, null);
 		}
-		TestUtil.cleanUp();
 		super.tearDown();
 	}
-	
+
 	/**
 	 * Ensures the translation of source containers yields the correct containers
-	 * 
+	 *
 	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=346116
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testTranslateContainers() throws Exception {
@@ -166,12 +166,12 @@
 			disposeContainers(containers);
 		}
 	}
-	
+
 	/**
 	 * Tests that the class file is found as source when the lookup is done from a jar from another project
-	 * 
+	 *
 	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=346116
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInspectClassFileFromJar() throws Exception {
@@ -193,12 +193,12 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * Tests that the class file is found as source when the lookup is done from a jar from another project
-	 * 
+	 *
 	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=346116
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testShowClassFileFromJar() throws Exception {
@@ -215,11 +215,11 @@
 			assertNotNull("We should have found source for the main class testJar.RunJar", source);
 			 assertTrue("The found source should be an IFile", source instanceof IFile);
 			 assertEquals("We should have found a file named RunJar.java", ((IFile)source).getName(), "RunJar.java");
-			 
+
 			 stepInto((IJavaStackFrame)frame);
 			 frame = thread.getTopStackFrame();
 			 assertNotNull("The top stack frame cannot be null", frame);
-			 
+
 			 source = lookupSource(frame);
 			 assertNotNull("We should have found source for the jar class a.JarClass", source);
 			 assertTrue("The found source should be a ClassFile", source instanceof ClassFile);
@@ -229,7 +229,7 @@
 			terminateAndRemove(thread);
 		}
 	}
-	
+
 	/**
 	 * Looks up source for the given frame using its backing {@link ISourceLocator} from its {@link ILaunch}
 	 * @param frame the frame to look up source for
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JavaProjectSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JavaProjectSourceContainerTests.java
index aa63119..8a8354c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JavaProjectSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/JavaProjectSourceContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,14 +22,14 @@
  * Tests Java project source containers
  */
 public class JavaProjectSourceContainerTests extends AbstractDebugTest {
-	
+
 	public JavaProjectSourceContainerTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Returns a Java project source container
-	 * 
+	 *
 	 * @return
 	 * @throws Exception
 	 */
@@ -41,10 +41,10 @@
 		director.setSourceContainers(new ISourceContainer[]{container});
 		return container;
 	}
-	
+
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSourceContainerMemento() throws Exception {
@@ -52,7 +52,7 @@
 		String memento = container.getType().getMemento(container);
 		ISourceContainer restore = container.getType().createSourceContainer(memento);
 		assertEquals("Directory source container memento failed", container, restore);
-	}	
+	}
 
 	public void testDefaultPackageLookup() throws Exception {
 		ISourceContainer container = getContainer(get14Project(), false);
@@ -61,20 +61,20 @@
 		IFile file = (IFile) objects[0];
 		assertEquals("Wrong file", "Breakpoints.java", file.getName());
 	}
-	
+
 	public void testQualifiedLookup() throws Exception {
 		ISourceContainer container = getContainer(get14Project(), false);
 		Object[] objects = container.findSourceElements("org/eclipse/debug/tests/targets/CallLoop.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		IFile file = (IFile) objects[0];
-		assertEquals("Wrong file", "CallLoop.java", file.getName());		
+		assertEquals("Wrong file", "CallLoop.java", file.getName());
 	}
-	
+
 	public void testNonJavaLookup() throws Exception {
 		ISourceContainer container = getContainer(get14Project(), false);
 		Object[] objects = container.findSourceElements("debug/non-java.txt");
 		assertEquals("Expected 1 result", 1, objects.length);
 		IFile file = (IFile) objects[0];
-		assertEquals("Wrong file", "non-java.txt", file.getName());		
-	}	
+		assertEquals("Wrong file", "non-java.txt", file.getName());
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ProjectSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ProjectSourceContainerTests.java
index 557580a..7aa6307 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ProjectSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/ProjectSourceContainerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
  * Tests project source containers
  */
 public class ProjectSourceContainerTests extends AbstractDebugTest {
-	
+
 	public ProjectSourceContainerTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Returns a project source container.
 	 */
@@ -34,14 +34,14 @@
 		director.initializeParticipants();
 		director.setFindDuplicates(duplicates);
 		IProject project = get14Project().getProject();
-		ProjectSourceContainer container = new ProjectSourceContainer(project, referenced);		
+		ProjectSourceContainer container = new ProjectSourceContainer(project, referenced);
 		director.setSourceContainers(new ISourceContainer[]{container});
 		return container;
 	}
-	
+
 	/**
 	 * Tests creation and restoring from a memento.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testProjectSourceContainerMemento() throws Exception {
@@ -52,26 +52,26 @@
 		assertEquals("Project source container memento failed", container, restore);
 		assertTrue(restore.isSearchReferencedProjects());
 	}
-	
+
 	public void testSimpleSourceLookupPositive() throws Exception {
 		ProjectSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("Breakpoints.java");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", container.getProject().getFile("src/Breakpoints.java"), objects[0]);
 	}
-	
+
 	public void testSimpleRootSourceLookupPositive() throws Exception {
 		ProjectSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements(".classpath");
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", container.getProject().getFile(".classpath"), objects[0]);
-	}	
-	
+	}
+
 	public void testSimpleSourceLookupNegative() throws Exception {
 		ProjectSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("FileNotFound.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
+	}
 
 	public void testQualifiedSourceLookupPositive() throws Exception {
 		ProjectSourceContainer container = getContainer(false, false);
@@ -79,13 +79,13 @@
 		assertEquals("Expected 1 result", 1, objects.length);
 		assertEquals("Wrong file", container.getProject().getFile("src/org/eclipse/debug/tests/targets/InfiniteLoop.java"), objects[0]);
 	}
-	
+
 	public void testQualifiedSourceLookupNegative() throws Exception {
 		ProjectSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("a/b/c/InfiniteLoop.java");
 		assertEquals("Expected 0 files", 0, objects.length);
-	}	
-	
+	}
+
 	public void testCaseSensitiveQualifiedSourceLookup() throws Exception {
 		ProjectSourceContainer container = getContainer(false, false);
 		Object[] objects = container.findSourceElements("oRg/eClIpSe/dEbUg/tEsTs/tArGeTs/INfInItELOop.jaVa");
@@ -97,5 +97,5 @@
 			assertEquals("Expected 1 result", 1, objects.length);
 			assertEquals("Wrong file", container.getProject().getFile("src/org/eclipse/debug/tests/targets/InfiniteLoop.java"), objects[0]);
 		}
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLocationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLocationTests.java
index 25dc4bb..07c1c1b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLocationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLocationTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -35,7 +35,7 @@
  */
 @SuppressWarnings("deprecation")
 public class SourceLocationTests extends AbstractDebugTest {
-	
+
 	public static final String JRE_CONTAINER_1_4_CPE_NAME = "org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4";
 
 	public SourceLocationTests(String name) {
@@ -49,7 +49,7 @@
 		restored.initializeFrom(memento);
 		assertEquals("project locations should be equal", location, restored);
 	}
-	
+
 	public void testDirectoryLocationMemento() throws Exception {
 		File dir = ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile();
 		IJavaSourceLocation location = new DirectorySourceLocation(dir);
@@ -57,8 +57,8 @@
 		IJavaSourceLocation restored = new DirectorySourceLocation();
 		restored.initializeFrom(memento);
 		assertEquals("directory locations should be equal", location, restored);
-	}	
-	
+	}
+
 	public void testArchiveLocationMemento() throws Exception {
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		IJavaSourceLocation location = new ArchiveSourceLocation(JavaRuntime.getLibraryLocations(vm)[0].getSystemLibraryPath().toOSString(), null);
@@ -66,50 +66,50 @@
 		IJavaSourceLocation restored = new ArchiveSourceLocation();
 		restored.initializeFrom(memento);
 		assertEquals("archive locations should be equal", location, restored);
-	}	
-	
+	}
+
 	public void testJavaSourceLocatorMemento() throws Exception {
 		IJavaSourceLocation location1 = new JavaProjectSourceLocation(get14Project());
 		File dir = ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile();
 		IJavaSourceLocation location2 = new DirectorySourceLocation(dir);
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		IJavaSourceLocation location3 = new ArchiveSourceLocation(JavaRuntime.getLibraryLocations(vm)[0].getSystemLibraryPath().toOSString(), null);
-		
+
 		JavaSourceLocator locator = new JavaSourceLocator(new IJavaSourceLocation[] {location1, location2, location3});
 		String memento = locator.getMemento();
 		JavaSourceLocator restored = new JavaSourceLocator();
 		restored.initializeFromMemento(memento);
 		IJavaSourceLocation[] locations = restored.getSourceLocations();
-		
+
 		assertEquals("wrong number of source locations", 3, locations.length);
 		assertEquals("1st locations not equal", location1, locations[0]);
 		assertEquals("2nd locations not equal", location2, locations[1]);
 		assertEquals("3rd locations not equal", location3, locations[2]);
 	}
-	
+
 	public void testJavaUISourceLocatorMemento() throws Exception {
 		IJavaSourceLocation location1 = new JavaProjectSourceLocation(get14Project());
 		File dir = ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile();
 		IJavaSourceLocation location2 = new DirectorySourceLocation(dir);
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		IJavaSourceLocation location3 = new ArchiveSourceLocation(JavaRuntime.getLibraryLocations(vm)[0].getSystemLibraryPath().toOSString(), null);
-		
+
 		JavaUISourceLocator locator = new JavaUISourceLocator(get14Project());
 		locator.setSourceLocations(new IJavaSourceLocation[] {location1, location2, location3});
 		locator.setFindAllSourceElement(true);
-		
+
 		String memento = locator.getMemento();
 		JavaUISourceLocator restored = new JavaUISourceLocator();
 		restored.initializeFromMemento(memento);
 		IJavaSourceLocation[] locations = restored.getSourceLocations();
-		
+
 		assertEquals("wrong number of source locations", 3, locations.length);
 		assertEquals("1st locations not equal", location1, locations[0]);
 		assertEquals("2nd locations not equal", location2, locations[1]);
 		assertEquals("3rd locations not equal", location3, locations[2]);
-		assertTrue("Should find all source locations", locator.isFindAllSourceElements());		
+		assertTrue("Should find all source locations", locator.isFindAllSourceElements());
 	}
-	
+
 	public void testPackageFragmentRootLocationMemento() throws Exception {
 		IResource res = get14Project().getProject().getFolder("src");
 		IPackageFragmentRoot root = get14Project().getPackageFragmentRoot(res);
@@ -119,43 +119,43 @@
 		restored.initializeFrom(memento);
 		assertEquals("root locations should be equal", location, restored);
 	}
-	
+
 	public void testEmptyPackageFragmentRootLocationMemento() throws Exception {
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation();
 		String memento = location.getMemento();
 		IJavaSourceLocation restored = new PackageFragmentRootSourceLocation();
 		restored.initializeFrom(memento);
 		assertEquals("root locations should be equal", location, restored);
-	}	
-		
+	}
+
 	public void testPositiveSourceFolderSourceLocation() throws Exception {
 		IResource res = get14Project().getProject().getFolder("src");
 		IPackageFragmentRoot root = get14Project().getPackageFragmentRoot(res);
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		Object source = location.findSourceElement("Breakpoints");
 		assertTrue("Did not find source for 'Breakpoints'", source instanceof ICompilationUnit);
 		ICompilationUnit cu = (ICompilationUnit)source;
 		assertEquals("Did not find source for 'Breakpoints'", cu.getElementName(), "Breakpoints.java");
-		
+
 		source = location.findSourceElement("org.eclipse.debug.tests.targets.InfiniteLoop");
 		assertTrue("Did not find source for 'InfiniteLoop'", source instanceof ICompilationUnit);
 		cu = (ICompilationUnit)source;
 		assertEquals("Did not find source for 'Breakpoints'", cu.getElementName(), "InfiniteLoop.java");
 	}
-	
+
 	public void testNegativeSourceFolderSourceLocation() throws Exception {
 		IResource res = get14Project().getProject().getFolder("src");
 		IPackageFragmentRoot root = get14Project().getPackageFragmentRoot(res);
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		Object source = location.findSourceElement("DoesNotExist");
 		assertNull("Should not have found source", source);
-		
+
 		source = location.findSourceElement("org.eclipse.DoesNotExist");
 		assertNull("Should not have found source", source);
-	}	
-	
+	}
+
 	public void testPositiveSystemLibrarySourceLocation() throws Exception {
 		IClasspathEntry[] cpes = get14Project().getRawClasspath();
 		IClasspathEntry lib = null;
@@ -168,7 +168,7 @@
 			}
 		}
 		assertNotNull("Could not find JRE_CONTAINER entry", lib);
-		
+
 		IPackageFragmentRoot[] roots = get14Project().findPackageFragmentRoots(lib);
 		Object source = null;
 		for (int i = 0; i < roots.length; i++) {
@@ -179,11 +179,11 @@
 				break;
 			}
 		}
-		
+
 		assertTrue("Did not find source for 'Object'", source instanceof IClassFile);
 		IClassFile cf = (IClassFile)source;
 		assertEquals("Did not find source for 'Object'", "Object.class", cf.getElementName());
-		
+
 		for (int i = 0; i < roots.length; i++) {
 			IPackageFragmentRoot root = roots[i];
 			IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
@@ -191,12 +191,12 @@
 			if (source != null) {
 				break;
 			}
-		}		
+		}
 		assertTrue("Did not find source for 'Vector$1'", source instanceof IClassFile);
 		cf = (IClassFile)source;
 		assertEquals("Did not find source for 'Vector$1'", "Vector$1.class", cf.getElementName());
 	}
-	
+
 	public void testNegativeSystemLibrarySourceLocation() throws Exception {
 		IClasspathEntry[] cpes = get14Project().getRawClasspath();
 		IClasspathEntry lib = null;
@@ -209,7 +209,7 @@
 			}
 		}
 		assertNotNull("Could not find JRE_CONTAINER entry", lib);
-		
+
 		IPackageFragmentRoot[] roots = get14Project().findPackageFragmentRoots(lib);
 		Object source = null;
 		for (int i = 0; i < roots.length; i++) {
@@ -220,8 +220,8 @@
 				break;
 			}
 		}
-		
+
 		assertNull("Should not find source", source);
 
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLookupTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLookupTests.java
index 0bc25f8..d372e9f 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLookupTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/SourceLookupTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,11 +30,11 @@
  */
 @SuppressWarnings("deprecation")
 public class SourceLookupTests extends AbstractDebugTest {
-	
+
 	public SourceLookupTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * See Bug 53646
 	 */
@@ -60,19 +60,19 @@
 		String typeName = "org.eclipse.debug.tests.targets.CallStack";
 		createLineBreakpoint(28, "org.eclipse.debug.tests.targets.ClassOne");
 		createLineBreakpoint(28, "org.eclipse.debug.tests.targets.ClassTwo");
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			// get source element for first breakpoint
 			IStackFrame[] frames = thread.getStackFrames();
-			IStackFrame frame = frames[2]; 
+			IStackFrame frame = frames[2];
 			ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator();
 			Object source1 = sourceLocator.getSourceElement(frame);
 			source1 = ((IAdaptable)source1).getAdapter(IJavaElement.class);
-			
+
 			IPackageFragment[] fragments = get14Project().getPackageFragments();
 			IPackageFragment fragment = null;
 			for (int i = 0; i < fragments.length; i++) {
@@ -84,7 +84,7 @@
 			assertNotNull("Did not locate package framgment 'org.eclipse.debug.tests.targets'", fragment);
 			ICompilationUnit unit1 = fragment.getCompilationUnit("ClassOne.java");
 			assertEquals("Source lookup failed for frame1", unit1, source1);
-			
+
 			// resume to second breakpoint
 			thread = resume(thread);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
@@ -93,40 +93,40 @@
 			source2 = ((IAdaptable)source2).getAdapter(IJavaElement.class);
 			ICompilationUnit unit2 = fragment.getCompilationUnit("ClassTwo.java");
 			assertEquals("Source lookup failed for frame2", unit2, source2);
-						
+
 			// the source elements should not be equal
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests source lookup in a top level type, in the default package.
 	 */
 	public void testDefTopLevelType() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
 		assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type, the default package.
 	 */
 	public void testDefInnerType() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
 		assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints$InnerRunnable"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an anonymous inner type, in the default package.
 	 * Must debug since we do not know name of type.
@@ -136,12 +136,12 @@
 		createLineBreakpoint(43, typeName);
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
 		assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists());
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			// get source element for top frame
 			IStackFrame frame = thread.getTopStackFrame();
 			ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator();
@@ -149,10 +149,10 @@
 			assertEquals("Source lookup failed", expectedSource.getResource(), source);
 		} finally {
 			terminateAndRemove(thread);
-			removeAllBreakpoints();			
+			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests source lookup in a named local type, in the default package.
 	 * Must debug to test this, since we do no know name of local type.
@@ -162,12 +162,12 @@
 		createLineBreakpoint(30, typeName);
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
 		assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists());
-		
+
 		IJavaThread thread= null;
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			// get source element for top frame
 			IStackFrame frame = thread.getTopStackFrame();
 			ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator();
@@ -175,85 +175,85 @@
 			assertEquals("Source lookup failed", expectedSource.getResource(), source);
 		} finally {
 			terminateAndRemove(thread);
-			removeAllBreakpoints();			
+			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 	/**
 	 * Tests source lookup in a top level type.
 	 */
 	public void testTopLevelType() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
 		assertTrue("did not find compilation unit for SourceLookup.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type.
 	 */
 	public void testInnerType() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
 		assertTrue("did not find compilation unit for SourceLookup.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner inner type.
 	 */
 	public void testInnerNestedType() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
 		assertTrue("did not find compilation unit for SourceLookup.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner$Nested"));
-	}	
-	
+	}
+
 	/**
 	 * Tests source lookup in a top level type, with a $ named class
 	 */
 	public void testTopLevel$Type() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
 		assertTrue("did not find compilation unit for Source_$_Lookup.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner type in a $ named class.
 	 */
 	public void testInner$Type() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
 		assertTrue("did not find compilation unit for Source_$_Lookup.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner"));
 	}
-	
+
 	/**
 	 * Tests source lookup in an inner inner type in a $ named class.
 	 */
 	public void testInnerNested$Type() throws Exception {
 		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
 		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
-		
+
 		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
 		assertTrue("did not find compilation unit for Source_$_Lookup.java", expectedSource.exists());
-				
+
 		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner$Nested"));
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/TypeResolutionTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/TypeResolutionTests.java
index eccabb5..a445faf 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/TypeResolutionTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/sourcelookup/TypeResolutionTests.java
@@ -27,103 +27,103 @@
 	public TypeResolutionTests(String name) {
 		super(name);
 	}
-	
+
 	public void testTypeAA() throws Exception {
 		resolve(65, "EvalNestedTypeTests$A$AA");
-	}	
-	
+	}
+
 	public void testTypeAB() throws Exception {
 		resolve(94, "EvalNestedTypeTests$A$AB");
-	}	
-	
+	}
+
 	public void testTypeAC() throws Exception {
 		resolve(120, "EvalNestedTypeTests$A$AC");
-	}	
-	
+	}
+
 	public void testAnonTypeA1() throws Exception {
 		resolve(145, "EvalNestedTypeTests$A$1");
 	}
-	
+
 	public void testTypeAE() throws Exception {
 		resolve(179, "EvalNestedTypeTests$A$AE");
 	}
-	
+
 	public void testAnonTypeA2() throws Exception {
 		resolve(203, "EvalNestedTypeTests$A$2");
-	}	
-	
+	}
+
 	public void testTypeBB() throws Exception {
 		resolve(252, "EvalNestedTypeTests$B$BB");
 	}
-	
+
 	public void testTypeBC() throws Exception {
 		resolve(279, "EvalNestedTypeTests$B$BC");
 	}
-	
+
 	public void testAnonTypeB() throws Exception {
 		resolve(304, "EvalNestedTypeTests$B$1");
 	}
-	
+
 	public void testTypeB() throws Exception {
 		resolve(312, "EvalNestedTypeTests$B");
 	}
-	
+
 	public void testTypeCB() throws Exception {
 		resolve(354, "EvalNestedTypeTests$C$CB");
 	}
-	
+
 	public void testTypeCC() throws Exception {
 		resolve(381, "EvalNestedTypeTests$C$CC");
-	}	
-	
+	}
+
 	public void testAnonTypeC1() throws Exception {
 		resolve(406, "EvalNestedTypeTests$C$1");
 	}
-	
+
 	public void testAnonTypeDB() throws Exception {
 		resolve(455, "EvalNestedTypeTests$1$DB");
 	}
-	
+
 	public void testAnonTypeDC() throws Exception {
 		resolve(481, "EvalNestedTypeTests$1$DC");
 	}
-	
+
 	public void testAnonType11() throws Exception {
 		resolve(506, "EvalNestedTypeTests$1$1");
-	}	
+	}
 
 	public void testTopLevelType() throws Exception {
 		resolve(523, "EvalNestedTypeTests");
 	}
-	
+
 	public void testTypeEB() throws Exception {
 		resolve(566, "EvalNestedTypeTests$E$EB");
 	}
-	
+
 	public void testTypeEC() throws Exception {
 		resolve(592, "EvalNestedTypeTests$E$EC");
 	}
-	
+
 	public void testAnonTypeE1() throws Exception {
 		resolve(616, "EvalNestedTypeTests$E$1");
-	}	
-	
+	}
+
 	public void testAnonTypeFB() throws Exception {
 		resolve(664, "EvalNestedTypeTests$2$FB");
 	}
-	
+
 	public void testAnonTypeFC() throws Exception {
 		resolve(690, "EvalNestedTypeTests$2$FC");
 	}
-	
+
 	public void testAnonType21() throws Exception {
 		resolve(714, "EvalNestedTypeTests$2$1");
 	}
-	
+
 	/**
 	 * Performs a resolution test. Debugs to a breakpoint and resolves the
 	 * declaring type of the stack frame.
-	 * 
+	 *
 	 * @param line breakpoint line number
 	 * @param expectedName expected fully qualified name of resolved type
 	 * @throws Exception on failure
@@ -145,7 +145,7 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}	
+		}
+	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/state/RefreshStateTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/state/RefreshStateTests.java
index 5be4b7f..13ad235 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/state/RefreshStateTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/state/RefreshStateTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,7 +29,7 @@
 /**
  * Tests that state refresh works after modifying the target state
  * with a custom JDWP command.
- * 
+ *
  * @since 3.6
  */
 public class RefreshStateTests extends AbstractDebugTest {
@@ -37,16 +37,16 @@
 	public RefreshStateTests(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Resume a thread behind the scenes and ensure model state updates appropriately.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testThreadHasResumed() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.CallLoop";
 		ILineBreakpoint bp = createLineBreakpoint(16, "org.eclipse.debug.tests.targets.Looper");
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -58,12 +58,12 @@
 			outData.writeLong(reference.getUniqueId());
 			byte[] reply = jdiTarget.sendCommand((byte)11, (byte)3, outBytes.toByteArray());
 			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
-			
+
 			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
-			
+
 			// model should still be suspended
 			assertTrue("Model should be in suspended state", thread.isSuspended());
-			
+
 			// refresh the model, expect a resume event
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.RESUME, thread);
 			jdiTarget.refreshState();
@@ -75,19 +75,19 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Resume all threads behind the scenes and ensure model state updates appropriately.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testAllThreadsResumed() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.CallLoop";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, "org.eclipse.debug.tests.targets.Looper");
 		bp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -104,10 +104,10 @@
 				JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
 				assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
 			}
-			
+
 			// model should still be suspended
 			assertTrue("Model should be in suspended state", jdiTarget.isSuspended());
-			
+
 			// refresh the model, expect a resume event
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.RESUME, jdiTarget);
 			jdiTarget.refreshState();
@@ -118,18 +118,18 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
+		}
 	}
-	
+
 	/**
 	 * Suspend a thread behind the scenes and ensure model state updates appropriately.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testThreadHasSuspended() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.CallLoop";
 		ILineBreakpoint bp = createLineBreakpoint(16, "org.eclipse.debug.tests.targets.Looper");
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -140,7 +140,7 @@
 			waiter.waitForEvent();
 			// model should now be in running state
 			assertFalse("Model should now be running", thread.isSuspended());
-			
+
 			// suspend the thread with a JDWP command (set 11, command 2)
 			IJavaObject reference = thread.getThreadObject();
 			ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
@@ -148,37 +148,37 @@
 			outData.writeLong(reference.getUniqueId());
 			byte[] reply = jdiTarget.sendCommand((byte)11, (byte)2, outBytes.toByteArray());
 			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
-			
+
 			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
-			
+
 			// model should still be running
 			assertFalse("Model should be in running state", thread.isSuspended());
-			
+
 			// refresh the model, expect a suspend event
 			waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
 			jdiTarget.refreshState();
 			Object source = waiter.waitForEvent();
 			assertNotNull("Thread never sent suspend event", source);
 			assertEquals("Wrong thread suspended", thread, source);
-			
+
 			// model should be suspended now
 			assertTrue("Model should be in suspended state", thread.isSuspended());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}	
-	
+		}
+	}
+
 	/**
 	 * Suspend all threads behind the scenes and ensure model state updates appropriately.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testAllThreadsSuspended() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.CallLoop";
 		ILineBreakpoint bp = createLineBreakpoint(16, "org.eclipse.debug.tests.targets.Looper");
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -189,7 +189,7 @@
 			waiter.waitForEvent();
 			// model should now be in running state
 			assertFalse("Model should now be running", thread.isSuspended());
-			
+
 			IThread[] threads = jdiTarget.getThreads();
 			for (int i = 0; i < threads.length; i++) {
 				IJavaThread jThread = (IJavaThread) threads[i];
@@ -202,35 +202,35 @@
 				JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
 				assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
 			}
-			
-			
+
+
 			// model should still be running
 			assertFalse("Model should be in running state", jdiTarget.isSuspended());
-			
+
 			// refresh the model, expect a suspend event
 			waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, jdiTarget);
 			jdiTarget.refreshState();
 			Object source = waiter.waitForEvent();
 			assertNotNull("Target never sent suspend event", source);
-			
+
 			// model should be suspended now
 			assertTrue("Model should be in suspended state", jdiTarget.isSuspended());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}		
+		}
+	}
 
 	/**
 	 * Suspend the entire target behind the scenes and ensure model state updates appropriately.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testTargetHasSuspended() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.CallLoop";
 		ILineBreakpoint bp = createLineBreakpoint(16, "org.eclipse.debug.tests.targets.Looper");
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -241,7 +241,7 @@
 			waiter.waitForEvent();
 			// model should now be in running state
 			assertFalse("Model should now be running", thread.isSuspended());
-			
+
 			// suspend the target with a JDWP command (set 1, command 8)
 			IJavaObject reference = thread.getThreadObject();
 			ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
@@ -249,37 +249,37 @@
 			outData.writeLong(reference.getUniqueId());
 			byte[] reply = jdiTarget.sendCommand((byte)1, (byte)8, outBytes.toByteArray());
 			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
-			
+
 			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
-			
+
 			// model should still be running
 			assertFalse("Model should be in running state", jdiTarget.isSuspended());
-			
+
 			// refresh the model, expect a suspend event
 			waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, jdiTarget);
 			jdiTarget.refreshState();
 			Object source = waiter.waitForEvent();
 			assertNotNull("Target never sent suspend event", source);
-			
+
 			// model should be suspended now
 			assertTrue("Model should be in suspended state", jdiTarget.isSuspended());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}		
-	
+		}
+	}
+
 	/**
 	 * Resume a target behind the scenes and ensure model state updates appropriately.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	public void testTargetHasResumed() throws Exception {
 		String typeName = "org.eclipse.debug.tests.targets.CallLoop";
 		IJavaLineBreakpoint bp = createLineBreakpoint(16, "org.eclipse.debug.tests.targets.Looper");
 		bp.setSuspendPolicy(IJavaBreakpoint.SUSPEND_VM);
-		
+
 		IJavaThread thread = null;
 		try {
 			thread= launchToLineBreakpoint(typeName, bp);
@@ -291,12 +291,12 @@
 			outData.writeLong(reference.getUniqueId());
 			byte[] reply = jdiTarget.sendCommand((byte)1, (byte)9, outBytes.toByteArray());
 			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
-			
+
 			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
-			
+
 			// model should still be suspended
 			assertTrue("Model should be in suspended state", jdiTarget.isSuspended());
-			
+
 			// refresh the model, expect a resume event
 			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.RESUME, jdiTarget);
 			jdiTarget.refreshState();
@@ -307,6 +307,6 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}	
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/AbstractDebugUiTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/AbstractDebugUiTests.java
new file mode 100644
index 0000000..c501b7e
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/AbstractDebugUiTests.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ *  Copyright (c) 2017 Andrey Loskutov and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ *  Contributors:
+ *     Andrey Loskutov <loskutov@gmx.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.ui;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+import org.eclipse.jdt.debug.tests.TestUtil;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Base class for UI related debug tests.
+ */
+public abstract class AbstractDebugUiTests extends AbstractDebugTest {
+
+	// prefs to restore
+	private String switch_on_launch;
+	private String switch_on_suspend;
+	private String debug_perspectives;
+	private String user_view_bindings;
+	private boolean activate_debug_view;
+
+	public AbstractDebugUiTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
+		switch_on_launch = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE);
+		switch_on_suspend = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND);
+		debug_perspectives = preferenceStore.getString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES);
+		user_view_bindings = preferenceStore.getString(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS);
+		activate_debug_view = preferenceStore.getBoolean(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW);
+
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.NEVER);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, MessageDialogWithToggle.NEVER);
+		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, IDebugUIConstants.ID_DEBUG_PERSPECTIVE + "," +
+				JavaUI.ID_PERSPECTIVE + ",");
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, IInternalDebugCoreConstants.EMPTY_STRING);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, true);
+		sync(() -> TestUtil.waitForJobs(getName(), 10, 1000));
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, switch_on_suspend);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, switch_on_launch);
+		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, debug_perspectives);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, user_view_bindings);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, activate_debug_view);
+		sync(() -> TestUtil.waitForJobs(getName(), 10, 1000));
+		super.tearDown();
+	}
+
+	/**
+	 * Switches to the specified perspective in the given window, and resets the perspective.
+	 *
+	 * @param window
+	 * @param perspectiveId
+	 */
+	protected void switchPerspective(IWorkbenchWindow window, String perspectiveId) {
+		IPerspectiveDescriptor descriptor = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
+		assertNotNull("missing perspective " + perspectiveId, descriptor);
+		IWorkbenchPage page = window.getActivePage();
+		page.setPerspective(descriptor);
+		page.resetPerspective();
+		TestUtil.runEventLoop();
+	}
+
+	/**
+	 * Switches to and resets the specified perspective in the active workbench window.
+	 *
+	 * @return the window in which the perspective is ready
+	 */
+	protected IWorkbenchWindow resetPerspective(final String id) throws Exception {
+		final IWorkbenchWindow[] windows = new IWorkbenchWindow[1];
+		sync(() -> {
+			IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			switchPerspective(window, id);
+			windows[0] = window;
+		});
+		return windows[0];
+	}
+
+	/**
+	 * Siwtches to and resets the debug perspective in the active workbench window.
+	 *
+	 * @return the window in which the perspective is ready
+	 */
+	protected IWorkbenchWindow resetDebugPerspective() throws Exception {
+		return resetPerspective(IDebugUIConstants.ID_DEBUG_PERSPECTIVE);
+	}
+
+	/**
+	 * Swtches to and resets the java perspective in the active workbench window.
+	 *
+	 * @return the window in which the perspective is ready
+	 */
+	protected IWorkbenchWindow resetJavaPerspective() throws Exception {
+		return resetPerspective(JavaUI.ID_PERSPECTIVE);
+	}
+
+	/**
+	 * Sync exec the given runnable, re-throwing exceptions in the current thread
+	 *
+	 * @param r
+	 * @throws Exception
+	 */
+	protected void sync(Runnable r) throws Exception {
+		AtomicReference<Exception> error = new AtomicReference<>();
+		DebugUIPlugin.getStandardDisplay().syncExec(() -> {
+			try {
+				r.run();
+			}
+			catch (Exception t) {
+				error.set(t);
+			}
+		});
+		if (error.get() != null) {
+			throw error.get();
+		}
+	}
+
+	/**
+	 * Sync exec the given runnable, re-throwing exceptions in the current thread
+	 *
+	 * @param c
+	 * @throws Exception
+	 */
+	protected <V> V sync(Callable<V> c) throws Exception {
+		AtomicReference<Throwable> error = new AtomicReference<>();
+		AtomicReference<V> result = new AtomicReference<>();
+		DebugUIPlugin.getStandardDisplay().syncExec(() -> {
+			try {
+				result.set(c.call());
+			}
+			catch (Throwable t) {
+				error.set(t);
+			}
+		});
+		if (error.get() != null) {
+			throwException(error.get());
+		}
+		return result.get();
+	}
+
+	/**
+	 * This and the another {@link #throwException1(Throwable)} method below are here to allow to catch AssertionFailedError's and other
+	 * non-Exceptions happened in the UI thread
+	 *
+	 * @param exception
+	 */
+	private static void throwException(Throwable exception) {
+		AbstractDebugUiTests.<RuntimeException> throwException1(exception);
+	}
+
+	/**
+	 * @param dummy to make compiler happy
+	 */
+	@SuppressWarnings("unchecked")
+	private static <T extends Throwable> void throwException1(Throwable exception) throws T {
+		throw (T) exception;
+	}
+
+	protected void processUiEvents(long millis) throws Exception {
+		Thread.sleep(millis);
+		if (Display.getCurrent() == null) {
+			sync(() -> TestUtil.runEventLoop());
+		} else {
+			TestUtil.runEventLoop();
+		}
+	}
+
+	protected IWorkbenchPage getActivePage() {
+		IWorkbench workbench = PlatformUI.getWorkbench();
+		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+		if (window == null) {
+			window = workbench.getWorkbenchWindows()[0];
+			Shell shell = window.getShell();
+			shell.moveAbove(null);
+			shell.setActive();
+			shell.forceActive();
+		}
+		return window.getActivePage();
+	}
+
+	protected IEditorPart openEditor(String type) throws Exception {
+		IFile resource = (IFile) getResource(type);
+		IEditorPart editor = IDE.openEditor(getActivePage(), resource);
+		assertNotNull(editor);
+		processUiEvents(100);
+		return editor;
+	}
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/Accessor.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/Accessor.java
index 22b977f..6dfd7ed 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/Accessor.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/Accessor.java
@@ -20,7 +20,7 @@
 /**
  * Helper class for accessing classes and members which cannot be accessed using standard Java
  * access control like private or package visible elements.
- * 
+ *
  * @since 3.7
  */
 public class Accessor {
@@ -33,7 +33,7 @@
 	/**
 	 * Creates an accessor for the given <code>instance</code> and <code>class</code>. Only
 	 * non-inherited members that particular <code>class</code> can be accessed.
-	 * 
+	 *
 	 * @param instance
 	 *            the instance
 	 * @param clazz
@@ -49,7 +49,7 @@
 	/**
 	 * Creates an accessor for the given <code>instance</code> and <code>class</code>. Only
 	 * non-inherited members that particular <code>class</code> can be accessed.
-	 * 
+	 *
 	 * @param instance
 	 *            the instance
 	 * @param className
@@ -78,7 +78,7 @@
 	 * Object. Use {@link #Accessor(String, ClassLoader, Class[], Object[])} if this is not the
 	 * case.
 	 * </p>
-	 * 
+	 *
 	 * @param className
 	 *            the name of the class
 	 * @param classLoader
@@ -92,7 +92,7 @@
 
 	/**
 	 * Creates an accessor for the given class.
-	 * 
+	 *
 	 * @param className
 	 *            the name of the class
 	 * @param classLoader
@@ -138,7 +138,7 @@
 	 * <p>
 	 * This constructor is used to access static stuff.
 	 * </p>
-	 * 
+	 *
 	 * @param className
 	 *            the name of the class
 	 * @param classLoader
@@ -159,7 +159,7 @@
 	 * <p>
 	 * This constructor is used to access static stuff.
 	 * </p>
-	 * 
+	 *
 	 * @param clazz
 	 *            the class
 	 */
@@ -174,7 +174,7 @@
 	 * In order to get the type information from the given arguments all those arguments must be
 	 * instance of Object. Use {@link #invoke(String, Class[], Object[])} if this is not the case.
 	 * </p>
-	 * 
+	 *
 	 * @param methodName
 	 *            the method name
 	 * @param arguments
@@ -187,7 +187,7 @@
 
 	/**
 	 * Invokes the method with the given method name and arguments.
-	 * 
+	 *
 	 * @param methodName
 	 *            the method name
 	 * @param types
@@ -221,7 +221,7 @@
 
 	/**
 	 * Assigns the given value to the field with the given name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the field name
 	 * @param value
@@ -240,7 +240,7 @@
 
 	/**
 	 * Assigns the given value to the field with the given name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the field name
 	 * @param value
@@ -259,7 +259,7 @@
 
 	/**
 	 * Assigns the given value to the field with the given name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the field name
 	 * @param value
@@ -278,7 +278,7 @@
 
 	/**
 	 * Returns the value of the field with the given name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the field name
 	 * @return the value of the field
@@ -298,7 +298,7 @@
 
 	/**
 	 * Returns the value of the field with the given name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the field name
 	 * @return the value of the field
@@ -318,7 +318,7 @@
 
 	/**
 	 * Returns the value of the field with the given name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the field name
 	 * @return the value of the field
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugViewPerspectiveFactory.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugViewPerspectiveFactory.java
new file mode 100644
index 0000000..fe6cf11
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugViewPerspectiveFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ *  Copyright (c) 2017 Andrey Loskutov and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *
+ *  Contributors:
+ *     Andrey Loskutov <loskutov@gmx.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.ui;
+
+import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.console.IConsoleConstants;
+
+/**
+ * The debug perspective factory for debug view tests
+ */
+public class DebugViewPerspectiveFactory implements IPerspectiveFactory {
+
+	public static final String ID = DebugViewPerspectiveFactory.class.getName();
+
+	@Override
+	public void createInitialLayout(IPageLayout layout) {
+		IFolderLayout rightFolder = layout.createFolder(IInternalDebugUIConstants.ID_TOOLS_FOLDER_VIEW, IPageLayout.LEFT, (float) 0.50, layout.getEditorArea());
+		rightFolder.addView(IDebugUIConstants.ID_DEBUG_VIEW);
+
+		IFolderLayout consoleFolder = layout.createFolder(IInternalDebugUIConstants.ID_CONSOLE_FOLDER_VIEW, IPageLayout.BOTTOM, (float) 0.65, layout.getEditorArea());
+		consoleFolder.addView(IPageLayout.ID_PROJECT_EXPLORER);
+		consoleFolder.addView(IConsoleConstants.ID_CONSOLE_VIEW);
+
+	}
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DetailPaneManagerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DetailPaneManagerTests.java
index 4055e3d..62bec77 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DetailPaneManagerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DetailPaneManagerTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -37,12 +37,12 @@
  * The manager is responsible for the default detail pane contributed by the
  * platform and detail panes contributed at the org.eclipse.debug.ui.detailPaneFactories.
  * The manager must keep track of which is the preferred detail pane to display and
- * know what detail panes can be displayed for certain types of selections. 
+ * know what detail panes can be displayed for certain types of selections.
  */
 public class DetailPaneManagerTests extends AbstractDebugTest {
 
 	DetailPaneManager fManager;
-	
+
 	/**
 	 * Initializes the test class and gets the singleton detail pane manager.
 	 * @param name
@@ -68,20 +68,20 @@
 	public void testGetUserPreferredDetailPane() {
 		String id = fManager.getUserPreferredDetailPane(new HashSet<String>());
 		assertEquals("Incorrect pane ID", null, id);
-		
+
 		Set<String> detailPanes = new HashSet<String>();
 		detailPanes.add("NewPane1");
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", null, id);
-		
+
 		detailPanes.add("NewPane2");
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", null, id);
-		
+
 		detailPanes.add(DefaultDetailPane.ID);
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", null, id);
-		
+
 		detailPanes.clear();
 		detailPanes.add(DefaultDetailPane.ID);
 		id = fManager.getUserPreferredDetailPane(detailPanes);
@@ -96,22 +96,22 @@
 		fManager.setPreferredDetailPane(null, null);
 		String id = fManager.getUserPreferredDetailPane(null);
 		assertEquals("Incorrect pane ID", null, id);
-		
+
 		fManager.setPreferredDetailPane(null, "Example");
 		id = fManager.getUserPreferredDetailPane(null);
 		assertEquals("Incorrect pane ID", null, id);
-		
+
 		Set<String> detailPanes = new HashSet<String>();
 		detailPanes.add("Example1");
 		fManager.setPreferredDetailPane(detailPanes, "Example1");
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", "Example1", id);
-		
+
 		detailPanes.add("Example2");
 		fManager.setPreferredDetailPane(detailPanes, "Example2");
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", "Example2", id);
-		
+
 		detailPanes.add(DefaultDetailPane.ID);
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", null, id);
@@ -119,20 +119,20 @@
 		id = fManager.getUserPreferredDetailPane(detailPanes);
 		assertEquals("Incorrect pane ID", "Example2", id);
 	}
-	
+
 	/**
-	 * Tests that the manager can determine the preferred pane 
+	 * Tests that the manager can determine the preferred pane
 	 * given a selection.
 	 */
 	public void testGetPreferredPaneFromSelection() {
 		IStructuredSelection selection = null;
 		String id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
-		
+
 		selection = new StructuredSelection();
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
-		
+
 		selection = new StructuredSelection(new String[]{"example selection"});
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
@@ -140,21 +140,21 @@
 		selection = new StructuredSelection(new IJavaVariable[]{new JDIPlaceholderVariable("test var",null)});
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
-		
+
 		// The factory sets the Table detail pane as the default if the first string is "test pane is default".
 		selection = new StructuredSelection(new String[]{"test pane is default","example selection"});
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", TableDetailPane.ID, id);
-		
+
 		selection = new StructuredSelection(new String[]{"test pane is default","example selection"});
 		fManager.setPreferredDetailPane(fManager.getAvailablePaneIDs(selection), DefaultDetailPane.ID);
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
-		
+
 		selection = new StructuredSelection(new String[]{"String1","String2","String3"});
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
-		
+
 		selection = new StructuredSelection(new JDIDebugElement[]{});
 		id = fManager.getPreferredPaneFromSelection(selection);
 		assertEquals("Incorrect pane ID", DefaultDetailPane.ID, id);
@@ -168,25 +168,25 @@
 		IStructuredSelection selection = null;
 		Set<String> result = fManager.getAvailablePaneIDs(selection);
 		assertTrue("Set was incorrect",result.size()==1 && result.contains(DefaultDetailPane.ID));
-		
+
 		selection = new StructuredSelection(new String[]{"example selection"});
 		result = fManager.getAvailablePaneIDs(selection);
 		assertTrue("Set was incorrect",result.size()==1 && result.contains(DefaultDetailPane.ID));
-		
+
 		selection = new StructuredSelection(new String[]{"test pane is default","example selection"});
 		result = fManager.getAvailablePaneIDs(selection);
 		assertTrue("Set was incorrect",result.size()==2 && result.contains(DefaultDetailPane.ID) && result.contains(TableDetailPane.ID));
-		
+
 		selection = new StructuredSelection(new Object[]{new JDIPlaceholderVariable("test var",null)});
 		result = fManager.getAvailablePaneIDs(selection);
 		assertTrue("Set was incorrect",result.size()==2 && result.contains(DefaultDetailPane.ID) && result.contains(SimpleDetailPane.ID));
-		
+
 		// Simple detail pane only available if selection has length of 1, containing a java variable
 		selection = new StructuredSelection(new Object[]{"String1",new JDIPlaceholderVariable("test var",null),"String3"});
 		result = fManager.getAvailablePaneIDs(selection);
 		assertTrue("Set was incorrect",result.size()==2 && result.contains(DefaultDetailPane.ID) && result.contains(TableDetailPane.ID));
 	}
-	
+
 	/**
 	 * Checks that the manager can query the correct factory to produce
 	 * a detail pane with the given ID.
@@ -194,13 +194,13 @@
 	public void testGetDetailPaneFromID() {
 		IDetailPane pane = fManager.getDetailPaneFromID(null);
 		assertNull("Incorrect pane returned",pane);
-		
+
 		pane = fManager.getDetailPaneFromID("ThisPaneDoesNotExist");
 		assertNull("Incorrect pane returned",pane);
-		
+
 		pane = fManager.getDetailPaneFromID(DefaultDetailPane.ID);
 		assertNotNull("Incorrect pane returned",pane);
-		
+
 		pane = fManager.getDetailPaneFromID(SimpleDetailPane.ID);
 		assertNotNull("Incorrect pane returned",pane);
 	}
@@ -212,16 +212,16 @@
 	public void testGetNameFromID() {
 		String name = fManager.getNameFromID(null);
 		assertEquals("Incorrect name returned",null,name);
-		
+
 		name = fManager.getNameFromID("ThisPaneDoesNotExist");
 		assertEquals("Incorrect name returned",null,name);
-		
+
 		name = fManager.getNameFromID(DefaultDetailPane.ID);
 		assertEquals("Incorrect name returned",DefaultDetailPane.NAME,name);
-		
+
 		name = fManager.getNameFromID(SimpleDetailPane.ID);
 		assertEquals("Incorrect name returned","Example Pane: Colorful Detail Pane",name);
-		
+
 	}
 
 	/**
@@ -231,13 +231,13 @@
 	public void testGetDescriptionFromID() {
 		String description = fManager.getDescriptionFromID(null);
 		assertEquals("Incorrect name returned",null,description);
-		
+
 		description = fManager.getDescriptionFromID("ThisPaneDoesNotExist");
 		assertEquals("Incorrect name returned",null,description);
-		
+
 		description = fManager.getDescriptionFromID(DefaultDetailPane.ID);
 		assertEquals("Incorrect name returned",DefaultDetailPane.DESCRIPTION,description);
-		
+
 		description = fManager.getDescriptionFromID(SimpleDetailPane.ID);
 		assertEquals("Incorrect name returned","Example pane that displays a color for variables depending on their access level.",description);
 	}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/InstructionPointerManagerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/InstructionPointerManagerTests.java
index 761ed71..ec5a30b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/InstructionPointerManagerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/InstructionPointerManagerTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -54,7 +54,7 @@
  * Tests functionality of the InstructionPointerManager.
  * The tests are not currently part of the automated suite because they produce
  * transient failures that could not be tracked down.
- * 
+ *
  * @since 3.3
  * @see InstructionPointerManager
  */
@@ -63,31 +63,31 @@
 	private Object fLock = new Object();
 	private Annotation fAddedAnnotation = null;
 	private Annotation fRemovedAnnotation = null;
-	
+
 	private MyPerspectiveListener fPerspectiveListener;
 	private MyAnnotationListener fAnnotationListener;
 	private IPartListener2 fPartListener;
 	private Set<IAnnotationModel> fAnnotationModelsWithListeners = new HashSet<IAnnotationModel>();
-	
+
 	private static final String typeThreadStack = "org.eclipse.debug.tests.targets.ThreadStack";
 	private static final String typeClassOne = "org.eclipse.debug.tests.targets.ClassOne";
 	private static final String typeClassTwo = "org.eclipse.debug.tests.targets.ClassTwo";
-	
+
 	private IJavaDebugTarget target1;
 	private IJavaDebugTarget target2;
 	private IJavaThread thread1;
 	private IJavaThread thread2;
 	private IJavaThread thread3;
 	private IJavaThread thread4;
-	
+
 	public InstructionPointerManagerTests(String name) {
 		super(name);
 	}
-	
+
 	public void testManagerWithEditorReuse() throws Exception{
 		boolean restore = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_REUSE_EDITOR);
 		DebugUIPlugin.getDefault().getPreferenceStore().setValue(IDebugUIConstants.PREF_REUSE_EDITOR, true);
-		
+
 		try{
 			addAndRemoveAnnotations(new int[]{1,2,1,2,1,0,1,1}, new int[]{1,1,1,1,1,0,1,1});
 		} finally {
@@ -112,14 +112,14 @@
                     activeWorkbenchWindow.removePerspectiveListener(getPerspectiveListener());
                 }
             };
-            DebugUIPlugin.getStandardDisplay().asyncExec(cleanup);	
+            DebugUIPlugin.getStandardDisplay().asyncExec(cleanup);
 		}
 	}
-	
+
 	public void testManagerWithNoEditorReuse() throws Exception{
 		boolean restore = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_REUSE_EDITOR);
 		DebugUIPlugin.getDefault().getPreferenceStore().setValue(IDebugUIConstants.PREF_REUSE_EDITOR, false);
-		
+
 		try{
 			addAndRemoveAnnotations(new int[]{1,2,3,4,5,3,2,1}, new int[]{1,1,2,2,3,2,2,1});
 		} finally {
@@ -144,23 +144,23 @@
                     activeWorkbenchWindow.removePerspectiveListener(getPerspectiveListener());
                 }
             };
-            DebugUIPlugin.getStandardDisplay().asyncExec(cleanup);	
+            DebugUIPlugin.getStandardDisplay().asyncExec(cleanup);
 		}
 	}
-	
+
 	/**
 	 * Tests the ability of the manager to update it's set and mapping as
 	 * annotations are added and removed.
-	 * 
+	 *
 	 * First, all editors are closed and the manager is checked to ensure there are 0 IPCs.
-	 * 
+	 *
 	 * <p>Next, annotations are created as follows:<br>
 	 * (numbers in brackets correspond to index of expected IPC and Mapping counts checked)
 	 * <pre>
 	 * Target1	- Thread1	- IPC1	- ClassOne		- Editor1 (line 20)	[0]
 	 *      	- Thread2	- IPC2	- ClassOne		- Editor1 (line 20)	[1]
 	 * 						- IPC3	- ThreadStack	- Editor2 (line 28)	[2]
-	 * 
+	 *
 	 * Target2	- Thread3	- IPC4	- ThreadStack	- Editor2 (line 41) [3]
 	 *      	- Thread4	- IPC5	- ClassTwo		- Editor3 (line 24) [4]
 	 * </pre>
@@ -181,7 +181,7 @@
 	private void addAndRemoveAnnotations(int[] expectedIPCCounts, int[] expectedMappingCounts) throws Exception{
 		assertEquals("Incorrect number of expected counts", 8, expectedIPCCounts.length);
 		assertEquals("Incorrect number of expected counts", 8, expectedMappingCounts.length);
-		
+
 		// Close all editors
 	    Runnable closeAll = new Runnable() {
             @Override
@@ -194,9 +194,9 @@
         DebugUIPlugin.getStandardDisplay().syncExec(closeAll);
         assertEquals("Instruction pointer count was incorrect", 0, InstructionPointerManager.getDefault().getInstructionPointerCount());
         assertEquals("Editor mapping count was incorrect", 0, InstructionPointerManager.getDefault().getEditorMappingCount());
-		         
+
         // ADD ANNOTATIONS
-        
+
         // Launch a target creating two threads, both suspend in ClassOne, one will automatically be selected
         IJavaLineBreakpoint breakpoint = createLineBreakpoint(20, typeClassOne);
         fAddedAnnotation = null;
@@ -208,7 +208,7 @@
         waitForAnnotationToBeAdded();
         assertEquals("Instruction pointer count was incorrect", expectedIPCCounts[0], InstructionPointerManager.getDefault().getInstructionPointerCount());
         assertEquals("Editor mapping count was incorrect", expectedMappingCounts[0], InstructionPointerManager.getDefault().getEditorMappingCount());
-        
+
         // Find and select the top stack frame of the other thread
         Runnable openParent = new Runnable() {
             @Override
@@ -239,7 +239,7 @@
         assertNotNull("Thread not selected",thread2);
         assertEquals("Instruction pointer count was incorrect", expectedIPCCounts[1], InstructionPointerManager.getDefault().getInstructionPointerCount());
         assertEquals("Editor mapping count was incorrect", expectedMappingCounts[1], InstructionPointerManager.getDefault().getEditorMappingCount());
-        
+
         // Select the same stack frame and make sure IPC count doesn't change
         Runnable selectSameStackFrame = new Runnable() {
             @Override
@@ -249,7 +249,7 @@
             	newSegments[0] = target1.getLaunch();
             	newSegments[1] = target1;
             	newSegments[2] = thread2;
-            	try { 
+            	try {
             		newSegments[3] = thread2.getTopStackFrame();
             	} catch (DebugException e) {
 					fail("Exception: " + e.getMessage());
@@ -263,7 +263,7 @@
         waitForAnnotationToBeAdded();
         assertEquals("Instruction pointer count was incorrect", expectedIPCCounts[1], InstructionPointerManager.getDefault().getInstructionPointerCount());
         assertEquals("Editor mapping count was incorrect", expectedMappingCounts[1], InstructionPointerManager.getDefault().getEditorMappingCount());
-        
+
         // Select the next stack frame in the same thread
         Runnable selectSecondStackFrame = new Runnable() {
             @Override
@@ -288,7 +288,7 @@
         // Failure here, reuse, expected 1 but was 2, also with no reuse, expected 3 but was 2
         assertEquals("Instruction pointer count was incorrect", expectedIPCCounts[2], InstructionPointerManager.getDefault().getInstructionPointerCount());
         assertEquals("Editor mapping count was incorrect", expectedMappingCounts[2], InstructionPointerManager.getDefault().getEditorMappingCount());
-	
+
         // Remove the breakpoint from before and create new ones, start a new target
         breakpoint.delete();
         createLineBreakpoint(41, typeThreadStack);
@@ -297,7 +297,7 @@
         assertNotNull("Target was not launched", target2);
         assertEquals("Instruction pointer count was incorrect", expectedIPCCounts[2], InstructionPointerManager.getDefault().getInstructionPointerCount());
         assertEquals("Editor mapping count was incorrect", expectedMappingCounts[2], InstructionPointerManager.getDefault().getEditorMappingCount());
-	
+
        // Select the stack frame from the new debug target displaying ThreadStack
        Runnable openOtherDebugTarget = new Runnable() {
             @Override
@@ -337,7 +337,7 @@
        waitForAnnotationToBeAdded();
        assertEquals("Instruction pointer count was incorrect", expectedIPCCounts[3], InstructionPointerManager.getDefault().getInstructionPointerCount());
        assertEquals("Editor mapping count was incorrect", expectedMappingCounts[3], InstructionPointerManager.getDefault().getEditorMappingCount());
-       
+
        // Select the other thread from the new target displaying ClassTwo
        Runnable openOtherThread = new Runnable() {
             @Override
@@ -370,7 +370,7 @@
        assertEquals("Editor mapping count was incorrect", expectedMappingCounts[4], InstructionPointerManager.getDefault().getEditorMappingCount());
 
        // REMOVE ANNOTATIONS
-       
+
        // Remove target2
        fRemovedAnnotation = null;
        target2.terminate();
@@ -379,7 +379,7 @@
        assertEquals("Editor mapping count was incorrect", expectedMappingCounts[5], InstructionPointerManager.getDefault().getEditorMappingCount());
 
        // TODO Selection of the other target does not occur automatically.  This functionality may change and will break this test.
-       
+
        // Resume thread1
        fRemovedAnnotation = null;
        thread1.resume();
@@ -423,7 +423,7 @@
        assertEquals("Instruction pointer count was incorrect", 0, InstructionPointerManager.getDefault().getInstructionPointerCount());
        assertEquals("Editor mapping count was incorrect", 0, InstructionPointerManager.getDefault().getEditorMappingCount());
 	}
-	
+
 	protected MyPerspectiveListener getPerspectiveListener(){
 		if (fPerspectiveListener == null){
 			fPerspectiveListener = new MyPerspectiveListener();
@@ -431,7 +431,7 @@
 		}
 		return fPerspectiveListener;
 	}
-	
+
 	protected MyAnnotationListener getAnnotationListener(){
 		if (fAnnotationListener == null){
 			fAnnotationListener = new MyAnnotationListener();
@@ -439,7 +439,7 @@
 		}
 		return fAnnotationListener;
 	}
-	
+
 	private IPartListener2 getPartListener(){
 		if (fPartListener == null){
 			fPartListener = new MyPartListener();
@@ -447,15 +447,15 @@
 		}
 		return fPartListener;
 	}
-	
+
 	private void waitForAnnotationToBeAdded() throws Exception{
 		synchronized (fLock) {
 		    if (fAddedAnnotation == null) {
 		        fLock.wait(5000);
 		    }
-        }		
+        }
 		assertNotNull("Annotation was not added properly");
-		
+
 		// Synchronize with the UI thread so we know that the annotations have finished
 		Runnable runner = new Runnable(){
 			@Override
@@ -465,15 +465,15 @@
 		};
 		DebugUIPlugin.getStandardDisplay().syncExec(runner);
 	}
-	
+
 	private void waitForAnnotationToBeRemoved() throws Exception{
 		synchronized (fLock) {
 		    if (fRemovedAnnotation == null) {
 		    	fLock.wait(5000);
 		    }
-        }		
+        }
 		assertNotNull("Annotation was not removed properly");
-		
+
 		// Synchronize with the UI thread so we know that the annotations have finished
 		Runnable runner = new Runnable(){
 			@Override
@@ -483,17 +483,17 @@
 		};
 		DebugUIPlugin.getStandardDisplay().syncExec(runner);
 	}
-	
+
 	class MyPerspectiveListener implements IPerspectiveListener2 {
 
 		private String fTypeName = IInternalDebugCoreConstants.EMPTY_STRING;
 		private String fTitle = IInternalDebugCoreConstants.EMPTY_STRING;
-		
+
 		@Override
 		public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {}
 		@Override
 		public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {}
-			
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference, java.lang.String)
 		 */
@@ -508,7 +508,7 @@
         	        IAnnotationModel annModel = docProvider.getAnnotationModel(editorInput);
         	        if (annModel == null) {
         	            fail("Could not get the annotation model");
-        	        }  
+        	        }
         	        annModel.addAnnotationModelListener(getAnnotationListener());
         	        fAnnotationModelsWithListeners.add(annModel);
         		} else {
@@ -532,12 +532,12 @@
 				fTitle = typeName + ".java";
 			}
 		}
-		
+
 		public String getTypeName(){
 			return fTypeName;
 		}
 	}
-	
+
 	class MyPartListener implements IPartListener2{
 		@Override
 		public void partActivated(IWorkbenchPartReference partRef) {}
@@ -553,7 +553,7 @@
 		public void partBroughtToTop(IWorkbenchPartReference partRef) {}
 		@Override
 		public void partClosed(IWorkbenchPartReference partRef) {}
-	
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
 		 */
@@ -567,7 +567,7 @@
     	        IAnnotationModel annModel = docProvider.getAnnotationModel(editorInput);
     	        if (annModel == null) {
     	            fail("Could not get the annotation model");
-    	        }  
+    	        }
     	        annModel.addAnnotationModelListener(getAnnotationListener());
     	        fAnnotationModelsWithListeners.add(annModel);
     		} else {
@@ -575,7 +575,7 @@
     		}
 		}
 	}
-	
+
 	class MyAnnotationListener implements IAnnotationModelListener, IAnnotationModelListenerExtension{
 
 		@Override
@@ -587,10 +587,10 @@
 						fAddedAnnotation = annotations[i];
 						fLock.notifyAll();
 						System.out.println("Annotation added to editor: " + fAddedAnnotation + " (" + this + ")" + event.getAnnotationModel());
-							
+
 					}
 				}
-			}	
+			}
 			annotations = event.getRemovedAnnotations();
 			for (int i = 0; i < annotations.length; i++) {
 				if (annotations[i] instanceof InstructionPointerAnnotation){
@@ -599,7 +599,7 @@
 						fLock.notifyAll();
 					}
 				}
-			}	
+			}
 		}
 
 		@Override
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/OpenFromClipboardTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/OpenFromClipboardTests.java
index 6fffdcc..4a3d594 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/OpenFromClipboardTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/OpenFromClipboardTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -587,8 +587,8 @@
 
 	public void testInvalidPattern_3() throws Exception {
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=426392#c6
-		String s = "java.lang.IllegalArgumentException\n" + 
-				"	at org.eclipse.core.runtime.Assert.isLegal(Assert.java:63)\n" + 
+		String s = "java.lang.IllegalArgumentException\n" +
+				"	at org.eclipse.core.runtime.Assert.isLegal(Assert.java:63)\n" +
 				"	at something.completely.Different(Different.java:47)";
 		assertEquals(INVALID, getMatachingPattern(s));
 	}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java
index d90cda4..bd5d010 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,16 +13,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jdt.debug.core.IJavaThread;
-import org.eclipse.jdt.debug.tests.AbstractDebugTest;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.test.OrderedTestSuite;
 import org.eclipse.ui.IPerspectiveDescriptor;
 import org.eclipse.ui.IPerspectiveListener3;
@@ -30,14 +22,13 @@
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPartReference;
 import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
 
 import junit.framework.Test;
 
 /**
  * Tests view management.
  */
-public class ViewManagementTests extends AbstractDebugTest implements IPerspectiveListener3 {
+public class ViewManagementTests extends AbstractDebugUiTests implements IPerspectiveListener3 {
 
 	public static Test suite() {
 		return new OrderedTestSuite(ViewManagementTests.class);
@@ -57,24 +48,17 @@
 	public static final String VIEW_ONE = "org.eclipse.jdt.debug.tests.context.view.one";
 
 	private Object fEventLock = new Object();
-	
+
 	/**
 	 * List of view ids expecting to open.
 	 */
-	private List<String> fExpectingOpenEvents = new ArrayList<String>();
-	
+	private List<String> fExpectingOpenEvents = new ArrayList<>();
+
 	/**
 	 * List of view ids expecting to close.
 	 */
-	private List<String> fExpectingCloseEvents = new ArrayList<String>();	
-	
-	// prefs to restore
-	private String switch_on_launch;
-	private String switch_on_suspend;
-	private String debug_perspectives;
-	private String user_view_bindings;
-	private boolean activate_debug_view;
-	
+	private List<String> fExpectingCloseEvents = new ArrayList<>();
+
 	/**
 	 * Constructor
 	 * @param name
@@ -82,126 +66,41 @@
 	public ViewManagementTests(String name) {
 		super(name);
 	}
-		
-	/**
-	 * Switches to the specified perspective in the given window, and resets the perspective.
-	 * 
-	 * @param window
-	 * @param perspectiveId
-	 */
-	protected void switchPerspective(IWorkbenchWindow window, String perspectiveId) {
-		IPerspectiveDescriptor descriptor = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
-		assertNotNull("missing perspective " + perspectiveId, descriptor);
-		IWorkbenchPage page = window.getActivePage();
-		page.setPerspective(descriptor);
-		page.resetPerspective();
-	}
-	
-	/**
-	 * Switches to and resets the specified perspective in the active workbench window.
-	 * 
-	 * @return the window in which the perspective is ready
-	 */
-	private IWorkbenchWindow resetPerspective(final String id) {
-		final IWorkbenchWindow[] windows = new IWorkbenchWindow[1];
-		Runnable r = new Runnable() {
-			@Override
-			public void run() {
-				IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-				switchPerspective(window, id);
-				windows[0] = window;
-			}
-		};
-		sync(r);
-		return windows[0];
-	}
-	
-	/**
-	 * Siwtches to and resets the debug perspective in the active workbench window.
-	 * 
-	 * @return the window in which the perspective is ready
-	 */
-	protected IWorkbenchWindow resetDebugPerspective() {
-		return resetPerspective(IDebugUIConstants.ID_DEBUG_PERSPECTIVE);
-	}
-	
-	/**
-	 * Siwtches to and resets the java perspective in the active workbench window.
-	 * 
-	 * @return the window in which the perspective is ready
-	 */
-	protected IWorkbenchWindow resetJavaPerspective() {
-		return resetPerspective(JavaUI.ID_PERSPECTIVE); 
-	}	
-	
-	/**
-	 * Sync exec the given runnable
-	 * 
-	 * @param r
-	 */
-	protected void sync(Runnable r) {
-		DebugUIPlugin.getStandardDisplay().syncExec(r);
-	}
-	
+
 	/**
 	 * Returns whether the specified view is open
-	 * 
+	 *
 	 * @param window
 	 * @param id
 	 * @return
 	 */
-	protected boolean isViewOpen(final IWorkbenchWindow window, final String id) {
+	protected boolean isViewOpen(final IWorkbenchWindow window, final String id) throws Exception {
 		final IViewReference[] refs = new IViewReference[1];
-		Runnable r = new Runnable() {
+		sync(new Runnable() {
 			@Override
 			public void run() {
 				refs[0] = window.getActivePage().findViewReference(id);
 			}
-		};
-		sync(r);
+		});
 		return refs[0] != null;
 	}
 
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
 	@Override
 	protected void setUp() throws Exception {
 		super.setUp();
-		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
-		switch_on_launch = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE);
-		switch_on_suspend = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND);
-		debug_perspectives = preferenceStore.getString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES);
-		user_view_bindings = preferenceStore.getString(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS);
-		activate_debug_view = preferenceStore.getBoolean(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.NEVER);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, MessageDialogWithToggle.NEVER);
-		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, IDebugUIConstants.ID_DEBUG_PERSPECTIVE + "," + 
-				JavaUI.ID_PERSPECTIVE + ",");
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, IInternalDebugCoreConstants.EMPTY_STRING);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, true);
 		fExpectingOpenEvents.clear();
 		fExpectingCloseEvents.clear();
 	}
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
+
 	@Override
 	protected void tearDown() throws Exception {
 		super.tearDown();
-		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, switch_on_suspend);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, switch_on_launch);
-		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, debug_perspectives);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, user_view_bindings); 	
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, activate_debug_view);
 	}
 
 	/**
 	 * Tests that context views auto-open in debug perspective.
 	 * Both context views should auto-open.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAutoOpenDebugPerspective() throws Exception {
@@ -212,7 +111,7 @@
 		String typeName = "Breakpoints";
 		// first line in main
 		createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread= null;
 		IWorkbenchWindow window = null;
 		try {
@@ -228,13 +127,13 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			window.removePerspectiveListener(this);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that context views auto-open in debug perspective, and auto close on termination.
 	 * View "two" should auto-close.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAutoCloseDebugPerspective() throws Exception {
@@ -245,7 +144,7 @@
 		String typeName = "Breakpoints";
 		// first line in main
 		createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread= null;
 		IWorkbenchWindow window = null;
 		try {
@@ -269,13 +168,13 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			window.removePerspectiveListener(this);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that context views auto-open in java perspective.
 	 * Both context views should auto-open as well as standard debug views.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAutoOpenJavaPerspective() throws Exception {
@@ -286,7 +185,7 @@
 		String typeName = "Breakpoints";
 		// first line in main
 		createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread= null;
 		IWorkbenchWindow window = null;
 		try {
@@ -307,13 +206,13 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			window.removePerspectiveListener(this);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Tests that context views auto-open and close in java perspective.
 	 * All views should auto-close in non-standard debug perspective.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAutoCloseJavaPerspective() throws Exception {
@@ -324,7 +223,7 @@
 		String typeName = "Breakpoints";
 		// first line in main
 		createLineBreakpoint(52, typeName);
-		
+
 		IJavaThread thread= null;
 		IWorkbenchWindow window = null;
 		try {
@@ -355,16 +254,16 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 			window.removePerspectiveListener(this);
-		}		
+		}
 	}
-	
+
 	protected String buildRemainingEventsMessage() {
 		StringBuffer buffer = new StringBuffer();
 		partsMessage("Parts did not open: ", fExpectingOpenEvents, buffer);
 		partsMessage("Parts did not close: ", fExpectingCloseEvents, buffer);
 		return buffer.toString();
 	}
-	
+
 	private void partsMessage(String header, List<String> partIds, StringBuffer buffer) {
 		String[] ids = partIds.toArray(new String[partIds.size()]);
 		if (ids.length > 0) {
@@ -375,12 +274,12 @@
 					buffer.append(", ");
 				}
 			}
-		}		
+		}
 	}
-	
+
 	/**
 	 * Adds ids of views to 'expecting open' queue.
-	 * 
+	 *
 	 * @param window
 	 * @param viewIds
 	 */
@@ -390,10 +289,10 @@
 		}
 		window.addPerspectiveListener(this);
 	}
-	
+
 	/**
 	 * Adds ids of views to 'expecting open' queue.
-	 * 
+	 *
 	 * @param window
 	 * @param viewIds
 	 */
@@ -402,7 +301,7 @@
 			fExpectingCloseEvents.add(viewIds[i]);
 		}
 		window.addPerspectiveListener(this);
-	}	
+	}
 
 	/**
 	 * @see org.eclipse.ui.IPerspectiveListener3#perspectiveOpened(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
@@ -459,7 +358,7 @@
 	@Override
 	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
 	}
-	
+
 	/**
 	 * Check if all expected events have occurred.
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java
index ec767e6..fea1c5b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java
index acaaba4..11e0e16 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,10 +36,10 @@
     }
 
     /**
-     * The local java application id 
+     * The local java application id
      */
     public static String fgIdentifier= "org.eclipse.jdt.launching.localJavaApplication";
-    
+
     /**
      * Tests opening the LCD on a given launch configuration on the java tab group 100 times
      */
@@ -48,13 +48,13 @@
         ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
 		IStructuredSelection selection= new StructuredSelection(config);
 		for (int i = 0; i < 100; i++) {
-		    openLCD(selection, fgIdentifier); 
+		    openLCD(selection, fgIdentifier);
         }
-		
+
 		commitMeasurements();
 		assertPerformance();
     }
-    
+
     /**
      * Tests opening the LCD on a specific launch configuration on the java tab group 1 time
      */
@@ -72,7 +72,7 @@
      */
     private void openLCD(final IStructuredSelection selection, final String groupIdentifier) {
         //set a status to go to the classpath tab
-	    IStatus status = new Status(IStatus.INFO, IJavaDebugUIConstants.PLUGIN_ID, 1000, IInternalDebugCoreConstants.EMPTY_STRING, null); 
+	    IStatus status = new Status(IStatus.INFO, IJavaDebugUIConstants.PLUGIN_ID, 1000, IInternalDebugCoreConstants.EMPTY_STRING, null);
 		LaunchConfigurationsDialog dialog= new LaunchConfigurationsDialog(DebugUIPlugin.getShell(), DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier));
 		dialog.setBlockOnOpen(false);
 		dialog.setOpenMode(LaunchConfigurationsDialog.LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_SELECTION);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/ModelPresentationTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/ModelPresentationTests.java
index 66bbc01..375d9df 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/ModelPresentationTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/ModelPresentationTests.java
@@ -17,7 +17,7 @@
 
 /**
  * Tests for some of the methods of the model presentation
- * 
+ *
  * @see JDIModelPresentation
  */
 public class ModelPresentationTests extends AbstractDebugTest {
@@ -32,7 +32,7 @@
 	/**
 	 * Tests that the type signature + value signatures do not cause problems when the values are "&lt;unknown&gt;" - this
 	 * case arises when you manually suspend a VM and try to inspect / view object values
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testUnknownValueText() throws Exception {
@@ -48,11 +48,11 @@
 			pres.dispose();
 		}
 	}
-	
+
 	/**
-	 * Tests passing all <code>null</code>s in for type information - should get an NPE 
+	 * Tests passing all <code>null</code>s in for type information - should get an NPE
 	 * from {@link JDIModelPresentation#getValueText(org.eclipse.jdt.debug.core.IJavaValue)}
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testAllNullValueText() throws Exception {
@@ -70,10 +70,10 @@
 			pres.dispose();
 		}
 	}
-	
+
 	/**
 	 * Tests getting the value text for a simple String type
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSimpleStringValueText() throws Exception {
@@ -90,10 +90,10 @@
 			pres.dispose();
 		}
 	}
-	
+
 	/**
 	 * Tests getting the value text for a simple String type
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testResolvedStringValueText() throws Exception {
@@ -110,10 +110,10 @@
 			pres.dispose();
 		}
 	}
-	
+
 	/**
 	 * Tests a simple array value text
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testSimpleArrayValueText() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaArrayValue.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaArrayValue.java
index 1642a20..376d0d2 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaArrayValue.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaArrayValue.java
@@ -17,13 +17,13 @@
 import org.eclipse.jdt.debug.core.IJavaValue;
 
 /**
- * 
+ *
  */
 public class TestIJavaArrayValue extends TestIJavaObjectValue implements IJavaArray {
 
 	int size = 0;
 	IJavaValue[] values;
-	
+
 	/**
 	 * Constructor
 	 * @param type
@@ -31,7 +31,7 @@
 	 * @param gsig
 	 * @param rtname
 	 * @param vstring
-	 * @param size 
+	 * @param size
 	 */
 	public TestIJavaArrayValue(IJavaType type, String sig, String gsig,	String rtname, String vstring, int size) {
 		super(type, sig, gsig, rtname, vstring);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaObjectValue.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaObjectValue.java
index 23c39a6..b3d1ad3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaObjectValue.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaObjectValue.java
@@ -18,7 +18,7 @@
 import org.eclipse.jdt.debug.core.IJavaValue;
 
 /**
- * 
+ *
  */
 public class TestIJavaObjectValue extends TestIJavaValue implements IJavaObject {
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaType.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaType.java
index ed2548a..ca45917 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaType.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaType.java
@@ -23,13 +23,13 @@
 
 	String name;
 	String sig;
-	
+
 	public TestIJavaType(String name, String sig) {
 		this.name = name;
 		this.sig = sig;
-		
+
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaValue.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaValue.java
index 3ee583f..071b341 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaValue.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/presentation/TestIJavaValue.java
@@ -19,7 +19,7 @@
 import org.eclipse.jdt.debug.core.JDIDebugModel;
 
 /**
- * 
+ *
  */
 public class TestIJavaValue implements IJavaValue {
 
@@ -28,7 +28,7 @@
 	String gsig;
 	String rtname;
 	String vstring;
-	
+
 	public TestIJavaValue(IJavaType type, String sig, String gsig, String rtname, String vstring) {
 		this.type = type;
 		this.sig = sig;
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/DetailFormatterTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/DetailFormatterTests.java
index 0e3f8a8..e31a48a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/DetailFormatterTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/DetailFormatterTests.java
@@ -23,29 +23,29 @@
 
 /**
  * Tests detail formatters
- * 
+ *
  * @since 3.8.100
  */
 public class DetailFormatterTests extends AbstractDebugTest {
-	
+
 	class TestListener implements IValueDetailListener {
 		IValue value;
 		String result;
-		
+
 		@Override
 		public void detailComputed(IValue value, String result) {
 			this.value = value;
 			this.result = result;
 		}
-		
+
 		void reset() {
 			value = null;
 			result = null;
 		}
 	}
-	
+
 	TestListener fListener = new TestListener();
-	
+
 	/**
 	 * @param name
 	 */
@@ -57,13 +57,13 @@
 	protected IJavaProject getProjectContext() {
 		return get15Project();
 	}
-	
+
 	@Override
 	protected void tearDown() throws Exception {
 		fListener.reset();
 		super.tearDown();
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from a large compound expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -104,7 +104,7 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
 		}
@@ -114,7 +114,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from a small compound expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -142,7 +142,7 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
 		}
@@ -152,7 +152,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from a small compound expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -178,7 +178,7 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
 		}
@@ -188,7 +188,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from a small compound expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -214,7 +214,7 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
 		}
@@ -224,7 +224,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from an infix expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -250,10 +250,10 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
-			assertTrue("The returned value from (true && true || !(false&&true) || !(true==true||true!=true&&true)) should be true", 
+			assertTrue("The returned value from (true && true || !(false&&true) || !(true==true||true!=true&&true)) should be true",
 					Boolean.parseBoolean(fListener.result));
 		}
 		finally {
@@ -262,7 +262,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from an infix expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -288,7 +288,7 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
 			assertFalse("The returned value from !true should be false", Boolean.parseBoolean(fListener.result));
@@ -299,7 +299,7 @@
 			removeAllBreakpoints();
 		}
 	}
-	
+
 	/**
 	 * Tests a detail formatter made from an infix expression
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=403028
@@ -325,7 +325,7 @@
 				Thread.sleep(100);
 			}
 			assertNotNull("The IValue of the detailComputed callback cannot be null", fListener.value);
-			assertTrue("The map should be an instance of java.util.LinkedHashMap", 
+			assertTrue("The map should be an instance of java.util.LinkedHashMap",
 					Signature.getTypeErasure(fListener.value.getReferenceTypeName()).equals("java.util.LinkedHashMap"));
 			assertNotNull("The computed value of the detail should not be null", fListener.result);
 			assertFalse("The returned value from !(true==true||true!=true&&true) should be false", Boolean.parseBoolean(fListener.result));
@@ -339,7 +339,7 @@
 
 	/**
 	 * Tests a detail formatter made from an collection with no type arguments
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=484686
 	 * @throws Exception
 	 */
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestAnonymousInspect.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestAnonymousInspect.java
index 2bf718c..128f993 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestAnonymousInspect.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestAnonymousInspect.java
@@ -21,28 +21,28 @@
 import org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine;
 
 /**
- * Tests launching / suspending and evaluating within anonymous 
+ * Tests launching / suspending and evaluating within anonymous
  * types
  */
 public class TestAnonymousInspect extends AbstractDebugTest {
 
-	static final String TYPE_NAME = "InspectTests"; 
+	static final String TYPE_NAME = "InspectTests";
 	static final String SNIPPET = "getchar()";
-	
+
 	class Listener implements IEvaluationListener {
 		IEvaluationResult fResult;
-		
+
 		@Override
 		public void evaluationComplete(IEvaluationResult result) {
 			fResult= result;
 		}
-		
+
 		public IEvaluationResult getResult() {
 			return fResult;
 		}
 	}
 	Listener listener= new Listener();
-	
+
 	/**
 	 * Constructor
 	 */
@@ -58,7 +58,7 @@
 		super.setUp();
 		createLaunchConfiguration(get14Project(), TYPE_NAME);
 	}
-	
+
 	/**
 	 * Perform the actual evaluation (inspect)
 	 * @param thread
@@ -82,11 +82,11 @@
 			engine.dispose();
 		}
 	}
-	
+
 	/**
 	 * Tests that we can successfully inspect a method call from an anonymous type declaration that is assigned
 	 * to a field
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInspectInAnonField() throws Exception {
@@ -106,11 +106,11 @@
 			listener.fResult = null;
 		}
 	}
-	
+
 	/**
 	 * Tests that we can successfully inspect a method call from an anonymous type declaration within a method
 	 * declaration
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testInspectInAnonMethod() throws Exception {
@@ -130,11 +130,11 @@
 			listener.fResult = null;
 		}
 	}
-	
+
 	/**
 	 * Tests that we can successfully inspect a method call from an anonymous type declaration within a static
-	 * initializer 
-	 * 
+	 * initializer
+	 *
 	 * @throws Exception
 	 */
 	public void testInspectInAnonInitializer() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestInstanceRetrieval.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestInstanceRetrieval.java
index d494d61..13c76aa 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestInstanceRetrieval.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestInstanceRetrieval.java
@@ -27,16 +27,16 @@
 
 	/**
 	 * Constructs test.
-	 * 
+	 *
 	 * @param name test name
 	 */
 	public TestInstanceRetrieval(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Test the logical structure for a list.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testGetInstances() throws Exception {
@@ -49,39 +49,39 @@
 			IJavaDebugTarget target = (IJavaDebugTarget) thread.getDebugTarget();
 			if (target.supportsInstanceRetrieval()) {
 				assertNotNull("Breakpoint not hit within timeout period", thread);
-				
+
 				IBreakpoint hit = getBreakpoint(thread);
 				assertNotNull("suspended, but not by breakpoint", hit);
-	
+
 				IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
 				assertNotNull("missing top frame", frame);
-				
+
 				IJavaVariable variable = frame.findVariable("ro");
 				assertNotNull("Missing variable 'ro'", variable);
-				
+
 				IJavaObject object = (IJavaObject) variable.getValue();
 				IJavaReferenceType refType = (IJavaReferenceType) object.getJavaType();
 				long instanceCount = refType.getInstanceCount();
 				IJavaObject[] instances = refType.getInstances(100);
-				
+
 				assertEquals("Wrong instance count", 13, instanceCount);
 				assertEquals("Wrong number of instances", 13, instances.length);
 				for (int i = 0; i < instances.length; i++) {
 					assertEquals("Instance is of unexpected type", refType, instances[i].getJavaType());
 				}
-				
+
 				thread = resumeToLineBreakpoint(thread, bp2);
 				frame = (IJavaStackFrame) thread.getTopStackFrame();
 				assertNotNull("missing top frame", frame);
-				
+
 				variable = frame.findVariable("rc");
 				assertNotNull("Missing variable 'rc'", variable);
-				
+
 				object = (IJavaObject) variable.getValue();
 				refType = (IJavaReferenceType) object.getJavaType();
 				instanceCount = refType.getInstanceCount();
 				instances = refType.getInstances(100);
-				
+
 				assertEquals("Wrong instance count", 1002, instanceCount);
 				assertEquals("Wrong number of instances", 100, instances.length);
 				for (int i = 0; i < instances.length; i++) {
@@ -91,7 +91,7 @@
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
+		}
+	}
 
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestIntegerAccessUnboxing15.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestIntegerAccessUnboxing15.java
index dd82c34..f0180dc 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestIntegerAccessUnboxing15.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestIntegerAccessUnboxing15.java
@@ -31,9 +31,9 @@
 	public TestIntegerAccessUnboxing15(String name) {
 		super(name);
 	}
-	
+
 	class Listener implements IEvaluationListener {
-		
+
 		private Object lock = new Object();
 		private IEvaluationResult endresult;
 
@@ -47,7 +47,7 @@
 				lock.notifyAll();
 			}
 		}
-		
+
 		IEvaluationResult getResult() throws Exception {
 			synchronized (lock) {
 				if (endresult == null) {
@@ -59,9 +59,9 @@
 			}
 			return endresult;
 		}
-		
+
 	}
-	
+
 	public void doAccessTest(String snippet, int expected) throws Exception {
 		IJavaThread thread= null;
 		IAstEvaluationEngine engine = null;
@@ -70,11 +70,11 @@
 		try {
 			thread= launchToBreakpoint(get15Project(), typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 			IJavaDebugTarget target = (IJavaDebugTarget) thread.getDebugTarget();
-			
+
 			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
 			engine = EvaluationManager.newAstEvaluationEngine(get15Project(), target);
 			Listener listener = new Listener();
@@ -89,8 +89,8 @@
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
 		}
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.tests.AbstractDebugTest#getProjectContext()
 	 */
@@ -98,19 +98,19 @@
 	protected IJavaProject getProjectContext() {
 		return get15Project();
 	}
-	
+
 	/**
 	 * Test a row can be accessed
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testRowAccess() throws Exception {
 		doAccessTest("matrix[new Integer(0)][0]", 1);
 	}
-	
+
 	/**
 	 * Test a column can be accessed.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testColumnAccess() throws Exception {
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestLogicalStructures.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestLogicalStructures.java
index 8a212b7..d5cfbfc 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestLogicalStructures.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/variables/TestLogicalStructures.java
@@ -29,16 +29,16 @@
 
 	/**
 	 * Constructs test.
-	 * 
+	 *
 	 * @param name test name
 	 */
 	public TestLogicalStructures(String name) {
 		super(name);
 	}
-	
+
 	/**
 	 * Test the logical structure for a list.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testListLogicalStructure() throws Exception {
@@ -48,35 +48,35 @@
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 
 			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
 			assertNotNull("missing top frame", frame);
-			
+
 			IJavaVariable variable = frame.findVariable("list");
 			assertNotNull("Missing variable 'list'", variable);
-			
+
 			IValue value = variable.getValue();
 			ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
 			assertEquals("Should be one logical structure type", 1, types.length);
-			
+
 			IJavaObject logicalValue = (IJavaObject) types[0].getLogicalStructure(value);
 			assertEquals("Logical value should be an array", "java.lang.Object[]", logicalValue.getJavaType().getName());
-			
+
 			IJavaArray array = (IJavaArray) logicalValue;
 			assertEquals("Should be two elements in the structure", 2, array.getLength());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
+		}
 	}
 
 	/**
 	 * Test the logical structure for a map.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testMapLogicalStructure() throws Exception {
@@ -86,35 +86,35 @@
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 
 			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
 			assertNotNull("missing top frame", frame);
-			
+
 			IJavaVariable variable = frame.findVariable("map");
 			assertNotNull("Missing variable 'map'", variable);
-			
+
 			IValue value = variable.getValue();
 			ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
 			assertEquals("Should be one logical structure type", 1, types.length);
-			
+
 			IJavaObject logicalValue = (IJavaObject) types[0].getLogicalStructure(value);
 			assertEquals("Logical value should be an array", "java.lang.Object[]", logicalValue.getJavaType().getName());
-			
+
 			IJavaArray array = (IJavaArray) logicalValue;
 			assertEquals("Should be two elements in the structure", 2, array.getLength());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
-	
+		}
+	}
+
 	/**
 	 * Test the logical structure for a map entry.
-	 * 
+	 *
 	 * @throws Exception
 	 */
 	public void testEntryLogicalStructure() throws Exception {
@@ -124,29 +124,29 @@
 		try {
 			thread= launchToBreakpoint(typeName);
 			assertNotNull("Breakpoint not hit within timeout period", thread);
-			
+
 			IBreakpoint hit = getBreakpoint(thread);
 			assertNotNull("suspended, but not by breakpoint", hit);
 
 			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
 			assertNotNull("missing top frame", frame);
-			
+
 			IJavaVariable variable = frame.findVariable("entry");
 			assertNotNull("Missing variable 'entry'", variable);
-			
+
 			IValue value = variable.getValue();
 			ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
 			assertEquals("Should be one logical structure type", 1, types.length);
-			
+
 			IJavaObject logicalValue = (IJavaObject) types[0].getLogicalStructure(value);
 			IVariable[] children = logicalValue.getVariables();
 			assertEquals("Should be two elements in the structure", 2, children.length);
 			assertEquals("First entry should be key", "key", children[0].getName());
 			assertEquals("Second entry should be value", "value", children[1].getName());
-			
+
 		} finally {
 			terminateAndRemove(thread);
 			removeAllBreakpoints();
-		}				
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/.settings/.api_filters b/org.eclipse.jdt.debug.ui/.settings/.api_filters
index f23a01b..2a6baac 100644
--- a/org.eclipse.jdt.debug.ui/.settings/.api_filters
+++ b/org.eclipse.jdt.debug.ui/.settings/.api_filters
@@ -1,43 +1,35 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.jdt.debug.ui" version="2">
-    <resource path="ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaClasspathTab.java" type="org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab">
-        <filter comment="Known illegal extension" id="576720909">
-            <message_arguments>
-                <message_argument value="AbstractJavaClasspathTab"/>
-                <message_argument value="JavaClasspathTab"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java" type="org.eclipse.jdt.internal.debug.ui.classpath.ClasspathEntry">
-        <filter comment="Known illegal implementation" id="574619656">
-            <message_arguments>
-                <message_argument value="IRuntimeClasspathEntry"/>
-                <message_argument value="ClasspathEntry"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/debug/ui/classpath/RuntimeClasspathViewer.java" type="org.eclipse.jdt.internal.debug.ui.classpath.RuntimeClasspathViewer">
-        <filter comment="Known illegal extension" id="571473929">
-            <message_arguments>
-                <message_argument value="TreeViewer"/>
-                <message_argument value="RuntimeClasspathViewer"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewerConfiguration.java" type="org.eclipse.jdt.internal.debug.ui.display.DisplayViewerConfiguration">
-        <filter id="571473929">
-            <message_arguments>
-                <message_argument value="JavaSourceViewerConfiguration"/>
-                <message_argument value="DisplayViewerConfiguration"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletSelectionDialog.java" type="org.eclipse.jdt.internal.debug.ui.launcher.AppletSelectionDialog$PackageRenderer">
-        <filter comment="known API usage" id="571473929">
-            <message_arguments>
-                <message_argument value="JavaElementLabelProvider"/>
-                <message_argument value="PackageRenderer"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.jdt.debug.ui" version="2">
+    <resource path="ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaClasspathTab.java" type="org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab">
+        <filter comment="Known illegal extension" id="576720909">
+            <message_arguments>
+                <message_argument value="AbstractJavaClasspathTab"/>
+                <message_argument value="JavaClasspathTab"/>
+            </message_arguments>
+        </filter>
+    </resource>
+    <resource path="ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java" type="org.eclipse.jdt.internal.debug.ui.classpath.ClasspathEntry">
+        <filter comment="Known illegal implementation" id="574619656">
+            <message_arguments>
+                <message_argument value="IRuntimeClasspathEntry"/>
+                <message_argument value="ClasspathEntry"/>
+            </message_arguments>
+        </filter>
+    </resource>
+    <resource path="ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewerConfiguration.java" type="org.eclipse.jdt.internal.debug.ui.display.DisplayViewerConfiguration">
+        <filter id="571473929">
+            <message_arguments>
+                <message_argument value="JavaSourceViewerConfiguration"/>
+                <message_argument value="DisplayViewerConfiguration"/>
+            </message_arguments>
+        </filter>
+    </resource>
+    <resource path="ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletSelectionDialog.java" type="org.eclipse.jdt.internal.debug.ui.launcher.AppletSelectionDialog$PackageRenderer">
+        <filter comment="known API usage" id="571473929">
+            <message_arguments>
+                <message_argument value="JavaElementLabelProvider"/>
+                <message_argument value="PackageRenderer"/>
+            </message_arguments>
+        </filter>
+    </resource>
+</component>
diff --git a/org.eclipse.jdt.debug.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jdt.debug.ui/.settings/org.eclipse.jdt.ui.prefs
index 69f7753..c9192ac 100644
--- a/org.eclipse.jdt.debug.ui/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.jdt.debug.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -68,10 +68,12 @@
 sp_cleanup.always_use_parentheses_in_expressions=false
 sp_cleanup.always_use_this_for_non_static_field_access=false
 sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
 sp_cleanup.convert_to_enhanced_for_loop=false
 sp_cleanup.correct_indentation=false
 sp_cleanup.format_source_code=true
 sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.insert_inferred_type_arguments=false
 sp_cleanup.make_local_variable_final=false
 sp_cleanup.make_parameters_final=false
 sp_cleanup.make_private_fields_final=true
@@ -87,7 +89,8 @@
 sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
@@ -100,8 +103,10 @@
 sp_cleanup.remove_unused_private_types=true
 sp_cleanup.sort_members=false
 sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
 sp_cleanup.use_blocks=true
 sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
 sp_cleanup.use_parentheses_in_expressions=false
 sp_cleanup.use_this_for_non_static_field_access=false
 sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
diff --git a/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain.java b/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain.java
index b3c379f..6229699 100644
--- a/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain.java
+++ b/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,14 +26,14 @@
  * CAUTION: This class gets compiled with target=jsr14, see scripts/buildExtraJAR.xml. Don't use URLClassLoader#close() or other post-1.4 APIs!
  */
 public class ScrapbookMain {
-	
+
 	public static void main(String[] args) {
 
 		URL[] urls= getClasspath(args);
 		if (urls == null) {
 			return;
 		}
-		
+
 		while (true) {
 			try {
 				evalLoop(urls);
@@ -47,9 +47,9 @@
 				return;
 			}
 		}
-	
+
 	}
-	
+
 	static void evalLoop(URL[] urls) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
 		@SuppressWarnings("resource")
 		ClassLoader cl= new URLClassLoader(urls, null);
@@ -57,7 +57,7 @@
 		Method method= clazz.getDeclaredMethod("eval", new Class[] {Class.class}); //$NON-NLS-1$
 		method.invoke(null, new Object[] {ScrapbookMain.class});
 	}
-	
+
 	/**
 	 * The magic "no-op" method, where {@link org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookLauncher#createMagicBreakpoint(String)} sets a
 	 * breakpoint.
@@ -69,14 +69,14 @@
 		} catch(InterruptedException e) {
 		}
 	}
-	
-	
+
+
 	static URL[] getClasspath(String[] urlStrings) {
-		
+
 		//The URL Strings MUST be properly encoded
 		//using URLEncoder...see ScrapbookLauncher for details
 		URL[] urls= new URL[urlStrings.length + 1];
-		
+
 		for (int i = 0; i < urlStrings.length; i++) {
 			try {
 				urls[i + 1] = new URL(URLDecoder.decode(urlStrings[i]));
diff --git a/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain1.java b/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain1.java
index 813ad01..5757857 100644
--- a/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain1.java
+++ b/org.eclipse.jdt.debug.ui/Snippet Support/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookMain1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/plugin.properties b/org.eclipse.jdt.debug.ui/plugin.properties
index 1bd6f51..7476dad 100644
--- a/org.eclipse.jdt.debug.ui/plugin.properties
+++ b/org.eclipse.jdt.debug.ui/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2016 IBM Corporation and others.
+# Copyright (c) 2000, 2017 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -221,7 +221,9 @@
 ActionDefinition.breakpointproperties.description=View and edit the properties for a given Java breakpoint
 CommandDefinition.breakpointproperties.name=Java Breakpoint Properties
 
-ToggleTracepointAction.label=Toggle Trac&epoint
+ToggleTracepointAction.label=Toggle Tra&cepoint
+ToggleTracepointCommand.label=Toggle Tracepoint
+ToggleTracepointCommand.description=Creates or removes a tracepoint  
 
 AddBookmark.label=Add Boo&kmark...
 AddBookmark.tooltip=Add Bookmark...
diff --git a/org.eclipse.jdt.debug.ui/plugin.xml b/org.eclipse.jdt.debug.ui/plugin.xml
index 83ab593..81ceaef 100644
--- a/org.eclipse.jdt.debug.ui/plugin.xml
+++ b/org.eclipse.jdt.debug.ui/plugin.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.0"?>
 <!--
-     Copyright (c) 2005, 2016 IBM Corporation and others.
+     Copyright (c) 2005, 2017 IBM Corporation and others.
      All rights reserved. This program and the accompanying materials
      are made available under the terms of the Eclipse Public License v1.0
      which accompanies this distribution, and is available at
@@ -2606,8 +2606,8 @@
 -->
    <extension point="org.eclipse.ui.commands">
    	 <command
-            name="%ToggleTracepointAction.label"
-            description="%ToggleTracepointAction.label"
+            name="%ToggleTracepointCommand.label"
+            description="%ToggleTracepointCommand.description"
             categoryId="org.eclipse.debug.ui.category.run"
             id="org.eclipse.jdt.debug.ui.commands.ToggleTracepoint">
       </command>
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/IJavaDebugUIConstants.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/IJavaDebugUIConstants.java
index c44b9c0..56bb695 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/IJavaDebugUIConstants.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/IJavaDebugUIConstants.java
@@ -12,7 +12,7 @@
 
 
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
- 
+
 /**
  * Constant definitions for Java debug UI plug-in.
  * <p>
@@ -36,16 +36,16 @@
 	/**
 	 * Extension point identifier for contributions of a wizard page that for a VMInstallType
 	 * (value <code>"vmInstallPages"</code>).
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String EXTENSION_POINT_VM_INSTALL_PAGES = "vmInstallPages"; //$NON-NLS-1$
-	
+
 	/**
 	 * Display view identifier (value <code>"org.eclipse.jdt.debug.ui.DisplayView"</code>).
 	 */
 	public static final String ID_DISPLAY_VIEW= PLUGIN_ID + ".DisplayView"; //$NON-NLS-1$
-	
+
 	/**
 	 * Java snippet editor identifier (value <code>"org.eclipse.jdt.debug.ui.SnippetEditor"</code>)
 	 */
@@ -55,17 +55,17 @@
 	 * Java snippet editor context menu identifier (value <code>"#JavaSnippetEditorContext"</code>).
 	 */
 	public static final String JAVA_SNIPPET_EDITOR_CONTEXT_MENU= "#JavaSnippetEditorContext"; //$NON-NLS-1$
-	
+
 	/**
 	 * Java snippet editor ruler menu identifier (value <code>"#JavaSnippetRulerContext"</code>).
-	 */	
+	 */
 	public static final String JAVA_SNIPPET_EDITOR_RULER_MENU= "#JavaSnippetRulerContext"; //$NON-NLS-1$
 
 	/**
 	 * Identifier for a group of evaluation actions in a menu (value <code>"evaluationGroup"</code>).
 	 */
 	public static final String EVALUATION_GROUP= "evaluationGroup"; //$NON-NLS-1$
-	
+
 	/**
 	 * Status code indicating an unexpected internal error (value <code>150</code>).
 	 */
@@ -74,37 +74,37 @@
 	/**
 	 * Boolean preference indicating whether the monitor and thread information should be displayed in the debug view.
 	 * A view may override this preference, and if so, stores its preference, prefixed by view id.
-	 *  
+	 *
 	 * @since 3.2
-	 */	
+	 */
 	public static final String PREF_SHOW_MONITOR_THREAD_INFO = PLUGIN_ID + ".show_monitor_thread_info"; //$NON-NLS-1$
 
 	/**
 	 * Boolean preference indicating whether system threads should appear visible in the debug view.
-	 * 
+	 *
 	 * @since 3.2
-	 */	
+	 */
 	public static final String PREF_SHOW_SYSTEM_THREADS = PLUGIN_ID + ".show_system_threads"; //$NON-NLS-1$
 
 	/**
 	 * Boolean preference indicating whether thread groups should be displayed in the debug view.
-	 * 
+	 *
 	 * @since 3.2
-	 */	
-	public static final String PREF_SHOW_THREAD_GROUPS = PLUGIN_ID + ".show_thread_group_info"; //$NON-NLS-1$	
-	
+	 */
+	public static final String PREF_SHOW_THREAD_GROUPS = PLUGIN_ID + ".show_thread_group_info"; //$NON-NLS-1$
+
 	/**
 	 * Integer preference for the maximum number of instances to show with the All Instances action
-	 * 
+	 *
 	 *   @since 3.3
 	 */
 	public static final String PREF_ALLINSTANCES_MAX_COUNT = PLUGIN_ID + ".all_instances_max_count"; //$NON-NLS-1$
-	
+
 	/**
 	 * Integer preference for the maximum number of references to show with the All References action
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String PREF_ALLREFERENCES_MAX_COUNT = PLUGIN_ID + ".all_references_max_count"; //$NON-NLS-1$
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaDebugUtils.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaDebugUtils.java
index d827ed6..87ac464 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaDebugUtils.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaDebugUtils.java
@@ -32,16 +32,16 @@
      * The result will be empty when the user has turned off the preference
      * to show monitor information.
      * </p>
-     * 
+     *
      * @param thread an <code>IJavaThread</code> or a thread with an <code>IJavaThread</code>
-     *  adapter 
+     *  adapter
      * @return debug elements representing the monitors owned by the underlying
      *   <code>IJavaThread</code>, possibly empty
      */
     public static IDebugElement[] getOwnedMonitors(IThread thread) {
         return ThreadMonitorManager.getDefault().getOwnedMonitors(thread);
     }
-    
+
     /**
      * Returns a debug element representing a monitor in contention with
      * the given thread's underlying <code>IJavaThread</code>, or <code>null</code>
@@ -51,14 +51,14 @@
      * to show monitor information.
      * </p>
      * @param thread an <code>IJavaThread</code> or a thread with an <code>IJavaThread</code>
-     *  adapter 
+     *  adapter
      * @return debug element representing a monitor in contention with the underlying
      *   <code>IJavaThread</code>, or <code>null</code>
-     */    
+     */
     public static IDebugElement getContendedMonitor(IThread thread) {
         return ThreadMonitorManager.getDefault().getContendedMonitor(thread);
     }
-    
+
 	/**
 	 * Returns the preference store for the Java Debug UI plug-in.
 	 *
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaSourceLookupDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaSourceLookupDialog.java
index e60c660..e7b8786 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaSourceLookupDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaSourceLookupDialog.java
@@ -31,7 +31,7 @@
 
 /**
  * A dialog to manipulate the source lookup path for a launch
- * configuration. 
+ * configuration.
  * <p>
  * This class may be instantiated.
  * </p>
@@ -43,19 +43,19 @@
  *  lookup among a set of participants, searching a set of source containers.
  *  See the following packages: <code>org.eclipse.debug.core.sourcelookup</code>
  *  and <code>org.eclipse.debug.core.sourcelookup.containers</code>. This class
- *  has been replaced by a dialog in the debug platform - 
+ *  has been replaced by a dialog in the debug platform -
  *  <code>org.eclipse.debug.ui.sourcelookup.SourceLookupDialog</code>.
  * @noextend This class is not intended to be subclassed by clients.
  */
 @Deprecated
 public class JavaSourceLookupDialog extends Dialog {
-		
+
 	private SourceLookupBlock fSourceLookupBlock;
 	private ILaunchConfiguration fConfiguration;
 	private String fMessage;
 	private boolean fNotAskAgain;
 	private Button fAskAgainCheckBox;
-	
+
 	/**
 	 * Constructs a dialog to manipulate the source lookup path of the given
 	 * launch configuration. The source lookup path is retrieved from the given
@@ -63,8 +63,8 @@
 	 * <code>IJavaLaunchConfigurationConstants.ATTR_DEFAULT_SOURCE_PATH</code> and
 	 * <code>IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH</code>. If the user
 	 * changes the source lookup path and presses "OK", the launch configuration
-	 * is updated with the new source lookup path. 
-	 * 
+	 * is updated with the new source lookup path.
+	 *
 	 * @param shell the shell to open the dialog on
 	 * @param message the message to display in the dialog
 	 * @param configuration the launch configuration from which the source lookup
@@ -78,16 +78,16 @@
 		fAskAgainCheckBox= null;
 		fConfiguration = configuration;
 	}
-	
+
 	/**
 	 * Returns whether the "do not ask again" check box is selected in the dialog.
-	 * 
+	 *
 	 * @return whether the "do not ask again" check box is selected in the dialog
 	 */
 	public boolean isNotAskAgain() {
 		return fNotAskAgain;
 	}
-			
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
 	 */
@@ -95,12 +95,12 @@
 	protected Control createDialogArea(Composite parent) {
 		Font font = parent.getFont();
 		initializeDialogUnits(parent);
-		getShell().setText(LauncherMessages.JavaUISourceLocator_selectprojects_title); 
-		
+		getShell().setText(LauncherMessages.JavaUISourceLocator_selectprojects_title);
+
 		Composite composite= (Composite) super.createDialogArea(parent);
 		composite.setLayout(new GridLayout());
 		composite.setFont(font);
-		
+
 		int pixelWidth= convertWidthInCharsToPixels(70);
 		Label message= new Label(composite, SWT.LEFT + SWT.WRAP);
 		message.setText(fMessage);
@@ -108,7 +108,7 @@
 		data.widthHint= pixelWidth;
 		message.setLayoutData(data);
 		message.setFont(font);
-		
+
 		fSourceLookupBlock.createControl(composite);
 		Control inner = fSourceLookupBlock.getControl();
 		fSourceLookupBlock.initializeFrom(fConfiguration);
@@ -121,8 +121,8 @@
 		data.widthHint= pixelWidth;
 		fAskAgainCheckBox.setLayoutData(data);
 		fAskAgainCheckBox.setFont(font);
-		fAskAgainCheckBox.setText(LauncherMessages.JavaUISourceLocator_askagain_message); 
-		
+		fAskAgainCheckBox.setText(LauncherMessages.JavaUISourceLocator_askagain_message);
+
 		return composite;
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaUISourceLocator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaUISourceLocator.java
index 9051659..f6b0a52 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaUISourceLocator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/JavaUISourceLocator.java
@@ -80,7 +80,7 @@
 	 * Launch configuration attribute indicating that this source locator should
 	 * locate all source elements that correspond to a stack frame, rather than
 	 * the first match. Default value is <code>false</code>.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_FIND_ALL_SOURCE_ELEMENTS = IJavaDebugUIConstants.PLUGIN_ID + ".ATTR_FIND_ALL_SOURCE_ELEMENTS"; //$NON-NLS-1$
@@ -107,7 +107,7 @@
 	 * duplicates), or just the first match.
 	 */
 	private boolean fIsFindAllSourceElements = false;
-	
+
 	/**
 	 * A cache of types to associated source elements (when duplicates arise and
 	 * the users chooses a source element, it is remembered).
@@ -126,7 +126,7 @@
 	 * Constructs a new source locator that looks in the
 	 * specified project for source, and required projects, if
 	 * <code>includeRequired</code> is <code>true</code>.
-	 * 
+	 *
 	 * @param projects the projects in which to look for source
 	 * @param includeRequired whether to look in required projects
 	 * 	as well
@@ -142,7 +142,7 @@
 	 * in the given Java project, and all of its required projects,
 	 * as specified by its build path or default source lookup
 	 * settings.
-	 * 
+	 *
 	 * @param project Java project
 	 * @exception CoreException if unable to read the project's
 	 * 	 build path
@@ -185,7 +185,7 @@
 			Object[] sourceElements = fSourceLocator.getSourceElements(stackFrame);
 			if (sourceElements == null || sourceElements.length == 0) {
 				return null;
-			} 
+			}
 			if (sourceElements.length == 1) {
 				return sourceElements[0];
 			}
@@ -198,12 +198,12 @@
 				}
 				// prompt
 				TwoPaneElementSelector dialog = new TwoPaneElementSelector(JDIDebugUIPlugin.getActiveWorkbenchShell(), new SourceElementLabelProvider(),new SourceElementQualifierProvider());
-				dialog.setTitle(DebugUIMessages.JavaUISourceLocator_Select_Source_1); 
-				dialog.setMessage(NLS.bind(DebugUIMessages.JavaUISourceLocator__Select_the_source_that_corresponds_to__0__2, new String[]{type.getName()})); 
+				dialog.setTitle(DebugUIMessages.JavaUISourceLocator_Select_Source_1);
+				dialog.setMessage(NLS.bind(DebugUIMessages.JavaUISourceLocator__Select_the_source_that_corresponds_to__0__2, new String[]{type.getName()}));
 				dialog.setElements(sourceElements);
 				dialog.setMultipleSelection(false);
-				dialog.setUpperListLabel(DebugUIMessages.JavaUISourceLocator__Matching_files__3); 
-				dialog.setLowerListLabel(DebugUIMessages.JavaUISourceLocator__Location__4); 
+				dialog.setUpperListLabel(DebugUIMessages.JavaUISourceLocator__Matching_files__3);
+				dialog.setLowerListLabel(DebugUIMessages.JavaUISourceLocator__Location__4);
 				dialog.open();
 				Object[] result = dialog.getResult();
 				if (result == null) {
@@ -219,17 +219,17 @@
 		}
 		return fSourceLocator.getSourceElement(stackFrame);
 	}
-	
+
 	private Object getSourceElement(IJavaReferenceType type) {
 		if (fTypesToSource == null) {
-			return null; 
+			return null;
 		}
 		return fTypesToSource.get(type);
 	}
-	
+
 	private void cacheSourceElement(Object sourceElement, IJavaReferenceType type) {
 		if (fTypesToSource == null) {
-			fTypesToSource = new HashMap<IJavaReferenceType, Object>();
+			fTypesToSource = new HashMap<>();
 		}
 		fTypesToSource.put(type, sourceElement);
 	}
@@ -340,7 +340,7 @@
 	/**
 	 * Returns the locations that this source locator is currently
 	 * searching, in the order that they are searched.
-	 * 
+	 *
 	 * @return the locations that this source locator is currently
 	 * searching, in the order that they are searched
 	 */
@@ -352,7 +352,7 @@
 	 * /**
 	 * Sets the locations that will be searched, in the order
 	 * to be searched.
-	 * 
+	 *
 	 * @param locations the locations that will be searched, in the order
 	 *  to be searched
 	 */
@@ -366,7 +366,7 @@
 	 * is returned, searching stops on the first match. If there is more than
 	 * one source element that corresponds to a stack frame, the user is
 	 * prompted to choose a source element to open.
-	 * 
+	 *
 	 * @return whether this source locator is configured to search for all
 	 * source elements that correspond to a stack frame
 	 * @since 2.1
@@ -378,7 +378,7 @@
 	/**
 	 * Sets whether this source locator is configured to search for all source
 	 * elements that correspond to a stack frame, or the first match.
-	 * 
+	 *
 	 * @param findAll whether this source locator should search for all source
 	 * elements that correspond to a stack frame
 	 * @since 2.1
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/breakpoints/JavaBreakpointConditionEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/breakpoints/JavaBreakpointConditionEditor.java
index 23a09df..0135a65 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/breakpoints/JavaBreakpointConditionEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/breakpoints/JavaBreakpointConditionEditor.java
@@ -26,6 +26,8 @@
 import org.eclipse.debug.internal.ui.SWTFactory;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.ISourceRange;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.core.IJavaWatchpoint;
@@ -103,9 +105,9 @@
  * property change notification ({@link #addPropertyListener(IPropertyListener)}). The editor
  * will fire a property change each time a setting is modified. The same editor can be
  * used to display different breakpoints by calling {@link #setInput(Object)} with different
- * breakpoint objects. 
+ * breakpoint objects.
  * </p>
- * 
+ *
  * @since 3.5
  */
 public final class JavaBreakpointConditionEditor extends AbstractJavaBreakpointEditor {
@@ -115,7 +117,7 @@
 	private Button fWhenChange;
 
 	private JDISourceViewer fViewer;
-	private IContentAssistProcessor fCompletionProcessor;	
+	private IContentAssistProcessor fCompletionProcessor;
 	private IJavaLineBreakpoint fBreakpoint;
 	private IHandlerService fHandlerService;
 	private IHandler fContentAssistHandler;
@@ -154,7 +156,7 @@
 	 * Property id for breakpoint condition suspend policy.
 	 */
 	public static final int PROP_CONDITION_SUSPEND_POLICY= 0x1003;
-	
+
 	private static final int MAX_HISTORY_SIZE= 10;
 	private static final String DS_SECTION_CONDITION_HISTORY= "conditionHistory"; //$NON-NLS-1$
 	private static final String DS_KEY_HISTORY_ENTRY_COUNT= "conditionHistoryEntryCount"; //$NON-NLS-1$
@@ -170,7 +172,7 @@
 
 	/**
 	 * Creates a new Java breakpoint condition editor with a history drop-down list.
-	 * 
+	 *
 	 * @param dialogSettings the dialog settings for the condition history or <code>null</code> to
 	 *            use the default settings (i.e. those used by JDT Debug)
 	 * @since 3.6
@@ -183,27 +185,27 @@
 	 * Adds the given property listener to this editor. Property changes
 	 * are reported on the breakpoint being edited. Property identifiers
 	 * are breakpoint attribute keys.
-	 * 
+	 *
 	 * @param listener listener
 	 */
 	@Override
 	public void addPropertyListener(IPropertyListener listener) {
 		super.addPropertyListener(listener);
 	}
-	
+
 	/**
 	 * Removes the property listener from this editor.
-	 * 
+	 *
 	 * @param listener listener
 	 */
 	@Override
 	public void removePropertyListener(IPropertyListener listener) {
 		super.removePropertyListener(listener);
 	}
-	
+
 	/**
 	 * Sets the breakpoint to editor or <code>null</code> if none.
-	 * 
+	 *
 	 * @param input breakpoint or <code>null</code>
 	 * @throws CoreException if unable to access breakpoint attributes
 	 */
@@ -229,13 +231,13 @@
 			suppressPropertyChanges(false);
 		}
 	}
-	
+
 
 	/**
 	 * Sets the breakpoint to edit. Has no effect if the breakpoint responds
 	 * <code>false</code> to {@link IJavaLineBreakpoint#supportsCondition()}.
 	 * The same editor can be used iteratively for different breakpoints.
-	 * 
+	 *
 	 * @param breakpoint the breakpoint to edit or <code>null</code> if none
 	 * @exception CoreException if unable to access breakpoint attributes
 	 */
@@ -266,27 +268,45 @@
 		IJavaDebugContentAssistContext context = null;
 		if (type == null || breakpoint == null) {
 			context = new TypeContext(null, -1);
-		} else if (breakpoint instanceof IJavaWatchpoint) {
-			context = new TypeContext(type, 0);
 		} else {
 			String source = null;
 			ICompilationUnit compilationUnit = type.getCompilationUnit();
 			if (compilationUnit != null && compilationUnit.getJavaProject().getProject().exists()) {
 				source = compilationUnit.getSource();
-			} 
+			}
 			else {
 				IClassFile classFile = type.getClassFile();
 				if (classFile != null) {
 					source = classFile.getSource();
 				}
 			}
-			int lineNumber = breakpoint.getMarker().getAttribute(IMarker.LINE_NUMBER, -1);
 			int position= -1;
-			if (source != null && lineNumber != -1) {
-				try {
-					position = new Document(source).getLineOffset(lineNumber - 1);
-				} 
-				catch (BadLocationException e) {JDIDebugUIPlugin.log(e);}
+			if (breakpoint instanceof IJavaWatchpoint) {
+				IField[] fields = type.getFields();
+				// Taking first field
+				ISourceRange sourceRange = fields[0].getNameRange();
+				position = sourceRange.getOffset();
+				if (source != null && position != -1) {
+					try {
+						// to get offset of the first character of line in which field is defined
+						int lineNumber = new Document(source).getLineOfOffset(position);
+						position = new Document(source).getLineOffset(lineNumber);
+					}
+					catch (BadLocationException e) {
+						// ignore, breakpoint line is out-of-date with the document
+					}
+				}
+
+			} else {
+				int lineNumber = breakpoint.getMarker().getAttribute(IMarker.LINE_NUMBER, -1);
+				if (source != null && lineNumber != -1) {
+					try {
+						position = new Document(source).getLineOffset(lineNumber - 1);
+					}
+					catch (BadLocationException e) {
+						// ignore, breakpoint line is out-of-date with the document
+					}
+				}
 			}
 			context = new TypeContext(type, position);
 		}
@@ -317,21 +337,21 @@
 		checkIfUsedInBreakpointsView();
 		registerViewerUndoRedoActions();
 	}
-	
+
 	/**
 	 * Creates the condition editor widgets and returns the top level
 	 * control.
-	 * 
+	 *
 	 * @param parent composite to embed the editor controls in
 	 * @return top level control
 	 */
 	@Override
 	public Control createControl(Composite parent) {
 		Composite controls = SWTFactory.createComposite(parent, parent.getFont(), 2, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		fConditional = SWTFactory.createCheckButton(controls, 
-				processMnemonics(PropertyPageMessages.JavaBreakpointConditionEditor_0), 
-				null, 
-				false, 
+		fConditional = SWTFactory.createCheckButton(controls,
+				processMnemonics(PropertyPageMessages.JavaBreakpointConditionEditor_0),
+				null,
+				false,
 				1);
 		fConditional.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
 		fConditional.addSelectionListener(new SelectionAdapter() {
@@ -361,7 +381,7 @@
 		});
 
 		if (fConditionHistoryDialogSettings != null) {
-			fLocalConditionHistory= new HashMap<IJavaLineBreakpoint, Stack<String>>();
+			fLocalConditionHistory= new HashMap<>();
 			fConditionHistory= SWTFactory.createCombo(parent, SWT.DROP_DOWN | SWT.READ_ONLY, 1, null);
 			initializeConditionHistoryDropDown();
 			fConditionHistory.addSelectionListener(new SelectionAdapter() {
@@ -376,7 +396,7 @@
 			GridData data= new GridData(GridData.FILL_HORIZONTAL);
 			data.widthHint= 10;
 			fConditionHistory.setLayoutData(data);
-			fLocalConditionHistory= new HashMap<IJavaLineBreakpoint, Stack<String>>(10);
+			fLocalConditionHistory= new HashMap<>(10);
 		}
 
 		fViewer = new JDISourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
@@ -425,7 +445,7 @@
 			@Override
 			public void focusLost(FocusEvent e) {
 				deactivateHandlers();
-			}				
+			}
 		});
 		parent.addDisposeListener(new DisposeListener() {
 			@Override
@@ -435,7 +455,7 @@
 		});
 		return parent;
 	}
-	
+
 	/**
 	 * Disposes this editor and its controls. Once disposed, the editor can no
 	 * longer be used.
@@ -447,9 +467,9 @@
 		if (fDocumentListener != null) {
 			fViewer.getDocument().removeDocumentListener(fDocumentListener);
 		}
-		fViewer.dispose();	
+		fViewer.dispose();
 	}
-	
+
 	/**
 	 * Gives focus to an appropriate control in the editor.
 	 */
@@ -457,12 +477,12 @@
 	public void setFocus() {
 		fViewer.getControl().setFocus();
 	}
-	
+
 	/**
 	 * Saves current settings to the breakpoint being edited. Has no
 	 * effect if a breakpoint is not currently being edited or if this
 	 * editor is not dirty.
-	 * 
+	 *
 	 * @exception CoreException if unable to update the breakpoint.
 	 */
 	@Override
@@ -477,12 +497,12 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns a status describing whether the condition editor is in
 	 * a valid state. Returns an OK status when all is good. For example, an error
 	 * status is returned when the conditional expression is empty but enabled.
-	 * 
+	 *
 	 * @return editor status.
 	 */
 	@Override
@@ -496,29 +516,29 @@
 		}
 		return Status.OK_STATUS;
 	}
-	
+
 	/**
 	 * Returns whether the editor needs saving.
-	 *  
+	 *
 	 * @return whether the editor needs saving
 	 */
 	@Override
 	public boolean isDirty() {
 		return super.isDirty();
 	}
-	
+
 	/**
 	 * Sets whether mnemonics should be displayed in editor controls.
 	 * Only has an effect if set before {@link #createControl(Composite)}
 	 * is called. By default, mnemonics are displayed.
-	 * 
+	 *
 	 * @param mnemonics whether to display mnemonics
 	 */
 	@Override
 	public void setMnemonics(boolean mnemonics) {
 		super.setMnemonics(mnemonics);
 	}
-	
+
 	private void activateHandlers() {
 		fContentAssistActivation= fHandlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, fContentAssistHandler);
 		checkIfUsedInBreakpointsView();
@@ -565,7 +585,7 @@
 
 	/**
 	 * Enables controls based on whether the breakpoint's condition is enabled.
-	 * 
+	 *
 	 * @param enabled <code>true</code> if enabled, <code>false</code> otherwise
 	 * @param focus <code>true</code> if focus should be set, <code>false</code> otherwise
 	 */
@@ -581,7 +601,7 @@
 			}
 		} else {
 			Color color = fViewer.getControl().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-			fViewer.getTextWidget().setBackground(color);			
+			fViewer.getTextWidget().setBackground(color);
 		}
 		if (hasConditionHistory()) {
 			fConditionHistory.setEnabled(enabled);
@@ -590,7 +610,7 @@
 
 	/**
 	 * Returns the breakpoint being edited or <code>null</code> if none.
-	 * 
+	 *
 	 * @return breakpoint or <code>null</code>
 	 */
 	@Override
@@ -601,7 +621,7 @@
 
 	/**
 	 * Tells whether this editor shows a condition history drop-down list.
-	 * 
+	 *
 	 * @return <code>true</code> if this editor shows a condition history drop-down list,
 	 *         <code>false</code> otherwise
 	 */
@@ -621,7 +641,7 @@
 
 	/**
 	 * Returns the condition history labels for the current breakpoint.
-	 * 
+	 *
 	 * @return an array of strings containing the condition history labels
 	 */
 	private String[] getConditionHistoryLabels() {
@@ -635,7 +655,7 @@
 
 	/**
 	 * Returns the condition history entries for the current breakpoint.
-	 * 
+	 *
 	 * @return an array of strings containing the history of conditions
 	 */
 	private String[] getConditionHistory() {
@@ -650,7 +670,7 @@
 			return globalItems;
 		}
 
-		// Create combined history 
+		// Create combined history
 		int localHistorySize= Math.min(localHistory.size(), MAX_HISTORY_SIZE);
 		String[] historyItems= new String[localHistorySize + globalItems.length + 1];
 		for (int i= 0; i < localHistorySize; i++) {
@@ -674,7 +694,7 @@
 		// Update local history
 		Stack<String> localHistory= fLocalConditionHistory.get(fBreakpoint);
 		if (localHistory == null) {
-			localHistory= new Stack<String>();
+			localHistory= new Stack<>();
 			fLocalConditionHistory.put(fBreakpoint, localHistory);
 		}
 
@@ -701,7 +721,7 @@
 
 	/**
 	 * Reads the condition history from the given dialog settings.
-	 * 
+	 *
 	 * @param dialogSettings the dialog settings
 	 * @return the condition history
 	 */
@@ -722,7 +742,7 @@
 
 	/**
 	 * Writes the given conditions into the given dialog settings.
-	 * 
+	 *
 	 * @param conditions an array of strings containing the conditions
 	 * @param dialogSettings the dialog settings
 	 */
@@ -743,7 +763,7 @@
 
 	/**
 	 * Returns the label for the history separator.
-	 * 
+	 *
 	 * @return the label for the history separator
 	 */
 	private String getSeparatorLabel() {
@@ -796,7 +816,7 @@
 
 	/**
 	 * Returns this editor's viewer's undo manager undo context.
-	 * 
+	 *
 	 * @return the undo context or <code>null</code> if not available
 	 * @since 3.1
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/console/JavaStackTraceConsoleFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/console/JavaStackTraceConsoleFactory.java
index 07eeee2..fded9d0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/console/JavaStackTraceConsoleFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/console/JavaStackTraceConsoleFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,9 +19,9 @@
 
 /**
  * Creates a new console into which users can paste stack traces and follow the hyperlinks.
- * 
+ *
  * @since 3.8
- * 
+ *
  */
 public class JavaStackTraceConsoleFactory implements IConsoleFactory {
 	private IConsoleManager fConsoleManager = null;
@@ -58,7 +58,7 @@
 	/**
 	 * Opens the console (creating a new one if not previously initialized). If the passed string is not <code>null</code>, the text of the console is
 	 * set to the string.
-	 * 
+	 *
 	 * @param initialText
 	 *            text to put in the console or <code>null</code>.
 	 */
@@ -73,6 +73,6 @@
 		}
 		fConsoleManager.showConsoleView(fConsole);
 	}
-	
+
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AbstractVMInstallPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AbstractVMInstallPage.java
index 127a023..472fa03 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AbstractVMInstallPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AbstractVMInstallPage.java
@@ -24,7 +24,7 @@
 import org.eclipse.osgi.util.NLS;
 
 /**
- * A wizard page used to edit the attributes of an installed JRE. A page is 
+ * A wizard page used to edit the attributes of an installed JRE. A page is
  * provided by JDT to edit standard JREs, but clients may contribute a custom
  * page for a VM install type if required.
  * <p>
@@ -32,7 +32,7 @@
  * point. Following is an example definition of a VM install page.
  * <pre>
  * &lt;extension point="org.eclipse.jdt.debug.ui.vmInstallPages"&gt;
- *   &lt;vmInstallPage 
+ *   &lt;vmInstallPage
  *      vmInstallType="org.eclipse.jdt.launching.EEVMType"
  *      class="org.eclipse.jdt.internal.debug.ui.jres.EEVMPage"&gt;
  *   &lt;/vmInstallPage&gt;
@@ -47,28 +47,28 @@
  * </ul>
  * </p>
  * <p>
- * Clients contributing a custom VM install page via the <code>vmInstallPages</code> 
+ * Clients contributing a custom VM install page via the <code>vmInstallPages</code>
  * extension point must subclass this class.
  * </p>
  * @since 3.3
  */
 public abstract class AbstractVMInstallPage extends WizardPage {
-	
+
 	/**
 	 * Name of the original VM being edited, or <code>null</code> if none.
 	 */
 	private String fOriginalName = null;
-	
+
 	/**
 	 * Status of VM name (to notify of name already in use)
 	 */
 	private IStatus fNameStatus = Status.OK_STATUS;
-	
+
 	private String[] fExistingNames;
-		
+
 	/**
 	 * Constructs a new page with the given page name.
-	 * 
+	 *
 	 * @param pageName the name of the page
 	 */
 	protected AbstractVMInstallPage(String pageName) {
@@ -89,37 +89,37 @@
 	}
 
 	/**
-	 * Called when the VM install page wizard is closed by selecting 
-	 * the finish button. Implementers typically override this method to 
-	 * store the page result (new/changed vm install returned in 
+	 * Called when the VM install page wizard is closed by selecting
+	 * the finish button. Implementers typically override this method to
+	 * store the page result (new/changed vm install returned in
 	 * getSelection) into its model.
-	 * 
+	 *
 	 * @return if the operation was successful. Only when returned
 	 * <code>true</code>, the wizard will close.
 	 */
 	public abstract boolean finish();
-	
+
 	/**
 	 * Returns the edited or created VM install. This method
 	 * may return <code>null</code> if no VM install exists.
-	 * 
+	 *
 	 * @return the edited or created VM install.
 	 */
 	public abstract VMStandin getSelection();
 
 	/**
-	 * Sets the VM install to be edited. 
-	 * 
+	 * Sets the VM install to be edited.
+	 *
 	 * @param vm the VM install to edit
 	 */
 	public void setSelection(VMStandin vm) {
 		fOriginalName = vm.getName();
 	}
-	
+
 	/**
 	 * Updates the name status based on the new name. This method should be called
 	 * by the page each time the VM name changes.
-	 * 
+	 *
 	 * @param newName new name of VM
 	 */
 	protected void nameChanged(String newName) {
@@ -132,20 +132,20 @@
 			fNameStatus = new Status(sev, JDIDebugUIPlugin.getUniqueIdentifier(), JREMessages.addVMDialog_enterName);
 		} else {
 			if (isDuplicateName(newName)) {
-				fNameStatus = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), JREMessages.addVMDialog_duplicateName); 
+				fNameStatus = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), JREMessages.addVMDialog_duplicateName);
 			} else {
 				IStatus s = ResourcesPlugin.getWorkspace().validateName(newName, IResource.FILE);
 				if (!s.isOK()) {
-					fNameStatus = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), NLS.bind(JREMessages.AddVMDialog_JRE_name_must_be_a_valid_file_name___0__1, new String[]{s.getMessage()})); 
+					fNameStatus = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), NLS.bind(JREMessages.AddVMDialog_JRE_name_must_be_a_valid_file_name___0__1, new String[]{s.getMessage()}));
 				}
 			}
 		}
 		updatePageStatus();
 	}
-	
+
 	/**
 	 * Returns whether the name is already in use by an existing VM
-	 * 
+	 *
 	 * @param name new name
 	 * @return whether the name is already in use
 	 */
@@ -158,18 +158,18 @@
 			}
 		}
 		return false;
-	}	
-	
+	}
+
 	/**
 	 * Sets the names of existing VMs, not including the VM being edited. This method
 	 * is called by the wizard and clients should not call this method.
-	 * 
+	 *
 	 * @param names existing VM names or an empty array
 	 */
 	public void setExistingNames(String[] names) {
 		fExistingNames = names;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
 	 */
@@ -177,10 +177,10 @@
 	public IWizardPage getNextPage() {
 		return null;
 	}
-	
+
 	/**
 	 * Sets this page's message based on the status severity.
-	 * 
+	 *
 	 * @param status status with message and severity
 	 */
 	protected void setStatusMessage(IStatus status) {
@@ -201,17 +201,17 @@
 				break;
 			}
 		}
-	}	
-	
+	}
+
 	/**
 	 * Returns the current status of the name being used for the VM.
-	 * 
+	 *
 	 * @return status of current VM name
 	 */
 	protected IStatus getNameStatus() {
 		return fNameStatus;
 	}
-	
+
 	/**
 	 * Updates the status message on the page, based on the status of the VM and other
 	 * status provided by the page.
@@ -234,13 +234,13 @@
 			setStatusMessage(max);
 		}
 		setPageComplete(max.isOK() || max.getSeverity() == IStatus.INFO);
-	}	
-	
+	}
+
 	/**
 	 * Returns a collection of status messages pertaining to the current edit
 	 * status of the VM on this page. An empty collection or a collection of
 	 * OK status objects indicates all is well.
-	 * 
+	 *
 	 * @return collection of status objects for this page
 	 */
 	protected abstract IStatus[] getVMStatus();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletArgumentsTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletArgumentsTab.java
index c1beab7..4cf9a49 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletArgumentsTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletArgumentsTab.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Remy Chi Jian Suen <remy.suen@gmail.com>	- Bug 221973 Make WorkingDirectoryBlock from JDT a Debug API class
@@ -41,7 +41,7 @@
 	 */
 	@Override
 	protected void setHelpContextId() {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_APPLET_ARGUMENTS_TAB);		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_APPLET_ARGUMENTS_TAB);
 	}
-			
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletMainTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletMainTab.java
index 0ec473c..0a7e7b8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletMainTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletMainTab.java
@@ -54,11 +54,11 @@
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class AppletMainTab extends SharedJavaMainTab {
-	
+
 	// Applet viewer UI widgets
 	private Text fAppletViewerClassText;
 	private Button fAppletViewerClassDefaultButton;
-	
+
 	/**
 	 * Creates the applet viewer control area
 	 * @param parent the composite to add this control to
@@ -67,7 +67,7 @@
 		Font font = parent.getFont();
 		Group group = SWTFactory.createGroup(parent, LauncherMessages.AppletMainTab_1, 2, 1, GridData.FILL_HORIZONTAL);
 		Composite comp = SWTFactory.createComposite(group, font, 2, 2, GridData.FILL_BOTH, 0, 0);
-		fAppletViewerClassText= SWTFactory.createSingleText(comp, 2); 
+		fAppletViewerClassText= SWTFactory.createSingleText(comp, 2);
 		fAppletViewerClassText.addModifyListener(getDefaultListener());
 		createVerticalSpacer(comp, 1);
 		fAppletViewerClassDefaultButton= createCheckButton(comp, LauncherMessages.AppletMainTab_2);
@@ -80,13 +80,13 @@
 			}
 		});
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
 	 */
 	@Override
 	public void createControl(Composite parent) {
-		Composite projComp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH); 
+		Composite projComp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH);
 		((GridLayout)projComp.getLayout()).verticalSpacing = 0;
 		createProjectEditor(projComp);
 		createVerticalSpacer(projComp, 1);
@@ -96,7 +96,7 @@
 		setControl(projComp);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_APPLET_MAIN_TAB);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
 	 */
@@ -104,7 +104,7 @@
 	public Image getImage() {
 		return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
 	 */
@@ -120,12 +120,12 @@
 		setAppletViewerTextEnabledState();
 		if (isDefaultAppletViewerClassName()) {
 			fAppletViewerClassText.setText(IJavaLaunchConfigurationConstants.DEFAULT_APPLETVIEWER_CLASS);
-		} 
+		}
 		else {
 			fAppletViewerClassText.setText(EMPTY_STRING);
 		}
 	}
-	
+
 	/**
 	 * Show a dialog that lists all main types
 	 */
@@ -148,17 +148,17 @@
 		IType[] types = null;
 		try {
 			types = AppletLaunchConfigurationUtils.findApplets(getLaunchConfigurationDialog(), scope);
-		} 
-		catch (InterruptedException e) {return;} 
+		}
+		catch (InterruptedException e) {return;}
 		catch (InvocationTargetException e) {
 			setErrorMessage(e.getTargetException().getMessage());
 			return;
 		}
-		DebugTypeSelectionDialog dialog = new DebugTypeSelectionDialog(getShell(), types, LauncherMessages.appletlauncher_maintab_selection_applet_dialog_title); 
+		DebugTypeSelectionDialog dialog = new DebugTypeSelectionDialog(getShell(), types, LauncherMessages.appletlauncher_maintab_selection_applet_dialog_title);
 		if (dialog.open() == Window.CANCEL) {
 			return;
 		}
-		Object[] results = dialog.getResult();	
+		Object[] results = dialog.getResult();
 		IType type = (IType)results[0];
 		if (type != null) {
 			fMainText.setText(type.getFullyQualifiedName());
@@ -173,7 +173,7 @@
 	private void initializeAppletViewerClass(ILaunchConfigurationWorkingCopy config) {
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_APPLETVIEWER_CLASS, (String)null);
 	}
-	
+
 	/**
 	 * Initialize default attribute values based on the
 	 * given Java element.
@@ -185,7 +185,7 @@
 		initializeMainTypeAndName(javaElement, config);
 		initializeAppletViewerClass(config);
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.AbstractJavaMainTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -195,7 +195,7 @@
 		updateMainTypeFromConfig(config);
 		updateAppletViewerClassNameFromConfig(config);
 	}
-	
+
 	/**
 	 * Returns whether the default applet viewer is to be used
 	 * @return if the viewer should be used
@@ -214,19 +214,19 @@
 		String name= fProjText.getText().trim();
 		if (name.length() > 0) {
 			if (!ResourcesPlugin.getWorkspace().getRoot().getProject(name).exists()) {
-				setErrorMessage(LauncherMessages.appletlauncher_maintab_project_error_doesnotexist); 
+				setErrorMessage(LauncherMessages.appletlauncher_maintab_project_error_doesnotexist);
 				return false;
 			}
 		}
 		name = fMainText.getText().trim();
 		if (name.length() == 0) {
-			setErrorMessage(LauncherMessages.appletlauncher_maintab_type_error_doesnotexist); 
+			setErrorMessage(LauncherMessages.appletlauncher_maintab_type_error_doesnotexist);
 			return false;
 		}
 		name = fAppletViewerClassText.getText().trim();
 		if (name.length() == 0) {
-			setErrorMessage(LauncherMessages.AppletMainTab_3);  
-			return false;			
+			setErrorMessage(LauncherMessages.AppletMainTab_3);
+			return false;
 		}
 		return true;
 	}
@@ -274,7 +274,7 @@
 
 	/**
 	 * updates the applet class name from the specified launch configuration
-	 * @param config the config to load the class name attribute from 
+	 * @param config the config to load the class name attribute from
 	 */
 	private void updateAppletViewerClassNameFromConfig(ILaunchConfiguration config) {
 		String appletViewerClassName = EMPTY_STRING;
@@ -295,7 +295,7 @@
 
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletParametersTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletParametersTab.java
index 109de1d..f079ae6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletParametersTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/AppletParametersTab.java
@@ -60,14 +60,14 @@
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class AppletParametersTab extends JavaLaunchTab {
-	
+
 	private Text fWidthText;
 	private Text fHeightText;
 	private Text fNameText;
 	private Button fParametersAddButton;
 	private Button fParametersRemoveButton;
 	private Button fParametersEditButton;
-	
+
 	private class AppletTabListener extends SelectionAdapter implements ModifyListener {
 
 		/* (non-Javadoc)
@@ -77,7 +77,7 @@
 		public void modifyText(ModifyEvent e) {
 			updateLaunchConfigurationDialog();
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
 		 */
@@ -96,21 +96,21 @@
 		}
 
 	}
-	
+
 	private AppletTabListener fListener= new AppletTabListener();
 
 	private static final String EMPTY_STRING = "";	 //$NON-NLS-1$
-	
+
 	/**
 	 * The default value for the 'width' attribute.
 	 */
 	public static final int DEFAULT_APPLET_WIDTH = 200;
-	
+
 	/**
 	 * The default value for the 'height' attribute.
 	 */
 	public static final int DEFAULT_APPLET_HEIGHT = 200;
-	
+
 	/**
 	 * The parameters table viewer
 	 */
@@ -120,44 +120,44 @@
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
 	 */
 	@Override
-	public void createControl(Composite parent) {	
+	public void createControl(Composite parent) {
 		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_HORIZONTAL);
 		setControl(comp);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),	IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_APPLET_PARAMETERS_TAB);
-		
+
 		Composite namecomp = SWTFactory.createComposite(comp, comp.getFont(), 4, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		
+
 		SWTFactory.createLabel(namecomp, LauncherMessages.appletlauncher_argumenttab_widthlabel_text, 1);
-		
+
 		fWidthText = SWTFactory.createSingleText(namecomp, 1);
 		fWidthText.addModifyListener(fListener);
 
 		SWTFactory.createLabel(namecomp, LauncherMessages.appletlauncher_argumenttab_namelabel_text, 1);
-		
+
 		fNameText = SWTFactory.createSingleText(namecomp, 1);
-		fNameText.addModifyListener(fListener);	
+		fNameText.addModifyListener(fListener);
 
 		SWTFactory.createLabel(namecomp, LauncherMessages.appletlauncher_argumenttab_heightlabel_text, 1);
-		
+
 		fHeightText = SWTFactory.createSingleText(namecomp, 1);
 		fHeightText.addModifyListener(fListener);
-		
+
 		Label blank = new Label(namecomp, SWT.NONE);
 		blank.setText(EMPTY_STRING);
 		Label hint = SWTFactory.createLabel(namecomp, LauncherMessages.AppletParametersTab__optional_applet_instance_name__1, 1);
 		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
 		hint.setLayoutData(gd);
-				
+
 		SWTFactory.createVerticalSpacer(comp, 1);
-		
+
 		Composite paramcomp = SWTFactory.createComposite(comp, comp.getFont(), 2, 1, GridData.FILL_BOTH, 0, 0);
-		
-		SWTFactory.createLabel(paramcomp, LauncherMessages.appletlauncher_argumenttab_parameterslabel_text, 2);		
-		
+
+		SWTFactory.createLabel(paramcomp, LauncherMessages.appletlauncher_argumenttab_parameterslabel_text, 2);
+
 		Table ptable = new Table(paramcomp, SWT.FULL_SELECTION | SWT.BORDER);
 		fViewer = new TableViewer(ptable);
 		gd = new GridData(GridData.FILL_BOTH);
-		ptable.setLayoutData(gd);		
+		ptable.setLayoutData(gd);
 		TableColumn column1 = new TableColumn(ptable, SWT.NONE);
 		column1.setText(LauncherMessages.appletlauncher_argumenttab_parameterscolumn_name_text);
 		TableColumn column2 = new TableColumn(ptable, SWT.NONE);
@@ -178,7 +178,7 @@
 				}
 			}
 		});
-		
+
 		fViewer.setContentProvider(new IStructuredContentProvider() {
 			@Override
 			public Object[] getElements(Object inputElement) {
@@ -192,7 +192,7 @@
 			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 			}
 		});
-	
+
 		fViewer.setLabelProvider(new ITableLabelProvider() {
 			@Override
 			public Image getColumnImage(Object element, int columnIndex) {
@@ -226,25 +226,25 @@
 			public void removeListener(ILabelProviderListener listener) {
 			}
 		});
-		
+
 		fViewer.setComparator(new ViewerComparator());
-		
+
 		Composite envcomp = SWTFactory.createComposite(paramcomp, paramcomp.getFont(), 1, 1, GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL, 0, 0);
-		
-		fParametersAddButton = createPushButton(envcomp ,LauncherMessages.appletlauncher_argumenttab_parameters_button_add_text, null); 
+
+		fParametersAddButton = createPushButton(envcomp ,LauncherMessages.appletlauncher_argumenttab_parameters_button_add_text, null);
 		fParametersAddButton.addSelectionListener(fListener);
-		
-		fParametersEditButton = createPushButton(envcomp, LauncherMessages.appletlauncher_argumenttab_parameters_button_edit_text, null); 
+
+		fParametersEditButton = createPushButton(envcomp, LauncherMessages.appletlauncher_argumenttab_parameters_button_edit_text, null);
 		fParametersEditButton.addSelectionListener(fListener);
-		
-		fParametersRemoveButton = createPushButton(envcomp, LauncherMessages.appletlauncher_argumenttab_parameters_button_remove_text, null); 
+
+		fParametersRemoveButton = createPushButton(envcomp, LauncherMessages.appletlauncher_argumenttab_parameters_button_remove_text, null);
 		fParametersRemoveButton.addSelectionListener(fListener);
-		
+
 		setParametersButtonsEnableState();
 		Dialog.applyDialogFont(parent);
 	}
 
-		
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration)
 	 */
@@ -254,24 +254,24 @@
 		try {
 			Integer.parseInt(getWidthText());
 		} catch(NumberFormatException nfe) {
-			setErrorMessage(LauncherMessages.appletlauncher_argumenttab_width_error_notaninteger); 
+			setErrorMessage(LauncherMessages.appletlauncher_argumenttab_width_error_notaninteger);
 			return false;
 		}
 		try {
 			Integer.parseInt(getHeightText());
 		} catch(NumberFormatException nfe) {
-			setErrorMessage(LauncherMessages.appletlauncher_argumenttab_height_error_notaninteger); 
+			setErrorMessage(LauncherMessages.appletlauncher_argumenttab_height_error_notaninteger);
 			return false;
 		}
 		return true;
 	}
 
 	private void handleParametersAddButtonSelected() {
-		NameValuePairDialog dialog = 
-			new NameValuePairDialog(getShell(), 
-				LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_title,  
-				new String[] {LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_name_text, LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_value_text},  // 
-				new String[] {EMPTY_STRING, EMPTY_STRING}); 
+		NameValuePairDialog dialog =
+			new NameValuePairDialog(getShell(),
+				LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_title,
+				new String[] {LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_name_text, LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_value_text},  //
+				new String[] {EMPTY_STRING, EMPTY_STRING});
 		openNewParameterDialog(dialog, null);
 		setParametersButtonsEnableState();
 	}
@@ -281,14 +281,14 @@
 		String key = (String) selection.getFirstElement();
 		Map<String, String> params = getViewerInput();
 		String value = params.get(key);
-		
+
 		NameValuePairDialog dialog =
-			new NameValuePairDialog(getShell(), 
-				LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_title,  
-				new String[] {LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_name_text, LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_value_text},  // 
+			new NameValuePairDialog(getShell(),
+				LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_title,
+				new String[] {LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_name_text, LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_value_text},  //
 				new String[] {key, value});
-		
-		openNewParameterDialog(dialog, key);		
+
+		openNewParameterDialog(dialog, key);
 	}
 
 	private void handleParametersRemoveButtonSelected() {
@@ -297,7 +297,7 @@
 		for (int i = 0; i < keys.length; i++) {
 			String key = (String) keys[i];
 			Map<String, String> params = getViewerInput();
-			params.remove(key);			
+			params.remove(key);
 		}
 		fViewer.refresh();
 		setParametersButtonsEnableState();
@@ -321,7 +321,7 @@
 			} else {
 				fParametersEditButton.setEnabled(false);
 			}
-		}		
+		}
 		fParametersAddButton.setEnabled(true);
 	}
 
@@ -339,7 +339,7 @@
 		params.remove(key);
 		params.put(nameValuePair[0], nameValuePair[1]);
 		fViewer.refresh();
-		updateLaunchConfigurationDialog();	
+		updateLaunchConfigurationDialog();
 	}
 
 	@SuppressWarnings("unchecked")
@@ -371,7 +371,7 @@
 	private String getWidthText() {
 		return fWidthText.getText().trim();
 	}
-	
+
 	/**
 	 * Returns the current height specified by the user
 	 * @return the height specified by the user
@@ -386,7 +386,7 @@
 	@Override
 	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
 	}
-	
+
 
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
@@ -394,22 +394,22 @@
 	@Override
 	public void initializeFrom(ILaunchConfiguration config) {
 		try {
-			fWidthText.setText(Integer.toString(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, DEFAULT_APPLET_WIDTH))); 
+			fWidthText.setText(Integer.toString(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, DEFAULT_APPLET_WIDTH)));
 		} catch(CoreException ce) {
-			fWidthText.setText(Integer.toString(DEFAULT_APPLET_WIDTH)); 
+			fWidthText.setText(Integer.toString(DEFAULT_APPLET_WIDTH));
 		}
 		try {
-			fHeightText.setText(Integer.toString(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, DEFAULT_APPLET_HEIGHT))); 
+			fHeightText.setText(Integer.toString(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, DEFAULT_APPLET_HEIGHT)));
 		} catch(CoreException ce) {
-			fHeightText.setText(Integer.toString(DEFAULT_APPLET_HEIGHT)); 
+			fHeightText.setText(Integer.toString(DEFAULT_APPLET_HEIGHT));
 		}
 		try {
-			fNameText.setText(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, LauncherMessages.appletlauncher_argumenttab_name_defaultvalue)); 
+			fNameText.setText(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, LauncherMessages.appletlauncher_argumenttab_name_defaultvalue));
 		} catch(CoreException ce) {
-			fNameText.setText(LauncherMessages.appletlauncher_argumenttab_name_defaultvalue); 
+			fNameText.setText(LauncherMessages.appletlauncher_argumenttab_name_defaultvalue);
 		}
-		
-		Map<String, String> input = new HashMap<String, String>();
+
+		Map<String, String> input = new HashMap<>();
 		try {
 			 Map<String, String> params = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_PARAMETERS, (Map<String, String>) null);
              if (params != null) {
@@ -417,7 +417,7 @@
 			}
 		} catch (CoreException e) {
 		}
-		
+
 		fViewer.setInput(input);
 	}
 
@@ -426,27 +426,27 @@
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.appletlauncher_argumenttab_name; 
-	}	
-	
+		return LauncherMessages.appletlauncher_argumenttab_name;
+	}
+
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.appletParametersTab"; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return JavaDebugImages.get(JavaDebugImages.IMG_VIEW_ARGUMENTS_TAB);
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
@@ -461,6 +461,6 @@
 	@Override
 	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
 		// do nothing when de-activated
-	}	
+	}
 }
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaAppletLaunchShortcut.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaAppletLaunchShortcut.java
index 6c6faec..8cc42c8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaAppletLaunchShortcut.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaAppletLaunchShortcut.java
@@ -28,7 +28,7 @@
 import org.eclipse.jface.operation.IRunnableContext;
 
 /**
- * 
+ *
  * Launch shortcut for Java applets.
  * <p>
  * This class may be instantiated or subclassed.
@@ -36,7 +36,7 @@
  * @since 3.3
  */
 public class JavaAppletLaunchShortcut extends JavaLaunchShortcut {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#createConfiguration(org.eclipse.jdt.core.IType)
 	 */
@@ -45,27 +45,27 @@
 		ILaunchConfiguration config = null;
 		try {
 			ILaunchConfigurationType configType = getConfigurationType();
-			ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, DebugPlugin.getDefault().getLaunchManager().generateLaunchConfigurationName(type.getElementName())); 
+			ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, DebugPlugin.getDefault().getLaunchManager().generateLaunchConfigurationName(type.getElementName()));
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, type.getFullyQualifiedName());
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, type.getJavaProject().getElementName());
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, AppletParametersTab.DEFAULT_APPLET_WIDTH);
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, AppletParametersTab.DEFAULT_APPLET_HEIGHT);
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, ""); //$NON-NLS-1$
 			wc.setMappedResources(new IResource[] {type.getUnderlyingResource()});
-			config = wc.doSave();		
+			config = wc.doSave();
 		} catch (CoreException ce) {
-			MessageDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(), LauncherMessages.JavaLaunchShortcut_3, ce.getStatus().getMessage());	
+			MessageDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(), LauncherMessages.JavaLaunchShortcut_3, ce.getStatus().getMessage());
 		}
 		return config;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#getConfigurationType()
 	 */
 	@Override
 	protected ILaunchConfigurationType getConfigurationType() {
 		ILaunchManager lm= DebugPlugin.getDefault().getLaunchManager();
-		return lm.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLET);		
+		return lm.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLET);
 	}
 
 	/* (non-Javadoc)
@@ -78,7 +78,7 @@
 		} catch (InvocationTargetException e) {
 			throw (CoreException)e.getTargetException();
 		}
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#getTypeSelectionTitle()
@@ -102,5 +102,5 @@
 	@Override
 	protected String getSelectionEmptyMessage() {
 		return LauncherMessages.JavaAppletLaunchShortcut_2;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaApplicationLaunchShortcut.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaApplicationLaunchShortcut.java
index 4b82721..9ac5acd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaApplicationLaunchShortcut.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaApplicationLaunchShortcut.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.ui.launchConfigurations;
 
- 
+
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
@@ -47,17 +47,17 @@
  * @since 3.3
  */
 public class JavaApplicationLaunchShortcut extends JavaLaunchShortcut {
-	
+
 	/**
 	 * Returns the Java elements corresponding to the given objects. Members are translated
 	 * to corresponding declaring types where possible.
-	 * 
+	 *
 	 * @param objects selected objects
 	 * @return corresponding Java elements
 	 * @since 3.5
 	 */
 	protected IJavaElement[] getJavaElements(Object[] objects) {
-		List<IJavaElement> list= new ArrayList<IJavaElement>(objects.length);
+		List<IJavaElement> list= new ArrayList<>(objects.length);
 		for (int i = 0; i < objects.length; i++) {
 			Object object = objects[i];
 			if (object instanceof IAdaptable) {
@@ -76,7 +76,7 @@
 		}
 		return list.toArray(new IJavaElement[list.size()]);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#createConfiguration(org.eclipse.jdt.core.IType)
 	 */
@@ -92,28 +92,28 @@
 			wc.setMappedResources(new IResource[] {type.getUnderlyingResource()});
 			config = wc.doSave();
 		} catch (CoreException exception) {
-			MessageDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(), LauncherMessages.JavaLaunchShortcut_3, exception.getStatus().getMessage());	
-		} 
+			MessageDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(), LauncherMessages.JavaLaunchShortcut_3, exception.getStatus().getMessage());
+		}
 		return config;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#getConfigurationType()
 	 */
 	@Override
 	protected ILaunchConfigurationType getConfigurationType() {
-		return getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);		
+		return getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
 	}
 
 	/**
 	 * Returns the singleton launch manager.
-	 * 
+	 *
 	 * @return launch manager
 	 */
 	private ILaunchManager getLaunchManager() {
 		return DebugPlugin.getDefault().getLaunchManager();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#findTypes(java.lang.Object[], org.eclipse.jface.operation.IRunnableContext)
 	 */
@@ -136,7 +136,7 @@
 			throw new CoreException(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), e.getMessage(), e));
 		}
 	}
-	
+
 	/**
 	 * Returns the smallest enclosing <code>IType</code> if the specified object is a main method, or <code>null</code>
 	 * @param o the object to inspect
@@ -158,7 +158,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchShortcut#getTypeSelectionTitle()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java
index d56395e..bf2eced 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Remy Chi Jian Suen <remy.suen@gmail.com>
@@ -13,7 +13,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.ui.launchConfigurations;
 
- 
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
@@ -56,38 +56,38 @@
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class JavaArgumentsTab extends JavaLaunchTab {
-		
+
 	// Program arguments widgets
 	protected Label fPrgmArgumentsLabel;
 	protected Text fPrgmArgumentsText;
 
 	// VM arguments widgets
 	protected VMArgumentsBlock fVMArgumentsBlock;
-	
+
 	// Working directory
 	protected WorkingDirectoryBlock fWorkingDirectoryBlock;
-		
+
 	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-		
+
 	public JavaArgumentsTab() {
 		fVMArgumentsBlock = createVMArgsBlock();
 		fWorkingDirectoryBlock = createWorkingDirBlock();
 	}
-	
+
 	protected VMArgumentsBlock createVMArgsBlock() {
 		return new VMArgumentsBlock();
 	}
-	
+
 	/**
 	 * Creates a control to specify a working directory.
-	 * 
+	 *
 	 * @return the new {@link WorkingDirectoryBlock}
 	 * @since 3.4
 	 */
 	protected WorkingDirectoryBlock createWorkingDirBlock() {
 		return new JavaWorkingDirectoryBlock();
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
 	 */
@@ -98,21 +98,21 @@
 		GridLayout layout = new GridLayout(1, true);
 		comp.setLayout(layout);
 		comp.setFont(font);
-		
+
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		comp.setLayoutData(gd);
 		setControl(comp);
 		setHelpContextId();
-		
+
 		Group group = new Group(comp, SWT.NONE);
 		group.setFont(font);
 		layout = new GridLayout();
 		group.setLayout(layout);
 		group.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
-		String controlName = (LauncherMessages.JavaArgumentsTab__Program_arguments__5); 
+
+		String controlName = (LauncherMessages.JavaArgumentsTab__Program_arguments__5);
 		group.setText(controlName);
-		
+
 		fPrgmArgumentsText = new Text(group, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
 		fPrgmArgumentsText.addTraverseListener(new TraverseListener() {
 			@Override
@@ -149,9 +149,9 @@
 			}
 		});
 		ControlAccessibleListener.addListener(fPrgmArgumentsText, group.getText());
-		
-		String buttonLabel = LauncherMessages.JavaArgumentsTab_5;  
-		Button pgrmArgVariableButton = createPushButton(group, buttonLabel, null); 
+
+		String buttonLabel = LauncherMessages.JavaArgumentsTab_5;
+		Button pgrmArgVariableButton = createPushButton(group, buttonLabel, null);
 		pgrmArgVariableButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
 		pgrmArgVariableButton.addSelectionListener(new SelectionAdapter() {
 			@Override
@@ -164,27 +164,27 @@
 				}
 			}
 		});
-		
+
 		fVMArgumentsBlock.createControl(comp);
-		
-		fWorkingDirectoryBlock.createControl(comp);		
+
+		fWorkingDirectoryBlock.createControl(comp);
 	}
-	
+
 	/**
 	 * Set the help context id for this launch config tab.  Subclasses may
 	 * override this method.
 	 */
 	protected void setHelpContextId() {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ARGUMENTS_TAB);		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ARGUMENTS_TAB);
 	}
-			
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
 	 */
 	@Override
 	public void dispose() {
 	}
-		
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration)
 	 */
@@ -195,7 +195,7 @@
 
 	/**
 	 * Defaults are empty.
-	 * 
+	 *
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
 	 */
 	@Override
@@ -215,7 +215,7 @@
 			fVMArgumentsBlock.initializeFrom(configuration);
 			fWorkingDirectoryBlock.initializeFrom(configuration);
 		} catch (CoreException e) {
-			setErrorMessage(LauncherMessages.JavaArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage()); 
+			setErrorMessage(LauncherMessages.JavaArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage());
 			JDIDebugUIPlugin.log(e);
 		}
 	}
@@ -232,7 +232,7 @@
 
 	/**
 	 * Returns the string in the text widget, or <code>null</code> if empty.
-	 * 
+	 *
 	 * @param text the widget to get the value from
 	 * @return text or <code>null</code>
 	 */
@@ -243,15 +243,15 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.JavaArgumentsTab__Arguments_16; 
-	}	
-	
+		return LauncherMessages.JavaArgumentsTab__Arguments_16;
+	}
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setLaunchConfigurationDialog(ILaunchConfigurationDialog)
 	 */
@@ -260,7 +260,7 @@
 		super.setLaunchConfigurationDialog(dialog);
 		fWorkingDirectoryBlock.setLaunchConfigurationDialog(dialog);
 		fVMArgumentsBlock.setLaunchConfigurationDialog(dialog);
-	}	
+	}
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getErrorMessage()
 	 */
@@ -284,18 +284,18 @@
 		}
 		return m;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return JavaDebugImages.get(JavaDebugImages.IMG_VIEW_ARGUMENTS_TAB);
-	}	
-	
+	}
+
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaClasspathTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaClasspathTab.java
index 13afaae..0b57588 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaClasspathTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaClasspathTab.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -71,7 +71,7 @@
  * attribute.
  * <p>
  * Clients may call {@link #setHelpContextId(String)} on this tab prior to control
- * creation to alter the default context help associated with this tab. 
+ * creation to alter the default context help associated with this tab.
  * </p>
  * <p>
  * This class may be instantiated.
@@ -85,49 +85,49 @@
 	private ClasspathModel fModel;
 
 	protected static final String DIALOG_SETTINGS_PREFIX = "JavaClasspathTab"; //$NON-NLS-1$
-	
+
 	/**
 	 * The last launch config this tab was initialized from
 	 */
 	protected ILaunchConfiguration fLaunchConfiguration;
-	
+
 	/**
 	 * Constructor
 	 */
 	public JavaClasspathTab() {
 		setHelpContextId(IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_CLASSPATH_TAB);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
 	 */
 	@Override
 	public void createControl(Composite parent) {
 		Font font = parent.getFont();
-		
+
 		Composite comp = new Composite(parent, SWT.NONE);
 		setControl(comp);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId());
 		GridLayout topLayout = new GridLayout();
 		topLayout.numColumns = 2;
-		comp.setLayout(topLayout);		
+		comp.setLayout(topLayout);
 		GridData gd;
-		
+
 		Label label = new Label(comp, SWT.NONE);
-		label.setText(LauncherMessages.JavaClasspathTab_0); 
+		label.setText(LauncherMessages.JavaClasspathTab_0);
 		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
 		gd.horizontalSpan = 2;
 		label.setLayoutData(gd);
-		
+
 		fClasspathViewer = new RuntimeClasspathViewer(comp);
 		fClasspathViewer.addEntriesChangedListener(this);
-		fClasspathViewer.getControl().setFont(font);
-		fClasspathViewer.setLabelProvider(new ClasspathLabelProvider());
-		fClasspathViewer.setContentProvider(new ClasspathContentProvider(this));
+		fClasspathViewer.getTreeViewer().getControl().setFont(font);
+		fClasspathViewer.getTreeViewer().setLabelProvider(new ClasspathLabelProvider());
+		fClasspathViewer.getTreeViewer().setContentProvider(new ClasspathContentProvider(this));
 		if (!isShowBootpath()) {
-			fClasspathViewer.addFilter(new BootpathFilter());
+			fClasspathViewer.getTreeViewer().addFilter(new BootpathFilter());
 		}
-	
+
 		Composite pathButtonComp = new Composite(comp, SWT.NONE);
 		GridLayout pathButtonLayout = new GridLayout();
 		pathButtonLayout.marginHeight = 0;
@@ -136,19 +136,19 @@
 		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL);
 		pathButtonComp.setLayoutData(gd);
 		pathButtonComp.setFont(font);
-		
+
 		createPathButtons(pathButtonComp);
 	}
-	
+
 	/**
 	 * Creates the buttons to manipulate the classpath.
-	 * 
+	 *
 	 * @param pathButtonComp composite buttons are contained in
 	 * @since 3.0
 	 */
 	protected void createPathButtons(Composite pathButtonComp) {
-		List<RuntimeClasspathAction> advancedActions = new ArrayList<RuntimeClasspathAction>(5);
-		
+		List<RuntimeClasspathAction> advancedActions = new ArrayList<>(5);
+
 		createButton(pathButtonComp, new MoveUpAction(fClasspathViewer));
 		createButton(pathButtonComp, new MoveDownAction(fClasspathViewer));
 		createButton(pathButtonComp, new RemoveAction(fClasspathViewer));
@@ -156,27 +156,27 @@
 		createButton(pathButtonComp, new AddJarAction(fClasspathViewer));
 		createButton(pathButtonComp, new AddExternalJarAction(fClasspathViewer, DIALOG_SETTINGS_PREFIX));
 
-		RuntimeClasspathAction action = new AddFolderAction(null);								
+		RuntimeClasspathAction action = new AddFolderAction(null);
 		advancedActions.add(action);
-		
-		action = new AddExternalFolderAction(null, DIALOG_SETTINGS_PREFIX);								
-		advancedActions.add(action);		
 
-		action = new AddVariableAction(null);								
-		advancedActions.add(action);	
-		
+		action = new AddExternalFolderAction(null, DIALOG_SETTINGS_PREFIX);
+		advancedActions.add(action);
+
+		action = new AddVariableAction(null);
+		advancedActions.add(action);
+
 		action = new AddLibraryAction(null);
 		advancedActions.add(action);
-		
-		action = new AttachSourceAction(null, SWT.RADIO);								
+
+		action = new AttachSourceAction(null, SWT.RADIO);
 		advancedActions.add(action);
-		
+
 		IAction[] adv = advancedActions.toArray(new IAction[advancedActions.size()]);
 		createButton(pathButtonComp, new AddAdvancedAction(fClasspathViewer, adv));
 
 		action = new EditClasspathEntryAction(fClasspathViewer, getLaunchConfiguration());
 		createButton(pathButtonComp, action);
-		
+
 		action= new RestoreDefaultEntriesAction(fClasspathViewer, this);
 		createButton(pathButtonComp, action);
 		action.setEnabled(true);
@@ -184,7 +184,7 @@
 
 	/**
 	 * Creates a button for the given action.
-	 * 
+	 *
 	 * @param pathButtonComp parent composite for the button
 	 * @param action the action triggered by the button
 	 * @return the button that was created
@@ -208,9 +208,9 @@
 	@Override
 	public void initializeFrom(ILaunchConfiguration configuration) {
 		refresh(configuration);
-		fClasspathViewer.expandToLevel(2);
+		fClasspathViewer.getTreeViewer().expandToLevel(2);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
@@ -224,46 +224,31 @@
 					return;
 				}
 			}
-			fClasspathViewer.refresh();
+			fClasspathViewer.getTreeViewer().refresh();
 		} catch (CoreException e) {
 		}
 	}
-	
+
 	/**
 	 * Refreshes the classpath entries based on the current state of the given
 	 * launch configuration.
 	 * @param configuration the configuration
 	 */
 	private void refresh(ILaunchConfiguration configuration) {
-		boolean useDefault = true;
 		setErrorMessage(null);
-		try {
-			useDefault = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, true);
-		} catch (CoreException e) {
-			JDIDebugUIPlugin.log(e);
-		}
-		
-		if (configuration == getLaunchConfiguration()) {
-			// no need to update if an explicit path is being used and this setting
-			// has not changed (and viewing the same config as last time)
-			if (!useDefault) {
-				setDirty(false);
-				return;			
-			}
-		}
-		
+
 		setLaunchConfiguration(configuration);
 		try {
 			createClasspathModel(configuration);
 		} catch (CoreException e) {
 			setErrorMessage(e.getMessage());
 		}
-		
+
 		fClasspathViewer.setLaunchConfiguration(configuration);
-		fClasspathViewer.setInput(fModel);
+		fClasspathViewer.getTreeViewer().setInput(fModel);
 		setDirty(false);
 	}
-	
+
 	private void createClasspathModel(ILaunchConfiguration configuration) throws CoreException {
 		fModel= new ClasspathModel();
 		IRuntimeClasspathEntry[] entries= JavaRuntime.computeUnresolvedRuntimeClasspath(configuration);
@@ -271,16 +256,16 @@
 		for (int i = 0; i < entries.length; i++) {
 			entry= entries[i];
 			switch (entry.getClasspathProperty()) {
-				case IRuntimeClasspathEntry.USER_CLASSES:				
+				case IRuntimeClasspathEntry.USER_CLASSES:
 					fModel.addEntry(ClasspathModel.USER, entry);
 					break;
 				default:
 					fModel.addEntry(ClasspathModel.BOOTSTRAP, entry);
 					break;
 			}
-		}	
+		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
@@ -295,35 +280,35 @@
 			} else {
 				configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
 				try {
-					List<String> mementos = new ArrayList<String>(classpath.length);
+					List<String> mementos = new ArrayList<>(classpath.length);
 					for (int i = 0; i < classpath.length; i++) {
 						IRuntimeClasspathEntry entry = classpath[i];
 						mementos.add(entry.getMemento());
 					}
 					configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, mementos);
 				} catch (CoreException e) {
-					JDIDebugUIPlugin.statusDialog(LauncherMessages.JavaClasspathTab_Unable_to_save_classpath_1, e.getStatus()); 
-				}	
+					JDIDebugUIPlugin.statusDialog(LauncherMessages.JavaClasspathTab_Unable_to_save_classpath_1, e.getStatus());
+				}
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the classpath entries currently specified by this tab.
-	 * 
+	 *
 	 * @return the classpath entries currently specified by this tab
 	 */
 	private IRuntimeClasspathEntry[] getCurrentClasspath() {
 		IClasspathEntry[] boot = fModel.getEntries(ClasspathModel.BOOTSTRAP);
 		IClasspathEntry[] user = fModel.getEntries(ClasspathModel.USER);
-		List<IRuntimeClasspathEntry> entries = new ArrayList<IRuntimeClasspathEntry>(boot.length + user.length);
+		List<IRuntimeClasspathEntry> entries = new ArrayList<>(boot.length + user.length);
 		IClasspathEntry bootEntry;
 		IRuntimeClasspathEntry entry;
 		for (int i = 0; i < boot.length; i++) {
 			bootEntry= boot[i];
 			entry = null;
 			if (bootEntry instanceof ClasspathEntry) {
-				entry = ((ClasspathEntry)bootEntry).getDelegate(); 
+				entry = ((ClasspathEntry)bootEntry).getDelegate();
 			} else if (bootEntry instanceof IRuntimeClasspathEntry) {
 				entry= (IRuntimeClasspathEntry) boot[i];
 			}
@@ -347,14 +332,14 @@
 				entry.setClasspathProperty(IRuntimeClasspathEntry.USER_CLASSES);
 				entries.add(entry);
 			}
-		}			
+		}
 		return entries.toArray(new IRuntimeClasspathEntry[entries.size()]);
 	}
 
 	/**
 	 * Returns whether the specified classpath is equivalent to the
 	 * default classpath for this configuration.
-	 * 
+	 *
 	 * @param classpath classpath to compare to default
 	 * @param configuration original configuration
 	 * @return whether the specified classpath is equivalent to the
@@ -385,37 +370,37 @@
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.JavaClasspathTab_Cla_ss_path_3; 
+		return LauncherMessages.JavaClasspathTab_Cla_ss_path_3;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.javaClasspathTab"; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Returns the image for this tab, or <code>null</code> if none
-	 * 
+	 *
 	 * @return the image for this tab, or <code>null</code> if none
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
 	 */
 	public static Image getClasspathImage() {
 		return JavaDebugImages.get(JavaDebugImages.IMG_OBJS_CLASSPATH);
 	}
-	
+
 	/**
 	 * Sets the launch configuration for this classpath tab
 	 * @param config the backing {@link ILaunchConfiguration}
 	 */
 	private void setLaunchConfiguration(ILaunchConfiguration config) {
 		fLaunchConfiguration = config;
-	}	
-	
+	}
+
 	/**
 	 * Returns the current launch configuration
 	 * @return the backing {@link ILaunchConfiguration}
@@ -423,7 +408,7 @@
 	public ILaunchConfiguration getLaunchConfiguration() {
 		return fLaunchConfiguration;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
 	 */
@@ -442,7 +427,7 @@
 	public Image getImage() {
 		return getClasspathImage();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -462,19 +447,19 @@
 			if (status.isOK()) {
 				IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
 				if (!project.exists()) {
-					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_20, new String[] {projectName})); 
+					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_20, new String[] {projectName}));
 					return false;
 				}
 				if (!project.isOpen()) {
-					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_21, new String[] {projectName})); 
+					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_21, new String[] {projectName}));
 					return false;
 				}
 			} else {
-				setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_19, new String[]{status.getMessage()})); 
+				setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_19, new String[]{status.getMessage()}));
 				return false;
 			}
 		}
-		
+
 		IRuntimeClasspathEntry [] entries = fModel.getAllEntries();
 		int type = -1;
 		for (int i=0; i<entries.length; i++) {
@@ -493,20 +478,20 @@
 				}
 			}
 		}
-		
+
 		return true;
 	}
-	
+
 	/**
 	 * Returns whether the bootpath should be displayed.
-	 * 
+	 *
 	 * @return whether the bootpath should be displayed
 	 * @since 3.0
 	 */
 	public boolean isShowBootpath() {
 		return true;
 	}
-	
+
 	/**
 	 * @return Returns the classpath model.
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaConnectTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaConnectTab.java
index 368d484..b344005 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaConnectTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaConnectTab.java
@@ -67,14 +67,14 @@
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class JavaConnectTab extends AbstractJavaMainTab implements IPropertyChangeListener {
-	
+
 	// UI widgets
 	private Button fAllowTerminateButton;
 	private Map<String, Connector.Argument> fArgumentMap;
-	private Map<String, FieldEditor> fFieldEditorMap = new HashMap<String, FieldEditor>();
+	private Map<String, FieldEditor> fFieldEditorMap = new HashMap<>();
 	private Composite fArgumentComposite;
 	private Combo fConnectorCombo;
-	
+
 	// the selected connector
 	private IVMConnector fConnector;
 	private IVMConnector[] fConnectors = JavaRuntime.getVMConnectors();
@@ -91,14 +91,14 @@
 		comp.setLayout(layout);
 		createProjectEditor(comp);
 		createVerticalSpacer(comp, 1);
-		
+
 	//connection type
 		Group group = SWTFactory.createGroup(comp, LauncherMessages.JavaConnectTab_Connect_ion_Type__7, 1, 1, GridData.FILL_HORIZONTAL);
 		String[] names = new String[fConnectors.length];
 		for (int i = 0; i < fConnectors.length; i++) {
 			names[i] = fConnectors[i].getName();
 		}
-		fConnectorCombo = SWTFactory.createCombo(group, SWT.READ_ONLY, 1, GridData.FILL_HORIZONTAL, names); 
+		fConnectorCombo = SWTFactory.createCombo(group, SWT.READ_ONLY, 1, GridData.FILL_HORIZONTAL, names);
 		fConnectorCombo.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -106,19 +106,19 @@
 			}
 		});
 		createVerticalSpacer(comp, 1);
-		
+
 	//connection properties
 		group = SWTFactory.createGroup(comp, LauncherMessages.JavaConnectTab_Connection_Properties_1, 2, 1, GridData.FILL_HORIZONTAL);
 		Composite cgroup = SWTFactory.createComposite(group, font, 2, 1, GridData.FILL_HORIZONTAL);
 		fArgumentComposite = cgroup;
 		createVerticalSpacer(comp, 2);
-		fAllowTerminateButton = createCheckButton(comp, LauncherMessages.JavaConnectTab__Allow_termination_of_remote_VM_6); 
+		fAllowTerminateButton = createCheckButton(comp, LauncherMessages.JavaConnectTab__Allow_termination_of_remote_VM_6);
 		fAllowTerminateButton.addSelectionListener(getDefaultListener());
-		
+
 		setControl(comp);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_CONNECT_TAB);
 	}
-	
+
 	/**
 	 * Update the argument area to show the selected connector's arguments
 	 */
@@ -135,15 +135,15 @@
 		try {
 			fArgumentMap = vm.getDefaultArguments();
 		} catch (CoreException e) {
-			JDIDebugUIPlugin.statusDialog(LauncherMessages.JavaConnectTab_Unable_to_display_connection_arguments__2, e.getStatus()); 
+			JDIDebugUIPlugin.statusDialog(LauncherMessages.JavaConnectTab_Unable_to_display_connection_arguments__2, e.getStatus());
 			return;
 		}
-		
+
 		// Dispose of any current child widgets in the tab holder area
 		Control[] children = fArgumentComposite.getChildren();
 		for (int i = 0; i < children.length; i++) {
 			children[i].dispose();
-		} 
+		}
 		fFieldEditorMap.clear();
 		PreferenceStore store = new PreferenceStore();
 		// create editors
@@ -173,7 +173,7 @@
 				field = new StringFieldEditor(arg.name(), arg.label(), fArgumentComposite);
 			} else if (arg instanceof Connector.BooleanArgument) {
 				store.setDefault(arg.name(), ((Connector.BooleanArgument)arg).booleanValue());
-				field = new BooleanFieldEditor(arg.name(), arg.label(), fArgumentComposite);					
+				field = new BooleanFieldEditor(arg.name(), arg.label(), fArgumentComposite);
 			}
 			if(field != null) {
 				field.setPreferenceStore(store);
@@ -184,9 +184,9 @@
 		}
 		fArgumentComposite.getParent().getParent().layout();
 		fArgumentComposite.layout(true);
-		updateLaunchConfigurationDialog();		
+		updateLaunchConfigurationDialog();
 	}
-	
+
 	 /* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.AbstractJavaMainTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -196,7 +196,7 @@
 		updateAllowTerminateFromConfig(config);
 		updateConnectionFromConfig(config);
 	}
-	
+
 	/**
 	 * Updates the state of the allow terminate check button from the specified configuration
 	 * @param config the config to load from
@@ -204,10 +204,10 @@
 	private void updateAllowTerminateFromConfig(ILaunchConfiguration config) {
 		boolean allowTerminate = false;
 		try {
-			allowTerminate = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_ALLOW_TERMINATE, false);	
+			allowTerminate = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_ALLOW_TERMINATE, false);
 		}
 		catch (CoreException ce) {JDIDebugUIPlugin.log(ce);}
-		fAllowTerminateButton.setSelection(allowTerminate);	
+		fAllowTerminateButton.setSelection(allowTerminate);
 	}
 
 	/**
@@ -220,7 +220,7 @@
 			id = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_CONNECTOR, JavaRuntime.getDefaultVMConnector().getIdentifier());
 			fConnectorCombo.setText(JavaRuntime.getVMConnector(id).getName());
 			handleConnectorComboModified();
-			
+
 			Map<String, String> attrMap = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, (Map<String, String>)null);
 			if (attrMap == null) {
 				return;
@@ -234,7 +234,7 @@
 					String value = attrMap.get(key);
 					if (arg instanceof Connector.StringArgument || arg instanceof Connector.SelectedArgument) {
 						editor.getPreferenceStore().setValue(key, value);
-					} 
+					}
 					else if (arg instanceof Connector.BooleanArgument) {
 						editor.getPreferenceStore().setValue(key, Boolean.valueOf(value).booleanValue());
 					}
@@ -243,9 +243,9 @@
 					}
 					editor.load();
 				}
-			}						
-		} 
-		catch (CoreException ce) {JDIDebugUIPlugin.log(ce);}	
+			}
+		}
+		catch (CoreException ce) {JDIDebugUIPlugin.log(ce);}
 	}
 
 	/* (non-Javadoc)
@@ -257,7 +257,7 @@
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_ALLOW_TERMINATE, fAllowTerminateButton.getSelection());
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_CONNECTOR, getSelectedConnector().getIdentifier());
 		mapResources(config);
-		Map<String, String> attrMap = new HashMap<String, String>(fFieldEditorMap.size());
+		Map<String, String> attrMap = new HashMap<>(fFieldEditorMap.size());
 		Iterator<String> keys = fFieldEditorMap.keySet().iterator();
 		while (keys.hasNext()) {
 			String key = keys.next();
@@ -272,14 +272,14 @@
 			}
 			else if (arg instanceof Connector.BooleanArgument) {
 				attrMap.put(key, Boolean.valueOf(editor.getPreferenceStore().getBoolean(key)).toString());
-			} 
+			}
 			else if (arg instanceof Connector.IntegerArgument) {
 				attrMap.put(key, new Integer(editor.getPreferenceStore().getInt(key)).toString());
 			}
-		}				
+		}
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, attrMap);
 	}
-	
+
 	/**
 	 * Initialize default settings for the given Java element
 	 * @param javaElement the Java element
@@ -299,7 +299,7 @@
 		IJavaElement javaElement = getContext();
 		if (javaElement == null) {
 			initializeHardCodedDefaults(config);
-		} 
+		}
 		else {
 			initializeDefaults(javaElement, config);
 		}
@@ -321,11 +321,11 @@
 				if (index > 0) {
 					name = name.substring(0, index);
 				}
-			} 
+			}
 			else {
 				name= javaElement.getElementName();
 			}
-			name = getLaunchConfigurationDialog().generateName(name);				
+			name = getLaunchConfigurationDialog().generateName(name);
 		}
 		catch (JavaModelException jme) {JDIDebugUIPlugin.log(jme);}
 		config.rename(name);
@@ -344,13 +344,13 @@
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
 	@Override
-	public boolean isValid(ILaunchConfiguration config) {	
+	public boolean isValid(ILaunchConfiguration config) {
 		setErrorMessage(null);
-		setMessage(null);	
+		setMessage(null);
 		String name = fProjText.getText().trim();
 		if (name.length() > 0) {
 			if (!ResourcesPlugin.getWorkspace().getRoot().getProject(name).exists()) {
-				setErrorMessage(LauncherMessages.JavaConnectTab_Project_does_not_exist_14); 
+				setErrorMessage(LauncherMessages.JavaConnectTab_Project_does_not_exist_14);
 				return false;
 			}
 		}
@@ -362,11 +362,11 @@
 			if (editor instanceof StringFieldEditor) {
 				String value = ((StringFieldEditor)editor).getStringValue();
 				if (!arg.isValid(value)) {
-					setErrorMessage(arg.label() + LauncherMessages.JavaConnectTab__is_invalid__5); 
+					setErrorMessage(arg.label() + LauncherMessages.JavaConnectTab__is_invalid__5);
 					return false;
-				}		
+				}
 			}
-		}							
+		}
 		return true;
 	}
 
@@ -376,7 +376,7 @@
 	@Override
 	public String getName() {
 		return LauncherMessages.JavaConnectTab_Conn_ect_20;
-	}			
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
@@ -385,17 +385,17 @@
 	public Image getImage() {
 		return DebugUITools.getImage(IDebugUIConstants.IMG_LCL_DISCONNECT);
 	}
-		
+
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.javaConnectTab"; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Returns the selected connector
 	 * @return the selected {@link IVMConnector}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaJRETab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaJRETab.java
index fb2475c..12e3da9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaJRETab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaJRETab.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.ui.launchConfigurations;
 
- 
+
 import java.util.Map;
 
 import org.eclipse.core.resources.IProject;
@@ -52,11 +52,11 @@
 import org.eclipse.ui.PlatformUI;
 
 /**
- * A launch configuration tab that displays and edits the VM install 
+ * A launch configuration tab that displays and edits the VM install
  * launch configuration attributes.
  * <p>
  * Clients may call {@link #setHelpContextId(String)} on this tab prior to control
- * creation to alter the default context help associated with this tab. 
+ * creation to alter the default context help associated with this tab.
  * </p>
  * <p>
  * This class may be instantiated.
@@ -66,21 +66,21 @@
  */
 
 public class JavaJRETab extends JavaLaunchTab {
-	
+
 	// JRE Block
 	protected JREsComboBlock fJREBlock;
-	
+
 	// Dynamic JRE UI widgets
 	protected ILaunchConfigurationTab fDynamicTab;
 	protected Composite fDynamicTabHolder;
 	protected boolean fUseDynamicArea = true;
-	
+
 	protected ILaunchConfigurationWorkingCopy fWorkingCopy;
 	protected ILaunchConfiguration fLaunchConfiguration;
-	
+
 	// State
 	protected boolean fIsInitializing = false;
-	
+
 	// Selection changed listener (checked JRE)
 	private IPropertyChangeListener fCheckListener = new IPropertyChangeListener() {
 		@Override
@@ -88,14 +88,14 @@
 			handleSelectedJREChanged();
 		}
 	};
-	
+
 	/**
 	 * Constructor
 	 */
 	public JavaJRETab() {
 		setHelpContextId(IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_JRE_TAB);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
 	 */
@@ -114,7 +114,7 @@
 	public void createControl(Composite parent) {
 		Font font = parent.getFont();
 		Composite topComp = SWTFactory.createComposite(parent, font, 1, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		
+
 		fJREBlock = new JREsComboBlock(true);
 		fJREBlock.setDefaultJREDescriptor(getDefaultJREDescriptor());
 		fJREBlock.setSpecificJREDescriptor(getSpecificJREDescriptor());
@@ -122,7 +122,7 @@
 		Control control = fJREBlock.getControl();
 		fJREBlock.addPropertyChangeListener(fCheckListener);
 		control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
+
 		setDynamicTabHolder(SWTFactory.createComposite(topComp, font, 1, 1, GridData.FILL_BOTH, 0, 0));
 		setControl(topComp);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId());
@@ -155,7 +155,7 @@
 			dynamicTab.setDefaults(config);
 		}
 	}
-	
+
 	/**
 	 * @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
 	 */
@@ -169,7 +169,7 @@
 		ILaunchConfigurationTab dynamicTab = getDynamicTab();
 		if (dynamicTab != null) {
 			dynamicTab.initializeFrom(configuration);
-		}		
+		}
 		getControl().setRedraw(true);
 		fIsInitializing = false;
 	}
@@ -193,7 +193,7 @@
 		// erase old attributes in case the user changed from 'specific JRE' to 'default' - see bug 152446
 		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_NAME, (String)null);
 		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE, (String)null);
-		
+
 		// Handle any attributes in the VM-specific area
 		ILaunchConfigurationTab dynamicTab = getDynamicTab();
 		if (dynamicTab == null) {
@@ -208,19 +208,19 @@
 	 */
 	@Override
 	public boolean isValid(ILaunchConfiguration config) {
-		
+
 		setErrorMessage(null);
 		setMessage(null);
-		
+
 		IStatus status = fJREBlock.getStatus();
 		if (!status.isOK()) {
-			setErrorMessage(status.getMessage());			 
+			setErrorMessage(status.getMessage());
 			return false;
 		}
 		if(!isExternalToolConfiguration(fLaunchConfiguration)) {
 			status = checkCompliance();
 			if (!status.isOK()) {
-				setErrorMessage(status.getMessage());			 
+				setErrorMessage(status.getMessage());
 				return false;
 			}
 		}
@@ -231,14 +231,14 @@
 		}
 		return true;
 	}
-	
+
 	/**
 	 * Returns if the specified <code>ILaunchConfiguration</code> is an ant or external tool
 	 * type.
 	 * @param configuration the {@link ILaunchConfiguration}
 	 * @return true if the specified <code>ILaunchConfiguration</code> is an ant or external tools
 	 * type configuration
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	private boolean isExternalToolConfiguration(ILaunchConfiguration configuration) {
@@ -249,12 +249,12 @@
 			id.equals("org.eclipse.ant.AntBuilderLaunchConfigurationType") ||  //$NON-NLS-1$
 			id.equals("org.eclipse.ui.externaltools.ProgramLaunchConfigurationType") || //$NON-NLS-1$
 			id.equals("org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType")); //$NON-NLS-1$
-		} 
+		}
 		catch (CoreException e) {
 			return false;
 		}
 	}
-	
+
 	/**
 	 * Checks to make sure the class file compliance level and the selected VM are compatible
 	 * i.e. such that the selected JRE can run the currently compiled code
@@ -304,7 +304,7 @@
 						} else {
 							setting = LauncherMessages.JavaJRETab_1;
 						}
-						return new Status(IStatus.ERROR, IJavaDebugUIConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(LauncherMessages.JavaJRETab_0, new String[] {setting, source, compliance}), null); 
+						return new Status(IStatus.ERROR, IJavaDebugUIConstants.PLUGIN_ID, IStatus.ERROR, NLS.bind(LauncherMessages.JavaJRETab_0, new String[] {setting, source, compliance}), null);
 					}
 				}
 			}
@@ -312,37 +312,37 @@
 		}
 		// when no VM path is specified return the error status from the JRE block
 		return fJREBlock.getStatus();
-	}	
+	}
 
 	/**
 	 * @see ILaunchConfigurationTab#getName()
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.JavaJRETab__JRE_1; 
+		return LauncherMessages.JavaJRETab__JRE_1;
 	}
-	
+
 	/**
 	 * @see ILaunchConfigurationTab#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
-	}	
+	}
 
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.javaJRETab"; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * This method updates the jre selection from the <code>ILaunchConfiguration</code>
-	 * @param config the config to update from 
+	 * @param config the config to update from
 	 */
 	@SuppressWarnings("deprecation")
 	protected void updateJREFromConfig(ILaunchConfiguration config) {
@@ -361,17 +361,17 @@
 			vmTypeID = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE, (String)null);
 			vmName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_NAME, (String)null);
 		} catch (CoreException ce) {
-			JDIDebugUIPlugin.log(ce);			
+			JDIDebugUIPlugin.log(ce);
 		}
 		selectJRE(vmTypeID, vmName);
-	}	
-	
+	}
+
 	/**
 	 * Notification that the user changed the selection in the JRE combination box.
 	 */
 	protected void handleSelectedJREChanged() {
 		loadDynamicJREArea();
-		
+
 		// always set the newly created area with defaults
 		ILaunchConfigurationWorkingCopy wc = getLaunchConfigurationWorkingCopy();
 		if (getDynamicTab() == null) {
@@ -401,7 +401,7 @@
 					}
 				} catch (CoreException e) {
 					IStatus status = e.getStatus();
-					JDIDebugUIPlugin.statusDialog(status); 
+					JDIDebugUIPlugin.statusDialog(status);
 					JDIDebugUIPlugin.log(status);
 					return;
 				}
@@ -411,10 +411,10 @@
 				getDynamicTab().initializeFrom(wc);
 			}
 		}
-				
-		updateLaunchConfigurationDialog();		
+
+		updateLaunchConfigurationDialog();
 	}
-	
+
 	protected void selectJRE(String typeID, String vmName) {
 		if (typeID == null || vmName == null) {
 			fJREBlock.setPath(JavaRuntime.newDefaultJREContainerPath());
@@ -422,7 +422,7 @@
 			fJREBlock.setPath(JavaRuntime.newJREContainerPath(typeID, vmName));
 		}
 	}
-	
+
 	/**
 	 * Return the class that implements <code>ILaunchConfigurationTab</code>
 	 * that is registered against the install type of the currently selected VM.
@@ -438,44 +438,44 @@
 					return JDIDebugUIPlugin.getDefault().getVMInstallTypePage(vmInstallTypeID);
 				}
 			}
-		}		
+		}
 		return null;
 	}
-	
+
 	/**
 	 * Show the contributed piece of UI that was registered for the install type
 	 * of the currently selected VM.
 	 */
 	protected void loadDynamicJREArea() {
-		
+
 		// Dispose of any current child widgets in the tab holder area
 		Control[] children = getDynamicTabHolder().getChildren();
 		for (int i = 0; i < children.length; i++) {
 			children[i].dispose();
 		}
-		
+
 		if (isUseDynamicJREArea()) {
-			// Retrieve the dynamic UI for the current JRE 
+			// Retrieve the dynamic UI for the current JRE
 			setDynamicTab(getTabForCurrentJRE());
 			if (getDynamicTab() == null) {
 				return;
 			}
-			
+
 			// Ask the dynamic UI to create its Control
 			getDynamicTab().setLaunchConfigurationDialog(getLaunchConfigurationDialog());
 			getDynamicTab().createControl(getDynamicTabHolder());
-			getDynamicTabHolder().layout();	
+			getDynamicTabHolder().layout();
 		}
-			
+
 	}
 
 	protected ILaunchConfigurationWorkingCopy getLaunchConfigurationWorkingCopy() {
 		return fWorkingCopy;
 	}
-	
+
 	/**
 	 * Overridden here so that any error message in the dynamic UI gets returned.
-	 * 
+	 *
 	 * @see ILaunchConfigurationTab#getErrorMessage()
 	 */
 	@Override
@@ -498,18 +498,18 @@
 	protected void setLaunchConfiguration(ILaunchConfiguration launchConfiguration) {
 		fLaunchConfiguration = launchConfiguration;
 	}
-	
+
 	/**
 	 * Sets whether this tab will display the VM specific arguments area
 	 * if a JRE supports VM specific arguments.
-	 * 
+	 *
 	 * @param visible whether this tab will display the VM specific arguments area
 	 * 	if a JRE supports VM specific arguments
 	 */
 	public void setVMSpecificArgumentsVisible(boolean visible) {
 		fUseDynamicArea = visible;
 	}
-	
+
 	protected boolean isUseDynamicJREArea() {
 		return fUseDynamicArea;
 	}
@@ -523,13 +523,13 @@
 			@Override
 			public String getDescription() {
 				IJavaProject project = getJavaProject();
-				String name = LauncherMessages.JavaJRETab_7; 
+				String name = LauncherMessages.JavaJRETab_7;
 				if (project == null) {
 					IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 					if (vm != null) {
 						name = vm.getName();
 					}
-					return NLS.bind(LauncherMessages.JavaJRETab_8, new String[]{name}); 
+					return NLS.bind(LauncherMessages.JavaJRETab_8, new String[]{name});
 				}
 				try {
 					String eeName = null;
@@ -558,19 +558,19 @@
 					}
 				} catch (CoreException e) {
 				}
-				return NLS.bind(LauncherMessages.JavaJRETab_9, new String[]{name}); 
+				return NLS.bind(LauncherMessages.JavaJRETab_9, new String[]{name});
 			}
 		};
 	}
-	
+
 	protected JREDescriptor getSpecificJREDescriptor() {
 		return null;
 	}
-	
+
 	/**
 	 * Returns the Java project associated with the current config being edited,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @return java project or <code>null</code>
 	 */
 	protected IJavaProject getJavaProject() {
@@ -579,7 +579,7 @@
 				String name = getLaunchConfiguration().getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
 				if (name != null && name.length() > 0) {
 					IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-					if (project.exists()) { 
+					if (project.exists()) {
 						return JavaCore.create(project);
 					}
 				}
@@ -589,7 +589,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
@@ -606,5 +606,5 @@
 	@Override
 	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
 		// do nothing when deactivated
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchShortcut.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchShortcut.java
index d700c1b..61d7bea 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchShortcut.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchShortcut.java
@@ -9,7 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.debug.ui.launchConfigurations;
- 
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -48,25 +48,25 @@
  * @since 3.3
  */
 public abstract class JavaLaunchShortcut implements ILaunchShortcut2 {
-	
+
 	/**
 	 * Returns the type of configuration this shortcut is applicable to.
-	 * 
+	 *
 	 * @return the type of configuration this shortcut is applicable to
 	 */
 	protected abstract ILaunchConfigurationType getConfigurationType();
-	
+
 	/**
 	 * Creates and returns a new configuration based on the specified type.
-	 * 
+	 *
 	 * @param type type to create a launch configuration for
 	 * @return launch configuration configured to launch the specified type
 	 */
 	protected abstract ILaunchConfiguration createConfiguration(IType type);
-	
+
 	/**
 	 * Finds and returns the types in the given collection of elements that can be launched.
-	 * 
+	 *
 	 * @param elements scope to search for types that can be launched
 	 * @param context progress reporting context
 	 * @return collection of types that can be launched, possibly empty
@@ -74,33 +74,33 @@
 	 * @exception CoreException if the search fails
 	 */
 	protected abstract IType[] findTypes(Object[] elements, IRunnableContext context) throws InterruptedException, CoreException;
-	
+
 	/**
 	 * Returns a title for a type selection dialog used to prompt the user when there is more than
 	 * one type that can be launched.
-	 * 
+	 *
 	 * @return type selection dialog title
 	 */
 	protected abstract String getTypeSelectionTitle();
-	
+
 	/**
 	 * Returns an error message to use when the editor does not contain a type that can be launched.
-	 * 
+	 *
 	 * @return error message when editor cannot be launched
 	 */
-	protected abstract String getEditorEmptyMessage();	
-	
+	protected abstract String getEditorEmptyMessage();
+
 	/**
 	 * Returns an error message to use when the selection does not contain a type that can be launched.
-	 * 
+	 *
 	 * @return error message when selection cannot be launched
 	 */
-	protected abstract String getSelectionEmptyMessage();	
-	
+	protected abstract String getSelectionEmptyMessage();
+
 	/**
 	 * Resolves a type that can be launched from the given scope and launches in the
 	 * specified mode.
-	 * 
+	 *
 	 * @param scope the java elements to consider for a type that can be launched
 	 * @param mode launch mode
 	 * @param selectTitle prompting title for choosing a type to launch
@@ -110,33 +110,33 @@
 		IType[] types = null;
 		try {
 			types = findTypes(scope, PlatformUI.getWorkbench().getProgressService());
-		} 
-		catch (InterruptedException e) {return;} 
+		}
+		catch (InterruptedException e) {return;}
 		catch (CoreException e) {
-			MessageDialog.openError(getShell(), LauncherMessages.JavaLaunchShortcut_0, e.getMessage()); 
+			MessageDialog.openError(getShell(), LauncherMessages.JavaLaunchShortcut_0, e.getMessage());
 			return;
 		}
 		IType type = null;
 		if (types.length == 0) {
-			MessageDialog.openError(getShell(), LauncherMessages.JavaLaunchShortcut_1, emptyMessage); 
-		} 
+			MessageDialog.openError(getShell(), LauncherMessages.JavaLaunchShortcut_1, emptyMessage);
+		}
 		else if (types.length > 1) {
 			type = chooseType(types, selectTitle);
-		} 
+		}
 		else {
 			type = types[0];
 		}
 		if (type != null) {
 			launch(type, mode);
 		}
-	}	
+	}
 
 	/**
 	 * Prompts the user to select a type from the given types.
-	 * 
+	 *
 	 * @param types the types to choose from
 	 * @param title the selection dialog title
-	 * 
+	 *
 	 * @return the selected type or <code>null</code> if none.
 	 */
 	protected IType chooseType(IType[] types, String title) {
@@ -146,10 +146,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Launches the given type in the specified mode.
-	 * 
+	 *
 	 * @param type type to launch
 	 * @param mode launch mode
 	 * @since 3.5
@@ -173,13 +173,13 @@
 			}
 			if (config != null) {
 				DebugUITools.launch(config, mode);
-			}	
+			}
 		}
 	}
-	
+
 	/**
 	 * Collect the listing of {@link ILaunchConfiguration}s that apply to the given {@link IType} and {@link ILaunchConfigurationType}
-	 * 
+	 *
 	 * @param type the type
 	 * @param ctype the {@link ILaunchConfigurationType}
 	 * @return the list of {@link ILaunchConfiguration}s or an empty list, never <code>null</code>
@@ -189,7 +189,7 @@
 		List<ILaunchConfiguration> candidateConfigs = Collections.EMPTY_LIST;
 		try {
 			ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(ctype);
-			candidateConfigs = new ArrayList<ILaunchConfiguration>(configs.length);
+			candidateConfigs = new ArrayList<>(configs.length);
 			for (int i = 0; i < configs.length; i++) {
 				ILaunchConfiguration config = configs[i];
 				if (config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "").equals(type.getFullyQualifiedName())) { //$NON-NLS-1$
@@ -203,14 +203,14 @@
 		}
 		return candidateConfigs;
 	}
-	
+
 	/**
 	 * Finds and returns an <b>existing</b> configuration to re-launch for the given type,
 	 * or <code>null</code> if there is no existing configuration.
-	 * 
+	 *
 	 * @param type the {@link IType} to try and find the {@link ILaunchConfiguration} for
 	 * @param configType the {@link ILaunchConfigurationType} to try and narrow down the search
-	 * 
+	 *
 	 * @return a configuration to use for launching the given type or <code>null</code> if none
 	 */
 	protected ILaunchConfiguration findLaunchConfiguration(IType type, ILaunchConfigurationType configType) {
@@ -224,13 +224,13 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a configuration from the given collection of configurations that should be launched,
 	 * or <code>null</code> to cancel. Default implementation opens a selection dialog that allows
 	 * the user to choose one of the specified launch configurations.  Returns the chosen configuration,
 	 * or <code>null</code> if the user cancels.
-	 * 
+	 *
 	 * @param configList list of configurations to choose from
 	 * @return configuration to launch or <code>null</code> to cancel
 	 */
@@ -238,7 +238,7 @@
 		IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
 		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider);
 		dialog.setElements(configList.toArray());
-		dialog.setTitle(getTypeSelectionTitle());  
+		dialog.setTitle(getTypeSelectionTitle());
 		dialog.setMessage(LauncherMessages.JavaLaunchShortcut_2);
 		dialog.setMultipleSelection(false);
 		int result = dialog.open();
@@ -246,18 +246,18 @@
 		if (result == Window.OK) {
 			return (ILaunchConfiguration) dialog.getFirstResult();
 		}
-		return null;		
+		return null;
 	}
-	
+
 	/**
 	 * Convenience method to return the active workbench window shell.
-	 * 
+	 *
 	 * @return active workbench window shell
 	 */
 	protected Shell getShell() {
 		return JDIDebugUIPlugin.getActiveWorkbenchShell();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.ui.IEditorPart, java.lang.String)
 	 */
@@ -304,11 +304,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the resource containing the Java element associated with the
 	 * given adaptable, or <code>null</code>.
-	 * 
+	 *
 	 * @param adaptable adaptable object
 	 * @return containing resource or <code>null</code>
 	 */
@@ -336,7 +336,7 @@
 	public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
 		// let the framework resolve configurations based on resource mapping
 		return null;
-	}	
-	
-	
+	}
+
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchTab.java
index e99cb9c..7376eaa 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaLaunchTab.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.debug.ui.launchConfigurations;
 
- 
+
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.debug.core.ILaunchConfiguration;
@@ -35,16 +35,16 @@
  * @since 3.2
  */
 public abstract class JavaLaunchTab extends AbstractLaunchConfigurationTab {
-		
+
 	/**
 	 * Config being modified
 	 */
 	private ILaunchConfiguration fLaunchConfig;
-	
+
 	/**
 	 * Returns the current Java element context in the active workbench page
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @return current Java element in the active page or <code>null</code>
 	 */
 	protected IJavaElement getContext() {
@@ -78,29 +78,29 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the launch configuration this tab was initialized from.
-	 * 
+	 *
 	 * @return launch configuration this tab was initialized from
 	 */
 	protected ILaunchConfiguration getCurrentLaunchConfiguration() {
 		return fLaunchConfig;
 	}
-	
+
 	/**
 	 * Sets the launch configuration this tab was initialized from
-	 * 
+	 *
 	 * @param config launch configuration this tab was initialized from
 	 */
 	private void setCurrentLaunchConfiguration(ILaunchConfiguration config) {
 		fLaunchConfig = config;
 	}
-	
+
 	/**
 	 * Sets the Java project attribute on the given working copy to the Java project
 	 * associated with the given Java element.
-	 * 
+	 *
 	 * @param javaElement Java model element this tab is associated with
 	 * @param config configuration on which to set the Java project attribute
 	 */
@@ -111,17 +111,17 @@
 			name = javaProject.getElementName();
 		}
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, name);
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 * 
+	 *
 	 * Subclasses may override this method and should call super.initializeFrom(...).
 	 */
 	@Override
 	public void initializeFrom(ILaunchConfiguration config) {
 		setCurrentLaunchConfiguration(config);
-	}	
-	
+	}
+
 }
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaMainTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaMainTab.java
index e414a09..505b6d4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaMainTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaMainTab.java
@@ -64,7 +64,7 @@
 	 * Boolean launch configuration attribute indicating that external jars (on
 	 * the runtime classpath) should be searched when looking for a main type.
 	 * Default value is <code>false</code>.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_INCLUDE_EXTERNAL_JARS = IJavaDebugUIConstants.PLUGIN_ID + ".INCLUDE_EXTERNAL_JARS"; //$NON-NLS-1$
@@ -72,11 +72,11 @@
 	 * Boolean launch configuration attribute indicating whether types inheriting
 	 * a main method should be considered when searching for a main type.
 	 * Default value is <code>false</code>.
-	 * 
+	 *
 	 * @since 3.0
 	 */
-	public static final String ATTR_CONSIDER_INHERITED_MAIN = IJavaDebugUIConstants.PLUGIN_ID + ".CONSIDER_INHERITED_MAIN"; //$NON-NLS-1$	
-	
+	public static final String ATTR_CONSIDER_INHERITED_MAIN = IJavaDebugUIConstants.PLUGIN_ID + ".CONSIDER_INHERITED_MAIN"; //$NON-NLS-1$
+
 	// UI widgets
 	private Button fSearchExternalJarsCheckButton;
 	private Button fConsiderInheritedMainButton;
@@ -103,10 +103,10 @@
 	protected void createMainTypeExtensions(Composite parent) {
 		fSearchExternalJarsCheckButton = SWTFactory.createCheckButton(parent, LauncherMessages.JavaMainTab_E_xt__jars_6, null, false, 2);
 		fSearchExternalJarsCheckButton.addSelectionListener(getDefaultListener());
-		
+
 		fConsiderInheritedMainButton = SWTFactory.createCheckButton(parent, LauncherMessages.JavaMainTab_22, null, false, 2);
 		fConsiderInheritedMainButton.addSelectionListener(getDefaultListener());
-		
+
 		fStopInMainCheckButton = SWTFactory.createCheckButton(parent, LauncherMessages.JavaMainTab_St_op_in_main_1, null, false, 1);
 		fStopInMainCheckButton.addSelectionListener(getDefaultListener());
 	}
@@ -118,7 +118,7 @@
 	public Image getImage() {
 		return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
 	 */
@@ -126,17 +126,17 @@
 	public String getName() {
 		return LauncherMessages.JavaMainTab__Main_19;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.javaMainTab"; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Show a dialog that lists all main types
 	 */
@@ -178,18 +178,18 @@
 			setErrorMessage(e.getMessage());
 			return;
 		}
-		DebugTypeSelectionDialog mmsd = new DebugTypeSelectionDialog(getShell(), types, LauncherMessages.JavaMainTab_Choose_Main_Type_11); 
+		DebugTypeSelectionDialog mmsd = new DebugTypeSelectionDialog(getShell(), types, LauncherMessages.JavaMainTab_Choose_Main_Type_11);
 		if (mmsd.open() == Window.CANCEL) {
 			return;
 		}
-		Object[] results = mmsd.getResult();	
+		Object[] results = mmsd.getResult();
 		IType type = (IType)results[0];
 		if (type != null) {
 			fMainText.setText(type.getFullyQualifiedName());
 			fProjText.setText(type.getJavaProject().getElementName());
 		}
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.AbstractJavaMainTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -200,7 +200,7 @@
 		updateStopInMainFromConfig(config);
 		updateInheritedMainsFromConfig(config);
 		updateExternalJars(config);
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
@@ -216,27 +216,27 @@
 			if (status.isOK()) {
 				IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(name);
 				if (!project.exists()) {
-					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_20, new String[] {name})); 
+					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_20, new String[] {name}));
 					return false;
 				}
 				if (!project.isOpen()) {
-					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_21, new String[] {name})); 
+					setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_21, new String[] {name}));
 					return false;
 				}
 			}
 			else {
-				setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_19, new String[]{status.getMessage()})); 
+				setErrorMessage(NLS.bind(LauncherMessages.JavaMainTab_19, new String[]{status.getMessage()}));
 				return false;
 			}
 		}
 		name = fMainText.getText().trim();
 		if (name.length() == 0) {
-			setErrorMessage(LauncherMessages.JavaMainTab_Main_type_not_specified_16); 
+			setErrorMessage(LauncherMessages.JavaMainTab_Main_type_not_specified_16);
 			return false;
 		}
 		return true;
 	}
-			
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
@@ -245,7 +245,7 @@
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText().trim());
 		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fMainText.getText().trim());
 		mapResources(config);
-		
+
 		// attribute added in 2.1, so null must be used instead of false for backwards compatibility
 		if (fStopInMainCheckButton.getSelection()) {
 			config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_STOP_IN_MAIN, true);
@@ -253,7 +253,7 @@
 		else {
 			config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_STOP_IN_MAIN, (String)null);
 		}
-		
+
 		// attribute added in 2.1, so null must be used instead of false for backwards compatibility
 		if (fSearchExternalJarsCheckButton.getSelection()) {
 			config.setAttribute(ATTR_INCLUDE_EXTERNAL_JARS, true);
@@ -261,7 +261,7 @@
 		else {
 			config.setAttribute(ATTR_INCLUDE_EXTERNAL_JARS, (String)null);
 		}
-		
+
 		// attribute added in 3.0, so null must be used instead of false for backwards compatibility
 		if (fConsiderInheritedMainButton.getSelection()) {
 			config.setAttribute(ATTR_CONSIDER_INHERITED_MAIN, true);
@@ -270,7 +270,7 @@
 			config.setAttribute(ATTR_CONSIDER_INHERITED_MAIN, (String)null);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
@@ -285,7 +285,7 @@
 		}
 		initializeMainTypeAndName(javaElement, config);
 	}
-	
+
 	/**
 	 * updates the external jars attribute from the specified launch config
 	 * @param config the config to load from
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaSourceLookupTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaSourceLookupTab.java
index c6934a4..7e7c242 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaSourceLookupTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaSourceLookupTab.java
@@ -41,7 +41,7 @@
  *  lookup among a set of participants, searching a set of source containers.
  *  See the following packages: <code>org.eclipse.debug.core.sourcelookup</code>
  *  and <code>org.eclipse.debug.core.sourcelookup.containers</code>. This class
- *  has been replaced by a source lookup tab in the debug platform - 
+ *  has been replaced by a source lookup tab in the debug platform -
  *  <code>org.eclipse.debug.ui.sourcelookup.SourceLookupTab</code>.
  * @noextend This class is not intended to be sub-classed by clients.
  */
@@ -50,7 +50,7 @@
 public class JavaSourceLookupTab extends JavaLaunchTab {
 
 	protected SourceLookupBlock fSourceLookupBlock;
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
 	 */
@@ -64,16 +64,16 @@
 		topLayout.marginHeight= 0;
 		topLayout.marginWidth= 0;
 		comp.setLayout(topLayout);
-		comp.setFont(parent.getFont());	
-		
+		comp.setFont(parent.getFont());
+
 		createVerticalSpacer(comp, 1);
-		
+
 		fSourceLookupBlock = new SourceLookupBlock();
 		fSourceLookupBlock.setLaunchConfigurationDialog(getLaunchConfigurationDialog());
 		fSourceLookupBlock.createControl(comp);
 		GridData gd = (GridData)fSourceLookupBlock.getControl().getLayoutData();
 		gd.heightHint = 200;
-		gd.widthHint = 250;				
+		gd.widthHint = 250;
 	}
 
 	/**
@@ -94,7 +94,7 @@
 	public void initializeFrom(ILaunchConfiguration configuration) {
 		fSourceLookupBlock.initializeFrom(configuration);
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
 	 */
@@ -106,28 +106,28 @@
 
 	/**
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.javaSourceLookupTab"; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.JavaSourceLookupTab_Source_1; 
+		return LauncherMessages.JavaSourceLookupTab_Source_1;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
-	}	
-		
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointChange.java
index b6df423..896126f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointChange.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -42,14 +42,14 @@
  *
  */
 public abstract class BreakpointChange extends Change {
-	
+
 	/**
 	 * constant for no line number
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	protected static final int NO_LINE_NUMBER = -1;
-	
+
 	private IJavaBreakpoint fBreakpoint;
 	private String fTypeName;
 	private int fHitCount;
@@ -74,10 +74,10 @@
 		fEnabled = breakpoint.isEnabled();
 		fWorkingSetNames = (String) breakpoint.getMarker().getAttribute(IInternalDebugUIConstants.WORKING_SET_NAME);
 	}
-	
+
 	/**
 	 * Applies the original attributes to the new breakpoint
-	 * 
+	 *
 	 * @param breakpoint the new breakpoint
 	 * @throws CoreException
 	 */
@@ -92,7 +92,7 @@
 		}
 		breakpoint.setEnabled(fEnabled);
 	}
-	
+
 	/**
 	 * Returns the original breakpoints prior to the change
 	 * @return the original breakpoint prior to the change
@@ -100,32 +100,32 @@
 	protected IJavaBreakpoint getOriginalBreakpoint() {
 		return fBreakpoint;
 	}
-	
+
 	/**
 	 * Returns the original name of the type the associated breakpoint was set on.
 	 * This can be different than the type being changed.
-	 * 
+	 *
 	 * @return
 	 */
 	protected String getOriginalBreakpointTypeName() {
 		return fTypeName;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#initializeValidationData(org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	@Override
 	public void initializeValidationData(IProgressMonitor pm) {
 		// do nothing
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#isValid(org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	@Override
 	public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, OperationCanceledException {
 		return new RefactoringStatus();
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#getModifiedElement()
@@ -133,12 +133,12 @@
 	@Override
 	public Object getModifiedElement() {
 		return fBreakpoint;
-	}	
-	
+	}
+
 	/**
 	 * Returns an array of ints representing the new line number, char start and char end
 	 * of the member.
-	 * 
+	 *
 	 * @param member
 	 * @return array of 3 ints or <code>null</code>
 	 */
@@ -148,7 +148,7 @@
 		int lineNumber = getNewLineNumber(member, offset);
 		return new int[]{lineNumber, offset, offset + nameRange.getLength()};
 	}
-	
+
 	/**
 	 * Returns the new line number of the from the source of the specified member's compilation unit
 	 * @param member the member to query
@@ -165,7 +165,7 @@
 		}
 		return lineNumber;
 	}
-	
+
 	/**
 	 * Return the line number for the breakpoint
 	 * @return the line number for the breakpoint
@@ -173,7 +173,7 @@
 	protected int getLineNumber() {
 		return -1;
 	}
-	
+
 	/**
 	 * Returns the hit count for the breakpoint
 	 * @return the hit count for the breakpoint
@@ -181,7 +181,7 @@
 	protected int getHitCount() {
 		return fHitCount;
 	}
-	
+
 	/**
 	 * Returns the <code>IType</code> within the specified parent type given by simpleName
 	 * @param parent
@@ -201,7 +201,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the <code>IJavaElement</code> contained within the specified parent one, or the parent one
 	 * by default
@@ -254,37 +254,37 @@
 					currentElement = ((IType)currentElement).getMethod(child.getElementName(), ((IMethod)child).getParameterTypes());
 					break;
 			}
-			
+
 		}
 		return currentElement;
-	}	
-	
+	}
+
 	/**
 	 * Returns the path of the given element up to but not including its compilation unit,
 	 * in bottom up order.
-	 * 
+	 *
 	 * @param element
 	 * @return element's path
 	 */
 	private static List<IJavaElement> getPath(IJavaElement element) {
-		ArrayList<IJavaElement> children = new ArrayList<IJavaElement>();
+		ArrayList<IJavaElement> children = new ArrayList<>();
 		while (element != null && element.getElementType() != IJavaElement.COMPILATION_UNIT) {
 			children.add(element);
 			element = element.getParent();
 		}
 		return children;
 	}
-	
+
 	/**
 	 * Returns a label for the given breakpoint generated from the JDI model presentation.
-	 * 
+	 *
 	 * @param breakpoint a breakpoint
 	 * @return standard label for the breakpoint
 	 */
 	protected String getBreakpointLabel(IBreakpoint breakpoint) {
 		return JDIDebugUIPlugin.getDefault().getModelPresentation().getText(breakpoint);
 	}
-	
+
 	/**
 	 * Returns the original breakpoint working set names
 	 * @return the original breakpoint working set names
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMovePackageParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMovePackageParticipant.java
index bff5e3b..9075cfd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMovePackageParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMovePackageParticipant.java
@@ -27,7 +27,7 @@
 
 /**
  * Breakpoint participant for package move.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointMovePackageParticipant extends BreakpointMoveParticipant {
@@ -39,7 +39,7 @@
 	protected boolean accepts(IJavaElement element) {
 		return element instanceof IPackageFragment && getArguments().getDestination() instanceof IPackageFragmentRoot;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointMoveParticipant#gatherChanges(org.eclipse.core.resources.IMarker[], java.util.List)
 	 */
@@ -67,5 +67,5 @@
 			}
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveParticipant.java
index 046e276..6c2cfbc 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveParticipant.java
@@ -36,21 +36,21 @@
 
 /**
  * Breakpoint participant for a move refactoring.
- * 
+ *
  * @since 3.2
  */
 public abstract class BreakpointMoveParticipant extends MoveParticipant {
-	
+
 	/**
 	 * Element being moved
 	 */
 	private IJavaElement fElement;
-	
+
 	/**
 	 * Destination container
 	 */
 	private IJavaElement fDestination;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
 	 */
@@ -63,29 +63,29 @@
 			return false;
 		}
 		return true;
-	}	
-	
+	}
+
 	/**
 	 * Returns the element this refactoring is operating on.
-	 * 
+	 *
 	 * @return the original element
 	 */
 	protected IJavaElement getOriginalElement() {
 		return fElement;
 	}
-	
+
 	/**
 	 * Returns the destination of the move operation.
-	 * 
+	 *
 	 * @return the destination {@link IJavaElement}
 	 */
 	protected IJavaElement getDestination() {
 		return fDestination;
 	}
-	
+
 	/**
 	 * Returns whether this given element is a valid target for this operation.
-	 * 
+	 *
 	 * @param element the Java model element
 	 * @return whether this given element is a valid target for this operation
 	 */
@@ -112,7 +112,7 @@
 	 */
 	@Override
 	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		IResource resource = getBreakpointContainer();
 		IMarker[] markers= resource.findMarkers(IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE);
 		gatherChanges(markers, changes);
@@ -123,42 +123,42 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Gathers refactoring specific changes. Subclasses must override.
-	 * 
+	 *
 	 * @param markers markers to consider during the change
 	 * @param changes the list of changes
 	 * @throws CoreException if a problem occurs
 	 * @throws OperationCanceledException if the operation was cancelled
 	 */
 	protected abstract void gatherChanges(IMarker[] markers, List<Change> changes) throws CoreException, OperationCanceledException;
-	
+
 	/**
 	 * Returns the resource that should be considered when searching for affected breakpoints.
-	 * 
+	 *
 	 * @return resource to search for breakpoint markers.
 	 */
 	protected IResource getBreakpointContainer() {
 		return fElement.getResource();
 	}
-	
+
 	/**
 	 * Returns the breakpoint associated with the given marker.
-	 * 
+	 *
 	 * @param marker breakpoint marker
 	 * @return breakpoint or <code>null</code>
 	 */
 	protected IBreakpoint getBreakpoint(IMarker marker) {
 		return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
 	}
-	
+
 	/**
 	 * Creates a specific type of change for a breakpoint that is changing types.
 	 * @param breakpoint the breakpoint to create a change for
 	 * @param destType the new type
 	 * @param originalType the original type
-	 * 
+	 *
 	 * @return type change or <code>null</code>
 	 * @throws CoreException if creating the change fails
 	 */
@@ -175,11 +175,11 @@
 			return new LineBreakpointTypeChange((IJavaLineBreakpoint) breakpoint, destType);
 		}
 		return null;
-	}		
-	
+	}
+
 	/**
 	 * Returns whether the given target type is contained in the specified container type.
-	 * 
+	 *
 	 * @param container the containing element
 	 * @param type the target element
 	 * @return if the given type is contained in the given container
@@ -193,5 +193,5 @@
 			parent = parent.getParent();
 		}
 		return false;
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveTypeParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveTypeParticipant.java
index fe1652c..3eb97d4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveTypeParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointMoveTypeParticipant.java
@@ -26,7 +26,7 @@
 
 /**
  * Breakpoint participant for type move.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointMoveTypeParticipant extends BreakpointMoveParticipant {
@@ -38,7 +38,7 @@
 	protected boolean accepts(IJavaElement element) {
 		return element instanceof IType && getArguments().getDestination() instanceof IPackageFragment;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointMoveParticipant#gatherChanges(org.eclipse.core.resources.IMarker[], java.util.List)
 	 */
@@ -65,5 +65,5 @@
 			}
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameFieldParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameFieldParticipant.java
index ed7ade2..8d08fb8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameFieldParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameFieldParticipant.java
@@ -30,11 +30,11 @@
 
 /**
  * Breakpoint participant for field rename.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointRenameFieldParticipant extends BreakpointRenameParticipant {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#accepts(org.eclipse.jdt.core.IJavaElement)
 	 */
@@ -42,13 +42,13 @@
 	protected boolean accepts(IJavaElement element) {
 		return element instanceof IField;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	@Override
 	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		IResource resource = getBreakpointContainer();
 		IMarker[] markers = resource.findMarkers(JavaWatchpoint.JAVA_WATCHPOINT, true, IResource.DEPTH_INFINITE);
 		gatherChanges(markers, changes, getArguments().getNewName());
@@ -59,7 +59,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#gatherChanges(org.eclipse.core.resources.IMarker[], java.util.List, java.lang.String)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameMethodParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameMethodParticipant.java
index 967b60b..bdcaa50 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameMethodParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameMethodParticipant.java
@@ -25,12 +25,12 @@
 
 /**
  * Breakpoint participant for method rename.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointRenameMethodParticipant extends BreakpointRenameParticipant {
 
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#accepts(org.eclipse.jdt.core.IJavaElement)
 	 */
@@ -63,5 +63,5 @@
 			}
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenamePackageParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenamePackageParticipant.java
index c5cc08b..48f6e1b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenamePackageParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenamePackageParticipant.java
@@ -27,7 +27,7 @@
 
 /**
  * Breakpoint participant for package rename.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointRenamePackageParticipant extends BreakpointRenameParticipant {
@@ -39,7 +39,7 @@
 	protected boolean accepts(IJavaElement element) {
 		return element instanceof IPackageFragment;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#gatherChanges(org.eclipse.core.resources.IMarker[], java.util.List, java.lang.String)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameParticipant.java
index 2b78de3..c44a7d7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameParticipant.java
@@ -36,16 +36,16 @@
 
 /**
  * Breakpoint participant for a rename refactoring.
- * 
+ *
  * @since 3.2
  */
 public abstract class BreakpointRenameParticipant extends RenameParticipant {
-	
+
 	/**
 	 * Element being renamed
 	 */
 	private IJavaElement fElement;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
 	 */
@@ -57,20 +57,20 @@
 			return false;
 		}
 		return true;
-	}	
-	
+	}
+
 	/**
 	 * Returns the element this refactoring is operating on.
-	 * 
+	 *
 	 * @return to original {@link IJavaElement}
 	 */
 	protected IJavaElement getOriginalElement() {
 		return fElement;
 	}
-	
+
 	/**
 	 * Returns whether this given element is a valid target for this operation.
-	 * 
+	 *
 	 * @param element the Java element context
 	 * @return whether this given element is a valid target for this operation
 	 */
@@ -97,7 +97,7 @@
 	 */
 	@Override
 	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		IResource resource = getBreakpointContainer();
 		IMarker[] markers= resource.findMarkers(IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE);
 		gatherChanges(markers, changes, getArguments().getNewName());
@@ -108,10 +108,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Gathers refactoring specific changes. Subclasses must override.
-	 * 
+	 *
 	 * @param markers the markers
 	 * @param changes the list of changes
 	 * @param destName the destination name
@@ -119,32 +119,32 @@
 	 * @throws OperationCanceledException if the operation was cancelled
 	 */
 	protected abstract void gatherChanges(IMarker[] markers, List<Change> changes, String destName) throws CoreException, OperationCanceledException;
-	
+
 	/**
 	 * Returns the resource that should be considered when searching for affected breakpoints.
-	 * 
+	 *
 	 * @return resource to search for breakpoint markers.
 	 */
 	protected IResource getBreakpointContainer() {
 		return fElement.getResource();
 	}
-	
+
 	/**
 	 * Returns the breakpoint associated with the given marker.
-	 * 
+	 *
 	 * @param marker breakpoint marker
 	 * @return breakpoint or <code>null</code>
 	 */
 	protected IBreakpoint getBreakpoint(IMarker marker) {
 		return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
 	}
-	
+
 	/**
 	 * Creates a specific type of change for a breakpoint that is changing types.
 	 * @param breakpoint the breakpoint to create the change for
 	 * @param destType the destination type name
 	 * @param originalType the original type name
-	 * 
+	 *
 	 * @return type change or <code>null</code>
 	 * @throws CoreException if creating the change fails
 	 */
@@ -161,11 +161,11 @@
 			return new LineBreakpointTypeChange((IJavaLineBreakpoint) breakpoint, destType);
 		}
 		return null;
-	}		
-	
+	}
+
 	/**
 	 * Returns whether the given target type is contained in the specified container type.
-	 * 
+	 *
 	 * @param container the container
 	 * @param type the type
 	 * @return if the type is contained in the given container
@@ -179,5 +179,5 @@
 			parent = parent.getParent();
 		}
 		return false;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameProjectParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameProjectParticipant.java
index 8825e1a..62f9599 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameProjectParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameProjectParticipant.java
@@ -33,7 +33,7 @@
 
 /**
  * Breakpoint participant for project rename.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointRenameProjectParticipant extends BreakpointRenameParticipant {
@@ -90,7 +90,7 @@
 			}
 		}
 	}
-	
+
 	/*
 	 * (non-Javadoc) returns the root folder path. root.getElementName() does not work if src folder has layers of folders
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameTypeParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameTypeParticipant.java
index 3557b0d..5414a8d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameTypeParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/BreakpointRenameTypeParticipant.java
@@ -28,21 +28,21 @@
 
 /**
  * Breakpoint participant for type rename.
- * 
+ *
  * @since 3.2
  */
 public class BreakpointRenameTypeParticipant extends BreakpointRenameParticipant {
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#accepts(org.eclipse.jdt.core.IJavaElement)
      */
     @Override
 	protected boolean accepts(IJavaElement element) {
         return element instanceof IType;
     }
-    
+
 	@Override
 	protected Change createTypeChange(IJavaBreakpoint breakpoint, IType destType, IType originalType) throws CoreException {
 		if (breakpoint instanceof IJavaWatchpoint) {
@@ -50,10 +50,10 @@
 		}
 		return super.createTypeChange(breakpoint, destType, originalType);
 	}
-	
+
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.jdt.internal.debug.core.refactoring.BreakpointRenameParticipant#gatherChanges(org.eclipse.core.resources.IMarker[],
      *      java.util.List, java.lang.String)
      */
@@ -75,11 +75,11 @@
             }
             destCU = originalType.getPackageFragment().getCompilationUnit(simpleDestName + ext);
         }
-        
+
         // newType is the type that is changing - it may contain nested members with breakpoints
         IType newType = BreakpointChange.getType(originalType.getParent(), simpleDestName);
         newType = (IType) BreakpointChange.findElement(destCU, newType);
-        
+
 
         for (int i = 0; i < markers.length; i++) {
             IMarker marker = markers[i];
@@ -101,7 +101,7 @@
                 		changes.add(createTypeChange(javaBreakpoint, destType, breakpointType));
                 	}
                 }
-                	
+
             }
         }
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointChange.java
index 153ca8d..4ce1a8a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointChange.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,14 +18,14 @@
  *
  */
 public abstract class ClassPrepareBreakpointChange extends BreakpointChange {
-	
+
 	private int fMemberType;
-	
+
 	public ClassPrepareBreakpointChange(IJavaClassPrepareBreakpoint breakpoint) throws CoreException {
 		super(breakpoint);
 		fMemberType = breakpoint.getMemberType();
 	}
-	
+
 	protected int getMemberType() {
 		return fMemberType;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointTypeChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointTypeChange.java
index 429597f..bf0d895 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointTypeChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ClassPrepareBreakpointTypeChange.java
@@ -30,7 +30,7 @@
  *
  */
 public class ClassPrepareBreakpointTypeChange extends ClassPrepareBreakpointChange {
-	
+
 	private IType fDestType;
 
 	public ClassPrepareBreakpointTypeChange(IJavaClassPrepareBreakpoint breakpoint, IType destType) throws CoreException {
@@ -53,7 +53,7 @@
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
 		IResource resource = BreakpointUtils.getBreakpointResource(fDestType);
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, fDestType);
 		map.put(IInternalDebugUIConstants.WORKING_SET_NAME, getOriginalWorkingSets());// creating breakpoint in the original working set
 		// TODO - start/end should be adjusted, but can access new CU from model yet
@@ -62,7 +62,7 @@
 				resource,
 				fDestType.getFullyQualifiedName(),
 				getMemberType(),
-				range.getOffset(), 
+				range.getOffset(),
 				range.getOffset() + range.getLength(),
 				true,
 				map);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/DeleteBreakpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/DeleteBreakpointChange.java
index c27e806..8d4d8da 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/DeleteBreakpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/DeleteBreakpointChange.java
@@ -22,12 +22,12 @@
  * When undoing a refactoring, the "target/original" resource does
  * not exist in time to create a marker on it, and thus the operation
  * cannot be undone. Instead, we delete breakpoints on undo.
- * 
+ *
  * @since 3.2
  *
  */
 public class DeleteBreakpointChange extends BreakpointChange {
-	
+
 	public DeleteBreakpointChange(IJavaBreakpoint breakpoint) throws CoreException {
 		super(breakpoint);
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointChange.java
index 4fea873..5efe75c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointChange.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,10 +18,10 @@
  *
  */
 public abstract class ExceptionBreakpointChange extends BreakpointChange {
-	
+
 	private String[] fExclusionFilters, fInclusionFilters;
 	boolean fCaught, fUncaught, fChecked;
-	
+
 	public ExceptionBreakpointChange(IJavaExceptionBreakpoint breakpoint) throws CoreException {
 		super(breakpoint);
 		fExclusionFilters = breakpoint.getExclusionFilters();
@@ -30,19 +30,19 @@
 		fUncaught = breakpoint.isUncaught();
 		fChecked  = breakpoint.isChecked();
 	}
-	
+
 	protected boolean isChecked() {
 		return fChecked;
 	}
-	
+
 	protected boolean isCaught() {
 		return fCaught;
 	}
-	
+
 	protected boolean isUncaught() {
 		return fUncaught;
 	}
-	
+
 	protected void apply(IJavaExceptionBreakpoint breakpoint) throws CoreException {
 		super.apply(breakpoint);
 		breakpoint.setExclusionFilters(fExclusionFilters);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointTypeChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointTypeChange.java
index b9a5774..f1e77f3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointTypeChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/ExceptionBreakpointTypeChange.java
@@ -28,9 +28,9 @@
  *
  */
 public class ExceptionBreakpointTypeChange extends ExceptionBreakpointChange {
-	
+
 	private IType fDestType;
-	
+
 	public ExceptionBreakpointTypeChange(IJavaExceptionBreakpoint breakpoint, IType destType) throws CoreException {
 		super(breakpoint);
 		fDestType = destType;
@@ -50,7 +50,7 @@
 	 */
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, fDestType);
 		IResource resource = BreakpointUtils.getBreakpointResource(fDestType);
 		IJavaExceptionBreakpoint breakpoint = JDIDebugModel.createExceptionBreakpoint(
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/JDTDebugRefactoringUtil.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/JDTDebugRefactoringUtil.java
index 0bef93f..427a510 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/JDTDebugRefactoringUtil.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/JDTDebugRefactoringUtil.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,11 +28,11 @@
 import org.eclipse.ltk.core.refactoring.CompositeChange;
 
 /**
- * 
+ *
  * provides methods to create refactoring changes
  */
 public class JDTDebugRefactoringUtil {
-	
+
 	/**
 	 * Take a list of Changes, and return a unique Change, a CompositeChange, or null.
 	 */
@@ -40,15 +40,15 @@
 		int nbChanges= changes.size();
 		if (nbChanges == 0) {
 			return null;
-		} 
+		}
 		else if (nbChanges == 1) {
 			return changes.get(0);
-		} 
+		}
 		else {
 			return new CompositeChange(changeLabel, changes.toArray(new Change[changes.size()]));
 		}
 	}
-	
+
 	/**
 	 * Returns the new container name for the given project and launch configuration
 	 * @param javaProject the java to get the new container name for
@@ -63,7 +63,7 @@
         }
         return null;
     }
-	
+
 	/**
 	 * Returns a change for the given launch configuration if the launch configuration needs to
 	 * be updated for this IType change. It specifically looks to see if the main type of the launch configuration
@@ -94,7 +94,7 @@
 		}
 		return change;
 	}
-	
+
 	/**
 	 * Provides a public mechanism for creating the <code>Change</code> for moving a package
 	 * @param packageFragment the fragment to move
@@ -104,7 +104,7 @@
 	 * @since 3.2
 	 */
 	public static Change createChangesForPackageMove(IPackageFragment pfragment, IPackageFragmentRoot destination) throws CoreException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		ILaunchConfiguration[] configs = getJavaTypeLaunchConfigurations(pfragment.getJavaProject().getElementName());
 		String mtname = null;
 		for (int i= 0; i < configs.length; i++) {
@@ -115,9 +115,9 @@
 				}
 			}
 		}
-		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7); 
+		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7);
 	}
-	
+
 	/**
 	 * Provides a public mechanism for creating the <code>Change</code> for renaming a package
 	 * @param packageFragment the fragment to rename
@@ -127,7 +127,7 @@
 	 * @since 3.2
 	 */
 	public static Change createChangesForPackageRename(IPackageFragment pfragment, String newname) throws CoreException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		ILaunchConfiguration[] configs = getJavaTypeLaunchConfigurations(pfragment.getJavaProject().getElementName());
 		String mtname;
 		for (int i= 0; i < configs.length; i++) {
@@ -147,9 +147,9 @@
 				changes.add(new LaunchConfigurationProjectMainTypeChange(configs[i], null, null));
 			}
 		}
-		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7); 
+		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7);
 	}
-	
+
 	/**
 	 * Provides a public mechanism for creating the <code>Change</code> for renaming a project
 	 * @param javaProject the project to rename
@@ -159,7 +159,7 @@
 	 * @since 3.2
 	 */
 	public static Change createChangesForProjectRename(IJavaProject project, String newname) throws CoreException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		ILaunchConfiguration[] configs = getJavaTypeLaunchConfigurations(project.getElementName());
 		LaunchConfigurationProjectMainTypeChange change = null;
 		for (int i= 0; i < configs.length; i++) {
@@ -170,9 +170,9 @@
             }
 			changes.add(change);
 		}
-		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7); 
+		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7);
 	}
-	
+
 	/**
 	 * Creates a <code>Change</code> for a type change
 	 * @param type the type that is changing
@@ -183,7 +183,7 @@
 	 * @since 3.2
 	 */
 	protected static Change createChangesForTypeChange(IType type, String newfqname, String pname) throws CoreException {
-		List<Change> changes = new ArrayList<Change>();
+		List<Change> changes = new ArrayList<>();
 		String typename = type.getFullyQualifiedName();
 		ILaunchConfiguration[] configs = getJavaTypeLaunchConfigurations(type.getJavaProject().getElementName());
 		String mtname;
@@ -191,7 +191,7 @@
 			mtname = configs[i].getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, (String)null);
 			if (typename.equals(mtname)) {
 				changes.add(new LaunchConfigurationProjectMainTypeChange(configs[i], newfqname, pname));
-			} 
+			}
 			else {
 				Change change = createChangesForOuterTypeChange(configs[i], type, newfqname, pname);
 				if (change != null) {
@@ -199,9 +199,9 @@
 				}
 			}
 		}
-		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7); 
+		return JDTDebugRefactoringUtil.createChangeFromList(changes, RefactoringMessages.LaunchConfigurationProjectMainTypeChange_7);
 	}
-	
+
 	/**
 	 * Provides a public mechanism for creating the <code>Change</code> for moving a type
 	 * @param type the type being moved
@@ -219,15 +219,15 @@
 		String newfqname = type.getElementName();
 		if (destination instanceof IType) {
 			newfqname = ((IType)destination).getFullyQualifiedName() + '$' + type.getElementName();
-		} 
+		}
 		else if (destination instanceof IPackageFragment) {
 			if (!((IPackageFragment) destination).isDefaultPackage()) {
 				newfqname = destination.getElementName() + '.' + type.getElementName();
 			}
-		} 
+		}
 		return createChangesForTypeChange(type, newfqname, newpname);
 	}
-	
+
 	/**
 	 * Provides a public mechanism for creating the <code>Change</code> for renaming a type
 	 * @param type the type to rename
@@ -244,13 +244,13 @@
 			if (!packageFragment.isDefaultPackage()) {
 				newfqname = packageFragment.getElementName() + '.' + newname;
 			}
-		} 
+		}
 		else {
 			newfqname = dtype.getFullyQualifiedName() + '$' + newname;
 		}
 		return createChangesForTypeChange(type, newfqname, null);
 	}
-	
+
 	/**
 	 * Returns a listing of configurations that have a specific project name attribute in them
 	 * @param pname the project attribute to compare against
@@ -260,7 +260,7 @@
 	protected static ILaunchConfiguration[] getJavaTypeLaunchConfigurations(String pname) {
 		try {
 			ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
-			ArrayList<ILaunchConfiguration> list = new ArrayList<ILaunchConfiguration>();
+			ArrayList<ILaunchConfiguration> list = new ArrayList<>();
 			String attrib;
 			for(int i = 0; i < configs.length; i++) {
 				attrib = configs[i].getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIJavaProjectRenameParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIJavaProjectRenameParticipant.java
index c25c13a..68c8873 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIJavaProjectRenameParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIJavaProjectRenameParticipant.java
@@ -37,13 +37,13 @@
 		fJavaProject = (IJavaProject) element;
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
 	 */
 	@Override
 	public String getName() {
-		return RefactoringMessages.LaunchConfigurationParticipant_0; 
+		return RefactoringMessages.LaunchConfigurationParticipant_0;
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentMoveParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentMoveParticipant.java
index cb2e4ae..e2dc7e4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentMoveParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentMoveParticipant.java
@@ -29,7 +29,7 @@
 
 	private IPackageFragment fPackageFragment;
 	private IPackageFragmentRoot fDestination;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
 	 */
@@ -53,7 +53,7 @@
 	 */
 	@Override
 	public String getName() {
-		return RefactoringMessages.LaunchConfigurationParticipant_0; 
+		return RefactoringMessages.LaunchConfigurationParticipant_0;
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentRenameParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentRenameParticipant.java
index ae6b1ce..eeff664 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentRenameParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationIPackageFragmentRenameParticipant.java
@@ -20,9 +20,9 @@
 import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
 
 public class LaunchConfigurationIPackageFragmentRenameParticipant extends RenameParticipant {
-	
+
 	private IPackageFragment fPackageFragment;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
 	 */
@@ -37,7 +37,7 @@
 	 */
 	@Override
 	public String getName() {
-		return RefactoringMessages.LaunchConfigurationParticipant_0; 
+		return RefactoringMessages.LaunchConfigurationParticipant_0;
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeMoveParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeMoveParticipant.java
index dedfea0..c6b2eb2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeMoveParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeMoveParticipant.java
@@ -26,7 +26,7 @@
 /**
  */
 public class LaunchConfigurationITypeMoveParticipant extends MoveParticipant {
-	
+
 	private IType fType;
 	private IJavaElement fDestination;
 
@@ -61,7 +61,7 @@
 	 */
 	@Override
 	public String getName() {
-		return RefactoringMessages.LaunchConfigurationParticipant_0; 
+		return RefactoringMessages.LaunchConfigurationParticipant_0;
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeRenameParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeRenameParticipant.java
index 0e0eaeb..a388434 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeRenameParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationITypeRenameParticipant.java
@@ -33,15 +33,15 @@
 		fType= (IType) element;
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
 	 */
 	@Override
 	public String getName() {
-		return RefactoringMessages.LaunchConfigurationParticipant_0; 
+		return RefactoringMessages.LaunchConfigurationParticipant_0;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationProjectMainTypeChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationProjectMainTypeChange.java
index b6dbc0a..be34fbd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationProjectMainTypeChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LaunchConfigurationProjectMainTypeChange.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Feng(Marvin) Wang <feng.wang@sybase.com> - bug 244395
@@ -33,7 +33,7 @@
  * The change for the main type project change of a launch configuration
  */
 public class LaunchConfigurationProjectMainTypeChange extends Change {
-	
+
 	private ILaunchConfiguration fLaunchConfiguration;
 	private String fNewMainTypeName;
 	private String fNewProjectName;
@@ -41,7 +41,7 @@
 	private String fOldMainTypeName;
 	private String fOldProjectName;
     private String fNewConfigContainerName;
-	
+
     /**
 	 * LaunchConfigurationProjectMainTypeChange constructor.
 	 * @param launchConfiguration the launch configuration to modify
@@ -73,30 +73,30 @@
 	public Object getModifiedElement() {
 		return fLaunchConfiguration;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#getName()
 	 */
 	@Override
 	public String getName() {
 		if (fNewLaunchConfigurationName != null) {
-			return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_0, new String[] {fLaunchConfiguration.getName(), fNewLaunchConfigurationName}); 
-		} 
+			return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_0, new String[] {fLaunchConfiguration.getName(), fNewLaunchConfigurationName});
+		}
 		if (fNewProjectName == null) {
-			return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_1, new String[] {fLaunchConfiguration.getName()}); 
+			return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_1, new String[] {fLaunchConfiguration.getName()});
 		}
 		if (fNewMainTypeName == null) {
-			return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_2, new String[] {fLaunchConfiguration.getName()}); 
+			return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_2, new String[] {fLaunchConfiguration.getName()});
 		}
-		return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_3, new String[] {fLaunchConfiguration.getName()}); 
+		return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_3, new String[] {fLaunchConfiguration.getName()});
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#initializeValidationData(org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	@Override
 	public void initializeValidationData(IProgressMonitor pm) {}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#isValid(org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -110,7 +110,7 @@
 					if (fOldProjectName.equals(projectName)) {
 						return new RefactoringStatus();
 					}
-					return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_4, new String[] {fLaunchConfiguration.getName(), fOldProjectName})); 
+					return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_4, new String[] {fLaunchConfiguration.getName(), fOldProjectName}));
 				}
 				return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_5, new String[] {fLaunchConfiguration.getName(), fOldMainTypeName}));
 			}
@@ -119,15 +119,15 @@
 				return new RefactoringStatus();
 			}
 			return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_4, new String[] {fLaunchConfiguration.getName(), fOldProjectName}));
-		} 
-		return RefactoringStatus.createFatalErrorStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_6, new String[] {fLaunchConfiguration.getName()})); 
+		}
+		return RefactoringStatus.createFatalErrorStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_6, new String[] {fLaunchConfiguration.getName()}));
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	@Override
-	public Change perform(IProgressMonitor pm) throws CoreException {    
+	public Change perform(IProgressMonitor pm) throws CoreException {
 		final ILaunchConfigurationWorkingCopy wc = fLaunchConfiguration.getWorkingCopy();
         if (fNewConfigContainerName != null) {
             IWorkspace workspace = ResourcesPlugin.getWorkspace();
@@ -141,14 +141,14 @@
 		if (fNewMainTypeName != null) {
 			oldMainTypeName = fOldMainTypeName;
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fNewMainTypeName);
-		} 
+		}
 		else {
 			oldMainTypeName = null;
 		}
 		if (fNewProjectName != null) {
 			oldProjectName = fOldProjectName;
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fNewProjectName);
-		} 
+		}
 		else {
 			oldProjectName = null;
 		}
@@ -163,7 +163,7 @@
 		// create the undo change
 		return new LaunchConfigurationProjectMainTypeChange(fLaunchConfiguration, oldMainTypeName, oldProjectName);
 	}
-	
+
 	/**
      * Sets the new container name
      * @param newContainerName the new name for the container
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointChange.java
index b30ec19..b2753e1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointChange.java
@@ -18,7 +18,7 @@
  * @since 3.2
  */
 public abstract class LineBreakpointChange extends BreakpointChange {
-	
+
 	private int fCharEnd, fCharStart, fLineNumber;
 	private boolean fConditionEnabled, fConditionSuspendOnTrue;
 	private String fCondition;
@@ -61,7 +61,7 @@
 	protected int getLineNumber() {
 		return fLineNumber;
 	}
-	
+
 	/**
 	 * Returns the char end attribute of the underlying line breakpoint
 	 * @return the char end attribute of the underlying line breakpoint
@@ -69,7 +69,7 @@
 	protected int getCharEnd() {
 		return fCharEnd;
 	}
-	
+
 	/**
 	 * Returns the char start attribute of the underlying line breakpoint
 	 * @return the char start attribute of the underlying line breakpoint
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointTypeChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointTypeChange.java
index 1f87ded..54042f4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointTypeChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/LineBreakpointTypeChange.java
@@ -29,14 +29,14 @@
  *
  */
 public class LineBreakpointTypeChange extends LineBreakpointChange {
-	
+
 	private IType fDestType;
-	
+
 	public LineBreakpointTypeChange(IJavaLineBreakpoint breakpoint, IType destType) throws CoreException {
 		super(breakpoint);
 		fDestType = destType;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ltk.core.refactoring.Change#getName()
 	 */
@@ -56,17 +56,17 @@
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
 		IResource resource = BreakpointUtils.getBreakpointResource(fDestType);
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, fDestType);
 		map.put(IInternalDebugUIConstants.WORKING_SET_NAME, getOriginalWorkingSets());// creating breakpoint in the original working set
 		IJavaLineBreakpoint breakpoint = JDIDebugModel.createLineBreakpoint(
 				resource,
 				fDestType.getFullyQualifiedName(),
 				getLineNumber(),
-				getCharStart(), 
+				getCharStart(),
 				getCharEnd(),
-				0, 
-				true, 
+				0,
+				true,
 				map);
 		apply(breakpoint);
 		getOriginalBreakpoint().delete();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointChange.java
index 6c1f427..5915a45 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointChange.java
@@ -18,7 +18,7 @@
  * @since 3.2
  */
 public abstract class MethodBreakpointChange extends LineBreakpointChange {
-	
+
 	private String fMethodName, fSignature;
 	private boolean fEntry, fExit, fNativeOnly;
 
@@ -35,7 +35,7 @@
 		fExit = breakpoint.isExit();
 		fNativeOnly = breakpoint.isNativeOnly();
 	}
-	
+
 	/**
 	 * Returns the name of the method
 	 * @return the name of the method
@@ -43,7 +43,7 @@
 	protected String getMethodName() {
 		return fMethodName;
 	}
-	
+
 	/**
 	 * Returns the signature of the method
 	 * @return the signature of the method
@@ -51,7 +51,7 @@
 	protected String getSignature() {
 		return fSignature;
 	}
-	
+
 	/**
 	 * Returns if it is an entry breakpoint
 	 * @return if it is an entry breakpoint
@@ -59,7 +59,7 @@
 	protected boolean isEntry() {
 		return fEntry;
 	}
-	
+
 	/**
 	 * Returns if it is an exit breakpoint
 	 * @return if it is an exit breakpoint
@@ -67,7 +67,7 @@
 	protected boolean isExit() {
 		return fExit;
 	}
-	
+
 	/**
 	 * Returns if it is native only
 	 * @return if it is native only
@@ -86,6 +86,6 @@
 		breakpoint.setEntry(fEntry);
 		breakpoint.setExit(fExit);
 		breakpoint.setNativeOnly(fNativeOnly);
-	}	
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointMethodChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointMethodChange.java
index 2dc5154..690623e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointMethodChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointMethodChange.java
@@ -31,7 +31,7 @@
 public class MethodBreakpointMethodChange extends MethodBreakpointChange {
 
 	private IMethod fDestMethod;
-	
+
 	public MethodBreakpointMethodChange(IJavaMethodBreakpoint breakpoint, IMethod destMethod) throws CoreException {
 		super(breakpoint);
 		fDestMethod = destMethod;
@@ -50,7 +50,7 @@
 	 */
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, fDestMethod);
 		IResource resource = BreakpointUtils.getBreakpointResource(fDestMethod);
 		int range[] = getNewLineNumberAndRange(fDestMethod);
@@ -66,7 +66,7 @@
 				NO_LINE_NUMBER,
 				range[1],
 				range[2],
-				getHitCount(), 
+				getHitCount(),
 				true,
 				map);
 		apply(breakpoint);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointTypeChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointTypeChange.java
index ee4ccf5..996be1a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointTypeChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/MethodBreakpointTypeChange.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,7 +33,7 @@
 public class MethodBreakpointTypeChange extends MethodBreakpointChange {
 
 	private IType fDestType;
-	
+
 	public MethodBreakpointTypeChange(IJavaMethodBreakpoint breakpoint, IType destType) throws CoreException {
 		super(breakpoint);
 		fDestType = destType;
@@ -59,7 +59,7 @@
 		String[] parameterTypes = Signature.getParameterTypes(getSignature());
 		for (int i = 0; i < parameterTypes.length; i++) {
 			parameterTypes[i] = parameterTypes[i].replace('/', '.');
-			
+
 		}
 		IMethod destMethod = fDestType.getMethod(getMethodName(), parameterTypes);
 		if (!destMethod.exists()) {
@@ -72,7 +72,7 @@
 				}
 			}
 		}
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, destMethod);
 		map.put(IInternalDebugUIConstants.WORKING_SET_NAME, getOriginalWorkingSets());// creating breakpoint in the original working set
 		IResource resource = BreakpointUtils.getBreakpointResource(destMethod);
@@ -88,7 +88,7 @@
 				NO_LINE_NUMBER,
 				range[1],
 				range[2],
-				getHitCount(), 
+				getHitCount(),
 				true,
 				map);
 		apply(breakpoint);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/RefactoringMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/RefactoringMessages.java
index ad12a33..9444fff 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/RefactoringMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/RefactoringMessages.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *  IBM - Initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointChange.java
index 66a0217..19c8894 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointChange.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
  *
  */
 public abstract class WatchpointChange extends LineBreakpointChange {
-	
+
 	private String fFieldName;
 	private boolean fAccess, fModification;
 
@@ -28,11 +28,11 @@
 		fAccess = watchpoint.isAccess();
 		fModification = watchpoint.isModification();
 	}
-	
+
 	protected String getFieldName() {
 		return fFieldName;
 	}
-	
+
 	protected void apply(IJavaWatchpoint breakpoint) throws CoreException {
 		super.apply(breakpoint);
 		breakpoint.setAccess(fAccess);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointFieldChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointFieldChange.java
index f69d094..d2895bd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointFieldChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointFieldChange.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,9 +29,9 @@
  *
  */
 public class WatchpointFieldChange extends WatchpointChange {
-	
+
 	private IField fDestField;
-	
+
 	public WatchpointFieldChange(IJavaWatchpoint watchpoint, IField destField) throws CoreException {
 		super(watchpoint);
 		fDestField = destField;
@@ -51,7 +51,7 @@
 	 */
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		map.put(IInternalDebugUIConstants.WORKING_SET_NAME, getOriginalWorkingSets());// creating breakpoint in the original working set
 		BreakpointUtils.addJavaBreakpointAttributes(map, fDestField);
 		IResource resource = BreakpointUtils.getBreakpointResource(fDestField);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeChange.java
index 843de36..3a2f412 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeChange.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,9 +29,9 @@
  *
  */
 public class WatchpointTypeChange extends WatchpointChange {
-	
+
 	private IType fDestType, fOriginalType;
-	
+
 	public WatchpointTypeChange(IJavaWatchpoint watchpoint, IType destType, IType originalType) throws CoreException {
 		super(watchpoint);
 		fDestType = destType;
@@ -57,7 +57,7 @@
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
 		IField destField = fDestType.getField(getFieldName());
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, destField);
 		IResource resource = BreakpointUtils.getBreakpointResource(destField);
 		int[] range = getNewLineNumberAndRange(destField);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeRenameChange.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeRenameChange.java
index c031496..5d0c5c8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeRenameChange.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/core/refactoring/WatchpointTypeRenameChange.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,12 +38,12 @@
 		fProcessor = processor;
 		fArguments = arguments;
 	}
-	
+
 	@Override
 	public Change perform(IProgressMonitor pm) throws CoreException {
 		IField originalField = getOriginalType().getField(getFieldName());
 		IField destinationField = null;
-		
+
 		if (fArguments.getUpdateSimilarDeclarations()) {
 			IJavaElement[] similarDeclarations = fArguments.getSimilarDeclarations();
 			if (similarDeclarations != null) {
@@ -60,8 +60,8 @@
 		if (destinationField == null) {
 			destinationField = getDestinationType().getField(getFieldName());
 		}
-		
-		Map<String, Object> map = new HashMap<String, Object>();
+
+		Map<String, Object> map = new HashMap<>();
 		BreakpointUtils.addJavaBreakpointAttributes(map, destinationField);
 		map.put(IInternalDebugUIConstants.WORKING_SET_NAME, getOriginalWorkingSets()); // creating breakpoint in the original working set
 		IResource resource = BreakpointUtils.getBreakpointResource(destinationField);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ActionFilterAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ActionFilterAdapterFactory.java
index cc06cbb..09813dd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ActionFilterAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ActionFilterAdapterFactory.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import org.eclipse.core.runtime.IAdapterFactory;
 import org.eclipse.jdt.core.IMember;
 import org.eclipse.jdt.debug.core.IJavaStackFrame;
@@ -36,13 +36,13 @@
 		if (adapterType == IActionFilter.class) {
 			if (obj instanceof IJavaThread) {
 				return (T) new JavaThreadActionFilter();
-			} 
+			}
 			else if (obj instanceof IJavaStackFrame) {
 				return (T) new JavaStackFrameActionFilter();
-			} 
+			}
 			else if (obj instanceof IMember) {
 				return (T) new MemberActionFilter();
-			} 
+			}
 			else if((obj instanceof IJavaVariable) || (obj instanceof JavaInspectExpression)) {
 				return (T) new JavaVarActionFilter();
 			}
@@ -56,7 +56,7 @@
 	@Override
 	public Class<?>[] getAdapterList() {
 		return new Class[] {
-			IActionFilter.class 
+			IActionFilter.class
 		};
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointMarkerUpdater.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointMarkerUpdater.java
index e5dfae5..a95ffcc 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointMarkerUpdater.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointMarkerUpdater.java
@@ -37,31 +37,31 @@
 import org.eclipse.ui.texteditor.MarkerUtilities;
 
 /**
- * This class provides a mechanism to correct the placement of a 
+ * This class provides a mechanism to correct the placement of a
  * breakpoint marker when the related document is edited.
- * 
+ *
  * This updater is used to cover the line number discrepancy cases that <code>BasicMarkerUpdater</code> does not:
  * <ul>
- * <li>If you insert a blank line at the start of the line of code, the breakpoint 
- * is moved from the blank line to the next viable line down, 
+ * <li>If you insert a blank line at the start of the line of code, the breakpoint
+ * is moved from the blank line to the next viable line down,
  * following the same breakpoint placement rules as creating a breakpoint</li>
- * 
- * <li>If you select the contents of an entire line and delete them 
+ *
+ * <li>If you select the contents of an entire line and delete them
  * (leaving the line blank), the breakpoint is moved to the next viable line down,
  * following the same breakpoint placement rules as creating a breakpoint</li>
- * 
- * <li>If the breakpoint is on the last viable line of a class file and the line is removed via either of 
+ *
+ * <li>If the breakpoint is on the last viable line of a class file and the line is removed via either of
  * the aforementioned deletion cases, the breakpoint is removed</li>
- * 
+ *
  * <li>If a line breakpoint would be moved to a valid method location with an invalid line number it is removed,
  * see  {@link https://bugs.eclipse.org/bugs/show_bug.cgi?id=188676} for details</li>
- * 
+ *
  * <li>If a line breakpoint will be moved to a line that already has a line breakpoint on it, the one
  * being moved is removed, see {@link https://bugs.eclipse.org/bugs/show_bug.cgi?id=129066} for details</li>
- * 
+ *
  * <li>In the general deletion case if a valid breakpoint location can not be determined, it is removed</li>
  * </ul>
- * 
+ *
  * @since 3.3
  */
 public class BreakpointMarkerUpdater implements IMarkerUpdater {
@@ -139,12 +139,12 @@
 				ensureRanges(document, marker, line);
 			}
 			return true;
-		} 
-		catch (BadLocationException e) {JDIDebugUIPlugin.log(e);} 
+		}
+		catch (BadLocationException e) {JDIDebugUIPlugin.log(e);}
 		catch (CoreException e) {JDIDebugUIPlugin.log(e);}
 		return false;
 	}
-	
+
 	/**
 	 * Updates the charstart and charend ranges if necessary for the given line.
 	 * Returns immediately if the line is not valid (< 0 or greater than the total line number count)
@@ -163,18 +163,18 @@
 		MarkerUtilities.setCharStart(marker, charstart);
 		MarkerUtilities.setCharEnd(marker, charend);
 	}
-	
+
 	/**
 	 * Returns if the specified marker is for an <code>IJavaLineBreakpoint</code>
 	 * @param marker
 	 * @return true if the marker is for an <code>IJavalineBreakpoint</code>, false otherwise
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	private boolean isLineBreakpoint(IMarker marker) {
 		return MarkerUtilities.isMarkerType(marker, "org.eclipse.jdt.debug.javaLineBreakpointMarker"); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Searches for an existing line breakpoint on the specified line in the current type that does not match the id of the specified marker
 	 * @param resource the resource to care about
@@ -183,7 +183,7 @@
 	 * @param currentmarker the current marker we are comparing to see if it will be moved onto an existing one
 	 * @return an existing line breakpoint on the current line of the given resource and type if there is one
 	 * @throws CoreException
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	private IJavaLineBreakpoint lineBreakpointExists(IResource resource, String typeName, int lineNumber, IMarker currentmarker) throws CoreException {
@@ -206,6 +206,6 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointUtils.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointUtils.java
index 8ff0b33..9e4337e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointUtils.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/BreakpointUtils.java
@@ -40,14 +40,14 @@
 import org.eclipse.jface.text.source.IVerticalRulerInfo;
 import org.eclipse.ui.texteditor.ITextEditor;
 import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
- 
+
 /**
- * Utility class for Java breakpoints 
+ * Utility class for Java breakpoints
  */
 public class BreakpointUtils {
-	
+
 	/**
-	 * Marker attribute storing the handle id of the 
+	 * Marker attribute storing the handle id of the
 	 * Java element associated with a Java breakpoint
 	 */
 	private static final String HANDLE_ID = JDIDebugUIPlugin.getUniqueIdentifier() + ".JAVA_ELEMENT_HANDLE_ID"; //$NON-NLS-1$
@@ -56,25 +56,25 @@
 	 * Marker attribute used to denote a run to line breakpoint
 	 */
 	private static final String RUN_TO_LINE =  JDIDebugUIPlugin.getUniqueIdentifier() + ".run_to_line"; //$NON-NLS-1$
-	
+
 	/**
 	 * Marker attribute used to denote the start of the region within a Java
 	 * member that the breakpoint is located within.
 	 */
 	private static final String MEMBER_START =  JDIDebugUIPlugin.getUniqueIdentifier() + ".member_start"; //$NON-NLS-1$
-	
+
 	/**
 	 * Marker attribute used to denote the end of the region within a Java
 	 * member that the breakpoint is located within.
 	 */
 	private static final String MEMBER_END =  JDIDebugUIPlugin.getUniqueIdentifier() + ".member_end"; //$NON-NLS-1$
-	
+
 	/**
 	 * Returns the resource on which a breakpoint marker should
-	 * be created for the given member. The resource returned is the 
-	 * associated file, or workspace root in the case of a binary in 
+	 * be created for the given member. The resource returned is the
+	 * associated file, or workspace root in the case of a binary in
 	 * an external archive.
-	 * 
+	 *
 	 * @param member member in which a breakpoint is being created
 	 * @return resource the resource on which a breakpoint marker
 	 *  should be created
@@ -93,10 +93,10 @@
 		}
 		return res;
 	}
-	
+
 	/**
 	 * Returns the type that the given Java breakpoint refers to
-	 * 
+	 *
 	 * @param breakpoint Java breakpoint
 	 * @return the type the breakpoint is associated with
 	 */
@@ -115,13 +115,13 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the member associated with the line number of
 	 * the given breakpoint.
-	 * 
+	 *
 	 * @param breakpoint Java line breakpoint
-	 * @return member at the given line number in the type 
+	 * @return member at the given line number in the type
 	 *  associated with the breakpoint
 	 * @exception CoreException if an exception occurs accessing
 	 *  the breakpoint
@@ -133,17 +133,17 @@
 		if (breakpoint instanceof IJavaWatchpoint) {
 			return getField((IJavaWatchpoint)breakpoint);
 		}
-		
+
 		int start = breakpoint.getCharStart();
 		int end = breakpoint.getCharEnd();
-		
+
 		IType type = getType(breakpoint);
-	
+
 		if (start == -1 && end == -1) {
 			start= breakpoint.getMarker().getAttribute(MEMBER_START, -1);
 			end= breakpoint.getMarker().getAttribute(MEMBER_END, -1);
 		}
-		
+
 		IMember member = null;
 		if ((type != null && type.exists()) && (end >= start) && (start >= 0)) {
 			member= binSearch(type, start, end);
@@ -153,7 +153,7 @@
 		}
 		return member;
 	}
-	
+
 	/**
 	 * Searches the given source range of the container for a member that is
 	 * not the same as the given type.
@@ -183,12 +183,12 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Returns the given Java element if it is an
 	 * <code>IMember</code>, otherwise <code>null</code>.
-	 * 
+	 *
 	 * @param element Java element
 	 * @return the given element if it is a type member,
 	 * 	otherwise <code>null</code>
@@ -197,9 +197,9 @@
 		if (element instanceof IMember) {
 			return (IMember)element;
 		}
-		return null;		
+		return null;
 	}
-	
+
 	/**
 	 * Returns the element at the given position in the given type
 	 * @param type the {@link IType}
@@ -213,22 +213,22 @@
 		}
 		return type.getCompilationUnit().getElementAt(pos);
 	}
-	
+
 	/**
 	 * Adds attributes to the given attribute map:<ul>
 	 * <li>Java element handle id</li>
 	 * <li>Attributes defined by <code>JavaCore</code></li>
 	 * </ul>
-	 * 
+	 *
 	 * @param attributes the attribute map to use
 	 * @param element the Java element associated with the breakpoint
 	 */
 	public static void addJavaBreakpointAttributes(Map<String, Object> attributes, IJavaElement element) {
 		String handleId = element.getHandleIdentifier();
 		attributes.put(HANDLE_ID, handleId);
-		JavaCore.addJavaElementMarkerAttributes(attributes, element);		
+		JavaCore.addJavaElementMarkerAttributes(attributes, element);
 	}
-	
+
 	/**
 	 * Adds attributes to the given attribute map:<ul>
 	 * <li>Java element handle id</li>
@@ -236,7 +236,7 @@
 	 * <li>Member end position</li>
 	 * <li>Attributes defined by <code>JavaCore</code></li>
 	 * </ul>
-	 * 
+	 *
 	 * @param attributes the attribute map to use
 	 * @param element the Java element associated with the breakpoint
 	 * @param memberStart the start position of the Java member that the breakpoint is positioned within
@@ -247,29 +247,29 @@
 		attributes.put(MEMBER_START, new Integer(memberStart));
 		attributes.put(MEMBER_END, new Integer(memberEnd));
 	}
-	
+
 	/**
 	 * Adds attributes to the given attribute map to make the
 	 * breakpoint a run-to-line breakpoint:<ul>
 	 * <li>PERSISTED = false</li>
 	 * <li>RUN_TO_LINE = true</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param attributes the attribute map to use
 	 */
 	public static void addRunToLineAttributes(Map<String, Object> attributes) {
 		attributes.put(IBreakpoint.PERSISTED, Boolean.FALSE);
 		attributes.put(RUN_TO_LINE, Boolean.TRUE);
-	}	
-	
+	}
+
 	/**
 	 * Returns the method associated with the method entry
 	 * breakpoint.
-	 * 
+	 *
 	 * @param breakpoint Java method entry breakpoint
 	 * @return method
 	 */
-	public static IMethod getMethod(IJavaMethodBreakpoint breakpoint) {	
+	public static IMethod getMethod(IJavaMethodBreakpoint breakpoint) {
 		String handle = breakpoint.getMarker().getAttribute(HANDLE_ID, null);
 		if (handle != null) {
 			IJavaElement je = JavaCore.create(handle);
@@ -281,14 +281,14 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the field associated with the watchpoint.
-	 * 
+	 *
 	 * @param breakpoint Java watchpoint
 	 * @return field
 	 */
-	public static IField getField(IJavaWatchpoint breakpoint) {	
+	public static IField getField(IJavaWatchpoint breakpoint) {
 		String handle = breakpoint.getMarker().getAttribute(HANDLE_ID, null);
 		if (handle != null) {
 			IJavaElement je = JavaCore.create(handle);
@@ -299,12 +299,12 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Returns whether the given breakpoint is a run to line
 	 * breakpoint
-	 * 
+	 *
 	 * @param breakpoint line breakpoint
 	 * @return whether the given breakpoint is a run to line
 	 *  breakpoint
@@ -312,11 +312,11 @@
 	public static boolean isRunToLineBreakpoint(IJavaLineBreakpoint breakpoint) {
 		return breakpoint.getMarker().getAttribute(RUN_TO_LINE, false);
 	}
-	
+
 	/**
 	 * Returns whether the given breakpoint is a compilation
 	 * problem breakpoint or uncaught exception breakpoint
-	 * 
+	 *
 	 * @param breakpoint breakpoint
 	 * @return whether the given breakpoint is a compilation error breakpoint or
 	 *  uncaught exception breakpoint
@@ -325,11 +325,11 @@
 		return breakpoint == JavaDebugOptionsManager.getDefault().getSuspendOnCompilationErrorBreakpoint() ||
 			breakpoint == JavaDebugOptionsManager.getDefault().getSuspendOnUncaughtExceptionBreakpoint();
 	}
-	
+
 	/**
      * Resolves the {@link IBreakpoint} from the given editor and ruler information. Returns <code>null</code>
      * if no breakpoint exists or the operation fails.
-     * 
+     *
      * @param editor the editor
      * @param info the current ruler information
      * @return the {@link IBreakpoint} from the current editor position or <code>null</code>
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ConditionalBreakpointErrorDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ConditionalBreakpointErrorDialog.java
index 8d3383c..2a06e8c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ConditionalBreakpointErrorDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ConditionalBreakpointErrorDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,9 +18,9 @@
 import org.eclipse.swt.widgets.Shell;
 
 public class ConditionalBreakpointErrorDialog extends ErrorDialog {
-	
+
 	public ConditionalBreakpointErrorDialog(Shell parentShell, String message, IStatus status) {
-		super(parentShell, DebugUIMessages.ConditionalBreakpointErrorDialog_Conditional_Breakpoint_Error_1, message, status, IStatus.ERROR); 
+		super(parentShell, DebugUIMessages.ConditionalBreakpointErrorDialog_Conditional_Breakpoint_Error_1, message, status, IStatus.ERROR);
 	}
 
 	/**
@@ -29,7 +29,7 @@
 	@Override
 	protected void createButtonsForButtonBar(Composite parent) {
 		// create Edit and Cancel buttons
-		createButton(parent, IDialogConstants.OK_ID, DebugUIMessages.ConditionalBreakpointErrorDialog__Edit_Condition_2, true); 
+		createButton(parent, IDialogConstants.OK_ID, DebugUIMessages.ConditionalBreakpointErrorDialog__Edit_Condition_2, true);
 		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/CreateStepFilterDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/CreateStepFilterDialog.java
index c616ea8..cc022ea 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/CreateStepFilterDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/CreateStepFilterDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,7 +31,7 @@
 public class CreateStepFilterDialog extends StatusDialog {
 
 	private static final String DEFAULT_NEW_FILTER_TEXT = ""; //$NON-NLS-1$
-	
+
 	private Text text;
 	private Filter filter;
 	private Button okButton;
@@ -45,27 +45,27 @@
 		setShellStyle(getShellStyle() | SWT.RESIZE);
 		this.filter = filter;
 		this.existingFilters = existingFilters;
-		
-		setTitle(DebugUIMessages.CreateStepFilterDialog_2); 
+
+		setTitle(DebugUIMessages.CreateStepFilterDialog_2);
 		setStatusLineAboveButtons(false);
-		
+
 	}
-	
+
 	static Filter showCreateStepFilterDialog(Shell parent, Filter[] existingFilters) {
 		CreateStepFilterDialog createStepFilterDialog = new CreateStepFilterDialog(parent, new Filter(DEFAULT_NEW_FILTER_TEXT, true), existingFilters);
 		createStepFilterDialog.create();
 		createStepFilterDialog.open();
-		
-		return createStepFilterDialog.filter;		
+
+		return createStepFilterDialog.filter;
 	}
-	
+
 	@Override
 	protected void createButtonsForButtonBar(Composite parent) {
 		okButton= createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-		okButton.setEnabled(false);		
+		okButton.setEnabled(false);
 		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
 	}
-	
+
 	@Override
 	protected Control createDialogArea(Composite parent) {
 		Composite container = (Composite)super.createDialogArea(parent);
@@ -78,9 +78,9 @@
 
 		int textStyles = SWT.SINGLE | SWT.LEFT;
 		Label label= new Label(container, textStyles);
-		label.setText(DebugUIMessages.CreateStepFilterDialog_3); 
+		label.setText(DebugUIMessages.CreateStepFilterDialog_3);
 		label.setFont(container.getFont());
-		
+
 		// create & configure Text widget for editor
 		// Fix for bug 1766.  Border behavior on for text fields varies per platform.
 		// On Motif, you always get a border, on other platforms,
@@ -90,14 +90,14 @@
 		if (!SWT.getPlatform().equals("motif")) {  //$NON-NLS-1$
 			textStyles |= SWT.BORDER;
 		}
-		
+
 		text = new Text(container, textStyles);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);		
+		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
 		gridData.horizontalSpan=1;
 		gridData.widthHint = 300;
 		text.setLayoutData(gridData);
 		text.setFont(container.getFont());
-		
+
 		text.addModifyListener(new ModifyListener() {
 			@Override
 			public void modifyText(ModifyEvent e) {
@@ -105,17 +105,17 @@
 				if (!filterValid) {
 					updateStatus(new StatusInfo(IStatus.ERROR, DebugUIMessages.CreateStepFilterDialog_4));
 				} else if (isDuplicateFilter(text.getText().trim())) {
-					updateStatus(new StatusInfo(IStatus.WARNING, DebugUIMessages.CreateStepFilterDialog_5)); 
+					updateStatus(new StatusInfo(IStatus.WARNING, DebugUIMessages.CreateStepFilterDialog_5));
 					return;
 				} else {
 					updateStatus(new StatusInfo());
-				}		
+				}
 			}
 		});
-	
+
 		return container;
 	}
-	
+
 	private void validateChange() {
 		String trimmedValue = text.getText().trim();
 
@@ -129,7 +129,7 @@
 			filterValid = false;
 		}
 	}
-	
+
 	private boolean isDuplicateFilter(String trimmedValue) {
 		for (int i=0; i<existingFilters.length; i++) {
 			if(existingFilters[i].getName().equals(trimmedValue)) {
@@ -144,7 +144,7 @@
 	 * step filtering must be limited to exact matches or patterns that
 	 * begin with '*' or end with '*'. Beyond this, a string cannot be validated
 	 * as corresponding to an existing type or package (and this is probably not
-	 * even desirable).  
+	 * even desirable).
 	 */
 	private boolean validateInput(String trimmedValue) {
 		char firstChar= trimmedValue.charAt(0);
@@ -168,16 +168,16 @@
 		}
 		return true;
 	}
-	
+
 	/**
 	 * Returns the name of the section that this dialog stores its settings in
-	 * 
+	 *
 	 * @return String
 	 */
 	protected String getDialogSettingsSectionName() {
 		return IJavaDebugUIConstants.PLUGIN_ID + ".CREATE_STEP_FILTER_DIALOG_SECTION"; //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.window.Window#close()
 	 */
@@ -189,7 +189,7 @@
 		}
 		return super.close();
 	}
-	
+
 	 /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
      */
@@ -199,7 +199,7 @@
          IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
          if (section == null) {
              section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
+         }
          return section;
     }
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java
index 0e90a66..d468df6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java
@@ -159,9 +159,9 @@
 	public static String JDIModelPresentation_target_suspended;
 	public static String JDIModelPresentation_thread_filtered;
 	public static String JDIModelPresentation_uncaught_62;
-	
+
 	// thread label keys are built programmatically
-	
+
 	public static String thread_terminated;
 	public static String thread_evaluating;
 	public static String thread_running;
@@ -176,7 +176,7 @@
 	public static String thread_suspended_fieldmodification;
 	public static String thread_suspended_runtoline;
 	public static String thread_suspended_classprepare;
-	
+
 	public static String thread_daemon_terminated;
 	public static String thread_daemon_evaluating;
 	public static String thread_daemon_running;
@@ -191,7 +191,7 @@
 	public static String thread_daemon_suspended_fieldmodification;
 	public static String thread_daemon_suspended_runtoline;
 	public static String thread_daemon_suspended_classprepare;
-	
+
 	public static String thread_system_terminated;
 	public static String thread_system_evaluating;
 	public static String thread_system_running;
@@ -206,7 +206,7 @@
 	public static String thread_system_suspended_fieldmodification;
 	public static String thread_system_suspended_runtoline;
 	public static String thread_system_suspended_classprepare;
-	
+
 	public static String thread_daemon_system_terminated;
 	public static String thread_daemon_system_evaluating;
 	public static String thread_daemon_system_running;
@@ -374,7 +374,7 @@
 	public static String JavaPrimitivesPreferencePage_0;
 
 	public static String JavaPrimitivesPreferencePage_1;
-	
+
 	public static String JavaStepFilterPreferencePage__Use_step_filters;
 
 	public static String JavaVariableLabelProvider_0;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugWorkingCopyManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugWorkingCopyManager.java
index 824c9d7..78c86a4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugWorkingCopyManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugWorkingCopyManager.java
@@ -18,15 +18,15 @@
 /**
  * Controls access to the java working copy.  Isolated in this class as implementation requires
  * use of internal JDT UI code.  See bug 151260 for more information.
- *  
+ *
  * @since 3.3
  * @see org.eclipse.jdt.internal.ui.javaeditor.WorkingCopyManager
  */
 public class DebugWorkingCopyManager {
-	
+
 	/**
 	 * Returns the working copy remembered for the compilation unit encoded in the
-	 * given editor input.	 
+	 * given editor input.
 	 *
 	 * @param input the editor input
 	 * @param primaryOnly if <code>true</code> only primary working copies will be returned
@@ -38,5 +38,5 @@
     	//TODO Using JDT UI internal code here, see bug 151260 for more information
 		return ((WorkingCopyManager)JavaUI.getWorkingCopyManager()).getWorkingCopy(input, primaryOnly);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatter.java
index 3e18332..f72e78d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,19 +15,19 @@
  * Information about a detail formatter.
  */
 public class DetailFormatter implements Comparable<Object> {
-	
+
 	private boolean fEnabled;
-	
+
 	private String fTypeName;
-	
+
 	private String fSnippet;
-	
+
 	public DetailFormatter(String typeName, String snippet, boolean enabled) {
 		fTypeName= typeName;
 		fSnippet= snippet;
 		fEnabled= enabled;
 	}
-	
+
 	/**
 	 * Indicate if this pretty should be used or not.
 	 * @return boolean
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatterDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatterDialog.java
index 28aa315..407bf79 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatterDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DetailFormatterDialog.java
@@ -74,7 +74,7 @@
  * Dialog for edit detail formatter.
  */
 public class DetailFormatterDialog extends StatusDialog implements ITypeProvider {
-	
+
 	/**
 	 * The detail formatter to edit.
 	 */
@@ -90,7 +90,7 @@
 	 * have been already performed.
 	 */
 	private boolean fTypeSearched;
-	
+
 	/**
 	 * Indicate if the type can be modified.
 	 */
@@ -103,7 +103,7 @@
 	 * the workspace.
 	 */
 	private IType fType;
-	
+
 	/**
 	 * List of types that have detail formatters already defined.
 	 */
@@ -113,10 +113,10 @@
      * Activation handler for content assist, must be deactivated on disposal.
      */
     private IHandlerActivation fHandlerActivation;
-    
+
 	/**
 	 * DetailFormatterDialog constructor.  Creates a new dialog to create/edit a detail formatter.
-	 * 
+	 *
 	 * @param parent parent shell
 	 * @param detailFormatter detail formatter to edit, not <code>null</code>
 	 * @param definedTypes list of types with detail formatters already defined, or <code>null</code>
@@ -125,10 +125,10 @@
 	public DetailFormatterDialog(Shell parent, DetailFormatter detailFormatter, List<?> definedTypes, boolean editDialog) {
 		this(parent, detailFormatter, definedTypes, true, editDialog);
 	}
-	
+
 	/**
 	 * DetailFormatterDialog constructor.  Creates a new dialog to create/edit a detail formatter.
-	 * 
+	 *
 	 * @param parent parent shell
 	 * @param detailFormatter detail formatter to edit, not <code>null</code>
 	 * @param definedTypes list of types with detail formatters already defined, or <code>null</code>
@@ -148,27 +148,27 @@
 		fEditTypeName= editTypeName;
 		fDefinedTypes= definedTypes;
 	}
-	
+
 	/**
 	 * Create the dialog area.
-	 * 
+	 *
 	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
 	 */
 	@Override
 	protected Control createDialogArea(Composite parent) {
 		IWorkbench workbench = PlatformUI.getWorkbench();
-		
+
 		workbench.getHelpSystem().setHelp(
 			parent,
 			IJavaDebugHelpContextIds.EDIT_DETAIL_FORMATTER_DIALOG);
-		
+
 		Font font = parent.getFont();
 		Composite container = (Composite)super.createDialogArea(parent);
-		
+
 		SWTFactory.createLabel(container, DebugUIMessages.DetailFormatterDialog_Qualified_type__name__2, 1);
 
 		Composite innerContainer = SWTFactory.createComposite(container, font, 2, 1, GridData.FILL_HORIZONTAL);
-		
+
 		fTypeNameText = SWTFactory.createSingleText(innerContainer, 1);
 		fTypeNameText.setEditable(fEditTypeName);
 		fTypeNameText.setText(fDetailFormatter.getTypeName());
@@ -179,7 +179,7 @@
 				checkValues();
 			}
 		});
-		
+
 		Button typeSearchButton = SWTFactory.createPushButton(innerContainer, DebugUIMessages.DetailFormatterDialog_Select__type_4, null);
 		typeSearchButton.setEnabled(fEditTypeName);
 		typeSearchButton.addListener(SWT.Selection, new Listener() {
@@ -188,7 +188,7 @@
 				selectType();
 			}
 		});
-		
+
 		String labelText = null;
 		IBindingService bindingService = workbench.getAdapter(IBindingService.class);
 		String binding = bindingService.getBestActiveBindingFormattedFor(IWorkbenchCommandConstants.EDIT_CONTENT_ASSIST);
@@ -198,13 +198,13 @@
         if (labelText == null) {
             labelText = DebugUIMessages.DetailFormatterDialog_Detail_formatter__code_snippet__1;
         }
-		
+
         SWTFactory.createLabel(container, labelText, 1);
 
         createSnippetViewer(container);
-		
+
 		fCheckBox = SWTFactory.createCheckButton(container, DebugUIMessages.DetailFormatterDialog__Enable_1, null, fDetailFormatter.isEnabled(), 1);
-       
+
 		// Set up content assist in the viewer
         IHandler handler = new AbstractHandler() {
 			@Override
@@ -218,20 +218,20 @@
 		};
         IHandlerService handlerService = workbench.getAdapter(IHandlerService.class);
         fHandlerActivation = handlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler);
-        
+
 		checkValues();
 		return container;
 	}
 
 	/**
 	 * Creates the JDISourceViewer that displays the code snippet to the user.
-	 * 
+	 *
 	 * @param parent parent composite
 	 */
 	private void createSnippetViewer(Composite parent) {
 		fSnippetViewer= new JDISourceViewer(parent,  null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
 		fSnippetViewer.setInput(this);
-	
+
 		JavaTextTools tools= JDIDebugUIPlugin.getDefault().getJavaTextTools();
 		IDocument document= new Document();
 		tools.setupJavaDocumentPartitioner(document, IJavaPartitions.JAVA_PARTITIONING);
@@ -243,14 +243,14 @@
 		});
 		fSnippetViewer.setEditable(true);
 		fSnippetViewer.setDocument(document);
-		
+
 		Control control= fSnippetViewer.getControl();
 		GridData gd= new GridData(GridData.FILL_BOTH);
 		gd.heightHint= convertHeightInCharsToPixels(10);
 		gd.widthHint= convertWidthInCharsToPixels(80);
 		control.setLayoutData(gd);
 		document.set(fDetailFormatter.getSnippet());
-		
+
 		fSnippetViewer.getDocument().addDocumentListener(new IDocumentListener() {
 			@Override
 			public void documentAboutToBeChanged(DocumentEvent event) {
@@ -260,12 +260,12 @@
 				checkValues();
 			}
 		});
-        
+
         if (fDetailFormatter.getTypeName().length() > 0) {
             fSnippetViewer.getControl().setFocus();
         }
 	}
-	
+
 	/**
 	 * Check the field values and display a message in the status if needed.
 	 */
@@ -292,10 +292,10 @@
 		fDetailFormatter.setEnabled(fCheckBox.getSelection());
 		fDetailFormatter.setTypeName(fTypeNameText.getText().trim());
 		fDetailFormatter.setSnippet(fSnippetViewer.getDocument().get());
-		
+
 		super.okPressed();
 	}
-	
+
 	/**
 	 * Open the 'select type' dialog, and set the user choice into the formatter.
 	 */
@@ -311,13 +311,13 @@
 			ExceptionHandler.handle(jme, title, message);
 			return;
 		}
-	
+
 		dialog.setTitle(DebugUIMessages.DetailFormatterDialog_Select_type_8);
 		dialog.setMessage(DebugUIMessages.DetailFormatterDialog_Select_a_type_to_format_when_displaying_its_detail_9);
 		if (dialog.open() == IDialogConstants.CANCEL_ID) {
 			return;
 		}
-		
+
 		Object[] types= dialog.getResult();
 		if (types != null && types.length > 0) {
 			fType = (IType)types[0];
@@ -325,7 +325,7 @@
 			fTypeSearched = true;
 		}
 	}
-	
+
 	/**
 	 * Use the Java search engine to find the type which corresponds
 	 * to the given name.
@@ -343,7 +343,7 @@
 		final IProgressMonitor monitor = new NullProgressMonitor();
 		final SearchRequestor collector = new SearchRequestor() {
 			private boolean fFirst= true;
-			
+
 			@Override
 			public void endReporting() {
 				checkValues();
@@ -363,7 +363,7 @@
 				monitor.setCanceled(true);
 			}
 		};
-		
+
 		SearchEngine engine= new SearchEngine(JavaCore.getWorkingCopies(null));
 		SearchPattern searchPattern = SearchPattern.createPattern(pattern, IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE);
 		IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
@@ -375,7 +375,7 @@
 		} catch (OperationCanceledException e) {
 		}
 	}
-	
+
 	/**
 	 * Return the type object which corresponds to the given name.
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EditLogicalStructureDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EditLogicalStructureDialog.java
index 0b4d2be..6f8c4bf 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EditLogicalStructureDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EditLogicalStructureDialog.java
@@ -88,7 +88,7 @@
 		private final List<String[]> fVariables;
 
 		public AttributesContentProvider(String[][] variables) {
-			fVariables= new ArrayList<String[]>();
+			fVariables= new ArrayList<>();
 			for (int i= 0; i < variables.length; i++) {
 				String[] variable= new String[2];
 				variable[0]= variables[i][0];
@@ -118,7 +118,7 @@
 		public Object[] getElements(Object inputElement) {
 			return getElements();
 		}
-		
+
 		/**
 		 * Returns the attributes.
 		 * @return the elements
@@ -137,7 +137,7 @@
 
 		/**
 		 * Remove the given attributes
-		 * @param list the list 
+		 * @param list the list
 		 */
 		public void remove(List<String[]> list) {
 			fVariables.removeAll(list);
@@ -170,14 +170,14 @@
 		}
 
 	}
-	
+
 	public class AttributesLabelProvider extends LabelProvider {
 		@Override
 		public String getText(Object element) {
 			return ((String[])element)[0];
 		}
 	}
-	
+
 	private final JavaLogicalStructure fLogicalStructure;
 	private Text fQualifiedTypeNameText;
 	private Text fDescriptionText;
@@ -210,11 +210,11 @@
 		if (logicalStructure.getQualifiedTypeName().length() == 0) {
 			setTitle(DebugUIMessages.EditLogicalStructureDialog_32);
 		} else {
-			setTitle(DebugUIMessages.EditLogicalStructureDialog_31); 
+			setTitle(DebugUIMessages.EditLogicalStructureDialog_31);
 		}
 		fLogicalStructure= logicalStructure;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
 	 */
@@ -225,64 +225,64 @@
 				parent,
 				IJavaDebugHelpContextIds.EDIT_LOGICAL_STRUCTURE_DIALOG);
 		fParentComposite= parent;
-		
+
 		IHandler handler = new AbstractHandler() {
 			@Override
 			public Object execute(ExecutionEvent event) throws ExecutionException {
 				if(fSnippetViewer.canDoOperation(ISourceViewer.CONTENTASSIST_PROPOSALS) && fSnippetViewer.getControl().isFocusControl()){
 					findCorrespondingType();
-					fSnippetViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);				
+					fSnippetViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
 				}
 				return null;
 			}
 		};
-		
+
 		IHandlerService handlerService = workbench.getAdapter(IHandlerService.class);
         fHandlerActivation = handlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler);
-        
+
 		Composite container = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH);
 
 		Composite typeNameDescriptionContainer = SWTFactory.createComposite(container, container.getFont(), 2, 1, GridData.FILL_HORIZONTAL);
-		
+
 		SWTFactory.createLabel(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_0, 2);
-		
+
 		fQualifiedTypeNameText = SWTFactory.createSingleText(typeNameDescriptionContainer, 1);
 		fQualifiedTypeNameText.addListener(SWT.Modify, this);
-		
+
 		fBrowseTypeButton = SWTFactory.createPushButton(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_1, DebugUIMessages.EditLogicalStructureDialog_25, null);
-		
+
 		fBrowseTypeButton.addListener(SWT.Selection, this);
-		
+
 		SWTFactory.createLabel(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_2, 2);
-		
+
 		fDescriptionText = SWTFactory.createSingleText(typeNameDescriptionContainer, 2);
 		fDescriptionText.addListener(SWT.Modify, this);
-		
+
 		fSubTypeButton = SWTFactory.createCheckButton(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_3, null, false, 1);
-		fSubTypeButton.setToolTipText(DebugUIMessages.EditLogicalStructureDialog_26); 
+		fSubTypeButton.setToolTipText(DebugUIMessages.EditLogicalStructureDialog_26);
 
 		Group radioContainer= SWTFactory.createGroup(container, DebugUIMessages.EditLogicalStructureDialog_33, 1, 1, GridData.FILL_HORIZONTAL);
 
 		fValueButton = SWTFactory.createRadioButton(radioContainer, DebugUIMessages.EditLogicalStructureDialog_4);
 		fValueButton.addListener(SWT.Selection, this);
-		
+
 		fVariablesButton = SWTFactory.createRadioButton(radioContainer, DebugUIMessages.EditLogicalStructureDialog_5);
 
 		fAttributesContainer = SWTFactory.createComposite(container, container.getFont(), 2, 1, GridData.FILL_HORIZONTAL);
-		
+
 		boolean isValue = fLogicalStructure.getValue() != null;
 		if (!isValue) {
 			// creates the attribute list if needed
 			createAttributeListWidgets();
 		}
-		
+
 		fCodeGroup = SWTFactory.createGroup(container, "", 1, 1, GridData.FILL_BOTH); //$NON-NLS-1$
 		createCodeGroupWidgets(isValue);
 
 		applyDialogFont(container);
-		
+
 		initializeData();
-		
+
 		return container;
 	}
 
@@ -292,25 +292,25 @@
 	 */
 	private void createCodeGroupWidgets(boolean isValue) {
 		if (isValue) {
-			fCodeGroup.setText(DebugUIMessages.EditLogicalStructureDialog_9); 
+			fCodeGroup.setText(DebugUIMessages.EditLogicalStructureDialog_9);
 		} else {
-			fCodeGroup.setText(DebugUIMessages.EditLogicalStructureDialog_7); 
-		
+			fCodeGroup.setText(DebugUIMessages.EditLogicalStructureDialog_7);
+
 			Composite attributeNameContainer = SWTFactory.createComposite(fCodeGroup, fCodeGroup.getFont(), 2,  1, GridData.FILL_HORIZONTAL);
 			((GridLayout)attributeNameContainer.getLayout()).marginWidth = 0;
-			
+
 			SWTFactory.createLabel(attributeNameContainer, DebugUIMessages.EditLogicalStructureDialog_8, 1);
-			
+
 			fAttributeNameText = SWTFactory.createSingleText(attributeNameContainer, 1);
 			fAttributeNameText.addListener(SWT.Modify, this);
-            
+
 			SWTFactory.createLabel(fCodeGroup, DebugUIMessages.EditLogicalStructureDialog_9, 1);
 		}
-		
+
 		// snippet viewer
 		fSnippetViewer= new JDISourceViewer(fCodeGroup,  null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
 		fSnippetViewer.setInput(this);
-	
+
 		JavaTextTools tools= JDIDebugUIPlugin.getDefault().getJavaTextTools();
 		if (fSnippetDocument == null) {
 			fSnippetDocument= new Document();
@@ -328,7 +328,7 @@
 		fSnippetViewer.configure(fViewerConfiguration);
 		fSnippetViewer.setEditable(true);
 		fSnippetViewer.setDocument(fSnippetDocument);
-		
+
 		Control control= fSnippetViewer.getControl();
 		GridData gd= new GridData(SWT.FILL, SWT.FILL, true, true);
 		gd.heightHint= convertHeightInCharsToPixels(isValue ? 20 : 10);
@@ -354,18 +354,18 @@
 		fAttributeListViewer.setLabelProvider(new AttributesLabelProvider());
 		fAttributeListViewer.setInput(this);
 		fAttributeListViewer.addSelectionChangedListener(this);
-		
+
 		Composite attributeListButtonsCotnainer = SWTFactory.createComposite(fAttributesContainer, fAttributesContainer.getFont(), 1, 1, SWT.NONE);
-		
+
 		fAttributeAddButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_10, DebugUIMessages.EditLogicalStructureDialog_27, null);
 		fAttributeAddButton.addListener(SWT.Selection, this);
-		
+
 		fAttributeRemoveButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_11, DebugUIMessages.EditLogicalStructureDialog_28, null);
 		fAttributeRemoveButton.addListener(SWT.Selection, this);
-		
+
 		fAttributeUpButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_12, DebugUIMessages.EditLogicalStructureDialog_29, null);
 		fAttributeUpButton.addListener(SWT.Selection, this);
-		
+
 		fAttributeDownButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_13, DebugUIMessages.EditLogicalStructureDialog_30, null);
 		fAttributeDownButton.addListener(SWT.Selection, this);
 	}
@@ -425,7 +425,7 @@
 
 	// code for add attribute button
 	private void addAttribute() {
-		String[] newAttribute= new String[] {DebugUIMessages.EditLogicalStructureDialog_14, DebugUIMessages.EditLogicalStructureDialog_15}; // 
+		String[] newAttribute= new String[] {DebugUIMessages.EditLogicalStructureDialog_14, DebugUIMessages.EditLogicalStructureDialog_15}; //
 		fAttributesContentProvider.add(newAttribute);
 		fAttributeListViewer.refresh();
 		fAttributeListViewer.setSelection(new StructuredSelection((Object)newAttribute));
@@ -504,7 +504,7 @@
 				children[i].dispose();
 			}
 		}
-		
+
 		// dispose and recreate the code snippet editor group
 		Control[] children= fCodeGroup.getChildren();
 		for (int i = 0; i < children.length; i++) {
@@ -532,7 +532,7 @@
 			} else {
 				fAttributeListViewer.setSelection(fCurrentAttributeSelection);
 			}
-			
+
 		}
 	}
 
@@ -577,30 +577,30 @@
 	public void checkValues() {
 		StatusInfo status= new StatusInfo();
 		if (fQualifiedTypeNameText.getText().trim().length() == 0) {
-			status.setError(DebugUIMessages.EditLogicalStructureDialog_16); 
+			status.setError(DebugUIMessages.EditLogicalStructureDialog_16);
 		} else if (fDescriptionText.getText().trim().length() == 0) {
-			status.setError(DebugUIMessages.EditLogicalStructureDialog_17); 
+			status.setError(DebugUIMessages.EditLogicalStructureDialog_17);
 		} else if (fValueButton.getSelection() && fSnippetDocument.get().length() == 0) {
-			status.setError(DebugUIMessages.EditLogicalStructureDialog_18); 
+			status.setError(DebugUIMessages.EditLogicalStructureDialog_18);
 		} else if (fVariablesButton.getSelection()) {
 			Object[] elements= fAttributesContentProvider.getElements(null);
 			boolean oneElementSelected= fCurrentAttributeSelection.size() == 1;
 			if (elements.length == 0) {
-				status.setError(DebugUIMessages.EditLogicalStructureDialog_19); 
+				status.setError(DebugUIMessages.EditLogicalStructureDialog_19);
 			} else if (oneElementSelected && fAttributeNameText.getText().trim().length() == 0) {
-				status.setError(DebugUIMessages.EditLogicalStructureDialog_20); 
+				status.setError(DebugUIMessages.EditLogicalStructureDialog_20);
 			} else if (oneElementSelected && fSnippetDocument.get().trim().length() == 0) {
-				status.setError(DebugUIMessages.EditLogicalStructureDialog_21); 
+				status.setError(DebugUIMessages.EditLogicalStructureDialog_21);
 			} else {
 				for (int i= 0; i < elements.length; i++) {
 					String[] variable= (String[]) elements[i];
 					if (variable[0].trim().length() == 0) {
-						status.setError(DebugUIMessages.EditLogicalStructureDialog_22); 
+						status.setError(DebugUIMessages.EditLogicalStructureDialog_22);
 						break;
 					}
 					if (variable[1].trim().length() == 0) {
 						if (!oneElementSelected || fCurrentAttributeSelection.getFirstElement() != variable) {
-							status.setError(NLS.bind(DebugUIMessages.EditLogicalStructureDialog_23, new String[] {variable[0]})); 
+							status.setError(NLS.bind(DebugUIMessages.EditLogicalStructureDialog_23, new String[] {variable[0]}));
 							break;
 						}
 					}
@@ -609,7 +609,7 @@
 		}
 		if (!status.isError()) {
 			if (fType == null && fTypeSearched) {
-				status.setWarning(DebugUIMessages.EditLogicalStructureDialog_24); 
+				status.setWarning(DebugUIMessages.EditLogicalStructureDialog_24);
 			}
 		}
 		updateStatus(status);
@@ -626,26 +626,26 @@
 				SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_ALL_TYPES,
                 false, fQualifiedTypeNameText.getText());
 		} catch (JavaModelException jme) {
-			String title= DebugUIMessages.DetailFormatterDialog_Select_type_6; 
-			String message= DebugUIMessages.DetailFormatterDialog_Could_not_open_type_selection_dialog_for_detail_formatters_7; 
+			String title= DebugUIMessages.DetailFormatterDialog_Select_type_6;
+			String message= DebugUIMessages.DetailFormatterDialog_Could_not_open_type_selection_dialog_for_detail_formatters_7;
 			ExceptionHandler.handle(jme, title, message);
 			return;
 		}
-	
-		dialog.setTitle(DebugUIMessages.DetailFormatterDialog_Select_type_8); 
-		dialog.setMessage(DebugUIMessages.DetailFormatterDialog_Select_a_type_to_format_when_displaying_its_detail_9); 
+
+		dialog.setTitle(DebugUIMessages.DetailFormatterDialog_Select_type_8);
+		dialog.setMessage(DebugUIMessages.DetailFormatterDialog_Select_a_type_to_format_when_displaying_its_detail_9);
 		if (dialog.open() == IDialogConstants.CANCEL_ID) {
 			return;
 		}
-		
+
 		Object[] types= dialog.getResult();
 		if (types != null && types.length > 0) {
 			fType = (IType)types[0];
 			fQualifiedTypeNameText.setText(fType.getFullyQualifiedName());
 			fTypeSearched = true;
-		}		
+		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
 	 */
@@ -653,7 +653,7 @@
 	public void documentAboutToBeChanged(DocumentEvent event) {
 		// nothing to do
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
 	 */
@@ -661,7 +661,7 @@
 	public void documentChanged(DocumentEvent event) {
 		checkValues();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
 	 */
@@ -700,7 +700,7 @@
 		final IProgressMonitor monitor = new NullProgressMonitor();
 		final SearchRequestor collector = new SearchRequestor() {
 			private boolean fFirst= true;
-			
+
 			@Override
 			public void endReporting() {
 				checkValues();
@@ -720,7 +720,7 @@
 				monitor.setCanceled(true);
 			}
 		};
-		
+
 		SearchEngine engine= new SearchEngine(JavaCore.getWorkingCopies(null));
 		SearchPattern searchPattern = SearchPattern.createPattern(pattern, IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE);
 		IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
@@ -732,7 +732,7 @@
 		} catch (OperationCanceledException e){
 		}
 	}
-	
+
 	/**
 	 * Return the type object which corresponds to the given name.
 	 * @return the {@link IType}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ErrorDialogWithToggle.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ErrorDialogWithToggle.java
index 19c6cd4..3cfcf8b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ErrorDialogWithToggle.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ErrorDialogWithToggle.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jface.dialogs.ErrorDialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
@@ -25,7 +25,7 @@
 /**
  * An error dialog which allows the user to set
  * a boolean preference.
- * 
+ *
  * This is typically used to set a preference that
  * determines if the dialog should be shown in
  * the future
@@ -63,21 +63,21 @@
 		applyDialogFont(dialogComposite);
 		return dialogComposite;
 	}
-	
+
 	/**
-	 * Creates a button with the given label and sets the default 
+	 * Creates a button with the given label and sets the default
 	 * configuration data.
 	 */
 	private Button createCheckButton(Composite parent, String label) {
 		Button button= new Button(parent, SWT.CHECK | SWT.LEFT);
-		button.setText(label);		
+		button.setText(label);
 
 		GridData data = new GridData(SWT.NONE);
 		data.horizontalSpan= 2;
 		data.horizontalAlignment= GridData.CENTER;
 		button.setLayoutData(data);
 		button.setFont(parent.getFont());
-		
+
 		return button;
 	}
 
@@ -88,7 +88,7 @@
 		}
 		super.buttonPressed(id);
 	}
-	
+
 	private void storePreference() {
 		fStore.setValue(fPreferenceKey, !getToggleButton().getSelection());
 	}
@@ -100,7 +100,7 @@
 	protected void setToggleButton(Button button) {
 		fToggleButton = button;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextManager.java
index 4784cb9..aedb75c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextManager.java
@@ -36,12 +36,12 @@
 /**
  * Manages the current evaluation context (stack frame) for evaluation actions.
  * In each page, the selection is tracked in each debug view (if any). When a stack
- * frame selection exists, the "debuggerActive" System property is set to true. 
+ * frame selection exists, the "debuggerActive" System property is set to true.
  */
 public class EvaluationContextManager implements IWindowListener, IDebugContextListener {
 
 	private static EvaluationContextManager fgManager;
-	
+
 	/**
 	 * System property indicating a stack frame is selected in the debug view with an
 	 * <code>IJavaStackFrame</code> adapter.
@@ -55,20 +55,20 @@
 	/**
 	 * System property indicating the frame in the debug view supports 'force return'
 	 */
-	private static final String SUPPORTS_FORCE_RETURN = JDIDebugUIPlugin.getUniqueIdentifier() + ".supportsForceReturn"; //$NON-NLS-1$	
+	private static final String SUPPORTS_FORCE_RETURN = JDIDebugUIPlugin.getUniqueIdentifier() + ".supportsForceReturn"; //$NON-NLS-1$
 	/**
 	 * System property indicating whether the frame in the debug view supports instance and reference retrieval (1.5 VMs and later).
 	 */
 	private static final String SUPPORTS_INSTANCE_RETRIEVAL = JDIDebugUIPlugin.getUniqueIdentifier() + ".supportsInstanceRetrieval"; //$NON-NLS-1$
-	
+
 	private Map<IWorkbenchPage, IJavaStackFrame> fContextsByPage = null;
-	
+
 	private IWorkbenchWindow fActiveWindow;
-	
+
 	private EvaluationContextManager() {
 		DebugUITools.getDebugContextManager().addDebugContextListener(this);
 	}
-	
+
 	public static void startup() {
 		Runnable r = new Runnable() {
 			@Override
@@ -78,11 +78,11 @@
 					IWorkbench workbench = PlatformUI.getWorkbench();
 					IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
 					for (int i = 0; i < windows.length; i++) {
-						fgManager.windowOpened(windows[i]);	
+						fgManager.windowOpened(windows[i]);
 					}
 					workbench.addWindowListener(fgManager);
 					fgManager.fActiveWindow = workbench.getActiveWorkbenchWindow();
-				}				
+				}
 			}
 		};
 		JDIDebugUIPlugin.getStandardDisplay().asyncExec(r);
@@ -120,13 +120,13 @@
 	/**
 	 * Sets the evaluation context for the given page, and notes that
 	 * a valid execution context exists.
-	 * 
+	 *
 	 * @param page
 	 * @param frame
 	 */
 	private void setContext(IWorkbenchPage page, IJavaStackFrame frame, boolean instOf) {
 		if (fContextsByPage == null) {
-			fContextsByPage = new HashMap<IWorkbenchPage, IJavaStackFrame>();
+			fContextsByPage = new HashMap<>();
 		}
 		fContextsByPage.put(page, frame);
 		System.setProperty(DEBUGGER_ACTIVE, "true"); //$NON-NLS-1$
@@ -150,7 +150,7 @@
 	/**
 	 * Removes an evaluation context for the given page, and determines if
 	 * any valid execution context remain.
-	 * 
+	 *
 	 * @param page
 	 */
 	private void removeContext(IWorkbenchPage page) {
@@ -164,7 +164,7 @@
 			}
 		}
 	}
-	
+
 	private static IJavaStackFrame getContext(IWorkbenchPage page) {
 		if (fgManager != null) {
 			if (fgManager.fContextsByPage != null) {
@@ -173,7 +173,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the evaluation context for the given part, or <code>null</code> if none.
 	 * The evaluation context corresponds to the selected stack frame in the following
@@ -183,7 +183,7 @@
 	 * <li>stack frame in active page of other window</li>
 	 * <li>stack frame in page of other windows</li>
 	 * </ol>
-	 * 
+	 *
 	 * @param part the part that the evaluation action was invoked from
 	 * @return the stack frame that supplies an evaluation context, or <code>null</code>
 	 *   if none
@@ -206,7 +206,7 @@
 	 * <li>stack frame in active page of another window</li>
 	 * <li>stack frame in a page of another window</li>
 	 * </ol>
-	 * 
+	 *
 	 * @param window the window that the evaluation action was invoked from, or
 	 *  <code>null</code> if the current window should be consulted
 	 * @return the stack frame that supplies an evaluation context, or <code>null</code>
@@ -214,13 +214,13 @@
 	 * @return IJavaStackFrame
 	 */
 	public static IJavaStackFrame getEvaluationContext(IWorkbenchWindow window) {
-		List<IWorkbenchWindow> alreadyVisited= new ArrayList<IWorkbenchWindow>();
+		List<IWorkbenchWindow> alreadyVisited= new ArrayList<>();
 		if (window == null) {
 			window = fgManager.fActiveWindow;
 		}
 		return getEvaluationContext(window, alreadyVisited);
 	}
-	
+
 	private static IJavaStackFrame getEvaluationContext(IWorkbenchWindow window, List<IWorkbenchWindow> alreadyVisited) {
 		IWorkbenchPage activePage = window.getActivePage();
 		IJavaStackFrame frame = null;
@@ -237,9 +237,9 @@
 					}
 				}
 			}
-			
+
 			alreadyVisited.add(window);
-			
+
 			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
 			for (int i = 0; i < windows.length; i++) {
 				if (!alreadyVisited.contains(windows[i])) {
@@ -253,7 +253,7 @@
 		}
 		return frame;
 	}
-	
+
 	@Override
 	public void debugContextChanged(DebugContextEvent event) {
 		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextStatusHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextStatusHandler.java
index 1b0d3fb..a888fa3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextStatusHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationContextStatusHandler.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
  * Supplies a thread that can be used for an evaluation, given an element
  * from a java debug model. Currently use for logical object structure
  * computations.
- * 
+ *
  * @since 3.0
  */
 public class EvaluationContextStatusHandler implements IStatusHandler {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationStackFrameContextStatusHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationStackFrameContextStatusHandler.java
index 1fd14bd..0f1f2dd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationStackFrameContextStatusHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/EvaluationStackFrameContextStatusHandler.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 /**
  * Supplies the current stack frame context. Currently use for logical object structure
  * computations.
- * 
+ *
  * @since 3.1
  */
 public class EvaluationStackFrameContextStatusHandler implements IStatusHandler {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExceptionHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExceptionHandler.java
index d721d26..d6d7aa7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExceptionHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExceptionHandler.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,11 +30,11 @@
 public class ExceptionHandler {
 
 	private static ExceptionHandler fgInstance= new ExceptionHandler();
-	
+
 	/**
 	 * Handles the given <code>CoreException</code>. The workbench shell is used as a parent
 	 * for the dialog window.
-	 * 
+	 *
 	 * @param e the <code>CoreException</code> to be handled
 	 * @param title the dialog window's window title
 	 * @param message message to be displayed by the dialog window
@@ -42,10 +42,10 @@
 	public static void handle(CoreException e, String title, String message) {
 		handle(e, JDIDebugUIPlugin.getActiveWorkbenchShell(), title, message);
 	}
-	
+
 	/**
-	 * Handles the given <code>CoreException</code>. 
-	 * 
+	 * Handles the given <code>CoreException</code>.
+	 *
 	 * @param e the <code>CoreException</code> to be handled
 	 * @param parent the dialog window's parent shell
 	 * @param title the dialog window's window title
@@ -54,11 +54,11 @@
 	public static void handle(CoreException e, Shell parent, String title, String message) {
 		fgInstance.perform(e, parent, title, message);
 	}
-	
+
 	/**
-	 * Handles the given <code>InvocationTargetException</code>. The workbench shell is used 
+	 * Handles the given <code>InvocationTargetException</code>. The workbench shell is used
 	 * as a parent for the dialog window.
-	 * 
+	 *
 	 * @param e the <code>InvocationTargetException</code> to be handled
 	 * @param title the dialog window's window title
 	 * @param message message to be displayed by the dialog window
@@ -66,10 +66,10 @@
 	public static void handle(InvocationTargetException e, String title, String message) {
 		handle(e, JDIDebugUIPlugin.getActiveWorkbenchShell(), title, message);
 	}
-	
+
 	/**
-	 * Handles the given <code>InvocationTargetException</code>. 
-	 * 
+	 * Handles the given <code>InvocationTargetException</code>.
+	 *
 	 * @param e the <code>InvocationTargetException</code> to be handled
 	 * @param parent the dialog window's parent shell
 	 * @param title the dialog window's window title
@@ -80,7 +80,7 @@
 	}
 
 	//---- Hooks for subclasses to control exception handling ------------------------------------
-	
+
 	protected void perform(CoreException e, Shell shell, String title, String message) {
 		IStatus status= e.getStatus();
 		JDIDebugUIPlugin.log(e);
@@ -104,7 +104,7 @@
 			}
 		}
 	}
-	
+
 	private void displayMessageDialog(String exceptionMessage, Shell shell, String title, String message) {
 		StringWriter msg= new StringWriter();
 		if (message != null) {
@@ -112,11 +112,11 @@
 			msg.write("\n\n"); //$NON-NLS-1$
 		}
 		if (exceptionMessage == null || exceptionMessage.length() == 0) {
-			msg.write(DebugUIMessages.ExceptionHandler_seeErrorLogMessage); 
+			msg.write(DebugUIMessages.ExceptionHandler_seeErrorLogMessage);
 		}
 		else {
 			msg.write(exceptionMessage);
 		}
-		MessageDialog.openError(shell, title, msg.toString());			
-	}	
+		MessageDialog.openError(shell, title, msg.toString());
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExpressionInformationControlCreator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExpressionInformationControlCreator.java
index da64626..42fa337 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExpressionInformationControlCreator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ExpressionInformationControlCreator.java
@@ -52,9 +52,9 @@
 
 /**
  * Creates an information control to display an expression in a hover control.
- * 
+ *
  * @noextend This class is not intended to be subclassed by clients.
- * 
+ *
  * @since 3.3
  */
 public class ExpressionInformationControlCreator implements IInformationControlCreator {
@@ -67,7 +67,7 @@
 		private static final String HEIGHT = "HEIGHT"; //$NON-NLS-1$
 
 		/**
-		 * Dialog setting key for width. 
+		 * Dialog setting key for width.
 		 */
 		private static final String WIDTH = "WIDTH"; //$NON-NLS-1$
 
@@ -75,24 +75,24 @@
 		 * Dialog setting key for tree sash weight
 		 */
 		private static final String SASH_WEIGHT_TREE = "SashWeightTree"; //$NON-NLS-1$
-		
+
 		/**
 		 * Dialog setting key for details sash weight
 		 */
-		private static final String SASH_WEIGHT_DETAILS = "SashWeightDetails"; //$NON-NLS-1$		
-		
+		private static final String SASH_WEIGHT_DETAILS = "SashWeightDetails"; //$NON-NLS-1$
+
 		/**
 		 * Variable to display.
 		 */
 		private IVariable fVariable;
-		
+
 		private IPresentationContext fContext;
 	    private TreeModelViewer fViewer;
 	    private SashForm fSashForm;
 	    private Composite fDetailPaneComposite;
 	    private DetailPaneProxy fDetailPane;
 	    private Tree fTree;
-		    
+
 		/**
 	     * Creates the content for the root element of the tree viewer in the hover
 	     */
@@ -111,7 +111,7 @@
 			protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
 				return new Object[] { fVariable };
 			}
-			
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
 			 */
@@ -120,13 +120,13 @@
 				return true;
 			}
 	    }
-	    
+
 		/**
 		 * Inner class implementing IDetailPaneContainer methods.  Handles changes to detail
 		 * pane and provides limited access to the detail pane proxy.
 		 */
 		private class DetailPaneContainer implements IDetailPaneContainer{
-		
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentPaneID()
 			 */
@@ -134,7 +134,7 @@
 			public String getCurrentPaneID() {
 				return fDetailPane.getCurrentPaneID();
 			}
-		
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentSelection()
 			 */
@@ -142,15 +142,15 @@
 			public IStructuredSelection getCurrentSelection() {
 				return (IStructuredSelection)fViewer.getSelection();
 			}
-		
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#refreshDetailPaneContents()
 			 */
 			@Override
-			public void refreshDetailPaneContents() {		
+			public void refreshDetailPaneContents() {
 				fDetailPane.display(getCurrentSelection());
 			}
-		
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getParentComposite()
 			 */
@@ -158,7 +158,7 @@
 			public Composite getParentComposite() {
 				return fDetailPaneComposite;
 			}
-		
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getWorkbenchPartSite()
 			 */
@@ -166,7 +166,7 @@
 			public IWorkbenchPartSite getWorkbenchPartSite() {
 				return null;
 			}
-		
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#paneChanged(java.lang.String)
 			 */
@@ -177,12 +177,12 @@
 					fDetailPane.getCurrentControl().setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
 				}
 			}
-		
-		}	    
+
+		}
 
 		/**
 		 * Constructs a new control in the given shell.
-		 * 
+		 *
 		 * @param parentShell shell
 		 * @param resize whether resize is supported
 		 */
@@ -190,7 +190,7 @@
 			super(parentShell, resize);
 			create();
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.text.AbstractInformationControl#computeSizeHint()
 		 */
@@ -211,7 +211,7 @@
 
 		/**
 		 * Returns the dialog settings for this hover or <code>null</code> if none
-		 * 
+		 *
 		 * @param create whether to create the settings
 		 */
 		private IDialogSettings getDialogSettings(boolean create) {
@@ -222,10 +222,10 @@
 			}
 			return section;
 		}
-		
+
 		/**
 		 * Returns an integer value in the given dialog settings or -1 if none.
-		 * 
+		 *
 		 * @param settings dialog settings
 		 * @param key key
 		 * @return value or -1 if not present
@@ -237,7 +237,7 @@
 				return -1;
 			}
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.text.AbstractInformationControl#dispose()
 		 */
@@ -250,7 +250,7 @@
 
 		/**
 		 * Persists dialog settings.
-		 * 
+		 *
 		 * @param shell
 		 */
 		private void persistSettings(Shell shell) {
@@ -266,13 +266,13 @@
 				}
 			}
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.text.AbstractInformationControl#setVisible(boolean)
 		 */
 		@Override
 		public void setVisible(boolean visible) {
-			if (!visible) {		
+			if (!visible) {
 				persistSettings(getShell());
 			}
 			super.setVisible(visible);
@@ -299,10 +299,10 @@
 					fContext.setProperty(key, copy.getProperty(key));
 				}
 	        }
-	       
+
 	        fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, fContext);
 	        fViewer.setAutoExpandLevel(1);
-	        
+
 	        if (view != null) {
 	        	// copy over filters
 	        	StructuredViewer structuredViewer = (StructuredViewer) view.getViewer();
@@ -321,10 +321,10 @@
 				gl.marginHeight = 0;
 				gl.marginWidth = 0;
 			}
-	        
+
 	        fDetailPane = new DetailPaneProxy(new DetailPaneContainer());
 	        fDetailPane.display(null); // Bring up the default pane so the user doesn't see an empty composite
-	      
+
 	        fTree = fViewer.getTree();
 	        fTree.addSelectionListener(new SelectionListener() {
 	            @Override
@@ -336,12 +336,12 @@
 	        });
 
 	        initSashWeights();
-	              
+
 	        // add update listener to auto-select and display details of root expression
 	        fViewer.addViewerUpdateListener(new IViewerUpdateListener() {
 				@Override
 				public void viewerUpdatesComplete() {
-				}		
+				}
 				@Override
 				public void viewerUpdatesBegin() {
 				}
@@ -357,12 +357,12 @@
 						fViewer.removeViewerUpdateListener(this);
 					}
 				}
-			});        
-	        
+			});
+
 	        setForegroundColor(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
 	        setBackgroundColor(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
 		}
-		
+
 
 		/**
 	     * Attempts to find an appropriate view to emulate, this will either be the
@@ -383,10 +383,10 @@
 	            return expressionsView;
 	        }
 	        return variablesView;
-	    }	
+	    }
 
 		/**
-	     * Initializes the sash form weights from the preference store (using default values if 
+	     * Initializes the sash form weights from the preference store (using default values if
 	     * no sash weights were stored previously).
 	     */
 	    protected void initSashWeights(){
@@ -401,7 +401,7 @@
 		    	}
 	    	}
 	    }
-	    		
+
 	    /* (non-Javadoc)
 	     * @see org.eclipse.jface.text.AbstractInformationControl#setForegroundColor(org.eclipse.swt.graphics.Color)
 	     */
@@ -411,7 +411,7 @@
 	    	fDetailPaneComposite.setForeground(foreground);
 	    	fTree.setForeground(foreground);
 	    }
-	    
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.text.AbstractInformationControl#setBackgroundColor(org.eclipse.swt.graphics.Color)
 		 */
@@ -421,7 +421,7 @@
 			fDetailPaneComposite.setBackground(background);
 			fTree.setBackground(background);
 		}
-	
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.text.AbstractInformationControl#setFocus()
 		 */
@@ -430,7 +430,7 @@
 			super.setFocus();
 			fTree.setFocus();
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.text.IInformationControlExtension#hasContents()
 		 */
@@ -444,7 +444,7 @@
 		 */
 		@Override
 		public void setInput(Object input) {
-			if (input instanceof IVariable) {	        
+			if (input instanceof IVariable) {
 				fVariable = (IVariable) input;
 		        fViewer.setInput(new TreeRoot());
 			}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/Filter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/Filter.java
index 7e2b692..1b1ae05 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/Filter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/Filter.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 /**
  * Model object that represents a single entry in a filter table.
  */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterLabelProvider.java
index 9285967..c772d2a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterViewerComparator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterViewerComparator.java
index 89c1203..8285e73 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterViewerComparator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/FilterViewerComparator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HeapWalkingPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HeapWalkingPreferencePage.java
index 0e5af43..a249a76 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HeapWalkingPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HeapWalkingPreferencePage.java
@@ -32,7 +32,7 @@
 /**
  * Provides a page for changing the heap walking options. Interacts
  * with the HeapWalkingManager to get/set options.
- * 
+ *
  * @see HeapWalkingManager
  * @since 3.3
  */
@@ -42,15 +42,15 @@
 	private Text fAllReferencesMaxCount;
 	private Text fAllInstancesMaxCount;
 	private Map<Object, String> fErrorMessages;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
 	 */
 	@Override
 	public void init(IWorkbench workbench) {
-		fErrorMessages = new HashMap<Object, String>();
+		fErrorMessages = new HashMap<>();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
@@ -60,24 +60,24 @@
 		// TODO: Help must be updated
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.JAVA_HEAPWALKING_PREFERENCE_PAGE);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
 	 */
 	@Override
 	protected Control createContents(Composite parent) {
-		
+
 		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH);
-		
+
 		SWTFactory.createWrapLabel(comp, DebugUIMessages.HeapWalkingPreferencePage_0, 1, 300);
 		SWTFactory.createVerticalSpacer(comp, 2);
-		
+
 		fShowReferencesInVarView = SWTFactory.createCheckButton(comp, DebugUIMessages.HeapWalkingPreferencePage_5, null, HeapWalkingManager.getDefault().isShowReferenceInVarView(), 1);
 		SWTFactory.createVerticalSpacer(comp, 2);
-		
+
 		Group group = SWTFactory.createGroup(comp, DebugUIMessages.HeapWalkingPreferencePage_3, 2, 1, GridData.FILL_HORIZONTAL);
 		SWTFactory.createLabel(group, DebugUIMessages.HeapWalkingPreferencePage_4, 2);
-		
+
 		SWTFactory.createLabel(group, DebugUIMessages.HeapWalkingPreferencePage_1, 1);
 		fAllInstancesMaxCount = SWTFactory.createSingleText(group, 1);
 		fAllInstancesMaxCount.addModifyListener(new ModifyListener(){
@@ -95,7 +95,7 @@
 			}
 		});
 		fAllInstancesMaxCount.setText("" + HeapWalkingManager.getDefault().getAllInstancesMaxCount()); //$NON-NLS-1$
-		
+
 		SWTFactory.createLabel(group, DebugUIMessages.HeapWalkingPreferencePage_2, 1);
 		fAllReferencesMaxCount = SWTFactory.createSingleText(group, 1);
 		fAllReferencesMaxCount.addModifyListener(new ModifyListener(){
@@ -113,10 +113,10 @@
 			}
 		});
 		fAllReferencesMaxCount.setText("" + HeapWalkingManager.getDefault().getAllReferencesMaxCount()); //$NON-NLS-1$
-		
+
 		return comp;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
 	 */
@@ -143,12 +143,12 @@
 		}
 		return result;
 	}
-	
+
 	/**
 	 * Sets an error message associated with a specific field.  Allows several
 	 * fields to have their own error message.  The dialog's error message will
 	 * be set to the given message.
-	 * 
+	 *
 	 * @param cause The field that the message is associated with
 	 * @param message The error message to display to the user
 	 */
@@ -157,12 +157,12 @@
 		setErrorMessage(message);
 		setValid(false);
 	}
-	
+
 	/**
 	 * Clears the error message associated with the given field.  If there are other
 	 * error messages, one will be displayed to the user.  If there are no more error
 	 * messages, the page becomes valid.
-	 * 
+	 *
 	 * @param cause The field associated with a current error message.
 	 */
 	private void clearErrorMessage(Object cause){
@@ -175,7 +175,7 @@
 			setValid(true);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
 	 */
@@ -183,10 +183,10 @@
 	protected void performDefaults() {
 		HeapWalkingManager.getDefault().resetToDefaultSettings();
 		fAllReferencesMaxCount.setText(Integer.toString(HeapWalkingManager.getDefault().getAllReferencesMaxCount()));
-		fAllInstancesMaxCount.setText(Integer.toString(HeapWalkingManager.getDefault().getAllReferencesMaxCount())); 
+		fAllInstancesMaxCount.setText(Integer.toString(HeapWalkingManager.getDefault().getAllReferencesMaxCount()));
 		fShowReferencesInVarView.setSelection(HeapWalkingManager.getDefault().isShowReferenceInVarView());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HotCodeReplaceErrorDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HotCodeReplaceErrorDialog.java
index 13a74fb..98fe9f8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HotCodeReplaceErrorDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/HotCodeReplaceErrorDialog.java
@@ -35,7 +35,7 @@
 public class HotCodeReplaceErrorDialog extends ErrorDialogWithToggle {
 
 	protected IDebugTarget target;
-	// The IDs of the buttons. Set to the sum of the other possible IDs generated by 
+	// The IDs of the buttons. Set to the sum of the other possible IDs generated by
 	// this dialog to ensure the IDs' uniqueness.
 	protected int TERMINATE_ID= IDialogConstants.OK_ID + IDialogConstants.DETAILS_ID + IDialogConstants.CANCEL_ID;
 	protected int DISCONNECT_ID= TERMINATE_ID + 1;
@@ -43,7 +43,7 @@
 
 	/**
 	 * Creates a new dialog which can terminate, disconnect or restart the given debug target.
-	 * 
+	 *
 	 * @param target the debug target
 	 * @see ErrorDialogWithToggle#ErrorDialogWithToggle(Shell, String, String, IStatus, String, String, IPreferenceStore)
 	 */
@@ -58,17 +58,17 @@
 	@Override
 	protected void createButtonsForButtonBar(Composite parent) {
 		super.createButtonsForButtonBar(parent);
-		getButton(IDialogConstants.OK_ID).setText(DebugUIMessages.HotCodeReplaceErrorDialog_0); 
+		getButton(IDialogConstants.OK_ID).setText(DebugUIMessages.HotCodeReplaceErrorDialog_0);
 		boolean canTerminate= target.canTerminate();
 		boolean canDisconnect= target.canDisconnect();
 		if (canTerminate) {
-			createButton(parent, TERMINATE_ID, DebugUIMessages.HotCodeReplaceErrorDialog_1, false); 
-		} 
+			createButton(parent, TERMINATE_ID, DebugUIMessages.HotCodeReplaceErrorDialog_1, false);
+		}
 		if (canDisconnect) {
-			createButton(parent, DISCONNECT_ID, DebugUIMessages.HotCodeReplaceErrorDialog_3, false); 
+			createButton(parent, DISCONNECT_ID, DebugUIMessages.HotCodeReplaceErrorDialog_3, false);
 		}
 		if (canTerminate && !canDisconnect) {
-			createButton(parent, RESTART_ID, DebugUIMessages.HotCodeReplaceErrorDialog_7, false); 
+			createButton(parent, RESTART_ID, DebugUIMessages.HotCodeReplaceErrorDialog_7, false);
 		}
 		blockMnemonicWithoutModifier(getToggleButton());
 	}
@@ -86,7 +86,7 @@
 
 	/**
 	 * Ensures that simple key presses don't activate the given button.
-	 *  
+	 *
 	 * @param button the button to tweak
 	 * @since 3.6
 	 */
@@ -100,7 +100,7 @@
 			}
 		});
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
 	 */
@@ -115,13 +115,13 @@
 				public void run() {
 					try {
 						if (id == TERMINATE_ID) {
-							operation[0]= DebugUIMessages.HotCodeReplaceErrorDialog_5; 
+							operation[0]= DebugUIMessages.HotCodeReplaceErrorDialog_5;
 							target.terminate();
 						} else if (id == DISCONNECT_ID){
-							operation[0]= DebugUIMessages.HotCodeReplaceErrorDialog_6; 
+							operation[0]= DebugUIMessages.HotCodeReplaceErrorDialog_6;
 							target.disconnect();
 						} else {
-							operation[0]= DebugUIMessages.HotCodeReplaceErrorDialog_8; 
+							operation[0]= DebugUIMessages.HotCodeReplaceErrorDialog_8;
 							ILaunch launch = target.getLaunch();
 							launch.terminate();
 							ILaunchConfiguration config = launch.getLaunchConfiguration();
@@ -136,7 +136,7 @@
 			};
 			BusyIndicator.showWhile(getShell().getDisplay(), r);
 			if (ex[0] != null) {
-				JDIDebugUIPlugin.statusDialog(NLS.bind(DebugUIMessages.HotCodeReplaceErrorDialog_2, operation), ex[0].getStatus()); 
+				JDIDebugUIPlugin.statusDialog(NLS.bind(DebugUIMessages.HotCodeReplaceErrorDialog_2, operation), ex[0].getStatus());
 			}
 			okPressed();
 		} else {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIPreferencesConstants.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIPreferencesConstants.java
index 7114cf7..07b52ef 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIPreferencesConstants.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIPreferencesConstants.java
@@ -12,179 +12,179 @@
 package org.eclipse.jdt.internal.debug.ui;
 
 import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
- 
+
 /**
  * Defines constants which are used to refer to values in the plugin's preference store.
  */
 public interface IJDIPreferencesConstants {
-	
+
 	/**
 	 * Boolean preference controlling whether to suspend
 	 * execution when an uncaught Java exceptions encountered
 	 * (while debugging).
-	 */	
+	 */
 	public static final String PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS= IJavaDebugUIConstants.PLUGIN_ID + ".javaDebug.SuspendOnUncaughtExceptions"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference controlling whether to suspend
 	 * execution when a compilation error is encountered
 	 * (while debugging).
 	 */
 	public static final String PREF_SUSPEND_ON_COMPILATION_ERRORS= IJavaDebugUIConstants.PLUGIN_ID + ".suspend_on_compilation_errors"; //$NON-NLS-1$
-		
+
 	/**
 	 * Boolean preference controlling whether synthetic
 	 * methods are to be filtered when stepping (and step
 	 * filters are enabled).
-	 */	
+	 */
 	public static final String PREF_FILTER_SYNTHETICS = IJavaDebugUIConstants.PLUGIN_ID + ".filter_synthetics"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference controlling whether static
 	 * initializers are to be filtered when stepping (and step
 	 * filters are enabled).
-	 */		
+	 */
 	public static final String PREF_FILTER_STATIC_INITIALIZERS = IJavaDebugUIConstants.PLUGIN_ID + ".filter_statics"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference controlling whether simple getters
 	 * are to be filtered when stepping (and step
 	 * filters are enabled).
-	 */			
+	 */
 	public static final String PREF_FILTER_GETTERS = IJavaDebugUIConstants.PLUGIN_ID + ".filter_get"; //$NON-NLS-1$
 
 	/**
 	 * Boolean preference controlling whether simple setters
 	 * are to be filtered when stepping (and step
 	 * filters are enabled).
-	 */			
+	 */
 	public static final String PREF_FILTER_SETTERS = IJavaDebugUIConstants.PLUGIN_ID + ".filter_setters"; //$NON-NLS-1$
 
 	/**
 	 * Boolean preference controlling whether constructors
 	 * are to be filtered when stepping (and step
 	 * filters are enabled).
-	 */			
+	 */
 	public static final String PREF_FILTER_CONSTRUCTORS = IJavaDebugUIConstants.PLUGIN_ID + ".filter_constructors"; //$NON-NLS-1$
 
-	
+
 	/**
 	 * Boolean preference controlling whether a step landing in a filtered
 	 * location proceeds through to an un-filtered location, or returns.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String PREF_STEP_THRU_FILTERS = IJavaDebugUIConstants.PLUGIN_ID + ".step_thru_filters"; //$NON-NLS-1$
-	
+
 	/**
 	 * List of active step filters. A String containing a comma
 	 * separated list of fully qualified type names/patterns.
-	 */			
+	 */
 	public static final String PREF_ACTIVE_FILTERS_LIST = IJavaDebugUIConstants.PLUGIN_ID + ".active_filters"; //$NON-NLS-1$
-	
+
 	/**
 	 * List of inactive step filters. A String containing a comma
 	 * separated list of fully qualified type names/patterns.
-	 */				
-	public static final String PREF_INACTIVE_FILTERS_LIST = IJavaDebugUIConstants.PLUGIN_ID + ".inactive_filters"; //$NON-NLS-1$	
-	
+	 */
+	public static final String PREF_INACTIVE_FILTERS_LIST = IJavaDebugUIConstants.PLUGIN_ID + ".inactive_filters"; //$NON-NLS-1$
+
 	/**
 	 * Boolean preference controlling whether to alert
 	 * with a dialog when hot code replace fails.
-	 */	
+	 */
 	public static final String PREF_ALERT_HCR_FAILED = IJavaDebugUIConstants.PLUGIN_ID + ".javaDebug.alertHCRFailed"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference controlling whether to alert
 	 * with a dialog when hot code replace is not supported.
-	 */	
+	 */
 	public static final String PREF_ALERT_HCR_NOT_SUPPORTED = IJavaDebugUIConstants.PLUGIN_ID + ".javaDebug.alertHCRNotSupported"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference controlling whether to alert
-	 * with a dialog when hot code replace results in 
+	 * with a dialog when hot code replace results in
 	 * obsolete methods.
-	 */	
+	 */
 	public static final String PREF_ALERT_OBSOLETE_METHODS = IJavaDebugUIConstants.PLUGIN_ID + "javaDebug.alertObsoleteMethods"; //$NON-NLS-1$
-	
+
 	/**
-	 * Boolean preference controlling whether the debugger shows 
+	 * Boolean preference controlling whether the debugger shows
 	 * qualifed names. When <code>true</code> the debugger
 	 * will show qualified names in newly opened views.
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static final String PREF_SHOW_QUALIFIED_NAMES= IJavaDebugUIConstants.PLUGIN_ID + ".show_qualified_names"; //$NON-NLS-1$
-	
+
 	/**
 	 * List of defined detail formatters.A String containing a comma
 	 * separated list of fully qualified type names, the associated
 	 * code snippet and an 'enabled' flag.
 	 */
 	public static final String PREF_DETAIL_FORMATTERS_LIST= IJavaDebugUIConstants.PLUGIN_ID + ".detail_formatters"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference indicating whether (non-final) static varibles should be shown
 	 * in variable views. A view may over-ride this preference, and if so, stores
 	 * its preference, prefixed by view id.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String PREF_SHOW_STATIC_VARIABLES= IJavaDebugUIConstants.PLUGIN_ID + ".show_static_variables"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference indicating whether constant (final static) varibles should be shown
 	 * in variable views. A view may over-ride this preference, and if so, stores
 	 * its preference, prefixed by view id.
-	 * 
+	 *
 	 * @since 2.1
-	 */	
+	 */
 	public static final String PREF_SHOW_CONSTANTS= IJavaDebugUIConstants.PLUGIN_ID + ".show_constants"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference indicating whether null array entries should be shown
 	 * in variable views. A view may over-ride this preference, and if so, stores
 	 * its preference, prefixed by view id.
-	 * 
+	 *
 	 * @since 3.0
-	 */	
-	public static final String PREF_SHOW_NULL_ARRAY_ENTRIES = IJavaDebugUIConstants.PLUGIN_ID + ".show_null_entries"; //$NON-NLS-1$	
-	
+	 */
+	public static final String PREF_SHOW_NULL_ARRAY_ENTRIES = IJavaDebugUIConstants.PLUGIN_ID + ".show_null_entries"; //$NON-NLS-1$
+
 	/**
 	 * Boolean preference indicating whether hex values should be shown for primitives
 	 * in variable views. A view may over-ride this preference, and if so, stores
 	 * its preference, prefixed by view id.
-	 * 
+	 *
 	 * @since 2.1
-	 */	
-	public static final String PREF_SHOW_HEX = IJavaDebugUIConstants.PLUGIN_ID + ".show_hex"; //$NON-NLS-1$	
-	
+	 */
+	public static final String PREF_SHOW_HEX = IJavaDebugUIConstants.PLUGIN_ID + ".show_hex"; //$NON-NLS-1$
+
 	/**
 	 * Boolean preference indicating whether char values should be shown for primitives
 	 * in variable views. A view may over-ride this preference, and if so, stores
 	 * its preference, prefixed by view id.
-	 * 
+	 *
 	 * @since 2.1
-	 */	
+	 */
 	public static final String PREF_SHOW_CHAR = IJavaDebugUIConstants.PLUGIN_ID + ".show_char"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference indicating whether unsigned values should be shown for primitives
 	 * in variable views. A view may over-ride this preference, and if so, stores
 	 * its preference, prefixed by view id.
-	 * 
+	 *
 	 * @since 2.1
-	 */	
-	public static final String PREF_SHOW_UNSIGNED = IJavaDebugUIConstants.PLUGIN_ID + ".show_unsigned"; //$NON-NLS-1$	
-	
+	 */
+	public static final String PREF_SHOW_UNSIGNED = IJavaDebugUIConstants.PLUGIN_ID + ".show_unsigned"; //$NON-NLS-1$
+
 	/**
 	 * String preference indication when and where variable details should appear.
-	 * Valid values include: 
+	 * Valid values include:
 	 * <ul>
 	 *   <li><code>INLINE_ALL</code> to show inline details for all variables
 	 *   <li><code>INLINE_FORMATTERS</code> to show inline details for variables with formatters
 	 *   <li><code>DETAIL_PANE</code> to show details only in the detail pane
-	 * </ul> 
+	 * </ul>
 	 */
 	public static final String PREF_SHOW_DETAILS = IJavaDebugUIConstants.PLUGIN_ID + ".show_details"; //$NON-NLS-1$
 	/**
@@ -193,23 +193,23 @@
 	public static final String INLINE_ALL="INLINE_ALL"; //$NON-NLS-1$
 	public static final String INLINE_FORMATTERS="INLINE_FORMATTERS"; //$NON-NLS-1$
 	public static final String DETAIL_PANE="DETAIL_PANE"; //$NON-NLS-1$
-	
+
 	/**
 	 * Common dialog settings
 	 */
 	public static final String DIALOG_ORIGIN_X = "DIALOG_ORIGIN_X"; //$NON-NLS-1$
 	public static final String DIALOG_ORIGIN_Y = "DIALOG_ORIGIN_Y"; //$NON-NLS-1$
 	public static final String DIALOG_WIDTH = "DIALOG_WIDTH"; //$NON-NLS-1$
-	public static final String DIALOG_HEIGHT = "DIALOG_HEIGHT"; //$NON-NLS-1$	
+	public static final String DIALOG_HEIGHT = "DIALOG_HEIGHT"; //$NON-NLS-1$
 
 
 	/**
 	 * Boolean preference controlling whether to alert
 	 * with a dialog when unable to install a breakpoint
 	 * (line info not available, ...)
-	 */	
+	 */
 	public static final String PREF_ALERT_UNABLE_TO_INSTALL_BREAKPOINT = IJavaDebugUIConstants.PLUGIN_ID + ".prompt_unable_to_install_breakpoint"; //$NON-NLS-1$
-	
+
 	public static final String PREF_THREAD_MONITOR_IN_DEADLOCK_COLOR= "org.eclipse.jdt.debug.ui.InDeadlockColor"; //$NON-NLS-1$
 
 	/**
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIStatusConstants.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIStatusConstants.java
index cf0a027..41a34b7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIStatusConstants.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJDIStatusConstants.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJavaDebugHelpContextIds.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJavaDebugHelpContextIds.java
index 753f879..5c0cb92 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJavaDebugHelpContextIds.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/IJavaDebugHelpContextIds.java
@@ -19,10 +19,10 @@
  * This interface contains constants only; it is not intended to be implemented
  * or extended.
  * </p>
- * 
+ *
  */
 public interface IJavaDebugHelpContextIds {
-	
+
 	public static final String PREFIX= IJavaDebugUIConstants.PLUGIN_ID + '.';
 
 	// view parts
@@ -48,7 +48,7 @@
 	public static final String JRE_PREFERENCE_PAGE= PREFIX + "jre_preference_page_context"; //$NON-NLS-1$
 	public static final String JRE_PROFILES_PAGE= PREFIX + "jre_profiles_page_context"; //$NON-NLS-1$
 	public static final String LAUNCH_JRE_PROPERTY_PAGE= PREFIX + "launch_jre_property_page_context"; //$NON-NLS-1$
-	public static final String JAVA_DEBUG_PREFERENCE_PAGE= PREFIX + "java_debug_preference_page_context"; //$NON-NLS-1$	
+	public static final String JAVA_DEBUG_PREFERENCE_PAGE= PREFIX + "java_debug_preference_page_context"; //$NON-NLS-1$
 	public static final String JAVA_STEP_FILTER_PREFERENCE_PAGE= PREFIX + "java_step_filter_preference_page_context"; //$NON-NLS-1$
 	public static final String JAVA_BREAKPOINT_PREFERENCE_PAGE= PREFIX + "java_breakpoint_preference_page_context"; //$NON-NLS-1$
 	public static final String JAVA_DETAIL_FORMATTER_PREFERENCE_PAGE= PREFIX + "java_detail_formatter_preference_page_context"; //$NON-NLS-1$
@@ -61,7 +61,7 @@
 	public static final String JAVA_EXCEPTION_BREAKPOINT_PROPERTY_PAGE = PREFIX + "java_exception_breakpoint_property_page"; //$NON-NLS-1$
 	public static final String JAVA_EXCEPTION_BREAKPOINT_FILTERING_PROPERTY_PAGE = PREFIX + "java_exception_breakpoint_filtering_property_page"; //$NON-NLS-1$
 	public static final String JAVA_LINE_BREAKPOINT_PROPERTY_PAGE = PREFIX + "java_line_breakpoint_property_page"; //$NON-NLS-1$
-	
+
 	// reused ui-blocks
 	public static final String SOURCE_ATTACHMENT_BLOCK= PREFIX + "source_attachment_context"; //$NON-NLS-1$
 	public static final String WORKING_DIRECTORY_BLOCK= PREFIX + "working_directory_context"; //$NON-NLS-1$
@@ -73,7 +73,7 @@
 	public static final String LAUNCH_CONFIGURATION_DIALOG_JRE_TAB= PREFIX + "launch_configuration_dialog_jre_tab"; //$NON-NLS-1$
 	public static final String LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB= PREFIX + "launch_configuration_dialog_main_tab"; //$NON-NLS-1$
 	public static final String LAUNCH_CONFIGURATION_DIALOG_SOURCE_TAB= PREFIX + "launch_configuration_dialog_source_tab"; //$NON-NLS-1$
-	
+
 	// applet launch configuration dialog tabs
 	public static final String LAUNCH_CONFIGURATION_DIALOG_APPLET_MAIN_TAB = PREFIX + "launch_configuration_dialog_applet_main_tab"; //$NON-NLS-1$
 	public static final String LAUNCH_CONFIGURATION_DIALOG_APPLET_ARGUMENTS_TAB = PREFIX + "launch_configuration_dialog_applet_arguments_tab"; //$NON-NLS-1$
@@ -87,7 +87,7 @@
 	public static final String TERMINATE_SCRAPBOOK_VM_ACTION = PREFIX + "terminate_scrapbook_vm_action_context"; //$NON-NLS-1$
 	public static final String SCRAPBOOK_IMPORTS_ACTION = PREFIX + "scrapbook_imports_action_context"; //$NON-NLS-1$
 	public static final String CONSOLE_AUTOFORMAT_STACKTRACES_ACTION = PREFIX + "console_autoformat_stacktraces_action"; //$NON-NLS-1$
-	
+
 	//wizards
 	public static final String ADD_NEW_JRE_WIZARD_PAGE= PREFIX + "add_new_jre_wizard_page_context"; //$NON-NLS-1$
 	public static final String EDIT_JRE_STD_VM_WIZARD_PAGE= PREFIX + "edit_std_vm_jre_wizard_page_context"; //$NON-NLS-1$
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ImageDescriptorRegistry.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ImageDescriptorRegistry.java
index 97b147f..26ac852 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ImageDescriptorRegistry.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ImageDescriptorRegistry.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -28,7 +28,7 @@
 
 	private Map<ImageDescriptor, Image> fRegistry= Collections.synchronizedMap(new HashMap<ImageDescriptor, Image>(10));
 	private Display fDisplay;
-	
+
 	/**
 	 * Creates a new image descriptor registry for the current or default display,
 	 * respectively.
@@ -36,22 +36,22 @@
 	public ImageDescriptorRegistry() {
 		this(JDIDebugUIPlugin.getStandardDisplay());
 	}
-	
+
 	/**
 	 * Creates a new image descriptor registry for the given display. All images
 	 * managed by this registry will be disposed when the display gets disposed.
-	 * 
-	 * @param display the display the images managed by this registry are allocated for 
+	 *
+	 * @param display the display the images managed by this registry are allocated for
 	 */
 	public ImageDescriptorRegistry(Display display) {
 		fDisplay= display;
 		Assert.isNotNull(fDisplay);
 		hookDisplay();
 	}
-	
+
 	/**
 	 * Returns the image associated with the given image descriptor.
-	 * 
+	 *
 	 * @param descriptor the image descriptor for which the registry manages an image
 	 * @return the image associated with the image descriptor or <code>null</code>
 	 *  if the image descriptor can't create the requested image.
@@ -60,13 +60,13 @@
 		if (descriptor == null) {
 			descriptor= ImageDescriptor.getMissingImageDescriptor();
 		}
-			
+
 		Image result= fRegistry.get(descriptor);
 		if (result != null) {
 			return result;
 		}
-	
-		Assert.isTrue(fDisplay == JDIDebugUIPlugin.getStandardDisplay(), DebugUIMessages.ImageDescriptorRegistry_Allocating_image_for_wrong_display_1); 
+
+		Assert.isTrue(fDisplay == JDIDebugUIPlugin.getStandardDisplay(), DebugUIMessages.ImageDescriptorRegistry_Allocating_image_for_wrong_display_1);
 		result= descriptor.createImage();
 		if (result != null) {
 			fRegistry.put(descriptor, result);
@@ -76,7 +76,7 @@
 
 	/**
 	 * Disposes all images managed by this registry.
-	 */	
+	 */
 	public void dispose() {
 		for (Iterator<Image> iter= fRegistry.values().iterator(); iter.hasNext(); ) {
 			Image image= iter.next();
@@ -84,7 +84,7 @@
 		}
 		fRegistry.clear();
 	}
-	
+
 	private void hookDisplay() {
 		fDisplay.asyncExec(new Runnable() {
 			@Override
@@ -93,7 +93,7 @@
 				@Override
 				public void run() {
 					dispose();
-				}	
+				}
 			});
 			}
 		});
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIContentAssistPreference.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIContentAssistPreference.java
index 00cbc99..5d36c9a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIContentAssistPreference.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIContentAssistPreference.java
@@ -30,35 +30,35 @@
 
 
 public class JDIContentAssistPreference {
-	
+
 	private final static String VISIBILITY= "org.eclipse.jdt.core.codeComplete.visibilityCheck"; //$NON-NLS-1$
 	private final static String ENABLED= "enabled"; //$NON-NLS-1$
 	private final static String DISABLED= "disabled"; //$NON-NLS-1$
-	
+
 	private static Color getColor(IPreferenceStore store, String key, IColorManager manager) {
 		RGB rgb= PreferenceConverter.getColor(store, key);
 		return manager.getColor(rgb);
 	}
-	
+
 	private static Color getColor(IPreferenceStore store, String key) {
 		JavaTextTools textTools= JDIDebugUIPlugin.getDefault().getJavaTextTools();
 		return getColor(store, key, textTools.getColorManager());
 	}
-	
+
 	private static JavaDebugContentAssistProcessor getDisplayProcessor(ContentAssistant assistant) {
 		IContentAssistProcessor p= assistant.getContentAssistProcessor(IDocument.DEFAULT_CONTENT_TYPE);
 		if (p instanceof JavaDebugContentAssistProcessor)
 			return  (JavaDebugContentAssistProcessor) p;
 		return null;
 	}
-	
+
 	private static JavaSnippetCompletionProcessor getJavaSnippetProcessor(ContentAssistant assistant) {
 		IContentAssistProcessor p= assistant.getContentAssistProcessor(IDocument.DEFAULT_CONTENT_TYPE);
 		if (p instanceof JavaSnippetCompletionProcessor)
 			return  (JavaSnippetCompletionProcessor) p;
 		return null;
 	}
-	
+
 	private static void configureDisplayProcessor(ContentAssistant assistant, IPreferenceStore store) {
 		JavaDebugContentAssistProcessor dcp= getDisplayProcessor(assistant);
 		if (dcp == null) {
@@ -68,67 +68,67 @@
 		if (triggers != null) {
 			dcp.setCompletionProposalAutoActivationCharacters(triggers.toCharArray());
 		}
-			
+
 		boolean enabled= store.getBoolean(PreferenceConstants.CODEASSIST_SHOW_VISIBLE_PROPOSALS);
 		restrictProposalsToVisibility(enabled);
-		
+
 		enabled= store.getBoolean(PreferenceConstants.CODEASSIST_CASE_SENSITIVITY);
 		restrictProposalsToMatchingCases(enabled);
-		
+
 		enabled= store.getBoolean(PreferenceConstants.CODEASSIST_SORTER);
 		dcp.orderProposalsAlphabetically(enabled);
 	}
-	
+
 	private static void configureJavaSnippetProcessor(ContentAssistant assistant, IPreferenceStore store) {
 		JavaSnippetCompletionProcessor cp= getJavaSnippetProcessor(assistant);
 		if (cp == null) {
 			return;
 		}
-			
+
 		String triggers= store.getString(PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA);
 		if (triggers != null) {
 			cp.setCompletionProposalAutoActivationCharacters(triggers.toCharArray());
 		}
-			
+
 		boolean enabled= store.getBoolean(PreferenceConstants.CODEASSIST_SHOW_VISIBLE_PROPOSALS);
 		restrictProposalsToVisibility(enabled);
-		
+
 		enabled= store.getBoolean(PreferenceConstants.CODEASSIST_CASE_SENSITIVITY);
 		restrictProposalsToMatchingCases(enabled);
-		
+
 		enabled= store.getBoolean(PreferenceConstants.CODEASSIST_SORTER);
 		cp.orderProposalsAlphabetically(enabled);
 	}
-	
+
 	/**
 	 * Configure the given content assistant from the preference store.
 	 */
 	public static void configure(ContentAssistant assistant, IColorManager manager) {
-		
+
 		IPreferenceStore store= getPreferenceStore();
-		
+
 		boolean enabled= store.getBoolean(PreferenceConstants.CODEASSIST_AUTOACTIVATION);
 		assistant.enableAutoActivation(enabled);
-		
+
 		int delay= store.getInt(PreferenceConstants.CODEASSIST_AUTOACTIVATION_DELAY);
 		assistant.setAutoActivationDelay(delay);
-		
+
 		Color c= getColor(store, PreferenceConstants.CODEASSIST_PARAMETERS_FOREGROUND, manager);
 		assistant.setContextInformationPopupForeground(c);
 		assistant.setContextSelectorForeground(c);
-		
+
 		c= getColor(store, PreferenceConstants.CODEASSIST_PARAMETERS_BACKGROUND, manager);
 		assistant.setContextInformationPopupBackground(c);
 		assistant.setContextSelectorBackground(c);
-		
+
 		enabled= store.getBoolean(PreferenceConstants.CODEASSIST_AUTOINSERT);
 		assistant.enableAutoInsert(enabled);
 
 		configureDisplayProcessor(assistant, store);
 		configureJavaSnippetProcessor(assistant, store);
 	}
-	
-	
+
+
 	private static void changeDisplayProcessor(ContentAssistant assistant, IPreferenceStore store, String key) {
 		JavaDebugContentAssistProcessor dcp= getDisplayProcessor(assistant);
 		if (dcp == null) {
@@ -144,7 +144,7 @@
 			dcp.orderProposalsAlphabetically(enable);
 		}
 	}
-	
+
 	private static void changeJavaSnippetProcessor(ContentAssistant assistant, IPreferenceStore store, String key) {
 		JavaSnippetCompletionProcessor cp= getJavaSnippetProcessor(assistant);
 		if (cp == null) {
@@ -160,17 +160,17 @@
 			cp.orderProposalsAlphabetically(enable);
 		}
 	}
-	
-	
+
+
 	/**
 	 * Changes the configuration of the given content assistant according to the given property
 	 * change event.
 	 */
 	public static void changeConfiguration(ContentAssistant assistant, PropertyChangeEvent event) {
-		
+
 		IPreferenceStore store= getPreferenceStore();
 		String p= event.getProperty();
-		
+
 		if (PreferenceConstants.CODEASSIST_AUTOACTIVATION.equals(p)) {
 			boolean enabled= store.getBoolean(PreferenceConstants.CODEASSIST_AUTOACTIVATION);
 			assistant.enableAutoActivation(enabled);
@@ -189,15 +189,15 @@
 			boolean enabled= store.getBoolean(PreferenceConstants.CODEASSIST_AUTOINSERT);
 			assistant.enableAutoInsert(enabled);
 		}
-		
+
 		changeDisplayProcessor(assistant, store, p);
 		changeJavaSnippetProcessor(assistant, store, p);
 	}
-	
+
 	/**
 	 * Tells this processor to restrict its proposal to those element
 	 * visible in the actual invocation context.
-	 * 
+	 *
 	 * @param restrict <code>true</code> if proposals should be restricted
 	 */
 	private static void restrictProposalsToVisibility(boolean restrict) {
@@ -211,17 +211,17 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Tells this processor to restrict is proposals to those
 	 * starting with matching cases.
-	 * 
+	 *
 	 * @param restrict <code>true</code> if proposals should be restricted
 	 */
 	private static void restrictProposalsToMatchingCases(boolean restrict) {
 		// XXX not yet supported
 	}
-	
+
 	private static IPreferenceStore getPreferenceStore() {
 		return PreferenceConstants.getPreferenceStore();
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java
index 23b4675..36d112b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -108,37 +108,37 @@
 	 * for the JDI Debug plug-in.
 	 */
 	private static final String PI_JDI_DEBUG = "org.eclipse.jdt.debug.ui"; //$NON-NLS-1$
-	
+
 	/**
 	 * Id for inspect command.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String COMMAND_INSPECT = "org.eclipse.jdt.debug.ui.commands.Inspect"; //$NON-NLS-1$
-	
+
 	/**
 	 * Java Debug UI plug-in instance
 	 */
 	private static JDIDebugUIPlugin fgPlugin;
-	
+
 	private IDocumentProvider fSnippetDocumentProvider;
-	
+
 	private ImageDescriptorRegistry fImageDescriptorRegistry;
-	
+
 	private ActionFilterAdapterFactory fActionFilterAdapterFactory;
 	private JavaSourceLocationWorkbenchAdapterFactory fSourceLocationAdapterFactory;
 	private JavaBreakpointWorkbenchAdapterFactory fBreakpointAdapterFactory;
-	
+
 	private IDebugModelPresentation fUtilPresentation;
-	
+
 	/**
 	 * Java Debug UI listeners
 	 */
 	private IJavaHotCodeReplaceListener fHCRListener;
-	
+
 	// Map of VMInstallTypeIDs to IConfigurationElements
 	protected Map<String, IConfigurationElement> fVmInstallTypePageMap;
-	
+
 	/**
 	 * Whether this plugin is in the process of shutting
 	 * down.
@@ -149,7 +149,7 @@
 	 * Singleton text tools for debug plug-in.
 	 */
 	private JavaTextTools fTextTools = null;
-	
+
 	/**
 	 * @see Plugin()
 	 */
@@ -157,44 +157,44 @@
 		super();
 		setDefault(this);
 	}
-	
+
 	/**
 	 * Sets the Java Debug UI plug-in instance
-	 * 
+	 *
 	 * @param plugin the plugin instance
 	 */
 	private static void setDefault(JDIDebugUIPlugin plugin) {
 		fgPlugin = plugin;
 	}
-	
+
 	/**
 	 * Returns the Java Debug UI plug-in instance
-	 * 
+	 *
 	 * @return the Java Debug UI plug-in instance
 	 */
 	public static JDIDebugUIPlugin getDefault() {
 		return fgPlugin;
 	}
-	
+
 	/**
 	 * Convenience method which returns the unique identifier of this plugin.
 	 */
 	public static String getUniqueIdentifier() {
 		return PI_JDI_DEBUG;
 	}
-	
+
 	/**
 	 * Logs the specified status with this plug-in's log.
-	 * 
+	 *
 	 * @param status status to log
 	 */
 	public static void log(IStatus status) {
 		getDefault().getLog().log(status);
 	}
-	
+
 	/**
 	 * Logs an internal error with the specified message.
-	 * 
+	 *
 	 * @param message the error message to log
 	 */
 	public static void logErrorMessage(String message) {
@@ -203,22 +203,22 @@
 
 	/**
 	 * Logs an internal error with the specified throwable
-	 * 
+	 *
 	 * @param e the exception to be logged
-	 */	
+	 */
 	public static void log(Throwable e) {
 		log(new Status(IStatus.ERROR, getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Internal Error", e));   //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Returns the active workbench window
-	 * 
+	 *
 	 * @return the active workbench window
 	 */
 	public static IWorkbenchWindow getActiveWorkbenchWindow() {
 		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}	
-	
+	}
+
 	public static IWorkbenchPage getActivePage() {
 		IWorkbenchWindow w = getActiveWorkbenchWindow();
 		if (w != null) {
@@ -226,11 +226,11 @@
 		}
 		return null;
 	}
-	
-	
+
+
 	/**
 	 * Returns the active workbench shell or <code>null</code> if none
-	 * 
+	 *
 	 * @return the active workbench shell or <code>null</code> if none
 	 */
 	public static Shell getActiveWorkbenchShell() {
@@ -239,23 +239,23 @@
 			return window.getShell();
 		}
 		return null;
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#createImageRegistry()
 	 */
 	@Override
 	protected ImageRegistry createImageRegistry() {
 		return JavaDebugImages.getImageRegistry();
-	}	
-	
+	}
+
 	public IDocumentProvider getSnippetDocumentProvider() {
 		if (fSnippetDocumentProvider == null) {
 			fSnippetDocumentProvider= new SnippetFileDocumentProvider();
 		}
 		return fSnippetDocumentProvider;
 	}
-	
+
 	public static void statusDialog(IStatus status) {
 		switch (status.getSeverity()) {
 		case IStatus.ERROR:
@@ -267,7 +267,7 @@
 		case IStatus.INFO:
 			statusDialog(DebugUIMessages.JDIDebugUIPlugin_4, status);
 			break;
-		}		
+		}
 	}
 	public static void statusDialog(String title, IStatus status) {
 		Shell shell = getActiveWorkbenchShell();
@@ -283,13 +283,13 @@
 				MessageDialog.openInformation(shell, title, status.getMessage());
 				break;
 			}
-		}		
+		}
 	}
-		
+
 	/**
 	 * Creates a new internal error status with the specified message and throwable, then displays
 	 * it in a status dialog.
-	 * 
+	 *
 	 * @param message error message
 	 * @param t throwable cause or <code>null</code>
 	 */
@@ -297,7 +297,7 @@
 		IStatus status= new Status(IStatus.ERROR, getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, message, t);
 		statusDialog(status);
 	}
-	
+
 	/**
 	 * Opens an error dialog with the given title and message.
 	 */
@@ -316,7 +316,7 @@
 		}
 		ErrorDialog.openError(shell, title, message, status);
 	}
-	
+
 	/**
 	 * Creates an extension.  If the extension plugin has not
 	 * been loaded a busy cursor will be activated during the duration of
@@ -333,7 +333,7 @@
 		if (bundle.getState() == Bundle.ACTIVE) {
 			return element.createExecutableExtension(classAttribute);
 		}
-		
+
 		final Object [] ret = new Object[1];
 		final CoreException [] exc = new CoreException[1];
 		BusyIndicator.showWhile(null, new Runnable() {
@@ -350,8 +350,8 @@
 			throw exc[0];
 		}
 		return ret[0];
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
 	 */
@@ -371,7 +371,7 @@
 		manager.registerAdapters(fBreakpointAdapterFactory, IJavaBreakpoint.class);
         IAdapterFactory typeFactory = new JavaBreakpointTypeAdapterFactory();
         manager.registerAdapters(typeFactory, IJavaBreakpoint.class);
-        
+
         IAdapterFactory monitorFactory = new MonitorsAdapterFactory();
         manager.registerAdapters(monitorFactory, IJavaThread.class);
         manager.registerAdapters(monitorFactory, JavaContendedMonitor.class);
@@ -379,34 +379,34 @@
         manager.registerAdapters(monitorFactory, JavaOwningThread.class);
         manager.registerAdapters(monitorFactory, JavaWaitingThread.class);
         manager.registerAdapters(monitorFactory, IJavaStackFrame.class);
-        
+
         IAdapterFactory targetFactory = new TargetAdapterFactory();
         manager.registerAdapters(targetFactory, IJavaDebugTarget.class);
-             
+
         IAdapterFactory groupFactory = new ThreadGroupAdapterFactory();
         manager.registerAdapters(groupFactory, IJavaThreadGroup.class);
-        
+
         IAdapterFactory showInFactory = new JavaDebugShowInAdapterFactory();
         manager.registerAdapters(showInFactory, IJavaStackFrame.class);
-        
+
         IAdapterFactory columnFactory = new ColumnPresentationAdapterFactory();
         manager.registerAdapters(columnFactory, IJavaVariable.class);
         manager.registerAdapters(columnFactory, IJavaStackFrame.class);
-        
+
         IAdapterFactory entryFactory = new ClasspathEntryAdapterFactory();
         manager.registerAdapters(entryFactory, DefaultProjectClasspathEntry.class);
-        
+
         IAdapterFactory variableFactory = new JavaDebugElementAdapterFactory();
         manager.registerAdapters(variableFactory, IJavaVariable.class);
         manager.registerAdapters(variableFactory, IJavaValue.class);
         manager.registerAdapters(variableFactory, JavaInspectExpression.class);
-        
+
 		fHCRListener= new JavaHotCodeReplaceListener();
 		JDIDebugModel.addHotCodeReplaceListener(fHCRListener);
-		
+
 		// initialize exception inspector handler
 		new ExceptionInspector();
-		
+
 		ResourcesPlugin.getWorkspace().addSaveParticipant(getUniqueIdentifier(), new ISaveParticipant() {
 			@Override
 			public void doneSaving(ISaveContext sc) {}
@@ -429,7 +429,7 @@
 		});
 		JavaDebugOptionsManager.getDefault().startup();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
 	 */
@@ -448,7 +448,7 @@
 			manager.unregisterAdapters(fBreakpointAdapterFactory);
 			if (fUtilPresentation != null) {
 				fUtilPresentation.dispose();
-			} 
+			}
 			if (fTextTools != null) {
 				fTextTools.dispose();
 			}
@@ -457,7 +457,7 @@
 			super.stop(context);
 		}
 	}
-	
+
 	/**
 	 * Returns whether this plug-in is in the process of
 	 * being shutdown.
@@ -479,7 +479,7 @@
 	private void setShuttingDown(boolean value) {
 		fShuttingDown = value;
 	}
-	
+
 	/**
 	 * Returns the image descriptor registry used for this plugin.
 	 */
@@ -489,7 +489,7 @@
 		}
 		return getDefault().fImageDescriptorRegistry;
 	}
-	
+
 	/**
 	 * Returns the standard display to be used. The method first checks, if
 	 * the thread calling this method has an associated display. If so, this
@@ -501,13 +501,13 @@
 		if (display == null) {
 			display= Display.getDefault();
 		}
-		return display;		
+		return display;
 	}
-	
+
 	/**
 	 * Returns the currently active workbench window shell or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @return the currently active workbench window shell or <code>null</code>
 	 */
 	public static Shell getShell() {
@@ -517,13 +517,13 @@
 			if (windows.length > 0) {
 				return windows[0].getShell();
 			}
-		} 
+		}
 		else {
 			return window.getShell();
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Utility method to create and return a selection dialog that allows
 	 * selection of a specific Java package.  Empty packages are not returned.
@@ -532,7 +532,7 @@
 	 * workspace are considered.
 	 */
 	public static ElementListSelectionDialog createAllPackagesDialog(Shell shell, IJavaProject[] originals, final boolean includeDefaultPackage) throws JavaModelException{
-		final List<IPackageFragment> packageList = new ArrayList<IPackageFragment>();
+		final List<IPackageFragment> packageList = new ArrayList<>();
 		if (originals == null) {
 			IWorkspaceRoot wsroot= ResourcesPlugin.getWorkspace().getRoot();
 			IJavaModel model= JavaCore.create(wsroot);
@@ -545,10 +545,10 @@
 			@Override
 			public void run(IProgressMonitor monitor) {
 				try {
-					Set<String> packageNameSet= new HashSet<String>();
-					monitor.beginTask(DebugUIMessages.JDIDebugUIPlugin_Searching_1, projects.length); 
-					for (int i = 0; i < projects.length; i++) {						
-						IPackageFragment[] pkgs= projects[i].getPackageFragments();	
+					Set<String> packageNameSet= new HashSet<>();
+					monitor.beginTask(DebugUIMessages.JDIDebugUIPlugin_Searching_1, projects.length);
+					for (int i = 0; i < projects.length; i++) {
+						IPackageFragment[] pkgs= projects[i].getPackageFragments();
 						for (int j = 0; j < pkgs.length; j++) {
 							if (monitor.isCanceled()) {
 								monitorCanceled[0] = true;
@@ -587,20 +587,20 @@
 		if (monitorCanceled[0]) {
 			return null;
 		}
-		
+
 		int flags= JavaElementLabelProvider.SHOW_DEFAULT;
 		PackageSelectionDialog dialog= new PackageSelectionDialog(shell, new JavaElementLabelProvider(flags));
 		dialog.setIgnoreCase(false);
 		dialog.setElements(packageList.toArray()); // XXX inefficient
 		return dialog;
 	}
-	
+
 	/**
 	 * Return an object that implements <code>ILaunchConfigurationTab</code> for the
-	 * specified vm install type ID.  
+	 * specified vm install type ID.
 	 */
 	public ILaunchConfigurationTab getVMInstallTypePage(String vmInstallTypeID) {
-		if (fVmInstallTypePageMap == null) {	
+		if (fVmInstallTypePageMap == null) {
 			initializeVMInstallTypePageMap();
 		}
 		IConfigurationElement configElement = fVmInstallTypePageMap.get(vmInstallTypeID);
@@ -608,28 +608,28 @@
 		if (configElement != null) {
 			try {
 				tab = (ILaunchConfigurationTab) configElement.createExecutableExtension("class"); //$NON-NLS-1$
-			} catch(CoreException ce) {			 
+			} catch(CoreException ce) {
 				log(new Status(IStatus.ERROR, getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "An error occurred retrieving a VMInstallType page.", ce));  //$NON-NLS-1$
-			} 
+			}
 		}
 		return tab;
 	}
-	
+
 	protected void initializeVMInstallTypePageMap() {
-		fVmInstallTypePageMap = new HashMap<String, IConfigurationElement>(10);
+		fVmInstallTypePageMap = new HashMap<>(10);
 
 		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(getUniqueIdentifier(), IJavaDebugUIConstants.EXTENSION_POINT_VM_INSTALL_TYPE_PAGE);
 		IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
 		for (int i = 0; i < infos.length; i++) {
 			String id = infos[i].getAttribute("vmInstallTypeID"); //$NON-NLS-1$
 			fVmInstallTypePageMap.put(id, infos[i]);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Returns a shared utility Java debug model presentation. Clients should not
 	 * dispose the presentation.
-	 * 
+	 *
 	 * @return a Java debug model presentation
 	 */
 	public IDebugModelPresentation getModelPresentation() {
@@ -638,10 +638,10 @@
 		}
 		return fUtilPresentation;
 	}
-	
+
 	/**
 	 * Displays the given preference page.
-	 * 
+	 *
 	 * @param id pref page id
 	 * @param page pref page
 	 * @deprecated use <code>JDIDebugUIPlugin#showPreferencePage(String pageId)</code>, which uses the <code>PreferenceUtils</code> framework for opening pages.
@@ -649,7 +649,7 @@
 	@Deprecated
 	public static void showPreferencePage(String id, IPreferencePage page) {
 		final IPreferenceNode targetNode = new PreferenceNode(id, page);
-		
+
 		PreferenceManager manager = new PreferenceManager();
 		manager.addToRoot(targetNode);
 		final PreferenceDialog dialog = new PreferenceDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), manager);
@@ -661,22 +661,22 @@
 				dialog.setMessage(targetNode.getLabelText());
 				result[0]= (dialog.open() == Window.OK);
 			}
-		});		
-	}	
-	
+		});
+	}
+
 	/**
 	 * Displays the given preference page
 	 * @param pageId the fully qualified id of the preference page, e.g. <code>org.eclipse.jdt.debug.ui.preferences.VMPreferencePage</code>
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static void showPreferencePage(String pageId) {
 		PreferencesUtil.createPreferenceDialogOn(getShell(), pageId, new String[] { pageId }, null).open();
 	}
-	
+
 	/**
 	 * Returns the text tools used by this plug-in
-	 * 
+	 *
 	 * @return
 	 */
 	public JavaTextTools getJavaTextTools() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPreferenceInitializer.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPreferenceInitializer.java
index 02f283d..4d279fd 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPreferenceInitializer.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPreferenceInitializer.java
@@ -26,7 +26,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
 	 */
 	@Override
@@ -41,12 +41,12 @@
 		store.setDefault(IJDIPreferencesConstants.PREF_PROMPT_DELETE_CONDITIONAL_BREAKPOINT, true);
 
 		store.setDefault(IJDIPreferencesConstants.PREF_SHOW_QUALIFIED_NAMES, false);
-		
+
 		// JavaStepFilterPreferencePage
 		store.setDefault(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST, "java.lang.ClassLoader"); //$NON-NLS-1$
 		store.setDefault(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST, "com.ibm.*,com.sun.*,java.*,javax.*,jrockit.*,org.omg.*,sun.*,sunw.*"); //$NON-NLS-1$
 		store.setDefault(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS, true);
-		
+
 		store.setDefault(IDebugUIConstants.ID_VARIABLE_VIEW + "." + IJDIPreferencesConstants.PREF_SHOW_CONSTANTS, false); //$NON-NLS-1$
 		store.setDefault(IDebugUIConstants.ID_EXPRESSION_VIEW + "." + IJDIPreferencesConstants.PREF_SHOW_CONSTANTS, false); //$NON-NLS-1$
 		store.setDefault(IDebugUIConstants.ID_VARIABLE_VIEW + "." + IJDIPreferencesConstants.PREF_SHOW_STATIC_VARIABLES, false); //$NON-NLS-1$
@@ -57,7 +57,7 @@
 		store.setDefault(IJDIPreferencesConstants.PREF_SHOW_UNSIGNED, false);
 		store.setDefault(IJDIPreferencesConstants.PREF_SHOW_NULL_ARRAY_ENTRIES, true);
 		store.setDefault(IJDIPreferencesConstants.PREF_SHOW_DETAILS, IJDIPreferencesConstants.DETAIL_PANE);
-		
+
 		store.setDefault(IJavaDebugUIConstants.PREF_SHOW_SYSTEM_THREADS, false);
 		store.setDefault(IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO, true);
 		store.setDefault(IJavaDebugUIConstants.PREF_SHOW_THREAD_GROUPS, false);
@@ -65,10 +65,10 @@
 		store.setDefault(IJavaDebugUIConstants.PREF_ALLINSTANCES_MAX_COUNT, 100);
 		store.setDefault(IJavaDebugUIConstants.PREF_ALLREFERENCES_MAX_COUNT, 100);
 	}
-	
+
 	/**
 	 * Returns the boolean value from the given property change event.
-	 * 
+	 *
 	 * @param event property change event
 	 * @return new boolean value from the event
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIImageDescriptor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIImageDescriptor.java
index e42400f..eefa81b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIImageDescriptor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIImageDescriptor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,6 @@
 
 import org.eclipse.jface.resource.CompositeImageDescriptor;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.ImageData;
 import org.eclipse.swt.graphics.Point;
 
 /**
@@ -21,7 +20,7 @@
  * are computed according to flags set on creation of the descriptor.
  */
 public class JDIImageDescriptor extends CompositeImageDescriptor {
-	
+
 	/** Flag to render the is out of synch adornment */
 	public final static int IS_OUT_OF_SYNCH= 			0x0001;
 	/** Flag to render the may be out of synch adornment */
@@ -42,7 +41,7 @@
 	public final static int UNCAUGHT=					0x0100;
 	/** Flag to render the scoped breakpoint adornment */
 	public final static int SCOPED=						0x0200;
-	
+
 	/** Flag to render the owning a monitor thread adornment */
 	public final static int OWNS_MONITOR=				0x0400;
 	/** Flag to render the owned monitor adornment */
@@ -53,7 +52,7 @@
 	public final static int IN_CONTENTION_FOR_MONITOR=	0x2000;
 	/** Flag to render the in deadlock adornment */
 	public final static int IN_DEADLOCK= 				0x8000;
-	
+
 	/** Flag to render the synchronized stack frame adornment */
 	public final static int SYNCHRONIZED=				0x4000;
 
@@ -66,31 +65,31 @@
 	private ImageDescriptor fBaseImage;
 	private int fFlags;
 	private Point fSize;
-	
+
 	/**
 	 * Create a new JDIImageDescriptor.
-	 * 
+	 *
 	 * @param baseImage an image descriptor used as the base image
 	 * @param flags flags indicating which adornments are to be rendered
-	 * 
+	 *
 	 */
 	public JDIImageDescriptor(ImageDescriptor baseImage, int flags) {
 		setBaseImage(baseImage);
 		setFlags(flags);
 	}
-	
+
 	/**
 	 * @see CompositeImageDescriptor#getSize()
 	 */
 	@Override
 	protected Point getSize() {
 		if (fSize == null) {
-			ImageData data= getBaseImage().getImageData();
-			setSize(new Point(data.width, data.height));
+			CachedImageDataProvider provider = createCachedImageDataProvider(getBaseImage());
+			setSize(new Point(provider.getWidth(), provider.getHeight()));
 		}
 		return fSize;
 	}
-	
+
 	/**
 	 * @see Object#equals(java.lang.Object)
 	 */
@@ -99,11 +98,11 @@
 		if (!(object instanceof JDIImageDescriptor)){
 			return false;
 		}
-			
+
 		JDIImageDescriptor other= (JDIImageDescriptor)object;
 		return (getBaseImage().equals(other.getBaseImage()) && getFlags() == other.getFlags());
 	}
-	
+
 	/**
 	 * @see Object#hashCode()
 	 */
@@ -111,185 +110,181 @@
 	public int hashCode() {
 		return getBaseImage().hashCode() | getFlags();
 	}
-	
+
 	/**
 	 * @see CompositeImageDescriptor#drawCompositeImage(int, int)
 	 */
 	@Override
 	protected void drawCompositeImage(int width, int height) {
-		ImageData bg= getBaseImage().getImageData();
-		if (bg == null) {
-			bg= DEFAULT_IMAGE_DATA;
-		}
-		drawImage(bg, 0, 0);
+		drawImage(createCachedImageDataProvider(getBaseImage()), 0, 0);
 		drawOverlays();
 	}
 
-	private ImageData getImageData(String imageDescriptorKey) {
-		return JavaDebugImages.getImageDescriptor(imageDescriptorKey).getImageData();
+	private ImageDescriptor getImageDescriptor(String imageDescriptorKey) {
+		return JavaDebugImages.getImageDescriptor(imageDescriptorKey);
 	}
 	/**
 	 * Add any overlays to the image as specified in the flags.
 	 */
 	protected void drawOverlays() {
-		int flags= getFlags();
-		int x= 0;
-		int y= 0;
-		ImageData data= null;
+		int flags = getFlags();
+		int x = 0;
+		int y = 0;
+		CachedImageDataProvider provider;
 		if ((flags & IS_OUT_OF_SYNCH) != 0) {
-			x= getSize().x;
-			y= 0;
-			data= getImageData(JavaDebugImages.IMG_OVR_OUT_OF_SYNCH);
-			x -= data.width;
-			drawImage(data, x, y);
+			x = getSize().x;
+			y = 0;
+			provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_OUT_OF_SYNCH));
+			x -= provider.getWidth();
+			drawImage(provider, x, y);
 		} else if ((flags & MAY_BE_OUT_OF_SYNCH) != 0) {
-			x= getSize().x;
-			y= 0;
-			data= getImageData(JavaDebugImages.IMG_OVR_MAY_BE_OUT_OF_SYNCH);
-			x -= data.width;
-			drawImage(data, x, y);
+			x = getSize().x;
+			y = 0;
+			provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_MAY_BE_OUT_OF_SYNCH));
+			x -= provider.getWidth();
+			drawImage(provider, x, y);
 		} else if ((flags & SYNCHRONIZED) != 0) {
-			x= getSize().x;
-			y= 0;
-			data= getImageData(JavaDebugImages.IMG_OVR_SYNCHRONIZED);
-			x -= data.width;
-			drawImage(data, x, y);
+			x = getSize().x;
+			y = 0;
+			provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_SYNCHRONIZED));
+			x -= provider.getWidth();
+			drawImage(provider, x, y);
 		} else {
 			if ((flags & IN_DEADLOCK) != 0) {
-				x= 0;
-				y= 0;
-				data= getImageData(JavaDebugImages.IMG_OVR_IN_DEADLOCK);
-				drawImage(data, x, y);
+				x = 0;
+				y = 0;
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_IN_DEADLOCK));
+				drawImage(provider, x, y);
 			}
 			if ((flags & TRIGGER_POINT) != 0) {
 				x = getSize().x;
 				y = getSize().y;
-				data = getImageData(JavaDebugImages.IMG_OVR_IN_TRIGGER_POINT);
-				x -= data.width;
-				y -= data.height;
-				drawImage(data, x, y);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_IN_TRIGGER_POINT));
+				x -= provider.getWidth();
+				y -= provider.getHeight();
+				drawImage(provider, x, y);
 			} else if ((flags & TRIGGER_SUPPRESSED) != 0) {
 				x = getSize().x;
 				y = getSize().y;
-				data = getImageData(JavaDebugImages.IMG_OVR_TRIGGER_SUPPRESSED);
-				x -= data.width;
-				y -= data.height;
-				drawImage(data, x, y);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_TRIGGER_SUPPRESSED));
+				x -= provider.getWidth();
+				y -= provider.getHeight();
+				drawImage(provider, x, y);
 			}
 			if ((flags & OWNED_MONITOR) != 0) {
-				x= getSize().x;
-				y= getSize().y;
-				data= getImageData(JavaDebugImages.IMG_OVR_OWNED);
-				x -= data.width;
-				y -= data.height;
-				drawImage(data, x, y);
+				x = getSize().x;
+				y = getSize().y;
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_OWNED));
+				x -= provider.getWidth();
+				y -= provider.getHeight();
+				drawImage(provider, x, y);
 			} else if ((flags & CONTENTED_MONITOR) != 0) {
-				x= getSize().x;
-				y= getSize().y;
-				data= getImageData(JavaDebugImages.IMG_OVR_IN_CONTENTION);
-				x -= data.width;
-				y -= data.height;
-				drawImage(data, x, y);
+				x = getSize().x;
+				y = getSize().y;
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_IN_CONTENTION));
+				x -= provider.getWidth();
+				y -= provider.getHeight();
+				drawImage(provider, x, y);
 			} else if ((flags & OWNS_MONITOR) != 0) {
-				x= getSize().x;
-				y= 0;
-				data= getImageData(JavaDebugImages.IMG_OVR_OWNS_MONITOR);
-				x -= data.width;
-				drawImage(data, x, y);
+				x = getSize().x;
+				y = 0;
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_OWNS_MONITOR));
+				x -= provider.getWidth();
+				drawImage(provider, x, y);
 			} else if ((flags & IN_CONTENTION_FOR_MONITOR) != 0) {
-				x= getSize().x;
-				y= 0;
-				data= getImageData(JavaDebugImages.IMG_OVR_IN_CONTENTION_FOR_MONITOR);
-				x -= data.width;
-				drawImage(data, x, y);
+				x = getSize().x;
+				y = 0;
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_IN_CONTENTION_FOR_MONITOR));
+				x -= provider.getWidth();
+				drawImage(provider, x, y);
 			} else {
 				drawBreakpointOverlays();
 			}
 		}
 	}
-	
+
 	protected void drawBreakpointOverlays() {
 		int flags= getFlags();
 		int x= 0;
 		int y= 0;
-		ImageData data= null;
+		CachedImageDataProvider provider;
 		if ((flags & INSTALLED) != 0) {
 			x= 0;
 			y= getSize().y;
 			if ((flags & ENABLED) !=0) {
-				data= getImageData(JavaDebugImages.IMG_OVR_BREAKPOINT_INSTALLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_BREAKPOINT_INSTALLED));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_BREAKPOINT_INSTALLED_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_BREAKPOINT_INSTALLED_DISABLED));
 			}
-				
-			y -= data.height;
-			drawImage(data, x, y);
+
+			y -= provider.getHeight();
+			drawImage(provider, x, y);
 		}
 		if ((flags & CAUGHT) != 0) {
 			if ((flags & ENABLED) !=0) {
-			data= getImageData(JavaDebugImages.IMG_OVR_CAUGHT_BREAKPOINT);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_CAUGHT_BREAKPOINT));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_CAUGHT_BREAKPOINT_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_CAUGHT_BREAKPOINT_DISABLED));
 			}
 			x= 0;
 			y= 0;
-			drawImage(data, x, y);
+			drawImage(provider, x, y);
 		}
 		if ((flags & UNCAUGHT) != 0) {
 			if ((flags & ENABLED) !=0) {
-				data= getImageData(JavaDebugImages.IMG_OVR_UNCAUGHT_BREAKPOINT);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_UNCAUGHT_BREAKPOINT));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_UNCAUGHT_BREAKPOINT_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_UNCAUGHT_BREAKPOINT_DISABLED));
 			}
-			x= data.width;
-			y= data.height;
-			drawImage(data, x, y);
+			x = provider.getWidth();
+			y = provider.getHeight();
+			drawImage(provider, x, y);
 		}
 		if ((flags & SCOPED) != 0) {
 			if ((flags & ENABLED) !=0) {
-				data= getImageData(JavaDebugImages.IMG_OVR_SCOPED_BREAKPOINT);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_SCOPED_BREAKPOINT));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_SCOPED_BREAKPOINT_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_SCOPED_BREAKPOINT_DISABLED));
 			}
 			x= 0;
 			y= getSize().y;
-			y-= data.height;
-			drawImage(data, x, y);
+			y -= provider.getHeight();
+			drawImage(provider, x, y);
 		}
 		if ((flags & CONDITIONAL) != 0) {
 			if ((flags & ENABLED) !=0) {
-				data= getImageData(JavaDebugImages.IMG_OVR_CONDITIONAL_BREAKPOINT);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_CONDITIONAL_BREAKPOINT));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_CONDITIONAL_BREAKPOINT_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_CONDITIONAL_BREAKPOINT_DISABLED));
 			}
 			x= 0;
 			y= 0;
-			drawImage(data, x, y);
+			drawImage(provider, x, y);
 		}
 		if ((flags & ENTRY) != 0) {
 			x= getSize().x;
 			y= 0;
 			if ((flags & ENABLED) !=0) {
-				data= getImageData(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_ENTRY);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_ENTRY));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_ENTRY_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_ENTRY_DISABLED));
 			}
-			x -= data.width;
+			x -= provider.getWidth();
 			x = x - 2;
-			drawImage(data, x, y);
+			drawImage(provider, x, y);
 		}
 		if ((flags & EXIT)  != 0){
 			x= getSize().x;
 			y= getSize().y;
 			if ((flags & ENABLED) != 0) {
-				data= getImageData(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_EXIT);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_EXIT));
 			} else {
-				data= getImageData(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_EXIT_DISABLED);
+				provider = createCachedImageDataProvider(getImageDescriptor(JavaDebugImages.IMG_OVR_METHOD_BREAKPOINT_EXIT_DISABLED));
 			}
-			x -= data.width;
+			x -= provider.getWidth();
 			x = x - 2;
-			y -= data.height;
-			drawImage(data, x, y);
+			y -= provider.getHeight();
+			drawImage(provider, x, y);
 		}
 	}
 	protected ImageDescriptor getBaseImage() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java
index a632454..b7f7df0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -115,13 +115,13 @@
 	 * @see #setAttribute(String, Object)
 	 */
 	public final static String DISPLAY_QUALIFIED_NAMES= "DISPLAY_QUALIFIED_NAMES"; //$NON-NLS-1$
-		
-	protected HashMap<String, Object> fAttributes= new HashMap<String, Object>(3);
-	
+
+	protected HashMap<String, Object> fAttributes= new HashMap<>(3);
+
 	static final Point BIG_SIZE= new Point(16, 16);
-	
+
 	private static org.eclipse.jdt.internal.debug.ui.ImageDescriptorRegistry fgDebugImageRegistry;
-	
+
 	/**
 	 * Flag to indicate if image registry's referenced by this model presentation is initialized
 	 */
@@ -135,13 +135,13 @@
 	 * It is not officially supported and might be removed in the future.
 	 * */
 	private static final String BREAKPOINT_LABEL_SUFFIX = "JDT_BREAKPOINT_LABEL_SUFFIX"; //$NON-NLS-1$
-	
+
 	private JavaElementLabelProvider fJavaLabelProvider;
-	
+
 	public JDIModelPresentation() {
 		super();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
 	 */
@@ -161,18 +161,18 @@
 	public void computeDetail(IValue value, IValueDetailListener listener) {
 		IJavaThread thread = getEvaluationThread((IJavaDebugTarget)value.getDebugTarget());
 		if (thread == null) {
-			listener.detailComputed(value, DebugUIMessages.JDIModelPresentation_no_suspended_threads); 
+			listener.detailComputed(value, DebugUIMessages.JDIModelPresentation_no_suspended_threads);
 		} else {
 			JavaDetailFormattersManager.getDefault().computeValueDetail((IJavaValue)value, thread, listener);
 		}
 	}
-	
+
 	/**
 	 * Returns a thread from the specified VM that can be
 	 * used for an evaluation or <code>null</code> if
 	 * none.
-	 * 
-	 * @param debug target the target in which a thread is 
+	 *
+	 * @param debug target the target in which a thread is
 	 * 	required
 	 * @return thread or <code>null</code>
 	 */
@@ -201,7 +201,7 @@
 		}
 		return thread;
 	}
-			
+
 	/**
 	 * @see IDebugModelPresentation#getText(Object)
 	 */
@@ -215,7 +215,7 @@
 				StringBuffer label= new StringBuffer(getStackFrameText((IStackFrame) item));
 				if (item instanceof IJavaStackFrame) {
 					if (((IJavaStackFrame)item).isOutOfSynch()) {
-						label.append(DebugUIMessages.JDIModelPresentation___out_of_synch__1); 
+						label.append(DebugUIMessages.JDIModelPresentation___out_of_synch__1);
 					}
 				}
 				return label.toString();
@@ -240,35 +240,35 @@
 			} else if (item instanceof JavaWaitingThread) {
 				return getJavaWaitingTreadText((JavaWaitingThread)item);
 			} else if (item instanceof NoMonitorInformationElement) {
-                return DebugUIMessages.JDIModelPresentation_5; 
+                return DebugUIMessages.JDIModelPresentation_5;
             } else {
 				StringBuffer label= new StringBuffer();
 				if (item instanceof IJavaThread) {
 					label.append(getThreadText((IJavaThread) item, showQualified));
 					if (((IJavaThread)item).isOutOfSynch()) {
-						label.append(DebugUIMessages.JDIModelPresentation___out_of_synch__1); 
+						label.append(DebugUIMessages.JDIModelPresentation___out_of_synch__1);
 					} else if (((IJavaThread)item).mayBeOutOfSynch()) {
-						label.append(DebugUIMessages.JDIModelPresentation___may_be_out_of_synch__2); 
+						label.append(DebugUIMessages.JDIModelPresentation___may_be_out_of_synch__2);
 					}
 				} else if (item instanceof IJavaDebugTarget) {
 					label.append(getDebugTargetText((IJavaDebugTarget) item));
 					if (((IJavaDebugTarget)item).isOutOfSynch()) {
-						label.append(DebugUIMessages.JDIModelPresentation___out_of_synch__1); 
+						label.append(DebugUIMessages.JDIModelPresentation___out_of_synch__1);
 					} else if (((IJavaDebugTarget)item).mayBeOutOfSynch()) {
-						label.append(DebugUIMessages.JDIModelPresentation___may_be_out_of_synch__2); 
+						label.append(DebugUIMessages.JDIModelPresentation___may_be_out_of_synch__2);
 					}
 				} else if (item instanceof IJavaValue) {
 					label.append(getValueText((IJavaValue) item));
 				}
 				if (item instanceof ITerminate) {
 					if (((ITerminate) item).isTerminated()) {
-						label.insert(0, DebugUIMessages.JDIModelPresentation__terminated__2); 
+						label.insert(0, DebugUIMessages.JDIModelPresentation__terminated__2);
 						return label.toString();
 					}
 				}
 				if (item instanceof IDisconnect) {
 					if (((IDisconnect) item).isDisconnected()) {
-						label.insert(0, DebugUIMessages.JDIModelPresentation__disconnected__4); 
+						label.insert(0, DebugUIMessages.JDIModelPresentation__disconnected__4);
 						return label.toString();
 					}
 				}
@@ -277,31 +277,31 @@
 				}
 			}
 		} catch (CoreException e) {
-			return DebugUIMessages.JDIModelPresentation__not_responding__6; 
+			return DebugUIMessages.JDIModelPresentation__not_responding__6;
 		}
 		return null;
 	}
 
 	private String getJavaOwningTreadText(JavaOwningThread thread) throws CoreException {
-		return getFormattedString(DebugUIMessages.JDIModelPresentation_0, getThreadText(thread.getThread().getThread(), isShowQualifiedNames())); 
+		return getFormattedString(DebugUIMessages.JDIModelPresentation_0, getThreadText(thread.getThread().getThread(), isShowQualifiedNames()));
 	}
 
 	private String getJavaWaitingTreadText(JavaWaitingThread thread) throws CoreException {
-		return getFormattedString(DebugUIMessages.JDIModelPresentation_1, getThreadText(thread.getThread().getThread(), isShowQualifiedNames())); 
+		return getFormattedString(DebugUIMessages.JDIModelPresentation_1, getThreadText(thread.getThread().getThread(), isShowQualifiedNames()));
 	}
 
 	private String getJavaContendedMonitorText(JavaContendedMonitor monitor) throws DebugException {
-		return getFormattedString(DebugUIMessages.JDIModelPresentation_2, getValueText(monitor.getMonitor().getMonitor())); 
+		return getFormattedString(DebugUIMessages.JDIModelPresentation_2, getValueText(monitor.getMonitor().getMonitor()));
 	}
 
 	private String getJavaOwnedMonitorText(JavaOwnedMonitor monitor) throws DebugException {
-		return getFormattedString(DebugUIMessages.JDIModelPresentation_3, getValueText(monitor.getMonitor().getMonitor())); 
+		return getFormattedString(DebugUIMessages.JDIModelPresentation_3, getValueText(monitor.getMonitor().getMonitor()));
 	}
 
 	protected IBreakpoint getBreakpoint(IMarker marker) {
 		return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
 		}
-	
+
 	/**
 	 * Build the text for an IJavaThread.
 	 */
@@ -317,7 +317,7 @@
 		}
 		if (thread.isTerminated()) {
 			key.append("terminated"); //$NON-NLS-1$
-			args = new String[] {thread.getName()}; 
+			args = new String[] {thread.getName()};
 		} else if (thread.isStepping()) {
 			key.append("stepping"); //$NON-NLS-1$
 			args = new String[] {thread.getName()};
@@ -354,7 +354,7 @@
 						String message = problem.getAttribute(IMarker.MESSAGE, DebugUIMessages.JDIModelPresentation_Compilation_error_1);
 						args = new String[] {thread.getName(), message};
 					}
-				}			
+				}
 				// check args == null in case the exception is a compilation error
 				if (breakpoint instanceof IJavaExceptionBreakpoint && args == null) {
 					key.append("_exception"); //$NON-NLS-1$
@@ -399,10 +399,10 @@
 					}
 				} else if (breakpoint instanceof IJavaClassPrepareBreakpoint) {
 					key.append("_classprepare"); //$NON-NLS-1$
-					args = new String[]{thread.getName(), getQualifiedName(breakpoint.getTypeName())}; 
+					args = new String[]{thread.getName(), getQualifiedName(breakpoint.getTypeName())};
 				}
 			}
-	
+
 			if (args == null) {
 				// Otherwise, it's just suspended
 				args =  new String[] {thread.getName()};
@@ -428,14 +428,14 @@
 	protected String getDebugTargetText(IJavaDebugTarget debugTarget) throws DebugException {
 		String labelString= debugTarget.getName();
 		if (debugTarget.isSuspended()) {
-			labelString += DebugUIMessages.JDIModelPresentation_target_suspended; 
+			labelString += DebugUIMessages.JDIModelPresentation_target_suspended;
 		}
 		return labelString;
 	}
 
 	/**
 	 * Build the text for an IJavaValue.
-	 * 
+	 *
 	 * @param value the value to get the text for
 	 * @return the value string
 	 * @throws DebugException if something happens trying to compute the value string
@@ -450,7 +450,7 @@
 			signature= type.getSignature();
 		}
 		if ("V".equals(signature)) { //$NON-NLS-1$
-			valueString= DebugUIMessages.JDIModelPresentation__No_explicit_return_value__30; 
+			valueString= DebugUIMessages.JDIModelPresentation__No_explicit_return_value__30;
 		}
 		boolean isObject= isObjectValue(signature);
 		boolean isArray= value instanceof IJavaArray;
@@ -468,7 +468,7 @@
 				buffer.append(' ');
 			}
 		}
-		
+
 		// Put double quotes around Strings
 		if (valueString != null && (isString || valueString.length() > 0)) {
 			if (isString) {
@@ -479,12 +479,12 @@
 				buffer.append('"');
 				if(value instanceof IJavaObject){
 					buffer.append(" "); //$NON-NLS-1$
-					buffer.append(NLS.bind(DebugUIMessages.JDIModelPresentation_118, new String[]{String.valueOf(((IJavaObject)value).getUniqueId())})); 
+					buffer.append(NLS.bind(DebugUIMessages.JDIModelPresentation_118, new String[]{String.valueOf(((IJavaObject)value).getUniqueId())}));
 				}
 			}
-			
+
 		}
-		
+
 		// show unsigned value second, if applicable
 		if (isShowUnsignedValues()) {
 			buffer= appendUnsignedText(value, buffer);
@@ -499,7 +499,7 @@
 		}
 		return buffer.toString().trim();
 	}
-	
+
 	private StringBuffer appendUnsignedText(IJavaValue value, StringBuffer buffer) throws DebugException {
 		String unsignedText= getValueUnsignedText(value);
 		if (unsignedText != null) {
@@ -507,33 +507,33 @@
 			buffer.append(unsignedText);
 			buffer.append("]"); //$NON-NLS-1$
 		}
-		return buffer;	
+		return buffer;
 	}
-		
+
 	protected StringBuffer appendHexText(IJavaValue value, StringBuffer buffer) throws DebugException {
 		String hexText = getValueHexText(value);
 		if (hexText != null) {
 			buffer.append(" ["); //$NON-NLS-1$
 			buffer.append(hexText);
 			buffer.append("]"); //$NON-NLS-1$
-		}		
+		}
 		return buffer;
 	}
-	
+
 	protected StringBuffer appendCharText(IJavaValue value, StringBuffer buffer) throws DebugException {
 		String charText= getValueCharText(value);
 		if (charText != null) {
 			buffer.append(" ["); //$NON-NLS-1$
 			buffer.append(charText);
 			buffer.append("]"); //$NON-NLS-1$
-		}		
+		}
 		return buffer;
 	}
-	
+
 	/**
 	 * Returns <code>true</code> if the given signature is not <code>null</code> and
 	 * matches the text '&lt;unknown&gt;'
-	 * 
+	 *
 	 * @param signature the signature to compare
 	 * @return <code>true</code> if the signature matches '&lt;unknown&gt;'
 	 * @since 3.6.1
@@ -544,11 +544,11 @@
 		}
 		return JDIDebugModelMessages.JDIDebugElement_unknown.equals(signature);
 	}
-	
+
 	/**
 	 * Given a JNI-style signature String for a IJavaValue, return true
 	 * if the signature represents an Object or an array of Objects.
-	 * 
+	 *
 	 * @param signature the signature to check
 	 * @return <code>true</code> if the signature represents an object <code>false</code> otherwise
 	 */
@@ -558,24 +558,24 @@
 		}
 		String type = Signature.getElementType(signature);
 		char sigchar = type.charAt(0);
-		if(sigchar == Signature.C_UNRESOLVED || 
+		if(sigchar == Signature.C_UNRESOLVED ||
 				sigchar == Signature.C_RESOLVED) {
 			return true;
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Returns whether the image registry's have been retrieved.
-	 * 
+	 *
 	 * @return whether image registry's have been retrieved.
 	 */
 	public static boolean isInitialized() {
 		return fgDebugImageRegistry != null;
 	}
-	
+
 	/**
-	 * Returns the type signature for this value if its type is primitive.  
+	 * Returns the type signature for this value if its type is primitive.
 	 * For non-primitive types, null is returned.
 	 */
 	protected String getPrimitiveValueTypeSignature(IJavaValue value) throws DebugException {
@@ -630,7 +630,7 @@
 		StringBuffer charText = new StringBuffer();
 		if (Character.getType(charValue) == Character.CONTROL) {
 			Character ctrl = new Character((char) (charValue + 64));
-			charText.append('^'); 
+			charText.append('^');
 			charText.append(ctrl);
 			switch (charValue) { // common use
 				case 0: charText.append(" (NUL)"); break; //$NON-NLS-1$
@@ -667,14 +667,14 @@
 
 	/**
 	 * Maps a Java element to an appropriate image.
-	 * 
+	 *
 	 * @see IDebugModelPresentation#getImage(Object)
 	 */
 	@Override
 	public Image getImage(Object item) {
-		
+
 		initImageRegistries();
-		
+
 		try {
 			if (item instanceof JDIReferenceListVariable) {
 				return getReferencesImage(item);
@@ -704,7 +704,7 @@
 				return getDebugElementImage(item);
 			}
 			if (item instanceof IJavaValue) {
-				return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PUBLIC);
+				return JavaUI.getSharedImages().getImage(ISharedImages.IMG_FIELD_PUBLIC);
 			}
 			if (item instanceof IExpression) {
 				return getExpressionImage(item);
@@ -735,7 +735,7 @@
 	 * Initialize image registry's that this model presentation references to
 	 */
 	private synchronized void initImageRegistries() {
-		
+
 		// if not initialized and this is called on the UI thread
 		if (!fInitialized && Thread.currentThread().equals(JDIDebugUIPlugin.getStandardDisplay().getThread())) {
 			// call get image registry's to force them to be created on the UI thread
@@ -803,7 +803,7 @@
 		} else if (breakpoint instanceof IJavaClassPrepareBreakpoint) {
 			return getClassPrepareBreakpointImage((IJavaClassPrepareBreakpoint)breakpoint);
 		}
-		
+
 		if (breakpoint instanceof IJavaLineBreakpoint && BreakpointUtils.isRunToLineBreakpoint((IJavaLineBreakpoint)breakpoint)) {
 			return null;
 		}
@@ -853,10 +853,10 @@
 		} else {
 			descriptor= new JDIImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED), flags);
 		}
-			
+
 		return getDebugImageRegistry().get(descriptor);
 	}
-	
+
 	protected Image getJavaMethodEntryBreakpointImage(IJavaMethodEntryBreakpoint mBreakpoint) throws CoreException {
 		int flags= computeBreakpointAdornmentFlags(mBreakpoint);
 		JDIImageDescriptor descriptor= null;
@@ -865,10 +865,10 @@
 		} else {
 			descriptor= new JDIImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED), flags);
 		}
-			
+
 		return getDebugImageRegistry().get(descriptor);
 	}
-	
+
 	protected Image getClassPrepareBreakpointImage(IJavaClassPrepareBreakpoint breakpoint) throws CoreException {
 		int flags= computeBreakpointAdornmentFlags(breakpoint);
 		JDIImageDescriptor descriptor= null;
@@ -878,8 +878,8 @@
 			descriptor= new JDIImageDescriptor(JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INTERFACE), flags);
 		}
 		return getDebugImageRegistry().get(descriptor);
-	}	
-	
+	}
+
 	protected Image getJavaWatchpointImage(IJavaWatchpoint watchpoint) throws CoreException {
 		int flags= computeBreakpointAdornmentFlags(watchpoint);
 		JDIImageDescriptor descriptor= null;
@@ -911,35 +911,35 @@
 		}
 		return getDebugImageRegistry().get(descriptor);
 	}
-	
+
 	protected Image getVariableImage(IAdaptable element) {
 		JavaElementImageDescriptor descriptor= new JavaElementImageDescriptor(
 			computeBaseImageDescriptor(element), computeAdornmentFlags(element), BIG_SIZE);
-		return JavaPlugin.getImageDescriptorRegistry().get(descriptor);			
+		return JavaPlugin.getImageDescriptorRegistry().get(descriptor);
 	}
-	
+
 	/**
 	 * Returns the image associated with reference variables being used to display
 	 * references to a root object.
-	 * 
+	 *
 	 * @param element
 	 * @return image associated with reference variables
 	 */
 	protected Image getReferencesImage(Object element){
 		return JavaDebugImages.get(JavaDebugImages.IMG_ELCL_ALL_REFERENCES);
 	}
-	
+
 	/**
 	 * Returns the image associated with reference variables being used to display
 	 * references to a root object.
-	 * 
+	 *
 	 * @param element
 	 * @return image associated with reference variables
 	 */
 	protected Image getReferenceImage(Object element){
 		return JavaDebugImages.get(JavaDebugImages.IMG_OBJS_REFERENCE);
-	}	
-	
+	}
+
 	/**
 	 * Returns the image associated with the given element or <code>null</code>
 	 * if none is defined.
@@ -966,7 +966,7 @@
 		JDIImageDescriptor descriptor= new JDIImageDescriptor(image, flags);
 		return getDebugImageRegistry().get(descriptor);
 	}
-	
+
 	/**
 	 * Returns the image associated with the given element or <code>null</code>
 	 * if none is defined.
@@ -1031,7 +1031,7 @@
 		}
 		return 0;
 	}
-	
+
 	/**
 	 * Returns the adornment flags for the given breakpoint.
 	 * These flags are used to render appropriate overlay
@@ -1083,7 +1083,7 @@
 		}
 		return flags;
 	}
-	
+
 	private ImageDescriptor computeBaseImageDescriptor(IAdaptable element) {
 		IJavaVariable javaVariable= element.getAdapter(IJavaVariable.class);
 		if (javaVariable != null) {
@@ -1092,13 +1092,13 @@
 					return JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_OBJS_LOCAL_VARIABLE);
 				}
 				if (javaVariable.isPublic()) {
-					return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_PUBLIC);
+					return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_FIELD_PUBLIC);
 				}
 				if (javaVariable.isProtected()) {
-					return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_PROTECTED);
+					return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_FIELD_PROTECTED);
 				}
 				if (javaVariable.isPrivate()) {
-					return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_PRIVATE);
+					return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_FIELD_PRIVATE);
 				}
 			} catch (DebugException e) {
 			    // no need to log errors - elements may no longer exist by the time we render them
@@ -1112,9 +1112,9 @@
 			}
 			return JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_OBJS_METHOD_RESULT);
 		}
-		return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_DEFAULT);
+		return JavaUI.getSharedImages().getImageDescriptor(ISharedImages.IMG_FIELD_DEFAULT);
 	}
-	
+
 	private int computeAdornmentFlags(IAdaptable element) {
 		int flags= 0;
 		IJavaModifiers javaProperties = element.getAdapter(IJavaModifiers.class);
@@ -1222,7 +1222,7 @@
 	}
 
 	protected String getVariableText(IJavaVariable var) {
-		String varLabel= DebugUIMessages.JDIModelPresentation_unknown_name__1; 
+		String varLabel= DebugUIMessages.JDIModelPresentation_unknown_name__1;
 		try {
 			varLabel= var.getName();
 		} catch (DebugException exception) {
@@ -1235,7 +1235,7 @@
 		}
 		boolean showTypes= isShowVariableTypeNames();
 		StringBuffer buff= new StringBuffer();
-		String typeName= DebugUIMessages.JDIModelPresentation_unknown_type__2; 
+		String typeName= DebugUIMessages.JDIModelPresentation_unknown_type__2;
 		try {
 			typeName= var.getReferenceTypeName();
 			if (showTypes) {
@@ -1260,7 +1260,7 @@
 				}
 			}
 		}
-		
+
 		String valueString= getFormattedValueText(javaValue);
 
 		//do not put the equal sign for array partitions
@@ -1270,16 +1270,16 @@
 		}
 		return buff.toString();
 	}
-	
+
 	/**
 	 * Returns text for the given value based on user preferences to display
 	 * toString() details.
-	 * 
+	 *
 	 * @param javaValue
 	 * @return text
 	 */
 	public String getFormattedValueText(IJavaValue javaValue) {
-		String valueString= DebugUIMessages.JDIModelPresentation_unknown_value__3; 
+		String valueString= DebugUIMessages.JDIModelPresentation_unknown_value__3;
 		if (javaValue != null) {
 			if (isShowLabelDetails(javaValue)) {
 	    		valueString = getVariableDetail(javaValue);
@@ -1292,10 +1292,10 @@
 				} catch (DebugException exception) {
 				}
 			}
-		}		
+		}
 		return valueString;
 	}
-	
+
 	/**
 	 * Returns whether or not details should be shown in the
 	 * label of the given variable.
@@ -1321,7 +1321,7 @@
 		}
 		return showDetails;
 	}
-	
+
 	/**
 	 * Returns the detail value for the given variable or <code>null</code>
 	 * if none can be computed.
@@ -1367,7 +1367,7 @@
 				// ObjectCollectedException is an expected exception which will
 				// occur if the inspected object has been garbage collected.
 				if (exception.getStatus().getException() instanceof ObjectCollectedException) {
-					return DebugUIMessages.JDIModelPresentation__garbage_collected_object__6; 
+					return DebugUIMessages.JDIModelPresentation__garbage_collected_object__6;
 				}
 				throw exception;
 			}
@@ -1393,7 +1393,7 @@
 		snippetBuffer.append('"');
 		snippet = snippetBuffer.toString().replaceAll("[\n\r\t]+", " ");  //$NON-NLS-1$//$NON-NLS-2$
 		buff.append(snippet);
-		
+
 		if (javaValue != null) {
 			String valueString= getValueText(javaValue);
 			if (valueString.length() > 0) {
@@ -1403,9 +1403,9 @@
 		}
 		return buff.toString();
 	}
-	
+
 	protected String getWatchExpressionText(IWatchExpression expression) throws DebugException {
-		return getExpressionText(expression) + (expression.isEnabled() ? "" : DebugUIMessages.JDIModelPresentation_116); //$NON-NLS-1$ 
+		return getExpressionText(expression) + (expression.isEnabled() ? "" : DebugUIMessages.JDIModelPresentation_116); //$NON-NLS-1$
 	}
 
 	/**
@@ -1421,7 +1421,7 @@
 		buffer.insert(firstBracket + 1, Integer.toString(arrayIndex));
 		return buffer.toString();
 	}
-	
+
 	protected String getValueUnsignedText(IJavaValue value) throws DebugException {
 		String sig= getPrimitiveValueTypeSignature(value);
 		if (sig == null) {
@@ -1438,7 +1438,7 @@
 				}
 				if (byteVal < 0) {
 					byteVal = byteVal & 0xFF;
-					return Integer.toString(byteVal);					
+					return Integer.toString(byteVal);
 				}
 			default :
 				return null;
@@ -1475,7 +1475,7 @@
 				// keep only the relevant bits for integer
 				longValue &= 0xFFFFFFFFl;
 				buff.append(Long.toHexString(longValue));
-				break;			
+				break;
 			case 'S' :
 				buff.append("0x"); //$NON-NLS-1$
 				// keep only the relevant bits for short
@@ -1537,10 +1537,10 @@
 	    	// if the breakpoint has been deleted, don't log exception
 	    	IMarker marker = breakpoint.getMarker();
 			if (marker == null || !marker.exists()) {
-	    		return DebugUIMessages.JDIModelPresentation_6; 
+	    		return DebugUIMessages.JDIModelPresentation_6;
 	    	}
 	        JDIDebugUIPlugin.log(e);
-	        return DebugUIMessages.JDIModelPresentation_4; 
+	        return DebugUIMessages.JDIModelPresentation_4;
 	    }
 	}
 
@@ -1566,12 +1566,12 @@
 		appendHitCount(breakpoint, label);
 		appendSuspendPolicy(breakpoint,label);
 		appendThreadFilter(breakpoint, label);
-					
+
 		if (member != null) {
 			label.append(" - "); //$NON-NLS-1$
 			label.append(getJavaLabelProvider().getText(member));
 		}
-		
+
 		return label.toString();
 	}
 
@@ -1589,24 +1589,24 @@
 		}
 		appendThreadFilter(breakpoint, buffer);
 		if (breakpoint.getExclusionFilters().length > 0 || breakpoint.getInclusionFilters().length > 0) {
-			buffer.append(DebugUIMessages.JDIModelPresentation___scoped__1); 
+			buffer.append(DebugUIMessages.JDIModelPresentation___scoped__1);
 		}
 		appendInstanceFilter(breakpoint, buffer);
 		String state= null;
 		boolean c= breakpoint.isCaught();
 		boolean u= breakpoint.isUncaught();
 		if (c && u) {
-			state= DebugUIMessages.JDIModelPresentation_caught_and_uncaught_60; 
+			state= DebugUIMessages.JDIModelPresentation_caught_and_uncaught_60;
 		} else if (c) {
-			state= DebugUIMessages.JDIModelPresentation_caught_61; 
+			state= DebugUIMessages.JDIModelPresentation_caught_61;
 		} else if (u) {
-			state= DebugUIMessages.JDIModelPresentation_uncaught_62; 
+			state= DebugUIMessages.JDIModelPresentation_uncaught_62;
 		}
 		String label= null;
 		if (state == null) {
 			label= buffer.toString();
 		} else {
-			String format= DebugUIMessages.JDIModelPresentation__1____0__63; 
+			String format= DebugUIMessages.JDIModelPresentation__1____0__63;
 			label= NLS.bind(format, new Object[] {state, buffer});
 		}
 		return label;
@@ -1625,15 +1625,15 @@
 		appendThreadFilter(breakpoint, label);
 		appendConditional(breakpoint, label);
 		appendInstanceFilter(breakpoint, label);
-		
+
 		if (member != null) {
 			label.append(" - "); //$NON-NLS-1$
 			label.append(getJavaLabelProvider().getText(member));
 		}
-		
+
 		return label.toString();
 	}
-	
+
 	protected String getClassPrepareBreakpointText(IJavaClassPrepareBreakpoint breakpoint) throws CoreException {
 		String typeName= breakpoint.getTypeName();
 		StringBuffer label = new StringBuffer();
@@ -1643,13 +1643,13 @@
 		appendHitCount(breakpoint, label);
 		appendSuspendPolicy(breakpoint, label);
 		return label.toString();
-	}	
-	
+	}
+
 	protected StringBuffer appendLineNumber(IJavaLineBreakpoint breakpoint, StringBuffer label) throws CoreException {
 		int lineNumber= breakpoint.getLineNumber();
 		if (lineNumber > 0) {
 			label.append(" ["); //$NON-NLS-1$
-			label.append(DebugUIMessages.JDIModelPresentation_line__65); 
+			label.append(DebugUIMessages.JDIModelPresentation_line__65);
 			label.append(' ');
 			label.append(lineNumber);
 			label.append(']');
@@ -1657,19 +1657,19 @@
 		}
 		return label;
 	}
-	
+
 	protected StringBuffer appendHitCount(IJavaBreakpoint breakpoint, StringBuffer label) throws CoreException {
 		int hitCount= breakpoint.getHitCount();
 		if (hitCount > 0) {
 			label.append(" ["); //$NON-NLS-1$
-			label.append(DebugUIMessages.JDIModelPresentation_hit_count__67); 
+			label.append(DebugUIMessages.JDIModelPresentation_hit_count__67);
 			label.append(' ');
 			label.append(hitCount);
 			label.append(']');
 		}
 		return label;
 	}
-	
+
 	protected String getJavaPatternBreakpointText(@SuppressWarnings("deprecation") IJavaPatternBreakpoint breakpoint) throws CoreException {
 		IResource resource= breakpoint.getMarker().getResource();
 		IMember member= BreakpointUtils.getMember(breakpoint);
@@ -1678,12 +1678,12 @@
 		appendHitCount(breakpoint, label);
 		appendSuspendPolicy(breakpoint,label);
 		appendThreadFilter(breakpoint, label);
-					
+
 		if (member != null) {
 			label.append(" - "); //$NON-NLS-1$
 			label.append(getJavaLabelProvider().getText(member));
 		}
-		
+
 		return label.toString();
 	}
 
@@ -1694,15 +1694,15 @@
 		appendHitCount(breakpoint, label);
 		appendSuspendPolicy(breakpoint,label);
 		appendThreadFilter(breakpoint, label);
-					
+
 		if (member != null) {
 			label.append(" - "); //$NON-NLS-1$
 			label.append(getJavaLabelProvider().getText(member));
 		}
-		
+
 		return label.toString();
 	}
-		
+
 	protected String getWatchpointText(IJavaWatchpoint watchpoint) throws CoreException {
 		String typeName= watchpoint.getTypeName();
 		IMember member= BreakpointUtils.getMember(watchpoint);
@@ -1713,18 +1713,18 @@
 		appendHitCount(watchpoint, label);
 		appendSuspendPolicy(watchpoint,label);
 		appendThreadFilter(watchpoint, label);
-		
+
 
 		boolean access= watchpoint.isAccess();
 		boolean modification= watchpoint.isModification();
 		if (access && modification) {
-			label.append(DebugUIMessages.JDIModelPresentation_access_and_modification_70); 
+			label.append(DebugUIMessages.JDIModelPresentation_access_and_modification_70);
 		} else if (access) {
-			label.append(DebugUIMessages.JDIModelPresentation_access_71); 
+			label.append(DebugUIMessages.JDIModelPresentation_access_71);
 		} else if (modification) {
-			label.append(DebugUIMessages.JDIModelPresentation_modification_72); 
+			label.append(DebugUIMessages.JDIModelPresentation_modification_72);
 		}
-		
+
 		label.append(" - "); //$NON-NLS-1$
 		if (member != null) {
 			label.append(getJavaLabelProvider().getText(member));
@@ -1732,8 +1732,8 @@
 			label.append(watchpoint.getFieldName());
 		}
 
-		return label.toString();	
-	}	
+		return label.toString();
+	}
 
 	protected String getMethodBreakpointText(IJavaMethodBreakpoint methodBreakpoint) throws CoreException {
 		String typeName= methodBreakpoint.getTypeName();
@@ -1745,19 +1745,19 @@
 		appendHitCount(methodBreakpoint, label);
 		appendSuspendPolicy(methodBreakpoint,label);
 		appendThreadFilter(methodBreakpoint, label);
-		
+
 
 		boolean entry = methodBreakpoint.isEntry();
 		boolean exit = methodBreakpoint.isExit();
 		if (entry && exit) {
-			label.append(DebugUIMessages.JDIModelPresentation_entry_and_exit); 
+			label.append(DebugUIMessages.JDIModelPresentation_entry_and_exit);
 		} else if (entry) {
-			label.append(DebugUIMessages.JDIModelPresentation_entry); 
+			label.append(DebugUIMessages.JDIModelPresentation_entry);
 		} else if (exit) {
-			label.append(DebugUIMessages.JDIModelPresentation_exit); 
+			label.append(DebugUIMessages.JDIModelPresentation_exit);
 		}
 		appendConditional(methodBreakpoint, label);
-		
+
 		if (member != null) {
 			label.append(" - "); //$NON-NLS-1$
 			label.append(getJavaLabelProvider().getText(member));
@@ -1773,35 +1773,35 @@
 			}
 		}
 
-		return label.toString();	
-	}	
+		return label.toString();
+	}
 
 	protected String getStackFrameText(IStackFrame stackFrame) throws DebugException {
 		IJavaStackFrame frame= stackFrame.getAdapter(IJavaStackFrame.class);
 		if (frame != null) {
 			StringBuffer label= new StringBuffer();
-			
-			String dec= DebugUIMessages.JDIModelPresentation_unknown_declaring_type__4; 
+
+			String dec= DebugUIMessages.JDIModelPresentation_unknown_declaring_type__4;
 			try {
 				dec= frame.getDeclaringTypeName();
 			} catch (DebugException exception) {
 			}
 			if (frame.isObsolete()) {
-				label.append(DebugUIMessages.JDIModelPresentation__obsolete_method_in__1); 
+				label.append(DebugUIMessages.JDIModelPresentation__obsolete_method_in__1);
 				label.append(dec);
 				label.append('>');
 				return label.toString();
 			}
-			
+
 			boolean javaStratum= true;
 			try {
 				javaStratum = frame.getReferenceType().getDefaultStratum().equals("Java"); //$NON-NLS-1$
 			} catch (DebugException e) {
 			}
-			
+
 			if (javaStratum) {
 				// receiver name
-				String rec= DebugUIMessages.JDIModelPresentation_unknown_receiving_type__5; 
+				String rec= DebugUIMessages.JDIModelPresentation_unknown_receiving_type__5;
 				try {
 					rec= frame.getReceivingTypeName();
 				} catch (DebugException exception) {
@@ -1819,7 +1819,7 @@
 				try {
 					label.append(frame.getMethodName());
 				} catch (DebugException exception) {
-					label.append(DebugUIMessages.JDIModelPresentation_unknown_method_name__6); 
+					label.append(DebugUIMessages.JDIModelPresentation_unknown_method_name__6);
 				}
 				try {
 					List<String> args= frame.getArgumentTypeNames();
@@ -1839,7 +1839,7 @@
 						label.append(')');
 					}
 				} catch (DebugException exception) {
-					label.append(DebugUIMessages.JDIModelPresentation__unknown_arguements___7); 
+					label.append(DebugUIMessages.JDIModelPresentation__unknown_arguements___7);
 				}
 			} else {
 				if (isShowQualifiedNames()) {
@@ -1852,39 +1852,39 @@
 			try {
 				int lineNumber= frame.getLineNumber();
 				label.append(' ');
-				label.append(DebugUIMessages.JDIModelPresentation_line__76); 
+				label.append(DebugUIMessages.JDIModelPresentation_line__76);
 				label.append(' ');
 				if (lineNumber >= 0) {
 					label.append(lineNumber);
 				} else {
-					label.append(DebugUIMessages.JDIModelPresentation_not_available); 
+					label.append(DebugUIMessages.JDIModelPresentation_not_available);
 					if (frame.isNative()) {
 						label.append(' ');
-						label.append(DebugUIMessages.JDIModelPresentation_native_method); 
+						label.append(DebugUIMessages.JDIModelPresentation_native_method);
 					}
 				}
 			} catch (DebugException exception) {
-				label.append(DebugUIMessages.JDIModelPresentation__unknown_line_number__8); 
+				label.append(DebugUIMessages.JDIModelPresentation__unknown_line_number__8);
 			}
-			
+
 			if (!frame.wereLocalsAvailable()) {
 				label.append(' ');
-				label.append(DebugUIMessages.JDIModelPresentation_local_variables_unavailable); 
+				label.append(DebugUIMessages.JDIModelPresentation_local_variables_unavailable);
 			}
-			
+
 			return label.toString();
 
 		}
 		return null;
 	}
-	
+
 	protected String getQualifiedName(String qualifiedName) {
 		if (!isShowQualifiedNames()) {
 			return removeQualifierFromGenericName(qualifiedName);
 		}
 		return qualifiedName;
 	}
-	
+
 	/**
 	 * Return the simple generic name from a qualified generic name
 	 */
@@ -1916,7 +1916,7 @@
 		name.append('>');
 		return name.toString();
 	}
-	
+
 	/**
 	 * Return the simple name from a qualified name (non-generic)
 	 */
@@ -1932,7 +1932,7 @@
 	 * Decompose a comma separated list of generic names (String) to a list of generic names (List)
 	 */
 	private List<String> getNameList(String listName) {
-		List<String> names= new ArrayList<String>();
+		List<String> names= new ArrayList<>();
 		StringTokenizer tokenizer= new StringTokenizer(listName, ",<>", true); //$NON-NLS-1$
 		int enclosingLevel= 0;
 		int startPos= 0;
@@ -1972,57 +1972,57 @@
 	public static String getFormattedString(String string, String[] args) {
 		return NLS.bind(string, args);
 	}
-	
+
 	interface IValueDetailProvider {
 		public void computeDetail(IValue value, IJavaThread thread, IValueDetailListener listener) throws DebugException;
 	}
-	
+
 	protected void appendSuspendPolicy(IJavaBreakpoint breakpoint, StringBuffer buffer) throws CoreException {
 		if (breakpoint.getSuspendPolicy() == IJavaBreakpoint.SUSPEND_VM) {
 			buffer.append(' ');
-			buffer.append(DebugUIMessages.JDIModelPresentation_Suspend_VM); 
+			buffer.append(DebugUIMessages.JDIModelPresentation_Suspend_VM);
 		}
 	}
-	
+
 	protected void appendThreadFilter(IJavaBreakpoint breakpoint, StringBuffer buffer) throws CoreException {
 		if (breakpoint.getThreadFilters().length != 0) {
 			buffer.append(' ');
-			buffer.append(DebugUIMessages.JDIModelPresentation_thread_filtered); 
+			buffer.append(DebugUIMessages.JDIModelPresentation_thread_filtered);
 		}
 	}
-	
+
 	protected void appendConditional(IJavaLineBreakpoint breakpoint, StringBuffer buffer) throws CoreException {
 		if (breakpoint.isConditionEnabled() && breakpoint.getCondition() != null) {
 			buffer.append(' ');
-			buffer.append(DebugUIMessages.JDIModelPresentation__conditional__2); 
+			buffer.append(DebugUIMessages.JDIModelPresentation__conditional__2);
 		}
 	}
-	
+
 	protected void appendInstanceFilter(IJavaBreakpoint breakpoint, StringBuffer buffer) throws CoreException {
 		IJavaObject[] instances = breakpoint.getInstanceFilters();
 		for (int i = 0; i < instances.length; i++) {
 			String instanceText= instances[i].getValueString();
 			if (instanceText != null) {
 				buffer.append(' ');
-				buffer.append(NLS.bind(DebugUIMessages.JDIModelPresentation_instance_1, new String[] {instanceText})); 
-			}				
+				buffer.append(NLS.bind(DebugUIMessages.JDIModelPresentation_instance_1, new String[] {instanceText}));
+			}
 		}
 	}
-	
+
 	protected static org.eclipse.jdt.internal.debug.ui.ImageDescriptorRegistry getDebugImageRegistry() {
 		if (fgDebugImageRegistry == null) {
-			fgDebugImageRegistry = JDIDebugUIPlugin.getImageDescriptorRegistry();		
+			fgDebugImageRegistry = JDIDebugUIPlugin.getImageDescriptorRegistry();
 		}
 		return fgDebugImageRegistry;
 	}
 
 	protected JavaElementLabelProvider getJavaLabelProvider() {
 		if (fJavaLabelProvider == null) {
-			fJavaLabelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);		
+			fJavaLabelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
 		}
 		return fJavaLabelProvider;
 	}
-	
+
 	/**
 	 * Returns whether the given field variable has the same name as any variables
 	 */
@@ -2075,7 +2075,7 @@
 	public Color getBackground(Object element) {
 		return null;
 	}
-	
+
 	private ImageDescriptor getImageDescriptor(String key) {
 		return JavaDebugImages.getImageDescriptor(key);
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDISourceViewer.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDISourceViewer.java
index 9d6e4c6..fe7b1e8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDISourceViewer.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDISourceViewer.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -51,15 +51,15 @@
  * the Java UI plugin.
  */
 public class JDISourceViewer extends SourceViewer implements IPropertyChangeListener {
-	
+
 	/**
 	 * BIDI delimtiers.
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	private static final String BIDI_DELIMITERS= "[ \\p{Punct}&&[^_]]"; //$NON-NLS-1$
 
-	
+
 	private Font fFont;
 	private Color fBackgroundColor;
 	private Color fForegroundColor;
@@ -87,7 +87,7 @@
 			}
 		});
 	}
-	
+
 	/**
 	 * Updates the viewer's font to match the preferences.
 	 */
@@ -113,28 +113,28 @@
 		// if all the preferences failed
 		applyFont(JFaceResources.getTextFont());
 	}
-	
+
 	/**
 	 * Sets the current font.
-	 * 
+	 *
 	 * @param font the new font
 	 */
 	private void setFont(Font font) {
 		fFont= font;
 	}
-	
+
 	/**
 	 * Returns the current font.
-	 * 
+	 *
 	 * @return the current font
 	 */
 	private Font getFont() {
 		return fFont;
 	}
-	
+
 	/**
 	 * Sets the font for the given viewer sustaining selection and scroll position.
-	 * 
+	 *
 	 * @param font the font
 	 */
 	private void applyFont(Font font) {
@@ -142,20 +142,20 @@
 		if (doc != null && doc.getLength() > 0) {
 			Point selection= getSelectedRange();
 			int topIndex= getTopIndex();
-			
+
 			StyledText styledText= getTextWidget();
 			styledText.setRedraw(false);
-			
+
 			styledText.setFont(font);
 			setSelectedRange(selection.x , selection.y);
 			setTopIndex(topIndex);
-			
+
 			styledText.setRedraw(true);
 		} else {
 			getTextWidget().setFont(font);
 		}
 	}
-	
+
 	/**
 	 * Updates the given viewer's colors to match the preferences.
 	 */
@@ -171,7 +171,7 @@
 				getForegroundColor().dispose();
 			}
 			setForegroundColor(color);
-			
+
 			color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)
 				? null
 				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, styledText.getDisplay());
@@ -182,7 +182,7 @@
 			setBackgroundColor(color);
 		}
 	}
-	
+
 	/**
 	 * Creates a color from the information stored in the given preference store.
 	 * Returns <code>null</code> if there is no such information available.
@@ -201,10 +201,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the current background color.
-	 * 
+	 *
 	 * @return the current background color
 	 */
 	protected Color getBackgroundColor() {
@@ -213,7 +213,7 @@
 
 	/**
 	 * Sets the current background color.
-	 * 
+	 *
 	 * @param backgroundColor the new background color
 	 */
 	protected void setBackgroundColor(Color backgroundColor) {
@@ -222,7 +222,7 @@
 
 	/**
 	 * Returns the current foreground color.
-	 * 
+	 *
 	 * @return the current foreground color
 	 */
 	protected Color getForegroundColor() {
@@ -231,13 +231,13 @@
 
 	/**
 	 * Sets the current foreground color.
-	 * 
+	 *
 	 * @param foregroundColor the new foreground color
 	 */
 	protected void setForegroundColor(Color foregroundColor) {
 		fForegroundColor = foregroundColor;
 	}
-	
+
 	/**
 	 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
 	 */
@@ -248,7 +248,7 @@
 			JDIContentAssistPreference.changeConfiguration((ContentAssistant) assistant, event);
 		}
 		String property= event.getProperty();
-		
+
 		if (PreferenceConstants.EDITOR_TEXT_FONT.equals(property)) {
 			updateViewerFont();
 		}
@@ -263,10 +263,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the current content assistant.
-	 * 
+	 *
 	 * @return the current content assistant
 	 */
 	public IContentAssistant getContentAssistant() {
@@ -321,10 +321,10 @@
 	private IPreferenceStore getPreferenceStore() {
 		return fStore;
 	}
-	
+
 	/**
 	 * Returns a segmentation of the line of the given document appropriate for Bidi rendering.
-	 * 
+	 *
 	 * @param document the document
 	 * @param baseLevel the base level of the line
 	 * @param lineStart the offset of the line
@@ -413,11 +413,11 @@
 
 	/**
 	 * Checks if the given embedding level is consistent with the base level.
-	 * 
+	 *
 	 * @param level Character embedding level to check.
 	 * @param baseLevel Base level (direction) of the text.
 	 * @return <code>true</code> if the character level is odd and the base level is even OR the character level is even and the base level is odd, and return <code>false</code> otherwise.
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	private static boolean isMismatchingLevel(int level, int baseLevel) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaBreakpointWorkbenchAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaBreakpointWorkbenchAdapterFactory.java
index 6fe66fb..8a0790a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaBreakpointWorkbenchAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaBreakpointWorkbenchAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -90,7 +90,7 @@
 					try {
 						int lineNumber= lineBreakpoint.getLineNumber();
 						if (lineNumber != -1) {
-							label.append(DebugUIMessages.JavaBreakpointWorkbenchAdapterFactory_1); 
+							label.append(DebugUIMessages.JavaBreakpointWorkbenchAdapterFactory_1);
 							label.append(lineNumber);
 							label.append(']');
 						}
@@ -114,10 +114,10 @@
 			public Object getParent(Object o) {
 				return null;
 			}
-			
+
 			protected JavaElementLabelProvider getJavaLabelProvider() {
 				if (fJavaLabelProvider == null) {
-					fJavaLabelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);		
+					fJavaLabelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
 				}
 				return fJavaLabelProvider;
 			}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugHover.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugHover.java
index 06a6429..627e301 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugHover.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugHover.java
@@ -63,9 +63,9 @@
 
 
 public class JavaDebugHover implements IJavaEditorTextHover, ITextHoverExtension, ITextHoverExtension2 {
-    
+
     private IEditorPart fEditor;
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.ui.text.java.hover.IJavaEditorTextHover#setEditor(org.eclipse.ui.IEditorPart)
 	 */
@@ -73,7 +73,7 @@
 	public void setEditor(IEditorPart editor) {
 	    fEditor = editor;
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int)
 	 */
@@ -81,11 +81,11 @@
 	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
 		return JavaWordFinder.findWord(textViewer.getDocument(), offset);
 	}
-	
+
 	/**
 	 * Returns the stack frame in which to search for variables, or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @return the stack frame in which to search for variables, or <code>null</code>
 	 * if none
 	 */
@@ -96,24 +96,24 @@
 		}
 		return null;
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
 	 */
 	@Override
 	public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
 		Object object = getHoverInfo2(textViewer, hoverRegion);
-		if (object instanceof IVariable) {	
+		if (object instanceof IVariable) {
 			IVariable var = (IVariable) object;
 			return getVariableText(var);
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a local variable in the given frame based on the hover region
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @return local variable or <code>null</code>
 	 */
 	private IVariable resolveLocalVariable(IJavaStackFrame frame, ITextViewer textViewer, IRegion hoverRegion) {
@@ -129,11 +129,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a local variable in the given frame based on the the given name
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @return local variable or <code>null</code>
 	 */
 	private IVariable findLocalVariable(IJavaStackFrame frame, String variableName) {
@@ -147,7 +147,7 @@
 			}
 		}
 		return null;
-	}	
+	}
 
 	/**
 	 * Returns HTML text for the given variable
@@ -165,7 +165,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Replaces reserved HTML characters in the given string with
 	 * their escaped equivalents. This is to ensure that variable
@@ -201,7 +201,7 @@
 	 */
 	private static JDIModelPresentation getModelPresentation() {
 		JDIModelPresentation presentation = new JDIModelPresentation();
-		
+
 		String[][] booleanPrefs= {
 				{IJDIPreferencesConstants.PREF_SHOW_QUALIFIED_NAMES, JDIModelPresentation.DISPLAY_QUALIFIED_NAMES}};
 	    String viewId= IDebugUIConstants.ID_VARIABLE_VIEW;
@@ -211,11 +211,11 @@
 		}
 		return presentation;
 	}
-	
+
 	   /**
      * Returns the value of this filters preference (on/off) for the given
      * view.
-     * 
+     *
      * @param part
      * @return boolean
      */
@@ -279,7 +279,7 @@
 		    if (codeAssist == null) {
 		        return resolveLocalVariable(frame, textViewer, hoverRegion);
 		    }
-            
+
             IJavaElement[] resolve = null;
             try {
                 resolve = codeAssist.codeSelect(hoverRegion.getOffset(), 0);
@@ -366,7 +366,7 @@
 								} else if (locationInParent == QualifiedName.NAME_PROPERTY) {
 									return null;
 								}
-            		    		
+
             		    		String typeSignature = Signature.createTypeSignature(field.getDeclaringType().getFullyQualifiedName(), true);
             		    		typeSignature = typeSignature.replace('.', '/');
 								IJavaObject ths = frame.getThis();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java
index bfb7f63..6afe57d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -87,27 +87,27 @@
  * </ul>
  */
 public class JavaDebugOptionsManager implements IDebugEventSetListener, IPropertyChangeListener, IJavaBreakpointListener, ILaunchListener, IBreakpointsListener, IJavaStructuresListener {
-	
+
 	/**
 	 * Singleton options manager
 	 */
 	private static JavaDebugOptionsManager fgOptionsManager = null;
-	
+
 	/**
 	 * Breakpoint used to suspend on uncaught exceptions
 	 */
 	private IJavaExceptionBreakpoint fSuspendOnExceptionBreakpoint = null;
-	
+
 	/**
 	 * Breakpoint used to suspend on compilation errors
 	 */
-	private IJavaExceptionBreakpoint fSuspendOnErrorBreakpoint = null;	
-	
+	private IJavaExceptionBreakpoint fSuspendOnErrorBreakpoint = null;
+
 	/**
 	 * A label provider
 	 */
 	private static ILabelProvider fLabelProvider= DebugUITools.newDebugModelPresentation();
-	
+
 	/**
 	 * Constants indicating whether a breakpoint
 	 * is added, removed, or changed.
@@ -115,41 +115,41 @@
 	private static final int ADDED = 0;
 	private static final int REMOVED = 1;
 	private static final int CHANGED = 2;
-		
+
 	/**
 	 * Local cache of active step filters.
 	 */
 	private String[] fActiveStepFilters = null;
-	
+
 	/**
 	 * Preferences that affect variable display options.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	private static Set<String> fgDisplayOptions;
-	
+
 	static {
-		fgDisplayOptions = new HashSet<String>();
+		fgDisplayOptions = new HashSet<>();
 		fgDisplayOptions.add(IJDIPreferencesConstants.PREF_SHOW_CHAR);
 		fgDisplayOptions.add(IJDIPreferencesConstants.PREF_SHOW_HEX);
 		fgDisplayOptions.add(IJDIPreferencesConstants.PREF_SHOW_UNSIGNED);
 	}
-	
+
 	/**
 	 * Whether the manager has been activated
 	 */
 	private boolean fActivated = false;
-	
+
 	class InitJob extends Job {
-		
+
 		public InitJob() {
-			super(DebugUIMessages.JavaDebugOptionsManager_0); 
+			super(DebugUIMessages.JavaDebugOptionsManager_0);
 		}
-		
+
 		@Override
 		protected IStatus run(IProgressMonitor monitor) {
 			MultiStatus status = new MultiStatus(JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Java debug options failed to initialize", null);  //$NON-NLS-1$
-			// compilation error breakpoint 
+			// compilation error breakpoint
 			try {
 				IJavaExceptionBreakpoint bp = JDIDebugModel.createExceptionBreakpoint(ResourcesPlugin.getWorkspace().getRoot(),"java.lang.Error", true, true, false, false, null); //$NON-NLS-1$
 				bp.setPersisted(false);
@@ -158,7 +158,7 @@
 			} catch (CoreException e) {
 				status.add(e.getStatus());
 			}
-			
+
 			// uncaught exception breakpoint
 			try {
 				IJavaExceptionBreakpoint bp = JDIDebugModel.createExceptionBreakpoint(ResourcesPlugin.getWorkspace().getRoot(),"java.lang.Throwable", false, true, false, false, null); //$NON-NLS-1$
@@ -169,22 +169,22 @@
 			} catch (CoreException e) {
 				status.add(e.getStatus());
 			}
-			
+
 			if (status.getChildren().length == 0) {
 				return Status.OK_STATUS;
 			}
 			return status;
 		}
 	}
-	
+
 	/**
 	 * Not to be instantiated
-	 * 
+	 *
 	 * @see JavaDebugOptionsManager#getDefault();
 	 */
 	private JavaDebugOptionsManager() {
 	}
-	
+
 	/**
 	 * Return the default options manager
 	 */
@@ -194,7 +194,7 @@
 		}
 		return fgOptionsManager;
 	}
-	
+
 	/**
 	 * Called at startup by the Java debug ui plug-in
 	 */
@@ -205,7 +205,7 @@
 		debugPlugin.getBreakpointManager().addBreakpointListener(this);
 		EvaluationContextManager.startup();
 	}
-	
+
 	/**
 	 * Called at shutdown by the Java debug ui plug-in
 	 */
@@ -221,7 +221,7 @@
 		JDIDebugModel.removeJavaBreakpointListener(this);
         JavaLogicalStructures.removeStructuresListener(this);
 		System.getProperties().remove(JDIDebugUIPlugin.getUniqueIdentifier() + ".debuggerActive"); //$NON-NLS-1$
-	}	
+	}
 
 	/**
 	 * Initializes compilation error handling and suspending
@@ -232,11 +232,11 @@
 		job.setSystem(true);
 		job.schedule();
 	}
-						
+
 	/**
 	 * Notifies java debug targets of the given breakpoint
 	 * addition or removal.
-	 * 
+	 *
 	 * @param breakpoint a breakpoint
 	 * @param kind ADDED, REMOVED, or CHANGED
 	 */
@@ -247,18 +247,18 @@
 				IJavaDebugTarget target = (IJavaDebugTarget)targets[i];
 				notifyTarget(target, breakpoint, kind);
 			}
-		}	
+		}
 	}
-	
+
 	/**
 	 * Notifies the give debug target of filter specifications
-	 * 
+	 *
 	 * @param target Java debug target
 	 */
 	protected void notifyTargetOfFilters(IJavaDebugTarget target) {
 
 		IPreferenceStore store = JDIDebugUIPlugin.getDefault().getPreferenceStore();
-		
+
 		target.setFilterConstructors(store.getBoolean(IJDIPreferencesConstants.PREF_FILTER_CONSTRUCTORS));
 		target.setFilterStaticInitializers(store.getBoolean(IJDIPreferencesConstants.PREF_FILTER_STATIC_INITIALIZERS));
 		target.setFilterSynthetics(store.getBoolean(IJDIPreferencesConstants.PREF_FILTER_SYNTHETICS));
@@ -267,8 +267,8 @@
 		target.setStepThruFilters(store.getBoolean(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS));
 		target.setStepFilters(getActiveStepFilters());
 
-	}	
-	
+	}
+
 	/**
 	 * Notifies all targets of current filter specifications.
 	 */
@@ -279,17 +279,17 @@
 				IJavaDebugTarget target = (IJavaDebugTarget)targets[i];
 				notifyTargetOfFilters(target);
 			}
-		}	
-	}		
+		}
+	}
 
 	/**
 	 * Notifies the given target of the given breakpoint
 	 * addition or removal.
-	 * 
+	 *
 	 * @param target Java debug target
 	 * @param breakpoint a breakpoint
 	 * @param kind ADDED, REMOVED, or CHANGED
-	 */	
+	 */
 	protected void notifyTarget(IJavaDebugTarget target, IBreakpoint breakpoint, int kind) {
 		switch (kind) {
 			case ADDED:
@@ -303,7 +303,7 @@
 				break;
 		}
 	}
-	
+
 	/**
 	 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
 	 */
@@ -325,7 +325,7 @@
 				int kind = REMOVED;
 				if (isSuspendOnUncaughtExceptions()) {
 					kind = ADDED;
-				}			
+				}
 				notifyTargets(breakpoint, kind);
 			}
 		} else if (fgDisplayOptions.contains(property)) {
@@ -336,7 +336,7 @@
 			updateActiveFilters();
 		}
 	}
-	
+
 	/**
 	 * Returns whether the given property is a property that affects whether
 	 * or not step filters are used.
@@ -349,7 +349,7 @@
 			property.equals(IJDIPreferencesConstants.PREF_FILTER_SYNTHETICS) ||
 			property.equals(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS);
 	}
-	
+
 	/**
 	 * Returns whether the given property is a property that affects
 	 * the list of active or inactive step filters.
@@ -358,91 +358,91 @@
 		return property.equals(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST) ||
 			property.equals(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST);
 	}
-	
+
 	/**
 	 * Enable/Disable the given breakpoint and notify
 	 * targets of the change.
-	 * 
+	 *
 	 * @param breakpoint a breakpoint
 	 * @param enabled whether enabeld
-	 */ 
+	 */
 	protected void setEnabled(IBreakpoint breakpoint, boolean enabled) {
 		try {
 			breakpoint.setEnabled(enabled);
 			notifyTargets(breakpoint, CHANGED);
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
-		}		
+		}
 	}
-	
+
 	/**
 	 * Returns whether suspend on compilation errors is
 	 * enabled.
-	 * 
+	 *
 	 * @return whether suspend on compilation errors is
 	 * enabled
 	 */
 	public boolean isSuspendOnCompilationErrors() {
 		return JDIDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS);
 	}
-	
+
 	/**
 	 * Returns whether suspend on uncaught exception is
 	 * enabled
-	 * 
+	 *
 	 * @return whether suspend on uncaught exception is
 	 * enabled
 	 */
 	protected boolean isSuspendOnUncaughtExceptions() {
 		return JDIDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS);
-	}	
+	}
 
 
 	/**
 	 * Sets the breakpoint used to suspend on uncaught exceptions
-	 * 
+	 *
 	 * @param breakpoint exception breakpoint
 	 */
 	private void setSuspendOnUncaughtExceptionBreakpoint(IJavaExceptionBreakpoint breakpoint) {
 		fSuspendOnExceptionBreakpoint = breakpoint;
 	}
-	
+
 	/**
 	 * Returns the breakpoint used to suspend on uncaught exceptions
-	 * 
+	 *
 	 * @return exception breakpoint
 	 */
 	protected IJavaExceptionBreakpoint getSuspendOnUncaughtExceptionBreakpoint() {
 		return fSuspendOnExceptionBreakpoint;
-	}	
-	
+	}
+
 	/**
-	 * Sets the breakpoint used to suspend on compilation 
+	 * Sets the breakpoint used to suspend on compilation
 	 * errors.
-	 * 
+	 *
 	 * @param breakpoint exception breakpoint
 	 */
 	private void setSuspendOnCompilationErrorsBreakpoint(IJavaExceptionBreakpoint breakpoint) {
 		fSuspendOnErrorBreakpoint = breakpoint;
 	}
-	
+
 	/**
 	 * Returns the breakpoint used to suspend on compilation
 	 * errors
-	 * 
+	 *
 	 * @return exception breakpoint
 	 */
 	protected IJavaExceptionBreakpoint getSuspendOnCompilationErrorBreakpoint() {
 		return fSuspendOnErrorBreakpoint;
-	}	
-	
+	}
+
 	/**
 	 * Parses the comma separated string into an array of strings
-	 * 
+	 *
 	 * @return list
 	 */
 	public static String[] parseList(String listString) {
-		List<String> list = new ArrayList<String>(10);
+		List<String> list = new ArrayList<>(10);
 		StringTokenizer tokenizer = new StringTokenizer(listString, ","); //$NON-NLS-1$
 		while (tokenizer.hasMoreTokens()) {
 			String token = tokenizer.nextToken();
@@ -450,11 +450,11 @@
 		}
 		return list.toArray(new String[list.size()]);
 	}
-	
+
 	/**
 	 * Serializes the array of strings into one comma
 	 * separated string.
-	 * 
+	 *
 	 * @param list array of strings
 	 * @return a single string composed of the given list
 	 */
@@ -471,10 +471,10 @@
 		}
 		return buffer.toString();
 	}
-	
+
 	/**
 	 * Returns the current list of active step filters.
-	 * 
+	 *
 	 * @return current list of active step filters
 	 */
 	protected String[] getActiveStepFilters() {
@@ -485,7 +485,7 @@
 		}
 		return fActiveStepFilters;
 	}
-	
+
 	/**
 	 * Updates local copy of active step filters and
 	 * notifies targets.
@@ -494,13 +494,13 @@
 		fActiveStepFilters= parseList(JDIDebugUIPlugin.getDefault().getPreferenceStore().getString(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST));
 		notifyTargetsOfFilters();
 	}
-	
+
 	/**
 	 * When a Java debug target is created, install options in
 	 * the target and set that the Java debugger is active.
 	 * When all Java debug targets are terminated set that that Java debugger is
 	 * no longer active.
-	 * 
+	 *
 	 * @see IDebugEventSetListener#handleDebugEvents(DebugEvent[])
 	 */
 	@Override
@@ -511,27 +511,27 @@
 				Object source = event.getSource();
 				if (source instanceof IJavaDebugTarget) {
 					IJavaDebugTarget javaTarget = (IJavaDebugTarget)source;
-					
-					// compilation breakpoints	
+
+					// compilation breakpoints
 					if (isSuspendOnCompilationErrors()) {
 						notifyTarget(javaTarget, getSuspendOnCompilationErrorBreakpoint(), ADDED);
 					}
-					
+
 					// uncaught exception breakpoint
 					if (isSuspendOnUncaughtExceptions()) {
 						ILaunchConfiguration launchConfiguration = javaTarget.getLaunch().getLaunchConfiguration();
 						boolean isSnippetEditor = false;
-						
+
 						try {
 							isSnippetEditor = (launchConfiguration.getAttribute(ScrapbookLauncher.SCRAPBOOK_LAUNCH, (String)null) != null);
 						} catch (CoreException e) {
 						}
-						
-						if (!isSnippetEditor) { 
+
+						if (!isSnippetEditor) {
 							notifyTarget(javaTarget, getSuspendOnUncaughtExceptionBreakpoint(), ADDED);
 						}
 					}
-					
+
 					// step filters
 					notifyTargetOfFilters(javaTarget);
 				}
@@ -553,7 +553,7 @@
 	public int installingBreakpoint(IJavaDebugTarget target, IJavaBreakpoint breakpoint, IJavaType type) {
 		return DONT_CARE;
 	}
-	
+
 	/**
 	 * @see IJavaBreakpointListener#breakpointHit(IJavaThread, IJavaBreakpoint)
 	 */
@@ -575,11 +575,11 @@
 	@Override
 	public void breakpointRemoved(IJavaDebugTarget target, IJavaBreakpoint breakpoint) {
 	}
-	
+
 	/**
 	 * Returns any problem marker associated with the current location
 	 * of the given stack frame, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param frame stack frame
 	 * @return marker representing compilation problem, or <code>null</code>
 	 * @throws DebugException if an exception occurrs retrieveing the problem
@@ -605,8 +605,8 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpointListener#breakpointHasRuntimeException(org.eclipse.jdt.debug.core.IJavaLineBreakpoint, org.eclipse.debug.core.DebugException)
 	 */
@@ -616,12 +616,12 @@
 		Throwable wrappedException= exception.getStatus().getException();
 		if (wrappedException instanceof InvocationException) {
 			InvocationException ie= (InvocationException) wrappedException;
-			ObjectReference ref= ie.exception();		
+			ObjectReference ref= ie.exception();
 			status= new Status(IStatus.ERROR,JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ref.referenceType().name(), null);
 		} else {
 			status= exception.getStatus();
 		}
-		openConditionErrorDialog(breakpoint, DebugUIMessages.JavaDebugOptionsManager_Conditional_breakpoint_encountered_runtime_exception__1, status); 
+		openConditionErrorDialog(breakpoint, DebugUIMessages.JavaDebugOptionsManager_Conditional_breakpoint_encountered_runtime_exception__1, status);
 	}
 
 	/* (non-Javadoc)
@@ -637,9 +637,9 @@
 			message.append("\n "); //$NON-NLS-1$
 		}
 		IStatus status= new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, message.toString(), null);
-		openConditionErrorDialog(breakpoint, DebugUIMessages.JavaDebugOptionsManager_Conditional_breakpoint_has_compilation_error_s___2, status); 
+		openConditionErrorDialog(breakpoint, DebugUIMessages.JavaDebugOptionsManager_Conditional_breakpoint_has_compilation_error_s___2, status);
 	}
-	
+
 	private void openConditionErrorDialog(final IJavaLineBreakpoint breakpoint, final String errorMessage, final IStatus status) {
 		final Display display= JDIDebugUIPlugin.getStandardDisplay();
 		if (display.isDisposed()) {
@@ -663,12 +663,12 @@
 			}
 		});
 	}
-	
+
 	/**
 	 * Activates this debug options manager. When active, this
 	 * manager becomes a listener to many notifications and updates
 	 * running debug targets based on these notifications.
-	 * 
+	 *
 	 * A debug options manager does not need to be activated until
 	 * there is a running debug target.
 	 */
@@ -682,11 +682,11 @@
 		DebugPlugin.getDefault().addDebugEventListener(this);
 		JDIDebugModel.addJavaBreakpointListener(this);
         JavaLogicalStructures.addStructuresListener(this);
-	}	
+	}
 
 	/**
 	 * Startup problem handling on the first launch.
-	 * 
+	 *
 	 * @see ILaunchListener#launchAdded(ILaunch)
 	 */
 	@Override
@@ -699,7 +699,7 @@
 	@Override
 	public void launchChanged(ILaunch launch) {
 		activate();
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);		
+		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
 	}
 
 	/**
@@ -708,16 +708,16 @@
 	@Override
 	public void launchRemoved(ILaunch launch) {
 	}
-	
+
 	/**
 	 * Adds message attributes to java breakpoints.
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
 	 */
 	@Override
 	public void breakpointsAdded(final IBreakpoint[] breakpoints) {
 		// if a breakpoint is added, but already has a message, do not update it
-		List<IBreakpoint> update = new ArrayList<IBreakpoint>();
+		List<IBreakpoint> update = new ArrayList<>();
 		for (int i = 0; i < breakpoints.length; i++) {
 			IBreakpoint breakpoint = breakpoints[i];
 			try {
@@ -732,10 +732,10 @@
 			updateBreakpointMessages(update.toArray(new IBreakpoint[update.size()]));
 		}
 	}
-	
+
 	/**
 	 * Updates message attributes on the given java breakpoints.
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
 	 */
 	private void updateBreakpointMessages(final IBreakpoint[] breakpoints) {
@@ -746,13 +746,13 @@
 					IBreakpoint breakpoint = breakpoints[i];
 					if (breakpoint instanceof IJavaBreakpoint) {
 						String info = fLabelProvider.getText(breakpoint);
-						String type = DebugUIMessages.JavaDebugOptionsManager_Breakpoint___1; 
+						String type = DebugUIMessages.JavaDebugOptionsManager_Breakpoint___1;
 						if (breakpoint instanceof IJavaMethodBreakpoint || breakpoint instanceof IJavaMethodEntryBreakpoint) {
-							type = DebugUIMessages.JavaDebugOptionsManager_Method_breakpoint___2; 
+							type = DebugUIMessages.JavaDebugOptionsManager_Method_breakpoint___2;
 						} else if (breakpoint instanceof IJavaWatchpoint) {
-							type = DebugUIMessages.JavaDebugOptionsManager_Watchpoint___3;  
+							type = DebugUIMessages.JavaDebugOptionsManager_Watchpoint___3;
 						} else if (breakpoint instanceof IJavaLineBreakpoint) {
-							type = DebugUIMessages.JavaDebugOptionsManager_Line_breakpoint___4; 
+							type = DebugUIMessages.JavaDebugOptionsManager_Line_breakpoint___4;
 						}
 						breakpoint.getMarker().setAttribute(IMarker.MESSAGE, type + info);
 					}
@@ -764,11 +764,11 @@
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
 		}
-	}	
+	}
 
 	/**
 	 * Updates message attributes on java breakpoints.
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
 	 */
 	@Override
@@ -795,7 +795,7 @@
 	public void logicalStructuresChanged() {
     	variableViewSettingsChanged();
     }
-    
+
     /**
 	 * Refreshes the variables view by firing a change event on a stack frame (active
 	 * debug context).
@@ -807,11 +807,11 @@
         if (selected != null) {
 			IJavaStackFrame frame = selected.getAdapter(IJavaStackFrame.class);
             if (frame != null) {
-                DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { 
+                DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {
                         new DebugEvent(frame, DebugEvent.CHANGE)
                 });
             }
         }
-    }    
+    }
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java
index 2cf30b8..d4543af 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import org.eclipse.core.runtime.preferences.DefaultScope;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.InstanceScope;
@@ -47,14 +47,14 @@
  * Java Debugging.
  */
 public class JavaDebugPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IPropertyChangeListener {
-	
+
 	/**
 	 * This class exists to provide visibility to the
 	 * <code>refreshValidState</code> method and to perform more intelligent
 	 * clearing of the error message.
 	 */
-	protected class JavaDebugIntegerFieldEditor extends IntegerFieldEditor {						
-		
+	protected class JavaDebugIntegerFieldEditor extends IntegerFieldEditor {
+
 		public JavaDebugIntegerFieldEditor(String name, String labelText, Composite parent) {
 			super(name, labelText, parent);
 		}
@@ -71,7 +71,7 @@
 			}
 		}
 	}
-	
+
 	// Suspend preference widgets
 	private Button fSuspendButton;
 	private Button fSuspendOnCompilationErrors;
@@ -83,7 +83,7 @@
 	private Button fOnlyIncludeExportedEntries;
 	private Combo fSuspendVMorThread;
 	private Combo fWatchpoint;
-	
+
 	// Hot code replace preference widgets
 	private Button fEnableHCRButton;
 	private Button fAlertHCRButton;
@@ -99,7 +99,7 @@
 	public JavaDebugPreferencePage() {
 		super();
 		setPreferenceStore(JDIDebugUIPlugin.getDefault().getPreferenceStore());
-		setDescription(DebugUIMessages.JavaDebugPreferencePage_description); 
+		setDescription(DebugUIMessages.JavaDebugPreferencePage_description);
 	}
 
 	/* (non-Javadoc)
@@ -110,7 +110,7 @@
 		super.createControl(parent);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.JAVA_DEBUG_PREFERENCE_PAGE);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
 	 */
@@ -122,69 +122,69 @@
 				"org.eclipse.debug.ui.DebugPreferencePage", DebugUIMessages.JavaDebugPreferencePage_0, //$NON-NLS-1$
 				(IWorkbenchPreferenceContainer) getContainer(),null);
 		link.getControl().setFont(composite.getFont());
-		Group group = SWTFactory.createGroup(composite, DebugUIMessages.JavaDebugPreferencePage_Suspend_Execution_1, 2, 1, GridData.FILL_HORIZONTAL); 
-		fSuspendButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Suspend__execution_on_uncaught_exceptions_1, null, false, 2); 
-		fSuspendOnCompilationErrors = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Suspend_execution_on_co_mpilation_errors_1, null, false, 2); 
+		Group group = SWTFactory.createGroup(composite, DebugUIMessages.JavaDebugPreferencePage_Suspend_Execution_1, 2, 1, GridData.FILL_HORIZONTAL);
+		fSuspendButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Suspend__execution_on_uncaught_exceptions_1, null, false, 2);
+		fSuspendOnCompilationErrors = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Suspend_execution_on_co_mpilation_errors_1, null, false, 2);
 		fSuspendDuringEvaluations = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_14, null, false, 2);
 		fOpenInspector = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_20, null, false, 2);
-		
+
 		SWTFactory.createLabel(group, DebugUIMessages.JavaDebugPreferencePage_21, 1);
 		fSuspendVMorThread = new Combo(group, SWT.BORDER|SWT.READ_ONLY);
 		fSuspendVMorThread.setItems(new String[]{DebugUIMessages.JavaDebugPreferencePage_22, DebugUIMessages.JavaDebugPreferencePage_23});
 		fSuspendVMorThread.setFont(group.getFont());
-		
+
 		SWTFactory.createLabel(group, DebugUIMessages.JavaDebugPreferencePage_24, 1);
 		fWatchpoint = new Combo(group, SWT.BORDER | SWT.READ_ONLY);
 		fWatchpoint.setItems(new String[] {DebugUIMessages.JavaDebugPreferencePage_25, DebugUIMessages.JavaDebugPreferencePage_26, DebugUIMessages.JavaDebugPreferencePage_27});
 		fWatchpoint.setFont(group.getFont());
-			
+
 		group = SWTFactory.createGroup(composite, DebugUIMessages.JavaDebugPreferencePage_Hot_Code_Replace_2, 1, 1, GridData.FILL_HORIZONTAL);
 		fEnableHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Enable_hot_code_replace_1, null, true, 1);
-		fAlertHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_fails_1, null, false, 1); 
-		fAlertHCRNotSupportedButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_is_not_supported_1, null, false, 1); 
-		fAlertObsoleteButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_obsolete_methods_remain_1, null, false, 1); 
-		fPerformHCRWithCompilationErrors = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Replace_classfiles_containing_compilation_errors_1, null, false, 1);  
+		fAlertHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_fails_1, null, false, 1);
+		fAlertHCRNotSupportedButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_is_not_supported_1, null, false, 1);
+		fAlertObsoleteButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_obsolete_methods_remain_1, null, false, 1);
+		fPerformHCRWithCompilationErrors = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Replace_classfiles_containing_compilation_errors_1, null, false, 1);
 
 		group = SWTFactory.createGroup(composite, DebugUIMessages.JavaDebugPreferencePage_Communication_1, 1, 1, GridData.FILL_HORIZONTAL);
 		Composite space = SWTFactory.createComposite(group, group.getFont(), 1, 1, GridData.FILL_HORIZONTAL);
-		
+
 		fTimeoutText = new JavaDebugIntegerFieldEditor(JDIDebugModel.PREF_REQUEST_TIMEOUT, DebugUIMessages.JavaDebugPreferencePage_Debugger__timeout__2, space);
 		fTimeoutText.setPage(this);
 		fTimeoutText.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
 		fTimeoutText.setValidRange(JDIDebugModel.DEF_REQUEST_TIMEOUT, Integer.MAX_VALUE);
-		fTimeoutText.setErrorMessage(NLS.bind(DebugUIMessages.JavaDebugPreferencePage_Value_must_be_a_valid_integer_greater_than__0__ms_1, new Object[] {new Integer(JDIDebugModel.DEF_REQUEST_TIMEOUT)})); 
+		fTimeoutText.setErrorMessage(NLS.bind(DebugUIMessages.JavaDebugPreferencePage_Value_must_be_a_valid_integer_greater_than__0__ms_1, new Object[] {new Integer(JDIDebugModel.DEF_REQUEST_TIMEOUT)}));
 		fTimeoutText.load();
-		fConnectionTimeoutText = new JavaDebugIntegerFieldEditor(JavaRuntime.PREF_CONNECT_TIMEOUT, DebugUIMessages.JavaDebugPreferencePage__Launch_timeout__ms___1, space); 
+		fConnectionTimeoutText = new JavaDebugIntegerFieldEditor(JavaRuntime.PREF_CONNECT_TIMEOUT, DebugUIMessages.JavaDebugPreferencePage__Launch_timeout__ms___1, space);
 		fConnectionTimeoutText.setPage(this);
 		fConnectionTimeoutText.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
 		fConnectionTimeoutText.setValidRange(JavaRuntime.DEF_CONNECT_TIMEOUT, Integer.MAX_VALUE);
-		fConnectionTimeoutText.setErrorMessage(NLS.bind(DebugUIMessages.JavaDebugPreferencePage_Value_must_be_a_valid_integer_greater_than__0__ms_1, new Object[] {new Integer(JavaRuntime.DEF_CONNECT_TIMEOUT)})); 
+		fConnectionTimeoutText.setErrorMessage(NLS.bind(DebugUIMessages.JavaDebugPreferencePage_Value_must_be_a_valid_integer_greater_than__0__ms_1, new Object[] {new Integer(JavaRuntime.DEF_CONNECT_TIMEOUT)}));
 		fConnectionTimeoutText.load();
-		
+
 		SWTFactory.createVerticalSpacer(composite, 1);
 		fPromptUnableToInstallBreakpoint = SWTFactory.createCheckButton(composite, DebugUIMessages.JavaDebugPreferencePage_19, null, false, 1);
 		fPromptDeleteConditionalBreakpoint= SWTFactory.createCheckButton(composite, DebugUIMessages.JavaDebugPreferencePage_promptWhenDeletingCondidtionalBreakpoint, null, false, 1);
 		fFilterUnrelatedBreakpoints = SWTFactory.createCheckButton(composite, DebugUIMessages.JavaDebugPreferencePage_filterUnrelatedBreakpoints, null, false, 1);
-		
+
 		SWTFactory.createVerticalSpacer(composite, 1);
 		fOnlyIncludeExportedEntries = SWTFactory.createCheckButton(composite, DebugUIMessages.JavaDebugPreferencePage_only_include_exported_entries, null, false, 1);
 
 		SWTFactory.createVerticalSpacer(composite, 1);
 		fShowStepResult = SWTFactory.createCheckButton(composite, DebugUIMessages.JavaDebugPreferencePage_ShowStepResult_1, null, false, 1);
-		
+
 		setValues();
 
 		fTimeoutText.setPropertyChangeListener(this);
 		fConnectionTimeoutText.setPropertyChangeListener(this);
-		return composite;		
+		return composite;
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
 	 */
 	@Override
 	public void init(IWorkbench workbench) {}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
 	 */
@@ -234,7 +234,7 @@
 		}
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
 	 */
@@ -266,9 +266,9 @@
 			fConnectionTimeoutText.setStringValue(new Integer(prefs.getInt(JavaRuntime.PREF_CONNECT_TIMEOUT,JavaRuntime.DEF_CONNECT_TIMEOUT)).toString());
 			fOnlyIncludeExportedEntries.setSelection(prefs.getBoolean(JavaRuntime.PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES, false));
 		}
-		super.performDefaults();	
+		super.performDefaults();
 	}
-	
+
 	/**
 	 * Set the values of the component widgets based on the
 	 * values in the preference store
@@ -314,11 +314,11 @@
 			if (newValue) {
 				if (fTimeoutText != null && event.getSource() != fTimeoutText) {
 					fTimeoutText.refreshValidState();
-				} 
+				}
 				if (fConnectionTimeoutText != null && event.getSource() != fConnectionTimeoutText) {
 					fConnectionTimeoutText.refreshValidState();
 				}
-			} 
+			}
 			setValid(fTimeoutText.isValid() && fConnectionTimeoutText.isValid());
 			getContainer().updateButtons();
 			updateApplyButton();
@@ -334,5 +334,5 @@
 			return true;
 		}
 		return false;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
index 9ec16bd..1832c18 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
@@ -67,10 +67,10 @@
 	 * The default detail formatters manager.
 	 */
 	static private JavaDetailFormattersManager fgDefault;
-	
+
 	/**
 	 * Return the default detail formatters manager.
-	 * 
+	 *
 	 * @return default detail formatters manager.
 	 */
 	static public JavaDetailFormattersManager getDefault() {
@@ -79,19 +79,19 @@
 		}
 		return fgDefault;
 	}
-	
+
 	/**
 	 * Map of types to the associated formatter (code snippet).
 	 * (<code>String</code> -> <code>String</code>)
 	 */
 	private HashMap<String, DetailFormatter> fDetailFormattersMap;
-	
+
 	/**
 	 * Cache of compiled expressions.
 	 * Associate a pair type name/debug target to a compiled expression.
 	 */
 	private HashMap<Key, Expression> fCacheMap;
-	
+
 	/**
 	 * JavaDetailFormattersManager constructor.
 	 */
@@ -101,15 +101,15 @@
 		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
 		DebugPlugin.getDefault().addDebugEventListener(this);
 		DebugUITools.getPreferenceStore().addPropertyChangeListener(this);
-		fCacheMap= new HashMap<Key, Expression>();
+		fCacheMap= new HashMap<>();
 	}
-	
+
 	/**
 	 * Populate the detail formatters map with data from preferences.
 	 */
 	private void populateDetailFormattersMap() {
 		String[] detailFormattersList= JavaDebugOptionsManager.parseList(JDIDebugUIPlugin.getDefault().getPreferenceStore().getString(IJDIPreferencesConstants.PREF_DETAIL_FORMATTERS_LIST));
-		fDetailFormattersMap= new HashMap<String, DetailFormatter>(detailFormattersList.length / 3);
+		fDetailFormattersMap= new HashMap<>(detailFormattersList.length / 3);
 		for (int i= 0, length= detailFormattersList.length; i < length;) {
 			String typeName= detailFormattersList[i++];
 			String snippet= detailFormattersList[i++].replace('\u0000', ',');
@@ -117,17 +117,17 @@
 			fDetailFormattersMap.put(typeName, new DetailFormatter(typeName, snippet, enabled));
 		}
 	}
-	
+
 	/**
 	 * Compute asynchronously the 'toString' of the given value. If a formatter is associated to
 	 * the type of the given value, this formatter is used instead of the <code>toString()</code>
 	 * method.
 	 * The result is return through the listener.
-	 * 
-	 * @param objectValue the value to 'format' 
+	 *
+	 * @param objectValue the value to 'format'
 	 * @param thread the thread to use to performed the evaluation
 	 * @param listener the listener
-	 */	
+	 */
 	public void computeValueDetail(final IJavaValue objectValue, final IJavaThread thread, final IValueDetailListener listener) {
 		thread.queueRunnable(new Runnable() {
 			@Override
@@ -136,7 +136,7 @@
 			}
 		});
 	}
-	
+
 	private void resolveFormatter(final IJavaValue value, final IJavaThread thread, final IValueDetailListener listener) {
 		EvaluationListener evaluationListener= new EvaluationListener(value, thread, listener);
 		if (value instanceof IJavaObject) {
@@ -175,7 +175,7 @@
 			listener.detailComputed(value, detail);
 		}
 	}
-	
+
 	private IJavaProject getJavaProject(IJavaObject javaValue, IJavaThread thread) throws CoreException {
 
 		IType type = null;
@@ -205,7 +205,7 @@
 		}
 		return JavaDebugUtils.resolveJavaProject(stackFrame);
 	}
-	
+
 	/**
 	 * Searches the listing of implemented interfaces to see if one of them has a detail formatter
 	 * @param type the type whose interfaces you want to inspect
@@ -226,7 +226,7 @@
 			}
 		catch(DebugException e) {return null;}
 	}
-	
+
 	/**
 	 * Returns if the specified <code>IJavaType</code> has a detail formatter on one of its interfaces
 	 * @param type the type to inspect
@@ -239,7 +239,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Searches the superclass hierarchy to see if any of the specified classes parents have a detail formatter
 	 * @param type the current type. Ideally this should be the first parent class.
@@ -259,7 +259,7 @@
 			}
 		catch(DebugException e) {return null;}
 	}
-	
+
 	/**
 	 * Returns if one of the parent classes of the specified type has a detail formatter
 	 * @param type the type to inspect
@@ -272,11 +272,11 @@
 		}
 		return false;
 	}
-	
+
 	public boolean hasAssociatedDetailFormatter(IJavaType type) {
 		return getAssociatedDetailFormatter(type) != null;
 	}
-	
+
 	public DetailFormatter getAssociatedDetailFormatter(IJavaType type) {
 		String typeName = ""; //$NON-NLS-1$
 		try {
@@ -285,21 +285,21 @@
 			}
 			if (type instanceof IJavaClassType) {
 				typeName = type.getName();
-			} 
+			}
 			else {
 				return null;
 			}
-		} 
+		}
 		catch (DebugException e) {return null;}
 		return fDetailFormattersMap.get(typeName);
 	}
-	
+
 	public void setAssociatedDetailFormatter(DetailFormatter detailFormatter) {
 		fDetailFormattersMap.put(detailFormatter.getTypeName(), detailFormatter);
 		savePreference();
 	}
-	
-	
+
+
 	private void savePreference() {
 		Collection<DetailFormatter> valuesList= fDetailFormattersMap.values();
 		String[] values= new String[valuesList.size() * 3];
@@ -313,7 +313,7 @@
 		String pref = JavaDebugOptionsManager.serializeList(values);
 		JDIDebugUIPlugin.getDefault().getPreferenceStore().setValue(IJDIPreferencesConstants.PREF_DETAIL_FORMATTERS_LIST, pref);
 	}
-	
+
 	/**
 	 * Return the detail formatter (code snippet) associate with
 	 * the given type or one of its super types, super interfaces.
@@ -335,7 +335,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Return the detail formatter (code snippet) associate with
 	 * the given type or one of its super types.
@@ -353,11 +353,11 @@
 		}
 		return getDetailFormatterSuperClass(type.getSuperclass());
 	}
-	
+
 	/**
 	 * Return the expression which corresponds to the code formatter associated with the type of
 	 * the given object or <code>null</code> if none.
-	 * 
+	 *
 	 * The code snippet is compiled in the context of the given object.
 	 * @param javaObject the Java object
 	 * @param debugTarget the target
@@ -397,7 +397,7 @@
 		}
 		return null;
 	}
-	
+
 	protected String getArraySnippet(IJavaArray value) throws DebugException {
 		String signature = value.getSignature();
 		int nesting = Signature.getArrayCount(signature);
@@ -430,7 +430,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent)
 	 */
@@ -448,11 +448,11 @@
             if (selected != null) {
                 IJavaStackFrame frame= selected.getAdapter(IJavaStackFrame.class);
                 if (frame != null) {
-                    DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { 
+                    DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {
                             new DebugEvent(frame, DebugEvent.CHANGE)
                     });
                 }
-            }			
+            }
 		}
 	}
 	/**
@@ -464,24 +464,24 @@
 			DebugEvent event = events[i];
 			if (event.getSource() instanceof IJavaDebugTarget && event.getKind() == DebugEvent.TERMINATE) {
 				deleteCacheForTarget((IJavaDebugTarget) event.getSource());
-			}	
+			}
 		}
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(ILaunch[])
 	 */
 	@Override
 	public void launchesAdded(ILaunch[] launches) {
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(ILaunch[])
 	 */
 	@Override
 	public void launchesChanged(ILaunch[] launches) {
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(ILaunch[])
 	 */
@@ -492,16 +492,16 @@
 			IDebugTarget[] debugTargets= launch.getDebugTargets();
 			for (int j = 0; j < debugTargets.length; j++) {
 				if (debugTargets[j] instanceof IJavaDebugTarget) {
-					deleteCacheForTarget((IJavaDebugTarget)debugTargets[j]);		
+					deleteCacheForTarget((IJavaDebugTarget)debugTargets[j]);
 				}
 			}
 		}
 	}
-	
+
 	/**
 	 * Remove from the cache compiled expression associated with
 	 * the given debug target.
-	 * 
+	 *
 	 * @param debugTarget the target
 	 */
 	private synchronized void deleteCacheForTarget(IJavaDebugTarget debugTarget) {
@@ -512,7 +512,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Object used as the key in the cache map for associate a compiled
 	 * expression with a pair type name/debug target
@@ -520,12 +520,12 @@
 	static private class Key {
 		private String fTypeName;
 		private IJavaDebugTarget fDebugTarget;
-		
+
 		Key(String typeName, IJavaDebugTarget debugTarget) {
 			fTypeName= typeName;
 			fDebugTarget= debugTarget;
 		}
-		
+
 		@Override
 		public boolean equals(Object obj) {
 			if (obj instanceof Key) {
@@ -534,20 +534,20 @@
 			}
 			return false;
 		}
-		
+
 		@Override
 		public int hashCode() {
 			return fTypeName.hashCode() / 2 + fDebugTarget.hashCode() / 2;
 		}
 	}
-	
+
 	/**
 	 * Stores a compiled expression and evaluation engine used to evaluate the expression.
 	 */
 	static private class Expression {
 		private ICompiledExpression fExpression;
 		private IAstEvaluationEngine fEngine;
-		
+
 		Expression(ICompiledExpression expression, IAstEvaluationEngine engine) {
 			fExpression = expression;
 			fEngine = engine;
@@ -559,47 +559,47 @@
 			return fEngine;
 		}
 	}
-	
+
 	/**
 	 * Listener use to manage the result of the formatter.
 	 * Utilizes the 'standard' pretty printer methods to return the result.
 	 */
 	static private class EvaluationListener implements IEvaluationListener {
-		
+
 		/**
 		 * The selector of <code>java.lang.Object#toString()</code>,
 		 * used to evaluate 'toString()' for displaying details of values.
 		 */
 		private static final String fgToString= "toString"; //$NON-NLS-1$
-		
-		
+
+
 		/**
 		 * The signature of <code>java.lang.Object#toString()</code>,
 		 * used to evaluate 'toString()' for displaying details of values.
 		 */
 		private static final String fgToStringSignature= "()Ljava/lang/String;"; //$NON-NLS-1$
-		
+
 		/**
 		 * Signature of a string object
 		 */
 		private static final String STRING_SIGNATURE = "Ljava/lang/String;"; //$NON-NLS-1$
-		
+
 		private IJavaValue fValue;
-		
+
 		private IValueDetailListener fListener;
-		
+
 		private IJavaThread fThread;
-		
+
 		public EvaluationListener(IJavaValue value, IJavaThread thread, IValueDetailListener listener) {
 			fValue= value;
 			fThread= thread;
 			fListener= listener;
 		}
-		
+
 		@Override
 		public void evaluationComplete(IEvaluationResult result) {
 			if (result.hasErrors()) {
-				StringBuffer error= new StringBuffer(DebugUIMessages.JavaDetailFormattersManager_Detail_formatter_error___1); 
+				StringBuffer error= new StringBuffer(DebugUIMessages.JavaDetailFormattersManager_Detail_formatter_error___1);
 				DebugException exception= result.getException();
 				if (exception != null) {
 					Throwable throwable= exception.getStatus().getException();
@@ -627,13 +627,13 @@
 				}
 			}
 		}
-		
+
 		public void valueToString(final IJavaValue objectValue) throws DebugException {
 			String nonEvalResult = null;
 			StringBuffer result= null;
 			if (objectValue.getSignature() == null) {
 				// no need to spawn evaluate for a null fValue
-				nonEvalResult = DebugUIMessages.JavaDetailFormattersManager_null; 
+				nonEvalResult = DebugUIMessages.JavaDetailFormattersManager_null;
 			} else if (objectValue instanceof IJavaPrimitiveValue) {
 				// no need to spawn evaluate for a primitive value
 				result = new StringBuffer();
@@ -641,7 +641,7 @@
 			} else if (fThread == null || !fThread.isSuspended()) {
 				// no thread available
 				result = new StringBuffer();
-				result.append(DebugUIMessages.JavaDetailFormattersManager_no_suspended_threads); 
+				result.append(DebugUIMessages.JavaDetailFormattersManager_no_suspended_threads);
 				appendJDIValueString(result, objectValue);
 			} else if (objectValue instanceof IJavaObject && STRING_SIGNATURE.equals(objectValue.getSignature())) {
 				// no need to spawn evaluate for a java.lang.String
@@ -655,7 +655,7 @@
 				fListener.detailComputed(fValue, nonEvalResult);
 				return;
 			}
-			
+
 			IEvaluationRunnable eval = new IEvaluationRunnable() {
 				@Override
 				public void run(IJavaThread thread, IProgressMonitor monitor) throws DebugException {
@@ -672,12 +672,12 @@
 			};
 			fThread.runEvaluation(eval, null, DebugEvent.EVALUATION_IMPLICIT, false);
 		}
-		
+
 		/*
 		 * Gets all values in array and appends the toString() if it is an array of Objects or the value if primitive.
 		 * NB - this method is only called if there is no compiled expression for an array to perform an
 		 * Arrays.asList().toString() to minimize toString() calls on remote target (i.e. one call to
-		 * List.toString() instead of one call per item in the array). 
+		 * List.toString() instead of one call per item in the array).
 		 */
 		protected void appendArrayDetail(StringBuffer result, IJavaArray arrayValue) throws DebugException {
 			result.append('[');
@@ -703,7 +703,7 @@
 				result.append(de.getStatus().getMessage());
 				return;
 			}
-			
+
 			for (int i= 0; i < arrayValues.length; i++) {
 				IJavaValue value= arrayValues[i];
 				if (value instanceof IJavaArray) {
@@ -725,17 +725,17 @@
 				result.append(']');
 			}
 		}
-		
+
 		protected void appendJDIPrimitiveValueString(StringBuffer result, IJavaValue value) throws DebugException {
 			result.append(value.getValueString());
 		}
-		
-		
+
+
 		protected void appendJDIValueString(StringBuffer result, IJavaValue value) throws DebugException {
 			result.append(value.getValueString());
 		}
-		
-		
+
+
 		protected void appendObjectDetail(StringBuffer result, IJavaObject objectValue) throws DebugException {
 			if(objectValue instanceof JDINullValue) {
 				appendJDIValueString(result, objectValue);
@@ -745,20 +745,20 @@
 			if (STRING_SIGNATURE.equals(objectValue.getSignature())) {
 				appendJDIValueString(result, objectValue);
 			} else {
-				
+
 				IJavaValue toStringValue= objectValue.sendMessage(EvaluationListener.fgToString, EvaluationListener.fgToStringSignature, null, fThread, false);
 				if (toStringValue == null) {
-					result.append(DebugUIMessages.JavaDetailFormattersManager__unknown_); 
+					result.append(DebugUIMessages.JavaDetailFormattersManager__unknown_);
 				} else {
 					appendJDIValueString(result, toStringValue);
 				}
 			}
 		}
-		
-		
-		
+
+
+
 	}
-	
+
 	/**
 	 * (non java-doc)
 	 * Remove the provided <code>detailFormatter</code> from the map
@@ -768,15 +768,15 @@
 		fDetailFormattersMap.remove(detailFormatter.getTypeName());
 		savePreference();
 	}
-	
+
 	/**
 	 * Returns the maximum number of chars to display in the details area or 0 if
 	 * there is no maximum.
-	 * 
+	 *
 	 * @return maximum number of chars to display or 0 for no max
 	 */
 	private static int getMaxDetailLength() {
 		return DebugUITools.getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersPreferencePage.java
index 81d327d..54451be 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersPreferencePage.java
@@ -55,26 +55,26 @@
 import org.eclipse.ui.PlatformUI;
 
 public class JavaDetailFormattersPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-	
+
 	static public final String DETAIL_FORMATTER_IS_ENABLED= "1"; //$NON-NLS-1$
 	static public final String DETAIL_FORMATTER_IS_DISABLED= "0"; //$NON-NLS-1$
-	
+
 	private CheckboxTableViewer fFormatterListViewer;
 	private Button fAddFormatterButton;
 	private Button fRemoveFormatterButton;
 	private Button fEditFormatterButton;
 	private JDISourceViewer fCodeViewer;
 	private Label fTableLabel;
-	
+
 	private FormatterListViewerContentProvider fFormatViewerContentProvider;
     private Button fInlineFormattersButton;
     private Button fInlineAllButton;
-	
+
 	public JavaDetailFormattersPreferencePage() {
 		super();
-		setTitle(DebugUIMessages.JavaDetailFormattersPreferencePage_0); 
+		setTitle(DebugUIMessages.JavaDetailFormattersPreferencePage_0);
 		setPreferenceStore(JDIDebugUIPlugin.getDefault().getPreferenceStore());
-		setDescription(DebugUIMessages.JavaDetailFormattersPreferencePage_Override_default___toString_____for_Variables_and_Expressions_view_details__1); 
+		setDescription(DebugUIMessages.JavaDetailFormattersPreferencePage_Override_default___toString_____for_Variables_and_Expressions_view_details__1);
 	}
 
 	/* (non-Javadoc)
@@ -86,7 +86,7 @@
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.JAVA_DETAIL_FORMATTER_PREFERENCE_PAGE);
         Font font = parent.getFont();
         initializeDialogUnits(parent);
-        
+
         // top level container
         Composite container = new Composite(parent, SWT.NONE);
         GridLayout layout = new GridLayout();
@@ -97,10 +97,10 @@
         GridData gd = new GridData(GridData.FILL_BOTH);
         container.setLayoutData(gd);
         container.setFont(font);
-        
-		createDetailFormatsPreferences(container);	
+
+		createDetailFormatsPreferences(container);
         createLabelPreferences(container);
-        
+
         Dialog.applyDialogFont(container);
         return container;
 	}
@@ -111,40 +111,40 @@
 	@Override
 	public void init(IWorkbench workbench) {
 	}
-    
+
     private void createLabelPreferences(Composite parent) {
         Group group= new Group(parent, SWT.NONE);
         GridData gridData= new GridData(GridData.FILL_HORIZONTAL);
         gridData.horizontalSpan= 2;
         group.setLayoutData(gridData);
         group.setLayout(new GridLayout());
-        group.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_1); 
-        
+        group.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_1);
+
         String preference= getPreferenceStore().getString(IJDIPreferencesConstants.PREF_SHOW_DETAILS);
-        
+
         // Create the 3 detail option radio buttons
         fInlineFormattersButton = new Button(group, SWT.RADIO);
-        fInlineFormattersButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_2); 
+        fInlineFormattersButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_2);
         fInlineFormattersButton.setSelection(preference.equals(IJDIPreferencesConstants.INLINE_FORMATTERS));
-        
+
         fInlineAllButton = new Button(group, SWT.RADIO);
-        fInlineAllButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_3); 
+        fInlineAllButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_3);
         fInlineAllButton.setSelection(preference.equals(IJDIPreferencesConstants.INLINE_ALL));
-        
+
         Button detailPane = new Button(group, SWT.RADIO);
-        detailPane.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_4); 
+        detailPane.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_4);
         detailPane.setSelection(preference.equals(IJDIPreferencesConstants.DETAIL_PANE));
     }
-	
+
 	/**
 	 * Create a group to contain the detail formatters related widgetry
 	 */
 	private Control createDetailFormatsPreferences(Composite parent) {
         Font font= parent.getFont();
-		
+
 		//table label
 		fTableLabel= new Label(parent, SWT.NONE);
-		fTableLabel.setText(DebugUIMessages.JavaDetailFormattersPreferencePage__Types_with_detail_formatters__2); 
+		fTableLabel.setText(DebugUIMessages.JavaDetailFormattersPreferencePage__Types_with_detail_formatters__2);
 		GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
 		gd.horizontalSpan = 2;
 		fTableLabel.setLayoutData(gd);
@@ -187,7 +187,7 @@
 					editType();
 				}
 			}
-		}); 
+		});
 		table.addKeyListener(new KeyAdapter() {
 			@Override
 			public void keyPressed(KeyEvent event) {
@@ -195,27 +195,27 @@
 					removeTypes();
 				}
 			}
-		});	
+		});
 		fFormatterListViewer.setInput(this);
 
 		createDetailFormatsButtons(parent);
 
 		Label label = new Label(parent, SWT.NONE);
-		label.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_Detail_formatter_code_snippet_defined_for_selected_type__3); 
+		label.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_Detail_formatter_code_snippet_defined_for_selected_type__3);
 		label.setFont(font);
         gd= new GridData(GridData.FILL_HORIZONTAL);
         gd.horizontalSpan= 2;
         label.setLayoutData(gd);
 		createSourceViewer(parent);
-		
+
 		fFormatViewerContentProvider.refreshViewer();
 		return parent;
 	}
-	
+
 
 	private void createDetailFormatsButtons(Composite container) {
 		Font font = container.getFont();
-		
+
 		// button container
 		Composite buttonContainer = new Composite(container, SWT.NONE);
 		GridData gd = new GridData(GridData.FILL_VERTICAL);
@@ -225,11 +225,11 @@
 		buttonLayout.marginHeight = 0;
 		buttonLayout.marginWidth = 0;
 		buttonContainer.setLayout(buttonLayout);
-		
+
 		// Add type button
 		fAddFormatterButton = new Button(buttonContainer, SWT.PUSH);
-		fAddFormatterButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_Add__Formatter____5); 
-		fAddFormatterButton.setToolTipText(DebugUIMessages.JavaDetailFormattersPreferencePage_Allow_you_to_create_a_new_detail_formatter_6); 
+		fAddFormatterButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage_Add__Formatter____5);
+		fAddFormatterButton.setToolTipText(DebugUIMessages.JavaDetailFormattersPreferencePage_Allow_you_to_create_a_new_detail_formatter_6);
 		fAddFormatterButton.setLayoutData(gd);
 		fAddFormatterButton.setFont(font);
 		setButtonLayoutData(fAddFormatterButton);
@@ -239,11 +239,11 @@
 				addType();
 			}
 		});
-		
+
 		// Edit button
 		fEditFormatterButton = new Button(buttonContainer, SWT.PUSH);
-		fEditFormatterButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage__Edit____9); 
-		fEditFormatterButton.setToolTipText(DebugUIMessages.JavaDetailFormattersPreferencePage_Edit_the_selected_detail_formatter_10); 
+		fEditFormatterButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage__Edit____9);
+		fEditFormatterButton.setToolTipText(DebugUIMessages.JavaDetailFormattersPreferencePage_Edit_the_selected_detail_formatter_10);
 		fEditFormatterButton.setFont(font);
 		setButtonLayoutData(fEditFormatterButton);
 		fEditFormatterButton.addListener(SWT.Selection, new Listener() {
@@ -253,11 +253,11 @@
 			}
 		});
 		fEditFormatterButton.setEnabled(false);
-		
+
 		// Remove button
 		fRemoveFormatterButton = new Button(buttonContainer, SWT.PUSH);
-		fRemoveFormatterButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage__Remove_7); 
-		fRemoveFormatterButton.setToolTipText(DebugUIMessages.JavaDetailFormattersPreferencePage_Remove_all_selected_detail_formatters_8); 
+		fRemoveFormatterButton.setText(DebugUIMessages.JavaDetailFormattersPreferencePage__Remove_7);
+		fRemoveFormatterButton.setToolTipText(DebugUIMessages.JavaDetailFormattersPreferencePage_Remove_all_selected_detail_formatters_8);
 		fRemoveFormatterButton.setFont(font);
 		setButtonLayoutData(fRemoveFormatterButton);
 		fRemoveFormatterButton.addListener(SWT.Selection, new Listener() {
@@ -268,7 +268,7 @@
 		});
 		fRemoveFormatterButton.setEnabled(false);
 	}
-	
+
 	public void createSourceViewer(Composite container) {
 		fCodeViewer= new JDISourceViewer(container,  null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
 
@@ -278,7 +278,7 @@
 		fCodeViewer.configure(new DisplayViewerConfiguration());
 		fCodeViewer.setEditable(false);
 		fCodeViewer.setDocument(document);
-		
+
 		Control control= fCodeViewer.getControl();
 		GridData gd= new GridData(GridData.FILL_BOTH);
         gd.horizontalSpan= 2;
@@ -306,7 +306,7 @@
 			fFormatViewerContentProvider.addDetailFormatter(detailFormat);
 		}
 	}
-	
+
 	public void removeTypes() {
 		Object[] all = fFormatViewerContentProvider.getElements(null);
 		IStructuredSelection selection= (IStructuredSelection)fFormatterListViewer.getSelection();
@@ -328,7 +328,7 @@
 			fFormatterListViewer.setSelection(new StructuredSelection(all[index]));
 		}
 	}
-	
+
 	public void editType() {
 		IStructuredSelection selection= (IStructuredSelection)fFormatterListViewer.getSelection();
 		if (new DetailFormatterDialog(getShell(), (DetailFormatter)(selection).getFirstElement(), null, true, true).open() == Window.OK) {
@@ -337,12 +337,12 @@
 			updatePage(selection);
 		}
 	}
-	
+
 	@Override
 	public boolean performOk() {
 		if (fFormatViewerContentProvider != null) {
 			fFormatViewerContentProvider.saveDetailFormatters();
-	
+
 	        String value= IJDIPreferencesConstants.DETAIL_PANE;
 	        if (fInlineAllButton.getSelection()) {
 	            value= IJDIPreferencesConstants.INLINE_ALL;
@@ -354,15 +354,15 @@
 		}
 		return true;
 	}
-	
+
 	class FormatterListViewerContentProvider implements IStructuredContentProvider {
-		
+
 		private Set<DetailFormatter> fDetailFormattersSet;
-		
+
 		private List<String> fDefinedTypes;
-		
+
 		private CheckboxTableViewer fViewer;
-		
+
 		/**
 		 * FormatterListViewerContentProvider constructor.
 		 */
@@ -370,8 +370,8 @@
 			fViewer= viewer;
 			// load the current formatters
 			String[] detailFormattersList= JavaDebugOptionsManager.parseList(JDIDebugUIPlugin.getDefault().getPreferenceStore().getString(IJDIPreferencesConstants.PREF_DETAIL_FORMATTERS_LIST));
-			fDetailFormattersSet= new TreeSet<DetailFormatter>();
-			fDefinedTypes= new ArrayList<String>(detailFormattersList.length / 3);
+			fDetailFormattersSet= new TreeSet<>();
+			fDefinedTypes= new ArrayList<>(detailFormattersList.length / 3);
 			for (int i= 0, length= detailFormattersList.length; i < length;) {
 				String typeName= detailFormattersList[i++];
 				String snippet= detailFormattersList[i++].replace('\u0000', ',');
@@ -381,7 +381,7 @@
 				fDefinedTypes.add(typeName);
 			}
 		}
-		
+
 		/**
 		 * Save the detail formatter list.
 		 */
@@ -396,9 +396,9 @@
 			}
 			String pref = JavaDebugOptionsManager.serializeList(values);
 			getPreferenceStore().setValue(IJDIPreferencesConstants.PREF_DETAIL_FORMATTERS_LIST, pref);
-			
+
 		}
-		
+
 		/**
 		 * Add a detail formatter.
 		 */
@@ -411,7 +411,7 @@
 			fViewer.setSelection(selection);
 			updatePage(selection);
 		}
-		
+
 		/**
 		 * Remove a detailFormatter
 		 */
@@ -423,7 +423,7 @@
 			fViewer.setSelection(selection);
 			updatePage(selection);
 		}
-		
+
 		/**
 		 * Remove detailFormatters
 		 */
@@ -437,9 +437,9 @@
 			fViewer.setSelection(selection);
 			updatePage(selection);
 		}
-		
+
 		/**
-		 * Refresh the formatter list viewer. 
+		 * Refresh the formatter list viewer.
 		 */
 		private void refreshViewer() {
 			DetailFormatter[] checkedElementsTmp= new DetailFormatter[fDetailFormattersSet.size()];
@@ -455,7 +455,7 @@
 			fViewer.setAllChecked(false);
 			fViewer.setCheckedElements(checkedElements);
 		}
-		
+
 		/**
 		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
 		 */
@@ -463,11 +463,11 @@
 		public Object[] getElements(Object inputElement) {
 			return fDetailFormattersSet.toArray();
 		}
-		
+
 		public List<String> getDefinedTypes() {
 			return fDefinedTypes;
 		}
-		
+
 		/**
 		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
 		 */
@@ -482,7 +482,7 @@
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performCancel()
 	 */
@@ -492,5 +492,5 @@
 			fCodeViewer.dispose();
 		}
 		return super.performCancel();
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaHotCodeReplaceListener.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaHotCodeReplaceListener.java
index 3a347e9..422ce8c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaHotCodeReplaceListener.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaHotCodeReplaceListener.java
@@ -60,7 +60,7 @@
 		if (display.isDisposed()) {
 			return;
 		}
-		
+
 		String name = null;
 		try {
 			name = target.getName();
@@ -77,13 +77,13 @@
 		if (exception == null) {
 			status = new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, DebugUIMessages.JDIDebugUIPlugin_The_target_VM_does_not_support_hot_code_replace_1, null);
 			preference= IJDIPreferencesConstants.PREF_ALERT_HCR_NOT_SUPPORTED;
-			alertMessage= DebugUIMessages.JDIDebugUIPlugin_3; 
+			alertMessage= DebugUIMessages.JDIDebugUIPlugin_3;
 		} else {
 			status = new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, exception.getMessage(), exception.getCause());
 			preference= IJDIPreferencesConstants.PREF_ALERT_HCR_FAILED;
-			alertMessage= DebugUIMessages.JDIDebugUIPlugin_1; 
+			alertMessage= DebugUIMessages.JDIDebugUIPlugin_1;
 		}
-		final String title = DebugUIMessages.JDIDebugUIPlugin_Hot_code_replace_failed_1; 
+		final String title = DebugUIMessages.JDIDebugUIPlugin_Hot_code_replace_failed_1;
 		final String message = NLS.bind(DebugUIMessages.JDIDebugUIPlugin__0__was_unable_to_replace_the_running_code_with_the_code_in_the_workspace__2, new Object[] {vmName, launchName});
 		display.asyncExec(new Runnable() {
 			@Override
@@ -110,7 +110,7 @@
 			}
 		});
 	}
-	
+
 	/**
 	 * @see IJavaHotCodeReplaceListener#obsoleteMethods(IJavaDebugTarget)
 	 */
@@ -124,10 +124,10 @@
 			return;
 		}
 		final String vmName= fLabelProvider.getText(target);
-		final String dialogTitle= DebugUIMessages.JDIDebugUIPlugin_Obsolete_methods_remain_1; 
-		final String message= NLS.bind(DebugUIMessages.JDIDebugUIPlugin__0__contains_obsolete_methods_1, new Object[] {vmName}); 
-		final IStatus status= new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, DebugUIMessages.JDIDebugUIPlugin_Stepping_may_be_hazardous_1, null); 
-		final String toggleMessage= DebugUIMessages.JDIDebugUIPlugin_2; 
+		final String dialogTitle= DebugUIMessages.JDIDebugUIPlugin_Obsolete_methods_remain_1;
+		final String message= NLS.bind(DebugUIMessages.JDIDebugUIPlugin__0__contains_obsolete_methods_1, new Object[] {vmName});
+		final IStatus status= new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, DebugUIMessages.JDIDebugUIPlugin_Stepping_may_be_hazardous_1, null);
+		final String toggleMessage= DebugUIMessages.JDIDebugUIPlugin_2;
 		display.asyncExec(new Runnable() {
 			@Override
 			public void run() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaLogicalStructuresPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaLogicalStructuresPreferencePage.java
index aae3404..ef4c59c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaLogicalStructuresPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaLogicalStructuresPreferencePage.java
@@ -59,7 +59,7 @@
 import org.eclipse.ui.PlatformUI;
 
 /**
- * The preference page for creating/modifying logical structures 
+ * The preference page for creating/modifying logical structures
  */
 public class JavaLogicalStructuresPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ISelectionChangedListener, Listener {
 
@@ -82,7 +82,7 @@
                 buffer.append(logicalStructure.getDescription());
                 String pluginId= logicalStructure.getContributingPluginId();
                 if (pluginId != null) {
-                    buffer.append(NLS.bind(DebugUIMessages.JavaLogicalStructuresPreferencePage_8, new String[] {pluginId})); 
+                    buffer.append(NLS.bind(DebugUIMessages.JavaLogicalStructuresPreferencePage_8, new String[] {pluginId}));
                 }
             }
             return buffer.toString();
@@ -93,11 +93,11 @@
             return null;
         }
     }
-    
+
     public class LogicalStructuresListViewerContentProvider implements IStructuredContentProvider {
-        
+
         private List<JavaLogicalStructure> fLogicalStructures;
-        
+
         LogicalStructuresListViewerContentProvider() {
 			fLogicalStructures = new ArrayList<>();
 			JavaLogicalStructure[] logicalStructures= JavaLogicalStructures.getJavaLogicalStructures();
@@ -181,20 +181,20 @@
 		}
 
     }
-    
+
 	private TableViewer fLogicalStructuresViewer;
 	private Button fAddLogicalStructureButton;
 	private Button fEditLogicalStructureButton;
 	private Button fRemoveLogicalStructureButton;
     private LogicalStructuresListViewerContentProvider fLogicalStructuresContentProvider;
-    
+
     protected static String[] fTableColumnProperties= {
         "type", //$NON-NLS-1$
         "showAs", //$NON-NLS-1$
     };
     protected String[] fTableColumnHeaders= {
-        DebugUIMessages.JavaLogicalStructuresPreferencePage_9, 
-        DebugUIMessages.JavaLogicalStructuresPreferencePage_10, 
+        DebugUIMessages.JavaLogicalStructuresPreferencePage_9,
+        DebugUIMessages.JavaLogicalStructuresPreferencePage_10,
     };
     protected ColumnLayoutData[] fTableColumnLayouts= {
         new ColumnWeightData(70),
@@ -206,9 +206,9 @@
 	 * Constructor
 	 */
 	public JavaLogicalStructuresPreferencePage() {
-		super(DebugUIMessages.JavaLogicalStructuresPreferencePage_0); 
+		super(DebugUIMessages.JavaLogicalStructuresPreferencePage_0);
 		setPreferenceStore(JDIDebugUIPlugin.getDefault().getPreferenceStore());
-        setDescription(DebugUIMessages.JavaLogicalStructuresPreferencePage_11); 
+        setDescription(DebugUIMessages.JavaLogicalStructuresPreferencePage_11);
 	}
 
 	@Override
@@ -216,7 +216,7 @@
 		super.createControl(parent);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.JAVA_LOGICAL_STRUCTURES_PAGE);
 	}
-	
+
 	@Override
 	protected Control createContents(Composite parent) {
         Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 2, 1, GridData.FILL_BOTH, 0, 2);
@@ -226,14 +226,14 @@
         noDefaultAndApplyButton();
 		return comp;
 	}
-    
+
     /**
      * Creates the source viewer
      * @param parent the parent to add the viewer to
      */
     public void createSourceViewer(Composite parent) {
     	SWTFactory.createWrapLabel(parent, DebugUIMessages.JavaLogicalStructuresPreferencePage_12, 2, 300);
-        
+
         fCodeViewer = new JDISourceViewer(parent,  null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
 
         JavaTextTools tools = JDIDebugUIPlugin.getDefault().getJavaTextTools();
@@ -242,7 +242,7 @@
         fCodeViewer.configure(new DisplayViewerConfiguration());
         fCodeViewer.setEditable(false);
         fCodeViewer.setDocument(document);
-        
+
         Control control = fCodeViewer.getControl();
         GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
         gd.horizontalSpan = 2;
@@ -258,13 +258,13 @@
         // button container
 		Composite buttonContainer = SWTFactory.createComposite(container, container.getFont(), 1, 1, GridData.VERTICAL_ALIGN_BEGINNING, 1, 0);
        // add button
-		fAddLogicalStructureButton = SWTFactory.createPushButton(buttonContainer, DebugUIMessages.JavaLogicalStructuresPreferencePage_2, DebugUIMessages.JavaLogicalStructuresPreferencePage_3, null); 
+		fAddLogicalStructureButton = SWTFactory.createPushButton(buttonContainer, DebugUIMessages.JavaLogicalStructuresPreferencePage_2, DebugUIMessages.JavaLogicalStructuresPreferencePage_3, null);
         fAddLogicalStructureButton.addListener(SWT.Selection, this);
        // edit button
-		fEditLogicalStructureButton = SWTFactory.createPushButton(buttonContainer, DebugUIMessages.JavaLogicalStructuresPreferencePage_4, DebugUIMessages.JavaLogicalStructuresPreferencePage_5, null); 
+		fEditLogicalStructureButton = SWTFactory.createPushButton(buttonContainer, DebugUIMessages.JavaLogicalStructuresPreferencePage_4, DebugUIMessages.JavaLogicalStructuresPreferencePage_5, null);
         fEditLogicalStructureButton.addListener(SWT.Selection, this);
        // remove button
-		fRemoveLogicalStructureButton = SWTFactory.createPushButton(buttonContainer, DebugUIMessages.JavaLogicalStructuresPreferencePage_6, DebugUIMessages.JavaLogicalStructuresPreferencePage_7, null); 
+		fRemoveLogicalStructureButton = SWTFactory.createPushButton(buttonContainer, DebugUIMessages.JavaLogicalStructuresPreferencePage_6, DebugUIMessages.JavaLogicalStructuresPreferencePage_7, null);
         fRemoveLogicalStructureButton.addListener(SWT.Selection, this);
         // initialize the buttons state
 		selectionChanged((IStructuredSelection)fLogicalStructuresViewer.getSelection());
@@ -275,7 +275,7 @@
      */
     private void createTable(Composite parent) {
     	SWTFactory.createWrapLabel(parent, DebugUIMessages.JavaLogicalStructuresPreferencePage_1, 2, 300);
-        
+
         // logical structures list
         fLogicalStructuresViewer = new TableViewer(parent, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
         Table table = (Table)fLogicalStructuresViewer.getControl();
@@ -288,7 +288,7 @@
         table.setLayout(tableLayout);
         table.setHeaderVisible(true);
         table.setLinesVisible(true);
-        
+
         // create table columns
         fLogicalStructuresViewer.setColumnProperties(fTableColumnProperties);
         for (int i = 0; i < fTableColumnHeaders.length; i++) {
@@ -297,7 +297,7 @@
             column.setResizable(fTableColumnLayouts[i].resizable);
             column.setText(fTableColumnHeaders[i]);
         }
-        
+
         fLogicalStructuresContentProvider= new LogicalStructuresListViewerContentProvider();
         fLogicalStructuresViewer.setContentProvider(fLogicalStructuresContentProvider);
         fLogicalStructuresViewer.setLabelProvider(new LogicalStructuresListViewerLabelProvider());
@@ -319,7 +319,7 @@
                 	removeLogicalStrutures();
                 }
             }
-        }); 
+        });
         fLogicalStructuresViewer.setComparator(new ViewerComparator() {
             @Override
 			public int compare(Viewer iViewer, Object e1, Object e2) {
@@ -354,7 +354,7 @@
 			selectionChanged((IStructuredSelection)selection);
 		}
 	}
-	
+
 	/**
 	 * Modify the state of the button from the selection.
 	 * @param structuredSelection the selection that changed
@@ -378,7 +378,7 @@
 			refreshCodeViewer(structure);
 		}
 	}
-	
+
 	/**
 	 * Refreshes the code viewer after an edit has taken place
 	 * @param structure the logical structure that was modified
@@ -419,7 +419,7 @@
 	}
 
 	/**
-	 * Performs the add button operation 
+	 * Performs the add button operation
 	 */
 	protected void addLogicalStructure() {
 		JavaLogicalStructure logicalStructure= new JavaLogicalStructure("", true, "", "", new String[0][]); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -431,7 +431,7 @@
 	}
 
 	/**
-	 * Performs the edit button operation 
+	 * Performs the edit button operation
 	 */
 	protected void editLogicalStructure() {
 		IStructuredSelection structuredSelection= (IStructuredSelection) fLogicalStructuresViewer.getSelection();
@@ -445,7 +445,7 @@
 	}
 
 	/**
-	 * Performs the remove button operation 
+	 * Performs the remove button operation
 	 */
 	protected void removeLogicalStrutures() {
 		IStructuredSelection selection= (IStructuredSelection)fLogicalStructuresViewer.getSelection();
@@ -471,9 +471,9 @@
 				fLogicalStructuresViewer.setSelection(new StructuredSelection(newSelectedElement));
 			}
 		}
-		
+
 	}
-	
+
 	@Override
 	public boolean performOk() {
 		if (fCodeViewer != null) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaPrimitivesPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaPrimitivesPreferencePage.java
index 27b3bfb..d4a8287 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaPrimitivesPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaPrimitivesPreferencePage.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -32,13 +32,13 @@
  * Java Debugging.
  */
 public class JavaPrimitivesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-	
-	private List<BooleanFieldEditor> fEdtiors = new ArrayList<BooleanFieldEditor>();
+
+	private List<BooleanFieldEditor> fEdtiors = new ArrayList<>();
 
 	public JavaPrimitivesPreferencePage() {
 		super(DebugUIMessages.JavaPrimitivesPreferencePage_0);
 		setPreferenceStore(JDIDebugUIPlugin.getDefault().getPreferenceStore());
-		setDescription(DebugUIMessages.JavaPrimitivesPreferencePage_1); 
+		setDescription(DebugUIMessages.JavaPrimitivesPreferencePage_1);
 	}
 
 	/**
@@ -47,7 +47,7 @@
 	@Override
 	protected Control createContents(Composite parent) {
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.JAVA_PRIMITIVES_PREFERENCE_PAGE);
-		
+
 		//The main composite
 		Composite composite = new Composite(parent, SWT.NULL);
 		GridLayout layout = new GridLayout();
@@ -58,11 +58,11 @@
 		GridData data = new GridData();
 		data.verticalAlignment = GridData.FILL;
 		data.horizontalAlignment = GridData.FILL;
-		composite.setLayoutData(data);		
-		
+		composite.setLayoutData(data);
+
 		IPreferenceStore preferenceStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
-		
-		BooleanFieldEditor editor = new BooleanFieldEditor(IJDIPreferencesConstants.PREF_SHOW_HEX, 
+
+		BooleanFieldEditor editor = new BooleanFieldEditor(IJDIPreferencesConstants.PREF_SHOW_HEX,
 				DebugUIMessages.JavaDebugPreferencePage_Display__hexadecimal_values__byte__short__char__int__long__3,
 				composite);
 		editor.setPreferenceStore(preferenceStore);
@@ -77,19 +77,19 @@
 				composite);
 		editor.setPreferenceStore(preferenceStore);
 		fEdtiors.add(editor);
-		
+
 		loadValues();
 		applyDialogFont(composite);
-		return composite;		
+		return composite;
 	}
-		
+
 	/**
 	 * @see IWorkbenchPreferencePage#init(IWorkbench)
 	 */
 	@Override
 	public void init(IWorkbench workbench) {
 	}
-	
+
 	/**
 	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
 	 * Also, notifies interested listeners
@@ -99,7 +99,7 @@
 		storeValues();
 		return true;
 	}
-	
+
 	/**
 	 * Sets the default preferences.
 	 * @see PreferencePage#performDefaults()
@@ -111,9 +111,9 @@
 			BooleanFieldEditor editor = iterator.next();
 			editor.loadDefault();
 		}
-		super.performDefaults();	
+		super.performDefaults();
 	}
-			
+
 	/**
 	 * Set the values of the component widgets based on the
 	 * values in the preference store
@@ -125,7 +125,7 @@
 			editor.load();
 		}
 	}
-	
+
 	/**
 	 * Store the preference values based on the state of the
 	 * component widgets
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaSourceLocationWorkbenchAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaSourceLocationWorkbenchAdapterFactory.java
index f03aebf..efdeee4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaSourceLocationWorkbenchAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaSourceLocationWorkbenchAdapterFactory.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import java.io.IOException;
 
 import org.eclipse.core.runtime.IAdapterFactory;
@@ -28,16 +28,16 @@
 
 /**
  * UI adapter factory for JDI Debug
- * 
+ *
  * @deprecated
  */
 @Deprecated
 /*package*/ class JavaSourceLocationWorkbenchAdapterFactory implements IAdapterFactory {
 
 	class SourceLocationPropertiesAdapter implements IWorkbenchAdapter {
-		
+
 		private JavaElementLabelProvider fJavaElementLabelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_BASICS);
-	
+
 		/**
 		 * @see IWorkbenchAdapter#getChildren(Object)
 		 */
@@ -89,7 +89,7 @@
 			return null;
 		}
 	}
-	
+
 	/**
 	 * @see IAdapterFactory#getAdapter(Object, Class)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaStepFilterPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaStepFilterPreferencePage.java
index 614f4e1..4529693 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaStepFilterPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaStepFilterPreferencePage.java
@@ -55,22 +55,22 @@
 
 /**
  * The preference page for Java step filtering, located at the node Java > Debug > Step Filtering
- * 
+ *
  * @since 3.0
  */
 public class JavaStepFilterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-	
+
 	public static final String PAGE_ID = "org.eclipse.jdt.debug.ui.JavaStepFilterPreferencePage"; //$NON-NLS-1$
-	
+
 	/**
 	 * Content provider for the table.  Content consists of instances of StepFilter.
 	 * @since 3.2
-	 */	
+	 */
 	class StepFilterContentProvider implements IStructuredContentProvider {
 		public StepFilterContentProvider() {
 			initTableState(false);
 		}
-		
+
 		@Override
 		public Object[] getElements(Object inputElement) {return getAllFiltersFromTable();}
 
@@ -78,9 +78,9 @@
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
 
 		@Override
-		public void dispose() {}		
+		public void dispose() {}
 	}
-	
+
 	//widgets
 	private CheckboxTableViewer fTableViewer;
 	private Button fUseStepFiltersButton;
@@ -96,15 +96,15 @@
 	private Button fStepThruButton;
 	private Button fSelectAllButton;
 	private Button fDeselectAllButton;
-	
+
 	/**
 	 * Constructor
 	 */
 	public JavaStepFilterPreferencePage() {
 		super();
 		setPreferenceStore(JDIDebugUIPlugin.getDefault().getPreferenceStore());
-		setTitle(DebugUIMessages.JavaStepFilterPreferencePage_title); 
-		setDescription(DebugUIMessages.JavaStepFilterPreferencePage_description); 
+		setTitle(DebugUIMessages.JavaStepFilterPreferencePage_title);
+		setDescription(DebugUIMessages.JavaStepFilterPreferencePage_description);
 	}
 
 	/* (non-Javadoc)
@@ -116,7 +116,7 @@
 	//The main composite
 		Composite composite = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH, 0, 0);
 		createStepFilterPreferences(composite);
-		return composite;	
+		return composite;
 	}
 
 	/* (non-Javadoc)
@@ -124,7 +124,7 @@
 	 */
 	@Override
 	public void init(IWorkbench workbench) {}
-	
+
 	/**
 	 * handles the filter button being clicked
 	 * @param event the clicked event
@@ -134,7 +134,7 @@
 			removeFilters();
 		}
 	}
-	
+
 	/**
 	 * Create a group to contain the step filter related widgetry
 	 */
@@ -171,23 +171,23 @@
 				if (selection.isEmpty()) {
 					fRemoveFilterButton.setEnabled(false);
 				} else {
-					fRemoveFilterButton.setEnabled(true);					
+					fRemoveFilterButton.setEnabled(true);
 				}
 			}
-		});	
+		});
 		fTableViewer.getControl().addKeyListener(new KeyAdapter() {
 			@Override
 			public void keyPressed(KeyEvent event) {
 				handleFilterViewerKeyPress(event);
 			}
-		});	
-		
+		});
+
 		createStepFilterButtons(container);
 		createStepFilterCheckboxes(container);
 
 		setPageEnablement(fUseStepFiltersButton.getSelection());
 	}
-	
+
 	/**
 	 * initializes the checked state of the filters when the dialog opens
 	 * @since 3.2
@@ -199,9 +199,9 @@
 			fTableViewer.setChecked(filters[i], filters[i].isChecked());
 		}
 	}
-	
+
 	/**
-	 * Enables or disables the widgets on the page, with the 
+	 * Enables or disables the widgets on the page, with the
 	 * exception of <code>fUseStepFiltersButton</code> according
 	 * to the passed boolean
 	 * @param enabled the new enablement status of the page's widgets
@@ -228,26 +228,26 @@
 	 * @param container the parent container
 	 */
 	private void createStepFilterCheckboxes(Composite container) {
-		fFilterSyntheticButton = SWTFactory.createCheckButton(container, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Filter_s_ynthetic_methods__requires_VM_support__17, 
+		fFilterSyntheticButton = SWTFactory.createCheckButton(container,
+				DebugUIMessages.JavaStepFilterPreferencePage_Filter_s_ynthetic_methods__requires_VM_support__17,
 				null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_FILTER_SYNTHETICS), 2);
-		fFilterStaticButton = SWTFactory.createCheckButton(container, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Filter_static__initializers_18, 
+		fFilterStaticButton = SWTFactory.createCheckButton(container,
+				DebugUIMessages.JavaStepFilterPreferencePage_Filter_static__initializers_18,
 				null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_FILTER_STATIC_INITIALIZERS), 2);
-		fFilterConstructorButton = SWTFactory.createCheckButton(container, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Filter_co_nstructors_19, 
+		fFilterConstructorButton = SWTFactory.createCheckButton(container,
+				DebugUIMessages.JavaStepFilterPreferencePage_Filter_co_nstructors_19,
 				null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_FILTER_CONSTRUCTORS), 2);
-		fFilterGetterButton = SWTFactory.createCheckButton(container, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Filter_getters, 
+		fFilterGetterButton = SWTFactory.createCheckButton(container,
+				DebugUIMessages.JavaStepFilterPreferencePage_Filter_getters,
 				null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_FILTER_GETTERS), 2);
-		fFilterSetterButton = SWTFactory.createCheckButton(container, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Filter_setters, 
+		fFilterSetterButton = SWTFactory.createCheckButton(container,
+				DebugUIMessages.JavaStepFilterPreferencePage_Filter_setters,
 				null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_FILTER_SETTERS), 2);
-		fStepThruButton = SWTFactory.createCheckButton(container, 
-				DebugUIMessages.JavaStepFilterPreferencePage_0, 
+		fStepThruButton = SWTFactory.createCheckButton(container,
+				DebugUIMessages.JavaStepFilterPreferencePage_0,
 				null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS), 2);
 	}
-	
+
 	/**
 	 * Creates the button for the step filter options
 	 * @param container the parent container
@@ -264,8 +264,8 @@
 		buttonLayout.marginWidth = 0;
 		buttonContainer.setLayout(buttonLayout);
 	//Add filter button
-		fAddFilterButton = SWTFactory.createPushButton(buttonContainer, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Add__Filter_9, 
+		fAddFilterButton = SWTFactory.createPushButton(buttonContainer,
+				DebugUIMessages.JavaStepFilterPreferencePage_Add__Filter_9,
 				DebugUIMessages.JavaStepFilterPreferencePage_Key_in_the_name_of_a_new_step_filter_10, null);
 		fAddFilterButton.addListener(SWT.Selection, new Listener() {
 			@Override
@@ -274,8 +274,8 @@
 			}
 		});
 	//Add type button
-		fAddTypeButton = SWTFactory.createPushButton(buttonContainer, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Add__Type____11, 
+		fAddTypeButton = SWTFactory.createPushButton(buttonContainer,
+				DebugUIMessages.JavaStepFilterPreferencePage_Add__Type____11,
 				DebugUIMessages.JavaStepFilterPreferencePage_Choose_a_Java_type_and_add_it_to_step_filters_12, null);
 		fAddTypeButton.addListener(SWT.Selection, new Listener() {
 			@Override
@@ -284,8 +284,8 @@
 			}
 		});
 	//Add package button
-		fAddPackageButton = SWTFactory.createPushButton(buttonContainer, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Add__Package____13, 
+		fAddPackageButton = SWTFactory.createPushButton(buttonContainer,
+				DebugUIMessages.JavaStepFilterPreferencePage_Add__Package____13,
 				DebugUIMessages.JavaStepFilterPreferencePage_Choose_a_package_and_add_it_to_step_filters_14, null);
 		fAddPackageButton.addListener(SWT.Selection, new Listener() {
 			@Override
@@ -294,9 +294,9 @@
 			}
 		});
 	//Remove button
-		fRemoveFilterButton = SWTFactory.createPushButton(buttonContainer, 
-				DebugUIMessages.JavaStepFilterPreferencePage__Remove_15, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Remove_all_selected_step_filters_16, 
+		fRemoveFilterButton = SWTFactory.createPushButton(buttonContainer,
+				DebugUIMessages.JavaStepFilterPreferencePage__Remove_15,
+				DebugUIMessages.JavaStepFilterPreferencePage_Remove_all_selected_step_filters_16,
 				null);
 		fRemoveFilterButton.addListener(SWT.Selection, new Listener() {
 			@Override
@@ -305,7 +305,7 @@
 			}
 		});
 		fRemoveFilterButton.setEnabled(false);
-		
+
 		Label separator= new Label(buttonContainer, SWT.NONE);
 		separator.setVisible(false);
 		gd = new GridData();
@@ -314,8 +314,8 @@
 		gd.heightHint= 4;
 		separator.setLayoutData(gd);
 	//Select All button
-		fSelectAllButton = SWTFactory.createPushButton(buttonContainer, 
-				DebugUIMessages.JavaStepFilterPreferencePage__Select_All_1, 
+		fSelectAllButton = SWTFactory.createPushButton(buttonContainer,
+				DebugUIMessages.JavaStepFilterPreferencePage__Select_All_1,
 				DebugUIMessages.JavaStepFilterPreferencePage_Selects_all_step_filters_2, null);
 		fSelectAllButton.addListener(SWT.Selection, new Listener() {
 			@Override
@@ -324,8 +324,8 @@
 			}
 		});
 	//De-Select All button
-		fDeselectAllButton = SWTFactory.createPushButton(buttonContainer, 
-				DebugUIMessages.JavaStepFilterPreferencePage_Deselect_All_3, 
+		fDeselectAllButton = SWTFactory.createPushButton(buttonContainer,
+				DebugUIMessages.JavaStepFilterPreferencePage_Deselect_All_3,
 				DebugUIMessages.JavaStepFilterPreferencePage_Deselects_all_step_filters_4, null);
 		fDeselectAllButton.addListener(SWT.Selection, new Listener() {
 			@Override
@@ -333,9 +333,9 @@
 				fTableViewer.setAllChecked(false);
 			}
 		});
-		
+
 	}
-		
+
 	/**
 	 * Allows a new filter to be added to the listing
 	 */
@@ -347,42 +347,42 @@
 			fTableViewer.refresh(newfilter);
 		}
 	}
-	
+
 	/**
-	 * add a new type to the listing of available filters 
+	 * add a new type to the listing of available filters
 	 */
 	private void addType() {
 		try {
-			SelectionDialog dialog = JavaUI.createTypeDialog(getShell(), 
+			SelectionDialog dialog = JavaUI.createTypeDialog(getShell(),
 				PlatformUI.getWorkbench().getProgressService(),
-				SearchEngine.createWorkspaceScope(), 
-				IJavaElementSearchConstants.CONSIDER_CLASSES, 
+				SearchEngine.createWorkspaceScope(),
+				IJavaElementSearchConstants.CONSIDER_CLASSES,
 				false);
-			dialog.setTitle(DebugUIMessages.JavaStepFilterPreferencePage_Add_type_to_step_filters_20); 
-			dialog.setMessage(DebugUIMessages.JavaStepFilterPreferencePage_Select_a_type_to_filter_when_stepping_23); 
+			dialog.setTitle(DebugUIMessages.JavaStepFilterPreferencePage_Add_type_to_step_filters_20);
+			dialog.setMessage(DebugUIMessages.JavaStepFilterPreferencePage_Select_a_type_to_filter_when_stepping_23);
 			if (dialog.open() == IDialogConstants.OK_ID) {
 				Object[] types = dialog.getResult();
 				if (types != null && types.length > 0) {
 					IType type = (IType)types[0];
 					addFilter(type.getFullyQualifiedName(), true);
 				}
-			}			
-		} 
-		catch (JavaModelException jme) { 
-			ExceptionHandler.handle(jme, 
-					DebugUIMessages.JavaStepFilterPreferencePage_Add_type_to_step_filters_20, 
+			}
+		}
+		catch (JavaModelException jme) {
+			ExceptionHandler.handle(jme,
+					DebugUIMessages.JavaStepFilterPreferencePage_Add_type_to_step_filters_20,
 					DebugUIMessages.JavaStepFilterPreferencePage_Could_not_open_type_selection_dialog_for_step_filters_21);
-		}	
+		}
 	}
-	
+
 	/**
 	 * add a new package to the list of all available package filters
 	 */
 	private void addPackage() {
 		try {
 			ElementListSelectionDialog dialog = JDIDebugUIPlugin.createAllPackagesDialog(getShell(), null, false);
-			dialog.setTitle(DebugUIMessages.JavaStepFilterPreferencePage_Add_package_to_step_filters_24); 
-			dialog.setMessage(DebugUIMessages.JavaStepFilterPreferencePage_Select_a_package_to_filter_when_stepping_27); 
+			dialog.setTitle(DebugUIMessages.JavaStepFilterPreferencePage_Add_package_to_step_filters_24);
+			dialog.setMessage(DebugUIMessages.JavaStepFilterPreferencePage_Select_a_package_to_filter_when_stepping_27);
 			dialog.setMultipleSelection(true);
 			if (dialog.open() == IDialogConstants.OK_ID) {
 				Object[] packages = dialog.getResult();
@@ -393,24 +393,24 @@
 						String filter = pkg.getElementName() + ".*"; //$NON-NLS-1$
 						addFilter(filter, true);
 					}
-				}		
+				}
 			}
-			
-		} 
-		catch (JavaModelException jme) { 
+
+		}
+		catch (JavaModelException jme) {
 			ExceptionHandler.handle(jme,
 					DebugUIMessages.JavaStepFilterPreferencePage_Add_package_to_step_filters_24,
-					DebugUIMessages.JavaStepFilterPreferencePage_Could_not_open_package_selection_dialog_for_step_filters_25);		
+					DebugUIMessages.JavaStepFilterPreferencePage_Could_not_open_package_selection_dialog_for_step_filters_25);
 		}
 	}
-	
+
 	/**
 	 * Removes the currently selected filters.
 	 */
 	protected void removeFilters() {
 		fTableViewer.remove(((IStructuredSelection)fTableViewer.getSelection()).toArray());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
 	 */
@@ -418,8 +418,8 @@
 	public boolean performOk() {
 		DebugUITools.setUseStepFilters(fUseStepFiltersButton.getSelection());
 		IPreferenceStore store = getPreferenceStore();
-		ArrayList<String> active = new ArrayList<String>();
-		ArrayList<String> inactive = new ArrayList<String>();
+		ArrayList<String> active = new ArrayList<>();
+		ArrayList<String> inactive = new ArrayList<>();
 		String name = ""; //$NON-NLS-1$
 		Filter[] filters = getAllFiltersFromTable();
 		for(int i = 0; i < filters.length; i++) {
@@ -443,7 +443,7 @@
 		store.setValue(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS, fStepThruButton.getSelection());
 		return super.performOk();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
 	 */
@@ -459,10 +459,10 @@
 		fFilterSetterButton.setSelection(getPreferenceStore().getDefaultBoolean(IJDIPreferencesConstants.PREF_FILTER_SETTERS));
 		fStepThruButton.setSelection(getPreferenceStore().getDefaultBoolean(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS));
 		fTableViewer.getTable().removeAll();
-		initTableState(true);				
+		initTableState(true);
 		super.performDefaults();
 	}
-	
+
 	/**
 	 * adds a single filter to the viewer
 	 * @param filter the new filter to add
@@ -476,7 +476,7 @@
 			fTableViewer.setChecked(f, checked);
 		}
 	}
-	
+
 	/**
 	 * returns all of the filters from the table, this includes ones that have not yet been saved
 	 * @return a possibly empty lits of filters fron the table
@@ -491,7 +491,7 @@
 		}
 		return filters;
 	}
-	
+
 	/**
 	 * Returns all of the committed filters
 	 * @return an array of committed filters
@@ -503,8 +503,8 @@
 		IPreferenceStore store = getPreferenceStore();
 		if(defaults) {
 			activefilters = JavaDebugOptionsManager.parseList(store.getDefaultString(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST));
-			inactivefilters = JavaDebugOptionsManager.parseList(store.getDefaultString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST)); 
-		}	
+			inactivefilters = JavaDebugOptionsManager.parseList(store.getDefaultString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST));
+		}
 		else {
 			activefilters = JavaDebugOptionsManager.parseList(store.getString(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST));
 			inactivefilters = JavaDebugOptionsManager.parseList(store.getString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST));
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaThreadActionFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaThreadActionFilter.java
index 4386386..4477363 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaThreadActionFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaThreadActionFilter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -41,10 +41,10 @@
 							return true;
 						}
 					} catch (CoreException e) {
-					}	
+					}
 				}
 			}
-				
+
 		}
 		return false;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaVarActionFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaVarActionFilter.java
index f12edd1..93639d8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaVarActionFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaVarActionFilter.java
@@ -33,7 +33,7 @@
 
 /**
  * Provides the action filter for Java and Inspect actions
- * 
+ *
  * @since 3.2
  */
 public class JavaVarActionFilter implements IActionFilter {
@@ -48,7 +48,7 @@
 	 * @return the set of predefined types
 	 */
 	private static Set<String> initPrimitiveTypes() {
-		HashSet<String> set = new HashSet<String>(8);
+		HashSet<String> set = new HashSet<>(8);
 		set.add("short"); //$NON-NLS-1$
 		set.add("int"); //$NON-NLS-1$
 		set.add("long"); //$NON-NLS-1$
@@ -60,7 +60,7 @@
 		set.add("null"); //$NON-NLS-1$
 		return set;
 	}
-	
+
 	/**
 	 * Determines if the declared value is the same as the concrete value
 	 * @param var the variable to inspect
@@ -80,14 +80,14 @@
 
 	/**
 	 * Determines if the passed object is a primitive type or not
-	 * @param obj the obj to test 
+	 * @param obj the obj to test
 	 * @return true if the object is primitive, false otherwise
 	 */
 	protected boolean isPrimitiveType(Object obj) {
 		if(obj instanceof IJavaVariable) {
 			try {
 				return !fgPrimitiveTypes.contains(removeArray(((IJavaVariable) obj).getReferenceTypeName()));
-			} 
+			}
 			catch (DebugException e) {
 				if(!(e.getStatus().getException() instanceof ClassNotLoadedException)) {
 					JDIDebugUIPlugin.log(e);
@@ -106,7 +106,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * This method returns if the specified object is an array or not
 	 * @param object the object to test
@@ -120,29 +120,29 @@
 				if(type != null) {
 					return type instanceof IJavaArrayType;
 				}
-			} 
+			}
 			catch (DebugException e) {JDIDebugUIPlugin.log(e);}
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Determines if the ref type of the value is primitive
-	 * 
+	 *
 	 * @param var the variable to inspect
 	 * @return true if the the values ref type is primitive, false otherwise
 	 */
 	protected boolean isValuePrimitiveType(IValue value) {
 		try {
 			return !fgPrimitiveTypes.contains(removeArray(value.getReferenceTypeName()));
-		} 
+		}
 		catch (DebugException e) {JDIDebugUIPlugin.log(e);}
 		return false;
 	}
-	
+
 	/**
 	 * Method removes the array declaration characters to return just the type
-	 * 
+	 *
 	 * @param typeName the type name we want to strip the array delimiters from
 	 * @return the altered type
 	 */
@@ -155,7 +155,7 @@
 		}
 		return type;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionFilter#testAttribute(java.lang.Object, java.lang.String, java.lang.String)
 	 */
@@ -166,17 +166,17 @@
 			IValue varValue;
 			try {
 				varValue = var.getValue();
-				if (name.equals("PrimitiveVariableActionFilter")) { //$NON-NLS-1$ 
+				if (name.equals("PrimitiveVariableActionFilter")) { //$NON-NLS-1$
 					if (value.equals("isPrimitive")) { //$NON-NLS-1$
 						return isPrimitiveType(var);
-					} 
+					}
 					else if(value.equals("isArray")) { //$NON-NLS-1$
 						return isArrayType(var);
 					}
 					else if (value.equals("isValuePrimitive")) { //$NON-NLS-1$
 						return isValuePrimitiveType(varValue);
 					}
-				} 
+				}
 				if (name.equals("JavaVariableFilter")) { //$NON-NLS-1$
 					if (value.equals("isInstanceRetrievalAvailable")) { //$NON-NLS-1$
 						return isInstanceRetrievalAvailable(var);
@@ -193,15 +193,15 @@
 				}
 				else if (name.equals("ConcreteVariableActionFilter") && value.equals("isConcrete")) { //$NON-NLS-1$ //$NON-NLS-2$
 					return isDeclaredSameAsConcrete(var);
-				} 
+				}
 				else if (name.equals("JavaVariableActionFilter")) { //$NON-NLS-1$
-					if(value.equals("instanceFilter")) { //$NON-NLS-1$ 
+					if(value.equals("instanceFilter")) { //$NON-NLS-1$
 						return !var.isStatic() && (varValue instanceof IJavaObject) && (((IJavaObject)varValue).getJavaType() instanceof IJavaClassType) && ((IJavaDebugTarget)var.getDebugTarget()).supportsInstanceBreakpoints();
 					}
 					if(value.equals("isValidField")) { //$NON-NLS-1$
 						return !var.isFinal() & !(var.isFinal() & var.isStatic());
-					}	
-				} 
+					}
+				}
 				else if (name.equals("DetailFormatterFilter") & (varValue instanceof IJavaObject)) { //$NON-NLS-1$
 					if(value.equals("isDefined")) { //$NON-NLS-1$
 						return JavaDetailFormattersManager.getDefault().hasAssociatedDetailFormatter(((IJavaObject)varValue).getJavaType());
@@ -212,17 +212,17 @@
 					if(value.equals("inSuperclass")) { //$NON-NLS-1$
 						return JavaDetailFormattersManager.getDefault().hasSuperclassDetailFormatter(((IJavaObject)varValue).getJavaType());
 					}
-				} 
+				}
 				else if (name.equals("JavaLogicalStructureFilter") && value.equals("canEditLogicalStructure")) {  //$NON-NLS-1$ //$NON-NLS-2$
                     return varValue instanceof JavaStructureErrorValue || EditVariableLogicalStructureAction.getLogicalStructure(varValue) != null;
                 }
-			} catch (DebugException e) {}	
+			} catch (DebugException e) {}
 		}
 		else if (target instanceof JavaInspectExpression) {
 			JavaInspectExpression exp = (JavaInspectExpression) target;
 			if (name.equals("PrimitiveVariableActionFilter") && value.equals("isNotPrimitive")) { //$NON-NLS-1$ //$NON-NLS-2$
 				return !isPrimitiveType(exp);
-			} 
+			}
 			else if (name.equals("DetailFormatterFilter")) { //$NON-NLS-1$
 				try {
 					IValue varValue = exp.getValue();
@@ -237,7 +237,7 @@
 							return JavaDetailFormattersManager.getDefault().hasSuperclassDetailFormatter(((IJavaObject)varValue).getJavaType());
 						}
 					}
-				} 
+				}
 				catch (DebugException exception) {}
 			}
 		}
@@ -246,11 +246,11 @@
 
 	/**
 	 * Returns whether this variable's VM supports instance/reference information.
-	 * 
+	 *
 	 * @param var variable
 	 * @return whether this variable's VM supports instance/reference information
 	 */
 	protected boolean isInstanceRetrievalAvailable(IJavaVariable var) {
 		return ((IJavaDebugTarget)var.getDebugTarget()).supportsInstanceRetrieval() && !(var instanceof JDIReferenceListVariable);
-	}	
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
index c4e5ef4..2206408 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,10 +33,10 @@
 import org.eclipse.jdt.internal.debug.ui.display.JavaInspectExpression;
 
 /**
- * 
+ *
  */
 public class JavaWatchExpressionDelegate implements IWatchExpressionDelegate {
-	
+
 	private String fExpressionText;
 	private IWatchExpressionListener fListener;
 
@@ -58,7 +58,7 @@
 			}
 		}
 		if (frame == null) {
-			fListener.watchEvaluationFinished(null);	
+			fListener.watchEvaluationFinished(null);
 		} else {
 			// consult the adapter in case of a wrappered debug model
 			final IJavaStackFrame javaStackFrame = ((IAdaptable) frame).getAdapter(IJavaStackFrame.class);
@@ -66,16 +66,16 @@
 				doEvaluation(javaStackFrame);
 			} else {
 				fListener.watchEvaluationFinished(null);
-			}	
+			}
 		}
 	}
-	
+
 	/**
 	 * Ask to evaluate the expression in the context of the given stack frame.
-	 * 
+	 *
 	 * The evaluation is performed asynchronously. A change debug event, with
 	 * this as the source, is fired when the evaluation is completed.
-	 * 
+	 *
 	 * @param javaStackFrame the stack frame in the context of which performed
 	 * the evaluation.
 	 */
@@ -87,7 +87,7 @@
 			fListener.watchEvaluationFinished(null);
 		}
 	}
-	
+
 	private boolean preEvaluationCheck(IJavaThread javaThread) {
 		if (javaThread == null) {
 			return false;
@@ -97,18 +97,18 @@
 		}
 		return true;
 	}
-	
+
 	/**
 	 * Runnable used to evaluate the expression.
 	 */
 	private final class EvaluationRunnable implements Runnable {
-		
+
 		private final IJavaStackFrame fStackFrame;
-		
+
 		private EvaluationRunnable(IJavaStackFrame frame) {
 			fStackFrame= frame;
 		}
-		
+
 		@Override
 		public void run() {
 			IJavaProject project = JavaDebugUtils.resolveJavaProject(fStackFrame);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWordFinder.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWordFinder.java
index 6ee5806..889cbd2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWordFinder.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWordFinder.java
@@ -4,12 +4,12 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
- 
+
 
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
@@ -23,32 +23,32 @@
  * selection.
  */
 public class JavaWordFinder {
-	
+
 	/**
 	 * Returns the IRegion containing the java identifier ("word") enclosing the specified offset or
 	 * <code>null</code> if the document or offset is invalid.  Checks characters before and after the
 	 * offset to see if they are allowed java identifier characters until a separator character (period,
 	 * space, etc) is found.
-	 * 
+	 *
 	 * @param document The document to search
 	 * @param offset The offset to start looking for the word
 	 * @return IRegion containing the word or <code>null</code>
 	 */
 	public static IRegion findWord(IDocument document, int offset) {
-		
+
 		if (document == null){
 			return null;
 		}
-		
+
 		int start= -2;
 		int end= -1;
-		
-		
+
+
 		try {
-			
+
 			int pos= offset;
 			char c;
-			
+
 			while (pos >= 0) {
 				c= document.getChar(pos);
 				if (!Character.isJavaIdentifierPart(c)) {
@@ -67,24 +67,24 @@
 				}
 				--pos;
 			}
-			
+
 			start= pos;
-			
+
 			pos= offset;
 			int length= document.getLength();
-			
+
 			while (pos < length) {
 				c= document.getChar(pos);
 				if (!Character.isJavaIdentifierPart(c))
 					break;
 				++pos;
 			}
-			
+
 			end= pos;
-			
+
 		} catch (BadLocationException x) {
 		}
-		
+
 		if (start >= -1 && end > -1) {
 			if (start == offset && end == offset)
 				return new Region(offset, 0);
@@ -93,7 +93,7 @@
 			else
 				return new Region(start + 1, end - start - 1);
 		}
-		
+
 		return null;
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/LocalFileStorageEditorInput.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/LocalFileStorageEditorInput.java
index d61c7c4..f3c64f7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/LocalFileStorageEditorInput.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/LocalFileStorageEditorInput.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,11 +16,11 @@
 
 	/**
 	 * Constructs an editor input for the given storage
-	 */	
+	 */
 	public LocalFileStorageEditorInput(LocalFileStorage storage) {
 		super(storage);
 	}
-	
+
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IEditorInput#exists()
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java
index e9f7a1d..456c592 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java
@@ -69,8 +69,8 @@
 					}
 					try {
 						return type != null && type.isInterface();
-					} 
-					catch (JavaModelException e) {JDIDebugUIPlugin.log(e);}  
+					}
+					catch (JavaModelException e) {JDIDebugUIPlugin.log(e);}
 				}
 				if(value.equals("isConstructor")) { //$NON-NLS-1$
 					IMethod method = null;
@@ -81,14 +81,14 @@
 						} catch (JavaModelException e) {
 							JDIDebugUIPlugin.log(e);
 							return false;
-						}  
+						}
 					}
 				}
 				if(value.equals("isValidField")) { //$NON-NLS-1$
 					try {
 						int flags = member.getFlags();
 						return (member.getElementType() == IJavaElement.FIELD) & (!Flags.isFinal(flags) & !(Flags.isStatic(flags) & Flags.isFinal(flags)));
-					} 
+					}
 					catch (JavaModelException e) {
 						JDIDebugUIPlugin.log(e);
 						return false;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/NoLineNumberAttributesStatusHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/NoLineNumberAttributesStatusHandler.java
index 9b81ef5..209bac1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/NoLineNumberAttributesStatusHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/NoLineNumberAttributesStatusHandler.java
@@ -30,10 +30,10 @@
 		IPreferenceStore preferenceStore= JDIDebugUIPlugin.getDefault().getPreferenceStore();
 		if (preferenceStore.getBoolean(IJDIPreferencesConstants.PREF_ALERT_UNABLE_TO_INSTALL_BREAKPOINT)) {
 			final ErrorDialogWithToggle dialog= new ErrorDialogWithToggle(JDIDebugUIPlugin.getActiveWorkbenchShell(),
-					DebugUIMessages.NoLineNumberAttributesStatusHandler_Java_Breakpoint_1, 
-					NLS.bind(DebugUIMessages.NoLineNumberAttributesStatusHandler_2, new String[] {type.name()}), 
+					DebugUIMessages.NoLineNumberAttributesStatusHandler_Java_Breakpoint_1,
+					NLS.bind(DebugUIMessages.NoLineNumberAttributesStatusHandler_2, new String[] {type.name()}),
 					status, IJDIPreferencesConstants.PREF_ALERT_UNABLE_TO_INSTALL_BREAKPOINT,
-					DebugUIMessages.NoLineNumberAttributesStatusHandler_3, 
+					DebugUIMessages.NoLineNumberAttributesStatusHandler_3,
 					preferenceStore);
 			Display display= JDIDebugUIPlugin.getStandardDisplay();
 			display.syncExec(new Runnable() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/PackageSelectionDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/PackageSelectionDialog.java
index ce977ff..68dcb44 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/PackageSelectionDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/PackageSelectionDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,16 +25,16 @@
 	public PackageSelectionDialog(Shell parent, ILabelProvider renderer) {
 		super(parent, renderer);
 	}
-	
+
 	/**
 	 * Returns the name of the section that this dialog stores its settings in
-	 * 
+	 *
 	 * @return String
 	 */
 	protected String getDialogSettingsSectionName() {
 		return IJavaDebugUIConstants.PLUGIN_ID + ".PACKAGE_SELECTION_DIALOG_SECTION"; //$NON-NLS-1$
 	}
-	
+
 	 /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
      */
@@ -44,7 +44,7 @@
          IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
          if (section == null) {
              section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
+         }
          return section;
     }
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StatusInfo.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StatusInfo.java
index 957a9ab..6167c62 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StatusInfo.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StatusInfo.java
@@ -15,15 +15,15 @@
 import org.eclipse.jdt.ui.JavaUI;
 
 /**
- * A settable IStatus. 
+ * A settable IStatus.
  * Can be an error, warning, info or ok. For error, info and warning states,
  * a message describes the problem.
  */
 public class StatusInfo implements IStatus {
-	
+
 	private String fStatusMessage;
 	private int fSeverity;
-	
+
 	/**
 	 * Creates a status set to OK (no message)
 	 */
@@ -36,12 +36,12 @@
 	 * @param severity The status severity: ERROR, WARNING, INFO and OK.
 	 * @param message The message of the status. Applies only for ERROR,
 	 * WARNING and INFO.
-	 */	
+	 */
 	public StatusInfo(int severity, String message) {
 		fStatusMessage= message;
 		fSeverity= severity;
-	}		
-	
+	}
+
 	/**
 	 *  Returns if the status' severity is OK.
 	 */
@@ -52,25 +52,25 @@
 
 	/**
 	 *  Returns if the status' severity is WARNING.
-	 */	
+	 */
 	public boolean isWarning() {
 		return fSeverity == IStatus.WARNING;
 	}
 
 	/**
 	 *  Returns if the status' severity is INFO.
-	 */	
+	 */
 	public boolean isInfo() {
 		return fSeverity == IStatus.INFO;
-	}	
+	}
 
 	/**
 	 *  Returns if the status' severity is ERROR.
-	 */	
+	 */
 	public boolean isError() {
 		return fSeverity == IStatus.ERROR;
 	}
-	
+
 	/**
 	 * @see IStatus#getMessage
 	 */
@@ -78,11 +78,11 @@
 	public String getMessage() {
 		return fStatusMessage;
 	}
-	
+
 	/**
 	 * Sets the status to ERROR.
 	 * @param The error message (can be empty, but not null)
-	 */	
+	 */
 	public void setError(String errorMessage) {
 		Assert.isNotNull(errorMessage);
 		fStatusMessage= errorMessage;
@@ -92,7 +92,7 @@
 	/**
 	 * Sets the status to WARNING.
 	 * @param The warning message (can be empty, but not null)
-	 */		
+	 */
 	public void setWarning(String warningMessage) {
 		Assert.isNotNull(warningMessage);
 		fStatusMessage= warningMessage;
@@ -102,21 +102,21 @@
 	/**
 	 * Sets the status to INFO.
 	 * @param The info message (can be empty, but not null)
-	 */		
+	 */
 	public void setInfo(String infoMessage) {
 		Assert.isNotNull(infoMessage);
 		fStatusMessage= infoMessage;
 		fSeverity= IStatus.INFO;
-	}	
+	}
 
 	/**
 	 * Sets the status to OK.
-	 */		
+	 */
 	public void setOK() {
 		fStatusMessage= null;
 		fSeverity= IStatus.OK;
 	}
-	
+
 	/*
 	 * @see IStatus#matches(int)
 	 */
@@ -175,6 +175,6 @@
 	@Override
 	public IStatus[] getChildren() {
 		return new IStatus[0];
-	}	
+	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StorageEditorInput.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StorageEditorInput.java
index aba5ea9..675ef64 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StorageEditorInput.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/StorageEditorInput.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui;
 
- 
+
 import org.eclipse.core.resources.IStorage;
 import org.eclipse.core.runtime.PlatformObject;
 import org.eclipse.jdt.ui.ISharedImages;
@@ -26,14 +26,14 @@
 	 * Storage associated with this editor input
 	 */
 	private IStorage fStorage;
-	
+
 	/**
 	 * Constructs an editor input on the given storage
 	 */
 	public StorageEditorInput(IStorage storage) {
 		fStorage = storage;
 	}
-	
+
 	/**
 	 * @see IStorageEditorInput#getStorage()
 	 */
@@ -73,7 +73,7 @@
 	public String getToolTipText() {
 		return getStorage().getFullPath().toOSString();
 	}
-	
+
 	/**
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
@@ -82,7 +82,7 @@
 		return object instanceof StorageEditorInput &&
 		 getStorage().equals(((StorageEditorInput)object).getStorage());
 	}
-	
+
 	/**
 	 * @see java.lang.Object#hashCode()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/SuspendTimeoutStatusHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/SuspendTimeoutStatusHandler.java
index 04c7562..e49a954 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/SuspendTimeoutStatusHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/SuspendTimeoutStatusHandler.java
@@ -27,7 +27,7 @@
 	@Override
 	public Object handleStatus(IStatus status, Object source) throws CoreException {
 		IJavaThread thread= (IJavaThread) source;
-		final ErrorDialog dialog= new ErrorDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), DebugUIMessages.SuspendTimeoutHandler_suspend, NLS.bind(DebugUIMessages.SuspendTimeoutHandler_timeout_occurred, new String[] {thread.getName()}), status, IStatus.WARNING | IStatus.ERROR | IStatus.INFO); // 
+		final ErrorDialog dialog= new ErrorDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), DebugUIMessages.SuspendTimeoutHandler_suspend, NLS.bind(DebugUIMessages.SuspendTimeoutHandler_timeout_occurred, new String[] {thread.getName()}), status, IStatus.WARNING | IStatus.ERROR | IStatus.INFO); //
 		Display display= JDIDebugUIPlugin.getStandardDisplay();
 		display.syncExec(new Runnable() {
 			@Override
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/TypeNameResolver.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/TypeNameResolver.java
index 083c58f..8f7736a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/TypeNameResolver.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/TypeNameResolver.java
@@ -36,16 +36,16 @@
 			IType type= getType(javaElement);
 			if (type != null) {
 				return type.getFullyQualifiedName();
-			}	
+			}
 		}
-		abort(DebugUIMessages.TypeNameResolver_0, null); 
+		abort(DebugUIMessages.TypeNameResolver_0, null);
 		return null;
 	}
-	
+
 	/**
 	 * Returns the primary type in the given Java element
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param element the Java element
 	 * @return the primary type in the given Java element
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ZipEntryStorageEditorInput.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ZipEntryStorageEditorInput.java
index 09562eb..4404679 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ZipEntryStorageEditorInput.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ZipEntryStorageEditorInput.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,11 +13,11 @@
 import org.eclipse.debug.core.sourcelookup.containers.ZipEntryStorage;
 
 public class ZipEntryStorageEditorInput extends StorageEditorInput {
-	
+
 	public ZipEntryStorageEditorInput(ZipEntryStorage storage) {
 		super(storage);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IEditorInput#exists()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractAddStepFilterAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractAddStepFilterAction.java
index 1eda4c9..defafc1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractAddStepFilterAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractAddStepFilterAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 /**
  * This abstract class defines the behavior common to actions that allow the
  * user to add step filters dynamically, as they are debugging.
- * 
+ *
  * @since 2.1
  */
 public abstract class AbstractAddStepFilterAction extends ObjectActionDelegate {
@@ -37,7 +37,7 @@
 	 */
 	@Override
 	public void run(IAction action) {
-		
+
 		// Make sure there is a current selection
 		IStructuredSelection selection= getCurrentSelection();
 		if (selection == null) {
@@ -50,56 +50,56 @@
 			IJavaStackFrame frame = itr.next();
 			String pattern = generateStepFilterPattern(frame);
 			if (pattern != null) {
-				addActiveStepFilter(pattern);						
+				addActiveStepFilter(pattern);
 			}
-		}	    
+		}
 	}
-	
+
 	/**
 	 * Make the specified pattern an active step filter.
 	 */
 	private void addActiveStepFilter(String pattern) {
-		
+
 		// Get the active & inactive filter preferences and convert them to Lists
 		IPreferenceStore prefStore = getPreferenceStore();
 		String[] activeArray = JavaDebugOptionsManager.parseList(prefStore.getString(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST));
 		String[] inactiveArray = JavaDebugOptionsManager.parseList(prefStore.getString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST));
-		List<String> activeList = new ArrayList<String>(Arrays.asList(activeArray));
-		List<String> inactiveList = new ArrayList<String>(Arrays.asList(inactiveArray));
-		
+		List<String> activeList = new ArrayList<>(Arrays.asList(activeArray));
+		List<String> inactiveList = new ArrayList<>(Arrays.asList(inactiveArray));
+
 		// If the pattern is already in the active list, there's nothing to do
 		// (it can't/shouldn't be in the inactive list)
 		if (activeList.contains(pattern)) {
 			return;
 		}
-		
+
 		// Add the pattern to the active list and update the preference store
 		activeList.add(pattern);
 		String activePref = JavaDebugOptionsManager.serializeList(activeList.toArray(new String[activeList.size()]));
 		prefStore.setValue(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST, activePref);
-	
+
 		// If the pattern was present in the inactive list, remove it since we just
 		// added it to the active list
 		if (inactiveList.contains(pattern)) {
 			inactiveList.remove(pattern);
 			String inactivePref = JavaDebugOptionsManager.serializeList(inactiveList.toArray(new String[inactiveList.size()]));
-			prefStore.setValue(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST, inactivePref);			
+			prefStore.setValue(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST, inactivePref);
 		}
 	}
-	
+
 	/**
 	 * Convenience method to get the preference store.
 	 */
 	private IPreferenceStore getPreferenceStore() {
 		return JDIDebugUIPlugin.getDefault().getPreferenceStore();
 	}
-	
+
 	/**
 	 * Generate an appropriate String pattern for the specified Java stack
 	 * frame or return null if generation failed.  For example, the pattern for
 	 * a type might look like, "com. example.MyType", while the pattern for a
 	 * package might look like, "com. example.*".
-	 * 
+	 *
 	 * @param frame the Java stack frame used to generate a String pattern
 	 * @return String the pattern or <code>null</code> if one could not be
 	 * generated
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ActionDelegateHelper.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ActionDelegateHelper.java
index 09cd098..4542e0f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ActionDelegateHelper.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ActionDelegateHelper.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,14 +38,14 @@
 	private ITextEditor fTextEditor= null;
 	private ISelection fCurrentSelection= null;
 	private IWorkbenchWindow fCurrentWindow= null;
-	
+
 	public static ActionDelegateHelper getDefault() {
 		if (fgDefault == null) {
 			fgDefault= new ActionDelegateHelper();
-		} 
+		}
 		return fgDefault;
 	}
-	
+
 	private ActionDelegateHelper() {
 		fCurrentWindow= JDIDebugUIPlugin.getActiveWorkbenchWindow();
 		if (fCurrentWindow != null) {
@@ -58,7 +58,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * @see IPartListener#partActivated(IWorkbenchPart)
 	 */
@@ -88,7 +88,7 @@
 	 * @see IPartListener#partDeactivated(IWorkbenchPart)
 	 */
 	@Override
-	public void partDeactivated(IWorkbenchPart part) {		
+	public void partDeactivated(IWorkbenchPart part) {
 	}
 
 	/**
@@ -105,17 +105,17 @@
 	protected void setMember(IMember member) {
 		fMember = member;
 	}
-	
+
 	protected void checkToSetTextEditor(IWorkbenchPart part) {
 		if (part instanceof ITextEditor) {
 			if (part instanceof JavaSnippetEditor) {
 				cleanup();
 			} else {
 				setTextEditor((ITextEditor)part);
-			}	
-		} 
+			}
+		}
 	}
-	
+
 	public IMember getCurrentMember(ITextSelection currentSelection) {
 		if (currentSelection == getCurrentSelection()) {
 			return getMember();
@@ -151,11 +151,11 @@
 		} catch (JavaModelException jme) {
 			JDIDebugUIPlugin.log(jme);
 		}
-		
+
 		setMember(m);
 		return m;
 	}
-	
+
 	protected ITextEditor getTextEditor() {
 		return fTextEditor;
 	}
@@ -163,7 +163,7 @@
 	protected void setTextEditor(ITextEditor textEditor) {
 		fTextEditor = textEditor;
 	}
-	
+
 	protected ISelection getCurrentSelection() {
 		return fCurrentSelection;
 	}
@@ -171,7 +171,7 @@
 	protected void setCurrentSelection(ISelection currentSelection) {
 		fCurrentSelection = currentSelection;
 	}
-	
+
 	/**
 	 * @see IWindowListener#windowActivated(IWorkbenchWindow)
 	 */
@@ -213,7 +213,7 @@
 	@Override
 	public void windowOpened(IWorkbenchWindow window) {
 	}
-	
+
 	protected void cleanup() {
 		setTextEditor(null);
 		setCurrentSelection(null);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddAdvancedAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddAdvancedAction.java
index 0a3a70d..aef430d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddAdvancedAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddAdvancedAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,26 +20,26 @@
  * Opens a dialog to allow the user to choose among advanced actions.
  */
 public class AddAdvancedAction extends RuntimeClasspathAction {
-	
+
 	private IAction[] fActions;
 
 	public AddAdvancedAction(IClasspathViewer viewer, IAction[] actions) {
-		super(ActionMessages.AddAdvancedAction_Ad_vanced____1, viewer); 
+		super(ActionMessages.AddAdvancedAction_Ad_vanced____1, viewer);
 		fActions = actions;
 		setViewer(viewer);
-	}	
+	}
 
 	/**
 	 * Prompts for a project to add.
-	 * 
+	 *
 	 * @see IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
 		Dialog dialog = new RuntimeClasspathAdvancedDialog(getShell(), fActions, getViewer());
-		dialog.open();			
+		dialog.open();
 	}
-		
+
 	/**
 	 * @see RuntimeClasspathAction#setViewer(RuntimeClasspathViewer)
 	 */
@@ -54,7 +54,7 @@
 			}
 		}
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return ADD;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalFolderAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalFolderAction.java
index dbabed5..7208dec 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalFolderAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalFolderAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,36 +26,36 @@
 public class AddExternalFolderAction extends OpenDialogAction {
 
 	public AddExternalFolderAction(IClasspathViewer viewer, String dialogSettingsPrefix) {
-		super(ActionMessages.AddExternalFolderAction_Add_External_Folder_1, viewer, dialogSettingsPrefix); 
-	}	
+		super(ActionMessages.AddExternalFolderAction_Add_External_Folder_1, viewer, dialogSettingsPrefix);
+	}
 
 	/**
 	 * Prompts for a folder to add.
-	 * 
+	 *
 	 * @see IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
-							
+
 		String lastUsedPath= getDialogSetting(LAST_PATH_SETTING);
 		if (lastUsedPath == null) {
 			lastUsedPath= ""; //$NON-NLS-1$
 		}
 		DirectoryDialog dialog= new DirectoryDialog(getShell(), SWT.MULTI);
-		dialog.setText(ActionMessages.AddExternalFolderAction_Folder_Selection_3); 
+		dialog.setText(ActionMessages.AddExternalFolderAction_Folder_Selection_3);
 		dialog.setFilterPath(lastUsedPath);
 		String res= dialog.open();
 		if (res == null) {
 			return;
 		}
-			
+
 		IPath filterPath= new Path(dialog.getFilterPath());
 		IRuntimeClasspathEntry[] elems= new IRuntimeClasspathEntry[1];
-		IPath path= new Path(res).makeAbsolute();	
+		IPath path= new Path(res).makeAbsolute();
 		elems[0]= JavaRuntime.newArchiveRuntimeClasspathEntry(path);
 
 		setDialogSetting(LAST_PATH_SETTING, filterPath.toOSString());
-		
+
 		getViewer().addEntries(elems);
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalJarAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalJarAction.java
index 9a8f3f7..5a5b764 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalJarAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddExternalJarAction.java
@@ -30,23 +30,23 @@
 public class AddExternalJarAction extends OpenDialogAction {
 
 	public AddExternalJarAction(IClasspathViewer viewer, String dialogSettingsPrefix) {
-		super(ActionMessages.AddExternalJar_Add_E_xternal_JARs_1, viewer, dialogSettingsPrefix); 
-	}	
+		super(ActionMessages.AddExternalJar_Add_E_xternal_JARs_1, viewer, dialogSettingsPrefix);
+	}
 
 	/**
 	 * Prompts for a project to add.
-	 * 
+	 *
 	 * @see IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
-							
+
 		String lastUsedPath = getDialogSetting(LAST_PATH_SETTING);
 		if (lastUsedPath == null) {
 			lastUsedPath = ""; //$NON-NLS-1$
 		}
 		FileDialog dialog = new FileDialog(getShell(), SWT.MULTI);
-		dialog.setText(ActionMessages.AddExternalJar_Jar_Selection_3); 
+		dialog.setText(ActionMessages.AddExternalJar_Jar_Selection_3);
 		dialog.setFilterExtensions(new String[] {"*.jar;*.zip","*.*"}); //$NON-NLS-1$ //$NON-NLS-2$
 		dialog.setFilterPath(lastUsedPath);
 		String res = dialog.open();
@@ -55,12 +55,12 @@
 		}
 		String[] fileNames = dialog.getFileNames();
 		int nChosen = fileNames.length;
-			
+
 		IPath filterPath = new Path(dialog.getFilterPath());
-		ArrayList<IRuntimeClasspathEntry> list = new ArrayList<IRuntimeClasspathEntry>();
+		ArrayList<IRuntimeClasspathEntry> list = new ArrayList<>();
 		IPath path = null;
 		for (int i= 0; i < nChosen; i++) {
-			path = filterPath.append(fileNames[i]).makeAbsolute();	
+			path = filterPath.append(fileNames[i]).makeAbsolute();
 			if(path.toFile().exists()) {
 				list.add(JavaRuntime.newArchiveRuntimeClasspathEntry(path));
 			}
@@ -72,5 +72,5 @@
 			setDialogSetting(LAST_PATH_SETTING, filterPath.toOSString());
 			getViewer().addEntries(list.toArray(new IRuntimeClasspathEntry[list.size()]));
 		}
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddFolderAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddFolderAction.java
index 0ab39a5..5d37982 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddFolderAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddFolderAction.java
@@ -46,7 +46,7 @@
 
 	/**
 	 * provides a filter to remove the files from the ElementSelectionDialog
-	 * 
+	 *
 	 * @since 3.2
 	 *
 	 */
@@ -61,21 +61,21 @@
 			}
 			return false;
 		}
-		
+
 	}
-	
+
 	public AddFolderAction(IClasspathViewer viewer) {
-		super(ActionMessages.AddFolderAction_Add__Folders_1, viewer); 
-	}	
+		super(ActionMessages.AddFolderAction_Add__Folders_1, viewer);
+	}
 
 	/**
 	 * Prompts for folder(s) to add.
-	 * 
+	 *
 	 * @see IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
-		
+
 		ISelectionStatusValidator validator= new ISelectionStatusValidator() {
 			List<IResource> fAlreadySelected = getSelectedFolders();
 			@Override
@@ -86,12 +86,12 @@
 					} else if (fAlreadySelected.contains(selection[i])) {
 						return new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Classpath already includes selected folder(s).", null);  //$NON-NLS-1$
 					}
-					
+
 				}
 				return new Status(IStatus.OK, JDIDebugPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
-			}			
+			}
 		};
-		
+
 		ILabelProvider lp= new WorkbenchLabelProvider();
 		ITreeContentProvider cp= new WorkbenchContentProvider();
 
@@ -99,9 +99,9 @@
 		dialog.addFilter(new FileFilter());
         dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
 		dialog.setValidator(validator);
-		dialog.setTitle(ActionMessages.AddFolderAction_Folder_Selection_4); 
-		dialog.setMessage(ActionMessages.AddFolderAction_Choose_folders_to_add__5); 
-		dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());	
+		dialog.setTitle(ActionMessages.AddFolderAction_Folder_Selection_4);
+		dialog.setMessage(ActionMessages.AddFolderAction_Choose_folders_to_add__5);
+		dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
 
 		if (dialog.open() == Window.OK) {
 			Object[] elements= dialog.getResult();
@@ -112,16 +112,16 @@
 			}
 			getViewer().addEntries(res);
 		}
-					
+
 	}
-	
+
 	/**
 	 * Returns a list of resources of currently selected folders
 	 * @return the list of {@link IResource}s
 	 */
 	protected List<IResource> getSelectedFolders() {
 		List<IRuntimeClasspathEntry> list = getEntriesAsList();
-		List<IResource> folders = new ArrayList<IResource>();
+		List<IResource> folders = new ArrayList<>();
 		Iterator<IRuntimeClasspathEntry> iter = list.iterator();
 		while (iter.hasNext()) {
 			IRuntimeClasspathEntry entry = iter.next();
@@ -134,7 +134,7 @@
 		}
 		return folders;
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return ADD;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddJarAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddJarAction.java
index d712d13..4d66a1c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddJarAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddJarAction.java
@@ -31,17 +31,17 @@
 public class AddJarAction extends RuntimeClasspathAction {
 
 	public AddJarAction(IClasspathViewer viewer) {
-		super(ActionMessages.AddJarAction_Add__JARs_1, viewer); 
-	}	
+		super(ActionMessages.AddJarAction_Add__JARs_1, viewer);
+	}
 
 	/**
 	 * Prompts for a jar to add.
-	 * 
+	 *
 	 * @see IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
-		
+
 		IPath[] paths = BuildPathDialogAccess.chooseJAREntries(getShell(), null, getSelectedJars());
 
 		if (paths != null && paths.length > 0) {
@@ -51,16 +51,16 @@
 				res[i]= JavaRuntime.newArchiveRuntimeClasspathEntry(elem);
 			}
 			getViewer().addEntries(res);
-		}	
+		}
 	}
-	
+
 	/**
 	 * Returns a list of resources of currently selected jars
 	 * @return the selected jar paths
 	 */
 	protected IPath[] getSelectedJars() {
 		List<IRuntimeClasspathEntry> list = getEntriesAsList();
-		List<IPath> jars = new ArrayList<IPath>();
+		List<IPath> jars = new ArrayList<>();
 		Iterator<IRuntimeClasspathEntry> iter = list.iterator();
 		while (iter.hasNext()) {
 			IRuntimeClasspathEntry entry = iter.next();
@@ -73,7 +73,7 @@
 		}
 		return jars.toArray(new IPath[jars.size()]);
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return ADD;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddLibraryAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddLibraryAction.java
index 4387aa3..2cffa82 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddLibraryAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddLibraryAction.java
@@ -26,14 +26,14 @@
 public class AddLibraryAction extends RuntimeClasspathAction {
 
 	public AddLibraryAction(IClasspathViewer viewer) {
-		super(ActionMessages.AddLibraryAction_0, viewer); 
-	}	
+		super(ActionMessages.AddLibraryAction_0, viewer);
+	}
 
 	/**
 	 * Prompts for folder(s) to add.
-	 * 
+	 *
 	 * @see org.eclipse.jface.action.IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
 
@@ -45,14 +45,14 @@
 				try {
 					res[i] = JavaRuntime.newRuntimeContainerClasspathEntry(entry.getPath(), IRuntimeClasspathEntry.STANDARD_CLASSES);
 				} catch (CoreException e) {
-					JDIDebugUIPlugin.statusDialog(LauncherMessages.RuntimeClasspathAdvancedDialog_Unable_to_create_new_entry__3, e.getStatus()); 
+					JDIDebugUIPlugin.statusDialog(LauncherMessages.RuntimeClasspathAdvancedDialog_Unable_to_create_new_entry__3, e.getStatus());
 					return;
 				}
 			}
 			getViewer().addEntries(res);
-		}								
+		}
 	}
-		
+
 	@Override
 	protected int getActionType() {
 		return ADD;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddPackageStepFilterAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddPackageStepFilterAction.java
index 7ef5001..a11c0a7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddPackageStepFilterAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddPackageStepFilterAction.java
@@ -30,14 +30,14 @@
 		} catch (DebugException de) {
 			return null;
 		}
-		
+
 		// Check for default package, which is not supported by JDI
 		int lastDot = typeName.lastIndexOf('.');
 		if (lastDot < 0) {
 			return null;
-		} 
-				
-		// Append ".*" to the pattern to form a package name	
+		}
+
+		// Append ".*" to the pattern to form a package name
 		String packageName = typeName.substring(0, lastDot + 1);
 		packageName += '*';
 		return packageName;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddProjectAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddProjectAction.java
index 741330d..8120530 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddProjectAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddProjectAction.java
@@ -41,29 +41,29 @@
  * Adds a project to the runtime class path.
  */
 public class AddProjectAction extends RuntimeClasspathAction {
-	
-	
+
+
 
 	public AddProjectAction(IClasspathViewer viewer) {
-		super(ActionMessages.AddProjectAction_Add_Project_1, viewer); 
-	}	
+		super(ActionMessages.AddProjectAction_Add_Project_1, viewer);
+	}
 
 	/**
 	 * Prompts for a project to add.
-	 * 
+	 *
 	 * @see IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
 		List<IJavaProject> projects = getPossibleAdditions();
 		ProjectSelectionDialog dialog= new ProjectSelectionDialog(getShell(),projects);
-		dialog.setTitle(ActionMessages.AddProjectAction_Project_Selection_2); 
+		dialog.setTitle(ActionMessages.AddProjectAction_Project_Selection_2);
 		MultiStatus status = new MultiStatus(JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "One or more exceptions occurred while adding projects.", null);  //$NON-NLS-1$
-				
-		if (dialog.open() == Window.OK) {			
+
+		if (dialog.open() == Window.OK) {
 			Object[] selections = dialog.getResult();
-			
-			List<IJavaProject> additions = new ArrayList<IJavaProject>(selections.length);
+
+			List<IJavaProject> additions = new ArrayList<>(selections.length);
 			try {
 				for (int i = 0; i < selections.length; i++) {
 					IJavaProject jp = (IJavaProject)selections[i];
@@ -76,8 +76,8 @@
 			} catch (JavaModelException e) {
 				status.add(e.getStatus());
 			}
-			
-			List<IRuntimeClasspathEntry> runtimeEntries = new ArrayList<IRuntimeClasspathEntry>(additions.size());
+
+			List<IRuntimeClasspathEntry> runtimeEntries = new ArrayList<>(additions.size());
 			Iterator<IJavaProject> iter = additions.iterator();
 			while (iter.hasNext()) {
 				IJavaProject jp = iter.next();
@@ -92,8 +92,8 @@
 			}
 			IRuntimeClasspathEntry[] entries = runtimeEntries.toArray(new IRuntimeClasspathEntry[runtimeEntries.size()]);
 			getViewer().addEntries(entries);
-		}	
-		
+		}
+
 		if (!status.isOK()) {
 			JDIDebugUIPlugin.statusDialog(status);
 		}
@@ -106,12 +106,12 @@
 	protected boolean updateSelection(IStructuredSelection selection) {
 		return getViewer().updateSelection(getActionType(), selection) && !getPossibleAdditions().isEmpty();
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return ADD;
 	}
-	
+
 	/**
 	 * Returns the possible projects that can be added
 	 * @return the list of projects
@@ -125,11 +125,11 @@
 			JDIDebugUIPlugin.log(e);
 			projects= new IJavaProject[0];
 		}
-		List<IJavaProject> remaining = new ArrayList<IJavaProject>();
+		List<IJavaProject> remaining = new ArrayList<>();
 		for (int i = 0; i < projects.length; i++) {
 			remaining.add(projects[i]);
 		}
-		List<IJavaProject> alreadySelected = new ArrayList<IJavaProject>();
+		List<IJavaProject> alreadySelected = new ArrayList<>();
 		IRuntimeClasspathEntry[] entries = getViewer().getEntries();
 		for (int i = 0; i < entries.length; i++) {
 			if (entries[i].getType() == IRuntimeClasspathEntry.PROJECT) {
@@ -139,13 +139,13 @@
 			}
 		}
 		remaining.removeAll(alreadySelected);
-		return remaining;		
+		return remaining;
 	}
-	
+
 	/**
 	 * Adds all projects required by <code>proj</code> to the list
 	 * <code>res</code>
-	 * 
+	 *
 	 * @param proj the project for which to compute required
 	 *  projects
 	 * @param res the list to add all required projects too
@@ -154,9 +154,9 @@
 	protected void collectRequiredProjects(IJavaProject proj, List<IJavaProject> res) throws JavaModelException {
 		if (!res.contains(proj)) {
 			res.add(proj);
-			
+
 			IJavaModel model= proj.getJavaModel();
-			
+
 			IClasspathEntry[] entries= proj.getRawClasspath();
 			for (int i= 0; i < entries.length; i++) {
 				IClasspathEntry curr= entries[i];
@@ -168,12 +168,12 @@
 				}
 			}
 		}
-	}		
-	
+	}
+
 	/**
 	 * Adds all exported entries defined by <code>proj</code> to the list
 	 * <code>runtimeEntries</code>.
-	 * 
+	 *
 	 * @param proj the project
 	 * @param runtimeEntries the entries
 	 * @throws CoreException if an exception occurs
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddVariableAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddVariableAction.java
index e5d0c20..bd9c355 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddVariableAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AddVariableAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,27 +23,27 @@
 public class AddVariableAction extends RuntimeClasspathAction {
 
 	public AddVariableAction(IClasspathViewer viewer) {
-		super(ActionMessages.AddVariableAction_Add_Variables_1, viewer); 
-	}	
+		super(ActionMessages.AddVariableAction_Add_Variables_1, viewer);
+	}
 
 	/**
 	 * Prompts for variables to add.
-	 * 
+	 *
 	 * @see org.eclipse.jface.action.IAction#run()
-	 */	
+	 */
 	@Override
 	public void run() {
-		
+
 		IPath[] paths = BuildPathDialogAccess.chooseVariableEntries(getShell(), new IPath[0]);
-		if (paths != null) {			
+		if (paths != null) {
 			IRuntimeClasspathEntry[] entries = new IRuntimeClasspathEntry[paths.length];
 			for (int i = 0; i < paths.length; i++) {
 				entries[i] = JavaRuntime.newVariableRuntimeClasspathEntry(paths[i]);
 			}
 			getViewer().addEntries(entries);
-		}				
+		}
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return ADD;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AttachSourceAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AttachSourceAction.java
index 3dd0b30..98c11f6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AttachSourceAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AttachSourceAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,27 +24,27 @@
  * Attach source to an archive or variable.
  */
 public class AttachSourceAction extends RuntimeClasspathAction {
-	
+
 	private IRuntimeClasspathEntry[] fEntries;
-	
+
 	/**
 	 * Creates an action to open a source attachment dialog.
-	 * 
+	 *
 	 * @param viewer the viewer the action is associated with or <code>null</code>
 	 * @param style a button or radio button
 	 */
 	public AttachSourceAction(RuntimeClasspathViewer viewer, int style) {
-		super((style == SWT.RADIO) ? ActionMessages.AttachSourceAction_2 : ActionMessages.AttachSourceAction_3, viewer); // 
-	}	
+		super((style == SWT.RADIO) ? ActionMessages.AttachSourceAction_2 : ActionMessages.AttachSourceAction_3, viewer); //
+	}
 
 	/**
 	 * Prompts source attachment.
-	 * 
+	 *
 	 * @see org.eclipse.jface.action.IAction#run()
-	 */	
+	 */
 	@Override
-	public void run() { 
-		IClasspathEntry classpathEntry = BuildPathDialogAccess.configureSourceAttachment(getShell(), fEntries[0].getClasspathEntry()); 
+	public void run() {
+		IClasspathEntry classpathEntry = BuildPathDialogAccess.configureSourceAttachment(getShell(), fEntries[0].getClasspathEntry());
 		if (classpathEntry != null) {
 			for (int i = 0; i < fEntries.length; i++) {
 				IRuntimeClasspathEntry entry = fEntries[i];
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java
index 71ea23e..1aacd07 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java
@@ -40,9 +40,9 @@
 	 * A dialog that sets the focus to the text area.
 	 */
 	class HitCountDialog extends InputDialog {
-		
+
 		private boolean fHitCountEnabled;
-		
+
 		protected  HitCountDialog(Shell parentShell,
 									String dialogTitle,
 									String dialogMessage,
@@ -50,20 +50,20 @@
 									IInputValidator validator) {
 			super(parentShell, dialogTitle, dialogMessage, initialValue, validator);
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.dialogs.InputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
 		 */
 		@Override
 		protected Control createDialogArea(Composite parent) {
 			Composite area= (Composite)super.createDialogArea(parent);
-			
+
 			final Button checkbox = new Button(area, SWT.CHECK);
 			GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
 			data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
 			checkbox.setLayoutData(data);
 			checkbox.setFont(parent.getFont());
-			checkbox.setText(ActionMessages.BreakpointHitCountAction_Enable_Hit_Count_1); 
+			checkbox.setText(ActionMessages.BreakpointHitCountAction_Enable_Hit_Count_1);
 			checkbox.setSelection(true);
 			fHitCountEnabled = true;
 			checkbox.addSelectionListener(new SelectionListener() {
@@ -74,15 +74,15 @@
 					if (fHitCountEnabled) {
 						validateInput();
 					} else {
-						setErrorMessage(null); 
+						setErrorMessage(null);
 					}
 				}
-				
+
 				@Override
 				public void widgetDefaultSelected(SelectionEvent e) {
 				}
 			});
-			
+
 			return area;
 		}
 
@@ -111,21 +111,21 @@
 			try {
 				int oldHitCount= breakpoint.getHitCount();
 				int newHitCount= hitCountDialog(breakpoint);
-				if (newHitCount != -1) {					
+				if (newHitCount != -1) {
 					if (oldHitCount == newHitCount && newHitCount == 0) {
 						return;
 					}
 					breakpoint.setHitCount(newHitCount);
 				}
 			} catch (CoreException ce) {
-				JDIDebugUIPlugin.statusDialog(ce.getStatus()); 
+				JDIDebugUIPlugin.statusDialog(ce.getStatus());
 			}
 		}
 	}
-	
+
 	protected int hitCountDialog(IJavaBreakpoint breakpoint) {
-		String title= ActionMessages.BreakpointHitCountAction_Set_Breakpoint_Hit_Count_2; 
-		String message= ActionMessages.BreakpointHitCountAction__Enter_the_new_hit_count_for_the_breakpoint__3; 
+		String title= ActionMessages.BreakpointHitCountAction_Set_Breakpoint_Hit_Count_2;
+		String message= ActionMessages.BreakpointHitCountAction__Enter_the_new_hit_count_for_the_breakpoint__3;
 		IInputValidator validator= new IInputValidator() {
 			int hitCount= -1;
 			@Override
@@ -136,7 +136,7 @@
 					hitCount= -1;
 				}
 				if (hitCount < 1) {
-					return ActionMessages.BreakpointHitCountAction_Value_must_be_positive_integer; 
+					return ActionMessages.BreakpointHitCountAction_Value_must_be_positive_integer;
 				}
 				//no error
 				return null;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointLocationVerifierJob.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointLocationVerifierJob.java
index 95c61e5..feb8a97 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointLocationVerifierJob.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointLocationVerifierJob.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,54 +38,54 @@
  * Job used to verify the position of a breakpoint
  */
 public class BreakpointLocationVerifierJob extends Job {
-	
+
 	/**
 	 * The temporary breakpoint that has been set. Can be <code>null</code> if the callee was not able
 	 * to check if a breakpoint was already set at this position.
-	 */	
+	 */
 	private IJavaLineBreakpoint fBreakpoint;
-	
+
 	/**
 	 * The number of the line where the breakpoint has been requested.
 	 */
 	private int fLineNumber;
-	
+
 	/**
 	 * The qualified type name of the class where the temporary breakpoint as been set.
 	 * Can be <code>null</code> if fBreakpoint is null.
-	 */	
+	 */
 	private String fTypeName;
-	
+
 	/**
 	 * The type in which should be set the breakpoint.
 	 */
 	private IType fType;
-	
+
 	/**
 	 * The current IEditorPart
 	 */
 	private IEditorPart fEditorPart;
-	
+
 	/**
 	 * The parsed {@link CompilationUnit}
 	 */
 	CompilationUnit fCunit = null;
-	
+
 	/**
 	 * The document context
 	 */
 	private IDocument fDocument = null;
-	
+
 	/**
 	 * The status line to use to display errors
 	 */
 	private IEditorStatusLine fStatusLine;
-	
+
 	/**
 	 * If a best guess should be made at the breakpoint location
 	 */
 	private boolean fBestMatch = false;
-	
+
 	/**
 	 * Constructor
 	 * @param document
@@ -98,7 +98,7 @@
 	 * @param bestmatch
 	 */
 	public BreakpointLocationVerifierJob(IDocument document, CompilationUnit cunit, IJavaLineBreakpoint breakpoint, int lineNumber, String typeName, IType type, IEditorPart editorPart, boolean bestmatch) {
-		super(ActionMessages.BreakpointLocationVerifierJob_breakpoint_location); 
+		super(ActionMessages.BreakpointLocationVerifierJob_breakpoint_location);
 		fCunit = cunit;
 		fDocument = document;
 		fBreakpoint = breakpoint;
@@ -110,7 +110,7 @@
 		fStatusLine = editorPart.getAdapter(IEditorStatusLine.class);
 		setSystem(true);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -118,7 +118,7 @@
 	public IStatus run(IProgressMonitor monitor) {
 		ValidBreakpointLocationLocator locator = new ValidBreakpointLocationLocator(fCunit, fLineNumber, true, fBestMatch);
 		fCunit.accept(locator);
-		int lineNumber = locator.getLineLocation();		
+		int lineNumber = locator.getLineLocation();
 		String typeName = locator.getFullyQualifiedTypeName();
 		if (typeName == null) {
 			return new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null);
@@ -141,19 +141,19 @@
 					break;
 				default:
 					// cannot find a valid location
-					report(ActionMessages.BreakpointLocationVerifierJob_not_valid_location); 
+					report(ActionMessages.BreakpointLocationVerifierJob_not_valid_location);
 					if (fBreakpoint != null) {
 						DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(fBreakpoint, true);
 					}
-					return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null); 
+					return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null);
 			}
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
 		}
-		return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpoint_set, null); 
-		
+		return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpoint_set, null);
+
 	}
-	
+
 	/**
 	 * Determines the placement of the line breakpoint, and ensures that duplicates are not created
 	 * and that notification is sent in the event of collisions
@@ -171,36 +171,36 @@
 					if (differentLineNumber) {
 						// There is already a breakpoint on the valid line.
 						report(NLS.bind(ActionMessages.BreakpointLocationVerifierJob_0, new String[]{Integer.toString(lineNumber)}));
-						return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null); 
+						return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null);
 					}
 					// There is already a breakpoint on the valid line, but it's also the requested line.
 					// Removing the existing breakpoint.
 					DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(breakpoint, true);
-					return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpointRemoved, null); 
+					return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpointRemoved, null);
 				}
 				createNewBreakpoint(lineNumber, typeName);
-				return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpoint_set, null); 
+				return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpoint_set, null);
 			}
 			if (differentLineNumber) {
 				if (breakpointExist) {
 					// there is already a breakpoint on the valid line.
 					DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(fBreakpoint, true);
-					report(NLS.bind(ActionMessages.BreakpointLocationVerifierJob_0, new String[]{Integer.toString(lineNumber)})); 
-					return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null); 
+					report(NLS.bind(ActionMessages.BreakpointLocationVerifierJob_0, new String[]{Integer.toString(lineNumber)}));
+					return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, ActionMessages.BreakpointLocationVerifierJob_not_valid_location, null);
 				}
 				replaceBreakpoint(lineNumber, typeName);
-				return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, ActionMessages.BreakpointLocationVerifierJob_breakpointMovedToValidPosition, null); 
+				return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, ActionMessages.BreakpointLocationVerifierJob_breakpointMovedToValidPosition, null);
 			}
 			if (!typeName.equals(fTypeName)) {
 				replaceBreakpoint(lineNumber, typeName);
-				return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, ActionMessages.BreakpointLocationVerifierJob_breakpointSetToRightType, null); 
+				return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, ActionMessages.BreakpointLocationVerifierJob_breakpointSetToRightType, null);
 			}
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
 		}
-		return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpoint_set, null); 
+		return new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.OK, ActionMessages.BreakpointLocationVerifierJob_breakpoint_set, null);
 	}
-	
+
 	/**
 	 * Remove the temporary breakpoint and create a new breakpoint at the right position.
 	 */
@@ -213,14 +213,14 @@
 	 * Create a new breakpoint at the right position.
 	 */
 	private void createNewBreakpoint(int lineNumber, String typeName) throws CoreException {
-		Map<String, Object> newAttributes = new HashMap<String, Object>(10);
+		Map<String, Object> newAttributes = new HashMap<>(10);
 		int start = -1, end = -1;
 		if (fType != null) {
 			try {
 				IRegion line = fDocument.getLineInformation(lineNumber - 1);
 				start = line.getOffset();
 				end = start + line.getLength();
-				
+
 			} catch (BadLocationException ble) {
 				JDIDebugUIPlugin.log(ble);
 			}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointSuspendPolicyToggleAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointSuspendPolicyToggleAction.java
index 8a1d583..70fd40a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointSuspendPolicyToggleAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointSuspendPolicyToggleAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IActionDelegate;
- 
+
 /**
  * Toggles whether a breakpoint suspends a VM or only
  * the event thread.
@@ -29,10 +29,10 @@
 
 	/**
 	 * What the current policy of the action is
-	 * @since 3.3 
+	 * @since 3.3
 	 */
 	private int fCurrentPolicy = IJavaBreakpoint.SUSPEND_THREAD;
-	
+
 	/**
 	 * @see BreakpointToggleAction#doAction(IJavaBreakpoint)
 	 */
@@ -62,7 +62,7 @@
 			if (!(element instanceof IJavaBreakpoint)) {
 				return false;
 			}
-			
+
 		}
 		return true;
 	}
@@ -78,7 +78,7 @@
 			update(action, bp);
 		}
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.BreakpointToggleAction#isToggleAction()
 	 */
@@ -93,14 +93,14 @@
 	public void update(IAction action, IJavaBreakpoint breakpoint) {
 		try {
 			if (breakpoint.getSuspendPolicy() == IJavaBreakpoint.SUSPEND_THREAD) {
-				action.setText(ActionMessages.BreakpointSuspendPolicy_Suspend__VM_1); 
+				action.setText(ActionMessages.BreakpointSuspendPolicy_Suspend__VM_1);
 				fCurrentPolicy = IJavaBreakpoint.SUSPEND_VM;
 			} else {
-				action.setText(ActionMessages.BreakpointSuspendPolicy_Suspend__Thread_2); 
+				action.setText(ActionMessages.BreakpointSuspendPolicy_Suspend__Thread_2);
 				fCurrentPolicy = IJavaBreakpoint.SUSPEND_THREAD;
 			}
 		} catch (CoreException e) {
 			 JDIDebugUIPlugin.log(e);
 		}
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleAction.java
index 78f0227..c15d3b6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleAction.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
- 
+
 import java.util.Iterator;
 
 import org.eclipse.core.resources.IMarker;
@@ -35,7 +35,7 @@
  * Provides a general toggle action for breakpoints to reuse
  */
 public abstract class BreakpointToggleAction implements IObjectActionDelegate, IBreakpointsListener, IPartListener {
-	
+
 	private IStructuredSelection fSelection;
 	private IAction fAction;
 	private IWorkbenchPart fPart;
@@ -52,10 +52,10 @@
 				IJavaBreakpoint breakpoint= itr.next();
 				doAction(breakpoint);
 			} catch (CoreException e) {
-				String title= ActionMessages.BreakpointAction_Breakpoint_configuration_1; 
-				String message= ActionMessages.BreakpointAction_Exceptions_occurred_attempting_to_modify_breakpoint__2; 
+				String title= ActionMessages.BreakpointAction_Breakpoint_configuration_1;
+				String message= ActionMessages.BreakpointAction_Exceptions_occurred_attempting_to_modify_breakpoint__2;
 				ExceptionHandler.handle(e, title, message);
-			}			
+			}
 		}
 	}
 
@@ -89,30 +89,30 @@
 	/**
 	 * Returns if the action is a checkable action. i.e. if we should bother updating checked state
 	 * @return if the action is a checkable action
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	protected boolean isToggleAction() {
 		return true;
 	}
-	
+
 	/**
 	 * Toggle the state of this action
 	 */
 	public abstract void doAction(IJavaBreakpoint breakpoint) throws CoreException;
-	
+
 	/**
 	 * Returns whether this action is currently toggled on
 	 */
 	protected abstract boolean getToggleState(IJavaBreakpoint breakpoint) throws CoreException;
-	
+
 	/**
 	 * Get the current selection
 	 */
 	protected IStructuredSelection getStructuredSelection() {
 		return fSelection;
 	}
-	
+
 	/**
 	 * Allows the current structured selection to be set
 	 * @param selection the new selection
@@ -120,7 +120,7 @@
 	protected void setStructuredSelection(IStructuredSelection selection) {
 		fSelection= selection;
 	}
-	
+
 	/**
 	 * Returns if the underlying action should be enabled for the given selection
 	 * @param selection
@@ -132,9 +132,9 @@
 	 * Get the breakpoint manager for the debug plugin
 	 */
 	protected IBreakpointManager getBreakpointManager() {
-		return DebugPlugin.getDefault().getBreakpointManager();		
+		return DebugPlugin.getDefault().getBreakpointManager();
 	}
-	
+
 	/**
 	 * Get the breakpoint associated with the given marker
 	 */
@@ -157,7 +157,7 @@
 	protected void setAction(IAction action) {
 		fAction = action;
 	}
-	
+
 	/**
 	 * @see IBreakpointsListener#breakpointsAdded(IBreakpoint[])
 	 */
@@ -181,7 +181,7 @@
 						return;
 					}
 				}
-			}			
+			}
 		}
 	}
 
@@ -191,7 +191,7 @@
 	@Override
 	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
 	}
-	
+
 	/**
 	 * Returns the <code>IWorkbenchPart</code> this delegate is associated with
 	 * @return the <code>IWorkbenchPart</code> this delegate is associated with
@@ -207,7 +207,7 @@
 	protected void setPart(IWorkbenchPart part) {
 		fPart = part;
 	}
-	
+
 	/**
 	 * @see IPartListener#partActivated(IWorkbenchPart)
 	 */
@@ -246,7 +246,7 @@
 	@Override
 	public void partOpened(IWorkbenchPart part) {
 	}
-	
+
 	/**
 	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
 	 */
@@ -254,12 +254,12 @@
 	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
 		IWorkbenchPart oldPart= getPart();
 		if (oldPart != null) {
-			getPart().getSite().getPage().removePartListener(this);			
-		}	
-		
+			getPart().getSite().getPage().removePartListener(this);
+		}
+
 		getBreakpointManager().addBreakpointListener(this);
 		setPart(targetPart);
-		targetPart.getSite().getPage().addPartListener(this);	
+		targetPart.getSite().getPage().addPartListener(this);
 	}
 }
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleUtils.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleUtils.java
index 2b3b7f5..126b23f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleUtils.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointToggleUtils.java
@@ -15,12 +15,12 @@
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.texteditor.IEditorStatusLine;
- 
+
 /**
  * Utility class for Java Toggle breakpoints
  */
 public class BreakpointToggleUtils {
-	
+
 	private static boolean isTracepoint = false;
 
 
@@ -34,7 +34,7 @@
 
 	/**
 	 * Convenience method for printing messages to the status line
-	 * 
+	 *
 	 * @param message
 	 *            the message to be displayed
 	 * @param part
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ControlAccessibleListener.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ControlAccessibleListener.java
index 12ba057..961d53d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ControlAccessibleListener.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ControlAccessibleListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 
 public class ControlAccessibleListener extends AccessibleAdapter {
 	private String controlName;
-	
+
 	public ControlAccessibleListener(String name) {
 		controlName = name;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DisplayAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DisplayAction.java
index 67df9b8..8b055ef 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DisplayAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DisplayAction.java
@@ -49,8 +49,8 @@
 				}
 			});
 			return;
-		} 		
-		
+		}
+
 		final String snippet= evaluationResult.getSnippet();
 		IJavaValue resultValue= evaluationResult.getValue();
 		try {
@@ -60,18 +60,18 @@
 				sig= type.getSignature();
 			}
 			if ("V".equals(sig)) { //$NON-NLS-1$
-				displayStringResult(snippet, ActionMessages.DisplayAction_no_result_value); 
+				displayStringResult(snippet, ActionMessages.DisplayAction_no_result_value);
 			} else {
 				final String resultString;
 				if (sig != null) {
-					resultString= NLS.bind(ActionMessages.DisplayAction_type_name_pattern, new Object[] { resultValue.getReferenceTypeName() }); 
+					resultString= NLS.bind(ActionMessages.DisplayAction_type_name_pattern, new Object[] { resultValue.getReferenceTypeName() });
 				} else {
 					resultString= ""; //$NON-NLS-1$
 				}
 				getDebugModelPresentation().computeDetail(resultValue, new IValueDetailListener() {
 					@Override
 					public void detailComputed(IValue value, String result) {
-						displayStringResult(snippet, NLS.bind(ActionMessages.DisplayAction_result_pattern, new Object[] { resultString, trimDisplayResult(result)})); 
+						displayStringResult(snippet, NLS.bind(ActionMessages.DisplayAction_result_pattern, new Object[] { resultString, trimDisplayResult(result)}));
 					}
 				});
 			}
@@ -109,11 +109,11 @@
 		}
 		super.run();
 	}
-    
+
     /**
      * Trims the result based on the preference of how long the
      * variable details should be.
-     * 
+     *
      * TODO: illegal internal reference to IInternalDebugUIConstants
      */
     public static String trimDisplayResult(String result) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditClasspathEntryAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditClasspathEntryAction.java
index 48a9b99..0788da0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditClasspathEntryAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditClasspathEntryAction.java
@@ -28,7 +28,7 @@
  * Moves selected entries in a runtime classpath viewer up one position.
  */
 public class EditClasspathEntryAction extends RuntimeClasspathAction {
-	
+
 	private ILaunchConfiguration fConfiguration;
 
 	public EditClasspathEntryAction(IClasspathViewer viewer, ILaunchConfiguration configuration) {
@@ -37,7 +37,7 @@
 	}
 	/**
 	 * Moves all selected entries up one position (if possible).
-	 * 
+	 *
 	 * @see IAction#run()
 	 */
 	@Override
@@ -62,7 +62,7 @@
 				IRuntimeClasspathEntry[] wrappers = new IRuntimeClasspathEntry[replacements.length];
 				List<IRuntimeClasspathEntry> list = getEntriesAsList();
 				int index = 0;
-				for (int i = 0; i < list.size(); i++) {
+				for (int i = 0; i < list.size() && index < original.length && index < replacements.length; i++) {
 					Object element = list.get(i);
 					if (element == original[index]) {
 						wrappers[index] = new ClasspathEntry(replacements[index], parents[index]);
@@ -76,7 +76,7 @@
 				}
 			}
 		}
-		
+
 	}
 
 	/**
@@ -96,13 +96,13 @@
 		}
 		return false;
 	}
-	
+
 	protected IClasspathEditor getEditor(IRuntimeClasspathEntry entry) {
 		if (entry instanceof IAdaptable) {
 			IAdaptable adaptable = (IAdaptable) entry;
 			return adaptable.getAdapter(IClasspathEditor.class);
-		}		
+		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditStepFiltersAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditStepFiltersAction.java
index d6437d7..1f93bd5 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditStepFiltersAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditStepFiltersAction.java
@@ -27,5 +27,5 @@
 	public void run(IAction action) {
 		SWTFactory.showPreferencePage(JavaStepFilterPreferencePage.PAGE_ID);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditVariableLogicalStructureAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditVariableLogicalStructureAction.java
index 1d623bd..5fefc2a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditVariableLogicalStructureAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EditVariableLogicalStructureAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial implementation
  *******************************************************************************/
@@ -34,7 +34,7 @@
  * is currently active on the given object.
  */
 public class EditVariableLogicalStructureAction extends ActionDelegate implements IObjectActionDelegate {
-    
+
     /**
      * The editable structure for the currently selected variable or
      * <code>null</code> if none.
@@ -65,7 +65,7 @@
             }
         }
     }
-    
+
     /**
      * @see ActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
      */
@@ -92,10 +92,10 @@
         }
         action.setEnabled(fStructure != null);
     }
-    
+
     /**
      * Returns the logical structure currently associated with the given
-     * value or <code>null</code> if none. 
+     * value or <code>null</code> if none.
      * @param value the value
      * @return the logical structure currently associated with the given
      *  value or <code>null</code> if none.
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EntryToggleAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EntryToggleAction.java
index b0807d1..b39f2b9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EntryToggleAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EntryToggleAction.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
- 
+
 import java.util.Iterator;
 
 import org.eclipse.core.runtime.CoreException;
@@ -47,7 +47,7 @@
 			if (!(element instanceof IJavaMethodBreakpoint)) {
 				return false;
 			}
-			
+
 		}
 		return true;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java
index 6da14de..7e1f022 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java
@@ -100,33 +100,33 @@
 	private IWorkbenchWindow fWindow;
 	private Object fSelection;
 	private IRegion fRegion;
-	
+
 	/**
 	 * Is the action waiting for an evaluation.
 	 */
 	private boolean fEvaluating;
-	
+
 	/**
 	 * The new target part to use with the evaluation completes.
 	 */
 	private IWorkbenchPart fNewTargetPart= null;
-	
+
 	/**
 	 * Used to resolve editor input for selected stack frame
 	 */
 	private IDebugModelPresentation fPresentation;
-			
+
 	public EvaluateAction() {
 		super();
 	}
-	
+
 	/**
 	 * Returns the 'object' context for this evaluation,
 	 * or <code>null</code> if none. If the evaluation is being performed
 	 * in the context of the variables view/inspector. Then
 	 * perform the evaluation in the context of the
 	 * selected value.
-	 * 
+	 *
 	 * @return Java object or <code>null</code>
 	 */
 	protected IJavaObject getObjectContext() {
@@ -151,7 +151,7 @@
 											if (value instanceof IJavaObject) {
 												return (IJavaObject)value;
 											}
-										} 
+										}
 									} catch (DebugException e) {
 										JDIDebugUIPlugin.log(e);
 									}
@@ -167,9 +167,9 @@
 				}
 			}
 		}
-		return null;		
+		return null;
 	}
-	
+
 	/**
 	 * Finds the currently selected stack frame in the UI.
 	 * Stack frames from a scrapbook launch are ignored.
@@ -181,10 +181,10 @@
 			frame = EvaluationContextManager.getEvaluationContext(getWindow());
 		} else {
 			frame = EvaluationContextManager.getEvaluationContext(part);
-		}		
+		}
 		return frame;
 	}
-	
+
 	/**
 	 * @see IEvaluationListener#evaluationComplete(IEvaluationResult)
 	 */
@@ -194,7 +194,7 @@
 		if (JDIDebugUIPlugin.getDefault() == null) {
 			return;
 		}
-		
+
 		final IJavaValue value= result.getValue();
 		if (result.hasErrors() || value != null) {
 			final Display display= JDIDebugUIPlugin.getStandardDisplay();
@@ -204,7 +204,7 @@
 			displayResult(result);
 		}
 	}
-	
+
 	protected void evaluationCleanup() {
 		setEvaluating(false);
 		setTargetPart(fNewTargetPart);
@@ -212,26 +212,26 @@
 	/**
 	 * Display the given evaluation result.
 	 */
-	abstract protected void displayResult(IEvaluationResult result);	
-	
-	protected void run() {		
+	abstract protected void displayResult(IEvaluationResult result);
+
+	protected void run() {
 		// eval in context of object or stack frame
-		final IJavaObject object = getObjectContext();		
+		final IJavaObject object = getObjectContext();
 		final IJavaStackFrame stackFrame= getStackFrameContext();
 		if (stackFrame == null) {
-			reportError(ActionMessages.Evaluate_error_message_stack_frame_context); 
+			reportError(ActionMessages.Evaluate_error_message_stack_frame_context);
 			return;
 		}
-		
+
 		// check for nested evaluation
 		IJavaThread thread = (IJavaThread)stackFrame.getThread();
 		if (thread.isPerformingEvaluation()) {
-			reportError(ActionMessages.EvaluateAction_Cannot_perform_nested_evaluations__1); 
+			reportError(ActionMessages.EvaluateAction_Cannot_perform_nested_evaluations__1);
 			return;
 		}
-		
+
 		setNewTargetPart(getTargetPart());
-        
+
         IRunnableWithProgress runnable = new IRunnableWithProgress() {
             @Override
 			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
@@ -245,13 +245,13 @@
                                 return;
                             }
                             String expression= (String)selection;
-                            
+
                             engine = JDIDebugPlugin.getDefault().getEvaluationEngine(project, (IJavaDebugTarget)stackFrame.getDebugTarget());
                             setEvaluating(true);
                             boolean hitBreakpoints= Platform.getPreferencesService().getBoolean(
-                            		JDIDebugPlugin.getUniqueIdentifier(), 
-                            		JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION, 
-                            		true, 
+                            		JDIDebugPlugin.getUniqueIdentifier(),
+                            		JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION,
+                            		true,
                             		null);
                             if (object == null) {
                                 engine.evaluate(expression, stackFrame, EvaluateAction.this, DebugEvent.EVALUATION, hitBreakpoints);
@@ -263,13 +263,13 @@
                             throw new InvocationTargetException(e, getExceptionMessage(e));
                         }
                     }
-                    throw new InvocationTargetException(null, ActionMessages.Evaluate_error_message_src_context); 
+                    throw new InvocationTargetException(null, ActionMessages.Evaluate_error_message_src_context);
                 }
                 // thread not suspended
-                throw new InvocationTargetException(null, ActionMessages.EvaluateAction_Thread_not_suspended___unable_to_perform_evaluation__1); 
+                throw new InvocationTargetException(null, ActionMessages.EvaluateAction_Thread_not_suspended___unable_to_perform_evaluation__1);
             }
         };
-        
+
         IWorkbench workbench = JDIDebugUIPlugin.getDefault().getWorkbench();
         try {
             workbench.getProgressService().busyCursorWhile(runnable);
@@ -289,9 +289,9 @@
         } catch (InterruptedException e) {
         }
 	}
-		
+
 	protected IJavaProject getJavaProject(IStackFrame stackFrame) {
-		
+
 		// Get the corresponding element.
 		ILaunch launch = stackFrame.getLaunch();
 		if (launch == null) {
@@ -303,7 +303,7 @@
 		}
 		return javaProject;
 	}
-	
+
 	/**
 	 * Updates the enabled state of the action that this is a
 	 * delegate for.
@@ -314,7 +314,7 @@
 			resolveSelectedObject();
 		}
 	}
-	
+
 	/**
 	 * Resolves the selected object in the target part, or <code>null</code>
 	 * if there is no selection.
@@ -361,12 +361,12 @@
 						}
 					}
 					selectedObject= ss;
-				}			
+				}
 			}
 		}
 		setSelectedObject(selectedObject);
 	}
-	
+
 	private Object resolveSelectedObjectUsingToken(Object selectedObject, ITextSelection ts, IEditorPart editor) {
 		ITextEditor textEditor= (ITextEditor) editor;
 		IDocument doc= textEditor.getDocumentProvider().getDocument(editor.getEditorInput());
@@ -390,7 +390,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Resolve an editor input from the source element of the stack frame
 	 * argument, and return whether it's equal to the editor input for the
@@ -417,14 +417,14 @@
 		}
 		return false;
 	}
-	
+
 	protected Shell getShell() {
 		if (getTargetPart() != null) {
 			return getTargetPart().getSite().getShell();
 		}
 		return JDIDebugUIPlugin.getActiveWorkbenchShell();
 	}
-	
+
 	protected IDataDisplay getDataDisplay() {
 		IDataDisplay display= getDirectDataDisplay();
 		if (display != null) {
@@ -439,7 +439,7 @@
 					try {
 						view= page.showView(IJavaDebugUIConstants.ID_DISPLAY_VIEW);
 					} catch (PartInitException e) {
-						JDIDebugUIPlugin.statusDialog(ActionMessages.EvaluateAction_Cannot_open_Display_view, e.getStatus()); 
+						JDIDebugUIPlugin.statusDialog(ActionMessages.EvaluateAction_Cannot_open_Display_view, e.getStatus());
 					} finally {
 						page.activate(activePart);
 					}
@@ -447,13 +447,13 @@
 				if (view != null) {
 					page.bringToTop(view);
 					return view.getAdapter(IDataDisplay.class);
-				}			
+				}
 			}
 		}
-		
-		return null;		
-	}	
-	
+
+		return null;
+	}
+
 	protected IDataDisplay getDirectDataDisplay() {
 		IWorkbenchPart part= getTargetPart();
 		if (part != null) {
@@ -478,12 +478,12 @@
 				IDataDisplay display= activePart.getAdapter(IDataDisplay.class);
 				if (display != null) {
 					return display;
-				}	
+				}
 			}
 		}
 		return null;
 	}
-	
+
 	protected boolean textHasContent(String text) {
 		if (text != null) {
 			int length= text.length();
@@ -497,7 +497,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Displays a failed evaluation message in the data display.
 	 */
@@ -505,21 +505,21 @@
 		String message= getErrorMessage(result);
 		reportError(message);
 	}
-	
+
 	protected void reportError(String message) {
 		IDataDisplay dataDisplay= getDirectDataDisplay();
 		if (dataDisplay != null) {
 			if (message.length() != 0) {
-				dataDisplay.displayExpressionValue(NLS.bind(ActionMessages.EvaluateAction__evaluation_failed__Reason, new String[] {format(message)})); 
+				dataDisplay.displayExpressionValue(NLS.bind(ActionMessages.EvaluateAction__evaluation_failed__Reason, new String[] {format(message)}));
 			} else {
-				dataDisplay.displayExpressionValue(ActionMessages.EvaluateAction__evaluation_failed__1); 
+				dataDisplay.displayExpressionValue(ActionMessages.EvaluateAction__evaluation_failed__1);
 			}
 		} else {
 			Status status= new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, message, null);
-			ErrorDialog.openError(getShell(), ActionMessages.Evaluate_error_title_eval_problems, null, status); 
+			ErrorDialog.openError(getShell(), ActionMessages.Evaluate_error_title_eval_problems, null, status);
 		}
 	}
-	
+
 	private String format(String message) {
 		StringBuffer result= new StringBuffer();
 		int index= 0, pos;
@@ -531,7 +531,7 @@
 		}
 		return result.toString();
 	}
-	
+
 	public static String getExceptionMessage(Throwable exception) {
 		if (exception instanceof CoreException) {
 			CoreException ce = (CoreException)exception;
@@ -544,9 +544,9 @@
 			}
 			return ce.getStatus().getMessage();
 		}
-		String message= NLS.bind(ActionMessages.Evaluate_error_message_direct_exception, new Object[] { exception.getClass() }); 
+		String message= NLS.bind(ActionMessages.Evaluate_error_message_direct_exception, new Object[] { exception.getClass() });
 		if (exception.getMessage() != null) {
-			message= NLS.bind(ActionMessages.Evaluate_error_message_exception_pattern, new Object[] { message, exception.getMessage() }); 
+			message= NLS.bind(ActionMessages.Evaluate_error_message_exception_pattern, new Object[] { message, exception.getMessage() });
 		}
 		return message;
 	}
@@ -557,9 +557,9 @@
 	protected static String getInvocationExceptionMessage(com.sun.jdi.InvocationException exception) {
 			InvocationException ie= exception;
 			ObjectReference ref= ie.exception();
-			return NLS.bind(ActionMessages.Evaluate_error_message_wrapped_exception, new Object[] { ref.referenceType().name() }); 
+			return NLS.bind(ActionMessages.Evaluate_error_message_wrapped_exception, new Object[] { ref.referenceType().name() });
 	}
-	
+
 	protected String getErrorMessage(IEvaluationResult result) {
 		String[] errors= result.getErrorMessages();
 		if (errors.length == 0) {
@@ -567,7 +567,7 @@
 		}
 		return getErrorMessage(errors);
 	}
-	
+
 	protected String getErrorMessage(String[] errors) {
 		String message= ""; //$NON-NLS-1$
 		for (int i= 0; i < errors.length; i++) {
@@ -575,12 +575,12 @@
 			if (i == 0) {
 				message= msg;
 			} else {
-				message= NLS.bind(ActionMessages.Evaluate_error_problem_append_pattern, new Object[] { message, msg }); 
+				message= NLS.bind(ActionMessages.Evaluate_error_problem_append_pattern, new Object[] { message, msg });
 			}
 		}
 		return message;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate#run(IAction)
 	 */
@@ -594,9 +594,9 @@
 	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(IAction, ISelection)
 	 */
 	@Override
-	public void selectionChanged(IAction action, ISelection selection) { 
+	public void selectionChanged(IAction action, ISelection selection) {
 		setAction(action);
-	}	
+	}
 
 	/**
 	 * @see IWorkbenchWindowActionDelegate#dispose()
@@ -631,11 +631,11 @@
 	protected void setAction(IAction action) {
 		fAction = action;
 	}
-	
+
 	/**
 	 * Returns a debug model presentation (creating one
 	 * if necessary).
-	 * 
+	 *
 	 * @return debug model presentation
 	 */
 	protected IDebugModelPresentation getDebugModelPresentation() {
@@ -644,8 +644,8 @@
 		}
 		return fPresentation;
 	}
-	
-	/** 
+
+	/**
 	 * Disposes this action's debug model presentation, if
 	 * one was created.
 	 */
@@ -705,7 +705,7 @@
 	@Override
 	public void partOpened(IWorkbenchPart part) {
 	}
-	
+
 	/**
 	 * @see IViewActionDelegate#init(IViewPart)
 	 */
@@ -741,7 +741,7 @@
 	protected void setWindow(IWorkbenchWindow window) {
 		fWindow = window;
 	}
-	
+
 	/**
 	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
 	 */
@@ -751,15 +751,15 @@
 		setTargetPart(targetPart);
 		update();
 	}
-	
+
 	protected Object getSelectedObject() {
 		return fSelection;
 	}
-	
+
 	protected void setSelectedObject(Object selection) {
 		fSelection = selection;
 	}
-	
+
 	/**
 	 * @see ISnippetStateChangedListener#snippetStateChanged(JavaSnippetEditor)
 	 */
@@ -780,7 +780,7 @@
 	protected void setNewTargetPart(IWorkbenchPart newTargetPart) {
 		fNewTargetPart = newTargetPart;
 	}
-	
+
 	protected boolean isEvaluating() {
 		return fEvaluating;
 	}
@@ -788,20 +788,20 @@
 	protected void setEvaluating(boolean evaluating) {
 		fEvaluating = evaluating;
 	}
-	
+
 	/**
 	 * Returns the selected text region, or <code>null</code> if none.
-	 * 
+	 *
 	 * @return
 	 */
 	protected IRegion getRegion() {
 		return fRegion;
 	}
-	
+
 	/**
 	 * Returns the styled text widget associated with the given part
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param part workbench part
 	 * @return associated style text widget or <code>null</code>
 	 */
@@ -818,11 +818,11 @@
 		}
 		return textWidget;
 	}
-	
+
 	/**
 	 * Returns an anchor point for a popup dialog on top of a styled text
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param part or <code>null</code>
 	 * @return anchor point or <code>null</code>
 	 */
@@ -832,7 +832,7 @@
 	        int midOffset = docRange.x + (docRange.y / 2);
 	        Point point = textWidget.getLocationAtOffset(midOffset);
 	        point = textWidget.toDisplay(point);
-	
+
 	        GC gc = new GC(textWidget);
 	        gc.setFont(textWidget.getFont());
 	        int height = gc.getFontMetrics().getHeight();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionCaughtToggleAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionCaughtToggleAction.java
index d7785bb..5b14698 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionCaughtToggleAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionCaughtToggleAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -42,7 +42,7 @@
 		IJavaExceptionBreakpoint exception= (IJavaExceptionBreakpoint)breakpoint;
 		exception.setCaught(!exception.isCaught());
 	}
-	
+
 	/**
 	 * @see BreakpointToggleAction#isEnabledFor(IStructuredSelection)
 	 */
@@ -54,7 +54,7 @@
 			if (!(element instanceof IJavaExceptionBreakpoint)) {
 				return false;
 			}
-			
+
 		}
 		return true;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionUncaughtToggleAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionUncaughtToggleAction.java
index 8cc9ea1..d97c626 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionUncaughtToggleAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExceptionUncaughtToggleAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -42,7 +42,7 @@
 		IJavaExceptionBreakpoint exception= (IJavaExceptionBreakpoint)breakpoint;
 		exception.setUncaught(!exception.isUncaught());
 	}
-	
+
 	/**
 	 * @see BreakpointToggleAction#isEnabledFor(IStructuredSelection)
 	 */
@@ -54,7 +54,7 @@
 			if (!(element instanceof IJavaExceptionBreakpoint)) {
 				return false;
 			}
-			
+
 		}
 		return true;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExcludeExceptionLocationAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExcludeExceptionLocationAction.java
index 4a1ba1b..03e38b7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExcludeExceptionLocationAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExcludeExceptionLocationAction.java
@@ -36,7 +36,7 @@
 			return;
 		}
 		Iterator<IJavaThread> itr= selection.iterator();
-		
+
 		while (itr.hasNext()) {
 			IJavaThread thread= itr.next();
 			try {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExecuteAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExecuteAction.java
index 72e155c..986a8d8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExecuteAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExecuteAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -37,7 +37,7 @@
 					evaluationCleanup();
 				}
 			});
-		} else {			
+		} else {
 			evaluationCleanup();
 		}
 	}
@@ -52,7 +52,7 @@
 			((JavaSnippetEditor)part).evalSelection(JavaSnippetEditor.RESULT_RUN);
 			return;
 		}
-		super.run();	
+		super.run();
 	}
 
 	/**
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExitToggleAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExitToggleAction.java
index 8fb794a..512e4d1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExitToggleAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExitToggleAction.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
- 
+
 import java.util.Iterator;
 
 import org.eclipse.core.runtime.CoreException;
@@ -47,7 +47,7 @@
 			if (!(element instanceof IJavaMethodBreakpoint)) {
 				return false;
 			}
-			
+
 		}
 		return true;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExpressionInputDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExpressionInputDialog.java
index 005e6f79..6fd12d1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExpressionInputDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ExpressionInputDialog.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial implementation
  *******************************************************************************/
@@ -62,7 +62,7 @@
 
     protected IJavaVariable fVariable;
     protected String fResult= null;
-    
+
     // Input area composite which acts as a placeholder for
     // input widgetry that is created/disposed dynamically.
     protected Composite fInputArea;
@@ -76,7 +76,7 @@
 //    protected HandlerSubmission fSubmission;
     // Text for error reporting
     protected Text fErrorText;
-    
+
     /**
      * @param parentShell the shell to create the dialog in
      * @param variable the variable being edited
@@ -96,9 +96,9 @@
 		workbench.getHelpSystem().setHelp(
 				parent,
 				IJavaDebugHelpContextIds.EXPRESSION_INPUT_DIALOG);
-		
+
         Composite composite= (Composite) super.createDialogArea(parent);
-        
+
         // Create the composite which will hold the input widgetry
         fInputArea = createInputArea(composite);
         // Create the error reporting text area
@@ -108,7 +108,7 @@
         populateInputArea(fInputArea);
         return composite;
     }
-    
+
     /**
      * Returns the text widget for reporting errors
      * @param parent parent composite
@@ -131,7 +131,7 @@
     	Dialog.applyDialogFont(composite);
     	return composite;
     }
-    
+
     /**
      * Creates the appropriate widgetry in the input area. This
      * method is intended to be overridden by subclasses who wish
@@ -140,16 +140,16 @@
      */
     protected void populateInputArea(Composite parent) {
     	fSourceViewerComposite = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH, 0, 0);
-    	
-    	String name= ActionMessages.ExpressionInputDialog_3; 
+
+    	String name= ActionMessages.ExpressionInputDialog_3;
         try {
             name= fVariable.getName();
         } catch (DebugException e) {
             JDIDebugUIPlugin.log(e);
         }
-        
+
         SWTFactory.createWrapLabel(fSourceViewerComposite, NLS.bind(ActionMessages.ExpressionInputDialog_0, new String[] {name}), 1, convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH));
-        
+
         fSourceViewer= new JDISourceViewer(fSourceViewerComposite, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
         fSourceViewer.setInput(fSourceViewerComposite);
         configureSourceViewer();
@@ -174,7 +174,7 @@
     		}
     	}
     }
-    
+
     /**
      * Initializes the source viewer. This method is based on code in BreakpointConditionEditor.
      */
@@ -193,18 +193,18 @@
 		final IUndoManager undoManager= new TextViewerUndoManager(10);
 		fSourceViewer.setUndoManager(undoManager);
 		undoManager.connect(fSourceViewer);
-		
+
 		fSourceViewer.getTextWidget().setFont(JFaceResources.getTextFont());
-			
+
 		Control control= fSourceViewer.getControl();
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		control.setLayoutData(gd);
-			
+
 		gd= (GridData)fSourceViewer.getControl().getLayoutData();
 		gd.heightHint= convertHeightInCharsToPixels(10);
-		gd.widthHint= convertWidthInCharsToPixels(40);	
-		document.set(getInitialText(fVariable));	
-		
+		gd.widthHint= convertWidthInCharsToPixels(40);
+		document.set(getInitialText(fVariable));
+
 		fDocumentListener= new IDocumentListener() {
             @Override
 			public void documentAboutToBeChanged(DocumentEvent event) {
@@ -215,10 +215,10 @@
             }
         };
 		fSourceViewer.getDocument().addDocumentListener(fDocumentListener);
-		
+
 		activateHandler();
     }
-    
+
     /**
      * Activates the content assist handler.
      */
@@ -234,7 +234,7 @@
 		fService = workbench.getAdapter(IHandlerService.class);
 		fActivation = fService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler);
     }
-      
+
     /**
      * Returns the text that should be shown in the source viewer upon
      * initialization. The text should be presented in such a way that
@@ -295,7 +295,7 @@
 		}
 		return fCompletionProcessor;
 	}
-    
+
 	/**
 	 * @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
 	 */
@@ -305,16 +305,16 @@
 			String text= viewer.getDocument().get();
 			boolean valid= text != null && text.trim().length() > 0;
 			if (!valid) {
-				errorMessage= ActionMessages.ExpressionInputDialog_1; 
+				errorMessage= ActionMessages.ExpressionInputDialog_1;
 			}
 	    }
 		setErrorMessage(errorMessage);
 	}
-	
+
 	protected void refreshValidState() {
 		refreshValidState(fSourceViewer);
 	}
-	
+
 	/**
 	 * Sets the error message to display to the user. <code>null</code>
 	 * is the same as the empty string.
@@ -328,7 +328,7 @@
 	    fErrorText.setText(message);
 	    getButton(IDialogConstants.OK_ID).setEnabled(message.length() == 0);
 	}
-	
+
 	/**
 	 * Persist the dialog size and store the user's input on OK is pressed.
 	 */
@@ -337,7 +337,7 @@
         fResult= getText();
         super.okPressed();
     }
-    
+
     /**
      * Returns the text that is currently displayed in the source viewer.
      * @return the text that is currently displayed in the source viewer
@@ -345,25 +345,25 @@
     protected String getText() {
         return fSourceViewer.getDocument().get();
     }
-    
+
 	/**
 	 * Returns the text entered by the user or <code>null</code> if the user cancelled.
-	 * 
+	 *
 	 * @return the text entered by the user or <code>null</code> if the user cancelled
 	 */
     public String getResult() {
         return fResult;
     }
-    
+
     /**
      * Initializes the dialog shell with a title.
      */
     @Override
 	protected void configureShell(Shell newShell) {
         super.configureShell(newShell);
-        newShell.setText(ActionMessages.ExpressionInputDialog_2); 
+        newShell.setText(ActionMessages.ExpressionInputDialog_2);
     }
-    
+
     /**
      * Override method to initialize the enablement of the OK button after
      * it is created.
@@ -375,7 +375,7 @@
         // button
         refreshValidState();
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.jface.window.Window#close()
      */
@@ -397,7 +397,7 @@
 		fCompletionProcessor = null;
         return super.close();
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
      */
@@ -407,10 +407,10 @@
          IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
          if (section == null) {
              section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
+         }
          return section;
     }
-	
+
 	/**
 	 * @return the name to use to save the dialog settings
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ForceReturnAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ForceReturnAction.java
index 0aee073..4bbe491 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ForceReturnAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ForceReturnAction.java
@@ -25,11 +25,11 @@
 
 /**
  * Action for force return from a method.
- * 
+ *
  * @since 3.3
  */
 public class ForceReturnAction extends EvaluateAction {
-	
+
 	private IJavaStackFrame fTargetFrame = null;
 
 	/* (non-Javadoc)
@@ -38,7 +38,7 @@
 	@Override
 	protected void displayResult(final IEvaluationResult result) {
 		evaluationCleanup();
-		
+
 		final Display display = JDIDebugUIPlugin.getStandardDisplay();
 		// error with evaluation
 		if (result.hasErrors()) {
@@ -52,7 +52,7 @@
 				}
 			});
 			return;
-		} 
+		}
 
 		// force return with the result
 		try {
@@ -87,7 +87,7 @@
 	}
 
 	@Override
-	protected void run() {		
+	protected void run() {
 		IJavaStackFrame stackFrame= getStackFrameContext();
 		if (stackFrame != null) {
 			try {
@@ -106,9 +106,9 @@
 		// perform evaluation otherwise
 		super.run();
 	}
-	
-	
-	
-	
+
+
+
+
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InspectAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InspectAction.java
index ea50bbf..d7cf3b4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InspectAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InspectAction.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
- 
+
 import java.util.Iterator;
 
 import org.eclipse.debug.core.DebugException;
@@ -34,7 +34,7 @@
  * Places the result of an evaluation in the debug expression view.
  */
 public class InspectAction extends EvaluateAction {
-	
+
 	/**
 	 * @see EvaluateAction#displayResult(IEvaluationResult)
 	 */
@@ -44,7 +44,7 @@
 		display.asyncExec(new Runnable() {
 			@Override
 			public void run() {
-				if (!display.isDisposed()) {				
+				if (!display.isDisposed()) {
 					showExpressionView();
 					JavaInspectExpression exp = new JavaInspectExpression(result);
 					DebugPlugin.getDefault().getExpressionManager().addExpression(exp);
@@ -53,7 +53,7 @@
 			}
 		});
 	}
-	
+
 	/**
 	 * Make the expression view visible or open one
 	 * if required.
@@ -76,7 +76,7 @@
 			}
 		}
 	}
-	
+
 	@Override
 	protected void run() {
 		IWorkbenchPart part= getTargetPart();
@@ -84,13 +84,13 @@
 			((JavaSnippetEditor)part).evalSelection(JavaSnippetEditor.RESULT_INSPECT);
 			return;
 		}
-		
+
 		Object selection= getSelectedObject();
 		if (!(selection instanceof IStructuredSelection)) {
 			super.run();
 			return;
 		}
-		
+
 		//inspecting from the context of the variables view
 		Iterator<IJavaVariable> variables = ((IStructuredSelection)selection).iterator();
 		while (variables.hasNext()) {
@@ -99,13 +99,13 @@
 				JavaInspectExpression expr = new JavaInspectExpression(var.getName(), (IJavaValue)var.getValue());
 				DebugPlugin.getDefault().getExpressionManager().addExpression(expr);
 			} catch (DebugException e) {
-				JDIDebugUIPlugin.statusDialog(e.getStatus()); 
+				JDIDebugUIPlugin.statusDialog(e.getStatus());
 			}
 		}
-	
+
 		showExpressionView();
 	}
-	
+
 	@Override
 	protected IDataDisplay getDataDisplay() {
 		return getDirectDataDisplay();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InstanceFiltersAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InstanceFiltersAction.java
index b2f69e0..36a5dda 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InstanceFiltersAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/InstanceFiltersAction.java
@@ -45,17 +45,17 @@
  * Action to associate an object with one or more breakpoints.
  */
 public class InstanceFiltersAction extends ObjectActionDelegate {
-	
+
 	/**
 	 * Dialog that allows the user to select one or more breakpoints that should be restricted
 	 * to a specific object instance.
 	 */
 	class InstanceFilterDialog extends AbstractDebugCheckboxSelectionDialog {
-		
+
 		private Object fInput;
 		private String fMessage;
 		private IBaseLabelProvider fLabelProvider;
-		
+
 		public InstanceFilterDialog(Shell parentShell, Object input, IBaseLabelProvider labelProvider, String message){
 			super(parentShell);
 			fInput = input;
@@ -64,7 +64,7 @@
 			setShellStyle(getShellStyle() | SWT.RESIZE);
 			setShowSelectAllButtons(true);
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog#isValid()
 		 */
@@ -72,7 +72,7 @@
 		protected boolean isValid() {
 			return true;
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
 		 */
@@ -104,7 +104,7 @@
 		protected String getViewerLabel() {
 			return fMessage;
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getLabelProvider()
 		 */
@@ -123,7 +123,7 @@
 		if (selection == null || selection.size() > 1) {
 			return;
 		}
-		
+
 		Object o = selection.getFirstElement();
 		if (o instanceof IJavaVariable) {
 			final IJavaVariable var = (IJavaVariable)o;
@@ -133,14 +133,14 @@
 					final IJavaObject object = (IJavaObject)value;
 					final List<IJavaBreakpoint> breakpoints = getApplicableBreakpoints(var, object);
 					final IDebugModelPresentation modelPresentation= DebugUITools.newDebugModelPresentation();
-					
+
 					if (breakpoints.isEmpty())
 					{
 						MessageDialog.openInformation(JDIDebugUIPlugin.getActiveWorkbenchShell(), ActionMessages.InstanceFiltersAction_0, ActionMessages.InstanceFiltersAction_4);
 						return;
 					}
-					
-					InstanceFilterDialog dialog = new InstanceFilterDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), breakpoints, modelPresentation, NLS.bind(ActionMessages.InstanceFiltersAction_1, new String[] {var.getName()})){ 
+
+					InstanceFilterDialog dialog = new InstanceFilterDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), breakpoints, modelPresentation, NLS.bind(ActionMessages.InstanceFiltersAction_1, new String[] {var.getName()})){
 						@Override
 						public void okPressed() {
 							// check if breakpoints have already been restricted to other objects.
@@ -158,9 +158,9 @@
 										}
 									}
 									if (sameTarget) {
-										MessageDialog messageDialog= new MessageDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), ActionMessages.InstanceFiltersAction_2, 
-											null, NLS.bind(ActionMessages.InstanceFiltersAction_3, new String[] { modelPresentation.getText(breakpoint), var.getName()}), 
-											MessageDialog.QUESTION, new String[] { ActionMessages.InstanceFiltersAction_Yes_2, ActionMessages.InstanceFiltersAction_Cancel_3}, // 
+										MessageDialog messageDialog= new MessageDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), ActionMessages.InstanceFiltersAction_2,
+											null, NLS.bind(ActionMessages.InstanceFiltersAction_3, new String[] { modelPresentation.getText(breakpoint), var.getName()}),
+											MessageDialog.QUESTION, new String[] { ActionMessages.InstanceFiltersAction_Yes_2, ActionMessages.InstanceFiltersAction_Cancel_3}, //
 											0);
 										if (messageDialog.open() == Window.OK) {
 											for (int i= 0; i < instanceFilters.length; i++) {
@@ -178,10 +178,10 @@
 							super.okPressed();
 						}
 					};
-					dialog.setTitle(ActionMessages.InstanceFiltersAction_2); 
-					
+					dialog.setTitle(ActionMessages.InstanceFiltersAction_2);
+
 					// determine initial selection
-					List<IJavaBreakpoint> existing = new ArrayList<IJavaBreakpoint>();
+					List<IJavaBreakpoint> existing = new ArrayList<>();
 					Iterator<IJavaBreakpoint> iter = breakpoints.iterator();
 					while (iter.hasNext()) {
 						IJavaBreakpoint bp = iter.next();
@@ -194,7 +194,7 @@
 						}
 					}
 					dialog.setInitialSelections(existing.toArray());
-					
+
 					if (dialog.open() == Window.OK) {
 						Object[] selectedBreakpoints = dialog.getResult();
 						if (selectedBreakpoints != null) {
@@ -220,19 +220,19 @@
 			}
 		}
 	}
-	
+
 	protected List<IJavaBreakpoint> getApplicableBreakpoints(IJavaVariable variable, IJavaObject object) {
-		List<IJavaBreakpoint> breakpoints = new ArrayList<IJavaBreakpoint>();
-		
+		List<IJavaBreakpoint> breakpoints = new ArrayList<>();
+
 		try {
 			// collect names in type hierarchy
-			List<String> superTypeNames = new ArrayList<String>();
+			List<String> superTypeNames = new ArrayList<>();
 			IJavaType type = object.getJavaType();
 			while (type instanceof IJavaClassType) {
 				superTypeNames.add(type.getName());
 				type = ((IJavaClassType)type).getSuperclass();
 			}
-			
+
 			IBreakpoint[] allBreakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
 			for (int i = 0; i < allBreakpoints.length; i++) {
 				if (allBreakpoints[i] instanceof IJavaBreakpoint) {
@@ -255,7 +255,7 @@
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
 		}
-		 
+
 		return breakpoints;
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesAction.java
index 58caf24..cf07906 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesAction.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
- 
+
 import org.eclipse.jdt.debug.core.IJavaBreakpoint;
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
 import org.eclipse.jface.action.IAction;
@@ -27,7 +27,7 @@
  * the attributes of a Java Breakpoint.
  */
 public class JavaBreakpointPropertiesAction implements IObjectActionDelegate {
-	
+
 	private IJavaBreakpoint fBreakpoint;
 
 	/**
@@ -39,10 +39,10 @@
 		//where conditions randomly seem to have errors while using an IBM VM in testing mode
 		if(fBreakpoint != null && !ErrorDialog.AUTOMATED_MODE) {
 		    PreferencesUtil.createPropertyDialogOn(
-		    		JDIDebugUIPlugin.getActiveWorkbenchShell(), 
-		    		fBreakpoint, 
-		    		null, 
-		    		null, 
+		    		JDIDebugUIPlugin.getActiveWorkbenchShell(),
+		    		fBreakpoint,
+		    		null,
+		    		null,
 		    		null).open();
 		}
 	}
@@ -74,7 +74,7 @@
 	public void setBreakpoint(IJavaBreakpoint breakpoint) {
 		fBreakpoint = breakpoint;
 	}
-	
+
 	/**
 	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesRulerAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesRulerAction.java
index d6eb147..5e193ad 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesRulerAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaBreakpointPropertiesRulerAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,11 +28,11 @@
 
 /**
  * Presents the standard properties dialog to configure
- * the attibutes of a Java Breakpoint from the ruler popup menu of a 
+ * the attibutes of a Java Breakpoint from the ruler popup menu of a
  * text editor.
  */
 public class JavaBreakpointPropertiesRulerAction extends RulerBreakpointAction implements IUpdate {
-	
+
 	private IBreakpoint fBreakpoint;
 
 	/**
@@ -40,7 +40,7 @@
 	 */
 	public JavaBreakpointPropertiesRulerAction(ITextEditor editor, IVerticalRulerInfo info) {
 		super(editor, info);
-		setText(ActionMessages.JavaBreakpointPropertiesRulerAction_Breakpoint__Properties_1 + '\t' + DebugUIPlugin.formatKeyBindingString(SWT.MOD1, ActionMessages.JavaBreakpointPropertiesRulerAction_0)); 
+		setText(ActionMessages.JavaBreakpointPropertiesRulerAction_Breakpoint__Properties_1 + '\t' + DebugUIPlugin.formatKeyBindingString(SWT.MOD1, ActionMessages.JavaBreakpointPropertiesRulerAction_0));
 	}
 	/**
 	 * @see Action#run()
@@ -48,7 +48,7 @@
 	@Override
 	public void run() {
 		if (getBreakpoint() != null) {
-			PropertyDialogAction action= 
+			PropertyDialogAction action=
 				new PropertyDialogAction(getEditor().getEditorSite(), new ISelectionProvider() {
 					@Override
 					public void addSelectionChangedListener(ISelectionChangedListener listener) {
@@ -64,10 +64,10 @@
 					public void setSelection(ISelection selection) {
 					}
 				});
-			action.run();	
+			action.run();
 		}
 	}
-	
+
 	/**
 	 * @see IUpdate#update()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java
index bb7d5a0..8fb2309 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java
@@ -101,7 +101,7 @@
     /**
      * Evaluates the given expression and sets the given variable's value
      * using the result.
-     * 
+     *
      * @param variable the variable whose value should be set
      * @param expression the expression to evaluate
      * @throws DebugException if an exception occurs evaluating the expression
@@ -137,7 +137,7 @@
             IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR, cause.getMessage(), null);
             JDIDebugUIPlugin.statusDialog(ActionMessages.JavaObjectValueEditor_3, status);
         } else {
-            JDIDebugUIPlugin.statusDialog(e.getStatus()); 
+            JDIDebugUIPlugin.statusDialog(e.getStatus());
         }
     }
 
@@ -186,7 +186,7 @@
         			    String[] messages = result.getErrorMessages();
         			    for (int i = 0; i < messages.length; i++) {
                             buffer.append(messages[i]).append("\n "); //$NON-NLS-1$
-                        }    			    	
+                        }
     			    } else {
     			    	buffer.append(EvaluateAction.getExceptionMessage(exception));
     			    }
@@ -198,7 +198,7 @@
         }
         return null;
     }
-    
+
     /**
      * (copied from EvaluateAction)
      */
@@ -214,9 +214,9 @@
 			}
 			return ce.getStatus().getMessage();
 		}
-		String message= NLS.bind(ActionMessages.Evaluate_error_message_direct_exception, new Object[] { exception.getClass() }); 
+		String message= NLS.bind(ActionMessages.Evaluate_error_message_direct_exception, new Object[] { exception.getClass() });
 		if (exception.getMessage() != null) {
-			message= NLS.bind(ActionMessages.Evaluate_error_message_exception_pattern, new Object[] { message, exception.getMessage() }); 
+			message= NLS.bind(ActionMessages.Evaluate_error_message_exception_pattern, new Object[] { message, exception.getMessage() });
 		}
 		return message;
 	}
@@ -227,9 +227,9 @@
 	protected String getInvocationExceptionMessage(com.sun.jdi.InvocationException exception) {
 			InvocationException ie= exception;
 			ObjectReference ref= ie.exception();
-			return NLS.bind(ActionMessages.Evaluate_error_message_wrapped_exception, new Object[] { ref.referenceType().name() }); 
+			return NLS.bind(ActionMessages.Evaluate_error_message_wrapped_exception, new Object[] { ref.referenceType().name() });
 	}
-    
+
 	/**
 	 * Return the project associated with the given stack frame.
 	 * (copied from JavaWatchExpressionDelegate)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaPrimitiveValueEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaPrimitiveValueEditor.java
index 8e8a400..2ac41e1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaPrimitiveValueEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaPrimitiveValueEditor.java
@@ -30,7 +30,7 @@
  * A variable value editor that prompts the user to set a primitive's value.
  */
 public class JavaPrimitiveValueEditor implements IVariableValueEditor {
-    
+
     /**
      * The signature of the edited variable.
      */
@@ -43,7 +43,7 @@
     public JavaPrimitiveValueEditor(String signature) {
         fSignature= signature;
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.debug.ui.actions.IVariableValueEditor#editVariable(org.eclipse.debug.core.model.IVariable, org.eclipse.swt.widgets.Shell)
      */
@@ -51,8 +51,8 @@
 	public boolean editVariable(IVariable variable, Shell shell) {
         try {
             String name= variable.getName();
-            String title= ActionMessages.JavaPrimitiveValueEditor_0; 
-            String message= NLS.bind(ActionMessages.JavaPrimitiveValueEditor_1, new String[] {name}); 
+            String title= ActionMessages.JavaPrimitiveValueEditor_0;
+            String message= NLS.bind(ActionMessages.JavaPrimitiveValueEditor_1, new String[] {name});
             String initialValue= variable.getValue().getValueString();
             PrimitiveValidator validator= new PrimitiveValidator();
             InputDialog dialog= new InputDialog(shell, title, message, initialValue, validator){
@@ -76,7 +76,7 @@
                 variable.setValue(stringValue);
             }
         } catch (DebugException e) {
-            JDIDebugUIPlugin.errorDialog(shell, ActionMessages.JavaPrimitiveValueEditor_2, ActionMessages.JavaPrimitiveValueEditor_3, e); // 
+            JDIDebugUIPlugin.errorDialog(shell, ActionMessages.JavaPrimitiveValueEditor_2, ActionMessages.JavaPrimitiveValueEditor_3, e); //
         }
         return true;
     }
@@ -108,7 +108,7 @@
     	catch(NumberFormatException nfe) {}
     	return value;
     }
-    
+
     /**
      * Input validator for primitive types
      */
@@ -135,7 +135,7 @@
 	        					isUnicode(newText)) {
 	        				break;
 	        			}
-	        		} 
+	        		}
 	        		if (newText.length() != 1) {
 	        	        type="char"; //$NON-NLS-1$
 	        	    }
@@ -182,7 +182,7 @@
 	                break;
             }
             if (type != null) {
-                return NLS.bind(ActionMessages.JavaPrimitiveValueEditor_4, new String[] { type }); 
+                return NLS.bind(ActionMessages.JavaPrimitiveValueEditor_4, new String[] { type });
             }
             return null;
         }
@@ -201,7 +201,7 @@
 			}
 			return false;
 		}
-		
+
 		private boolean isOctalEscape(String newText) {
 			char[] chars= newText.toCharArray();
 			if (chars.length < 4) {
@@ -238,16 +238,16 @@
 				ch == '\'' ||
 				ch == '\\');
 		}
-		
-		
+
+
 		private boolean isOctalDigit(char ch) {
             return Character.digit(ch, 8) != -1;
 		}
-		
+
 		private boolean isHexDigit(char ch) {
             return Character.digit(ch, 16) != -1;
 		}
-		
+
 		/**
 		 * Returns the integer value specified by the given string, which
 		 * represents an octal or hexadecimal escape sequence. Returns
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaVariableValueEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaVariableValueEditor.java
index 38025e1..4869a86 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaVariableValueEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaVariableValueEditor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial implementation
  *******************************************************************************/
@@ -33,7 +33,7 @@
         try {
             signature= getSignature(variable);
 	    } catch (DebugException e) {
-	        JDIDebugUIPlugin.errorDialog(shell, ActionMessages.JavaVariableValueEditor_0, ActionMessages.JavaVariableValueEditor_1, e); // 
+	        JDIDebugUIPlugin.errorDialog(shell, ActionMessages.JavaVariableValueEditor_0, ActionMessages.JavaVariableValueEditor_1, e); //
 	    }
 	    if (signature == null) {
 	        return false;
@@ -62,15 +62,15 @@
 					return true;
 				}
 			} catch (DebugException e) {
-				JDIDebugUIPlugin.statusDialog(e.getStatus()); 
+				JDIDebugUIPlugin.statusDialog(e.getStatus());
 			}
     	}
-    	
+
     	// support expressions for primitives as well as literals
         IVariableValueEditor editor= new JavaObjectValueEditor();
         return editor.saveVariable(variable, expression, shell);
     }
-    
+
     public static String getSignature(IVariable variable) throws DebugException {
         String signature= null;
 		IJavaVariable javaVariable = variable.getAdapter(IJavaVariable.class);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveDownAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveDownAction.java
index a404987..1c7655d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveDownAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveDownAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 public class MoveDownAction extends RuntimeClasspathAction {
 
 	public MoveDownAction(IClasspathViewer viewer) {
-		super(ActionMessages.MoveDownAction_M_ove_Down_1, viewer); 
+		super(ActionMessages.MoveDownAction_M_ove_Down_1, viewer);
 	}
 
 	/* (non-Javadoc)
@@ -51,7 +51,7 @@
 			} else {
 				bottom = index;
 			}
-		} 
+		}
 		setEntries(list);
 	}
 
@@ -63,9 +63,9 @@
 		if (selection.isEmpty()) {
 			return false;
 		}
-		return getViewer().updateSelection(getActionType(), selection);	
+		return getViewer().updateSelection(getActionType(), selection);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.RuntimeClasspathAction#getActionType()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveUpAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveUpAction.java
index 6ecb51b..24a12ae 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveUpAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/MoveUpAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 public class MoveUpAction extends RuntimeClasspathAction {
 
 	public MoveUpAction(IClasspathViewer viewer) {
-		super(ActionMessages.MoveUpAction_Move_U_p_1, viewer); 
+		super(ActionMessages.MoveUpAction_Move_U_p_1, viewer);
 	}
 
 	/* (non-Javadoc)
@@ -54,7 +54,7 @@
 			} else {
 				top = index;
 			}
-		} 
+		}
 		setEntries(list);
 	}
 
@@ -68,7 +68,7 @@
 		}
 		return getViewer().updateSelection(getActionType(), selection);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.RuntimeClasspathAction#getActionType()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/NewDetailFormatterAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/NewDetailFormatterAction.java
index 70ebe2a..a1a7dc9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/NewDetailFormatterAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/NewDetailFormatterAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java
index ee61d60..4cbe51b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java
@@ -27,9 +27,9 @@
 import org.eclipse.ui.IWorkbenchWindow;
 
 public abstract class ObjectActionDelegate implements IObjectActionDelegate, IActionDelegate2 {
-	
+
 	IWorkbenchPart fPart = null;
-	
+
 	/**
 	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
 	 */
@@ -37,18 +37,18 @@
 	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
 		fPart = targetPart;
 	}
-	
+
 	protected IWorkbenchPart getPart() {
 		return fPart;
 	}
-	
+
 	/**
 	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
 	 */
 	@Override
 	public void selectionChanged(IAction action, ISelection sel) {
 	}
-	
+
 	/**
 	 * Returns the currently selected item(s) from the current workbench page or <code>null</code>
 	 * if the current active page could not be resolved.
@@ -60,14 +60,14 @@
 			ISelection selection= page.getSelection();
 			if (selection instanceof IStructuredSelection) {
 				return (IStructuredSelection)selection;
-			}	
+			}
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Displays the given error message in the status line.
-	 * 
+	 *
 	 * @param message
 	 */
 	protected void showErrorMessage(String message) {
@@ -77,7 +77,7 @@
 			manager.setErrorMessage(message);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate2#dispose()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectFilter.java
index dd6cd23..ebf5ecf 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectFilter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,21 +20,21 @@
  * A filter on a set of objects
  */
 public class ObjectFilter extends ViewerFilter {
-		
+
 	/**
 	 * Objects to filter
 	 */
 	protected List<?> fFilter;
-	
+
 	/**
-	 * Creates a new filter that filters the given 
+	 * Creates a new filter that filters the given
 	 * objects.
 	 * @param objects the objects to filter against
 	 */
 	public ObjectFilter(List<?> objects) {
 		fFilter = objects;
 	}
-	
+
 	/**
 	 * @see ViewerFilter#select(Viewer, Object, Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeAction.java
index 4a80777..efd8dc0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
  * Opens the declaring type of a stack frame.
  */
 public class OpenDeclaringTypeAction extends OpenStackFrameAction {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction#getTypeToOpen(org.eclipse.debug.core.model.IDebugElement)
 	 */
@@ -32,5 +32,5 @@
 		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeHierarchyAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeHierarchyAction.java
index 4bb98a7..5330ec9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeHierarchyAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDeclaringTypeHierarchyAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,7 +14,7 @@
  * Opens the declaring type hierarchy of a stack frame.
  */
 public class OpenDeclaringTypeHierarchyAction extends OpenDeclaringTypeAction {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction#isHierarchy()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDialogAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDialogAction.java
index 69fc500..e4e8928 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDialogAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenDialogAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,13 +20,13 @@
  * settings.
  */
 public abstract class OpenDialogAction extends RuntimeClasspathAction {
-	
+
 	/**
 	 * Attribute name for the last path used to open a file/directory chooser
 	 * dialog.
 	 */
 	protected static final String LAST_PATH_SETTING = "LAST_PATH_SETTING"; //$NON-NLS-1$
-	
+
 	/**
 	 * Dialog settings prefix/qualifier
 	 */
@@ -39,7 +39,7 @@
 		super(label, viewer);
 		fPrefix = dialogSettingsPrefix;
 	}
-	
+
 	/**
 	 * Returns the prefix of the identifier used to store dialog settings for
 	 * this action.
@@ -47,24 +47,24 @@
 	protected String getDialogSettingsPrefix() {
 		return fPrefix;
 	}
-	
+
 	/**
 	 * Returns the value of the dialog setting, associated with the given
 	 * settingName, resolved by the dialog setting prefix associated with this
 	 * action.
-	 * 
+	 *
 	 * @param settingName unqualified setting name
 	 * @return value or <code>null</code> if none
 	 */
 	protected String getDialogSetting(String settingName) {
 		return getDialogSettings().get(getDialogSettingsPrefix() + "." + settingName); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Sets the value of the dialog setting, associated with the given
 	 * settingName, resolved by the dialog setting prefix associated with this
 	 * action.
-	 * 
+	 *
 	 * @param settingName unqualified setting name
 	 * @return value or <code>null</code> if none
 	 */
@@ -74,14 +74,14 @@
 
 	/**
 	 * Returns this plug-in's dialog settings.
-	 * 
+	 *
 	 * @return IDialogSettings
 	 */
 	protected IDialogSettings getDialogSettings() {
 		IDialogSettings settings = JDIDebugUIPlugin.getDefault().getDialogSettings();
 		return settings;
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return ADD;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenFromClipboardAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenFromClipboardAction.java
index 1992198..e8f4e4f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenFromClipboardAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenFromClipboardAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -68,7 +68,7 @@
 
 /**
  * Action delegate for Open from Clipboard action.
- * 
+ *
  * @since 3.7
  */
 public class OpenFromClipboardAction implements IWorkbenchWindowActionDelegate {
@@ -198,7 +198,7 @@
 		}
 
 		String trimmedText = inputText.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-		List<Object> matches = new ArrayList<Object>();
+		List<Object> matches = new ArrayList<>();
 		int line = 0;
 		try {
 			line = getJavaElementMatches(trimmedText, matches);
@@ -282,7 +282,7 @@
 	}
 
 	private static void handleSingleLineInput(String inputText) {
-		List<Object> matches = new ArrayList<Object>();
+		List<Object> matches = new ArrayList<>();
 		try {
 			int line= getJavaElementMatches(inputText, matches);
 			handleMatches(matches, line, inputText);
@@ -293,7 +293,7 @@
 
 	/**
 	 * Parse the input text and search for the corresponding Java elements.
-	 * 
+	 *
 	 * @param inputText the line number
 	 * @param matches matched Java elements
 	 * @return the line number
@@ -378,7 +378,7 @@
 
 	/**
 	 * Perform a Java search for the type and return the corresponding Java elements.
-	 * 
+	 *
 	 * @param typeName the Type name
 	 * @param matches matched Java elements
 	 * @throws InterruptedException if canceled by the user
@@ -395,7 +395,7 @@
 	/**
 	 * Perform a Java search for methods and constructors and return the corresponding Java
 	 * elements.
-	 * 
+	 *
 	 * @param s the method pattern
 	 * @param matches matched Java elements
 	 * @throws InterruptedException if canceled by the user
@@ -412,7 +412,7 @@
 	/**
 	 * Perform a Java search for fields, methods and constructors and return the corresponding Java
 	 * elements.
-	 * 
+	 *
 	 * @param s the member pattern
 	 * @param matches matched Java elements
 	 * @throws InterruptedException if canceled by the user
@@ -429,7 +429,7 @@
 	/**
 	 * Perform a Java search for types, fields and methods and return the corresponding Java
 	 * elements.
-	 * 
+	 *
 	 * @param s the qualified name pattern
 	 * @param matches matched Java elements
 	 * @throws InterruptedException if canceled by the user
@@ -456,7 +456,7 @@
 
 	/**
 	 * Handles the given matches.
-	 * 
+	 *
 	 * @param matches matched Java elements
 	 * @param line the line number
 	 * @param inputText the input text
@@ -501,7 +501,7 @@
 	/**
 	 * Opens each specified Java element in a Java editor and navigates to the specified line
 	 * number.
-	 * 
+	 *
 	 * @param elements
 	 *            the Java elements
 	 * @param line
@@ -526,7 +526,7 @@
 
 	/**
 	 * Jumps to the given line in the editor if the line number lies within the given Java element.
-	 * 
+	 *
 	 * @param editorPart the Editor part
 	 * @param line the line to jump to
 	 * @param element the Java Element
@@ -561,7 +561,7 @@
 
 	/**
 	 * Opens an text input dialog to let the user refine the input text.
-	 * 
+	 *
 	 * @param inputText the input text
 	 */
 	private static void openInputEditDialog(String inputText) {
@@ -607,13 +607,13 @@
 
 	/**
 	 * Perform a Java search for the type and return the corresponding Java elements.
-	 * 
+	 *
 	 * <p>
 	 * TODO: Because of faster performance SearchEngine.searchAllTypeNames(...) is used to do the
 	 * Java Search, instead of the usual SearchEngine.search(...) API. This logic should be moved to
 	 * JDT/Core.
 	 * </p>
-	 * 
+	 *
 	 * @param typeName
 	 *            the Type Name
 	 * @param matches
@@ -647,13 +647,13 @@
 	/**
 	 * Perform a Java search for one or more of fields, methods and constructors and return the
 	 * corresponding Java elements.
-	 * 
+	 *
 	 * <p>
 	 * TODO: Because of faster performance, if the type name is available
 	 * SearchEngine.searchAllTypeNames(...) is used to narrow the scope of Java Search. This logic
 	 * should be moved to JDT/Core.
 	 * </p>
-	 * 
+	 *
 	 * @param memberName
 	 *            the Member Name
 	 * @param matches
@@ -690,7 +690,7 @@
 		if (index != -1) {
 			typeName = memberName.substring(0, index);
 			memberName = memberName.substring(index + 1);
-			final List<Object> typeMatches = new ArrayList<Object>();
+			final List<Object> typeMatches = new ArrayList<>();
 			noOfSearches++;
 			doTypeSearch(typeName, typeMatches, progress.newChild(work / noOfSearches));
 			IType[] types = new IType[typeMatches.size()];
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeAction.java
index 1e21dd2..f2a296a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeHierarchyAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeHierarchyAction.java
index 2e98c47..f1ef73b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeHierarchyAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenReceivingTypeHierarchyAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,12 +14,12 @@
  * Opens the receiving type hierarchy of a stack frame.
  */
 public class OpenReceivingTypeHierarchyAction extends OpenReceivingTypeAction {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction#isHierarchy()
 	 */
 	@Override
 	protected boolean isHierarchy() {
 		return true;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenStackFrameAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenStackFrameAction.java
index 7a036c9..e7cf425 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenStackFrameAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenStackFrameAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
  * Action that opens a type associated with a selected stack frame.
  */
 public abstract class OpenStackFrameAction extends OpenTypeAction {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction#getDebugElement(org.eclipse.core.runtime.IAdaptable)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java
index cc2eef1..d2d558e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java
@@ -38,7 +38,7 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 
 public abstract class OpenTypeAction extends ObjectActionDelegate {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
@@ -64,21 +64,21 @@
 			JDIDebugUIPlugin.statusDialog(e.getStatus());
 		}
 	}
-	
+
 	protected abstract IDebugElement getDebugElement(IAdaptable element);
-	
+
 	/**
 	 * Returns the type to open based on the given selected debug element, or <code>null</code>.
-	 * 
+	 *
 	 * @param element selected debug element
 	 * @return the type to open or <code>null</code> if none
 	 * @throws DebugException
 	 */
 	protected abstract IJavaType getTypeToOpen(IDebugElement element) throws CoreException;
-	
+
 	/**
 	 * Resolves and returns the source element to open or <code>null</code> if none.
-	 * 
+	 *
 	 * @param e selected element to resolve a source element for
 	 * @return the source element to open or <code>null</code> if none
 	 * @throws CoreException
@@ -120,20 +120,20 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns whether a type hierarchy should be opened.
-	 * 
+	 *
 	 * @return whether a type hierarchy should be opened
 	 */
 	protected boolean isHierarchy() {
 		return false;
 	}
-	
+
 	/**
 	 * Searches for and returns a type with the given name in the workspace,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param typeName fully qualified type name
 	 * @param findOnlyUniqueMatch
 	 *            if <code>true</code>, this method only returns a type iff
@@ -155,7 +155,7 @@
 			simpleName= typeName;
 		}
 		char[][] typeNames= new char[][] { simpleName.toCharArray() };
-		
+
 		if (findOnlyUniqueMatch) {
 			return findUniqueTypeInWorkspace(qualifications, typeNames);
 		}
@@ -184,7 +184,7 @@
 		}
 		return null;
 	}
-	
+
 	private static IType findUniqueTypeInWorkspace(char[][] qualifications,
 			char[][] typeNames) throws JavaModelException {
 		final IType[] result = { null };
@@ -205,9 +205,9 @@
 		}
 		return result[0];
 	}
-	
-	
+
+
 	protected void typeHierarchyError() {
-		showErrorMessage(ActionMessages.ObjectActionDelegate_Unable_to_display_type_hierarchy__The_selected_source_element_is_not_contained_in_the_workspace__1); 
-	}	
+		showErrorMessage(ActionMessages.ObjectActionDelegate_Unable_to_display_type_hierarchy__The_selected_source_element_is_not_contained_in_the_workspace__1);
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeAction.java
index dd697b9..5a581c7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -44,7 +44,7 @@
 		}
 		return null;
 	}
-	
+
 
 	@Override
 	public void run(IAction action) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeHierarchyAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeHierarchyAction.java
index 27b7b9c..7d32427 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeHierarchyAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableConcreteTypeHierarchyAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,15 +27,15 @@
  * Opens the concrete type hierarhcy of variable - i.e. it's value's actual type.
  */
 public class OpenVariableConcreteTypeHierarchyAction extends OpenVariableConcreteTypeAction {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction#isHierarchy()
 	 */
 	@Override
 	protected boolean isHierarchy() {
 		return true;
-	}	
-	
+	}
+
 	@Override
 	public void run(IAction action) {
 		IStructuredSelection selection = getCurrentSelection();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeAction.java
index 23a25ae..f988f04 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,5 +32,5 @@
 		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeHierarchyAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeHierarchyAction.java
index 643d1f9..51855a6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeHierarchyAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableDeclaredTypeHierarchyAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,12 +14,12 @@
  * Opens the declared type hierarchy of a variable.
  */
 public class OpenVariableDeclaredTypeHierarchyAction extends OpenVariableDeclaredTypeAction {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction#isHierarchy()
 	 */
 	@Override
 	protected boolean isHierarchy() {
 		return true;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableTypeAction.java
index ac38b0a..13aeb95 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenVariableTypeAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupDisplayAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupDisplayAction.java
index c3bdcf3..b3d4e46 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupDisplayAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupDisplayAction.java
@@ -46,7 +46,7 @@
         }
         DebugPopup displayPopup = new DisplayPopup(getShell(), textWidget);
         displayPopup.open();
-        
+
     }
 
     private class DisplayPopup extends DebugPopup {
@@ -87,7 +87,7 @@
             text.setText(resultString);
             return text;
         }
-        
+
         @Override
 		public boolean close() {
         	boolean returnValue = super.close();
@@ -107,7 +107,7 @@
             super.displayStringResult(currentSnippet, currentResultString);
             return;
         }
-        
+
         final StyledText textWidget = EvaluateAction.getStyledText(part);
         if (textWidget == null) {
             super.displayStringResult(currentSnippet, currentResultString);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupInspectAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupInspectAction.java
index d297879..f356972 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupInspectAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/PopupInspectAction.java
@@ -28,7 +28,7 @@
 
     private ITextEditor fTextEditor;
     private ISelection fSelectionBeforeEvaluation;
-    
+
     /**
      * @see EvaluateAction#displayResult(IEvaluationResult)
      */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ProjectSelectionDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ProjectSelectionDialog.java
index 86619b0..99add8e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ProjectSelectionDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ProjectSelectionDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,10 +39,10 @@
  * exported entries and required projects should also be added.
  */
 public class ProjectSelectionDialog extends AbstractDebugCheckboxSelectionDialog {
-	
+
 	private boolean fAddExportedEntries = true;
 	private boolean fAddRequiredProjects = true;
-	
+
 	private List<IJavaProject> fProjects;
 
 	/**
@@ -64,7 +64,7 @@
 	protected void addCustomFooterControls(Composite parent) {
 		super.addCustomFooterControls(parent);
 		final Button addExported = new Button(parent, SWT.CHECK);
-		addExported.setText(ActionMessages.ProjectSelectionDialog_Add_exported_entries_of_selected_projects__1); 
+		addExported.setText(ActionMessages.ProjectSelectionDialog_Add_exported_entries_of_selected_projects__1);
 		addExported.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -73,9 +73,9 @@
 		});
 		addExported.setSelection(fAddExportedEntries);
 		addExported.setFont(parent.getFont());
-		
+
 		final Button addRequired = new Button(parent, SWT.CHECK);
-		addRequired.setText(ActionMessages.ProjectSelectionDialog_Add_required_projects_of_selected_projects__2); 
+		addRequired.setText(ActionMessages.ProjectSelectionDialog_Add_required_projects_of_selected_projects__2);
 		addRequired.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -83,27 +83,27 @@
 			}
 		});
 		addRequired.setSelection(fAddRequiredProjects);
-		addRequired.setFont(parent.getFont());		
+		addRequired.setFont(parent.getFont());
 	}
-	
+
 	/**
 	 * Returns whether the user has selected to add exported entries.
-	 * 
+	 *
 	 * @return whether the user has selected to add exported entries
 	 */
 	public boolean isAddExportedEntries() {
 		return fAddExportedEntries;
 	}
-	
+
 	/**
 	 * Returns whether the user has selected to add required projects.
-	 * 
+	 *
 	 * @return whether the user has selected to add required projects
 	 */
 	public boolean isAddRequiredProjects() {
 		return fAddRequiredProjects;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveAction.java
index a16a091..fd2d923 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,11 +25,11 @@
 public class RemoveAction extends RuntimeClasspathAction {
 
 	public RemoveAction(IClasspathViewer viewer) {
-		super(ActionMessages.RemoveAction__Remove_1, viewer); 
+		super(ActionMessages.RemoveAction__Remove_1, viewer);
 	}
 	/**
 	 * Removes all selected entries.
-	 * 
+	 *
 	 * @see IAction#run()
 	 */
 	@Override
@@ -50,7 +50,7 @@
 		}
 		return getViewer().updateSelection(getActionType(), selection);
 	}
-	
+
 	@Override
 	protected int getActionType() {
 		return REMOVE;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveDetailFormatterAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveDetailFormatterAction.java
index dcb3527..474cdc1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveDetailFormatterAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RemoveDetailFormatterAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RestoreDefaultEntriesAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RestoreDefaultEntriesAction.java
index eb14047..f05f591 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RestoreDefaultEntriesAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RestoreDefaultEntriesAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,22 +25,22 @@
  * Restores default entries in the runtime classpath.
  */
 public class RestoreDefaultEntriesAction extends RuntimeClasspathAction {
-	
+
 	private JavaClasspathTab fTab;
-	
+
 	/**
 	 * Constructor
 	 * @param viewer the associated classpath viewer
 	 * @param tab the tab the viewer resides in
 	 */
 	public RestoreDefaultEntriesAction(IClasspathViewer viewer, JavaClasspathTab tab) {
-		super(ActionMessages.RestoreDefaultEntriesAction_0, viewer); 
+		super(ActionMessages.RestoreDefaultEntriesAction_0, viewer);
 		fTab = tab;
-	}	
+	}
 
 	/**
 	 * Only does work if we are not currently using the default classpath
-	 * 
+	 *
 	 * @see org.eclipse.jface.action.Action#run()
 	 */
 	@Override
@@ -58,8 +58,8 @@
 				copy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, true);
 				getViewer().setEntries(JavaRuntime.computeUnresolvedRuntimeClasspath(copy));
 			}
-		} 
-		catch (CoreException e) {return;}	
+		}
+		catch (CoreException e) {return;}
 	}
 
 	/**
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargetToggleTracepointAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargetToggleTracepointAction.java
index 1ee3d01..d33a3ab 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargetToggleTracepointAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargetToggleTracepointAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,15 +17,15 @@
 
 /**
  * Global retargettable toggle tracepoint action.
- * 
+ *
  * @since 3.12
- * 
+ *
  */
 public class RetargetToggleTracepointAction extends RetargetToggleBreakpointAction {
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.internal.ui.actions.RetargetTracepointAction# performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection,
 	 * org.eclipse.ui.IWorkbenchPart)
 	 */
@@ -37,7 +37,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection,
 	 * org.eclipse.ui.IWorkbenchPart)
 	 */
@@ -48,7 +48,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getOperationUnavailableMessage()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargettableActionAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargettableActionAdapterFactory.java
index 5479995..a758e65 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargettableActionAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RetargettableActionAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,9 +16,9 @@
 
 /**
  * Creates adapters for retargettable actions in debug platform.
- * Contributed via <code>org.eclipse.core.runtime.adapters</code> 
- * extension point. 
- * 
+ * Contributed via <code>org.eclipse.core.runtime.adapters</code>
+ * extension point.
+ *
  * @since 3.0
  */
 public class RetargettableActionAdapterFactory implements IAdapterFactory {
@@ -33,7 +33,7 @@
 		}
 		if (adapterType == IToggleBreakpointsTarget.class) {
 			return (T) new ToggleBreakpointAdapter();
-		} 
+		}
 		return null;
 	}
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RunToLineAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RunToLineAdapter.java
index 2042e28..4eb5303 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RunToLineAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RunToLineAdapter.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -46,7 +46,7 @@
  * Run to line target for the Java debugger
  */
 public class RunToLineAdapter implements IRunToLineTarget {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.actions.IRunToLineTarget#runToLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume)
 	 */
@@ -88,7 +88,7 @@
 							throw new CoreException(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Invalid Type Name", null)); //$NON-NLS-1$
 						}
 						IBreakpoint breakpoint= null;
-						Map<String, Object> attributes = new HashMap<String, Object>(4);
+						Map<String, Object> attributes = new HashMap<>(4);
 						BreakpointUtils.addRunToLineAttributes(attributes);
 						breakpoint= JDIDebugModel.createLineBreakpoint(ResourcesPlugin.getWorkspace().getRoot(), typeName[0], lineNumber[0], -1, -1, 1, false, attributes);
 						errorMessage = "Unable to locate debug target";  //$NON-NLS-1$
@@ -107,7 +107,7 @@
 						} else {
 							errorMessage = "Cursor position is not a valid location to run to";  //$NON-NLS-1$
 						}
-	
+
 					}
 				}
 			}
@@ -115,7 +115,7 @@
 		throw new CoreException(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR,
 				errorMessage, null));
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.actions.IRunToLineTarget#canRunToLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume)
 	 */
@@ -128,12 +128,12 @@
         }
 		return false;
 	}
-	
+
     /**
      * Returns the text editor associated with the given part or <code>null</code>
      * if none. In case of a multi-page editor, this method should be used to retrieve
      * the correct editor to perform the operation on.
-     * 
+     *
      * @param part workbench part
      * @return text editor part or <code>null</code>
      */
@@ -142,5 +142,5 @@
     		return (ITextEditor) part;
     	}
     	return part.getAdapter(ITextEditor.class);
-    }	
+    }
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RuntimeClasspathAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RuntimeClasspathAction.java
index 7f59798..a3e332d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RuntimeClasspathAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RuntimeClasspathAction.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
- 
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -29,16 +29,16 @@
  * Action used with a runtime classpath viewer.
  */
 public abstract class RuntimeClasspathAction extends SelectionListenerAction {
-	
+
 	public static final int DEFAULT= 0;
 	public static final int ADD= 1;
 	public static final int REMOVE= 2;
 	public static final int MOVE= 3;
-	
+
 	private IClasspathViewer fViewer;
 	private Button fButton;
 	private Shell fShell;
-	
+
 	public RuntimeClasspathAction(String label, IClasspathViewer viewer) {
 		super(label);
 		setViewer(viewer);
@@ -46,7 +46,7 @@
 
 	/**
 	 * Sets the viewer on which this action operates.
-	 * 
+	 *
 	 * @param viewer the viewer on which this action operates
 	 */
 	public void setViewer(IClasspathViewer viewer) {
@@ -59,10 +59,10 @@
 			update();
 		}
 	}
-	
+
 	/**
 	 * Returns the viewer on which this action operates.
-	 * 
+	 *
 	 * @return the viewer on which this action operates
 	 */
 	protected IClasspathViewer getViewer() {
@@ -72,11 +72,11 @@
 	/**
 	 * Returns the selected items in the list, in the order they are
 	 * displayed.
-	 * 
+	 *
 	 * @return targets for an action
 	 */
 	protected List<IRuntimeClasspathEntry> getOrderedSelection() {
-		List<IRuntimeClasspathEntry> targets = new ArrayList<IRuntimeClasspathEntry>();
+		List<IRuntimeClasspathEntry> targets = new ArrayList<>();
 		List<?> selection = ((IStructuredSelection)getViewer().getSelection()).toList();
 		IRuntimeClasspathEntry[] entries = getViewer().getEntries();
 		for (int i = 0; i < entries.length; i++) {
@@ -85,22 +85,22 @@
 				targets.add(target);
 			}
 		}
-		return targets;		
+		return targets;
 	}
-	
+
 	/**
 	 * Returns a list (copy) of the entries in the viewer
 	 * @return the complete listing of all of the entries in the viewer
 	 */
 	protected List<IRuntimeClasspathEntry> getEntriesAsList() {
 		IRuntimeClasspathEntry[] entries = getViewer().getEntries();
-		List<IRuntimeClasspathEntry> list = new ArrayList<IRuntimeClasspathEntry>(entries.length);
+		List<IRuntimeClasspathEntry> list = new ArrayList<>(entries.length);
 		for (int i = 0; i < entries.length; i++) {
 			list.add(entries[i]);
 		}
 		return list;
 	}
-	
+
 	/**
 	 * Updates the entries to the entries in the given list
 	 * @param list the list of {@link IRuntimeClasspathEntry}s to set
@@ -110,7 +110,7 @@
 		// update all selection listeners
 		getViewer().setSelection(getViewer().getSelection());
 	}
-	
+
 	/**
 	 * Returns whether the item at the given index in the list
 	 * (visually) is selected.
@@ -131,8 +131,8 @@
 			}
 		}
 		return false;
-	}	
-	
+	}
+
 	/**
 	 * Sets the {@link Button} that invokes this action
 	 * @param button the new {@link Button} to set as the backing widget for this action
@@ -164,7 +164,7 @@
 	protected void update() {
 		selectionChanged((IStructuredSelection)getViewer().getSelection());
 	}
-	
+
 	/**
 	 * Returns the shell used to realize this action's dialog (if any).
 	 * @return the current {@link Shell}
@@ -172,10 +172,10 @@
 	protected Shell getShell() {
 		if (fShell == null) {
 			fShell= getViewer().getShell();
-		} 
+		}
 		return fShell;
 	}
-	
+
 	/**
 	 * Sets the shell used to realize this action's dialog (if any).
 	 * @param shell the current shell
@@ -183,8 +183,8 @@
 	public void setShell(Shell shell) {
 		fShell= shell;
 	}
-	
-	
+
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowConstantsAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowConstantsAction.java
index 7a53f31..60df42f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowConstantsAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowConstantsAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,9 +27,9 @@
 	 */
 	@Override
 	protected String getPreferenceKey() {
-		return IJDIPreferencesConstants.PREF_SHOW_CONSTANTS; 
+		return IJDIPreferencesConstants.PREF_SHOW_CONSTANTS;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.ToggleBooleanPreferenceAction#getViewKey()
 	 */
@@ -37,5 +37,5 @@
 	protected String getViewKey() {
 		return getCompositeKey();
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowMonitorThreadInformation.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowMonitorThreadInformation.java
index c470846..0446626 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowMonitorThreadInformation.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowMonitorThreadInformation.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,12 +24,12 @@
 	protected String getPreferenceKey() {
 		return IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.ViewFilterAction#getCompositeKey()
 	 */
 	@Override
 	protected String getCompositeKey() {
 		return getPreferenceKey();
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowNullArrayEntriesAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowNullArrayEntriesAction.java
index 0beffff..2866c0d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowNullArrayEntriesAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowNullArrayEntriesAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,9 +32,9 @@
 	 */
 	@Override
 	protected String getPreferenceKey() {
-		return IJDIPreferencesConstants.PREF_SHOW_NULL_ARRAY_ENTRIES; 
+		return IJDIPreferencesConstants.PREF_SHOW_NULL_ARRAY_ENTRIES;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
 	 */
@@ -47,11 +47,11 @@
 		if (element instanceof JDIArrayEntryVariable) {
 			JDIArrayEntryVariable variable = (JDIArrayEntryVariable)element;
 			try {
-				return !variable.getValue().equals(((IJavaDebugTarget)variable.getDebugTarget()).nullValue());				
+				return !variable.getValue().equals(((IJavaDebugTarget)variable.getDebugTarget()).nullValue());
 			} catch (DebugException e) {
 				JDIDebugUIPlugin.log(e);
-			} 
+			}
 		}
 		return true;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowQualifiedAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowQualifiedAction.java
index 95756d2..bb40397 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowQualifiedAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowQualifiedAction.java
@@ -27,26 +27,26 @@
  * show/hide qualified names.
  */
 public class ShowQualifiedAction extends ViewFilterAction {
-	
+
 	/**
 	 * @see ViewFilterAction#getPreferenceKey()
 	 */
 	@Override
 	protected String getPreferenceKey() {
-		return IJDIPreferencesConstants.PREF_SHOW_QUALIFIED_NAMES; 
-	}	
+		return IJDIPreferencesConstants.PREF_SHOW_QUALIFIED_NAMES;
+	}
 
 	/**
 	 * This method is not actually called - this action is not a filter. Instead
 	 * it sets an attribute on the viewer's model presentation.
-	 * 
+	 *
 	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
 	 */
 	@Override
 	public boolean select(Viewer viewer, Object parentElement, Object element) {
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
@@ -64,10 +64,10 @@
 						viewer.refresh();
 						IPreferenceStore store = getPreferenceStore();
 						String key = getView().getSite().getId() + "." + getPreferenceKey(); //$NON-NLS-1$
-						store.setValue(key, getValue());				
+						store.setValue(key, getValue());
 					}
 				});
 			}
-		}		
-	}	
+		}
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStaticVariablesAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStaticVariablesAction.java
index 1c635f4..fbe0197 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStaticVariablesAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStaticVariablesAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 	 */
 	@Override
 	protected String getPreferenceKey() {
-		return IJDIPreferencesConstants.PREF_SHOW_STATIC_VARIABLES; 
+		return IJDIPreferencesConstants.PREF_SHOW_STATIC_VARIABLES;
 	}
 
 	/* (non-Javadoc)
@@ -36,5 +36,5 @@
 	@Override
 	protected String getViewKey() {
 		return getCompositeKey();
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStratumAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStratumAction.java
index 6e47fb2..833b52e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStratumAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowStratumAction.java
@@ -37,7 +37,7 @@
  * Allows the user to choose what source to display from available strata
  */
 public class ShowStratumAction implements IObjectActionDelegate, IMenuCreator {
-    
+
     private IStructuredSelection fSelection;
     private IWorkbenchPart fPart;
 
@@ -100,7 +100,7 @@
 
     /**
      * Fills the given menu with available stratum.
-     * 
+     *
      * @param m
      */
     private void fillMenu(Menu m) {
@@ -123,11 +123,11 @@
 	        }
         }
     }
-    
+
     private MenuItem createMenuItem(Menu m, final String stratum, final IJavaStackFrame frame, final IJavaDebugTarget target) {
         MenuItem item = new MenuItem(m, SWT.CHECK);
         if (stratum == null) {
-            item.setText(ActionMessages.ShowStratumAction_0); 
+            item.setText(ActionMessages.ShowStratumAction_0);
         } else {
             item.setText(stratum);
         }
@@ -156,6 +156,6 @@
     @Override
 	public void dispose() {
     }
-    
+
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowSystemThreadsAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowSystemThreadsAction.java
index 5d8379e..7abe841 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowSystemThreadsAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowSystemThreadsAction.java
@@ -18,6 +18,7 @@
 import org.eclipse.jdt.debug.core.IJavaThread;
 import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
+import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.ui.IViewPart;
 
@@ -41,7 +42,7 @@
 	@Override
 	public boolean select(Viewer viewer, Object parentElement, Object element) {
 	    if (!getValue()) {
-            
+
             IJavaThread thread = getJavaThread(element);
 
 	        if (thread != null) {
@@ -54,7 +55,7 @@
 	    }
 	    return true;
 	}
-    
+
 	private IJavaThread getJavaThread(Object element) {
 	    IJavaThread thread = null;
 
@@ -105,7 +106,7 @@
 			}
 		}
 	}
-	
+
 	private void refresh(Object source) {
         final IJavaThread thread = getJavaThread(source);
         if (thread != null) {
@@ -114,7 +115,10 @@
 					Runnable r = new Runnable() {
 						@Override
 						public void run() {
-							getStructuredViewer().refresh();
+							StructuredViewer viewer = getStructuredViewer();
+							if (viewer != null) {
+								viewer.refresh();
+							}
 						}
 					};
 					JDIDebugUIPlugin.getStandardDisplay().asyncExec(r);
@@ -122,6 +126,6 @@
 				}
 			} catch (DebugException e) {
 			}
-		}		
+		}
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowThreadGroups.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowThreadGroups.java
index 74b28e8..211ba88 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowThreadGroups.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ShowThreadGroups.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoEditorSelectionHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoEditorSelectionHandler.java
index 35527a8..1f98956 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoEditorSelectionHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoEditorSelectionHandler.java
@@ -21,13 +21,13 @@
 
 /**
  * Default handler for Step Into Editor Selection action
- * 
+ *
  * @since 3.6.200
  */
 public class StepIntoEditorSelectionHandler extends AbstractHandler {
 
 	IDebugEventSetListener listener = null;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHandler.java
index 3831632..66c41b6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHandler.java
@@ -30,17 +30,17 @@
  * Handles stepping into a selected method, for a specific thread.
  */
 public class StepIntoSelectionHandler implements IDebugEventFilter {
-	
+
 	/**
 	 * The method to step into
 	 */
 	private IMethod fMethod;
-	
+
 	/**
 	 * Resolved signature of the method to step into
 	 */
 	private String fResolvedSignature;
-	
+
 	/**
 	 * The thread in which to step
 	 */
@@ -53,22 +53,22 @@
 	private String fOriginalSignature;
 	private String fOriginalTypeName;
 	private int fOriginalStackDepth;
-	
+
 	/**
 	 * Whether this is the first step into.
 	 */
 	private boolean fFirstStep = true;
-	
+
 	/**
 	 * The state of step filters before the step.
 	 */
 	private boolean fStepFilterEnabledState;
-	
+
 	/**
 	 * Expected event kind
 	 */
 	private int fExpectedKind = -1;
-	
+
 	/**
 	 * Expected event detail
 	 */
@@ -94,38 +94,38 @@
 			JDIDebugUIPlugin.log(e);
 		}
 	}
-	
+
 	/**
 	 * Returns the target thread for the step.
-	 * 
+	 *
 	 * @return the target thread for the step
 	 */
 	protected IJavaThread getThread() {
 		return fThread;
 	}
-	
+
 	protected IJavaDebugTarget getDebugTarget() {
 		return (IJavaDebugTarget)getThread().getDebugTarget();
 	}
-	
+
 	/**
 	 * Returns the method to step into
-	 * 
+	 *
 	 * @return the method to step into
 	 */
 	protected IMethod getMethod() {
 		return fMethod;
 	}
-	
+
 	/**
 	 * Returns the resolved signature of the method to step into
-	 * 
+	 *
 	 * @return the resolved signature of the method to step into
 	 */
 	protected String getSignature() {
 		return fResolvedSignature;
-	}	
-	
+	}
+
 	/**
 	 * @see org.eclipse.debug.core.IDebugEventFilter#filterDebugEvents(org.eclipse.debug.core.DebugEvent)
 	 */
@@ -143,14 +143,14 @@
 				threadEvents++;
 			} else if (e.getSource() == getThread()) {
 				threadEvents++;
-			} 
+			}
 		}
-		
+
 		if (event == null) {
 			// nothing to process in this event set
 			return events;
 		}
-				
+
 		// create filtered event set
 		DebugEvent[] filtered = new DebugEvent[events.length - 1];
 		if (filtered.length > 0) {
@@ -162,13 +162,13 @@
 				}
 			}
 		}
-		
+
 		// if more than one event in our thread, abort (filtering our event)
 		if (threadEvents > 1) {
 			cleanup();
 			return filtered;
 		}
-		
+
 		// we have the one expected event - process it
 		switch (event.getKind()) {
 			case DebugEvent.RESUME:
@@ -179,7 +179,7 @@
 					return events; // include the first resume event
 				}
 				// secondary step - filter the event
-				return filtered;			
+				return filtered;
 			case DebugEvent.SUSPEND:
 				// compare location to desired location
 				try {
@@ -217,7 +217,7 @@
                                         DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});
                                     }
                                 }
-                            };                            
+                            };
                         } else {
     						r = new Runnable() {
     							@Override
@@ -244,18 +244,18 @@
 							public void run() {
 								try {
 									setExpectedEvent(DebugEvent.RESUME, DebugEvent.STEP_INTO);
-									frame.stepInto();	
+									frame.stepInto();
 								} catch (DebugException e) {
 									JDIDebugUIPlugin.log(e);
 									cleanup();
 									DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});
 								}
 							}
-						};																
+						};
 					} else {
 						// we returned from the original frame - never hit the desired method
 						missed();
-						return events;								
+						return events;
 					}
 					DebugPlugin.getDefault().asyncExec(r);
 					// filter the events
@@ -265,14 +265,14 @@
 					JDIDebugUIPlugin.log(e);
 					cleanup();
 					return events;
-				}			
+				}
 		}
 		// execution should not reach here
 		return events;
-		 
+
 	}
-	
-	/** 
+
+	/**
 	 * Called when stepping returned from the original frame without entering the desired method.
 	 */
 	protected void missed() {
@@ -286,10 +286,10 @@
 				} catch (JavaModelException e) {
 					methodName = getMethod().getElementName();
 				}
-				new MessageDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(),  ActionMessages.StepIntoSelectionHandler_1, null, NLS.bind(ActionMessages.StepIntoSelectionHandler_Execution_did_not_enter____0____before_the_current_method_returned__1, new String[]{methodName}), MessageDialog.INFORMATION, new String[] {ActionMessages.StepIntoSelectionHandler_2}, 0).open();    
+				new MessageDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(),  ActionMessages.StepIntoSelectionHandler_1, null, NLS.bind(ActionMessages.StepIntoSelectionHandler_Execution_did_not_enter____0____before_the_current_method_returned__1, new String[]{methodName}), MessageDialog.INFORMATION, new String[] {ActionMessages.StepIntoSelectionHandler_2}, 0).open();
 			}
 		};
-		JDIDebugUIPlugin.getStandardDisplay().asyncExec(r);		
+		JDIDebugUIPlugin.getStandardDisplay().asyncExec(r);
 	}
 
 	/**
@@ -307,10 +307,10 @@
 		} catch (DebugException e) {
 			JDIDebugUIPlugin.log(e);
 			cleanup();
-			DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});			
+			DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});
 		}
 	}
-	
+
 	/**
 	 * Cleans up when the step is complete/aborted.
 	 */
@@ -319,10 +319,10 @@
 		// restore step filter state
 		getDebugTarget().setStepFiltersEnabled(fStepFilterEnabledState);
 	}
-	
+
 	/**
 	 * Sets the expected debug event kind and detail we are waiting for next.
-	 * 
+	 *
 	 * @param kind event kind
 	 * @param detail event detail
 	 */
@@ -330,10 +330,10 @@
 		fExpectedKind = kind;
 		fExpectedDetail = detail;
 	}
-	
+
 	/**
 	 * Returns whether the given event is what we expected.
-	 * 
+	 *
 	 * @param event fire event
 	 * @return whether the event is what we expected
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHyperlinkDetector.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHyperlinkDetector.java
index 1be95ec..23a2f5d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHyperlinkDetector.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionHyperlinkDetector.java
@@ -39,18 +39,18 @@
 
 /**
  * This is a specialization of a hyperlink detector for the step into selection command
- * 
+ *
  * @since 3.3
  */
 public class StepIntoSelectionHyperlinkDetector extends AbstractHyperlinkDetector {
-	
+
 	/**
 	 * Specific implementation of a hyperlink for step into command
 	 */
 	class StepIntoSelectionHyperlink implements IHyperlink {
-		
+
 		private ITextSelection fSelection = null;
-		
+
 		/**
 		 * Constructor
 		 * @param region
@@ -86,7 +86,7 @@
 		public void open() {
 			StepIntoSelectionUtils.stepIntoSelection(fSelection);
 		}
-		
+
 	}
 
 	/**
@@ -96,7 +96,7 @@
 	public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
 		ITextEditor editor = getAdapter(ITextEditor.class);
 		if(editor != null && EvaluationContextManager.getEvaluationContext(JDIDebugUIPlugin.getActiveWorkbenchWindow()) != null) {
-			
+
 			// should only enable step into selection when the current debug context
 			// is an instance of IJavaStackFrame
 			IAdaptable debugContext = DebugUITools.getDebugContext();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionUtils.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionUtils.java
index d40b63a..ab751a3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionUtils.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StepIntoSelectionUtils.java
@@ -49,15 +49,15 @@
 
 /**
  * Utility class for aiding step into selection actions and hyper-linking
- * 
+ *
  * @see StepIntoSelectionActionDelegate
  * @see StepIntoSelectionHyperlinkDetector
- * 
+ *
  * @since 3.3
  */
 public class StepIntoSelectionUtils {
 
-	
+
 	/**
      * gets the <code>IJavaElement</code> from the editor input
      * @param input the current editor input
@@ -70,9 +70,9 @@
     	}
     	return JavaUI.getWorkingCopyManager().getWorkingCopy(input);
     }
-    
+
     /**
-     * Returns the <code>IMethod</code> from the given selection within the given <code>IJavaElement</code>, 
+     * Returns the <code>IMethod</code> from the given selection within the given <code>IJavaElement</code>,
      * or <code>null</code> if the selection does not container or is not an <code>IMethod</code>
      * @param selection
      * @param element
@@ -90,7 +90,7 @@
 	 * @param offset selection offset
 	 * @param length selection length
 	 * @param codeAssist context
-	 * @return the method at the given position, or <code>null</code> if no method could be resolved 
+	 * @return the method at the given position, or <code>null</code> if no method could be resolved
 	 * @throws JavaModelException
 	 */
 	private static IMethod resolveMethod(int offset, int length, ICodeAssist codeAssist) throws JavaModelException {
@@ -102,7 +102,7 @@
 		}
 		return null;
 	}
-    
+
 	/**
 	 * @param offset
 	 * @param activeEditor
@@ -137,15 +137,15 @@
 					if (token == ITerminalSymbols.TokenNameLPAREN) {
 						return resolveMethod(lineInfo.getOffset() + methodStart, 0, (ICodeAssist)element);
 					}
-				} 
+				}
 				else {
 					token = scanner.getNextToken();
 				}
 			}
-		} 
+		}
 		catch (BadLocationException e) {
 			return null;
-		} 
+		}
 		catch (InvalidInputException e) {
 			return null;
 		}
@@ -154,10 +154,10 @@
 
 	/**
 	 * Steps into the selection described by the given {@link IRegion}
-	 * 
+	 *
 	 * @param region the region of the selection or <code>null</code> if we should use the page's selection service to compute
 	 * the selection
-	 * 
+	 *
 	 * @since 3.6.200
 	 */
 	public static void stepIntoSelection(ITextSelection selection) {
@@ -195,7 +195,7 @@
 						runToLineBeforeStepIn(editor, callingTypeName, selection, frame.getThread(), method);
 						return;
 					}
-				} 
+				}
 				catch (DebugException e) {
 					showErrorMessage(editor, e.getStatus().getMessage());
 					return;
@@ -205,9 +205,9 @@
 					return;
 				}
 			}
-		} 
+		}
 	}
-	
+
 	/**
 	 * When the user chooses to "step into selection" on a line other than
 	 * the currently executing one, first perform a "run to line" to get to
@@ -224,11 +224,11 @@
 			runToLineAction  = editor.getAdapter(IRunToLineTarget.class);
 			if (runToLineAction == null) {
 				IAdapterManager adapterManager = Platform.getAdapterManager();
-				if (adapterManager.hasAdapter(editor,   IRunToLineTarget.class.getName())) { 
-					runToLineAction = (IRunToLineTarget) adapterManager.loadAdapter(editor,IRunToLineTarget.class.getName()); 
+				if (adapterManager.hasAdapter(editor,   IRunToLineTarget.class.getName())) {
+					runToLineAction = (IRunToLineTarget) adapterManager.loadAdapter(editor,IRunToLineTarget.class.getName());
 				}
 			}
-		}	
+		}
 		// if no adapter exists, use the Java adapter
 		if (runToLineAction == null) {
 		  runToLineAction = new RunToLineAdapter();
@@ -311,14 +311,14 @@
 			runToLineAction.runToLine(editor, textSelection, thread);
 		} catch (CoreException e) {
 			DebugPlugin.getDefault().removeDebugEventListener(listener);
-			showErrorMessage(editor, ActionMessages.StepIntoSelectionActionDelegate_4); 
+			showErrorMessage(editor, ActionMessages.StepIntoSelectionActionDelegate_4);
 			JDIDebugUIPlugin.log(e.getStatus());
 		}
 	}
-	
+
 	/**
 	 * Steps into the given method in the given stack frame
-	 * 
+	 *
 	 * @param editor
 	 * @param frame the frame in which the step should begin
 	 * @param method the method to step into
@@ -328,31 +328,31 @@
 		// ensure top stack frame
 		IStackFrame tos = frame.getThread().getTopStackFrame();
 		if (tos == null) {
-			return; 
-		}		
+			return;
+		}
 		if (!tos.equals(frame)) {
-			showErrorMessage(editor, ActionMessages.StepIntoSelectionActionDelegate_Step_into_selection_only_available_in_top_stack_frame__3); 
+			showErrorMessage(editor, ActionMessages.StepIntoSelectionActionDelegate_Step_into_selection_only_available_in_top_stack_frame__3);
 			return;
 		}
 		StepIntoSelectionHandler handler = new StepIntoSelectionHandler((IJavaThread)frame.getThread(), frame, method);
 		handler.step();
 	}
-	
+
 	/**
 	 * Displays an error message in the status area
-	 * 
+	 *
 	 * @param editor
 	 * @param message
 	 */
-	static void showErrorMessage(IEditorPart editor, String message) {	
+	static void showErrorMessage(IEditorPart editor, String message) {
 		if (editor != null) {
 			IEditorStatusLine statusLine = editor.getAdapter(IEditorStatusLine.class);
 			if (statusLine != null) {
 				statusLine.setMessage(true, message, null);
 			}
-		}		
+		}
 	}
-	
+
 	/**
 	 * Return the type containing the selected text, or <code>null</code> if the
 	 * selection is not in a type.
@@ -366,11 +366,11 @@
 			type= member.getDeclaringType();
 		}
 		return type;
-	}	
-	
+	}
+
 	/**
      * Strips inner class names and parameterized type information from the given type name.
-     * 
+     *
      * @param fullyQualifiedName
      */
     static String stripInnerNamesAndParameterType(String fullyQualifiedName) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StringValueInputDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StringValueInputDialog.java
index 8eefb2c..9b36a97 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StringValueInputDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StringValueInputDialog.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial implementation
  *******************************************************************************/
@@ -45,7 +45,7 @@
     private Button fTextButton;
     private Button fEvaluationButton;
     private Button fWrapText;
-    
+
     private boolean fUseLiteralValue= true;
     private static final String USE_EVALUATION = "USE_EVALUATION"; //$NON-NLS-1$
     private static final String WRAP_TEXT = "WRAP_TEXT"; //$NON-NLS-1$
@@ -57,7 +57,7 @@
     protected StringValueInputDialog(Shell parentShell, IJavaVariable variable) {
         super(parentShell, variable);
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.jdt.internal.debug.ui.actions.ExpressionInputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
      */
@@ -68,7 +68,7 @@
 		workbench.getHelpSystem().setHelp(parent, IJavaDebugHelpContextIds.STRING_VALUE_INPUT_DIALOG);
 		return control;
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.jdt.internal.debug.ui.actions.ExpressionInputDialog#createInputArea(org.eclipse.swt.widgets.Composite)
      */
@@ -78,7 +78,7 @@
     	createRadioButtons(parent);
     	return composite;
     }
-    
+
     /**
      * Override superclass method to create the appropriate viewer
      * (source viewer or simple text viewer) in the input area.
@@ -87,14 +87,14 @@
 	protected void populateInputArea(Composite parent) {
     	super.populateInputArea(parent);
     	createTextViewer(parent);
-    	
+
     	// Use the stored dialog settings to determine what radio button is selected and what viewer to show.
         boolean useEvaluation= false;
         IDialogSettings settings = getDialogSettings();
         if (settings != null) {
             useEvaluation= settings.getBoolean(USE_EVALUATION);
         }
-        
+
         setTextViewerVisible(!useEvaluation);
         setSourceViewerVisible(useEvaluation);
         fUseLiteralValue = !useEvaluation;
@@ -109,7 +109,7 @@
      */
     private void createTextViewer(Composite parent) {
     	fTextGroup = SWTFactory.createGroup(parent, ActionMessages.StringValueInputDialog_0, 1, 1, GridData.FILL_BOTH);
-    	                
+
         fTextViewer= new TextViewer(fTextGroup, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
         fTextViewer.setDocument(new Document());
         GridData gridData = new GridData(GridData.FILL_BOTH);
@@ -124,7 +124,7 @@
             JDIDebugUIPlugin.log(e);
         }
         fTextViewer.getControl().setFocus();
-        
+
         boolean wrap= true;
         IDialogSettings settings = getDialogSettings();
         if (settings != null) {
@@ -138,7 +138,7 @@
                 updateWordWrap();
             }
         });
-        
+
 		IDocumentListener listener = new IDocumentListener() {
             @Override
 			public void documentAboutToBeChanged(DocumentEvent event) {
@@ -148,9 +148,9 @@
                 refreshValidState(fTextViewer);
             }
         };
-		fTextViewer.getDocument().addDocumentListener(listener);        
+		fTextViewer.getDocument().addDocumentListener(listener);
     }
-    
+
     private void updateWordWrap() {
         fTextViewer.getTextWidget().setWordWrap(fWrapText.getSelection());
     }
@@ -160,7 +160,7 @@
      * simple text mode and evaluation mode.
      */
     protected void createRadioButtons(Composite parent) {
-    	
+
     	fTextButton = SWTFactory.createRadioButton(parent, ActionMessages.StringValueInputDialog_1);
         fTextButton.addSelectionListener(new SelectionAdapter() {
             @Override
@@ -170,7 +170,7 @@
         });
         fEvaluationButton = SWTFactory.createRadioButton(parent, ActionMessages.StringValueInputDialog_2);
     }
-    
+
     /**
      * The radio button selection has changed update the input widgetry
      * to reflect the user's selection.
@@ -190,7 +190,7 @@
 	        refreshValidState();
         }
     }
-    
+
     /**
      * Sets the visibility of the source viewer and the exclude attribute of its layout.
      * @param value If <code>true</code>, the viewer will be visible, if <code>false</code>, the viewer will be hidden.
@@ -202,7 +202,7 @@
 			data.exclude = !value;
     	}
     }
-      
+
     /**
      * Updates the error message based on the user's input.
      */
@@ -214,7 +214,7 @@
         	super.refreshValidState();
         }
 	}
-    
+
     /**
      * Override superclass method to persist user's evaluation/literal mode
      * selection.
@@ -231,18 +231,18 @@
         }
         super.okPressed();
     }
-    
+
     /**
      * Returns <code>true</code> if this dialog's result should be interpreted
      * as a literal value and <code>false</code> if the result should be interpreted
      * as an expression for evaluation.
-     * 
+     *
      * @return whether or not this dialog's result is a literal value.
      */
     public boolean isUseLiteralValue() {
         return fUseLiteralValue;
     }
-    
+
     /**
      * Override superclass method to return text from the simple text
      * viewer if appropriate.
@@ -255,7 +255,7 @@
         }
         return super.getText();
     }
-    
+
     /**
      * Returns the dialog settings used for this dialog
      * @return the dialog settings used for this dialog
@@ -263,7 +263,7 @@
     protected IDialogSettings getDialogSettings() {
         return JDIDebugUIPlugin.getDefault().getDialogSettings().getSection(getDialogSettingsSectionName());
     }
-    
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.ExpressionInputDialog#getDialogSettingsSectionName()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/TerminateEvaluationAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/TerminateEvaluationAction.java
index e0ac526..97ded8e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/TerminateEvaluationAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/TerminateEvaluationAction.java
@@ -30,7 +30,7 @@
  * Attempts to terminate an evaluation running in an IJavaThread.
  */
 public class TerminateEvaluationAction implements IObjectActionDelegate, IDebugEventSetListener {
-	
+
 	private IJavaThread fThread;
 	private boolean fTerminated;
 
@@ -59,8 +59,8 @@
 						display.asyncExec(new Runnable() {
 							@Override
 							public void run() {
-								MessageDialog dialog = new MessageDialog(display.getActiveShell(), ActionMessages.TerminateEvaluationActionTerminate_Evaluation_1, null, 
-									ActionMessages.TerminateEvaluationActionAttempts_to_terminate_an_evaluation_can_only_stop_a_series_of_statements__The_currently_executing_statement__such_as_a_method_invocation__cannot_be_interrupted__2, MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0); 
+								MessageDialog dialog = new MessageDialog(display.getActiveShell(), ActionMessages.TerminateEvaluationActionTerminate_Evaluation_1, null,
+									ActionMessages.TerminateEvaluationActionAttempts_to_terminate_an_evaluation_can_only_stop_a_series_of_statements__The_currently_executing_statement__such_as_a_method_invocation__cannot_be_interrupted__2, MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0);
 								dialog.setBlockOnOpen(false);
 								dialog.open();
 							}
@@ -73,7 +73,7 @@
 		try {
 			fThread.terminateEvaluation();
 		} catch (DebugException exception) {
-			JDIDebugUIPlugin.statusDialog(exception.getStatus()); 
+			JDIDebugUIPlugin.statusDialog(exception.getStatus());
 		}
 	}
 
@@ -90,7 +90,7 @@
 			}
 		}
 	}
-	
+
 	public void setThread(IJavaThread thread) {
 		fThread= thread;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBooleanPreferenceAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBooleanPreferenceAction.java
index a20486b..fcdfda5 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBooleanPreferenceAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBooleanPreferenceAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,14 +24,14 @@
 	/* (non-Javadoc)
 	 * This method is not actually called - this action is not a filter. Instead
 	 * it sets an preference.
-	 * 
+	 *
 	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
 	 */
 	@Override
 	public boolean select(Viewer viewer, Object parentElement, Object element) {
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.ViewFilterAction#run(org.eclipse.jface.action.IAction)
 	 */
@@ -43,21 +43,21 @@
 			public void run() {
 				// note, this uses the pref key, not the composite key - the prefs are global, not view specific.
 				IPreferenceStore store = getPreferenceStore();
-				store.setValue(getViewKey(), getValue());			
+				store.setValue(getViewKey(), getValue());
 				viewer.refresh();
 			}
 		});
 	}
-	
+
 	/**
 	 * Returns a key to use in the preference store for this option.
 	 * By default the preference key is used, but actions may override.
-	 * 
+	 *
 	 * @return
 	 */
 	protected String getViewKey() {
 		return getPreferenceKey();
 	}
 
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
index 94bad5a..a1fa186 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
@@ -18,6 +18,7 @@
 import java.util.Map;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -91,6 +92,9 @@
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
 import org.eclipse.jface.text.source.IVerticalRulerInfo;
 import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.text.templates.TemplateContextType;
@@ -110,14 +114,15 @@
 import org.eclipse.ui.dialogs.PreferencesUtil;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
 
 /**
  * Toggles a line breakpoint in a Java editor.
- * 
+ *
  * @since 3.0
  */
 public class ToggleBreakpointAdapter implements IToggleBreakpointsTargetExtension2 {
-	
+
 	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
 
 
@@ -165,7 +170,7 @@
     	switch(element.getElementType()) {
 	    	case IJavaElement.FIELD: {
 	    		return ((IField)element).getDeclaringType();
-	    	}	
+	    	}
 	    	case IJavaElement.METHOD: {
 	    		return ((IMethod)element).getDeclaringType();
 	    	}
@@ -177,7 +182,7 @@
 	    	}
     	}
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleLineBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
      */
@@ -185,10 +190,10 @@
 	public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
     	toggleLineBreakpoints(part, selection, false, null);
     }
-    
+
     /**
      * Toggles a line breakpoint.
-     * @param part the currently active workbench part 
+     * @param part the currently active workbench part
      * @param selection the current selection
      * @param bestMatch if we should make a best match or not
      */
@@ -206,7 +211,7 @@
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleLineBreakpoints(IWorkbenchPart,
      *      ISelection)
      */
@@ -220,7 +225,7 @@
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleMethodBreakpoints(org.eclipse.ui.IWorkbenchPart,
      *      org.eclipse.jface.viewers.ISelection)
      */
@@ -246,7 +251,7 @@
 								BreakpointToggleUtils.report(ActionMessages.ToggleBreakpointAdapter_6, part);
 							} else {
 								BreakpointToggleUtils.report(ActionMessages.ToggleBreakpointAdapter_9, part);
-							} 
+							}
                             return Status.OK_STATUS;
                         }
                         IJavaBreakpoint breakpoint = null;
@@ -265,7 +270,7 @@
                                     start = range.getOffset();
                                     end = start + range.getLength();
                                 }
-                                attributes = new HashMap<String, Object>(10);
+                                attributes = new HashMap<>(10);
                                 BreakpointUtils.addJavaBreakpointAttributes(attributes, members[i]);
                                 type = members[i].getDeclaringType();
                                 signature = members[i].getSignature();
@@ -323,7 +328,7 @@
         job.setSystem(true);
         job.schedule();
     }
-    
+
     /**
      * Performs the actual toggling of the line breakpoint
      * @param selection the current selection (from the editor or view)
@@ -386,7 +391,7 @@
 						}
 						return Status.OK_STATUS;
 					}
-					Map<String, Object> attributes = new HashMap<String, Object>(10);
+					Map<String, Object> attributes = new HashMap<>(10);
 					IDocumentProvider documentProvider = editor.getDocumentProvider();
 					if (documentProvider == null) {
 					    return Status.CANCEL_STATUS;
@@ -397,7 +402,7 @@
 						IRegion line = document.getLineInformation(lnumber - 1);
 						charstart = line.getOffset();
 						charend = charstart + line.getLength();
-					} 	
+					}
 					catch (BadLocationException ble) {JDIDebugUIPlugin.log(ble);}
 					BreakpointUtils.addJavaBreakpointAttributes(attributes, type);
 					IJavaLineBreakpoint breakpoint = JDIDebugModel.createLineBreakpoint(resource, tname, lnumber, charstart, charend, 0, true, attributes);
@@ -424,7 +429,7 @@
 					BreakpointToggleUtils.report(ActionMessages.ToggleBreakpointAdapter_3, part);
                 	return Status.OK_STATUS;
                 }
-            } 
+            }
             catch (CoreException ce) {return ce.getStatus();}
 			finally {
 				BreakpointToggleUtils.setUnsetTracepoints(false);
@@ -432,7 +437,7 @@
         }
         return Status.OK_STATUS;
     }
-    
+
     /**
      * Toggles a class load breakpoint
      * @param part the part
@@ -464,7 +469,7 @@
 							deleteBreakpoint(existing, part, monitor);
 							return Status.OK_STATUS;
 						}
-						HashMap<String, Object> map = new HashMap<String, Object>(10);
+						HashMap<String, Object> map = new HashMap<>(10);
 						BreakpointUtils.addJavaBreakpointAttributes(map, type);
 						ISourceRange range= type.getNameRange();
 						int start = -1;
@@ -479,7 +484,7 @@
 						BreakpointToggleUtils.report(ActionMessages.ToggleBreakpointAdapter_0, part);
 						return Status.OK_STATUS;
 					}
-				} 
+				}
                 catch (CoreException e) {
 					return e.getStatus();
 				}
@@ -490,7 +495,7 @@
     	job.setSystem(true);
     	job.schedule();
     }
-    
+
     /**
      * Returns the class load breakpoint for the specified type or null if none found
      * @param type the type to search for a class load breakpoint for
@@ -508,7 +513,7 @@
 		}
 		return null;
     }
-    	
+
     /**
      * Returns the binary name for the {@link IType} derived from its {@link ITypeBinding}.
      * <br><br>
@@ -540,11 +545,11 @@
 			    		}
 					}
 				}
-    		}    		
+    		}
     	}
 		return createQualifiedTypeName(type);
     }
-    
+
     /**
      * Checks if the type or any of its enclosing types are local types.
      * @param type
@@ -571,7 +576,7 @@
     	}
     	return false;
     }
-    
+
     /**
      * Returns the package qualified name, while accounting for the fact that a source file might
      * not have a project
@@ -594,11 +599,11 @@
 			if(packName != null && !packName.equals(EMPTY_STRING)) {
 				tname =  packName+"."+tname; //$NON-NLS-1$
 			}
-    	} 
+    	}
     	catch (JavaModelException e) {}
     	return tname;
     }
-    
+
     /**
      * Prunes out all naming occurrences of anonymous inner types, since these types have no names
      * and cannot be derived visiting an AST (no positive type name matching while visiting ASTs)
@@ -626,7 +631,7 @@
     	}
     	return buffer.toString();
     }
-    
+
     /**
      * gets the <code>IJavaElement</code> from the editor input
      * @param input the current editor input
@@ -641,10 +646,10 @@
     	//try to get from the working copy manager
     	return DebugWorkingCopyManager.getWorkingCopy(input, false);
     }
-    
+
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleMethodBreakpoints(org.eclipse.ui.IWorkbenchPart,
      *      org.eclipse.jface.viewers.ISelection)
      */
@@ -659,11 +664,11 @@
         }
         return (selection instanceof ITextSelection) && isMethod((ITextSelection) selection, part);
     }
-    
-   
+
+
 	/**
 	 * Returns whether the given part/selection is remote (viewing a repository)
-	 * 
+	 *
 	 * @param part
 	 * @param selection
 	 * @return
@@ -682,15 +687,15 @@
     		IEditorInput input = editor.getEditorInput();
     		Object adapter = Platform.getAdapterManager().getAdapter(input, "org.eclipse.team.core.history.IFileRevision"); //$NON-NLS-1$
     		return adapter != null;
-    	} 
+    	}
     	return false;
     }
-    
+
     /**
      * Returns the text editor associated with the given part or <code>null</code>
      * if none. In case of a multi-page editor, this method should be used to retrieve
      * the correct editor to perform the breakpoint operation on.
-     * 
+     *
      * @param part workbench part
      * @return text editor part or <code>null</code>
      */
@@ -710,7 +715,7 @@
         if (selection.isEmpty()) {
             return new IMethod[0];
         }
-        List<IMethod> methods = new ArrayList<IMethod>(selection.size());
+        List<IMethod> methods = new ArrayList<>(selection.size());
         Iterator<?> iterator = selection.iterator();
         while (iterator.hasNext()) {
             Object thing = iterator.next();
@@ -726,12 +731,12 @@
                 		methods.add(method);
                 	}
                 }
-            } 
+            }
             catch (JavaModelException e) {}
         }
         return methods.toArray(new IMethod[methods.size()]);
     }
-    
+
     /**
      * Returns the methods from the selection, or an empty array
      * @param selection the selection to get the methods from
@@ -741,7 +746,7 @@
         if (selection.isEmpty()) {
             return new IMethod[0];
         }
-        List<IMethod> methods = new ArrayList<IMethod>(selection.size());
+        List<IMethod> methods = new ArrayList<>(selection.size());
         Iterator<?> iterator = selection.iterator();
         while (iterator.hasNext()) {
             Object thing = iterator.next();
@@ -752,7 +757,7 @@
                 		methods.add(method);
                 	}
                 }
-            } 
+            }
             catch (JavaModelException e) {}
         }
         return methods.toArray(new IMethod[methods.size()]);
@@ -805,7 +810,7 @@
         if (selection.isEmpty()) {
             return Collections.EMPTY_LIST;
         }
-        List<Object> fields = new ArrayList<Object>(selection.size());
+        List<Object> fields = new ArrayList<>(selection.size());
         Iterator<?> iterator = selection.iterator();
         while (iterator.hasNext()) {
             Object thing = iterator.next();
@@ -850,11 +855,11 @@
 					return type != null && type.isInterface();
 				}
 			}
-		} 
+		}
 		catch (CoreException e1) {}
     	return false;
     }
-    
+
     /**
      * Returns if the text selection is a field selection or not
      * @param selection the text selection
@@ -875,13 +880,13 @@
 	    				element = ((IClassFile) element).getElementAt(selection.getOffset());
 	    			}
 	    			return element != null && element.getElementType() == IJavaElement.FIELD;
-				} 
-    			catch (JavaModelException e) {return false;}		
+				}
+    			catch (JavaModelException e) {return false;}
     		}
     	}
     	return false;
     }
-    
+
 
     /**
      * Determines if the selection is a field or not
@@ -909,10 +914,10 @@
         }
         return false;
     }
-    
+
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleWatchpoints(org.eclipse.ui.IWorkbenchPart,
      *      org.eclipse.jface.viewers.ISelection)
      */
@@ -979,7 +984,7 @@
 	                        	}
 	                        	int start = -1;
 	                            int end = -1;
-	                            attributes = new HashMap<String, Object>(10);
+	                            attributes = new HashMap<>(10);
 	                            if (javaField == null) {
 	                            	resource = ResourcesPlugin.getWorkspace().getRoot();
 	                            } else {
@@ -1010,10 +1015,10 @@
         job.setSystem(true);
         job.schedule();
     }
-    
+
     /**
      * Returns any existing watchpoint for the given field, or <code>null</code> if none.
-     * 
+     *
      * @param typeName fully qualified type name on which watchpoint may exist
      * @param fieldName field name
      * @return any existing watchpoint for the given field, or <code>null</code> if none
@@ -1033,7 +1038,7 @@
         }
         return null;
     }
-    
+
     /**
      * Returns the resolved signature of the given method
      * @param method method to resolve
@@ -1057,12 +1062,12 @@
             return null;
         }
         return Signature.createMethodSignature(resolvedParameterTypes, resolvedReturnType);
-    }    
+    }
 
     /**
      * Returns the resolved type signature for the given signature in the given
      * method, or <code>null</code> if unable to resolve.
-     * 
+     *
      * @param method method containing the type signature
      * @param typeSignature the type signature to resolve
      * @return the resolved type signature
@@ -1098,7 +1103,7 @@
 
         String[] types = resolvedElementTypeNames[0];
         types[1] = types[1].replace('.', '$');
-        
+
         String resolvedElementTypeName = Signature.toQualifiedName(types);
 		String resolvedElementTypeSignature = EMPTY_STRING;
 		if (types[0].equals(EMPTY_STRING)) {
@@ -1128,7 +1133,7 @@
 
     /**
      * Returns a handle to the specified method or <code>null</code> if none.
-     * 
+     *
      * @param editorPart
      *            the editor containing the method
      * @param typeName
@@ -1180,8 +1185,8 @@
                     }
                     if (container == null) {
                         try {
-                            if (method.getDeclaringType().getFullyQualifiedName().equals(methodBreakpoint.getTypeName()) && 
-                            		method.getElementName().equals(methodBreakpoint.getMethodName()) && 
+                            if (method.getDeclaringType().getFullyQualifiedName().equals(methodBreakpoint.getTypeName()) &&
+                            		method.getElementName().equals(methodBreakpoint.getMethodName()) &&
                             		methodBreakpoint.getMethodSignature().equals(resolveMethodSignature(method))) {
                                 return methodBreakpoint;
                             }
@@ -1223,10 +1228,10 @@
         }
         return null;
     }
-    
+
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleWatchpoints(org.eclipse.ui.IWorkbenchPart,
      *      org.eclipse.jface.viewers.ISelection)
      */
@@ -1241,11 +1246,11 @@
         }
         return (selection instanceof ITextSelection) && isField((ITextSelection) selection, part);
     }
-      
+
     /**
      * Returns a selection of the member in the given text selection, or the
      * original selection if none.
-     * 
+     *
      * @param part
      * @param selection
      * @return a structured selection of the member in the given text selection,
@@ -1311,7 +1316,7 @@
     	}
     	return root;
     }
-    
+
     /**
      * Return the associated IField (Java model) for the given
      * IJavaFieldVariable (JDI model)
@@ -1325,7 +1330,7 @@
             return null;
         }
         IField field;
-        IJavaType declaringType = variable.getDeclaringType(); 
+        IJavaType declaringType = variable.getDeclaringType();
         IType type = JavaDebugUtils.resolveType(declaringType);
         if (type != null) {
             field = type.getField(varName);
@@ -1338,7 +1343,7 @@
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension#toggleBreakpoints(org.eclipse.ui.IWorkbenchPart,
      *      org.eclipse.jface.viewers.ISelection)
      */
@@ -1352,9 +1357,37 @@
     			// remove line breakpoint if present first
     	    	if (selection instanceof ITextSelection) {
     				ITextSelection ts = (ITextSelection) selection;
-    				IType declaringType = member.getDeclaringType();
-    				IResource resource = BreakpointUtils.getBreakpointResource(declaringType);
-					IJavaLineBreakpoint breakpoint = JDIDebugModel.lineBreakpointExists(resource, getQualifiedName(declaringType), ts.getStartLine() + 1);
+					IJavaLineBreakpoint breakpoint = null;
+					ITextEditor editor = getTextEditor(part);
+					IAnnotationModel annotationModel = editor.getDocumentProvider().getAnnotationModel(editor.getEditorInput());
+					IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
+					if (annotationModel != null) {
+						Iterator<Annotation> iterator = annotationModel.getAnnotationIterator();
+						while (iterator.hasNext()) {
+							Object object = iterator.next();
+							if (object instanceof SimpleMarkerAnnotation) {
+								SimpleMarkerAnnotation markerAnnotation = (SimpleMarkerAnnotation) object;
+								IMarker marker = markerAnnotation.getMarker();
+								try {
+									if (marker.isSubtypeOf(IBreakpoint.BREAKPOINT_MARKER)) {
+										Position position = annotationModel.getPosition(markerAnnotation);
+										int line = document.getLineOfOffset(position.getOffset());
+										if (line == ts.getStartLine()) {
+											IBreakpoint oldBreakpoint = DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
+											if (oldBreakpoint instanceof IJavaLineBreakpoint) {
+												breakpoint = (IJavaLineBreakpoint) oldBreakpoint;
+												break;
+											}
+										}
+									}
+								}
+								catch (BadLocationException e) {
+									JDIDebugUIPlugin.log(e);
+								}
+							}
+						}
+					}
+
     				if (breakpoint != null) {
 						if (BreakpointToggleUtils.isToggleTracepoints()) {
 							deleteTracepoint(breakpoint, part, null);
@@ -1381,7 +1414,7 @@
         			else if(loc.getLocationType() == ValidBreakpointLocationLocator.LOCATION_LINE) {
         				toggleLineBreakpoints(part, ts, false, loc);
         			}
-    			} 
+    			}
     		}
     		else if(member.getElementType() == IJavaElement.TYPE) {
 				if (BreakpointToggleUtils.isToggleTracepoints()) {
@@ -1400,7 +1433,7 @@
 
 	/**
 	 * Deletes the given breakpoint using the operation history, which allows to undo the deletion.
-	 * 
+	 *
 	 * @param breakpoint the breakpoint to delete
 	 * @param part a workbench part, or <code>null</code> if unknown
 	 * @param progressMonitor the progress monitor
@@ -1480,7 +1513,7 @@
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension#canToggleBreakpoints(org.eclipse.ui.IWorkbenchPart,
      *      org.eclipse.jface.viewers.ISelection)
      */
@@ -1488,7 +1521,7 @@
 	public boolean canToggleBreakpoints(IWorkbenchPart part, ISelection selection) {
     	if (isRemote(part, selection)) {
     		return false;
-    	}    	
+    	}
         return canToggleLineBreakpoints(part, selection);
     }
 
@@ -1543,7 +1576,7 @@
 
 	/**
 	 * Returns the {@link ITypeRoot} for the given {@link IEditorInput}
-	 * 
+	 *
 	 * @param input
 	 * @return the type root or <code>null</code> if one cannot be derived
 	 * @since 3.8
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ValidBreakpointLocationLocator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ValidBreakpointLocationLocator.java
index a445bb9..edf730f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ValidBreakpointLocationLocator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ValidBreakpointLocationLocator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ViewFilterAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ViewFilterAction.java
index dcc857f..c22aadf 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ViewFilterAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ViewFilterAction.java
@@ -27,14 +27,14 @@
 import org.eclipse.ui.IViewPart;
 
 /**
- * 
+ *
  */
 public abstract class ViewFilterAction extends ViewerFilter implements IViewActionDelegate, IActionDelegate2 {
-		
+
 	private IViewPart fView;
 	private IAction fAction;
 	private IPropertyChangeListener fListener = new Updater();
-	
+
 	class Updater implements IPropertyChangeListener {
 
 		/* (non-Javadoc)
@@ -46,9 +46,9 @@
 					event.getProperty().equals(getCompositeKey())) {
 				fAction.setChecked(getPreferenceValue());
 			}
-			
+
 		}
-		
+
 	}
 
 	public ViewFilterAction() {
@@ -125,11 +125,11 @@
 	protected IPreferenceStore getPreferenceStore() {
 		return JDIDebugUIPlugin.getDefault().getPreferenceStore();
 	}
-	
+
 	/**
 	 * Returns the value of this filters preference (on/off) for the given
 	 * view.
-	 * 
+	 *
 	 * @param part
 	 * @return boolean
 	 */
@@ -142,20 +142,20 @@
 		} else {
 			value = store.getBoolean(getPreferenceKey());
 		}
-		return value;		
+		return value;
 	}
-	
+
 	/**
 	 * Returns the key for this action's preference
-	 * 
+	 *
 	 * @return String
 	 */
-	protected abstract String getPreferenceKey(); 
+	protected abstract String getPreferenceKey();
 
 	/**
 	 * Returns the key used by this action to store its preference value/setting.
 	 * Based on a base key (suffix) and part id (prefix).
-	 *  
+	 *
 	 * @return preference store key
 	 */
 	protected String getCompositeKey() {
@@ -163,11 +163,11 @@
 		String viewKey = getView().getSite().getId();
 		return viewKey + "." + baseKey; //$NON-NLS-1$
 	}
-	
+
 	protected IViewPart getView() {
 		return fView;
 	}
-	
+
 	protected StructuredViewer getStructuredViewer() {
 		IDebugView view = getView().getAdapter(IDebugView.class);
 		if (view != null) {
@@ -175,13 +175,13 @@
 			if (viewer instanceof StructuredViewer) {
 				return (StructuredViewer)viewer;
 			}
-		}		
+		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns whether this action is selected/checked.
-	 * 
+	 *
 	 * @return whether this action is selected/checked
 	 */
 	protected boolean getValue() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/WatchAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/WatchAction.java
index be4f001..be7a403 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/WatchAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/WatchAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
  * Create a watch item from a selected variable
  */
 public class WatchAction extends InspectAction {
-		
+
 	@Override
 	public void run() {
 		Object selectedObject= getSelectedObject();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractDetailPane.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractDetailPane.java
index 5a9dcd8..a799295 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractDetailPane.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractDetailPane.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,25 +39,25 @@
 
 /**
  * Common detail pane function.
- * 
+ *
  * @since 3.6
  */
 public abstract class AbstractDetailPane implements IDetailPane3 {
-	
+
 	private String fName;
 	private String fDescription;
 	private String fId;
 	private AbstractJavaBreakpointEditor fEditor;
-	private Set<Integer> fAutoSaveProperties = new HashSet<Integer>();
-	private IWorkbenchPartSite fSite; 
-	
+	private Set<Integer> fAutoSaveProperties = new HashSet<>();
+	private IWorkbenchPartSite fSite;
+
 	// property listeners
-	private ListenerList<IPropertyListener> fListeners = new ListenerList<IPropertyListener>();
+	private ListenerList<IPropertyListener> fListeners = new ListenerList<>();
 	private Composite fEditorParent;
-	
+
 	/**
 	 * Constructs a detail pane.
-	 * 
+	 *
 	 * @param name detail pane name
 	 * @param description detail pane description
 	 * @param id detail pane ID
@@ -90,18 +90,18 @@
 	public ISelectionProvider getSelectionProvider() {
 		return null;
 	}
-	
+
 	/**
 	 * Fires a property change to all listeners.
-	 * 
+	 *
 	 * @param property the property
 	 */
 	protected void firePropertyChange(int property) {
 		for (IPropertyListener listener : fListeners) {
 			listener.propertyChanged(this, property);
-		}	
+		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#init(org.eclipse.ui.IWorkbenchPartSite)
 	 */
@@ -124,7 +124,7 @@
 	public String getDescription() {
 		return fDescription;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#dispose()
 	 */
@@ -135,12 +135,12 @@
 		fListeners.clear();
 		fAutoSaveProperties.clear();
 		fEditorParent.dispose();
-	}	
-	
+	}
+
 	/**
 	 * Adds the given auto save properties to this detail pain. Whenever one of these properties
 	 * changes, the detail pane editor is immediately saved.
-	 * 
+	 *
 	 * @param autosave the auto-save properties
 	 */
 	protected void addAutosaveProperties(int[] autosave) {
@@ -173,15 +173,15 @@
 		});
 		return fEditor.createControl(fEditorParent);
 	}
-	
+
 	/**
 	 * Creates the detail pane specific editor.
-	 * 
+	 *
 	 * @param parent parent composite
 	 * @return editor
 	 */
 	protected abstract AbstractJavaBreakpointEditor createEditor(Composite parent);
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
 	 */
@@ -213,7 +213,7 @@
 	public boolean setFocus() {
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -233,7 +233,7 @@
 			}
 		}
 	}
-	
+
 	private IStatusLineManager getStatusLine() {
 		// we want to show messages globally hence we
 		// have to go through the active part
@@ -247,7 +247,7 @@
 				IViewSite activeViewSite= activeViewPart.getViewSite();
 				return activeViewSite.getActionBars().getStatusLineManager();
 			}
-	
+
 			if (activePart instanceof IEditorPart) {
 				IEditorPart activeEditorPart= (IEditorPart)activePart;
 				IEditorActionBarContributor contributor= activeEditorPart.getEditorSite().getActionBarContributor();
@@ -259,7 +259,7 @@
 			return site.getActionBars().getStatusLineManager();
 		}
 		return null;
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISaveablePart#isDirty()
@@ -271,13 +271,13 @@
 
 	/**
 	 * Returns the editor associated with this detail pane.
-	 * 
+	 *
 	 * @return editor
 	 */
 	protected AbstractJavaBreakpointEditor getEditor() {
 		return fEditor;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IDetailPane#display(org.eclipse.jface.viewers.IStructuredSelection)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractJavaBreakpointEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractJavaBreakpointEditor.java
index 6083171..c5aac32 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractJavaBreakpointEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AbstractJavaBreakpointEditor.java
@@ -21,51 +21,51 @@
 
 /**
  * Common function for Breakpoint editor controls.
- * 
+ *
  * @since 3.6
  */
 public abstract class AbstractJavaBreakpointEditor {
-	
+
 	private ListenerList<IPropertyListener> fListeners = new ListenerList<>();
     private boolean fDirty = false;
     private boolean fMnemonics = true;
     private boolean fSuppressPropertyChanges = false;
-	
+
 	/**
 	 * Adds the given property listener to this editor. Property changes
 	 * are reported on the breakpoint being edited. Property identifiers
 	 * are breakpoint attribute keys.
-	 * 
+	 *
 	 * @param listener listener
 	 */
 	public void addPropertyListener(IPropertyListener listener) {
 		fListeners.add(listener);
 	}
-	
+
 	/**
 	 * Sets whether mnemonics should be displayed in editor controls.
 	 * Only has an effect if set before {@link #createControl(Composite)}
 	 * is called. By default, mnemonics are displayed.
-	 * 
+	 *
 	 * @param mnemonics whether to display mnemonics
 	 */
 	public void setMnemonics(boolean mnemonics) {
 		fMnemonics = mnemonics;
 	}
-	
+
 	/**
 	 * Returns whether mnemonics should be displayed in editor controls.
-	 * 
+	 *
 	 * @return whether mnemonics should be displayed in editor controls
 	 */
 	protected boolean isMnemonics() {
 		return fMnemonics;
 	}
-	
+
 	/**
 	 * Returns text with mnemonics in tact or removed based on {@link #isMnemonics()}.
-	 * 
-	 * @param text string to process 
+	 *
+	 * @param text string to process
 	 * @return text with mnemonics in tact or removed based on {@link #isMnemonics()}
 	 */
 	protected String processMnemonics(String text) {
@@ -74,25 +74,25 @@
 		}
 		return LegacyActionTools.removeMnemonics(text);
 	}
-	
+
 	/**
 	 * Removes the property listener from this editor.
-	 * 
+	 *
 	 * @param listener listener
 	 */
 	public void removePropertyListener(IPropertyListener listener) {
 		fListeners.remove(listener);
 	}
-	
+
 	/**
 	 * Creates the condition editor widgets and returns the top level
 	 * control.
-	 * 
+	 *
 	 * @param parent composite to embed the editor controls in
 	 * @return top level control
 	 */
 	public abstract Control createControl(Composite parent);
-	
+
 	/**
 	 * Disposes this editor and its controls. Once disposed, the editor can no
 	 * longer be used.
@@ -100,52 +100,52 @@
 	protected void dispose() {
 		fListeners.clear();
 	}
-	
+
 	/**
 	 * Gives focus to an appropriate control in the editor.
 	 */
 	public abstract void setFocus();
-	
+
 	/**
 	 * Saves current settings to the breakpoint being edited. Has no
 	 * effect if a breakpoint is not currently being edited or if this
 	 * editor is not dirty.
-	 * 
+	 *
 	 * @exception CoreException if unable to update the breakpoint.
 	 */
 	public abstract void doSave() throws CoreException;
-	
+
 	/**
 	 * Returns a status describing whether the condition editor is in
 	 * a valid state. Returns an OK status when all is good. For example, an error
 	 * status is returned when the conditional expression is empty but enabled.
-	 * 
+	 *
 	 * @return editor status.
 	 */
 	public abstract IStatus getStatus();
-		
+
 	/**
 	 * Returns whether the editor needs saving.
-	 *  
+	 *
 	 * @return whether the editor needs saving
 	 */
 	public boolean isDirty() {
 		return fDirty;
 	}
-	
+
 	/**
 	 * Sets the dirty flag based on the given property change
-	 * 
+	 *
 	 * @param propId the property that changed
 	 */
 	protected void setDirty(int propId) {
 		fDirty = true;
 		firePropertyChange(propId);
 	}
-	
+
 	/**
 	 * Sets the dirty flag and fires a dirty property change if required.
-	 * 
+	 *
 	 * @param dirty whether dirty
 	 */
 	protected void setDirty(boolean dirty) {
@@ -154,10 +154,10 @@
 			firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
 		}
 	}
-	
+
 	/**
 	 * Fires a property change event to all listeners.
-	 * 
+	 *
 	 * @param source
 	 * @param propId
 	 * @param value
@@ -169,29 +169,29 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the breakpoint being displayed or <code>null</code> if none.
-	 * 
+	 *
 	 * @return breakpoint or <code>null</code>
 	 */
 	public abstract Object getInput();
-	
+
 	/**
 	 * Sets the breakpoint to display and edit or <code>null</code> if none.
-	 * 
+	 *
 	 * @param breakpoint breakpoint or <code>null</code>
 	 * @exception CoreException if unable to set the input
 	 */
 	public abstract void setInput(Object breakpoint) throws CoreException;
-	
+
 	/**
 	 * Sets whether to suppress property change notification.
-	 * 
+	 *
 	 * @param suppress whether to suppress notification
 	 */
 	protected void suppressPropertyChanges(boolean suppress) {
 		fSuppressPropertyChanges = suppress;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddClassPrepareBreakpointAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddClassPrepareBreakpointAction.java
index 0132a71..54fea1279 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddClassPrepareBreakpointAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddClassPrepareBreakpointAction.java
@@ -59,7 +59,7 @@
 	        for (int i = 0; i < selection.length; i++) {
 	            final IType type = (IType) selection[i];
 	            final IResource resource = BreakpointUtils.getBreakpointResource(type);
-	            final Map<String, Object> map = new HashMap<String, Object>(10);
+	            final Map<String, Object> map = new HashMap<>(10);
 	            BreakpointUtils.addJavaBreakpointAttributes(map, type);
 	            int kind = IJavaClassPrepareBreakpoint.TYPE_CLASS;
 	            if (!type.isClass()) {
@@ -88,7 +88,7 @@
 	                final int finalKind = kind;
 	                final int finalStart = start;
 	                final int finalEnd = end;
-	                new Job(BreakpointMessages.AddClassPrepareBreakpointAction_2) { 
+	                new Job(BreakpointMessages.AddClassPrepareBreakpointAction_2) {
 	                    @Override
 						protected IStatus run(IProgressMonitor monitor) {
 	                        try {
@@ -98,7 +98,7 @@
 	                            return e.getStatus();
 	                        }
 	                    }
-	
+
 	                }.schedule();
 	            }
 	        }
@@ -106,7 +106,7 @@
 	    	JDIDebugUIPlugin.statusDialog(e.getStatus());
 	    }
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
      */
@@ -115,18 +115,18 @@
         Shell shell = JDIDebugUIPlugin.getActiveWorkbenchShell();
         SelectionDialog dialog = null;
         try {
-        	dialog = JavaUI.createTypeDialog(shell, workbenchWindow, 
-        									 SearchEngine.createWorkspaceScope(), 
-        									 IJavaElementSearchConstants.CONSIDER_CLASSES, 
+        	dialog = JavaUI.createTypeDialog(shell, workbenchWindow,
+        									 SearchEngine.createWorkspaceScope(),
+        									 IJavaElementSearchConstants.CONSIDER_CLASSES,
         									 true, "", null); //$NON-NLS-1$
-            dialog.setTitle(BreakpointMessages.AddClassPrepareBreakpointAction_0); 
-            dialog.setMessage(BreakpointMessages.AddClassPrepareBreakpointAction_1); 
+            dialog.setTitle(BreakpointMessages.AddClassPrepareBreakpointAction_0);
+            dialog.setMessage(BreakpointMessages.AddClassPrepareBreakpointAction_1);
             if (dialog.open() == IDialogConstants.OK_ID) {
                createBreakpoints(dialog.getResult());
             }
         } catch (CoreException e) {JDIDebugUIPlugin.log(e);}
-    } 
-    
+    }
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
      */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionAction.java
index 7e26d7e..dcac528 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionAction.java
@@ -50,11 +50,11 @@
  * The workbench menu action for adding an exception breakpoint
  */
 public class AddExceptionAction implements IViewActionDelegate, IWorkbenchWindowActionDelegate {
-	
+
 	public static final String CAUGHT_CHECKED = "caughtChecked"; //$NON-NLS-1$
 	public static final String UNCAUGHT_CHECKED = "uncaughtChecked"; //$NON-NLS-1$
 	public static final String DIALOG_SETTINGS = "AddExceptionDialog"; //$NON-NLS-1$
-	
+
 	private IWorkbenchWindow fWindow = null;
 
 	/* (non-Javadoc)
@@ -65,9 +65,9 @@
 		try {
 			IDialogSettings settings = getDialogSettings();
 			AddExceptionTypeDialogExtension ext = new AddExceptionTypeDialogExtension(settings.getBoolean(CAUGHT_CHECKED), settings.getBoolean(UNCAUGHT_CHECKED));
-			SelectionDialog dialog = JavaUI.createTypeDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(), 
-						fWindow, 
-						SearchEngine.createWorkspaceScope(), 
+			SelectionDialog dialog = JavaUI.createTypeDialog(JDIDebugUIPlugin.getActiveWorkbenchShell(),
+						fWindow,
+						SearchEngine.createWorkspaceScope(),
 						IJavaElementSearchConstants.CONSIDER_CLASSES, false, "*Exception*", ext); //$NON-NLS-1$
 			dialog.setTitle(BreakpointMessages.AddExceptionAction_0);
 			dialog.setMessage(BreakpointMessages.AddExceptionAction_1);
@@ -76,7 +76,7 @@
 			if(dialog.open() == IDialogConstants.OK_ID) {
 				boolean caught = ext.shouldHandleCaughtExceptions(),
 						uncaught = ext.shouldHandleUncaughtExceptions();
-				Object[] results = dialog.getResult(); 
+				Object[] results = dialog.getResult();
 				if(results != null && results.length > 0) {
 					try {
 						createBreakpoint(caught, uncaught, (IType)results[0]);
@@ -85,18 +85,18 @@
 					}
 					catch (CoreException e) {JDIDebugUIPlugin.statusDialog(e.getStatus());}
 				}
-				
+
 			}
-		} 
+		}
 		catch (JavaModelException e1) {}
 	}
-	
+
 	/**
 	 * Returns the existing dialog settings for the persisted state of the caught and uncaught check boxes.
 	 * If no section exists then a new one is created
-	 * 
+	 *
 	 * @return the dialog settings section for the type dialog extension
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	private IDialogSettings getDialogSettings() {
@@ -109,7 +109,7 @@
         }
         return section;
     }
-	
+
 	/**
 	 * creates a single breakpoint of the specified type
 	 * @param caught if the exception is caught
@@ -120,7 +120,7 @@
 	 */
 	private void createBreakpoint(final boolean caught, final boolean uncaught, final IType type) throws CoreException {
 		final IResource resource = BreakpointUtils.getBreakpointResource(type);
-		final Map<String, Object> map = new HashMap<String, Object>(10);
+		final Map<String, Object> map = new HashMap<>(10);
 		BreakpointUtils.addJavaBreakpointAttributes(map, type);
 		IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(
 						JDIDebugModel.getPluginIdentifier());
@@ -173,7 +173,7 @@
 			job.schedule();
 		}
 	}
-	
+
     /**
      * returns if the exception should be marked as 'checked' or not
      * @param type the type of the exception
@@ -192,12 +192,12 @@
  	                }
  	                curr = hierarchy.getSuperclass(curr);
  	            }
- 	        } 
+ 	        }
  	        catch (JavaModelException e) {JDIDebugUIPlugin.log(e);}
          }
     	return true;
     }
-    
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
 	 */
@@ -209,7 +209,7 @@
 	 */
 	@Override
 	public void selectionChanged(IAction action, ISelection selection) {}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionTypeDialogExtension.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionTypeDialogExtension.java
index 10834ac..a1e43f2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionTypeDialogExtension.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/AddExceptionTypeDialogExtension.java
@@ -29,11 +29,11 @@
 
 /**
  * Provides a type dialog extension for the JDT type selection dialog
- * 
+ *
  * @since 3.4
  */
 public class AddExceptionTypeDialogExtension extends TypeSelectionExtension {
-	
+
 	/**
 	  * widgets
 	  */
@@ -41,7 +41,7 @@
 	 private Button fUncaughtButton;
 	 private boolean fCaught = false;
 	 private boolean fUncaught = false;
-	
+
 	 /**
 	 * Constructor
 	 * @param caught
@@ -51,7 +51,7 @@
 		 fCaught = caught;
 		 fUncaught = uncaught;
 	 }
-	 
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.ui.dialogs.TypeSelectionExtension#createContentArea(org.eclipse.swt.widgets.Composite)
 	 */
@@ -80,7 +80,7 @@
 		((GridData) fUncaughtButton.getLayoutData()).grabExcessHorizontalSpace = true;
 		return comp;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.ui.dialogs.TypeSelectionExtension#getSelectionValidator()
 	 */
@@ -100,7 +100,7 @@
 			                }
 			                curr = hierarchy.getSuperclass(curr);
 			            }
-			        } 
+			        }
 			        catch (JavaModelException e) {
 			        	JDIDebugUIPlugin.log(e);
 			        	return Status.CANCEL_STATUS;
@@ -108,10 +108,10 @@
 				}
 				return new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), BreakpointMessages.AddExceptionDialog_13);
 			}
-			
+
 		};
 	}
-	
+
 	/**
 	 * Returns if the breakpoint should be set to suspend when the associated exception is thrown, but caught
 	 * @return if the breakpoint should be set to suspend when the associated exception is thrown, but caught
@@ -119,11 +119,11 @@
 	public boolean shouldHandleCaughtExceptions() {
 		return fCaught;
 	}
-	
+
 	/**Returns if the breakpoint should be set to suspend when the associated exception is thrown, but not caught
 	 * @return if the breakpoint should be set to suspend when the associated exception is thrown, but not caught
 	 */
 	public boolean shouldHandleUncaughtExceptions() {
 		return fUncaught;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointDetailPaneFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointDetailPaneFactory.java
index 3c38f30..3e630be 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointDetailPaneFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointDetailPaneFactory.java
@@ -27,11 +27,11 @@
 
 /**
  * Detail pane factory for Java breakpoints.
- * 
+ *
  * @since 3.6
  */
 public class BreakpointDetailPaneFactory implements IDetailPaneFactory {
-	
+
 	/**
 	 * Maps pane IDs to names
 	 */
@@ -42,7 +42,7 @@
 	 */
 	@Override
 	public Set<String> getDetailPaneTypes(IStructuredSelection selection) {
-		HashSet<String> set = new HashSet<String>();
+		HashSet<String> set = new HashSet<>();
 		if (selection.size() == 1) {
 			IBreakpoint b = (IBreakpoint) selection.getFirstElement();
 			try {
@@ -126,10 +126,10 @@
 	public String getDetailPaneDescription(String paneID) {
 		return getNameMap().get(paneID);
 	}
-	
+
 	private Map<String, String> getNameMap() {
 		if (fNameMap == null) {
-			fNameMap = new HashMap<String, String>();
+			fNameMap = new HashMap<>();
 			fNameMap.put(LineBreakpointDetailPane.DETAIL_PANE_LINE_BREAKPOINT, BreakpointMessages.BreakpointDetailPaneFactory_0);
 			fNameMap.put(WatchpointDetailPane.DETAIL_PANE_WATCHPOINT, BreakpointMessages.WatchpointDetailPane_0);
 			fNameMap.put(MethodBreakpointDetailPane.DETAIL_PANE_METHOD_BREAKPOINT, BreakpointMessages.BreakpointDetailPaneFactory_1);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointMessages.java
index 52a80eb..fc9c783 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/BreakpointMessages.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *  IBM - Initial API and implementation
  *******************************************************************************/
@@ -26,16 +26,16 @@
 	public static String AddClassPrepareBreakpointAction_0;
 	public static String AddClassPrepareBreakpointAction_1;
 	public static String AddClassPrepareBreakpointAction_2;
-	
+
 	public static String BreakpointConditionDetailPane_0;
 
 	public static String BreakpointDetailPaneFactory_0;
 
 	public static String BreakpointDetailPaneFactory_1;
-	
+
 	public static String ExceptionBreakpointDetailPane_0;
-	
-	public static String JavaBreakpointTypeAdapterFactory_0;	
+
+	public static String JavaBreakpointTypeAdapterFactory_0;
 	public static String StandardBreakpointDetailPane_0;
 
 	public static String WatchpointDetailPane_0;
@@ -44,5 +44,5 @@
 		// load message values from bundle file
 		NLS.initializeMessages(BUNDLE_NAME, BreakpointMessages.class);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/CompositeBreakpointEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/CompositeBreakpointEditor.java
index 6b95b3b..4370195 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/CompositeBreakpointEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/CompositeBreakpointEditor.java
@@ -21,17 +21,17 @@
 
 /**
  * Combines editors.
- * 
+ *
  * @since 3.6
  */
 public class CompositeBreakpointEditor extends AbstractJavaBreakpointEditor {
-	
+
 	private AbstractJavaBreakpointEditor[] fEditors;
-	
+
 	public CompositeBreakpointEditor(AbstractJavaBreakpointEditor[] editors) {
 		fEditors = editors;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#addPropertyListener(org.eclipse.ui.IPropertyListener)
 	 */
@@ -41,7 +41,7 @@
 			fEditors[i].addPropertyListener(listener);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#removePropertyListener(org.eclipse.ui.IPropertyListener)
 	 */
@@ -51,7 +51,7 @@
 			fEditors[i].removePropertyListener(listener);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#dispose()
 	 */
@@ -92,7 +92,7 @@
 			fEditors[i].doSave();
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#isDirty()
 	 */
@@ -137,7 +137,7 @@
 			fEditors[i].setInput(breakpoint);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#setMnemonics(boolean)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointDetailPane.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointDetailPane.java
index 6a3b187..d61be52 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointDetailPane.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointDetailPane.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,11 +15,11 @@
 
 /**
  * Exception breakpoint detail pane.
- * 
+ *
  * @since 3.6
  */
 public class ExceptionBreakpointDetailPane extends AbstractDetailPane {
-	
+
 	/**
 	 * Identifier for this detail pane editor
 	 */
@@ -36,7 +36,7 @@
 				ExceptionBreakpointEditor.PROP_SUBCLASSES
 		});
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointEditor.java
index eb04117..84faa42 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionBreakpointEditor.java
@@ -24,14 +24,14 @@
  * @since 3.6
  */
 public class ExceptionBreakpointEditor extends StandardJavaBreakpointEditor {
-	
+
 	/**
      * Property id's
      */
     public static final int PROP_CAUGHT = 0x1020;
     public static final int PROP_UNCAUGHT = 0x1021;
     public static final int PROP_SUBCLASSES = 0x1022;
-	
+
 	// editors
 	private Button fCaught;
 	private Button fUncaught;
@@ -52,7 +52,7 @@
 		fSubclasses = createSusupendPropertyEditor(composite, processMnemonics(PropertyPageMessages.ExceptionBreakpointEditor_3), PROP_SUBCLASSES);
 		return container;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#setBreakpoint(org.eclipse.jdt.debug.core.IJavaBreakpoint)
 	 */
@@ -73,7 +73,7 @@
 			fSubclasses.setEnabled(false);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#doSave()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionInspector.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionInspector.java
index 47211ac..c87a4b1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionInspector.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ExceptionInspector.java
@@ -49,7 +49,7 @@
  * This class is used to show the inspect pop-up when a thread is suspended due to an exception being thrown
  */
 public class ExceptionInspector implements IDebugContextListener, IPreferenceChangeListener {
-	
+
 	/**
 	 * Constructor
 	 */
@@ -60,8 +60,8 @@
 		}
 		boolean doit = Platform.getPreferencesService().getBoolean(
 JDIDebugUIPlugin.getUniqueIdentifier(),
-				IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION, 
-				false, 
+				IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION,
+				false,
 				null);
 		if (doit) {
 			DebugUITools.getDebugContextManager().addDebugContextListener(this);
@@ -78,7 +78,7 @@
 			if (part != null) {
 				IWorkbenchPartSite site = part.getSite();
 				if (site != null && IDebugUIConstants.ID_DEBUG_VIEW.equals(site.getId())) {
-					IWorkbenchPage page = site.getWorkbenchWindow().getActivePage(); 
+					IWorkbenchPage page = site.getWorkbenchWindow().getActivePage();
 					if (page != null && page.isPartVisible(part)) {
 						ISelection selection = event.getContext();
 						if (selection instanceof IStructuredSelection) {
@@ -108,7 +108,7 @@
 														}
 													}
 												}
-											} 
+											}
 										} catch (DebugException e) {}
 									}
 								}
@@ -129,8 +129,8 @@
 			IDebugContextManager manager = DebugUITools.getDebugContextManager();
 			boolean doit = Platform.getPreferencesService().getBoolean(
 JDIDebugUIPlugin.getUniqueIdentifier(),
-					IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION, 
-					false, 
+					IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION,
+					false,
 					null);
 			if (doit) {
 				manager.addDebugContextListener(this);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/JavaBreakpointTypeAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/JavaBreakpointTypeAdapterFactory.java
index c4e6792..88ba545 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/JavaBreakpointTypeAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/JavaBreakpointTypeAdapterFactory.java
@@ -34,11 +34,11 @@
  * Factory for Java breakpoint types
  */
 public class JavaBreakpointTypeAdapterFactory implements IAdapterFactory {
-    
-    private Map<String, Object> fStratumTypes = new HashMap<String, Object>();
-    
+
+    private Map<String, Object> fStratumTypes = new HashMap<>();
+
     // map of breakpoint type names to breakpoint type categories
-    private Map<String, IBreakpointTypeCategory> fOtherTypes = new HashMap<String, IBreakpointTypeCategory>();
+    private Map<String, IBreakpointTypeCategory> fOtherTypes = new HashMap<>();
 
     /* (non-Javadoc)
      * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
@@ -67,7 +67,7 @@
                     if (stratum != null) {
                         Object type = fStratumTypes.get(stratum);
                         if (type == null) {
-                            String label = NLS.bind(BreakpointMessages.JavaBreakpointTypeAdapterFactory_0, new String[]{stratum}); 
+                            String label = NLS.bind(BreakpointMessages.JavaBreakpointTypeAdapterFactory_0, new String[]{stratum});
                             if (stratum.equalsIgnoreCase("jsp")) { //$NON-NLS-1$
                             	type = new BreakpointTypeCategory(label, getImageDescriptor(JavaDebugImages.IMG_OBJS_JSP_BRKPT_TYPE));
                             } else {
@@ -78,7 +78,7 @@
 						return (T) type;
                     }
                 } catch (CoreException e) {
-                }                
+                }
             }
             if (adaptableObject instanceof IBreakpoint) {
             	IBreakpoint breakpoint = (IBreakpoint)adaptableObject;
@@ -113,7 +113,7 @@
 	public Class<?>[] getAdapterList() {
         return new Class[]{IBreakpointTypeCategory.class};
     }
-	
+
 	private ImageDescriptor getImageDescriptor(String key) {
 		return JavaDebugImages.getImageDescriptor(key);
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/LineBreakpointDetailPane.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/LineBreakpointDetailPane.java
index 38e07f2..250079d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/LineBreakpointDetailPane.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/LineBreakpointDetailPane.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,21 +20,21 @@
  * @since 3.6
  */
 public class LineBreakpointDetailPane extends AbstractDetailPane {
-	
+
 	/**
 	 * Identifier for this detail pane editor
 	 */
 	public static final String DETAIL_PANE_LINE_BREAKPOINT = JDIDebugUIPlugin.getUniqueIdentifier() + ".DETAIL_PANE_LINE_BREAKPOINT"; //$NON-NLS-1$
-	
+
 	public LineBreakpointDetailPane() {
-		super(BreakpointMessages.BreakpointConditionDetailPane_0, BreakpointMessages.BreakpointConditionDetailPane_0, DETAIL_PANE_LINE_BREAKPOINT); 
+		super(BreakpointMessages.BreakpointConditionDetailPane_0, BreakpointMessages.BreakpointConditionDetailPane_0, DETAIL_PANE_LINE_BREAKPOINT);
 		addAutosaveProperties(new int[]{
 				JavaBreakpointConditionEditor.PROP_CONDITION_ENABLED,
 				JavaBreakpointConditionEditor.PROP_CONDITION_SUSPEND_POLICY,
 				StandardJavaBreakpointEditor.PROP_HIT_COUNT_ENABLED,
 				StandardJavaBreakpointEditor.PROP_SUSPEND_POLICY, StandardJavaBreakpointEditor.PROP_TRIGGER_POINT });
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointDetailPane.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointDetailPane.java
index d354d42..61e27ae 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointDetailPane.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointDetailPane.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,11 +16,11 @@
 
 /**
  * Watchpoint detail pane. Suspend on access or modification.
- * 
+ *
  * @since 3.6
  */
 public class MethodBreakpointDetailPane extends AbstractDetailPane {
-	
+
 	/**
 	 * Identifier for this detail pane editor
 	 */
@@ -38,13 +38,13 @@
 				JavaBreakpointConditionEditor.PROP_CONDITION_SUSPEND_POLICY
 		});
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
 	 */
 	@Override
 	protected AbstractJavaBreakpointEditor createEditor(Composite parent) {
-		return new CompositeBreakpointEditor(new AbstractJavaBreakpointEditor[] 
+		return new CompositeBreakpointEditor(new AbstractJavaBreakpointEditor[]
 			{new MethodBreakpointEditor(), new JavaBreakpointConditionEditor(null)});
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointEditor.java
index 293c495..6ec52c5 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/MethodBreakpointEditor.java
@@ -21,18 +21,18 @@
 
 /**
  * Editor for method entry/exit breakpoint.
- * 
+ *
  * @since 3.6
  */
 public class MethodBreakpointEditor extends StandardJavaBreakpointEditor {
-	
+
 	// Method entry/exit editors
 	private Button fEntry;
 	private Button fExit;
 
 	public static final int PROP_ENTRY = 0x1012;
 	public static final int PROP_EXIT = 0x1013;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#createControl(org.eclipse.swt.widgets.Composite)
 	 */
@@ -43,10 +43,10 @@
 		super.createControl(composite);
 		Composite watchComp = SWTFactory.createComposite(composite, parent.getFont(), 3, 1, 0, 0, 0);
 		fEntry = createSusupendPropertyEditor(watchComp, processMnemonics(PropertyPageMessages.JavaLineBreakpointPage_10), PROP_ENTRY);
-		fExit = createSusupendPropertyEditor(watchComp, processMnemonics(PropertyPageMessages.JavaLineBreakpointPage_11), PROP_EXIT); 
+		fExit = createSusupendPropertyEditor(watchComp, processMnemonics(PropertyPageMessages.JavaLineBreakpointPage_11), PROP_EXIT);
 		return composite;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#setBreakpoint(org.eclipse.jdt.debug.core.IJavaBreakpoint)
 	 */
@@ -66,7 +66,7 @@
 			fExit.setSelection(false);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#doSave()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardBreakpointDetailPane.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardBreakpointDetailPane.java
index 506f443..0274459 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardBreakpointDetailPane.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardBreakpointDetailPane.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,11 +15,11 @@
 
 /**
  * Suspend policy and hit count detail pane.
- * 
+ *
  * @since 3.6
  */
 public class StandardBreakpointDetailPane extends AbstractDetailPane {
-	
+
 	/**
 	 * Identifier for this detail pane editor
 	 */
@@ -31,7 +31,7 @@
 				StandardJavaBreakpointEditor.PROP_HIT_COUNT_ENABLED,
 				StandardJavaBreakpointEditor.PROP_SUSPEND_POLICY, StandardJavaBreakpointEditor.PROP_TRIGGER_POINT, });
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardJavaBreakpointEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardJavaBreakpointEditor.java
index b1a9e39..f5e5bf8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardJavaBreakpointEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/StandardJavaBreakpointEditor.java
@@ -35,24 +35,24 @@
  * @since 3.6
  */
 public class StandardJavaBreakpointEditor extends AbstractJavaBreakpointEditor {
-	
+
 	private IJavaBreakpoint fBreakpoint;
 	private Button fHitCountButton;
 	private Text fHitCountText;
 	private Button fSuspendThread;
 	private Button fSuspendVM;
 	protected Button fTriggerPointButton;
-	
+
 	/**
      * Property id for hit count enabled state.
      */
     public static final int PROP_HIT_COUNT_ENABLED = 0x1005;
-    
+
 	/**
      * Property id for breakpoint hit count.
      */
-    public static final int PROP_HIT_COUNT = 0x1006;  
-    
+    public static final int PROP_HIT_COUNT = 0x1006;
+
 	/**
      * Property id for suspend policy.
      */
@@ -75,10 +75,10 @@
 	protected Button createCheckButton(Composite parent, String text) {
 		return SWTFactory.createCheckButton(parent, text, null, false, 1);
 	}
-	
+
 	/**
 	 * Creates the button to toggle Triggering point property of the breakpoint
-	 * 
+	 *
 	 * @param parent
 	 *            the parent composite
 	 */
@@ -132,7 +132,7 @@
 			public void widgetSelected(SelectionEvent e) {
 				setDirty(PROP_SUSPEND_POLICY);
 			}
-		});	
+		});
 		fSuspendVM.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -147,7 +147,7 @@
 		});
 		return composite;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#setInput(java.lang.Object)
 	 */
@@ -164,7 +164,7 @@
 			suppressPropertyChanges(false);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#getInput()
 	 */
@@ -172,10 +172,10 @@
 	public Object getInput() {
 		return fBreakpoint;
 	}
-	
+
 	/**
 	 * Sets the breakpoint to edit. The same editor can be used iteratively for different breakpoints.
-	 * 
+	 *
 	 * @param breakpoint the breakpoint to edit or <code>null</code> if none
 	 * @exception CoreException if unable to access breakpoint attributes
 	 */
@@ -206,13 +206,13 @@
 		fTriggerPointButton.setSelection(isTriggerPoint());
 		setDirty(false);
 	}
-	
+
 	/**
 	 * Returns the current breakpoint being edited or <code>null</code> if none.
-	 * 
+	 *
 	 * @return breakpoint or <code>null</code>
 	 */
-	protected IJavaBreakpoint getBreakpoint() { 
+	protected IJavaBreakpoint getBreakpoint() {
 		return fBreakpoint;
 	}
 
@@ -239,7 +239,7 @@
 			if (fHitCountButton.getSelection()) {
 				try {
 					hitCount = Integer.parseInt(fHitCountText.getText());
-				} 
+				}
 				catch (NumberFormatException e) {
 					throw new CoreException(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, PropertyPageMessages.JavaBreakpointPage_0, e));
 				}
@@ -273,7 +273,7 @@
 
 	/**
 	 * Creates and returns a check box button with the given text.
-	 * 
+	 *
 	 * @param parent parent composite
 	 * @param text label
 	 * @param propId property id to fire on modification
@@ -310,7 +310,7 @@
 
 	/**
 	 * Stores the value of the trigger point state in the breakpoint manager.
-	 * 
+	 *
 	 * @param breakpoint
 	 *            the breakpoint to be compared with trigger point in the workspace
 	 * @throws CoreException
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnCompilationErrorListener.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnCompilationErrorListener.java
index 264c105..2454eeb 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnCompilationErrorListener.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnCompilationErrorListener.java
@@ -28,11 +28,11 @@
  * Breakpoint listener extension for the "suspend on compilation error" exception breakpoint.
  * Changed to a breakpoint specific listener in 3.5 when breakpoint specific listeners were
  * introduced.
- * 
+ *
  * @since 3.5
  */
 public class SuspendOnCompilationErrorListener implements IJavaBreakpointListener {
-	
+
 	public static final String ID_COMPILATION_ERROR_LISTENER = JDIDebugUIPlugin.getUniqueIdentifier() + ".compilationErrorListener"; //$NON-NLS-1$
 
 	/* (non-Javadoc)
@@ -77,7 +77,7 @@
 		        return DONT_SUSPEND;
 		    }
 		}
-		return DONT_SUSPEND;		
+		return DONT_SUSPEND;
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnUncaughtExceptionListener.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnUncaughtExceptionListener.java
index 95c3b5e..a32913d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnUncaughtExceptionListener.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/SuspendOnUncaughtExceptionListener.java
@@ -26,11 +26,11 @@
  * Breakpoint listener extension for the "suspend on uncaught exceptions" exception breakpoint.
  * Changed to a breakpoint specific listener in 3.5 when breakpoint specific listeners were
  * introduced.
- * 
+ *
  * @since 3.5
  */
 public class SuspendOnUncaughtExceptionListener implements IJavaBreakpointListener {
-	
+
 	public static final String ID_UNCAUGHT_EXCEPTION_LISTENER = JDIDebugUIPlugin.getUniqueIdentifier() + ".uncaughtExceptionListener"; //$NON-NLS-1$
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ToggleClassPrepareBreakpointAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ToggleClassPrepareBreakpointAction.java
index 64f6237..8cb708f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ToggleClassPrepareBreakpointAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/ToggleClassPrepareBreakpointAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,13 +32,13 @@
 
 /**
  * Toggles a class prepare breakpoint for a selected type
- * 
+ *
  * @since 3.0
  */
 public class ToggleClassPrepareBreakpointAction implements IObjectActionDelegate,	IActionDelegate2 {
-	
+
 	private ISelection fSelection;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
 	 */
@@ -85,15 +85,15 @@
 					}
 				}
 				if (existing != null) {
-					existing.delete(); 
+					existing.delete();
 				} else {
 					int kind = IJavaClassPrepareBreakpoint.TYPE_CLASS;
 					if (!type.isClass()) {
 						kind = IJavaClassPrepareBreakpoint.TYPE_INTERFACE;
 					}
-					HashMap<String, Object> map = new HashMap<String, Object>(10);
+					HashMap<String, Object> map = new HashMap<>(10);
 					BreakpointUtils.addJavaBreakpointAttributes(map, type);
-					
+
 					ISourceRange range= type.getNameRange();
 					int start= -1;
 					int end= -1;
@@ -104,7 +104,7 @@
 					JDIDebugModel.createClassPrepareBreakpoint(BreakpointUtils.getBreakpointResource(type), type.getFullyQualifiedName(), kind, start, end, true, map);
 				}
 			} catch (CoreException e) {
-				
+
 			}
 		}
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointDetailPane.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointDetailPane.java
index 12e1713..9c2c8fb 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointDetailPane.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointDetailPane.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,11 +16,11 @@
 
 /**
  * Watchpoint detail pane. Suspend on access or modification.
- * 
+ *
  * @since 3.6
  */
 public class WatchpointDetailPane extends AbstractDetailPane {
-	
+
 	/**
 	 * Identifier for this detail pane editor
 	 */
@@ -37,7 +37,7 @@
 				JavaBreakpointConditionEditor.PROP_CONDITION_SUSPEND_POLICY
 		});
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointEditor.java
index e36bdb8..0d1398c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/breakpoints/WatchpointEditor.java
@@ -23,13 +23,13 @@
  * @since 3.6
  */
 public class WatchpointEditor extends StandardJavaBreakpointEditor {
-	
+
 	/**
      * Property id for access/modification suspend.
      */
     public static final int PROP_ACCESS = 0x1010;
     public static final int PROP_MODIFICATION = 0x1011;
-	
+
 	// Watchpoint editors
 	private Button fAccess;
 	private Button fModification;
@@ -47,7 +47,7 @@
 		fModification = createSusupendPropertyEditor(watchComp, processMnemonics(PropertyPageMessages.JavaLineBreakpointPage_8), PROP_MODIFICATION);
 		return container;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#setBreakpoint(org.eclipse.jdt.debug.core.IJavaBreakpoint)
 	 */
@@ -67,7 +67,7 @@
 			fModification.setSelection(false);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.StandardJavaBreakpointEditor#doSave()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/AbstractClasspathEntry.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/AbstractClasspathEntry.java
index c7d2593..263b706 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/AbstractClasspathEntry.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/AbstractClasspathEntry.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 
 public abstract class AbstractClasspathEntry implements IClasspathEntry {
 
-	protected List<IClasspathEntry> childEntries = new ArrayList<IClasspathEntry>();
+	protected List<IClasspathEntry> childEntries = new ArrayList<>();
 	protected IClasspathEntry parent = null;
 
 	/* (non-Javadoc)
@@ -57,7 +57,7 @@
 	public IClasspathEntry getParent() {
 		return parent;
 	}
-	
+
 	/**
 	 * @param parent
 	 *            the parent to set
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/BootpathFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/BootpathFilter.java
index a843c87..2a05d98 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/BootpathFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/BootpathFilter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,16 +15,16 @@
 
 /**
  * Filters the boothpath entry in a classpath model.
- * 
- * @since 3.0 
+ *
+ * @since 3.0
  */
 public class BootpathFilter extends ViewerFilter {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
 	 */
 	@Override
-	public boolean select(Viewer viewer, Object parentElement, Object element) { 
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
 		if (element instanceof ClasspathGroup) {
 			ClasspathModel model = (ClasspathModel) parentElement;
 			return !model.getBootstrapEntry().equals(element);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathContentProvider.java
index 9d2f899..8aff086 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathContentProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,11 +32,11 @@
 	private boolean refreshEnabled= false;
 	private boolean refreshRequested= false;
 	private JavaClasspathTab fTab;
-	
+
 	public ClasspathContentProvider(JavaClasspathTab tab) {
 		fTab = tab;
 	}
-		
+
 	public void add(IClasspathEntry parent, IRuntimeClasspathEntry child, Object beforeElement) {
 		Object newEntry= null;
 		if (parent == null || parent == model) {
@@ -45,7 +45,7 @@
 		} else if (parent instanceof ClasspathGroup) {
 			newEntry= model.createEntry(child, parent);
 			((ClasspathGroup)parent).addEntry((ClasspathEntry)newEntry, beforeElement);
-		} 
+		}
 		if (newEntry != null) {
 			treeViewer.add(parent, newEntry);
 			treeViewer.setExpandedState(parent, true);
@@ -53,7 +53,7 @@
 			refresh();
 		}
 	}
-	
+
 	public void add(int entryType, IRuntimeClasspathEntry child) {
 		Object newEntry= model.addEntry(entryType, child);
 		if (newEntry != null) {
@@ -66,7 +66,7 @@
 		model.removeAll();
 		refresh();
 	}
-	
+
 	private void refresh() {
 		if (refreshEnabled) {
 			treeViewer.refresh();
@@ -75,7 +75,7 @@
 			refreshRequested= true;
 		}
 	}
-	
+
 	public void removeAll(IClasspathEntry parent) {
 		if (parent instanceof ClasspathGroup) {
 			((ClasspathGroup)parent).removeAll();
@@ -94,7 +94,7 @@
 		if (element instanceof ClasspathGroup) {
 			return model;
 		}
-		
+
 		return null;
 	}
 
@@ -108,9 +108,9 @@
 		}
 		if (element instanceof ClasspathGroup) {
 			return ((ClasspathGroup)element).hasEntries();
-			
-		} 
-		
+
+		}
+
 		if (element instanceof ClasspathModel) {
 			return ((ClasspathModel) element).hasEntries();
 		}
@@ -125,7 +125,7 @@
 		return getChildren(inputElement);
 	}
 
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
 	 */
@@ -140,7 +140,7 @@
 	@Override
 	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		treeViewer = (TreeViewer) viewer;
-		
+
 		if (newInput != null) {
 			model= (ClasspathModel)newInput;
 		} else {
@@ -166,7 +166,7 @@
 			return ((ClasspathEntry)parentElement).getChildren(fTab.getLaunchConfiguration());
 		}
 		if (parentElement == null) {
-			List<Object> all= new ArrayList<Object>();
+			List<Object> all= new ArrayList<>();
 			Object[] topEntries= model.getEntries();
 			for (int i = 0; i < topEntries.length; i++) {
 				Object object = topEntries[i];
@@ -178,7 +178,7 @@
 			}
 			return all.toArray();
 		}
-		
+
 		return null;
 	}
 
@@ -188,7 +188,7 @@
 		treeViewer.remove(array);
 		refresh();
 	}
-	
+
 	public IClasspathEntry[] getUserClasspathEntries() {
 		return model.getEntries(ClasspathModel.USER);
 	}
@@ -196,7 +196,7 @@
 	public IClasspathEntry[] getBootstrapClasspathEntries() {
 		return model.getEntries(ClasspathModel.BOOTSTRAP);
 	}
-	
+
 	public void handleMove(boolean direction, IClasspathEntry entry) {
 		IClasspathEntry parent = (IClasspathEntry)getParent(entry);
 		parent.moveChild(direction, entry);
@@ -227,7 +227,7 @@
 					model.addEntry(ClasspathModel.BOOTSTRAP, entry);
 					break;
 			}
-		}	
+		}
 		refresh();
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java
index 4f0a747..33d2430 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java
@@ -4,10 +4,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 
@@ -25,7 +25,7 @@
 public class ClasspathEntry extends AbstractClasspathEntry implements IRuntimeClasspathEntry, IAdaptable {
 
 	private IRuntimeClasspathEntry entry= null;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getJavaProject()
 	 */
@@ -37,7 +37,7 @@
 		this.parent= parent;
 		this.entry= entry;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
@@ -52,7 +52,7 @@
 			return entry.equals(obj);
 		}
 		return false;
-		
+
 	}
 
 	/* (non-Javadoc)
@@ -84,7 +84,7 @@
 	 */
 	@Override
 	public String getMemento() throws CoreException {
-		return entry.getMemento(); 
+		return entry.getMemento();
 	}
 
 	/* (non-Javadoc)
@@ -165,7 +165,7 @@
 	@Override
 	public void setClasspathProperty(int location) {
 		entry.setClasspathProperty(location);
-		
+
 	}
 
 	/* (non-Javadoc)
@@ -207,17 +207,17 @@
 	public org.eclipse.jdt.core.IClasspathEntry getClasspathEntry() {
 		return entry.getClasspathEntry();
 	}
-	
+
 	public IRuntimeClasspathEntry getDelegate() {
 		return entry;
 	}
-	
+
 	public boolean hasChildren() {
 		IRuntimeClasspathEntry rpe = getDelegate();
 		return rpe instanceof IRuntimeClasspathEntry2 &&
 		 ((IRuntimeClasspathEntry2)rpe).isComposite();
 	}
-	
+
 	public IClasspathEntry[] getChildren(ILaunchConfiguration configuration) {
 		IRuntimeClasspathEntry rpe = getDelegate();
 		if (rpe instanceof IRuntimeClasspathEntry2) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntryAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntryAdapterFactory.java
index a0dd645..8c46cee 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntryAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntryAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathGroup.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathGroup.java
index 007375b..3f713b6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathGroup.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathGroup.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,15 +15,15 @@
 
 public class ClasspathGroup extends AbstractClasspathEntry {
 	private String name;
-	
+
 	private boolean canBeRemoved= true;
-	
+
 	public ClasspathGroup(String name, IClasspathEntry parent, boolean canBeRemoved) {
 		this.parent= parent;
 		this.name= name;
 		this.canBeRemoved= canBeRemoved;
 	}
-		
+
 	public void addEntry(IClasspathEntry entry, Object beforeEntry) {
 		if (!childEntries.contains(entry)) {
 			int index = -1;
@@ -37,15 +37,15 @@
 			}
 		}
 	}
-	
+
 	public void removeEntry(IClasspathEntry entry) {
 		childEntries.remove(entry);
 	}
-	
+
 	public boolean contains(IClasspathEntry entry) {
 		return childEntries.contains(entry);
 	}
-	
+
 	@Override
 	public String toString() {
 		return name;
@@ -61,7 +61,7 @@
 		}
 		childEntries.clear();
 	}
-	
+
 	public boolean canBeRemoved() {
 		return canBeRemoved;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathLabelProvider.java
index 9dd9cfd..ed39a5a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
  * Label provider for classpath elements
  */
 public class ClasspathLabelProvider implements ILabelProvider {
-	
+
 	private RuntimeClasspathEntryLabelProvider runtimeClasspathLabelProvider= new RuntimeClasspathEntryLabelProvider();
 
 	/* (non-Javadoc)
@@ -33,7 +33,7 @@
 			ClasspathEntry entry = (ClasspathEntry) element;
 			return runtimeClasspathLabelProvider.getImage(entry);
 		}
-		
+
 		return JavaClasspathTab.getClasspathImage();
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathModel.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathModel.java
index fbfc61e..563beb1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathModel.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathModel.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,13 +16,13 @@
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
 
 public class ClasspathModel extends AbstractClasspathEntry {
-	
+
 	public static final int BOOTSTRAP= 0;
 	public static final int USER= 1;
-	
+
 	private ClasspathGroup bootstrapEntries;
 	private ClasspathGroup userEntries;
-	
+
 	public Object addEntry(Object entry) {
 		if (entry instanceof ClasspathGroup) {
 			if (!childEntries.contains(entry)) {
@@ -46,7 +46,7 @@
 		childEntries.add(newEntry);
 		return newEntry;
 	}
-	
+
 	public Object addEntry(int entryType, IRuntimeClasspathEntry entry) {
 		IClasspathEntry entryParent= null;
 		switch (entryType) {
@@ -59,7 +59,7 @@
 			default :
 				break;
 		}
-			
+
 		ClasspathEntry newEntry= createEntry(entry, entryParent);
 		Iterator<IClasspathEntry> entries= childEntries.iterator();
 		while (entries.hasNext()) {
@@ -77,13 +77,13 @@
 		} else {
 			childEntries.add(newEntry);
 		}
-		return newEntry;		
+		return newEntry;
 	}
-	
+
 	/**
 	 * Returns the entries of the given type, or an empty
 	 * collection if none.
-	 * 
+	 *
 	 * @param entryType the kind of the entries to get
 	 * @return the entries of the given type, or an empty
 	 * collection if none
@@ -103,7 +103,7 @@
 		}
 		return new IClasspathEntry[0];
 	}
-	
+
 	public IRuntimeClasspathEntry[] getAllEntries() {
 		IClasspathEntry[] boot = getEntries(BOOTSTRAP);
 		IClasspathEntry[] user = getEntries(USER);
@@ -116,32 +116,32 @@
 		}
 		return all;
 	}
-	
+
 	public void remove(Object entry) {
 		childEntries.remove(entry);
 	}
-	
+
 	public ClasspathEntry createEntry(IRuntimeClasspathEntry entry, IClasspathEntry entryParent) {
 		if (entry instanceof ClasspathEntry) {
 			entry = ((ClasspathEntry)entry).getDelegate();
 		}
 		if (entryParent == null) {
 			entryParent= this;
-		} 
+		}
 		return new ClasspathEntry(entry, entryParent);
 	}
 
 	public void removeAll() {
 		if (bootstrapEntries != null) {
 			bootstrapEntries.removeAll();
-		} 
+		}
 		if (userEntries != null) {
 			userEntries.removeAll();
 		}
 	}
-	
+
 	public void removeAll(Object[] entries) {
-		
+
 		for (int i = 0; i < entries.length; i++) {
 			Object object = entries[i];
 			if (object instanceof ClasspathEntry) {
@@ -156,11 +156,11 @@
 			}
 		}
 	}
-	
+
 	public void setBootstrapEntries(IRuntimeClasspathEntry[] entries) {
 		if (bootstrapEntries == null) {
 			getBootstrapEntry();
-		} 
+		}
 		bootstrapEntries.removeAll();
 		for (int i = 0; i < entries.length; i++) {
 			bootstrapEntries.addEntry(new ClasspathEntry(entries[i], bootstrapEntries), null);
@@ -168,13 +168,13 @@
 	}
 
 	private ClasspathGroup createGroupEntry(IRuntimeClasspathEntry[] entries, ClasspathGroup entryParent, String name, boolean canBeRemoved, boolean addEntry) {
-		
+
 		ClasspathGroup group= new ClasspathGroup(name, entryParent, canBeRemoved);
-		
+
 		for (int i = 0; i < entries.length; i++) {
 			group.addEntry(new ClasspathEntry(entries[i], group), null);
 		}
-		
+
 		if (addEntry) {
 			addEntry(group);
 		}
@@ -184,7 +184,7 @@
 	public void setUserEntries(IRuntimeClasspathEntry[] entries) {
 		if (userEntries == null) {
 			getUserEntry();
-		} 
+		}
 		userEntries.removeAll();
 		for (int i = 0; i < entries.length; i++) {
 			userEntries.addEntry(new ClasspathEntry(entries[i], userEntries), null);
@@ -193,22 +193,22 @@
 
 	public IClasspathEntry getBootstrapEntry() {
 		if (bootstrapEntries == null) {
-			String name= ClasspathMessages.ClasspathModel_0; 
+			String name= ClasspathMessages.ClasspathModel_0;
 			bootstrapEntries= createGroupEntry(new IRuntimeClasspathEntry[0], null, name, false, true);
 		}
 		return bootstrapEntries;
 	}
-	
+
 	public IClasspathEntry getUserEntry() {
 		if (userEntries == null) {
-			String name= ClasspathMessages.ClasspathModel_1; 
+			String name= ClasspathMessages.ClasspathModel_1;
 			userEntries= createGroupEntry(new IRuntimeClasspathEntry[0], null, name, false, true);
 		}
 		return userEntries;
 	}
-	
+
 	/**
-	 * Constructs a new classpath model with root entries 
+	 * Constructs a new classpath model with root entries
 	 */
 	public ClasspathModel() {
 		super();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryDialog.java
index e8480aa..52c30c2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,11 +36,11 @@
 
 /**
  * Edits project default classpath.
- * 
+ *
  * @since 3.2
  */
 public class DefaultClasspathEntryDialog extends MessageDialog {
-	
+
 	private DefaultProjectClasspathEntry fEntry;
 	private Button fButton;
 
@@ -55,9 +55,9 @@
 	protected Control createCustomArea(Composite parent) {
 		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
 		boolean wslocked = Platform.getPreferencesService().getBoolean(
-				LaunchingPlugin.ID_PLUGIN, 
-				JavaRuntime.PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES, 
-				false, 
+				LaunchingPlugin.ID_PLUGIN,
+				JavaRuntime.PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES,
+				false,
 				null);
 		if(wslocked) {
 			Link link = new Link(comp, SWT.NONE);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryEditor.java
index e7e4aa1..5a6106e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DefaultClasspathEntryEditor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEditor.java
index 2184309..b819a5f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEditor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,25 +17,25 @@
 
 /**
  * Edits classpath entries.
- * 
+ *
  * @since 3.2
  *
  */
 public interface IClasspathEditor {
-	
+
 	/**
 	 * Returns whether the given classpath entry can be edited.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @param entries runtime classpath entry
 	 * @return whether the entries can be edited
 	 */
 	public boolean canEdit(ILaunchConfiguration configuration, IRuntimeClasspathEntry[] entries);
-	
+
 	/**
 	 * Returns replacement entries for the given entries, after editing them,
 	 * or <code>null</code> if the edit was cancelled.
-	 * 
+	 *
 	 * @param shell shell on which to open dialogs
 	 * @param configuration launch configuration
 	 * @param entries runtime classpath entries
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEntry.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEntry.java
index 751dec9..4d7ef4f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEntry.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/IClasspathEntry.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,28 +13,28 @@
 
 
 public interface IClasspathEntry {
-	
+
 	/**
 	 * Returns the classpath entries that are the children of this classpath entry
-	 * 
+	 *
 	 * @return the child classpath entries of this entry
 	 */
 	public IClasspathEntry[] getEntries();
-	
+
 	/**
 	 * Returns whether this classpath entries has child entries.
-	 * 
+	 *
 	 * @return whether <code>true</code> if this classpath entry has childern, <code>false</code> otherwise.
 	 */
 	public boolean hasEntries();
-	
+
 	/**
 	 * Returns the parent of this classpath entry
-	 * 
+	 *
 	 * @return the parent of this classpath entry, or <code>null</code> if none.
 	 */
 	public IClasspathEntry getParent();
-	
+
 	/**
 	 * Move this entries child entry in the direction indicated.
 	 * @param up if <code>true</code> move the child up one position in the order of the entries.
@@ -42,10 +42,10 @@
 	 * @param child the child entry to move
 	 */
 	public void moveChild(boolean up, IClasspathEntry child);
-	
+
 	/**
 	 * Returns whether this entry is editable.
-	 * 
+	 *
 	 * @return whether this entry is editable
 	 */
 	public boolean isEditable();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/RuntimeClasspathViewer.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/RuntimeClasspathViewer.java
index 3299fb8..d66cecf 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/RuntimeClasspathViewer.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/RuntimeClasspathViewer.java
@@ -1,20 +1,22 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.classpath;
- 
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.ListenerList;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
@@ -27,8 +29,8 @@
 import org.eclipse.jdt.internal.debug.ui.launcher.IEntriesChangedListener;
 import org.eclipse.jdt.internal.launching.LaunchingPlugin;
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
-import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -37,24 +39,26 @@
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.progress.WorkbenchJob;
 
 /**
  * A viewer that displays and manipulates runtime classpath entries.
  */
-public class RuntimeClasspathViewer extends TreeViewer implements IClasspathViewer {
-		
+public class RuntimeClasspathViewer implements IClasspathViewer {
+
 	/**
 	 * Entry changed listeners
 	 */
 	private ListenerList<IEntriesChangedListener> fListeners = new ListenerList<>();
-	
+
 	private IClasspathEntry fCurrentParent= null;
-	
+
 	private IPreferenceChangeListener fPrefListeners = new IPreferenceChangeListener() {
-		
+
 		@Override
 		public void preferenceChange(PreferenceChangeEvent event) {
 			if (DebugUIPlugin.getStandardDisplay().getThread().equals(Thread.currentThread())) {
@@ -70,31 +74,86 @@
 
 		}
 	};
-		
+
+	private static class RuntimeClasspathFilteredTree extends FilteredTree {
+
+		private boolean isFiltering;
+
+		private RuntimeClasspathFilteredTree(Composite parent, PatternFilter filter) {
+			super(parent, 0, filter, true);
+		}
+
+		private boolean hasFilterTextEntered() {
+			return isFiltering;
+		}
+
+		/**
+		 * Called by modify listener -> implicit change listener.
+		 */
+		@Override
+		protected void textChanged() {
+
+			super.textChanged();
+
+			final String filterString = getFilterString();
+			if (null != filterString) {
+				// REVIEW: There are several different ways used to check for empty filter texts:
+				// comparing with "", comparing with IInternalDebugCoreConstants.EMPTY_STRING and checking size of trimmed value.
+				isFiltering = !filterString.trim().isEmpty();
+			} else {
+				isFiltering = false;
+			}
+		}
+
+		@Override
+		protected WorkbenchJob doCreateRefreshJob() {
+			final WorkbenchJob job = super.doCreateRefreshJob();
+
+			return new WorkbenchJob("Classpath filter refresh") { //$NON-NLS-1$
+
+				@Override
+				public IStatus runInUIThread(IProgressMonitor monitor) {
+					final IStatus status = job.runInUIThread(monitor);
+
+					if (!isFiltering) {
+						getViewer().expandToLevel(2);
+					}
+
+					return status;
+				}
+			};
+		}
+	}
+
+	private final RuntimeClasspathFilteredTree fTree;
+
+	public TreeViewer getTreeViewer() {
+		return fTree.getViewer();
+	}
+
 	/**
 	 * Creates a runtime classpath viewer with the given parent.
 	 *
 	 * @param parent the parent control
 	 */
 	public RuntimeClasspathViewer(Composite parent) {
-		super(parent);
-		
-		GridData data = new GridData(GridData.FILL_BOTH);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		data.heightHint = getTree().getItemHeight();
-		getTree().setLayoutData(data);
-		
-		getTree().addKeyListener(new KeyAdapter() {
+
+		final PatternFilter filter = new PatternFilter();
+		filter.setIncludeLeadingWildcard(true);
+		fTree = new RuntimeClasspathFilteredTree(parent, filter);
+
+		getTreeViewer().getTree().addKeyListener(new KeyAdapter() {
 			@Override
 			public void keyPressed(KeyEvent event) {
-				if (updateSelection(RuntimeClasspathAction.REMOVE, (IStructuredSelection)getSelection()) && event.character == SWT.DEL && event.stateMask == 0) {
-					List<?> selection= getSelectionFromWidget();
-					getClasspathContentProvider().removeAll(selection);
+				if (updateSelection(RuntimeClasspathAction.REMOVE, (IStructuredSelection) getSelection()) && event.character == SWT.DEL
+						&& event.stateMask == 0) {
+					getClasspathContentProvider().removeAll(((IStructuredSelection) getSelectedEntries()).toList());
 					notifyChanged();
 				}
 			}
 		});
-		getTree().addDisposeListener(new DisposeListener() {
+
+		fTree.addDisposeListener(new DisposeListener() {
 			@Override
 			public void widgetDisposed(DisposeEvent e) {
 				IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN);
@@ -107,7 +166,7 @@
 		if(prefs != null) {
 			prefs.addPreferenceChangeListener(fPrefListeners);
 		}
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#setEntries(org.eclipse.jdt.launching.IRuntimeClasspathEntry[])
@@ -121,7 +180,7 @@
 		getClasspathContentProvider().setRefreshEnabled(true);
 		notifyChanged();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#getEntries()
 	 */
@@ -129,10 +188,11 @@
 	public IRuntimeClasspathEntry[] getEntries() {
 		return getClasspathContentProvider().getModel().getAllEntries();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#addEntries(org.eclipse.jdt.launching.IRuntimeClasspathEntry[])
 	 */
+	@SuppressWarnings("unlikely-arg-type")
 	@Override
 	public void addEntries(IRuntimeClasspathEntry[] entries) {
 		getClasspathContentProvider().setRefreshEnabled(false);
@@ -144,15 +204,15 @@
 			if (!existingEntries.contains(entries[i])) {
 				getClasspathContentProvider().add(fCurrentParent, entries[i], beforeElement);
 			}
-		} 
+		}
 		getClasspathContentProvider().setRefreshEnabled(true);
 		notifyChanged();
 	}
-	
+
 	private boolean resolveCurrentParent(ISelection selection) {
 		fCurrentParent= null;
 		Iterator<?> selected= ((IStructuredSelection)selection).iterator();
-		
+
 		while (selected.hasNext()) {
 			Object element = selected.next();
 			if (element instanceof ClasspathEntry) {
@@ -176,7 +236,7 @@
 		}
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#isEnabled()
 	 */
@@ -184,25 +244,25 @@
 	public boolean isEnabled() {
 		return true;
 	}
-	
+
 	/**
 	 * Sets the launch configuration context for this viewer, if any
 	 * @param configuration the backing {@link ILaunchConfiguration}
 	 */
 	public void setLaunchConfiguration(ILaunchConfiguration configuration) {
-		if (getLabelProvider() != null) {
-			((ClasspathLabelProvider)getLabelProvider()).setLaunchConfiguration(configuration);
+		if (getTreeViewer().getLabelProvider() != null) {
+			((ClasspathLabelProvider) getTreeViewer().getLabelProvider()).setLaunchConfiguration(configuration);
 		}
 	}
-	
+
 	public void addEntriesChangedListener(IEntriesChangedListener listener) {
 		fListeners.add(listener);
 	}
-	
+
 	public void removeEntriesChangedListener(IEntriesChangedListener listener) {
 		fListeners.remove(listener);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#notifyChanged()
 	 */
@@ -212,10 +272,11 @@
 			listener.entriesChanged(this);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#indexOf(org.eclipse.jdt.launching.IRuntimeClasspathEntry)
 	 */
+	@SuppressWarnings("unlikely-arg-type")
 	@Override
 	public int indexOf(IRuntimeClasspathEntry entry) {
 		IClasspathEntry[] entries= getClasspathContentProvider().getBootstrapClasspathEntries();
@@ -232,9 +293,9 @@
 				return 1;
 			}
 		}
-		
+
 		return -1;
-		
+
 	}
 
 	/* (non-Javadoc)
@@ -242,11 +303,11 @@
 	 */
 	@Override
 	public Shell getShell() {
-		return getControl().getShell();
+		return getTreeViewer().getControl().getShell();
 	}
-	
+
 	private ClasspathContentProvider getClasspathContentProvider() {
-		return (ClasspathContentProvider)super.getContentProvider();
+		return (ClasspathContentProvider) getTreeViewer().getContentProvider();
 	}
 
 	/* (non-Javadoc)
@@ -254,7 +315,7 @@
 	 */
 	@Override
 	public boolean updateSelection(int actionType, IStructuredSelection selection) {
-		
+
 		if (selection.isEmpty()) {
 			return false;
 		}
@@ -268,8 +329,11 @@
 					}
 				}
 				return selection.size() > 0;
+			case RuntimeClasspathAction.MOVE:
+				if (fTree.hasFilterTextEntered()) {
+					return false;
+				}
 			case RuntimeClasspathAction.REMOVE :
-			case RuntimeClasspathAction.MOVE :
 				selected= selection.iterator();
 				while (selected.hasNext()) {
 					IClasspathEntry entry = selected.next();
@@ -281,7 +345,7 @@
 			default :
 				break;
 		}
-		
+
 		return true;
 	}
 
@@ -290,7 +354,7 @@
 	 */
 	public ISelection getSelectedEntries() {
 		IStructuredSelection selection= (IStructuredSelection)getSelection();
-		List<IClasspathEntry> entries= new ArrayList<IClasspathEntry>(selection.size() * 2);
+		List<IClasspathEntry> entries= new ArrayList<>(selection.size() * 2);
 		Iterator<IClasspathEntry> itr= selection.iterator();
 		while (itr.hasNext()) {
 			IClasspathEntry element = itr.next();
@@ -300,7 +364,33 @@
 				entries.add(element);
 			}
 		}
-		
+
 		return new StructuredSelection(entries);
 	}
+
+	@Override
+	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+		getTreeViewer().addSelectionChangedListener(listener);
+	}
+
+	@Override
+	public ISelection getSelection() {
+		return getTreeViewer().getSelection();
+	}
+
+	@Override
+	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+		getTreeViewer().removeSelectionChangedListener(listener);
+	}
+
+	@Override
+	public void setSelection(ISelection selection) {
+		getTreeViewer().setSelection(selection);
+	}
+
+	@Override
+	public void refresh(Object entry) {
+		getTreeViewer().refresh();
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryAdapterFactory.java
index 6a02cc2..bf5a6f9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryWorkbenchAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryWorkbenchAdapter.java
index e59a15c..2651eaa 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryWorkbenchAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/VariableClasspathEntryWorkbenchAdapter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 
 /**
  * Workbench adapter for a string substitution runtime classpath entry.
- * 
+ *
  * @since 3.0
  */
 public class VariableClasspathEntryWorkbenchAdapter implements IWorkbenchAdapter {
@@ -39,7 +39,7 @@
 		}
 		return null;
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/AutoFormatSettingAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/AutoFormatSettingAction.java
index 0deacda..b612465 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/AutoFormatSettingAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/AutoFormatSettingAction.java
@@ -24,14 +24,14 @@
 	private IPreferenceStore fPreferenceStore;
 
 	public AutoFormatSettingAction(JavaStackTraceConsolePage page) {
-		super(ConsoleMessages.AutoFormatSettingAction_0, SWT.TOGGLE); 
+		super(ConsoleMessages.AutoFormatSettingAction_0, SWT.TOGGLE);
 		fPage = page;
-		
-		setToolTipText(ConsoleMessages.AutoFormatSettingAction_1);  
+
+		setToolTipText(ConsoleMessages.AutoFormatSettingAction_1);
 		setImageDescriptor(JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_ELCL_AUTO_FORMAT));
 		setHoverImageDescriptor(JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_ELCL_AUTO_FORMAT));
         PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaDebugHelpContextIds.CONSOLE_AUTOFORMAT_STACKTRACES_ACTION);
-        
+
         fPreferenceStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
         boolean checked = fPreferenceStore.getBoolean(IJDIPreferencesConstants.PREF_AUTO_FORMAT_JSTCONSOLE);
 		setChecked(checked);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/FormatStackTraceActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/FormatStackTraceActionDelegate.java
index dd200c2..eaca788 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/FormatStackTraceActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/FormatStackTraceActionDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,12 +18,12 @@
 import org.eclipse.ui.console.IConsoleView;
 
 public class FormatStackTraceActionDelegate implements IViewActionDelegate {
-    
+
     private JavaStackTraceConsole fConsole;
     private IConsoleView fView;
-    
+
     public FormatStackTraceActionDelegate() {}
-    
+
     public FormatStackTraceActionDelegate(JavaStackTraceConsole console) {
         fConsole = console;
     }
@@ -54,10 +54,10 @@
 			}
     	}
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
      */
     @Override
-	public void selectionChanged(IAction action, ISelection selection) {}      
+	public void selectionChanged(IAction action, ISelection selection) {}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaConsoleTracker.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaConsoleTracker.java
index 1c1c254..5c06eb2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaConsoleTracker.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaConsoleTracker.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,9 +21,9 @@
  * Provides links for stack traces
  */
 public class JavaConsoleTracker implements IPatternMatchListenerDelegate {
-	
+
 	/**
-	 * The console associated with this line tracker 
+	 * The console associated with this line tracker
 	 */
 	private TextConsole fConsole;
 
@@ -42,7 +42,7 @@
 	public void disconnect() {
         fConsole = null;
     }
-    
+
     protected TextConsole getConsole() {
         return fConsole;
     }
@@ -56,7 +56,7 @@
             int offset = event.getOffset();
             int length = event.getLength();
             IHyperlink link = new JavaStackTraceHyperlink(fConsole);
-            fConsole.addHyperlink(link, offset+1, length-2);   
+            fConsole.addHyperlink(link, offset+1, length-2);
         } catch (BadLocationException e) {
         }
     }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionConsoleTracker.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionConsoleTracker.java
index 8f0f05a..51b9ae3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionConsoleTracker.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionConsoleTracker.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,11 +17,11 @@
 
 /**
  * creates JavaExceptionHyperLinks
- * 
+ *
  * @since 3.1
  */
 public class JavaExceptionConsoleTracker extends JavaConsoleTracker {
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.console.IPatternMatchListenerDelegate#matchFound(org.eclipse.ui.console.PatternMatchEvent)
      */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionHyperLink.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionHyperLink.java
index 53743d8..272e916 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionHyperLink.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaExceptionHyperLink.java
@@ -41,7 +41,7 @@
 
 	/**
 	 * Constructs a new hyper link
-	 * 
+	 *
 	 * @param console
 	 *            the console the link is contained in
 	 * @param exceptionName
@@ -80,7 +80,7 @@
 
 	/**
 	 * Show the properties dialog for the given breakpoint.
-	 * 
+	 *
 	 * @param exceptionBreakpoint
 	 */
 	private void showProperties(IJavaExceptionBreakpoint breakpoint) {
@@ -105,7 +105,7 @@
 			} else if (source instanceof IType) {
 				type = (IType) source;
 			}
-			Map<String, Object> map = new HashMap<String, Object>();
+			Map<String, Object> map = new HashMap<>();
 			if (type != null) {
 				res = BreakpointUtils.getBreakpointResource(type);
 				BreakpointUtils.addJavaBreakpointAttributes(map, type);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaLikeExtensionsResolver.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaLikeExtensionsResolver.java
index a6f3699..87267b8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaLikeExtensionsResolver.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaLikeExtensionsResolver.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,7 +17,7 @@
 
 /**
  * Resolves to Java-like file extensions for hyperlink matching.
- * 
+ *
  * @since 3.2
  */
 public class JavaLikeExtensionsResolver implements IDynamicVariableResolver {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeConsoleTracker.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeConsoleTracker.java
index 7990ff8..bbf7747 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeConsoleTracker.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeConsoleTracker.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
             int length = event.getLength();
             TextConsole console = getConsole();
             IHyperlink link = new JavaNativeStackTraceHyperlink(console);
-            console.addHyperlink(link, offset+1, length-2);   
+            console.addHyperlink(link, offset+1, length-2);
         } catch (BadLocationException e) {
         }
     }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeStackTraceHyperlink.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeStackTraceHyperlink.java
index 8d825a4..14794f4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeStackTraceHyperlink.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaNativeStackTraceHyperlink.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -50,8 +50,8 @@
 			}
 			return typeName;
 		}
-		
-        IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_type_name_from_hyperlink__5, null); 
+
+        IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_type_name_from_hyperlink__5, null);
         throw new CoreException(status);
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsole.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsole.java
index f490187..64b8b65 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsole.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsole.java
@@ -45,7 +45,7 @@
  * Provides a stack trace console for Java stack traces
  */
 public class JavaStackTraceConsole extends TextConsole {
-	
+
 	/**
 	 * Provides a partitioner for this console type
 	 */
@@ -67,7 +67,7 @@
         }
 
     }
-	
+
     public final static String CONSOLE_TYPE = "javaStackTraceConsole"; //$NON-NLS-1$
     public final static String FILE_NAME = JDIDebugUIPlugin.getDefault().getStateLocation().toOSString() + File.separator + "stackTraceConsole.txt"; //$NON-NLS-1$
 
@@ -86,7 +86,7 @@
      * Constructor
      */
     public JavaStackTraceConsole() {
-        super(ConsoleMessages.JavaStackTraceConsoleFactory_0, CONSOLE_TYPE, null, true); 
+        super(ConsoleMessages.JavaStackTraceConsoleFactory_0, CONSOLE_TYPE, null, true);
         Font font = JFaceResources.getFont(IDebugUIConstants.PREF_CONSOLE_FONT);
         setFont(font);
         partitioner.connect(getDocument());
@@ -109,7 +109,7 @@
             } catch (IOException e) {
             }
         } else {
-			getDocument().set(ConsoleMessages.JavaStackTraceConsole_0); 
+			getDocument().set(ConsoleMessages.JavaStackTraceConsole_0);
 		}
     }
 
@@ -146,7 +146,7 @@
                     file.delete();
                 }
             }
-        } 
+        }
         catch (IOException e) {}
     }
 
@@ -165,7 +165,7 @@
 	public String getHelpContextId() {
 		return IJavaDebugHelpContextIds.STACK_TRACE_CONSOLE;
 	}
-    
+
     /**
      * @see org.eclipse.ui.console.TextConsole#createPage(org.eclipse.ui.console.IConsoleView)
      */
@@ -173,7 +173,7 @@
 	public IPageBookViewPage createPage(IConsoleView view) {
     	return new JavaStackTraceConsolePage(this, view);
 	}
-    
+
     /**
      * performs the formatting of the stacktrace console
      */
@@ -194,15 +194,15 @@
 	            if (orig != null && orig.length() > 0) {
 	                document.set(format(orig));
 	            }
-	            
+
 				return Status.OK_STATUS;
 			}
 		};
 		job.setSystem(true);
 		job.schedule();
-       
+
     }
-    
+
     /**
      * Underlying format operation
      * @param trace the stack trace to format
@@ -211,12 +211,12 @@
     private String format(String trace) {
         StringTokenizer tokenizer = new StringTokenizer(trace, " \t\n\r\f", true); //$NON-NLS-1$
         StringBuffer formattedTrace = new StringBuffer();
-        
+
         boolean insideAt = false;
         boolean newLine = true;
         int pendingSpaces = 0;
         boolean antTrace = false;
-        
+
         while (tokenizer.hasMoreTokens()) {
             String token = tokenizer.nextToken();
             if (token.length() == 0)
@@ -274,7 +274,7 @@
                     formattedTrace.append(token);
                     pendingSpaces = 0;
                     continue;
-                } else if (c == '[') { 
+                } else if (c == '[') {
                     if(antTrace) {
                         formattedTrace.append("\n"); //$NON-NLS-1$
                     }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleFactory.java
index 32f197a..7bb12b2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -12,7 +12,7 @@
 
 /**
  * Creates a new console into which users can paste stack traces and follow the hyperlinks.
- * 
+ *
  * @deprecated use org.eclipse.jdt.debug.ui.console.JavaStackTraceConsoleFactory
  * @since 3.1
  */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsolePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsolePage.java
index f5d6613..f86db62 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsolePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsolePage.java
@@ -20,7 +20,7 @@
 import org.eclipse.ui.console.TextConsoleViewer;
 
 public class JavaStackTraceConsolePage extends TextConsolePage {
-	
+
 	private AutoFormatSettingAction fAutoFormat;
 
 	public JavaStackTraceConsolePage(TextConsole console, IConsoleView view) {
@@ -30,7 +30,7 @@
 	@Override
 	protected void createActions() {
 		super.createActions();
-		
+
 		IActionBars actionBars= getSite().getActionBars();
 		fAutoFormat = new AutoFormatSettingAction(this);
 		IToolBarManager toolBarManager = actionBars.getToolBarManager();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleViewer.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleViewer.java
index cf3026f..82985a9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleViewer.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceConsoleViewer.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
 		super(parent, console);
 		fConsole = console;
 		getTextWidget().setOrientation(SWT.LEFT_TO_RIGHT);
-		
+
 		IPreferenceStore fPreferenceStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
         fAutoFormat = fPreferenceStore.getBoolean(IJDIPreferencesConstants.PREF_AUTO_FORMAT_JSTCONSOLE);
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java
index be68e48..fa3f73c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java
@@ -43,7 +43,7 @@
  * A hyper-link from a stack trace line of the form "*(*.java:*)"
  */
 public class JavaStackTraceHyperlink implements IHyperlink {
-	
+
 	private TextConsole fConsole;
 
 	/**
@@ -80,20 +80,20 @@
             typeName = getTypeName(linkText);
             lineNumber = getLineNumber(linkText);
         } catch (CoreException e1) {
-            ErrorDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(), ConsoleMessages.JavaStackTraceHyperlink_Error, ConsoleMessages.JavaStackTraceHyperlink_Error, e1.getStatus()); 
+            ErrorDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(), ConsoleMessages.JavaStackTraceHyperlink_Error, ConsoleMessages.JavaStackTraceHyperlink_Error, e1.getStatus());
             return;
         }
-		
+
 		// documents start at 0
 		if (lineNumber > 0) {
 			lineNumber--;
 		}
 		startSourceSearch(typeName, lineNumber);
 	}
-	
+
 	/**
 	 * Starts a search for the type with the given name. Reports back to 'searchCompleted(...)'.
-	 * 
+	 *
 	 * @param typeName the type to search for
 	 * @param lineNumber the line number to open the editor on
 	 */
@@ -119,14 +119,14 @@
 				}
 				return Status.OK_STATUS;
 			}
-		
+
 		};
 		search.schedule();
 	}
-	
+
 	/**
 	 * Reported back to from {@link JavaStackTraceHyperlink#startSourceSearch(String, int)} when results are found
-	 * 
+	 *
 	 * @param source the source object
 	 * @param typeName the fully qualified type name
 	 * @param lineNumber the line number in the type
@@ -142,7 +142,7 @@
 						MessageDialog.openInformation(JDIDebugUIPlugin.getActiveWorkbenchShell(), ConsoleMessages.JavaStackTraceHyperlink_Information_1, NLS.bind(ConsoleMessages.JavaStackTraceHyperlink_Source_not_found_for__0__2, new String[] {typeName}));
 					} else {
 						JDIDebugUIPlugin.statusDialog(ConsoleMessages.JavaStackTraceHyperlink_3, status);
-					}			
+					}
 				} else {
 					processSearchResult(source, typeName, lineNumber);
 				}
@@ -152,10 +152,10 @@
 		job.setSystem(true);
 		job.schedule();
 	}
-	
+
 	/**
 	 * The search succeeded with the given result
-	 * 
+	 *
 	 * @param source resolved source object for the search
 	 * @param typeName type name searched for
 	 * @param lineNumber line number on link
@@ -166,7 +166,7 @@
 		if (editorInput != null) {
 			String editorId = presentation.getEditorId(editorInput, source);
 			if (editorId != null) {
-				try { 
+				try {
 					IEditorPart editorPart = JDIDebugUIPlugin.getActivePage().openEditor(editorInput, editorId);
 					if (editorPart instanceof ITextEditor && lineNumber >= 0) {
 						ITextEditor textEditor = (ITextEditor)editorPart;
@@ -182,16 +182,16 @@
 						provider.disconnect(editorInput);
 					}
 				} catch (CoreException e) {
-					JDIDebugUIPlugin.statusDialog(e.getStatus()); 
+					JDIDebugUIPlugin.statusDialog(e.getStatus());
 				}
 			}
-		}		
+		}
 	}
 
 	/**
 	 * Returns the launch associated with this hyper-link, or
 	 *  <code>null</code> if none
-	 * 
+	 *
 	 * @return the launch associated with this hyper-link, or
 	 *  <code>null</code> if none
 	 */
@@ -240,19 +240,19 @@
             if (start >= 0) {
                 qualifier = qualifier.substring(0, start);
             }
-            
+
             if (qualifier.length() > 0) {
                 typeName = qualifier + "." + typeName; //$NON-NLS-1$
             }
             return typeName;
         }
-        IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_type_name_from_hyperlink__5, null); 
+        IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_type_name_from_hyperlink__5, null);
         throw new CoreException(status);
-    }	
-	
+    }
+
 	/**
 	 * Returns the line number associated with the stack trace or -1 if none.
-	 * 
+	 *
 	 * @param linkText the complete text of the link to be parsed
 	 * @return the line number for the stack trace or -1 if one cannot be computed or has not been provided
 	 * @exception CoreException if unable to parse the number
@@ -268,26 +268,26 @@
 			try {
 				return Integer.parseInt(numText);
 			} catch (NumberFormatException e) {
-				IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_line_number_from_hyperlink__6, e); 
+				IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_line_number_from_hyperlink__6, e);
 				throw new CoreException(status);
-			}		
+			}
 		}
-		IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_line_number_from_hyperlink__6, null); 
-		throw new CoreException(status);			
+		IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_parse_line_number_from_hyperlink__6, null);
+		throw new CoreException(status);
 	}
-	
+
 	/**
 	 * Returns the console this link is contained in.
-	 *  
+	 *
 	 * @return console
 	 */
 	protected TextConsole getConsole() {
 		return fConsole;
 	}
-	
+
 	/**
 	 * Returns this link's text
-	 * 
+	 *
 	 * @return the complete text of the link, never <code>null</code>
 	 * @exception CoreException if unable to retrieve the text
 	 */
@@ -296,22 +296,22 @@
             IDocument document = getConsole().getDocument();
 	        IRegion region = getConsole().getRegion(this);
             int regionOffset = region.getOffset();
-            
+
 	        int lineNumber = document.getLineOfOffset(regionOffset);
 	        IRegion lineInformation = document.getLineInformation(lineNumber);
             int lineOffset = lineInformation.getOffset();
 	        String line = document.get(lineOffset, lineInformation.getLength());
-            
+
             int regionOffsetInLine = regionOffset - lineOffset;
 
             int linkEnd = line.indexOf(')', regionOffsetInLine);
             int linkStart = line.lastIndexOf(' ', regionOffsetInLine);
-            
+
             return line.substring(linkStart==-1?0:linkStart+1,linkEnd+1);
 		} catch (BadLocationException e) {
-			IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_retrieve_hyperlink_text__8, e); 
+			IStatus status = new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), 0, ConsoleMessages.JavaStackTraceHyperlink_Unable_to_retrieve_hyperlink_text__8, e);
 			throw new CoreException(status);
-		}		
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTracePageParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTracePageParticipant.java
index 35227ed..3d709c6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTracePageParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTracePageParticipant.java
@@ -31,7 +31,7 @@
  * JavaStackTracePageParticipant
  */
 public class JavaStackTracePageParticipant implements IConsolePageParticipant {
-    
+
     private CloseConsoleAction fCloseAction;
     private FormatStackTraceActionDelegate fFormatAction;
     private IHandlerActivation fHandlerActivation;
@@ -43,10 +43,10 @@
     @Override
 	public void init(IPageBookViewPage page, IConsole console) {
         fCloseAction = new CloseConsoleAction(console);
-        
+
         IToolBarManager manager = page.getSite().getActionBars().getToolBarManager();
         manager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, fCloseAction);
-        
+
         fFormatAction = new FormatStackTraceActionDelegate((JavaStackTraceConsole) console);
     }
 
@@ -74,7 +74,7 @@
         // add EOF submissions
 		IWorkbench workbench = PlatformUI.getWorkbench();
         IHandlerService handlerService = workbench.getAdapter(IHandlerService.class);
-        
+
         IHandler formatHandler = new AbstractHandler() {
             @Override
 			public Object execute(ExecutionEvent event) throws ExecutionException {
@@ -82,9 +82,9 @@
                 return null;
             }
         };
-        
+
         fHandlerActivation = handlerService.activateHandler("org.eclipse.jdt.ui.edit.text.java.format", formatHandler); //$NON-NLS-1$
-		
+
         IContextService contextService = workbench.getAdapter(IContextService.class);
         fContextActivation = contextService.activateContext("org.eclipse.jdt.ui.javaEditorScope"); //$NON-NLS-1$
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentFrameContext.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentFrameContext.java
index c324eeb..b9e53e0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentFrameContext.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentFrameContext.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
  * Copyright (c) 2005, 2017 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
+ * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -81,7 +81,7 @@
         }
         return super.getLocalVariables();
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.jdt.internal.debug.ui.contentassist.IJavaDebugContentAssistContext#isStatic()
      */
@@ -97,7 +97,7 @@
     /**
      * Returns the currently active stack frame, or <code>null</code>
      * if none.
-     * 
+     *
      * @return the currently active stack frame, or <code>null</code>
      */
     protected IJavaStackFrame getStackFrame() {
@@ -109,5 +109,5 @@
         return frame;
     }
 
-    
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentValueContext.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentValueContext.java
index 0e9b348..f544c1c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentValueContext.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/CurrentValueContext.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
  * Copyright (c) 2005, 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
+ * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -49,7 +49,7 @@
     		// completion in context of Object
     		IJavaType[] types = ((IJavaDebugTarget)value.getDebugTarget()).getJavaTypes("java.lang.Object"); //$NON-NLS-1$
     		if (types.length > 0) {
-    			type = JavaDebugUtils.resolveType(types[0]);  
+    			type = JavaDebugUtils.resolveType(types[0]);
     		}
     	} else {
     		type = JavaDebugUtils.resolveType(value);
@@ -59,10 +59,10 @@
     	}
     	return type;
      }
-    
+
     /**
      * Returns the value for which completions are to be computed for, or <code>null</code> if none.
-     * 
+     *
      * @return the value for which completions are to be computed for, or <code>null</code> if none
      * @throws CoreException if an exception occurs
      */
@@ -71,7 +71,7 @@
         if (stackFrame == null) {
             unableToResolveType();
         }
-        
+
         IWorkbenchWindow window= JDIDebugUIPlugin.getActiveWorkbenchWindow();
         if (window == null) {
             unableToResolveType();
@@ -90,8 +90,8 @@
             if (viewerSelection.size() > 1) {
                 unableToResolveType();
             }
-            Object element= viewerSelection.getFirstElement();  
-            
+            Object element= viewerSelection.getFirstElement();
+
             IValue value= null;
             if (element instanceof IVariable) {
                 IVariable variable = (IVariable)element;
@@ -99,7 +99,7 @@
                 	value= variable.getValue();
                 }
             } else if (element instanceof IExpression) {
-                value= ((IExpression)element).getValue();   
+                value= ((IExpression)element).getValue();
             }
             if (value instanceof IJavaValue) {
     			return (IJavaValue) value;
@@ -147,5 +147,5 @@
 		return super.isStatic();
 	}
 
-    
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/DynamicTypeContext.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/DynamicTypeContext.java
index 84fed4e..d704654 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/DynamicTypeContext.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/DynamicTypeContext.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,11 +16,11 @@
 /**
  * Code completion for a dynamic type. Code completion is performed relative to the
  * type with no position information, in a non-static context.
- * 
+ *
  * @since 3.2
  */
 public class DynamicTypeContext extends TypeContext {
-	
+
 	/**
 	 * Provides a type in which to perform completions.
 	 * @since 3.2
@@ -29,18 +29,18 @@
 		/**
 		 * Returns the type in which to perform completions or <code>null</code>
 		 * if no type is available.
-		 * 
+		 *
 		 * @return type in which to perform completions or <code>null</code>
 		 * @exception CoreException if a type cannot be resolved
 		 */
 		public IType getType() throws CoreException;
 	}
-	
+
 	private ITypeProvider fTypeProvider;
-	
+
 	/**
 	 * Constructs a completion context on the given type.
-	 * 
+	 *
 	 * @param type type in which to perform completions
 	 */
 	public DynamicTypeContext(ITypeProvider type) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/IJavaDebugContentAssistContext.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/IJavaDebugContentAssistContext.java
index 241c4c5..cfba946 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/IJavaDebugContentAssistContext.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/IJavaDebugContentAssistContext.java
@@ -15,14 +15,14 @@
 
 /**
  * Provides a context for context assist in the Java debugger.
- * 
+ *
  * @since 3.2
  */
 public interface IJavaDebugContentAssistContext {
-	
+
 	/**
 	 * Returns the type in which to perform completions.
-	 * 
+	 *
 	 * @return type in which to perform completions
 	 * @throws CoreException if a type cannot be resolved
 	 */
@@ -32,12 +32,12 @@
 	 * Returns the position within this context's type's source where the snippet
 	 * on which completions are being performed is inserted. This position must not
 	 * be in comments. Returns -1, if the position is not known.
-	 * 
+	 *
 	 * @return position within source where completions are performed or -1
 	 * @throws CoreException if an exception occurs determining the position
 	 */
 	public int getInsertionPosition() throws CoreException;
-	
+
 	/**
 	 * Returns an array (possibly empty) of local variable information.
 	 * If the result is not empty, two arrays are returned. The first
@@ -48,27 +48,27 @@
 	 * Local variable information can be optionally be provided when an insertion
 	 * position is unknown, but local variable information is known.
 	 * </p>
-	 * 
+	 *
 	 * @return arrays of variable names and fully qualified type names of local variables
 	 *   visible at the current scope
 	 * @throws CoreException if an exception occurs determining local variable
 	 *  information
 	 */
 	public String[][] getLocalVariables() throws CoreException;
-	
+
 	/**
 	 * Returns whether the current scope is in a static context.
-	 * 
+	 *
 	 * @return whether the current scope is in a static context
 	 * @throws CoreException if an exception occurs while determining scope
 	 */
 	public boolean isStatic() throws CoreException;
-	
+
 	/**
 	 * Returns the snippet on which code completion is should be performed, given the
 	 * snippet that is currently being edited. Allows implementations to perform any
 	 * special pre-processing on the snippet.
-	 * 
+	 *
 	 * @param snippet the snippet in source viewer on which completion is being performed
 	 * @return the snippet on which to perform code completion
 	 * @throws CoreException
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugCompletionProposalCollector.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugCompletionProposalCollector.java
index f437071..387579f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugCompletionProposalCollector.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugCompletionProposalCollector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,16 +20,16 @@
 /**
  * Proposal collector that filters the special local variable used for content
  * assist on arrays.
- * 
+ *
  * @since 3.2
  */
 public class JavaDebugCompletionProposalCollector extends CompletionProposalCollector {
-	
+
 	private static final char[] fgHiddenLocal = ArrayRuntimeContext.ARRAY_THIS_VARIABLE.toCharArray();
 
 	/**
 	 * Constructs a proposal collector on the given project.
-	 * 
+	 *
 	 * @param project
 	 */
 	public JavaDebugCompletionProposalCollector(IJavaProject project) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java
index a95ec9a..7bcb278 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,17 +36,17 @@
 /**
  * Completion processor for the Java debugger. This completion processor
  * operates on a client provided context.
- * 
+ *
  * @since 3.2
  */
 public class JavaDebugContentAssistProcessor implements IContentAssistProcessor {
-		
+
 	private JavaDebugCompletionProposalCollector fCollector;
 	private IContextInformationValidator fValidator;
 	private TemplateEngine fJavaEngine;
 	private TemplateEngine fStatementEngine;
     private String fErrorMessage = null;
-	
+
 	private char[] fProposalAutoActivationSet;
 	private CompletionProposalComparator fComparator;
 	private IJavaDebugContentAssistContext fContext;
@@ -63,7 +63,7 @@
 		if (contextType != null) {
 			fStatementEngine= new TemplateEngine(contextType);
 		}
-		
+
 		fComparator= new CompletionProposalComparator();
 		fAssistant= null;
 	}
@@ -85,11 +85,11 @@
         }
         return null;
 	}
-    
+
     /**
      * Sets the error message for why completions could not be resolved.
      * Clients should clear this before computing completions.
-     * 
+     *
      * @param string message
      */
     private void setErrorMessage(String string) {
@@ -125,7 +125,7 @@
 	public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
 		return null;
 	}
-	
+
 	/**
 	 * @see IContentAssistProcessor#computeProposals(ITextViewer, int)
 	 */
@@ -135,7 +135,7 @@
 		try {
 			IType type = fContext.getType();
 			IJavaProject project = type.getJavaProject();
-				
+
 			String[][] locals = fContext.getLocalVariables();
 			int numLocals = 0;
 			if (locals.length > 0) {
@@ -143,50 +143,50 @@
 			}
 			char[][] localVariableNames = new char[numLocals][];
 			char[][] localVariableTypeNames = new char[numLocals][];
-			for (int i = 0; i < numLocals; i++) {			
+			for (int i = 0; i < numLocals; i++) {
 				localVariableNames[i] = locals[0][i].toCharArray();
 				localVariableTypeNames[i] = locals[1][i].toCharArray();
 			}
-			
+
 			ITextSelection selection= (ITextSelection)viewer.getSelectionProvider().getSelection();
-			configureResultCollector(project, selection);	
-			
+			configureResultCollector(project, selection);
+
 			int[] localModifiers= new int[localVariableNames.length];
 			Arrays.fill(localModifiers, 0);
-			
+
 			String snippet = viewer.getDocument().get();
 			char[] charSnippet = fContext.getSnippet(snippet).toCharArray();
 			type.codeComplete(charSnippet, fContext.getInsertionPosition(), documentOffset,
 				 localVariableTypeNames, localVariableNames,
 				 localModifiers, fContext.isStatic(), fCollector);
-			
-			List<IJavaCompletionProposal> total = new ArrayList<IJavaCompletionProposal>();
+
+			List<IJavaCompletionProposal> total = new ArrayList<>();
 			total.addAll(Arrays.asList(fCollector.getJavaCompletionProposals()));
-			
+
 			if (fJavaEngine != null) {
 				fJavaEngine.reset();
 				fJavaEngine.complete(viewer, documentOffset, null);
 				total.addAll(Arrays.asList(fJavaEngine.getResults()));
 			}
-			
+
 			if (fStatementEngine != null) {
 				fStatementEngine.reset();
 				fStatementEngine.complete(viewer, documentOffset, null);
 				total.addAll(Arrays.asList(fStatementEngine.getResults()));
 			}
-		
+
 			 //Order here and not in result collector to make sure that the order
-			 //applies to all proposals and not just those of the compilation unit. 
-			return order(total.toArray(new IJavaCompletionProposal[total.size()]));	
+			 //applies to all proposals and not just those of the compilation unit.
+			return order(total.toArray(new IJavaCompletionProposal[total.size()]));
 		} catch (CoreException x) {
 			setErrorMessage(x.getStatus().getMessage());
 		} finally {
 			releaseCollector();
 		}
-		
+
 		return null;
 	}
-	
+
 	/**
 	 * Order the given proposals.
 	 */
@@ -213,18 +213,18 @@
 		fCollector = new JavaDebugCompletionProposalCollector(project);
 		if (selection.getLength() != 0) {
 			fCollector.setReplacementLength(selection.getLength());
-		} 
+		}
 	}
-	
+
 	/**
 	 * Tells this processor to order the proposals alphabetically.
-	 * 
+	 *
 	 * @param order <code>true</code> if proposals should be ordered.
 	 */
 	public void orderProposalsAlphabetically(boolean order) {
 		fComparator.setOrderAlphabetically(order);
 	}
-	
+
 	/**
 	 * @see IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
 	 */
@@ -232,25 +232,25 @@
 	public char[] getCompletionProposalAutoActivationCharacters() {
 		return fProposalAutoActivationSet;
 	}
-	
+
 	/**
 	 * Sets this processor's set of characters triggering the activation of the
 	 * completion proposal computation.
-	 * 
+	 *
 	 * @param activationSet the activation set
 	 */
 	public void setCompletionProposalAutoActivationCharacters(char[] activationSet) {
 		fProposalAutoActivationSet= activationSet;
 	}
-	
+
 	/**
 	 * Clears reference to result proposal collector.
 	 */
 	private void releaseCollector() {
 		if (fCollector != null && fCollector.getErrorMessage().length() > 0 && fErrorMessage != null) {
 			setErrorMessage(fCollector.getErrorMessage());
-		}		
+		}
 		fCollector = null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/TypeContext.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/TypeContext.java
index 69a28c5..5c8975b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/TypeContext.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/TypeContext.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,17 +19,17 @@
 
 /**
  * Code completion for a type with position information and no locals.
- * 
+ *
  * @since 3.2
  */
 public class TypeContext implements IJavaDebugContentAssistContext {
-	
+
 	private IType fType;
 	private int fPosition;
-	
+
 	/**
 	 * Constructs a completion context on the given type.
-	 * 
+	 *
 	 * @param type type in which to perform completions
 	 * @param insertionPoistion position in source to perform completions or -1
 	 */
@@ -51,7 +51,7 @@
 
     /**
      * Throws an exception when unable to resolve a type
-     * 
+     *
      * @throws CoreException
      */
     protected void unableToResolveType() throws CoreException {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DataDisplay.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DataDisplay.java
index 9ace5ef..b1781a2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DataDisplay.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DataDisplay.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,15 +21,15 @@
  * An implementation of a data display for a text viewer
  */
 public class DataDisplay implements IDataDisplay {
-	
+
 	/**
 	 * The text viewer this data display works on
 	 */
 	private ITextViewer fTextViewer;
-	
+
 	/**
 	 * Constructs a data display for the given text viewer.
-	 * 
+	 *
 	 * @param viewer text viewer
 	 */
 	public DataDisplay(ITextViewer viewer) {
@@ -46,7 +46,7 @@
 			document.set(""); //$NON-NLS-1$
 		}
 	}
-	
+
 	/**
 	 * @see IDataDisplay#displayExpression(String)
 	 */
@@ -59,14 +59,14 @@
 			if (offset != document.getLineInformationOfOffset(offset).getOffset()) {
 				expression= System.getProperty("line.separator") + expression.trim(); //$NON-NLS-1$
 			}
-			document.replace(offset, 0, expression);	
-			fTextViewer.setSelectedRange(offset + expression.length(), 0);	
+			document.replace(offset, 0, expression);
+			fTextViewer.setSelectedRange(offset + expression.length(), 0);
 			fTextViewer.revealRange(offset, expression.length());
 		} catch (BadLocationException ble) {
 			JDIDebugUIPlugin.log(ble);
 		}
-	}		
-	
+	}
+
 	/**
 	 * @see IDataDisplay#displayExpressionValue(String)
 	 */
@@ -74,33 +74,33 @@
 	public void displayExpressionValue(String value) {
 		value= System.getProperty("line.separator") + '\t' + value; //$NON-NLS-1$
 		ITextSelection selection= (ITextSelection)fTextViewer.getSelectionProvider().getSelection();
-	
+
 		int offset= selection.getOffset() + selection.getLength();
 		int length= value.length();
 		try {
-			fTextViewer.getDocument().replace(offset, 0, value);	
+			fTextViewer.getDocument().replace(offset, 0, value);
 		} catch (BadLocationException ble) {
 			JDIDebugUIPlugin.log(ble);
 		}
-		fTextViewer.setSelectedRange(offset + length, 0);	
+		fTextViewer.setSelectedRange(offset + length, 0);
 		fTextViewer.revealRange(offset, length);
 	}
 
 	/**
 	 * Sets the text viewer for this data display
-	 * 
+	 *
 	 * @param viewer text viewer
 	 */
 	private void setTextViewer(ITextViewer viewer) {
 		fTextViewer = viewer;
 	}
-	
+
 	/**
 	 * Returns the text viewer for this data display
-	 * 
+	 *
 	 * @return text viewer
 	 */
 	protected ITextViewer getTextViewer() {
 		return fTextViewer;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DetailsViewerConfiguration.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DetailsViewerConfiguration.java
index 174413b..518fe0f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DetailsViewerConfiguration.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DetailsViewerConfiguration.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayView.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayView.java
index 5d670aa..e4db3d8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayView.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayView.java
@@ -90,7 +90,7 @@
 import org.eclipse.ui.texteditor.IUpdate;
 
 public class DisplayView extends ViewPart implements ITextInputListener, IPerspectiveListener2 {
-		
+
 	class DataDisplay implements IDataDisplay {
 		/**
 		 * @see IDataDisplay#clear()
@@ -102,7 +102,7 @@
 				document.set(""); //$NON-NLS-1$
 			}
 		}
-		
+
 		/**
 		 * @see IDataDisplay#displayExpression(String)
 		 */
@@ -122,7 +122,7 @@
 				JDIDebugUIPlugin.log(ble);
 			}
 		}
-		
+
 		/**
 		 * @see IDataDisplay#displayExpressionValue(String)
 		 */
@@ -142,16 +142,16 @@
 			fSourceViewer.revealRange(offset, length);
 		}
 	}
-		
+
 	protected IDataDisplay fDataDisplay= new DataDisplay();
 	protected IDocumentListener fDocumentListener= null;
-	
+
 	protected JDISourceViewer fSourceViewer;
 	protected IAction fClearDisplayAction;
 	protected DisplayViewAction fContentAssistAction;
 
-	protected Map<String, IAction> fGlobalActions= new HashMap<String, IAction>(4);
-	protected List<String> fSelectionActions= new ArrayList<String>(3);
+	protected Map<String, IAction> fGlobalActions= new HashMap<>(4);
+	protected List<String> fSelectionActions= new ArrayList<>(3);
 
 	protected String fRestoredContents= null;
 	/**
@@ -162,7 +162,7 @@
 	 */
 	private static IMemento fgMemento;
 	private IHandlerActivation fHandlerActivation;
-	
+
 	/**
 	 * @see ViewPart#createChild(IWorkbenchPartContainer)
 	 */
@@ -188,15 +188,15 @@
 				fillContextMenu(mgr);
 			}
 		});
-		
+
 		Menu menu = menuMgr.createContextMenu(fSourceViewer.getTextWidget());
 		fSourceViewer.getTextWidget().setMenu(menu);
 		getSite().registerContextMenu(menuMgr, fSourceViewer.getSelectionProvider());
-		
+
 		getSite().setSelectionProvider(fSourceViewer.getSelectionProvider());
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(fSourceViewer.getTextWidget(), IJavaDebugHelpContextIds.DISPLAY_VIEW);
 		getSite().getWorkbenchWindow().addPerspectiveListener(this);
-		
+
 		initDragAndDrop();
 	}
 
@@ -225,10 +225,10 @@
 			}
 		};
 		doc.addDocumentListener(fDocumentListener);
-		
+
 		return doc;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
 	 */
@@ -238,48 +238,48 @@
 			fSourceViewer.getControl().setFocus();
 		}
 	}
-	
+
 	/**
 	 * Initialize the actions of this view
 	 */
 	protected void createActions() {
-				
+
 		fClearDisplayAction= new ClearOutputAction(fSourceViewer);
-		
+
 		IAction action= new DisplayViewAction(this, ITextOperationTarget.CUT);
 		action.setText(DisplayMessages.DisplayView_Cut_label);
 		action.setToolTipText(DisplayMessages.DisplayView_Cut_tooltip);
 		action.setDescription(DisplayMessages.DisplayView_Cut_description);
 		setGlobalAction(ActionFactory.CUT.getId(), action);
-		
+
 		action= new DisplayViewAction(this, ITextOperationTarget.COPY);
 		action.setText(DisplayMessages.DisplayView_Copy_label);
 		action.setToolTipText(DisplayMessages.DisplayView_Copy_tooltip);
 		action.setDescription(DisplayMessages.DisplayView_Copy_description);
 		setGlobalAction(ActionFactory.COPY.getId(), action);
-		
+
 		action= new DisplayViewAction(this, ITextOperationTarget.PASTE);
 		action.setText(DisplayMessages.DisplayView_Paste_label);
 		action.setToolTipText(DisplayMessages.DisplayView_Paste_tooltip);
 		action.setDescription(DisplayMessages.DisplayView_Paste_Description);
 		setGlobalAction(ActionFactory.PASTE.getId(), action);
-		
+
 		action= new DisplayViewAction(this, ITextOperationTarget.SELECT_ALL);
 		action.setText(DisplayMessages.DisplayView_SelectAll_label);
 		action.setToolTipText(DisplayMessages.DisplayView_SelectAll_tooltip);
 		action.setDescription(DisplayMessages.DisplayView_SelectAll_description);
 		setGlobalAction(ActionFactory.SELECT_ALL.getId(), action);
-		
+
 		//TODO: Still using "old" resource access
 		ResourceBundle bundle= ResourceBundle.getBundle("org.eclipse.jdt.internal.debug.ui.display.DisplayResourceBundleMessages"); //$NON-NLS-1$
 		FindReplaceAction findReplaceAction = new FindReplaceAction(bundle, "find_replace_action_", this); //$NON-NLS-1$
 		findReplaceAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_FIND_AND_REPLACE);
 		setGlobalAction(ActionFactory.FIND.getId(), findReplaceAction);
-		
+
 		fSelectionActions.add(ActionFactory.CUT.getId());
 		fSelectionActions.add(ActionFactory.COPY.getId());
 		fSelectionActions.add(ActionFactory.PASTE.getId());
-		
+
 		fContentAssistAction= new DisplayViewAction(this, ISourceViewer.CONTENTASSIST_PROPOSALS);
 		fContentAssistAction.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
 		fContentAssistAction.setText(DisplayMessages.DisplayView_Co_ntent_Assist_Ctrl_Space_1);
@@ -296,13 +296,13 @@
 				fContentAssistAction.run();
 				return null;
 			}
-			
+
 		};
 
 		IHandlerService handlerService = getSite().getService(IHandlerService.class);
 		fHandlerActivation = handlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler);
 	}
-	
+
 	/**
 	 * Creates this editor's undo/redo actions.
 	 * <p>
@@ -314,7 +314,7 @@
 		IUndoContext undoContext= getUndoContext();
 		if (undoContext != null) {
 			// Use actions provided by global undo/redo
-			
+
 			// Create the undo action
 			OperationHistoryActionHandler undoAction= new UndoActionHandler(getSite(), undoContext);
 			PlatformUI.getWorkbench().getHelpSystem().setHelp(undoAction, IAbstractTextEditorHelpContextIds.UNDO_ACTION);
@@ -328,7 +328,7 @@
 			setGlobalAction(ITextEditorActionConstants.REDO, redoAction);
 		}
 	}
-	
+
 	/**
 	 * Returns this editor's viewer's undo manager undo context.
 	 *
@@ -363,7 +363,7 @@
 	 * Adds the context menu actions for the display view.
 	 */
 	protected void fillContextMenu(IMenuManager menu) {
-		
+
 		if (fSourceViewer.getDocument() == null) {
 			return;
 		}
@@ -388,25 +388,25 @@
 	@SuppressWarnings("unchecked")
 	@Override
 	public <T> T getAdapter(Class<T> required) {
-			
+
 		if (ITextOperationTarget.class.equals(required)) {
 			return (T) fSourceViewer.getTextOperationTarget();
 		}
-		
+
 		if (IFindReplaceTarget.class.equals(required)) {
 			return (T) fSourceViewer.getFindReplaceTarget();
 		}
-			
+
 		if (IDataDisplay.class.equals(required)) {
 			return (T) fDataDisplay;
 		}
 		if (ITextViewer.class.equals(required)) {
 			return (T) fSourceViewer;
 		}
-		
+
 		return super.getAdapter(required);
 	}
-	
+
 	protected void updateActions() {
 		Iterator<String> iterator = fSelectionActions.iterator();
 		while (iterator.hasNext()) {
@@ -416,10 +416,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Saves the contents of the display view and the formatting.
-	 * 
+	 *
 	 * @see org.eclipse.ui.IViewPart#saveState(IMemento)
 	 */
 	@Override
@@ -433,10 +433,10 @@
 			memento.putTextData(fRestoredContents);
 		}
 	}
-	
+
 	/**
 	 * Restores the contents of the display view and the formatting.
-	 * 
+	 *
 	 * @see org.eclipse.ui.IViewPart#init(IViewSite, IMemento)
 	 */
 	@Override
@@ -449,10 +449,10 @@
 			fRestoredContents= memento.getTextData();
 		}
 	}
-	
+
     /**
      * Initializes the drag and/or drop adapters for this view.
-     * 
+     *
      * @since 3.4
      */
     protected void initDragAndDrop() {
@@ -466,7 +466,7 @@
         	}
         });
     }
-	
+
 	/**
 	 * Returns the entire trimmed contents of the current document.
 	 * If the contents are "empty" <code>null</code> is returned.
@@ -483,7 +483,7 @@
 	    }
 	    return null;
 	}
-	
+
 	protected final ISelectionChangedListener getSelectionChangedListener() {
 		return new ISelectionChangedListener() {
 				@Override
@@ -492,7 +492,7 @@
 				}
 			};
 	}
-	
+
 	protected void updateSelectionDependentActions() {
 		Iterator<String> iterator= fSelectionActions.iterator();
 		while (iterator.hasNext()) {
@@ -531,10 +531,10 @@
 			fSourceViewer.dispose();
 			fSourceViewer = null;
 		}
-		
+
 		IHandlerService handlerService = getSite().getService(IHandlerService.class);
 		handlerService.deactivateHandler(fHandlerActivation);
-		
+
 		super.dispose();
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewAction.java
index 00cf43f..7279de4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,31 +18,31 @@
 
 
 public class DisplayViewAction extends Action implements IUpdate {
-	
+
 	/** The text operation code */
 	private int fOperationCode= -1;
 	/** The text operation target */
 	private ITextOperationTarget fOperationTarget;
 	/** The text operation target provider */
 	private IAdaptable fTargetProvider;
-	
-	
+
+
 	public DisplayViewAction(ITextOperationTarget target, int operationCode) {
 		super();
 		fOperationTarget= target;
 		fOperationCode= operationCode;
 		update();
 	}
-		
+
 	public DisplayViewAction(IAdaptable targetProvider, int operationCode) {
 		super();
 		fTargetProvider= targetProvider;
 		fOperationCode= operationCode;
 		update();
 	}
-	
+
 	/**
-	 * The <code>TextOperationAction</code> implementation of this 
+	 * The <code>TextOperationAction</code> implementation of this
 	 * <code>IAction</code> method runs the operation with the current
 	 * operation code.
 	 */
@@ -52,9 +52,9 @@
 			fOperationTarget.doOperation(fOperationCode);
 		}
 	}
-	
+
 	/**
-	 * The <code>TextOperationAction</code> implementation of this 
+	 * The <code>TextOperationAction</code> implementation of this
 	 * <code>IUpdate</code> method discovers the operation through the current
 	 * editor's <code>ITextOperationTarget</code> adapter, and sets the
 	 * enabled state accordingly.
@@ -64,7 +64,7 @@
 		if (fOperationTarget == null && fTargetProvider != null && fOperationCode != -1){
 			fOperationTarget = fTargetProvider.getAdapter(ITextOperationTarget.class);
 		}
-	
+
 		boolean isEnabled= (fOperationTarget != null && fOperationTarget.canDoOperation(fOperationCode));
 		setEnabled(isEnabled);
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewerConfiguration.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewerConfiguration.java
index e8c3da4..fd8ea4a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewerConfiguration.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayViewerConfiguration.java
@@ -32,18 +32,18 @@
  *  The source viewer configuration for the Display view
  */
 public class DisplayViewerConfiguration extends JavaSourceViewerConfiguration {
-		
+
 	public DisplayViewerConfiguration() {
-		super(JDIDebugUIPlugin.getDefault().getJavaTextTools().getColorManager(), 
+		super(JDIDebugUIPlugin.getDefault().getJavaTextTools().getColorManager(),
 				new ChainedPreferenceStore(new IPreferenceStore[] {
 						PreferenceConstants.getPreferenceStore(),
 						EditorsUI.getPreferenceStore()}),
 				null, IJavaPartitions.JAVA_PARTITIONING);
 	}
-	
+
 	/**
 	 * Returns the preference store this source viewer configuration is associated with.
-	 * 
+	 *
 	 * @return
 	 */
 	public IPreferenceStore getTextPreferenceStore() {
@@ -53,7 +53,7 @@
 	public IContentAssistProcessor getContentAssistantProcessor() {
 		return new JavaDebugContentAssistProcessor(new CurrentFrameContext());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getContentAssistant(org.eclipse.jface.text.source.ISourceViewer)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/IDataDisplay.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/IDataDisplay.java
index 7dfbdd4..18905e3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/IDataDisplay.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/IDataDisplay.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,18 +13,18 @@
 
 
 public interface IDataDisplay {
-	
+
 	/**
 	 * Clears the content of this data display.
 	 */
 	public void clear();
-	
+
 	/**
 	 * Displays the expression in the content of this data
 	 * display.
 	 */
 	public void displayExpression(String expression);
-	
+
 	/**
 	 * Displays the expression valur in the content of this data
 	 * display.
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/JavaInspectExpression.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/JavaInspectExpression.java
index f676424..2d75e79 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/JavaInspectExpression.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/JavaInspectExpression.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.display;
 
- 
+
 import org.eclipse.core.runtime.PlatformObject;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
@@ -35,17 +35,17 @@
  * target terminates.
  */
 public class JavaInspectExpression extends PlatformObject implements IErrorReportingExpression, IDebugEventSetListener {
-	
+
 	/**
 	 * The value of this expression
 	 */
 	private IJavaValue fValue;
-	
+
 	/**
 	 * The code snippet for this expression.
 	 */
 	private String fExpression;
-	
+
 	private IEvaluationResult fResult;
 
 	/**
@@ -54,7 +54,7 @@
 	 * to debug events such that this element will remove
 	 * itself from the expression manager when its debug
 	 * target terminates.
-	 * 
+	 *
 	 * @param expression code snippet
 	 * @param value value of the expression
 	 */
@@ -63,19 +63,19 @@
 		fExpression = expression;
 		DebugPlugin.getDefault().addDebugEventListener(this);
 	}
-	
+
 	/**
 	 * Constructs a new inspect result for the given
 	 * evaluation result, which provides a snippet, value,
 	 * and error messages, if any.
-	 * 
+	 *
 	 * @param result the evaluation result
 	 */
 	public JavaInspectExpression(IEvaluationResult result) {
 		this(result.getSnippet(), result.getValue());
 		fResult= result;
 	}
-	
+
 	/**
 	 * @see IExpression#getExpressionText()
 	 */
@@ -157,7 +157,7 @@
 	 */
 	@Override
 	public void dispose() {
-		DebugPlugin.getDefault().removeDebugEventListener(this);		
+		DebugPlugin.getDefault().removeDebugEventListener(this);
 	}
 
 	/**
@@ -170,12 +170,12 @@
 
 	/**
 	 * @see org.eclipse.debug.core.model.IErrorReportingExpression#getErrorMessages()
-	 */	
+	 */
 	@Override
-	public String[] getErrorMessages() {	
+	public String[] getErrorMessages() {
 		return getErrorMessages(fResult);
 	}
-	
+
 	public static String[] getErrorMessages(IEvaluationResult result) {
 		if (result == null) {
 			return new String[0];
@@ -189,7 +189,7 @@
 			Throwable cause= exception.getStatus().getException();
 			if (cause instanceof InvocationException) {
 				String  nestedMessage= ((InvocationException) cause).exception().referenceType().name();
-				return new String[] { NLS.bind(DisplayMessages.JavaInspectExpression_0, new String[] {nestedMessage}) }; 
+				return new String[] { NLS.bind(DisplayMessages.JavaInspectExpression_0, new String[] {nestedMessage}) };
 			}
 			return new String[] { exception.getMessage() };
 		}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllInstancesActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllInstancesActionDelegate.java
index 0575925..e6c8b92 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllInstancesActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllInstancesActionDelegate.java
@@ -67,13 +67,13 @@
 /**
  * Class to provide new function of viewing all live objects of the selected type in the current VM
  * Feature of 1.6 VMs
- * 
+ *
  * @since 3.3
  */
 public class AllInstancesActionDelegate  extends ObjectActionDelegate implements IEditorActionDelegate, IWorkbenchWindowActionDelegate {
 
 	private IWorkbenchWindow fWindow;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
@@ -98,7 +98,7 @@
 						    		IJavaElement[] selectedTypes = ((ICodeAssist)element).codeSelect(selectedWord.getOffset(), selectedWord.getLength());
 						    		// findWord() will only return one element, so only check the first element
 						    		if (selectedTypes.length > 0){
-						    			runForSelection(selectedTypes[0]);  
+						    			runForSelection(selectedTypes[0]);
 						    			return;
 						    		}
 								} catch (JavaModelException e){
@@ -108,7 +108,7 @@
 					    	}
 					    }
 					}
-					
+
 				// Otherwise, get the first selected element and check if it is a type
 				} else if (selection instanceof IStructuredSelection){
 					runForSelection(((IStructuredSelection)selection).getFirstElement());
@@ -118,16 +118,16 @@
 		}
 		report(Messages.AllInstancesActionDelegate_3,getPart());
 	}
-	
+
 	/**
 	 * Resolves a debug reference type for the selected element and then
 	 * runs the action.
-	 * 
+	 *
 	 * @param selectedElement a method, type, or variable
 	 */
 	protected void runForSelection(Object selectedElement){
 		if (selectedElement != null){
-						
+
 			IJavaType type = null;
 			try {
 				// If the element is a constructor, get instances of its declaring type
@@ -165,13 +165,13 @@
 						type = var.getJavaType();
 					}
 				}
-				
+
 			} catch (JavaModelException e){
 				JDIDebugUIPlugin.log(e.getStatus());
 			} catch (DebugException e) {
 				JDIDebugUIPlugin.log(e.getStatus());
 			}
-					
+
 			if(type instanceof JDIReferenceType) {
 				JDIReferenceType rtype = (JDIReferenceType) type;
 				displayInstaces((JDIDebugTarget)rtype.getDebugTarget(), rtype);
@@ -180,33 +180,33 @@
 		}
 		report(Messages.AllInstancesActionDelegate_3,getPart());
 	}
-	
+
 	/**
 	 * No types are loaded in the given target with the specified type name. Displays the result.
-	 * 
+	 *
 	 * @param target target
 	 * @param typeName resolve type name
 	 */
 	protected void displayNoInstances(IJavaDebugTarget target, String typeName) {
 		JDIAllInstancesValue aiv = new JDIAllInstancesValue((JDIDebugTarget)target, null);
-		InspectPopupDialog ipd = new InspectPopupDialog(getShell(), 
-				getAnchor(), 
+		InspectPopupDialog ipd = new InspectPopupDialog(getShell(),
+				getAnchor(),
 				PopupInspectAction.ACTION_DEFININITION_ID,
 				new JavaInspectExpression(NLS.bind(Messages.AllInstancesActionDelegate_2, new String[]{typeName}), aiv));
 		ipd.open();
 	}
-	
+
 	/**
 	 * Display instances of the given resolved type.
-	 * 
+	 *
 	 * @param target target
 	 * @param rtype resolved reference type
 	 */
 	protected void displayInstaces(IJavaDebugTarget target, JDIReferenceType rtype) {
 		try{
 			JDIAllInstancesValue aiv = new JDIAllInstancesValue((JDIDebugTarget)rtype.getDebugTarget(), rtype);
-			InspectPopupDialog ipd = new InspectPopupDialog(getShell(), 
-					getAnchor(), 
+			InspectPopupDialog ipd = new InspectPopupDialog(getShell(),
+					getAnchor(),
 					PopupInspectAction.ACTION_DEFININITION_ID,
 					new JavaInspectExpression(NLS.bind(Messages.AllInstancesActionDelegate_2, new String[]{rtype.getName()}), aiv));
 			ipd.open();
@@ -215,7 +215,7 @@
 			report(Messages.AllInstancesActionDelegate_0,getPart());
 		}
 	}
-	
+
 	 /**
      * Convenience method for printing messages to the status line
      * @param message the message to be displayed
@@ -239,11 +239,11 @@
 
 	/**
 	 * Compute an anchor based on selected item in the tree.
-	 * 
+	 *
 	 * @return anchor point or <code>null</code> if one could not be obtained
 	 */
     protected Point getAnchor() {
-    	
+
     	// If it's a debug view (variables or expressions), get the location of the selected item
     	IDebugView debugView = getPart().getAdapter(IDebugView.class);
 		if (debugView != null){
@@ -257,7 +257,7 @@
 				}
 			}
 		}
-		
+
 		//resolve the current control
 		Control widget = getPart().getAdapter(Control.class);
     	if (widget == null){
@@ -276,7 +276,7 @@
 	        int midOffset = docRange.x + (docRange.y / 2);
 	        Point point = textWidget.getLocationAtOffset(midOffset);
 	        point = textWidget.toDisplay(point);
-	
+
 	        GC gc = new GC(textWidget);
 	        gc.setFont(textWidget.getFont());
 	        int height = gc.getFontMetrics().getHeight();
@@ -292,9 +292,9 @@
 				return tree.toDisplay(new Point(bounds.x, bounds.y + bounds.height));
 			}
 		}
-		return null;    	
+		return null;
     }
-    	
+
     /**
      * Gets the <code>IJavaElement</code> from the editor input
      * @param input the current editor input
@@ -308,13 +308,13 @@
     	//try to get from the working copy manager
     	return DebugWorkingCopyManager.getWorkingCopy(input, false);
     }
-	
-	
+
+
     /**
      * Returns the text editor associated with the given part or <code>null</code>
      * if none. In case of a multi-page editor, this method should be used to retrieve
      * the correct editor to perform the operation on.
-     * 
+     *
      * @param part workbench part
      * @return text editor part or <code>null</code>
      */
@@ -323,14 +323,14 @@
     		return (ITextEditor) part;
     	}
     	return part.getAdapter(ITextEditor.class);
-    }	
-    
+    }
+
     /* (non-Javadoc)
 	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
 	 */
 	@Override
 	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		setActivePart(action, targetEditor);	
+		setActivePart(action, targetEditor);
 	}
 
 	/* (non-Javadoc)
@@ -340,7 +340,7 @@
 	public void init(IWorkbenchWindow window) {
 		fWindow = window;
 	}
-	
+
 	/**
 	 * @return the shell to use for new popups or <code>null</code>
 	 */
@@ -353,7 +353,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.ObjectActionDelegate#getPart()
 	 */
@@ -370,5 +370,5 @@
 		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesActionDelegate.java
index 2e486dd..db03007 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesActionDelegate.java
@@ -38,13 +38,13 @@
 
 /**
  * Action to browse all references to selected object.
- * 
+ *
  * @since 3.3
  */
 public class AllReferencesActionDelegate extends ObjectActionDelegate implements IWorkbenchWindowActionDelegate{
 
 	protected IWorkbenchWindow fWindow;
-	
+
 	@Override
 	public void run(IAction action) {
 		IStructuredSelection currentSelection = getCurrentSelection();
@@ -52,8 +52,8 @@
 			IJavaVariable var = (IJavaVariable) currentSelection.getFirstElement();
 			try {
 				JDIReferenceListValue referenceList = new JDIReferenceListValue((IJavaObject) var.getValue());
-				InspectPopupDialog ipd = new InspectPopupDialog(getShell(), 
- getAnchor(getPart().getAdapter(IDebugView.class)), 
+				InspectPopupDialog ipd = new InspectPopupDialog(getShell(),
+ getAnchor(getPart().getAdapter(IDebugView.class)),
 						PopupInspectAction.ACTION_DEFININITION_ID,
 						new JavaInspectExpression(NLS.bind(Messages.AllReferencesActionDelegate_1,new String[]{var.getName()}),referenceList));
 				ipd.open();
@@ -64,10 +64,10 @@
 			JDIDebugUIPlugin.statusDialog(new Status(IStatus.WARNING,JDIDebugUIPlugin.getUniqueIdentifier(),Messages.AllReferencesActionDelegate_0));
 		}
 	}
-	
+
 	/**
 	 * Compute an anchor based on selected item in the tree.
-	 * 
+	 *
 	 * @param view anchor view
 	 * @return anchor point
 	 */
@@ -81,7 +81,7 @@
 				return tree.toDisplay(new Point(bounds.x, bounds.y + bounds.height));
 			}
 		}
-		return control.toDisplay(0, 0);    	
+		return control.toDisplay(0, 0);
     }
 
 	/* (non-Javadoc)
@@ -104,7 +104,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.actions.ObjectActionDelegate#getPart()
 	 */
@@ -118,5 +118,5 @@
 		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesInViewActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesInViewActionDelegate.java
index 91cdc01..4ba698b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesInViewActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/AllReferencesInViewActionDelegate.java
@@ -31,14 +31,14 @@
 
 /**
  * Action delegate that turns on/off references being displayed as variables in the view.
- * 
+ *
  * @since 3.3
  */
 public class AllReferencesInViewActionDelegate implements IPreferenceChangeListener, IActionDelegate2, IViewActionDelegate {
 
 	private IAction fAction;
 	private IDebugView fView;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
@@ -54,7 +54,7 @@
 			}
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
 	 */
@@ -66,7 +66,7 @@
 		if(prefs != null) {
 			prefs.addPreferenceChangeListener(this);
 		}
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/InstanceCountActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/InstanceCountActionDelegate.java
index 73c644c..1dadd31 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/InstanceCountActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/InstanceCountActionDelegate.java
@@ -19,11 +19,11 @@
 
 /**
  * Action to display the instance count for a selected type.
- * 
+ *
  * @since 3.6
  */
 public class InstanceCountActionDelegate extends AllInstancesActionDelegate {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.heapwalking.AllInstancesActionDelegate#displayInstaces(org.eclipse.jdt.debug.core.IJavaDebugTarget, org.eclipse.jdt.internal.debug.core.model.JDIReferenceType)
 	 */
@@ -36,7 +36,7 @@
 			report(Messages.AllInstancesActionDelegate_0,getPart());
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.heapwalking.AllInstancesActionDelegate#displayNoInstances(org.eclipse.jdt.debug.core.IJavaDebugTarget, java.lang.String)
 	 */
@@ -44,10 +44,10 @@
 	protected void displayNoInstances(IJavaDebugTarget target, String typeName) {
 		displayNumInstances(typeName, 0);
 	}
-	
+
 	/**
 	 * Displays a message dialog with the number of instances.
-	 * 
+	 *
 	 * @param typeName type name
 	 * @param instanceCount number of instances
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/JavaWatchExpressionFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/JavaWatchExpressionFilter.java
index d5dfb59..17d88d1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/JavaWatchExpressionFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/JavaWatchExpressionFilter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,9 +23,9 @@
 /**
  * Uses the <code>IWatchExpressionFactoryAdapterExtension</code> to filter when the watch expression
  * action is available based on the variable selected.
- * 
+ *
  * Currently removes the action from <code>JDIPlaceholderVariable</code>s and <code>JDIReferenceListVariable</code>s.
- * 
+ *
  * @since 3.3
  */
 public class JavaWatchExpressionFilter implements IWatchExpressionFactoryAdapterExtension {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/Messages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/Messages.java
index fa5f51a..2c2b86f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/Messages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/heapwalking/Messages.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 	public static String AllInstancesActionDelegate_0;
 	public static String AllInstancesActionDelegate_2;
 	public static String AllInstancesActionDelegate_3;
-	
+
 	public static String AllReferencesActionDelegate_0;
 	public static String AllReferencesActionDelegate_1;
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/AddVMInstallWizard.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/AddVMInstallWizard.java
index 6ac65fa..99ee7a3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/AddVMInstallWizard.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/AddVMInstallWizard.java
@@ -19,14 +19,14 @@
  * @since 3.3
  */
 public class AddVMInstallWizard extends VMInstallWizard {
-	
+
 	private IWizardPage fTypePage = null;
-	
+
 	private VMStandin fResult = null;
 
 	/**
 	 * Constructs a wizard to add a new VM install.
-	 * 
+	 *
 	 * @param currentInstalls currently existing VMs, used for name validation
 	 */
 	public AddVMInstallWizard(IVMInstall[] currentInstalls) {
@@ -76,6 +76,6 @@
 		return false;
 	}
 
-	
-	
+
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EEVMPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EEVMPage.java
index 8be24e4..5b47db7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EEVMPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EEVMPage.java
@@ -47,11 +47,11 @@
 
 /**
  * Page used to edit an 'EE' VM.
- * 
+ *
  * @since 3.3
  */
 public class EEVMPage extends AbstractVMInstallPage {
-	
+
 	// VM being edited or created
 	private VMStandin fVM;
 	private Text fVMName;
@@ -60,9 +60,9 @@
 	private VMLibraryBlock fLibraryBlock;
 	private IStatus[] fFieldStatus = new IStatus[1];
 	private boolean fIgnoreCallbacks = false;
-	
+
 	/**
-	 * 
+	 *
 	 */
 	public EEVMPage() {
 		super(JREMessages.EEVMPage_0);
@@ -70,14 +70,14 @@
 			fFieldStatus[i] = Status.OK_STATUS;
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return JavaDebugImages.get(JavaDebugImages.IMG_WIZBAN_LIBRARY);
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
@@ -90,7 +90,7 @@
 		layout.numColumns = 3;
 		composite.setLayout(layout);
 		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
+
 	// VM location
 		SWTFactory.createLabel(composite, JREMessages.EEVMPage_1, 1);
 		fEEFile = SWTFactory.createSingleText(composite, 1);
@@ -113,7 +113,7 @@
 		gd = (GridData) variables.getLayoutData();
 		gd.horizontalSpan = 3;
 		gd.horizontalAlignment = GridData.END;
-	//VM libraries block 
+	//VM libraries block
 		SWTFactory.createLabel(composite, JREMessages.AddVMDialog_JRE_system_libraries__1, 3);
 		fLibraryBlock = new VMLibraryBlock();
 		fLibraryBlock.setWizard(getWizard());
@@ -122,7 +122,7 @@
 		gd = new GridData(GridData.FILL_BOTH);
 		gd.horizontalSpan = 3;
 		libControl.setLayoutData(gd);
-		
+
 		initializeFields();
 	//add the listeners now to prevent them from monkeying with initialized settings
 		fVMName.addModifyListener(new ModifyListener() {
@@ -153,7 +153,7 @@
 				if (file != null && file.isFile()) {
 					text = file.getParentFile().getAbsolutePath();
 				}
-				dialog.setFileName(text); 
+				dialog.setFileName(text);
 				String newPath = dialog.open();
 				if (newPath != null) {
 					fEEFile.setText(newPath);
@@ -171,12 +171,12 @@
 					}
 				}
 			}
-		});		
+		});
 		Dialog.applyDialogFont(composite);
 		setControl(composite);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.EDIT_JRE_EE_FILE_WIZARD_PAGE);	
-	}	
-	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.EDIT_JRE_EE_FILE_WIZARD_PAGE);
+	}
+
 	/**
 	 * Validates the JRE location
 	 * @return the status after validating the JRE location
@@ -185,11 +185,11 @@
 		String locationName = fEEFile.getText();
 		IStatus s = null;
 		if (locationName.length() == 0) {
-			s = new StatusInfo(IStatus.WARNING, JREMessages.EEVMPage_4); 
+			s = new StatusInfo(IStatus.WARNING, JREMessages.EEVMPage_4);
 		}  else {
 			final File file = new File(locationName);
 			if (!file.exists()) {
-				s = new StatusInfo(IStatus.ERROR, JREMessages.EEVMPage_5); 
+				s = new StatusInfo(IStatus.ERROR, JREMessages.EEVMPage_5);
 			} else {
 				final IStatus[] temp = new IStatus[1];
 				final VMStandin[] standin = new VMStandin[1];
@@ -221,14 +221,14 @@
 		updatePageStatus();
 		return s;
 	}
-	
+
 	/**
 	 * Validates the entered name of the VM
 	 */
 	private void validateVMName() {
 		nameChanged(fVMName.getText());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.AbstractVMInstallPage#finish()
 	 */
@@ -246,7 +246,7 @@
 	public VMStandin getSelection() {
 		return fVM;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.AbstractVMInstallPage#setSelection(org.eclipse.jdt.launching.VMStandin)
 	 */
@@ -257,7 +257,7 @@
 		setTitle(JREMessages.EEVMPage_6);
 		setDescription(JREMessages.EEVMPage_7);
 	}
-	
+
 	/**
 	 * initialize fields to the specified VM
 	 * @param vm the VM to initialize from
@@ -266,16 +266,16 @@
 		vm.setName(fVMName.getText());
 		String argString = fVMArgs.getText().trim();
 		if (argString != null && argString.length() > 0) {
-			vm.setVMArgs(argString);			
+			vm.setVMArgs(argString);
 		} else {
 			vm.setVMArgs(null);
 		}
 	}
-	
+
 	/**
 	 * Returns the definition file from the text control or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @return definition file or <code>null</code>
 	 */
 	private File getDefinitionFile() {
@@ -285,7 +285,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Creates a unique name for the VMInstallType
 	 * @param vmType the vm install type
@@ -297,8 +297,8 @@
 			id = String.valueOf(System.currentTimeMillis());
 		} while (vmType.findVMInstall(id) != null);
 		return id;
-	}	
-	
+	}
+
 	/**
 	 * Initialize the dialogs fields
 	 */
@@ -321,11 +321,11 @@
 		} finally {
 			fIgnoreCallbacks = false;
 		}
-	}	
-	
+	}
+
 	/**
 	 * Sets the status of the definition file.
-	 * 
+	 *
 	 * @param status definition file status
 	 */
 	private void setDefinitionFileStatus(IStatus status) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EditVMInstallWizard.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EditVMInstallWizard.java
index c315874..efa86d6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EditVMInstallWizard.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/EditVMInstallWizard.java
@@ -18,12 +18,12 @@
  * @since 3.3
  */
 public class EditVMInstallWizard extends VMInstallWizard {
-	
+
 	private AbstractVMInstallPage fEditPage;
-	
+
 	/**
 	 * Constructs a wizard to edit the given vm.
-	 * 
+	 *
 	 * @param vm vm to edit
 	 * @param allVMs all VMs being edited
 	 */
@@ -61,5 +61,5 @@
 		return fEditPage.getSelection();
 	}
 
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsLabelProvider.java
index ba182a2..999ffa9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
  * @since 3.2
  */
 public class ExecutionEnvironmentsLabelProvider extends LabelProvider {
-	
+
 	/**
 	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsPreferencePage.java
index b2c8904..5a39b00 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/ExecutionEnvironmentsPreferencePage.java
@@ -45,27 +45,27 @@
 
 /**
  * Sets default VM per execution environment.
- * 
+ *
  * @since 3.2
  */
 public class ExecutionEnvironmentsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-	
+
 	/**
-	 * The ID of the page 
-	 * 
+	 * The ID of the page
+	 *
 	 * @since 3.5
 	 */
 	public static final String ID = "org.eclipse.jdt.debug.ui.jreProfiles"; //$NON-NLS-1$
-	
+
 	private TableViewer fProfilesViewer;
 	private CheckboxTableViewer fJREsViewer;
 	private Text fDescription;
-	
+
 	/**
-	 * Working copy "EE Profile -> Default JRE" 
+	 * Working copy "EE Profile -> Default JRE"
 	 */
-	private Map<Object, Object> fDefaults = new HashMap<Object, Object>();
-	
+	private Map<Object, Object> fDefaults = new HashMap<>();
+
 	class JREsContentProvider implements IStructuredContentProvider {
 
 		/* (non-Javadoc)
@@ -89,14 +89,14 @@
 		@Override
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
-		
+
 	}
-															
+
 	public ExecutionEnvironmentsPreferencePage() {
 		super();
 		// only used when page is shown programatically
-		setTitle(JREMessages.JREProfilesPreferencePage_0);	 
-		setDescription(JREMessages.JREProfilesPreferencePage_1); 
+		setTitle(JREMessages.JREProfilesPreferencePage_0);
+		setDescription(JREMessages.JREProfilesPreferencePage_1);
 	}
 
 	/* (non-Javadoc)
@@ -105,10 +105,10 @@
 	@Override
 	public void init(IWorkbench workbench) {
 	}
-	
+
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jface.dialogs.DialogPage(boolean)
 	 */
 	@Override
@@ -150,7 +150,7 @@
 		noDefaultAndApplyButton();
 		// TODO: fix help
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(ancestor, IJavaDebugHelpContextIds.JRE_PROFILES_PAGE);
-		
+
 		// init default mappings
 		IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
 		IExecutionEnvironment[] environments = manager.getExecutionEnvironments();
@@ -161,7 +161,7 @@
 				fDefaults.put(environment, install);
 			}
 		}
-		
+
 		Composite container = new Composite(ancestor, SWT.NONE);
 		GridLayout layout = new GridLayout();
 		layout.numColumns = 2;
@@ -172,18 +172,18 @@
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		container.setLayoutData(gd);
 		container.setFont(ancestor.getFont());
-		
+
 		Composite eeContainer = new Composite(container, SWT.NONE);
 		layout = new GridLayout();
 		layout.marginWidth = 0;
 		eeContainer.setLayout(layout);
 		eeContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
+
 		Label label = new Label(eeContainer, SWT.NONE);
 		label.setFont(ancestor.getFont());
 		label.setText(JREMessages.JREProfilesPreferencePage_2);
 		label.setLayoutData(new GridData(SWT.FILL, 0, true, false));
-		
+
 		Table table= new Table(eeContainer, SWT.BORDER | SWT.SINGLE);
 		table.setLayout(layout);
 		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
@@ -191,48 +191,48 @@
 		fProfilesViewer.setContentProvider(new ArrayContentProvider());
 		fProfilesViewer.setLabelProvider(new ExecutionEnvironmentsLabelProvider());
 		fProfilesViewer.setInput(JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments());
-		
+
 		Composite jreContainer = new Composite(container, SWT.NONE);
 		layout = new GridLayout();
 		layout.marginWidth = 0;
 		jreContainer.setLayout(layout);
 		jreContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
+
 		label = new Label(jreContainer, SWT.NONE);
 		label.setFont(ancestor.getFont());
 		label.setText(JREMessages.JREProfilesPreferencePage_3);
 		label.setLayoutData(new GridData(SWT.FILL, 0, true, false));
-	
+
 		table= new Table(jreContainer, SWT.CHECK | SWT.BORDER | SWT.SINGLE);
 		table.setLayout(layout);
 		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 		fJREsViewer = new CheckboxTableViewer(table);
 		fJREsViewer.setContentProvider(new JREsContentProvider());
-		fJREsViewer.setLabelProvider(new JREsEnvironmentLabelProvider(new JREsEnvironmentLabelProvider.IExecutionEnvironmentProvider() {		
+		fJREsViewer.setLabelProvider(new JREsEnvironmentLabelProvider(new JREsEnvironmentLabelProvider.IExecutionEnvironmentProvider() {
 			@Override
 			public IExecutionEnvironment getEnvironment() {
 				return (IExecutionEnvironment) fJREsViewer.getInput();
 			}
 		}));
 		fJREsViewer.setComparator(new JREsEnvironmentComparator());
-		
+
 		label = new Label(container, SWT.NONE);
 		label.setFont(ancestor.getFont());
 		label.setText(JREMessages.JREProfilesPreferencePage_4);
 		label.setLayoutData(new GridData(SWT.FILL, 0, true, false, 2, 1));
-		
+
 		Text text = new Text(container, SWT.READ_ONLY | SWT.WRAP | SWT.BORDER);
 		text.setFont(ancestor.getFont());
 		text.setLayoutData(new GridData(SWT.FILL, 0, true, false, 2, 1));
 		fDescription = text;
-					
+
 		fProfilesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
 			@Override
 			public void selectionChanged(SelectionChangedEvent event) {
 				handleEESelectionAndJREViewer((IStructuredSelection) event.getSelection());
 			}
 		});
-		
+
 		fJREsViewer.addCheckStateListener(new ICheckStateListener() {
 			@Override
 			public void checkStateChanged(CheckStateChangedEvent event) {
@@ -243,14 +243,14 @@
 				} else {
 					fDefaults.remove(fJREsViewer.getInput());
 				}
-		
+
 			}
 		});
-		
+
 		Dialog.applyDialogFont(ancestor);
 		return ancestor;
 	}
-			
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
 	 */
@@ -270,6 +270,6 @@
 			environment.setDefaultVM(vm);
 		}
 		return super.performOk();
-	}	
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/IAddVMDialogRequestor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/IAddVMDialogRequestor.java
index 0ba0672..06adf46 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/IAddVMDialogRequestor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/IAddVMDialogRequestor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,17 +21,17 @@
 	/**
 	 * Reply whether or not a new VM of the specified name would
 	 * constitute a duplicate.
-	 * 
+	 *
 	 * @param name the name of a potential new VM
 	 * @return whether a new VM with the specified name would be a duplicate VM
 	 */
 	public boolean isDuplicateName(String name);
-	
+
 	/**
 	 * Notification that a VM has been added from the <code>AddVMDialog</code>.
-	 * 
+	 *
 	 * @param vm the added vm
 	 */
 	public void vmAdded(IVMInstall vm);
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/InstalledJREsBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/InstalledJREsBlock.java
index 3bf7111..8929723 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/InstalledJREsBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/InstalledJREsBlock.java
@@ -88,7 +88,7 @@
 import org.eclipse.swt.widgets.TableColumn;
 
 /**
- * A composite that displays installed JRE's in a table. JREs can be 
+ * A composite that displays installed JRE's in a table. JREs can be
  * added, removed, edited, and searched for.
  * <p>
  * This block implements ISelectionProvider - it sends selection change events
@@ -97,10 +97,10 @@
  * </p>
  */
 public class InstalledJREsBlock implements IAddVMDialogRequestor, ISelectionProvider {
-	
+
 	/**
 	 * A listener to know if another page has added a VM install
-	 * 
+	 *
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=237709
 	 * @since 3.6.300
 	 */
@@ -140,7 +140,7 @@
 		public void vmRemoved(IVMInstall vm) {
 			//do nothing, we do not want other bundles removing VM installs without user interaction
 		}
-		
+
 		/**
 		 * Refreshes the VM listing after a VM install notification, might not happen on the UI thread
 		 */
@@ -159,67 +159,67 @@
 			}
 		}
 	}
-	
+
 	/**
-	 * Listener for VM changes while the page is open, to ensure we have the latest set 
+	 * Listener for VM changes while the page is open, to ensure we have the latest set
 	 * of {@link IVMInstall}s at all times
-	 * 
+	 *
 	 * @since 3.6.300
 	 */
 	IVMInstallChangedListener fListener = new InstallListener();
-	
+
 	/**
 	 * This block's control
 	 */
 	private Composite fControl;
-	
+
 	/**
 	 * VMs being displayed
 	 */
-	private List<IVMInstall> fVMs = new ArrayList<IVMInstall>(); 
-	
+	private List<IVMInstall> fVMs = new ArrayList<>();
+
 	/**
 	 * The main list control
-	 */ 
+	 */
 	private CheckboxTableViewer fVMList;
-	
+
 	// Action buttons
 	private Button fAddButton;
 	private Button fRemoveButton;
 	private Button fEditButton;
 	private Button fCopyButton;
-	private Button fSearchButton;	
-    
+	private Button fSearchButton;
+
 	// index of column used for sorting
 	private int fSortColumn = 0;
-	
+
 	/**
 	 * Selection listeners (checked JRE changes)
 	 */
 	private ListenerList<ISelectionChangedListener> fSelectionListeners = new ListenerList<>();
-	
+
 	/**
 	 * Previous selection
 	 */
 	private ISelection fPrevSelection = new StructuredSelection();
 
     private Table fTable;
-			
+
 	// Make sure that VMStandin ids are unique if multiple calls to System.currentTimeMillis()
 	// happen very quickly
-	private static String fgLastUsedID;	
-	
+	private static String fgLastUsedID;
+
 	/**
 	 * VM install type id for OSX VMs
 	 */
 	public static final String MACOSX_VM_TYPE_ID = "org.eclipse.jdt.internal.launching.macosx.MacOSXType"; //$NON-NLS-1$
-	
+
 	private String fVMListTimeStamp;
 
-	/** 
+	/**
 	 * Content provider to show a list of JREs
-	 */ 
-	class JREsContentProvider implements IStructuredContentProvider {		
+	 */
+	class JREsContentProvider implements IStructuredContentProvider {
 		@Override
 		public Object[] getElements(Object input) {
 			return fVMs.toArray();
@@ -231,14 +231,14 @@
 		public void dispose() {
 		}
 	}
-	
+
 	/**
 	 * Label provider for installed JREs table.
 	 */
 	class VMLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider, IColorProvider {
 
 		Font bold = null;
-		
+
 		/**
 		 * @see ITableLabelProvider#getColumnText(Object, int)
 		 */
@@ -257,8 +257,8 @@
 						return vm.getName();
 					case 1:
 						return vm.getInstallLocation().getAbsolutePath();
-					case 2: 
-						return vm.getVMInstallType().getName();						
+					case 2:
+						return vm.getVMInstallType().getName();
 				}
 			}
 			return element.toString();
@@ -292,7 +292,7 @@
 			}
 			return null;
 		}
-		
+
 		@Override
 		public void dispose() {
 			if(bold != null) {
@@ -318,7 +318,7 @@
 			}
 			return null;
 		}
-		
+
 		boolean isUnmodifiable(Object element) {
 			if(element instanceof IVMInstall) {
 				IVMInstall vm = (IVMInstall) element;
@@ -327,8 +327,8 @@
 			return false;
 		}
 
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
 	 */
@@ -376,7 +376,7 @@
 
 	/**
 	 * Creates this block's control in the given control.
-	 * 
+	 *
 	 * @param ancestor containing control
 	 * @param useManageButton whether to present a single 'manage...' button to
 	 *  the user that opens the installed JREs pref page for JRE management,
@@ -385,10 +385,10 @@
 	public void createControl(Composite ancestor) {
 		Font font = ancestor.getFont();
 		Composite parent= SWTFactory.createComposite(ancestor, font, 2, 1, GridData.FILL_BOTH);
-		fControl = parent;	
-				
+		fControl = parent;
+
 		SWTFactory.createLabel(parent, JREMessages.InstalledJREsBlock_15, 2);
-				
+
 		fTable= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		gd.heightHint = 250;
@@ -396,10 +396,10 @@
 		fTable.setLayoutData(gd);
 		fTable.setFont(font);
 		fTable.setHeaderVisible(true);
-		fTable.setLinesVisible(true);	
+		fTable.setLinesVisible(true);
 
 		TableColumn column = new TableColumn(fTable, SWT.NULL);
-		column.setText(JREMessages.InstalledJREsBlock_0); 
+		column.setText(JREMessages.InstalledJREsBlock_0);
 		column.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -409,9 +409,9 @@
 		});
 		int defaultwidth = 350/3 +1;
 		column.setWidth(defaultwidth);
-	
+
 		column = new TableColumn(fTable, SWT.NULL);
-		column.setText(JREMessages.InstalledJREsBlock_1); 
+		column.setText(JREMessages.InstalledJREsBlock_1);
 		column.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -420,9 +420,9 @@
 			}
 		});
 		column.setWidth(defaultwidth);
-		
+
 		column = new TableColumn(fTable, SWT.NULL);
-		column.setText(JREMessages.InstalledJREsBlock_2); 
+		column.setText(JREMessages.InstalledJREsBlock_2);
 		column.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -431,21 +431,21 @@
 			}
 		});
 		column.setWidth(defaultwidth);
-		
-		fVMList = new CheckboxTableViewer(fTable);			
+
+		fVMList = new CheckboxTableViewer(fTable);
 		fVMList.setLabelProvider(new VMLabelProvider());
 		fVMList.setContentProvider(new JREsContentProvider());
 		fVMList.setUseHashlookup(true);
 		// by default, sort by name
 		sortByName();
-		
+
 		fVMList.addSelectionChangedListener(new ISelectionChangedListener() {
 			@Override
 			public void selectionChanged(SelectionChangedEvent evt) {
 				enableButtons();
 			}
 		});
-		
+
 		fVMList.addCheckStateListener(new ICheckStateListener() {
 			@Override
 			public void checkStateChanged(CheckStateChangedEvent event) {
@@ -456,7 +456,7 @@
 				}
 			}
 		});
-		
+
 		fVMList.addDoubleClickListener(new IDoubleClickListener() {
 			@Override
 			public void doubleClick(DoubleClickEvent e) {
@@ -474,68 +474,68 @@
 					}
 				}
 			}
-		});	
-		
+		});
+
 		Composite buttons = SWTFactory.createComposite(parent, font, 1, 1, GridData.VERTICAL_ALIGN_BEGINNING, 0, 0);
-		
-		fAddButton = SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_3, null); 
+
+		fAddButton = SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_3, null);
 		fAddButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event evt) {
 				addVM();
 			}
 		});
-		
-		fEditButton= SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_4, null); 
+
+		fEditButton= SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_4, null);
 		fEditButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event evt) {
 				editVM();
 			}
 		});
-		
-		fCopyButton = SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_16, null); 
+
+		fCopyButton = SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_16, null);
 		fCopyButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event evt) {
 				copyVM();
 			}
 		});
-		
-		fRemoveButton= SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_5, null); 
+
+		fRemoveButton= SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_5, null);
 		fRemoveButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event evt) {
 				removeVMs();
 			}
 		});
-		
+
 		SWTFactory.createVerticalSpacer(parent, 1);
-		
-		fSearchButton = SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_6, null); 
+
+		fSearchButton = SWTFactory.createPushButton(buttons, JREMessages.InstalledJREsBlock_6, null);
 		fSearchButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event evt) {
 				search();
 			}
-		});		
-		
+		});
+
 		fillWithWorkspaceJREs();
 		enableButtons();
 		fAddButton.setEnabled(JavaRuntime.getVMInstallTypes().length > 0);
-		
+
 		JavaRuntime.addVMInstallChangedListener(fListener);
 	}
-	
+
 	/**
-	 * Adds a duplicate of the selected VM to the block 
+	 * Adds a duplicate of the selected VM to the block
 	 * @since 3.2
 	 */
 	protected void copyVM() {
         IStructuredSelection selection = (IStructuredSelection) fVMList.getSelection();
         Iterator<IVMInstall> it = selection.iterator();
 
-        ArrayList<VMStandin> newEntries = new ArrayList<VMStandin>();
+        ArrayList<VMStandin> newEntries = new ArrayList<>();
         while (it.hasNext()) {
             IVMInstall selectedVM = it.next();
             // duplicate & add VM
@@ -565,9 +565,9 @@
     }
 
 	/**
-	 * Compares the given name against current names and adds the appropriate numerical 
+	 * Compares the given name against current names and adds the appropriate numerical
 	 * suffix to ensure that it is unique.
-	 * @param name the name with which to ensure uniqueness 
+	 * @param name the name with which to ensure uniqueness
 	 * @return the unique version of the given name
 	 * @since 3.2
 	 */
@@ -585,7 +585,7 @@
             }
             return generateName(name + " (1)"); //$NON-NLS-1$
         }
-	
+
 	/**
 	 * Fire current selection
 	 */
@@ -593,7 +593,7 @@
 		SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
 		for (ISelectionChangedListener listener : fSelectionListeners) {
 			listener.selectionChanged(event);
-		}	
+		}
 	}
 
 	/**
@@ -616,15 +616,15 @@
 				}
 				return super.compare(viewer, e1, e2);
 			}
-			
+
 			@Override
 			public boolean isSorterProperty(Object element, String property) {
 				return true;
 			}
-		});	
-		fSortColumn = 3;			
+		});
+		fSortColumn = 3;
 	}
-	
+
 	/**
 	 * Sorts by VM name.
 	 */
@@ -639,15 +639,15 @@
 				}
 				return super.compare(viewer, e1, e2);
 			}
-			
+
 			@Override
 			public boolean isSorterProperty(Object element, String property) {
 				return true;
 			}
-		});		
-		fSortColumn = 1;		
+		});
+		fSortColumn = 1;
 	}
-	
+
 	/**
 	 * Sorts by VM location.
 	 */
@@ -662,15 +662,15 @@
 				}
 				return super.compare(viewer, e1, e2);
 			}
-			
+
 			@Override
 			public boolean isSorterProperty(Object element, String property) {
 				return true;
 			}
-		});		
-		fSortColumn = 2;		
+		});
+		fSortColumn = 2;
 	}
-		
+
 	/**
 	 * Enables the buttons based on selected items counts in the viewer
 	 */
@@ -692,20 +692,20 @@
 		} else {
 			fRemoveButton.setEnabled(false);
 		}
-	}	
-	
+	}
+
 	/**
 	 * Returns this block's control
-	 * 
+	 *
 	 * @return control
 	 */
 	public Control getControl() {
 		return fControl;
 	}
-	
+
 	/**
 	 * Sets the JREs to be displayed in this block
-	 * 
+	 *
 	 * @param vms JREs to be displayed
 	 */
 	protected void setJREs(IVMInstall[] vms) {
@@ -716,16 +716,16 @@
 		fVMList.setInput(fVMs);
 		fVMList.refresh();
 	}
-	
+
 	/**
 	 * Returns the JREs currently being displayed in this block
-	 * 
+	 *
 	 * @return JREs currently being displayed in this block
 	 */
 	public IVMInstall[] getJREs() {
 		return fVMs.toArray(new IVMInstall[fVMs.size()]);
 	}
-	
+
 	/**
 	 * Bring up a wizard that lets the user create a new VM definition.
 	 */
@@ -744,7 +744,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * @see IAddVMDialogRequestor#vmAdded(IVMInstall)
 	 */
@@ -761,7 +761,7 @@
 			fireSelectionChanged();
 		}
 	}
-	
+
 	/**
 	 * @see IAddVMDialogRequestor#isDuplicateName(String)
 	 */
@@ -774,8 +774,8 @@
 			}
 		}
 		return false;
-	}	
-	
+	}
+
 	/**
 	 * Performs the edit VM action when the Edit... button is pressed
 	 */
@@ -804,7 +804,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Performs the remove VM(s) action when the Remove... button is pressed
 	 */
@@ -818,11 +818,11 @@
 			i++;
 		}
 		removeJREs(vms);
-	}	
-	
+	}
+
 	/**
 	 * Removes the given VMs from the table.
-	 * 
+	 *
 	 * @param vms
 	 */
 	public void removeJREs(IVMInstall[] vms) {
@@ -843,7 +843,7 @@
 		}
 		fVMList.refresh(true);
 	}
-	
+
 	/**
 	 * Search for installed VMs in the file system
 	 */
@@ -852,35 +852,35 @@
 			doMacSearch();
 			return;
 		}
-		// choose a root directory for the search 
+		// choose a root directory for the search
 		DirectoryDialog dialog = new DirectoryDialog(getShell());
-		dialog.setMessage(JREMessages.InstalledJREsBlock_9); 
-		dialog.setText(JREMessages.InstalledJREsBlock_10); 
+		dialog.setMessage(JREMessages.InstalledJREsBlock_9);
+		dialog.setText(JREMessages.InstalledJREsBlock_10);
 		String path = dialog.open();
 		if (path == null) {
 			return;
 		}
-		
+
 		// ignore installed locations
-		final Set<File> exstingLocations = new HashSet<File>();
+		final Set<File> exstingLocations = new HashSet<>();
 		for (IVMInstall vm : fVMs) {
 			exstingLocations.add(vm.getInstallLocation());
 		}
-		
+
 		// search
 		final File rootDir = new File(path);
-		final List<File> locations = new ArrayList<File>();
-		final List<IVMInstallType> types = new ArrayList<IVMInstallType>();
+		final List<File> locations = new ArrayList<>();
+		final List<IVMInstallType> types = new ArrayList<>();
 
 		IRunnableWithProgress r = new IRunnableWithProgress() {
 			@Override
 			public void run(IProgressMonitor monitor) {
-				monitor.beginTask(JREMessages.InstalledJREsBlock_11, IProgressMonitor.UNKNOWN); 
+				monitor.beginTask(JREMessages.InstalledJREsBlock_11, IProgressMonitor.UNKNOWN);
 				search(rootDir, locations, types, exstingLocations, monitor);
 				monitor.done();
 			}
 		};
-		
+
 		try {
             ProgressMonitorDialog progress = new ProgressMonitorDialog(getShell()) {
                 /*
@@ -906,10 +906,10 @@
 			// canceled
 			return;
 		}
-		
+
 		if (locations.isEmpty()) {
 			String messagePath = path.replaceAll("&", "&&"); // @see bug 29855  //$NON-NLS-1$//$NON-NLS-2$
-			MessageDialog.openInformation(getShell(), JREMessages.InstalledJREsBlock_12, NLS.bind(JREMessages.InstalledJREsBlock_13, new String[]{messagePath})); // 
+			MessageDialog.openInformation(getShell(), JREMessages.InstalledJREsBlock_12, NLS.bind(JREMessages.InstalledJREsBlock_13, new String[]{messagePath})); //
 		} else {
 			Iterator<IVMInstallType> iter2 = types.iterator();
 			for(File location: locations) {
@@ -919,7 +919,7 @@
 				String nameCopy = new String(name);
 				int i = 1;
 				while (isDuplicateName(nameCopy)) {
-					nameCopy = name + '(' + i++ + ')'; 
+					nameCopy = name + '(' + i++ + ')';
 				}
 				vm.setName(nameCopy);
 				vm.setInstallLocation(location);
@@ -933,17 +933,17 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Calls out to {@link MacVMSearch} to find all installed JREs in the standard
 	 * Mac OS location
 	 */
 	private void doMacSearch() {
-		final List<VMStandin> added = new ArrayList<VMStandin>();
+		final List<VMStandin> added = new ArrayList<>();
 		IRunnableWithProgress r = new IRunnableWithProgress() {
 			@Override
 			public void run(IProgressMonitor monitor) throws InvocationTargetException {
-				Set<String> exists = new HashSet<String>();
+				Set<String> exists = new HashSet<>();
 				for (IVMInstall vm : fVMs) {
 					exists.add(vm.getId());
 				}
@@ -963,7 +963,7 @@
 				monitor.done();
 			}
 		};
-		
+
 		try {
             ProgressMonitorDialog progress = new ProgressMonitorDialog(getShell());
             progress.run(true, true, r);
@@ -993,13 +993,13 @@
 		} while (vmType.findVMInstall(id) != null || id.equals(fgLastUsedID));
 		fgLastUsedID = id;
 		return id;
-	}	
-	
+	}
+
 	/**
 	 * Searches the specified directory recursively for installed VMs, adding each
 	 * detected VM to the <code>found</code> list. Any directories specified in
 	 * the <code>ignore</code> are not traversed.
-	 * 
+	 *
 	 * @param directory
 	 * @param found
 	 * @param types
@@ -1014,7 +1014,7 @@
 		if (names == null) {
 			return;
 		}
-		List<File> subDirs = new ArrayList<File>();
+		List<File> subDirs = new ArrayList<>();
 		for (int i = 0; i < names.length; i++) {
 			if (monitor.isCanceled()) {
 				return;
@@ -1024,12 +1024,12 @@
 				monitor.subTask(NLS.bind(JREMessages.InstalledJREsBlock_14, new String[]{Integer.toString(found.size()),
 						file.getCanonicalPath().replaceAll("&", "&&")}));   // @see bug 29855 //$NON-NLS-1$ //$NON-NLS-2$
 			} catch (IOException e) {
-			}		
-			IVMInstallType[] vmTypes = JavaRuntime.getVMInstallTypes();	
+			}
+			IVMInstallType[] vmTypes = JavaRuntime.getVMInstallTypes();
 			if (file.isDirectory()) {
 				if (!ignore.contains(file)) {
 					boolean validLocation = false;
-					
+
 					// Take the first VM install type that claims the location as a
 					// valid VM install.  VM install types should be smart enough to not
 					// claim another type's VM, but just in case...
@@ -1059,12 +1059,12 @@
 				return;
 			}
 		}
-		
-	}	
-	
+
+	}
+
 	/**
 	 * Sets the checked JRE, possible <code>null</code>
-	 * 
+	 *
 	 * @param vm JRE or <code>null</code>
 	 */
 	public void setCheckedJRE(IVMInstall vm) {
@@ -1074,10 +1074,10 @@
 			setSelection(new StructuredSelection(vm));
 		}
 	}
-	
+
 	/**
 	 * Returns the checked JRE or <code>null</code> if none.
-	 * 
+	 *
 	 * @return the checked JRE or <code>null</code> if none
 	 */
 	public IVMInstall getCheckedJRE() {
@@ -1087,11 +1087,11 @@
 		}
 		return (IVMInstall)objects[0];
 	}
-	
+
 	/**
 	 * Persist table settings into the give dialog store, prefixed
 	 * with the given key.
-	 * 
+	 *
 	 * @param settings dialog store
 	 * @param qualifier key qualifier
 	 */
@@ -1102,11 +1102,11 @@
 		}
 		settings.put(qualifier + ".sortColumn", fSortColumn); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Restore table settings from the given dialog store using the
 	 * given key.
-	 * 
+	 *
 	 * @param settings dialog settings store
 	 * @param qualifier key to restore settings from
 	 */
@@ -1130,7 +1130,7 @@
 				break;
 		}
 	}
-	
+
 	/**
 	 * Restores the column widths from dialog settings
 	 * @param settings
@@ -1143,7 +1143,7 @@
             try {
                 width = settings.getInt(qualifier + ".columnWidth" + i); //$NON-NLS-1$
             } catch (NumberFormatException e) {}
-            
+
             if ((width <= 0) || (i == fTable.getColumnCount() - 1)) {
                 fTable.getColumn(i).pack();
             } else {
@@ -1151,13 +1151,13 @@
             }
         }
 	}
-	
+
 	/**
 	 * Populates the JRE table with existing JREs defined in the workspace.
 	 */
 	protected void fillWithWorkspaceJREs() {
 		// fill with JREs
-		List<VMStandin> standins = new ArrayList<VMStandin>();
+		List<VMStandin> standins = new ArrayList<>();
 		IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
 		for (int i = 0; i < types.length; i++) {
 			IVMInstallType type = types[i];
@@ -1167,11 +1167,11 @@
 				standins.add(new VMStandin(install));
 			}
 		}
-		setJREs(standins.toArray(new IVMInstall[standins.size()]));	
+		setJREs(standins.toArray(new IVMInstall[standins.size()]));
 	}
-	
+
 	/**
-	 * Initializes time stamp with current JRE page details 
+	 * Initializes time stamp with current JRE page details
 	 */
 	void initializeTimeStamp() {
 		fVMListTimeStamp = getEncodedVMInstalls();
@@ -1179,7 +1179,7 @@
 
 	/**
 	 * Disposes the block and any listeners
-	 * 
+	 *
 	 * @since 3.6.300
 	 */
 	public void dispose() {
@@ -1227,7 +1227,7 @@
 
 	/**
 	 * Checks if JRE block has changed.
-	 * 
+	 *
 	 * @return <code>true</code> if JRE block has changed, <code>false</code> otherwise
 	 */
 	public boolean hasChangesInDialog() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREContainerWizardPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREContainerWizardPage.java
index f9c3a6e..aa4644d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREContainerWizardPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREContainerWizardPage.java
@@ -30,22 +30,22 @@
  * Extension to allow a user to associate a JRE with a Java project.
  */
 public class JREContainerWizardPage extends WizardPage implements IClasspathContainerPage {
-	
+
 	/**
 	 * The classpath entry to be created.
 	 */
 	private IClasspathEntry fSelection;
-	
+
 	/**
 	 * JRE control
 	 */
 	private JREsComboBlock fJREBlock;
-	
+
 	/**
 	 * Constructs a new page.
 	 */
 	public JREContainerWizardPage() {
-		super(JREMessages.JREContainerWizardPage_JRE_System_Library_1); 
+		super(JREMessages.JREContainerWizardPage_JRE_System_Library_1);
 	}
 
 	/* (non-Javadoc)
@@ -54,7 +54,7 @@
 	@Override
 	public boolean finish() {
 		IPath path = fJREBlock.getPath();
-		fSelection = JavaCore.newContainerEntry(path);		
+		fSelection = JavaCore.newContainerEntry(path);
 		return true;
 	}
 
@@ -91,7 +91,7 @@
 			}
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
@@ -100,7 +100,7 @@
 		Composite composite = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
 		fJREBlock = new JREsComboBlock(false);
 		fJREBlock.setDefaultJREDescriptor(new BuildJREDescriptor());
-		fJREBlock.setTitle(JREMessages.JREContainerWizardPage_3); 
+		fJREBlock.setTitle(JREMessages.JREContainerWizardPage_3);
 		fJREBlock.createControl(composite);
 		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
 		fJREBlock.getControl().setLayoutData(gd);
@@ -116,10 +116,10 @@
 				}
 			}
 		});
-		
-		setTitle(JREMessages.JREContainerWizardPage_JRE_System_Library_1); 
-		setMessage(JREMessages.JREContainerWizardPage_4); 
-				
+
+		setTitle(JREMessages.JREContainerWizardPage_JRE_System_Library_1);
+		setMessage(JREMessages.JREContainerWizardPage_4);
+
 		initializeFromSelection();
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREDescriptor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREDescriptor.java
index 6614728..01d58b4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREDescriptor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREDescriptor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -12,16 +12,16 @@
 
 
 /**
- * Used to provide a description for JRE selections in the 
+ * Used to provide a description for JRE selections in the
  * installed JREs block.
  */
 public abstract class JREDescriptor {
 
 	/**
 	 * Returns a description of the JRE setting.
-	 * 
+	 *
 	 * @return description of the JRE setting
 	 */
 	public abstract String getDescription();
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREMessages.java
index 5a79880..6e69bdf 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREMessages.java
@@ -4,10 +4,10 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *  IBM - Initial API and implementation
- *  Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *  Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.jres;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsComboBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsComboBlock.java
index 99c7c1f..2124c7b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsComboBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsComboBlock.java
@@ -57,42 +57,42 @@
  * </p>
  */
 public class JREsComboBlock {
-	
+
 	public static final String PROPERTY_JRE = "PROPERTY_JRE"; //$NON-NLS-1$
-	
+
 	/**
 	 * This block's control
 	 */
 	private Composite fControl;
-	
+
 	/**
 	 * VMs being displayed
 	 */
-	private List<Object> fVMs = new ArrayList<Object>(); 
-	
+	private List<Object> fVMs = new ArrayList<>();
+
 	/**
 	 * The main control
-	 */ 
+	 */
 	private Combo fCombo;
-	
+
 	// Action buttons
 	private Button fManageButton;
-		
+
 	/**
 	 * JRE change listeners
 	 */
 	private ListenerList<IPropertyChangeListener> fListeners = new ListenerList<>();
-	
+
 	/**
 	 * Whether the default JRE should be in first position (if <code>false</code>, it becomes last).
 	 */
 	private boolean fDefaultFirst;
-	
+
 	/**
 	 * Default JRE descriptor or <code>null</code> if none.
 	 */
 	private JREDescriptor fDefaultDescriptor = null;
-	
+
 	/**
 	 * Specific JRE descriptor or <code>null</code> if none.
 	 */
@@ -102,44 +102,44 @@
 	 * Default JRE radio button or <code>null</code> if none
 	 */
 	private Button fDefaultButton = null;
-	
+
 	/**
 	 * Selected JRE radio button
 	 */
 	private Button fSpecificButton = null;
-	
+
 	/**
 	 * The title used for the JRE block
 	 */
 	private String fTitle = null;
-	
+
 	/**
 	 * Selected JRE profile radio button
 	 */
 	private Button fEnvironmentsButton = null;
-	
+
 	/**
 	 * Combo box of JRE profiles
 	 */
 	private Combo fEnvironmentsCombo = null;
-	
+
 	private Button fManageEnvironmentsButton = null;
-	
+
 	// a path to an unavailable JRE
 	private IPath fErrorPath;
-	
+
 	/**
 	 * List of execution environments
 	 */
-	private List<Object> fEnvironments = new ArrayList<Object>();
-	
+	private List<Object> fEnvironments = new ArrayList<>();
+
 	private IStatus fStatus = OK_STATUS;
-	
+
 	private static IStatus OK_STATUS = new Status(IStatus.OK, JDIDebugUIPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
 
 	/**
 	 * Creates a JREs combo block.
-	 * 
+	 *
 	 * @param defaultFirst whether the default JRE should be in first position (if <code>false</code>, it becomes last)
 	 */
 	public JREsComboBlock(boolean defaultFirst) {
@@ -149,31 +149,31 @@
 	public void addPropertyChangeListener(IPropertyChangeListener listener) {
 		fListeners.add(listener);
 	}
-	
+
 	public void removePropertyChangeListener(IPropertyChangeListener listener) {
 		fListeners.remove(listener);
 	}
-	
+
 	private void firePropertyChange() {
 		PropertyChangeEvent event = new PropertyChangeEvent(this, PROPERTY_JRE, null, getPath());
 		for (IPropertyChangeListener listener : fListeners) {
 			listener.propertyChange(event);
 		}
 	}
-	
+
 	/**
 	 * Creates this block's control in the given control.
-	 * 
+	 *
 	 * @param anscestor containing control
 	 */
 	public void createControl(Composite ancestor) {
-		fControl = SWTFactory.createComposite(ancestor, 1, 1, GridData.FILL_BOTH);		
+		fControl = SWTFactory.createComposite(ancestor, 1, 1, GridData.FILL_BOTH);
 		if (fTitle == null) {
-			fTitle = JREMessages.JREsComboBlock_3; 
+			fTitle = JREMessages.JREsComboBlock_3;
 		}
-		Group group = SWTFactory.createGroup(fControl, fTitle, 1, 1, GridData.FILL_HORIZONTAL); 
+		Group group = SWTFactory.createGroup(fControl, fTitle, 1, 1, GridData.FILL_HORIZONTAL);
 		Composite comp = SWTFactory.createComposite(group, group.getFont(), 3, 1, GridData.FILL_BOTH, 0, 0);
-		
+
 		if (fDefaultFirst) {
 			createDefaultJREControls(comp);
 		}
@@ -203,8 +203,8 @@
 					firePropertyChange();
 				}
 			}
-		});		
-		
+		});
+
 		fEnvironmentsCombo = SWTFactory.createCombo(comp, SWT.DROP_DOWN | SWT.READ_ONLY, 1, null);
 		fEnvironmentsCombo.addSelectionListener(new SelectionAdapter() {
 			@Override
@@ -212,16 +212,16 @@
 				setPath(JavaRuntime.newJREContainerPath(getEnvironment()));
 				firePropertyChange();
 			}
-		});		
-		
+		});
+
 		fManageEnvironmentsButton = SWTFactory.createPushButton(comp, JREMessages.JREsComboBlock_14, null);
 		fManageEnvironmentsButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event event) {
 				showPrefPage(ExecutionEnvironmentsPreferencePage.ID);
 			}
-		});		
-		
+		});
+
 		fillWithWorkspaceProfiles();
 	}
 
@@ -243,7 +243,7 @@
 						setError(JREMessages.JREsComboBlock_0);
 					} else {
 						setStatus(OK_STATUS);
-					}					
+					}
 					fEnvironmentsCombo.setEnabled(false);
 					firePropertyChange();
 				}
@@ -258,12 +258,12 @@
 				firePropertyChange();
 			}
 		});
-				
-		fManageButton = SWTFactory.createPushButton(comp, JREMessages.JREsComboBlock_2, null); 
+
+		fManageButton = SWTFactory.createPushButton(comp, JREMessages.JREsComboBlock_2, null);
 		fManageButton.addListener(SWT.Selection, new Listener() {
 			@Override
 			public void handleEvent(Event event) {
-				showPrefPage(JREsPreferencePage.ID); 
+				showPrefPage(JREsPreferencePage.ID);
 			}
 		});
 		fillWithWorkspaceJREs();
@@ -284,10 +284,10 @@
 			});
 		}
 	}
-	
+
 	/**
 	 * Opens the given preference page, and updates when closed.
-	 * 
+	 *
 	 * @param id pref page id
 	 * @param page pref page
 	 */
@@ -306,9 +306,9 @@
 			setUseDefaultJRE();
 		}
 		setPath(getPath());
-		firePropertyChange();		
+		firePropertyChange();
 	}
-	
+
 	private void restoreCombo(List<Object> elements, Object element, Combo combo) {
 		int index = -1;
 		if (element != null) {
@@ -320,19 +320,19 @@
 			combo.select(0);
 		}
 	}
-		
+
 	/**
 	 * Returns this block's control
-	 * 
+	 *
 	 * @return control
 	 */
 	public Control getControl() {
 		return fControl;
 	}
-	
+
 	/**
 	 * Sets the JREs to be displayed in this block
-	 * 
+	 *
 	 * @param vms JREs to be displayed
 	 */
 	protected void setJREs(List<VMStandin> jres) {
@@ -364,14 +364,14 @@
 		fCombo.setItems(names);
 		fCombo.setVisibleItemCount(Math.min(names.length, 20));
 	}
-	
+
 	protected Shell getShell() {
 		return getControl().getShell();
 	}
 
 	/**
 	 * Selects a specific JRE based on type/name.
-	 * 
+	 *
 	 * @param vm JRE or <code>null</code>
 	 */
 	private void selectJRE(IVMInstall vm) {
@@ -383,15 +383,15 @@
 		if (vm != null) {
 			int index = fVMs.indexOf(vm);
 			if (index >= 0) {
-				fCombo.select(index);		
+				fCombo.select(index);
 			}
 		}
 		firePropertyChange();
 	}
-	
+
 	/**
 	 * Selects a JRE based environment.
-	 * 
+	 *
 	 * @param env environment or <code>null</code>
 	 */
 	private void selectEnvironment(IExecutionEnvironment env) {
@@ -403,15 +403,15 @@
 		if (env != null) {
 			int index = fEnvironments.indexOf(env);
 			if (index >= 0) {
-				fEnvironmentsCombo.select(index);		
+				fEnvironmentsCombo.select(index);
 			}
 		}
 		firePropertyChange();
-	}	
-	
+	}
+
 	/**
 	 * Returns the selected JRE or <code>null</code> if none.
-	 * 
+	 *
 	 * @return the selected JRE or <code>null</code> if none
 	 */
 	public IVMInstall getJRE() {
@@ -421,10 +421,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the selected Environment or <code>null</code> if none.
-	 * 
+	 *
 	 * @return the selected Environment or <code>null</code> if none
 	 */
 	private IExecutionEnvironment getEnvironment() {
@@ -433,14 +433,14 @@
 			return (IExecutionEnvironment)fEnvironments.get(index);
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Populates the JRE table with existing JREs defined in the workspace.
 	 */
 	protected void fillWithWorkspaceJREs() {
 		// fill with JREs
-		List<VMStandin> standins = new ArrayList<VMStandin>();
+		List<VMStandin> standins = new ArrayList<>();
 		IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
 		for (int i = 0; i < types.length; i++) {
 			IVMInstallType type = types[i];
@@ -450,9 +450,9 @@
 				standins.add(new VMStandin(install));
 			}
 		}
-		setJREs(standins);	
+		setJREs(standins);
 	}
-	
+
 	/**
 	 * Populates the JRE profile combo with profiles defined in the workspace.
 	 */
@@ -479,18 +479,18 @@
 		}
 		fEnvironmentsCombo.setItems(names);
 		fEnvironmentsCombo.setVisibleItemCount(Math.min(names.length, 20));
-	}	
-	
+	}
+
 	/**
 	 * Sets the Default JRE Descriptor for this block.
-	 * 
+	 *
 	 * @param descriptor default JRE descriptor
 	 */
 	public void setDefaultJREDescriptor(JREDescriptor descriptor) {
 		fDefaultDescriptor = descriptor;
 		setButtonTextFromDescriptor(fDefaultButton, descriptor);
 	}
-	
+
 	private void setButtonTextFromDescriptor(Button button, JREDescriptor descriptor) {
 		if (button != null) {
 			//update the description & JRE in case it has changed
@@ -505,17 +505,17 @@
 
 	/**
 	 * Sets the specific JRE Descriptor for this block.
-	 * 
+	 *
 	 * @param descriptor specific JRE descriptor
 	 */
 	public void setSpecificJREDescriptor(JREDescriptor descriptor) {
 		fSpecificDescriptor = descriptor;
 		setButtonTextFromDescriptor(fSpecificButton, descriptor);
 	}
-	
+
 	/**
 	 * Returns whether the 'use default JRE' button is checked.
-	 * 
+	 *
 	 * @return whether the 'use default JRE' button is checked
 	 */
 	public boolean isDefaultJRE() {
@@ -524,7 +524,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Sets this control to use the 'default' JRE.
 	 */
@@ -538,11 +538,11 @@
 			firePropertyChange();
 		}
 	}
-	
+
 	/**
 	 * Sets the title used for this JRE block
-	 * 
-	 * @param title title for this JRE block 
+	 *
+	 * @param title title for this JRE block
 	 */
 	public void setTitle(String title) {
 		fTitle = title;
@@ -554,10 +554,10 @@
 	public void refresh() {
 		setDefaultJREDescriptor(fDefaultDescriptor);
 	}
-	
+
 	/**
 	 * Returns a classpath container path identifying the selected JRE.
-	 * 
+	 *
 	 * @return classpath container path or <code>null</code>
 	 * @since 3.2
 	 */
@@ -583,13 +583,13 @@
 		}
 		return JavaRuntime.newDefaultJREContainerPath();
 	}
-	
+
 	/**
 	 * Sets the selection based on the given container path and returns
 	 * a status indicating if the selection was successful.
-	 * 
+	 *
 	 * @param containerPath
-	 * @return status 
+	 * @return status
 	 */
 	public void setPath(IPath containerPath) {
 		fErrorPath = null;
@@ -637,29 +637,29 @@
 					selectJRE(install);
 					File location = install.getInstallLocation();
 					if (location == null) {
-						setError(JREMessages.JREsComboBlock_12); 
+						setError(JREMessages.JREsComboBlock_12);
 					} else if (!location.exists()) {
 						setError(JREMessages.JREsComboBlock_13);
-					}							
+					}
 				}
 			}
 		}
 	}
-	
+
 	private void setError(String message) {
 		setStatus(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(),
-				IJavaDebugUIConstants.INTERNAL_ERROR, message, null));		
+				IJavaDebugUIConstants.INTERNAL_ERROR, message, null));
 	}
-	
+
 	/**
 	 * Returns the status of the JRE selection.
-	 * 
+	 *
 	 * @return status
 	 */
 	public IStatus getStatus() {
 		return fStatus;
 	}
-	
+
 	private void setStatus(IStatus status) {
 		fStatus = status;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentComparator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentComparator.java
index c210b00..630f594 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentComparator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentComparator.java
@@ -17,11 +17,11 @@
 
 /**
  * Sorts execution environments.
- * 
+ *
  * @since 3.3
  */
 public class JREsEnvironmentComparator extends ViewerComparator {
-	
+
 	IExecutionEnvironment fEnvironment;
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentLabelProvider.java
index 098b818..5c1e312 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsEnvironmentLabelProvider.java
@@ -23,18 +23,18 @@
 
 /**
  * Decorates JREs to emphasize those that are strictly compatible with an environment.
- *  
+ *
  * @since 3.2
  *
  */
 public class JREsEnvironmentLabelProvider extends JREsLabelProvider implements IFontProvider {
-	
+
 	private IExecutionEnvironmentProvider fProvider;
 	private Font fFont = null;
-	
+
 	/**
 	 * Returns the current environment or <code>null</code> id none
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	public interface IExecutionEnvironmentProvider {
@@ -44,9 +44,9 @@
 	public JREsEnvironmentLabelProvider(IExecutionEnvironmentProvider provider) {
 		fProvider = provider;
 	}
-	
-	
-	
+
+
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.LabelProvider#dispose()
 	 */
@@ -68,15 +68,15 @@
 		String label = super.getText(element);
 		if (isStrictlyCompatible(element)) {
 			label = NLS.bind(JREMessages.JREsEnvironmentLabelProvider_0, new String[]{label, JREMessages.JREsEnvironmentLabelProvider_1});
-		}		
+		}
 		return label;
 	}
-	
+
 	private boolean isStrictlyCompatible(Object element) {
 		IExecutionEnvironment environment = fProvider.getEnvironment();
 		if (environment != null && element instanceof IVMInstall) {
 			return environment.isStrictlyCompatible((IVMInstall)element);
-		}	
+		}
 		return false;
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsLabelProvider.java
index 569f9b6..f0b8e80 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
  * @since 3.2
  */
 public class JREsLabelProvider extends LabelProvider {
-	
+
 	/**
 	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsPreferencePage.java
index 7ffd03e..d7a2e91 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsPreferencePage.java
@@ -52,22 +52,22 @@
 
 /**
  * The Installed JREs preference page.
- * 
+ *
  * @since 3.0
  */
 public class JREsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-				
+
 	/**
 	 * ID for the page
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	public static final String ID = "org.eclipse.jdt.debug.ui.preferences.VMPreferencePage"; //$NON-NLS-1$
-	
+
 	// JRE Block
 	private InstalledJREsBlock fJREBlock;
 	private Link fCompliance;
-		
+
 	/**
 	 * Constructor
 	 */
@@ -98,34 +98,34 @@
 			}
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
 	 */
 	@Override
 	protected Control createContents(Composite ancestor) {
 		initializeDialogUnits(ancestor);
-		
+
 		noDefaultButton();
-		
+
 		GridLayout layout= new GridLayout();
 		layout.numColumns= 1;
 		layout.marginHeight = 0;
 		layout.marginWidth = 0;
 		ancestor.setLayout(layout);
-		
+
 		SWTFactory.createWrapLabel(ancestor, JREMessages.JREsPreferencePage_2, 1, 300);
 		SWTFactory.createVerticalSpacer(ancestor, 1);
-		
+
 		fJREBlock = new InstalledJREsBlock();
 		fJREBlock.createControl(ancestor);
 		Control control = fJREBlock.getControl();
 		GridData data = new GridData(GridData.FILL_BOTH);
 		data.horizontalSpan = 1;
 		control.setLayoutData(data);
-		
+
 		fJREBlock.restoreColumnSettings(JDIDebugUIPlugin.getDefault().getDialogSettings(), IJavaDebugHelpContextIds.JRE_PREFERENCE_PAGE);
-					
+
 		fCompliance = new Link(ancestor, SWT.NONE);
 		fCompliance.setText(JREMessages.JREsPreferencePage_14);
 		fCompliance.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@@ -136,7 +136,7 @@
 			@Override
 			public void widgetSelected(SelectionEvent e) {openCompliancePreferencePage();}
 		});
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(ancestor, IJavaDebugHelpContextIds.JRE_PREFERENCE_PAGE);		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(ancestor, IJavaDebugHelpContextIds.JRE_PREFERENCE_PAGE);
 		initDefaultVM();
 		fJREBlock.initializeTimeStamp();
 		fJREBlock.addSelectionChangedListener(new ISelectionChangedListener() {
@@ -149,10 +149,10 @@
 						setErrorMessage(JREMessages.JREsPreferencePage_3);
 					}
 					else {
-						setErrorMessage(JREMessages.JREsPreferencePage_13); 
+						setErrorMessage(JREMessages.JREsPreferencePage_13);
 					}
 				} else {
-					//if we change the VM make sure the compliance level supports 
+					//if we change the VM make sure the compliance level supports
 					//generated class files
 					String compliance = getCurrentCompilerCompliance();
 					if(!supportsCurrentCompliance(install, compliance)) {
@@ -202,7 +202,7 @@
 			SWTFactory.showPreferencePage(compliancepage);
 		}
 	}
-	
+
 	/**
 	 * @return the current compiler compliance level
 	 * @since 3.3
@@ -214,9 +214,9 @@
 			return wcs.get(JavaCore.COMPILER_COMPLIANCE, JavaCore.getDefaultOptions().get(JavaCore.COMPILER_COMPLIANCE));
 		}
 			return JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE);
-		
+
 	}
-	
+
 	/**
 	 * Determines if the vm version will run the currently compiled code based on the compiler compliance lvl
 	 * @param vm the vm install
@@ -233,12 +233,12 @@
 				//error sort it out
 				return true;
 			}
-			int val = compliance.compareTo(vmver); 
+			int val = compliance.compareTo(vmver);
 			return  val < 0 || val == 0;
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
 	 */
@@ -256,19 +256,19 @@
 				}
 			}
 		});
-		
+
 		if(canceled[0]) {
 			return false;
 		}
-		
+
 		// save column widths
 		IDialogSettings settings = JDIDebugUIPlugin.getDefault().getDialogSettings();
 		fJREBlock.saveColumnSettings(settings, IJavaDebugHelpContextIds.JRE_PREFERENCE_PAGE);
 		fJREBlock.initializeTimeStamp();
-		
+
 		return super.performOk();
-	}	
-	
+	}
+
 	protected IJavaModel getJavaModel() {
 		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
 	}
@@ -280,14 +280,14 @@
 	 */
 	private void verifyDefaultVM(IVMInstall vm) {
 		if (vm != null) {
-			
+
 			// Verify that all of the specified VM's library locations actually exist
 			LibraryLocation[] locations= JavaRuntime.getLibraryLocations(vm);
 			boolean exist = true;
 			for (int i = 0; i < locations.length; i++) {
 				exist = exist && new File(locations[i].getSystemLibraryPath().toOSString()).exists();
 			}
-			
+
 			// If all library locations exist, check the corresponding entry in the list,
 			// otherwise remove the VM
 			if (exist) {
@@ -307,11 +307,11 @@
 			fJREBlock.setCheckedJRE(null);
 		}
 	}
-	
+
 	private IVMInstall getCurrentDefaultVM() {
 		return fJREBlock.getCheckedJRE();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsUpdater.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsUpdater.java
index 6a13165..3e61052 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsUpdater.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/JREsUpdater.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,10 +28,10 @@
  * Processes add/removed/changed VMs.
  */
 public class JREsUpdater {
-	
+
 	// the VMs defined when this updated is instantiated
-	private VMDefinitionsContainer fOriginalVMs;	
-	
+	private VMDefinitionsContainer fOriginalVMs;
+
 	/**
 	 * Contstructs a new VM updater to update VM install settings.
 	 */
@@ -41,7 +41,7 @@
 		if (def != null) {
 			fOriginalVMs.setDefaultVMInstallCompositeID(JavaRuntime.getCompositeIdFromVM(def));
 		}
-	
+
 		IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
 		for (int i = 0; i < types.length; i++) {
 			IVMInstall[] vms = types[i].getVMInstalls();
@@ -50,41 +50,41 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Updates VM settings and returns whether the update was successful.
-	 * 
+	 *
 	 * @param jres new installed JREs
 	 * @param defaultJRE new default VM
 	 * @return whether the update was successful
 	 */
 	public boolean updateJRESettings(IVMInstall[] jres, IVMInstall defaultJRE) {
-		
+
 		// Create a VM definition container
 		VMDefinitionsContainer vmContainer = new VMDefinitionsContainer();
-		
+
 		// Set the default VM Id on the container
 		String defaultVMId = JavaRuntime.getCompositeIdFromVM(defaultJRE);
 		vmContainer.setDefaultVMInstallCompositeID(defaultVMId);
-		
+
 		// Set the VMs on the container
 		for (int i = 0; i < jres.length; i++) {
 			vmContainer.addVM(jres[i]);
 		}
-		
-		
+
+
 		// Generate XML for the VM defs and save it as the new value of the VM preference
 		saveVMDefinitions(vmContainer);
-		
+
 		return true;
 	}
-	
+
 	private void saveVMDefinitions(final VMDefinitionsContainer container) {
 		IRunnableWithProgress runnable = new IRunnableWithProgress() {
 			@Override
 			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
 				try {
-					monitor.beginTask(JREMessages.JREsUpdater_0, 100); 
+					monitor.beginTask(JREMessages.JREsUpdater_0, 100);
 					String vmDefXML = container.getAsXML();
 					monitor.worked(40);
 					IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN);
@@ -99,7 +99,7 @@
 				} finally {
 					monitor.done();
 				}
-				
+
 			}
 		};
 		try {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryContentProvider.java
index 117a428..4a32789 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryContentProvider.java
@@ -29,7 +29,7 @@
 
 /**
  * Provides the content for the JREs selection/edit viewer
- * 
+ *
  * @see ITreeContentProvider
  * @see VMDetailsDialog
  * @see VMLibraryBlock
@@ -37,18 +37,18 @@
  * @see LibraryStandin
  */
 public class LibraryContentProvider implements ITreeContentProvider {
-	
+
 	private Viewer fViewer;
-	
+
 	/**
 	 * Represents a sub-element of a <code>LibraryStandin</code>
 	 */
 	public class SubElement {
-		
+
 		public static final int JAVADOC_URL= 1;
 		public static final int SOURCE_PATH= 2;
 		public static final int EXTERNAL_ANNOTATIONS_PATH = 3;
-		
+
 		private LibraryStandin fParent;
 		private int fType;
 
@@ -56,15 +56,15 @@
 			fParent= parent;
 			fType= type;
 		}
-		
+
 		public LibraryStandin getParent() {
 			return fParent;
 		}
-		
+
 		public int getType() {
 			return fType;
 		}
-		
+
 		public void remove() {
 			switch (fType) {
 				case JAVADOC_URL:
@@ -81,7 +81,7 @@
 		}
 	}
 
-	private HashMap<LibraryStandin, Object[]> fChildren= new HashMap<LibraryStandin, Object[]>();
+	private HashMap<LibraryStandin, Object[]> fChildren= new HashMap<>();
 
 	private LibraryStandin[] fLibraries= new LibraryStandin[0];
 
@@ -162,7 +162,7 @@
 
 	/**
 	 * Returns the listing of <code>LibraryLocation</code>s
-	 * 
+	 *
 	 * @return the listing of <code>LibraryLocation</code>s, or an empty
 	 * array, never <code>null</code>
 	 */
@@ -178,12 +178,12 @@
 	 * Returns the list of libraries in the given selection. SubElements
 	 * are replaced by their parent libraries.
 	 * @param selection the current selection
-	 * 
+	 *
 	 * @return the current set of selected <code>LibraryStandin</code>s from
 	 * the current viewer selection, or an empty set, never <code>null</code>
 	 */
 	private Set<Object> getSelectedLibraries(IStructuredSelection selection) {
-		Set<Object> libraries= new HashSet<Object>();
+		Set<Object> libraries= new HashSet<>();
 		for (Iterator<?> iter= selection.iterator(); iter.hasNext();) {
 			Object element= iter.next();
 			if (element instanceof LibraryStandin) {
@@ -234,7 +234,7 @@
 	 * @param selection the current viewer selection
 	 */
 	public void remove(IStructuredSelection selection) {
-		List<LibraryStandin> newLibraries = new ArrayList<LibraryStandin>();
+		List<LibraryStandin> newLibraries = new ArrayList<>();
 		for (int i = 0; i < fLibraries.length; i++) {
 			newLibraries.add(fLibraries[i]);
 		}
@@ -260,11 +260,11 @@
 	 * is empty.
 	 */
 	public void add(LibraryLocation[] libs, IStructuredSelection selection) {
-		List<LibraryStandin> newLibraries = new ArrayList<LibraryStandin>(fLibraries.length + libs.length);
+		List<LibraryStandin> newLibraries = new ArrayList<>(fLibraries.length + libs.length);
 		for (int i = 0; i < fLibraries.length; i++) {
 			newLibraries.add(fLibraries[i]);
 		}
-		List<LibraryStandin> toAdd = new ArrayList<LibraryStandin>(libs.length);
+		List<LibraryStandin> toAdd = new ArrayList<>(libs.length);
 		for (int i = 0; i < libs.length; i++) {
 			toAdd.add(new LibraryStandin(libs[i]));
 		}
@@ -290,7 +290,7 @@
 	 * Set the given URL as the javadoc location for the libraries contained in
 	 * the given selection.
 	 * @param javadocLocation the new java doc location to set
-	 * @param selection the selection of libraries to set the new javadoc location for 
+	 * @param selection the selection of libraries to set the new javadoc location for
 	 */
 	public void setJavadoc(URL javadocLocation, IStructuredSelection selection) {
 		Set<Object> libraries= getSelectedLibraries(selection);
@@ -325,7 +325,7 @@
 		}
 		fViewer.refresh();
 	}
-	
+
 	/**
 	 * Set the given paths as the annotations path for the libraries contained in the given selection.
 	 *
@@ -351,7 +351,7 @@
 
 	/**
 	 * Returns the stand-in libraries being edited.
-	 * 
+	 *
 	 * @return stand-ins
 	 */
 	LibraryStandin[] getStandins() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryLabelProvider.java
index 21fdefe..2ea3ed8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryLabelProvider.java
@@ -4,10 +4,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.jres;
@@ -29,7 +29,7 @@
 
 /**
  * Label provider for jre libraries.
- * 
+ *
  * @since 3.2
  */
 public class LibraryLabelProvider extends LabelProvider {
@@ -50,13 +50,13 @@
 				key = ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE;
 			}
 			status = library.validate();
-			
+
 		} else if (element instanceof SubElement) {
 			switch(((SubElement)element).getType()) {
 				case SubElement.SOURCE_PATH:
 					key = ISharedImages.IMG_OBJS_JAR_WITH_SOURCE;
 					break;
-					
+
 				case SubElement.EXTERNAL_ANNOTATIONS_PATH:
 					key = ISharedImages.IMG_OBJS_EXTERNAL_ANNOTATIONS;
 					break;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryStandin.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryStandin.java
index 1ecdb97..021a9a1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryStandin.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/LibraryStandin.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.jres;
@@ -25,7 +25,7 @@
 
 /**
  * Wrapper for an original library location, to support editing.
- * 
+ *
  */
 public final class LibraryStandin {
 	private IPath fSystemLibrary;
@@ -33,45 +33,45 @@
 	private IPath fExternalAnnotations;
 	private IPath fPackageRootPath;
 	private URL fJavadocLocation;
-	
+
 	/**
 	 * Creates a new library standin on the given library location.
-	 */	
+	 */
 	public LibraryStandin(LibraryLocation libraryLocation) {
 		fSystemLibrary= libraryLocation.getSystemLibraryPath();
 		setSystemLibrarySourcePath(libraryLocation.getSystemLibrarySourcePath());
 		setPackageRootPath(libraryLocation.getPackageRootPath());
 		setJavadocLocation(libraryLocation.getJavadocLocation());
 		setExternalAnnotationsPath(libraryLocation.getExternalAnnotationsPath());
-	}		
-		
+	}
+
 	/**
 	 * Returns the JRE library jar location.
-	 * 
+	 *
 	 * @return The JRE library jar location.
 	 */
 	public IPath getSystemLibraryPath() {
 		return fSystemLibrary;
 	}
-	
+
 	/**
 	 * Returns the JRE library source zip location.
-	 * 
+	 *
 	 * @return The JRE library source zip location.
 	 */
 	public IPath getSystemLibrarySourcePath() {
 		return fSystemLibrarySource;
-	}	
-	
+	}
+
 	/**
 	 * Sets the source location for this library.
-	 * 
+	 *
 	 * @param path path source archive or Path.EMPTY if none
 	 */
 	void setSystemLibrarySourcePath(IPath path) {
 		fSystemLibrarySource = path;
 	}
-	
+
 	/**
 	 * Returns the path to the external annotations.
 	 *
@@ -87,22 +87,22 @@
 
 	/**
 	 * Returns the path to the default package in the sources zip file
-	 * 
+	 *
 	 * @return The path to the default package in the sources zip file.
 	 */
 	public IPath getPackageRootPath() {
 		return fPackageRootPath;
 	}
-	
+
 	/**
 	 * Sets the root source location within source archive.
-	 * 
+	 *
 	 * @param path path to root source location or Path.EMPTY if none
 	 */
 	void setPackageRootPath(IPath path) {
 		fPackageRootPath = path;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
@@ -110,12 +110,12 @@
 	public boolean equals(Object obj) {
 		if (obj instanceof LibraryStandin) {
 			LibraryStandin lib = (LibraryStandin)obj;
-			return getSystemLibraryPath().equals(lib.getSystemLibraryPath()) 
+			return getSystemLibraryPath().equals(lib.getSystemLibraryPath())
 				&& equals(getSystemLibrarySourcePath(), lib.getSystemLibrarySourcePath())
 				&& equals(getPackageRootPath(), lib.getPackageRootPath())
 				&& equals(getExternalAnnotationsPath(), lib.getExternalAnnotationsPath())
 				&& equalURLs(getJavadocLocation(), lib.getJavadocLocation());
-		} 
+		}
 		return false;
 	}
 
@@ -126,7 +126,7 @@
 	public int hashCode() {
 		return getSystemLibraryPath().hashCode();
 	}
-	
+
 	/**
 	 * Returns whether the given paths are equal - either may be <code>null</code>.
 	 * @param path1 path to be compared
@@ -136,14 +136,14 @@
 	protected boolean equals(IPath path1, IPath path2) {
 		return equalsOrNull(path1, path2);
 	}
-	
+
 	/**
 	 * Returns whether the given objects are equal - either may be <code>null</code>.
 	 * @param o1 object to be compared
 	 * @param o2 object to be compared
 	 * @return whether the given objects are equal or both null
 	 * @since 3.1
-	 */	
+	 */
 	private boolean equalsOrNull(Object o1, Object o2) {
 		if (o1 == null) {
 			return o2 == null;
@@ -169,10 +169,10 @@
 		}
 		return url1.toExternalForm().equals(url2.toExternalForm());
 	}
-	
+
 	/**
 	 * Returns the Javadoc location associated with this Library location.
-	 * 
+	 *
 	 * @return a url pointing to the Javadoc location associated with
 	 * 	this Library location, or <code>null</code> if none
 	 * @since 3.1
@@ -180,10 +180,10 @@
 	public URL getJavadocLocation() {
 		return fJavadocLocation;
 	}
-	
+
 	/**
 	 * Sets the javadoc location of this library.
-	 *  
+	 *
 	 * @param url The location of the javadoc for <code>library</code> or <code>null</code>
 	 *  if none
 	 */
@@ -193,16 +193,16 @@
 
 	/**
 	 * Returns an equivalent library location.
-	 * 
+	 *
 	 * @return library location
 	 */
 	LibraryLocation toLibraryLocation() {
 		return new LibraryLocation(getSystemLibraryPath(), getSystemLibrarySourcePath(), getPackageRootPath(), getJavadocLocation(), null, getExternalAnnotationsPath());
 	}
-	
+
 	/**
 	 * Returns a status for this library describing any error states
-	 * 
+	 *
 	 * @return
 	 */
 	IStatus validate() {
@@ -232,5 +232,5 @@
 
 		return Status.OK_STATUS;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMCommandTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMCommandTab.java
index 7c3c2f4..6b61d92 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMCommandTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMCommandTab.java
@@ -37,13 +37,13 @@
 import org.eclipse.swt.widgets.Text;
 
 public class StandardVMCommandTab extends AbstractLaunchConfigurationTab {
-	
+
 	protected Text fJavaCommandText;
 	protected Button fDefaultButton;
 	protected Button fSpecificButton;
-	
-	protected static final Map<?, ?> EMPTY_MAP = new HashMap<Object, Object>(1);
-	
+
+	protected static final Map<?, ?> EMPTY_MAP = new HashMap<>(1);
+
 	/**
 	 * @see ILaunchConfigurationTab#createControl(Composite)
 	 */
@@ -55,7 +55,7 @@
 		comp.setLayout(layout);
 		comp.setLayoutData(new GridData(GridData.FILL_BOTH));
 		comp.setFont(font);
-		
+
 		Group group = new Group(comp, SWT.NONE);
 		setControl(group);
 		GridLayout topLayout = new GridLayout();
@@ -64,36 +64,36 @@
 		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
 		group.setLayoutData(gd);
 		group.setFont(font);
-		
-		group.setText(JREMessages.AbstractJavaCommandTab_1);  
-		
+
+		group.setText(JREMessages.AbstractJavaCommandTab_1);
+
 		fDefaultButton = new Button(group, SWT.RADIO);
 		fDefaultButton.setFont(font);
 		gd = new GridData(GridData.BEGINNING);
 		gd.horizontalSpan = 2;
 		fDefaultButton.setLayoutData(gd);
-		fDefaultButton.setText(NLS.bind(JREMessages.AbstractJavaCommandTab_2, new String[]{getDefaultCommand()})); 
-		
+		fDefaultButton.setText(NLS.bind(JREMessages.AbstractJavaCommandTab_2, new String[]{getDefaultCommand()}));
+
 		fDefaultButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent evt) {
 				handleSelection();
 			}
 		});
-		
+
 		fSpecificButton = new Button(group, SWT.RADIO);
 		fSpecificButton.setFont(font);
 		gd = new GridData(GridData.BEGINNING);
 		fSpecificButton.setLayoutData(gd);
-		fSpecificButton.setText(JREMessages.AbstractJavaCommandTab_4); 
-		
+		fSpecificButton.setText(JREMessages.AbstractJavaCommandTab_4);
+
 		fSpecificButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent evt) {
 				handleSelection();
 			}
 		});
-				
+
 		fJavaCommandText= new Text(group, SWT.SINGLE | SWT.BORDER);
 		gd = new GridData(GridData.FILL_HORIZONTAL);
 		fJavaCommandText.setLayoutData(gd);
@@ -115,7 +115,7 @@
 		fJavaCommandText.setEnabled(!useDefault);
 		updateLaunchConfigurationDialog();
 	}
-	
+
 	protected String getDefaultCommand() {
 		return "javaw";  //$NON-NLS-1$
 	}
@@ -125,7 +125,7 @@
 	 */
 	@Override
 	public String getName() {
-		return JREMessages.AbstractJavaCommandTab_3; 
+		return JREMessages.AbstractJavaCommandTab_3;
 	}
 
 	/* (non-Javadoc)
@@ -140,7 +140,7 @@
 				javaCommand = attributeMap.get(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND);
 			}
 		} catch(CoreException ce) {
-			JDIDebugUIPlugin.log(ce);		
+			JDIDebugUIPlugin.log(ce);
 		}
 		if (javaCommand == null) {
 			javaCommand = getDefaultCommand();
@@ -164,19 +164,19 @@
 			configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, (Map<String, String>)null);
 		} else {
 			String javaCommand = fJavaCommandText.getText();
-			Map<String, String> attributeMap = new HashMap<String, String>(1);
+			Map<String, String> attributeMap = new HashMap<>(1);
 			attributeMap.put(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, javaCommand);
-			configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, attributeMap);		
-		}		 
+			configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, attributeMap);
+		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
 	@Override
 	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
 		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, (Map<String, String>)null);
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
@@ -185,7 +185,7 @@
 	public String getId() {
 		return "org.eclipse.jdt.debug.ui.standardVMCommandTab"; //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -196,7 +196,7 @@
 			setErrorMessage(null);
 			setMessage(null);
 		} else {
-			setErrorMessage(JREMessages.AbstractJavaCommandTab_Java_executable_must_be_specified_5); 
+			setErrorMessage(JREMessages.AbstractJavaCommandTab_Java_executable_must_be_specified_5);
 			setMessage(null);
 		}
 		return valid;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMPage.java
index f74912c..d90b00c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/StandardVMPage.java
@@ -48,11 +48,11 @@
 
 /**
  * Page used to edit a standard VM.
- * 
+ *
  * @since 3.3
  */
 public class StandardVMPage extends AbstractVMInstallPage {
-	
+
 	// VM being edited or created
 	private VMStandin fVM;
 	private Text fVMName;
@@ -63,9 +63,9 @@
 	private URL fJavadocLocation = null;
 	private boolean fAutoDetectAttributes = false;
 	private IStatus[] fFieldStatus = new IStatus[1];
-	
+
 	/**
-	 * 
+	 *
 	 */
 	public StandardVMPage() {
 		super(JREMessages.StandardVMPage_0);
@@ -73,14 +73,14 @@
 			fFieldStatus[i] = Status.OK_STATUS;
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return JavaDebugImages.get(JavaDebugImages.IMG_WIZBAN_LIBRARY);
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
@@ -93,7 +93,7 @@
 		layout.numColumns = 3;
 		composite.setLayout(layout);
 		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
+
 	// VM location
 		SWTFactory.createLabel(composite, JREMessages.addVMDialog_jreHome, 1);
 		fJRERoot = SWTFactory.createSingleText(composite, 1);
@@ -109,7 +109,7 @@
 		Button variables = SWTFactory.createPushButton(composite, JREMessages.StandardVMPage_3, null);
 		data = (GridData) variables.getLayoutData();
 		data.horizontalAlignment = GridData.END;
-	//VM libraries block 
+	//VM libraries block
 		SWTFactory.createLabel(composite, JREMessages.AddVMDialog_JRE_system_libraries__1, 3);
 		fLibraryBlock = new VMLibraryBlock();
 		fLibraryBlock.setWizard(getWizard());
@@ -118,8 +118,8 @@
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		gd.horizontalSpan = 3;
 		libControl.setLayoutData(gd);
-		
-	
+
+
 	//add the listeners now to prevent them from monkeying with initialized settings
 		fVMName.addModifyListener(new ModifyListener() {
 			@Override
@@ -145,7 +145,7 @@
 					text = file.getParentFile().getAbsolutePath();
 				}
 				dialog.setFilterPath(text);
-				dialog.setMessage(JREMessages.addVMDialog_pickJRERootDialog_message); 
+				dialog.setMessage(JREMessages.addVMDialog_pickJRERootDialog_message);
 				String newPath = dialog.open();
 				if (newPath != null) {
 					fJRERoot.setText(newPath);
@@ -167,9 +167,9 @@
 		Dialog.applyDialogFont(composite);
 		setControl(composite);
 		initializeFields();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.EDIT_JRE_STD_VM_WIZARD_PAGE);	
-	}	
-	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.EDIT_JRE_STD_VM_WIZARD_PAGE);
+	}
+
 	/**
 	 * Validates the JRE location
 	 * @return the status after validating the JRE location
@@ -179,16 +179,16 @@
 		IStatus s = null;
 		File file = null;
 		if (locationName.length() == 0) {
-			s = new StatusInfo(IStatus.WARNING, JREMessages.addVMDialog_enterLocation); 
-		} 
+			s = new StatusInfo(IStatus.WARNING, JREMessages.addVMDialog_enterLocation);
+		}
 		else {
 			file = new File(locationName);
 			if (!file.exists()) {
-				s = new StatusInfo(IStatus.ERROR, JREMessages.addVMDialog_locationNotExists); 
-			} 
+				s = new StatusInfo(IStatus.ERROR, JREMessages.addVMDialog_locationNotExists);
+			}
 			else {
 				final IStatus[] temp = new IStatus[1];
-				final File tempFile = file; 
+				final File tempFile = file;
 				Runnable r = new Runnable() {
 					@Override
 					public void run() {
@@ -220,12 +220,12 @@
 						int segs = path.segmentCount();
 						if (segs == 1) {
 							genName = path.segment(0);
-						} 
+						}
 						else if (segs >= 2) {
 							String last = path.lastSegment();
 							if ("jre".equalsIgnoreCase(last)) { //$NON-NLS-1$
 								genName = path.segment(segs - 2);
-							} 
+							}
 							else {
 								genName = last;
 							}
@@ -242,7 +242,7 @@
 		fLibraryBlock.setSelection(fVM);
 		updatePageStatus();
 	}
-	
+
 	/**
 	 * Auto-detects the default javadoc location
 	 */
@@ -261,14 +261,14 @@
 			fJavadocLocation = fVM.getJavadocLocation();
 		}
 	}
-	
+
 	/**
 	 * Returns the installation location as a file from the JRE root text control
 	 * @return the installation location as a file
 	 */
 	protected File getInstallLocation() {
 		return new File(fJRERoot.getText());
-	}	
+	}
 
 	/**
 	 * Validates the entered name of the VM
@@ -277,7 +277,7 @@
 	private void validateVMName() {
 		nameChanged(fVMName.getText());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.AbstractVMInstallPage#finish()
 	 */
@@ -295,7 +295,7 @@
 	public VMStandin getSelection() {
 		return fVM;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.AbstractVMInstallPage#setSelection(org.eclipse.jdt.launching.VMStandin)
 	 */
@@ -307,7 +307,7 @@
 		setTitle(JREMessages.StandardVMPage_1);
 		setDescription(JREMessages.StandardVMPage_2);
 	}
-	
+
 	/**
 	 * initialize fields to the specified VM
 	 * @param vm the VM to initialize from
@@ -318,16 +318,16 @@
 		vm.setInstallLocation(file);
 		vm.setName(fVMName.getText());
 		vm.setJavadocLocation(getURL());
-		
+
 		String argString = fVMArgs.getText().trim();
 		if (argString != null && argString.length() > 0) {
-			vm.setVMArgs(argString);			
-		} 
+			vm.setVMArgs(argString);
+		}
 		else {
 			vm.setVMArgs(null);
-		} 
+		}
 	}
-	
+
 	/**
 	 * Returns the URL for the javadoc location
 	 * @return the URL for the javadoc location
@@ -335,7 +335,7 @@
 	protected URL getURL() {
 		return fJavadocLocation;
 	}
-	
+
 	/**
 	 * Creates a unique name for the VMInstallType
 	 * @param vmType the vm install type
@@ -347,8 +347,8 @@
 			id = String.valueOf(System.currentTimeMillis());
 		} while (vmType.findVMInstall(id) != null);
 		return id;
-	}	
-	
+	}
+
 	/**
 	 * Initialize the dialogs fields
 	 */
@@ -365,11 +365,11 @@
 		}
 		validateVMName();
 		validateJRELocation();
-	}	
-	
+	}
+
 	/**
 	 * Sets the status of the JRE location field.
-	 * 
+	 *
 	 * @param status JRE location status
 	 */
 	private void setJRELocationStatus(IStatus status) {
@@ -407,5 +407,5 @@
 	protected IStatus[] getVMStatus() {
 		return fFieldStatus;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java
index 8120656..3b1c2b3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java
@@ -33,36 +33,36 @@
 
 /**
  * Displays details of a VM install (read only, for contributed VMs).
- * 
+ *
  * @since 3.2
  */
 public class VMDetailsDialog extends Dialog {
-	
+
 	private IVMInstall fVM;
-		
+
 	public VMDetailsDialog(Shell shell, IVMInstall vm) {
 		super(shell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);		
+		setShellStyle(getShellStyle() | SWT.RESIZE);
 		fVM= vm;
 	}
-	
+
 	/**
 	 * @see Windows#configureShell
 	 */
 	@Override
 	protected void configureShell(Shell newShell) {
 		super.configureShell(newShell);
-		newShell.setText(JREMessages.VMDetailsDialog_0); 
+		newShell.setText(JREMessages.VMDetailsDialog_0);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IJavaDebugHelpContextIds.JRE_DETAILS_DIALOG);
-	}		
-			
+	}
+
 	@Override
 	protected Control createDialogArea(Composite ancestor) {
 		Composite parent = (Composite)super.createDialogArea(ancestor);
 		GridLayout layout = new GridLayout(2, false);
 		layout.makeColumnsEqualWidth = false;
 		parent.setLayout(layout);
-		
+
 		// type
 		createLabel(parent, JREMessages.addVMDialog_jreType);
 		createLabel(parent, fVM.getVMInstallType().getName());
@@ -70,11 +70,11 @@
 		// name
 		createLabel(parent, JREMessages.addVMDialog_jreName);
 		createLabel(parent, fVM.getName());
-		
+
 		// home
 		createLabel(parent, JREMessages.addVMDialog_jreHome);
 		createLabel(parent, fVM.getInstallLocation().getAbsolutePath());
-		
+
 		// vm args
 		SWTFactory.createLabel(parent, JREMessages.AddVMDialog_23, 2);
 		String text = null;
@@ -100,7 +100,7 @@
 		GridData gd = (GridData) argText.getLayoutData();
 		gd.heightHint = 75;
 		gd.widthHint = 300;
-		
+
 		// libraries
 		SWTFactory.createLabel(parent, JREMessages.AddVMDialog_JRE_system_libraries__1, 2);
 		TreeViewer libraryViewer= new TreeViewer(parent);
@@ -113,26 +113,26 @@
 		libraryViewer.setLabelProvider(new LibraryLabelProvider());
 		libraryViewer.setInput(this);
 		provider.setLibraries(JavaRuntime.getLibraryLocations(fVM));
-		
+
 		applyDialogFont(parent);
 		return parent;
 	}
-	
+
 	private Label createLabel(Composite parent, String text) {
 		Label label = new Label(parent, SWT.NONE);
 		label.setText(text);
 		return label;
 	}
-	
+
 	/**
 	 * Returns the name of the section that this dialog stores its settings in
-	 * 
+	 *
 	 * @return String
 	 */
 	protected String getDialogSettingsSectionName() {
 		return "VM_DETAILS_DIALOG_SECTION"; //$NON-NLS-1$
 	}
-	
+
 	 /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
      */
@@ -142,10 +142,10 @@
          IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
          if (section == null) {
              section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
+         }
          return section;
     }
-    
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
 	 */
@@ -154,5 +154,5 @@
 		// create OK and Cancel buttons by default
 		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
 				true);
-	}    
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMInstallWizard.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMInstallWizard.java
index b155b28..27ac354 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMInstallWizard.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMInstallWizard.java
@@ -27,22 +27,22 @@
 
 /**
  * @since 3.3
- * 
+ *
  */
 public abstract class VMInstallWizard extends Wizard {
-	
+
 	private VMStandin fEditVM;
 	private String[] fExistingNames;
-	
+
 	/**
 	 * Constructs a new wizard to add/edit a vm install.
-	 * 
+	 *
 	 * @param editVM the VM being edited, or <code>null</code> if none
 	 * @param currentInstalls current VM installs used to validate name changes
 	 */
 	public VMInstallWizard(VMStandin editVM, IVMInstall[] currentInstalls) {
 		fEditVM = editVM;
-		List<String> names = new ArrayList<String>(currentInstalls.length);
+		List<String> names = new ArrayList<>(currentInstalls.length);
 		for (int i = 0; i < currentInstalls.length; i++) {
 			IVMInstall install = currentInstalls[i];
 			if (!install.equals(editVM)) {
@@ -51,19 +51,19 @@
 		}
 		fExistingNames = names.toArray(new String[names.size()]);
 	}
-	
+
 	/**
 	 * Returns the VM to edit, or <code>null</code> if creating a VM
-	 * 
+	 *
 	 * @return vm to edit or <code>null</code>
 	 */
 	protected VMStandin getVMInstall() {
 		return fEditVM;
 	}
-	
+
 	/**
 	 * Returns the resulting VM after edit or creation or <code>null</code> if none.
-	 * 
+	 *
 	 * @return resulting VM
 	 */
 	protected abstract VMStandin getResult();
@@ -75,10 +75,10 @@
 	public boolean performFinish() {
 		return getResult() != null;
 	}
-	
+
 	/**
 	 * Returns a page to use for editing a VM install type
-	 * 
+	 *
 	 * @param type
 	 * @return
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMLibraryBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMLibraryBlock.java
index d8e8bfd..8db0dfc 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMLibraryBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMLibraryBlock.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.jres;
@@ -53,7 +53,7 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.FileDialog;
- 
+
 /**
  * Control used to edit the libraries associated with a VM install
  */
@@ -64,15 +64,15 @@
 	 * dialog.
 	 */
 	protected static final String LAST_PATH_SETTING = "LAST_PATH_SETTING"; //$NON-NLS-1$
-	
+
 	/**
 	 * the prefix for dialog setting pertaining to this block
 	 */
 	protected static final String DIALOG_SETTINGS_PREFIX = "VMLibraryBlock"; //$NON-NLS-1$
-	
+
 	protected boolean fInCallback = false;
 	protected VMStandin fVmInstall;
-	
+
 	//widgets
 	protected LibraryContentProvider fLibraryContentProvider;
 	protected TreeViewer fLibraryViewer;
@@ -83,20 +83,20 @@
 	private Button fJavadocButton;
 	private Button fSourceButton;
 	protected Button fDefaultButton;
-	
+
 	private IStatus[] fLibStatus;
-	
+
 	private Button fAnnotationsButton;
 
 	/**
 	 * Constructs a new wizard page with the given name.
-	 * 
+	 *
 	 * @param pageName page name
 	 */
 	VMLibraryBlock() {
 		super(JREMessages.VMLibraryBlock_2);
 		fLibStatus = new IStatus[]{Status.OK_STATUS};
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
@@ -104,9 +104,9 @@
 	@Override
 	public void createControl(Composite parent) {
 		Font font = parent.getFont();
-		
+
 		Composite comp = SWTFactory.createComposite(parent, font, 2, 1, GridData.FILL_BOTH, 0, 0);
-		
+
 		fLibraryViewer= new TreeViewer(comp);
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		gd.heightHint = 6;
@@ -116,11 +116,11 @@
 		fLibraryViewer.setLabelProvider(new LibraryLabelProvider());
 		fLibraryViewer.setInput(this);
 		fLibraryViewer.addSelectionChangedListener(this);
-		
-		Composite pathButtonComp = SWTFactory.createComposite(comp, font, 1, 1, GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL, 0, 0); 
+
+		Composite pathButtonComp = SWTFactory.createComposite(comp, font, 1, 1, GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL, 0, 0);
 		fAddButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_7, JREMessages.VMLibraryBlock_16, null);
 		fAddButton.addSelectionListener(this);
-		fJavadocButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_3, JREMessages.VMLibraryBlock_17, null); 
+		fJavadocButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_3, JREMessages.VMLibraryBlock_17, null);
 		fJavadocButton.setEnabled(false);
 		fJavadocButton.addSelectionListener(this);
 
@@ -142,7 +142,7 @@
 				}
 			}
 		});
-		fRemoveButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_6, JREMessages.VMLibraryBlock_12, null);		
+		fRemoveButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_6, JREMessages.VMLibraryBlock_12, null);
 		fRemoveButton.setEnabled(false);
 		fRemoveButton.addSelectionListener(this);
 		fUpButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_4, JREMessages.VMLibraryBlock_13, null);
@@ -153,7 +153,7 @@
 		fDownButton.addSelectionListener(this);
 		fDefaultButton = SWTFactory.createPushButton(pathButtonComp, JREMessages.VMLibraryBlock_9, JREMessages.VMLibraryBlock_15, null);
 		fDefaultButton.addSelectionListener(this);
-		
+
 		setControl(comp);
 	}
 
@@ -192,7 +192,7 @@
 		fLibraryContentProvider.setLibraries(libs);
 		update();
 	}
-	
+
 	/**
 	 * Updates buttons and status based on current libraries
 	 */
@@ -224,7 +224,7 @@
 			getContainer().updateButtons();
 		}
 	}
-	
+
 	/**
 	 * Determines if the current libraries displayed to the user are the default location
 	 * for the given vm working copy.
@@ -233,7 +233,7 @@
 	 */
 	protected boolean isDefaultLocations(IVMInstall vm) {
 		LibraryLocation[] libraryLocations = fLibraryContentProvider.getLibraries();
-        
+
 		if (vm == null || libraryLocations == null) {
 			return true;
 		}
@@ -257,7 +257,7 @@
 	 */
 	@Override
 	public void widgetSelected(SelectionEvent e) {
-		boolean completed = true; 
+		boolean completed = true;
 		Object source= e.getSource();
 		if (source == fUpButton) {
 			fLibraryContentProvider.up((IStructuredSelection) fLibraryViewer.getSelection());
@@ -267,7 +267,7 @@
 			fLibraryContentProvider.remove((IStructuredSelection) fLibraryViewer.getSelection());
 		} else if (source == fAddButton) {
 			completed = add((IStructuredSelection) fLibraryViewer.getSelection());
-		} 
+		}
 		else if(source == fJavadocButton) {
 			edit((IStructuredSelection) fLibraryViewer.getSelection(), SubElement.JAVADOC_URL);
 		}
@@ -311,14 +311,14 @@
 		}
 		String[] fileNames= dialog.getFileNames();
 		int nChosen= fileNames.length;
-			
+
 		IPath filterPath= new Path(dialog.getFilterPath());
 		LibraryLocation[] libs= new LibraryLocation[nChosen];
 		for (int i= 0; i < nChosen; i++) {
 			libs[i]= new LibraryLocation(filterPath.append(fileNames[i]).makeAbsolute(), Path.EMPTY, Path.EMPTY);
 		}
 		dialogSettings.put(LAST_PATH_SETTING, filterPath.toOSString());
-		
+
 		fLibraryContentProvider.add(libs, selection);
 		return true;
 	}
@@ -344,12 +344,12 @@
 				if (urls != null) {
 					fLibraryContentProvider.setJavadoc(urls[0], selection);
 				}
-			} 
+			}
 			else if(type == SubElement.SOURCE_PATH){
 				IRuntimeClasspathEntry entry = JavaRuntime.newArchiveRuntimeClasspathEntry(library.getSystemLibraryPath());
 				entry.setSourceAttachmentPath(library.getSystemLibrarySourcePath());
 				entry.setSourceAttachmentRootPath(library.getPackageRootPath());
-				IClasspathEntry classpathEntry = BuildPathDialogAccess.configureSourceAttachment(fLibraryViewer.getControl().getShell(), entry.getClasspathEntry()); 
+				IClasspathEntry classpathEntry = BuildPathDialogAccess.configureSourceAttachment(fLibraryViewer.getControl().getShell(), entry.getClasspathEntry());
 				if (classpathEntry != null) {
 					fLibraryContentProvider.setSourcePath(classpathEntry.getSourceAttachmentPath(), classpathEntry.getSourceAttachmentRootPath(), selection);
 				}
@@ -392,9 +392,9 @@
 	private void updateButtons() {
 		IStructuredSelection selection = (IStructuredSelection) fLibraryViewer.getSelection();
 		fRemoveButton.setEnabled(!selection.isEmpty());
-		boolean enableUp = true, 
-				enableDown = true, 
-				allSource = true, 
+		boolean enableUp = true,
+				enableDown = true,
+				allSource = true,
 				allJavadoc = true,
 				allAnnotations = true,
 				allRoots = true;
@@ -486,13 +486,13 @@
 		fVmInstall = vm;
 		fLibraryContentProvider.setLibraries(libraryLocations);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.ui.launchConfigurations.AbstractVMInstallPage#getVMStatus()
 	 */
 	@Override
 	protected IStatus[] getVMStatus() {
 		return fLibStatus;
-	}	
-		
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMTypePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMTypePage.java
index fdb234f..85ae2b8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMTypePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMTypePage.java
@@ -41,20 +41,20 @@
 
 /**
  * Wizard page used to select a VM type.
- * 
+ *
  * @since 3.3
  */
 public class VMTypePage extends WizardPage {
-	
+
 	private ListViewer fTypesViewer;
-	
+
 	private AbstractVMInstallPage fNextPage;
-	
+
 	/**
 	 * Keep track of pages created, so we can dispose of them.
 	 */
-	private Set<AbstractVMInstallPage> fPages = new HashSet<AbstractVMInstallPage>();
-	
+	private Set<AbstractVMInstallPage> fPages = new HashSet<>();
+
 	/**
 	 * Label provider for VM types
 	 */
@@ -71,9 +71,9 @@
 			}
 			return super.getText(element);
 		}
-		
+
 	}
-	
+
 	/**
 	 * Constructs a VM type selection page
 	 */
@@ -82,8 +82,8 @@
 		setDescription(JREMessages.VMTypePage_1);
 		setTitle(JREMessages.VMTypePage_2);
 	}
-	
-	
+
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
 	 */
@@ -104,9 +104,9 @@
 	@Override
 	public void createControl(Composite parent) {
 		Composite composite = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
-		
+
 		SWTFactory.createLabel(composite, JREMessages.VMTypePage_3, 1);
-		
+
 		fTypesViewer = new ListViewer(composite, SWT.SINGLE | SWT.BORDER);
 		GridData data = new GridData(GridData.FILL_BOTH);
         data.heightHint = 250;
@@ -139,17 +139,17 @@
 		setControl(composite);
 		fTypesViewer.setSelection(new StructuredSelection(JavaRuntime.getVMInstallType(StandardVMType.ID_STANDARD_VM_TYPE)));
 		updateNextPage();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.ADD_NEW_JRE_WIZARD_PAGE);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.ADD_NEW_JRE_WIZARD_PAGE);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
 	 */
 	@Override
 	public Image getImage() {
 		return JavaDebugImages.get(JavaDebugImages.IMG_WIZBAN_LIBRARY);
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
 	 */
@@ -157,7 +157,7 @@
 	public IWizardPage getNextPage() {
 		return fNextPage;
 	}
-	
+
 	private void updateNextPage() {
 		if (isPageComplete()) {
 			IStructuredSelection selection = (IStructuredSelection)fTypesViewer.getSelection();
@@ -171,7 +171,7 @@
 				fNextPage = page;
 				fPages.add(page);
 			}
-		}		
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaClasspathTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaClasspathTab.java
index d3bda87..14a9fb8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaClasspathTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaClasspathTab.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,11 +14,11 @@
 
 /**
  * Common function for Java launch tabs display runtime classpath entries.
- * 
+ *
  * @since 3.2
  */
 public abstract class AbstractJavaClasspathTab extends JavaLaunchTab implements IEntriesChangedListener {
-			
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IEntriesChangedListener#entriesChanged(org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaMainTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaMainTab.java
index 82375f0..c418a22 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaMainTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AbstractJavaMainTab.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -41,11 +41,11 @@
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 
 /**
- * Provides general widgets and methods for a Java type launch configuration 
- * 'Main' tab. 
+ * Provides general widgets and methods for a Java type launch configuration
+ * 'Main' tab.
  * Currently there are only three Java type launch configurations: Local Java Application, Applet, and Remote Debug
  * which this class is used by
- * 
+ *
  * @since 3.2
  */
 public abstract class AbstractJavaMainTab extends JavaLaunchTab {
@@ -55,15 +55,15 @@
  * in this tab.
  */
 private class WidgetListener implements ModifyListener, SelectionListener {
-	
+
 	@Override
 	public void modifyText(ModifyEvent e) {
 		updateLaunchConfigurationDialog();
 	}
-	
+
 	@Override
 	public void widgetDefaultSelected(SelectionEvent e) {/*do nothing*/}
-	
+
 	@Override
 	public void widgetSelected(SelectionEvent e) {
 		Object source = e.getSource();
@@ -75,15 +75,15 @@
 		}
 	}
 }
-	
+
 	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
 	//Project UI widgets
 	protected Text fProjText;
 
 	private Button fProjButton;
-	
+
 	private WidgetListener fListener = new WidgetListener();
-	
+
 	/**
 	 * chooses a project for the type of java launch config that it is
 	 * @return the selected project or <code>null</code> if none
@@ -91,8 +91,8 @@
 	private IJavaProject chooseJavaProject() {
 		ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
 		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider);
-		dialog.setTitle(LauncherMessages.AbstractJavaMainTab_4); 
-		dialog.setMessage(LauncherMessages.AbstractJavaMainTab_3); 
+		dialog.setTitle(LauncherMessages.AbstractJavaMainTab_4);
+		dialog.setMessage(LauncherMessages.AbstractJavaMainTab_3);
 		try {
 			dialog.setElements(JavaCore.create(getWorkspaceRoot()).getJavaProjects());
 		}
@@ -101,15 +101,15 @@
 		if (javaProject != null) {
 			dialog.setInitialSelections(new Object[] { javaProject });
 		}
-		if (dialog.open() == Window.OK) {			
+		if (dialog.open() == Window.OK) {
 			return (IJavaProject) dialog.getFirstResult();
-		}		
-		return null;		
+		}
+		return null;
 	}
-	
+
 	/**
 	 * Creates the widgets for specifying a main type.
-	 * 
+	 *
 	 * @param parent the parent composite
 	 */
 	protected void createProjectEditor(Composite parent) {
@@ -117,27 +117,27 @@
 		fProjText = SWTFactory.createSingleText(group, 1);
 		fProjText.addModifyListener(fListener);
 		ControlAccessibleListener.addListener(fProjText, group.getText());
-		fProjButton = createPushButton(group, LauncherMessages.AbstractJavaMainTab_1, null); 
+		fProjButton = createPushButton(group, LauncherMessages.AbstractJavaMainTab_1, null);
 		fProjButton.addSelectionListener(fListener);
-	}	
-	
+	}
+
 	/**
 	 * returns the default listener from this class. For all subclasses
 	 * this listener will only provide the functionality of updating the current tab
-	 * 
+	 *
 	 * @return a widget listener
 	 */
 	protected WidgetListener getDefaultListener() {
 		return fListener;
 	}
-	
+
 	/**
 	 * Convenience method to get access to the java model.
 	 */
 	private IJavaModel getJavaModel() {
 		return JavaCore.create(getWorkspaceRoot());
 	}
-	
+
 	/**
 	 * Return the IJavaProject corresponding to the project name in the project name
 	 * text field, or null if the text does not match a project name.
@@ -147,7 +147,7 @@
 		if (projectName.length() < 1) {
 			return null;
 		}
-		return getJavaModel().getJavaProject(projectName);		
+		return getJavaModel().getJavaProject(projectName);
 	}
 
 	/**
@@ -168,9 +168,9 @@
 			return;
 		}
 		String projectName = project.getElementName();
-		fProjText.setText(projectName);		
+		fProjText.setText(projectName);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -179,7 +179,7 @@
 		updateProjectFromConfig(config);
 		super.initializeFrom(config);
 	}
-	
+
 	/**
 	 * updates the project text field form the configuration
 	 * @param config the configuration we are editing
@@ -187,17 +187,17 @@
 	private void updateProjectFromConfig(ILaunchConfiguration config) {
 		String projectName = EMPTY_STRING;
 		try {
-			projectName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING);	
+			projectName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING);
 		}
 		catch (CoreException ce) {
 			setErrorMessage(ce.getStatus().getMessage());
 		}
 		fProjText.setText(projectName);
 	}
-	
+
 	/**
 	 * Maps the config to associated java resource
-	 * 
+	 *
 	 * @param config
 	 */
 	protected void mapResources(ILaunchConfigurationWorkingCopy config)  {
@@ -210,6 +210,6 @@
 		} catch(CoreException ce) {
 			setErrorMessage(ce.getStatus().getMessage());
 		}
-	}	
-	
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletLaunchConfigurationUtils.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletLaunchConfigurationUtils.java
index e6e501a..bd9c727 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletLaunchConfigurationUtils.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletLaunchConfigurationUtils.java
@@ -43,11 +43,11 @@
 import org.eclipse.osgi.util.NLS;
 
 public class AppletLaunchConfigurationUtils {
-	
+
 	/**
 	 * Throws a core exception with an error status object built from
 	 * the given message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the
 	 *  error, or <code>null</code> if none
@@ -65,13 +65,13 @@
 	}
 
 	/**
-	 * Return the <code>IType</code> referenced by the specified name and contained in 
-	 * the specified project or throw a <code>CoreException</code> whose message explains why 
+	 * Return the <code>IType</code> referenced by the specified name and contained in
+	 * the specified project or throw a <code>CoreException</code> whose message explains why
 	 * this couldn't be done.
 	 */
 	public static IType getMainType(String mainTypeName, IJavaProject javaProject) throws CoreException {
 		if ((mainTypeName == null) || (mainTypeName.trim().length() < 1)) {
-			abort(LauncherMessages.appletlauncher_utils_error_main_type_not_specified, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); 
+			abort(LauncherMessages.appletlauncher_utils_error_main_type_not_specified, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE);
 		}
 		IType mainType = null;
 		try {
@@ -79,11 +79,11 @@
 		} catch (JavaModelException jme) {
 		}
 		if (mainType == null) {
-			abort(NLS.bind(LauncherMessages.appletlauncher_utils_error_main_type_does_not_exist, new String[] {mainTypeName, javaProject.getElementName()}), null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); 
+			abort(NLS.bind(LauncherMessages.appletlauncher_utils_error_main_type_does_not_exist, new String[] {mainTypeName, javaProject.getElementName()}), null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE);
 		}
 		return mainType;
-	}		
-	
+	}
+
 
 	/**
 	 * Find the specified (fully-qualified) type name in the specified java project.
@@ -100,15 +100,15 @@
 		} else if (javaElement.getElementType() == IJavaElement.CLASS_FILE) {
 			return ((IClassFile) javaElement).getType();
 		}
-		return null; 
+		return null;
 	}
 
 	/**
-	 * 
+	 *
 	 */
 	public static Set<IType> collectAppletTypesInProject(IProgressMonitor monitor, IJavaProject project) {
 		IType[] types;
-		HashSet<IType> result = new HashSet<IType>(5);
+		HashSet<IType> result = new HashSet<>(5);
 		try {
 			IType javaLangApplet = AppletLaunchConfigurationUtils.getMainType("java.applet.Applet", project); //$NON-NLS-1$
 			ITypeHierarchy hierarchy = javaLangApplet.newTypeHierarchy(project, new SubProgressMonitor(monitor, 1));
@@ -127,7 +127,7 @@
 		monitor.done();
 		return result;
 	}
-	
+
 	public static void collectTypes(Object element, IProgressMonitor monitor, Set<Object> result) throws JavaModelException/*, InvocationTargetException*/ {
 		element= computeScope(element);
 		while(element instanceof IMember) {
@@ -174,13 +174,13 @@
 	}
 
 	private static List<IType> searchSubclassesOfApplet(IProgressMonitor pm, IJavaElement javaElement) {
-		return new ArrayList<IType>(collectAppletTypesInProject(pm, javaElement.getJavaProject()));
+		return new ArrayList<>(collectAppletTypesInProject(pm, javaElement.getJavaProject()));
 	}
-	
+
 	private static boolean isSubclassOfApplet(IProgressMonitor pm, IType type) {
 		return collectAppletTypesInProject(pm, type.getJavaProject()).contains(type);
 	}
-	
+
 	private static Object computeScope(Object element) {
         if (element instanceof IJavaElement) {
             return element;
@@ -196,7 +196,7 @@
 			} else {
 			    element= javaElement;
             }
-            
+
 		}
 		return element;
 	}
@@ -210,14 +210,14 @@
 	 * @throws InterruptedException
 	 */
 	public static IType[] findApplets(IRunnableContext context, final Object[] elements) throws InvocationTargetException, InterruptedException {
-		final Set<Object> result= new HashSet<Object>();
-	
+		final Set<Object> result= new HashSet<>();
+
 		if (elements.length > 0) {
 			IRunnableWithProgress runnable= new IRunnableWithProgress() {
 				@Override
 				public void run(IProgressMonitor pm) throws InterruptedException {
 					int nElements= elements.length;
-					pm.beginTask(LauncherMessages.appletlauncher_search_task_inprogress, nElements); 
+					pm.beginTask(LauncherMessages.appletlauncher_search_task_inprogress, nElements);
 					try {
 						for (int i= 0; i < nElements; i++) {
 							try {
@@ -234,7 +234,7 @@
 					}
 				}
 			};
-			context.run(true, true, runnable);			
+			context.run(true, true, runnable);
 		}
 		return result.toArray(new IType[result.size()]) ;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletSelectionDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletSelectionDialog.java
index 95f2286..dce9b39 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletSelectionDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletSelectionDialog.java
@@ -88,7 +88,7 @@
 		setElements(types);
 		return super.open();
 	}
-	
+
 	/**
 	 * Return all types extending <code>java.lang.Applet</code> in the project, or
 	 * all types extending Applet in the workspace if the project is <code>null</code>.
@@ -108,23 +108,23 @@
 		} else {
 			javaProjects = new IJavaProject[] {fProject};
 		}
-		
-		// For each java project, calculate the Applet types it contains and add 
+
+		// For each java project, calculate the Applet types it contains and add
 		// them to the results
 		final int projectCount = javaProjects.length;
-		final Set<IType> results = new HashSet<IType>(projectCount);
+		final Set<IType> results = new HashSet<>(projectCount);
 		boolean canceled = false;
 		try {
 			fRunnableContext.run(true, true, new IRunnableWithProgress() {
 				@Override
-				public void run(IProgressMonitor monitor) {	
-					monitor.beginTask(LauncherMessages.AppletSelectionDialog_Searching____1, projectCount); 
+				public void run(IProgressMonitor monitor) {
+					monitor.beginTask(LauncherMessages.AppletSelectionDialog_Searching____1, projectCount);
 					for (int i = 0; i < projectCount; i++) {
 						IJavaProject javaProject = javaProjects[i];
-						SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1); 
+						SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
 						results.addAll(AppletLaunchConfigurationUtils.collectAppletTypesInProject(subMonitor, javaProject));
 						monitor.worked(1);
-					}					
+					}
 					monitor.done();
 				}
 			});
@@ -138,8 +138,8 @@
 			return null;
 		}
 		IType[] types = null;
-		types = results.toArray(new IType[results.size()]);		
-		return types; 
+		types = results.toArray(new IType[results.size()]);
+		return types;
 	}
 
 	/**
@@ -167,5 +167,5 @@
 	private IWorkspaceRoot getWorkspaceRoot() {
 		return ResourcesPlugin.getWorkspace().getRoot();
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletWorkingDirectoryBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletWorkingDirectoryBlock.java
index 97d2ae5..2c9db42 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletWorkingDirectoryBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/AppletWorkingDirectoryBlock.java
@@ -14,7 +14,7 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jdt.launching.JavaRuntime;
 
- 
+
 public class AppletWorkingDirectoryBlock extends JavaWorkingDirectoryBlock {
 
 	/**
@@ -28,7 +28,7 @@
 			setDefaultWorkingDirectoryText("${workspace_loc:"  + outputDir + "}");  //$NON-NLS-1$//$NON-NLS-2$
 		} else {
 			super.setDefaultWorkingDir();
-		}		
+		}
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ArchiveFileFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ArchiveFileFilter.java
index 0a0e255..a472c3d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ArchiveFileFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ArchiveFileFilter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,10 +32,10 @@
 	private static final String[] fgArchiveExtensions= { "jar", "zip" }; //$NON-NLS-1$ //$NON-NLS-2$
 
 	private List<IFile> fExcludes;
-	
+
 	/**
 	 * @param excludedFiles Excluded files will not pass the filter.
-	 * <code>null</code> is allowed if no files should be excluded. 
+	 * <code>null</code> is allowed if no files should be excluded.
 	 */
 	public ArchiveFileFilter(IFile[] excludedFiles) {
 		if (excludedFiles != null) {
@@ -44,7 +44,7 @@
 			fExcludes= null;
 		}
 	}
-	
+
 	/*
 	 * @see ViewerFilter#select
 	 */
@@ -66,11 +66,11 @@
 				}
 			} catch (CoreException e) {
 				JDIDebugUIPlugin.log(e.getStatus());
-			}				
+			}
 		}
 		return false;
 	}
-	
+
 	public static boolean isArchivePath(IPath path) {
 		String ext= path.getFileExtension();
 		if (ext != null && ext.length() != 0) {
@@ -81,7 +81,7 @@
 			}
 		}
 		return false;
-	}		
-	
-			
+	}
+
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DebugTypeSelectionDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DebugTypeSelectionDialog.java
index 4ded676..783497d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DebugTypeSelectionDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DebugTypeSelectionDialog.java
@@ -42,17 +42,17 @@
 /**
  * This is a specialization of <code>FilteredItemsSelectionDialog</code> used to present
  * users with a listing of <code>IType</code>s that contain main methods
- * 
+ *
  * @since 3.3
- * 
+ *
  */
 public class DebugTypeSelectionDialog extends FilteredItemsSelectionDialog {
-	
+
 	/**
 	 * Main list label provider
 	 */
 	public class DebugTypeLabelProvider implements ILabelProvider {
-		HashMap<ImageDescriptor, Image> fImageMap = new HashMap<ImageDescriptor, Image>();
+		HashMap<ImageDescriptor, Image> fImageMap = new HashMap<>();
 
 		@Override
 		public Image getImage(Object element) {
@@ -83,7 +83,7 @@
 			}
 			return null;
 		}
-		
+
 		/**
 		 * Returns the name of the declaring container name
 		 * @param type the type to find the container name for
@@ -100,9 +100,9 @@
 			}
 			return name;
 		}
-		
+
 		/**
-		 * Returns the narrowest enclosing <code>IJavaElement</code> which is either 
+		 * Returns the narrowest enclosing <code>IJavaElement</code> which is either
 		 * an <code>IType</code> (enclosing) or an <code>IPackageFragment</code> (contained in)
 		 * @param type the type to find the enclosing <code>IJavaElement</code> for.
 		 * @return the enclosing element or <code>null</code> if none
@@ -127,7 +127,7 @@
 		@Override
 		public void removeListener(ILabelProviderListener listener) {}
 	}
-	
+
 	/**
 	 * Provides a label and image for the details area of the dialog
 	 */
@@ -143,7 +143,7 @@
 						if(project != null) {
 							try {
 								return project.getOutputLocation().toOSString().substring(1)+" - "+name; //$NON-NLS-1$
-							} 
+							}
 							catch (JavaModelException e) {JDIDebugUIPlugin.log(e);}
 						}
 					}
@@ -162,7 +162,7 @@
 			return super.getImage(element);
 		}
 	}
-	
+
 	/**
 	 * Simple items filter
 	 */
@@ -179,14 +179,14 @@
 			return matches(((IType)item).getElementName());
 		}
 	}
-	
+
 	/**
 	 * The selection history for the dialog
 	 */
 	class DebugTypeSelectionHistory extends SelectionHistory {
 		@Override
 		protected Object restoreItemFromMemento(IMemento memento) {
-			IJavaElement element = JavaCore.create(memento.getTextData()); 
+			IJavaElement element = JavaCore.create(memento.getTextData());
 			return (element instanceof IType ? element : null);
 		}
 		@Override
@@ -196,7 +196,7 @@
 			}
 		}
 	}
-	
+
 	private static final String SETTINGS_ID = JDIDebugUIPlugin.getUniqueIdentifier() + ".MAIN_METHOD_SELECTION_DIALOG"; //$NON-NLS-1$
 	private IType[] fTypes = null;
 
@@ -234,7 +234,7 @@
 		IDialogSettings section = settings.getSection(SETTINGS_ID);
 		if (section == null) {
 			section = settings.addNewSection(SETTINGS_ID);
-		} 
+		}
 		return section;
 	}
 
@@ -254,7 +254,7 @@
         };
         return comp;
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object)
 	 */
@@ -262,7 +262,7 @@
 	protected IStatus validateItem(Object item) {
 		return Status.OK_STATUS;
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createExtendedContentArea(org.eclipse.swt.widgets.Composite)
 	 */
@@ -292,7 +292,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getElementName(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DefineSystemLibraryQuickFix.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DefineSystemLibraryQuickFix.java
index 66afcf6..813175a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DefineSystemLibraryQuickFix.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/DefineSystemLibraryQuickFix.java
@@ -17,10 +17,10 @@
 import org.eclipse.ui.IMarkerResolution;
 
 /**
- * Quick fix to define a new system library (none were found). 
+ * Quick fix to define a new system library (none were found).
  */
 public class DefineSystemLibraryQuickFix implements IMarkerResolution {
-	
+
 	public DefineSystemLibraryQuickFix() {
 		super();
 	}
@@ -32,12 +32,12 @@
 	public void run(IMarker marker) {
 		JDIDebugUIPlugin.showPreferencePage(JREsPreferencePage.ID);
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.IMarkerResolution#getLabel()
 	 */
 	@Override
 	public String getLabel() {
-		return LauncherMessages.DefineSystemLibraryQuickFix_Create_a_system_library_definition_2; 
+		return LauncherMessages.DefineSystemLibraryQuickFix_Create_a_system_library_definition_2;
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ExecutionEnvironmentSelector.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ExecutionEnvironmentSelector.java
index 81241d3..0156101 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ExecutionEnvironmentSelector.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ExecutionEnvironmentSelector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,7 +36,7 @@
 		dialog.setTitle(LauncherMessages.ExecutionEnvironmentSelector_0);
 		dialog.setMultipleSelection(false);
 		dialog.setMessage(LauncherMessages.ExecutionEnvironmentSelector_1);
-		dialog.setElements(JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments()); 
+		dialog.setElements(JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments());
 		if (dialog.open() == Window.OK) {
 			return (((IExecutionEnvironment)dialog.getResult()[0]).getId());
 		}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IClasspathViewer.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IClasspathViewer.java
index b9e12da..b44888d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IClasspathViewer.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IClasspathViewer.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 	/**
 	 * Returns the entries in this viewer that are the children of the parent element
 	 * associated with the selected item(s)
-	 * 
+	 *
 	 * @return the entries in this viewer
 	 */
 	public IRuntimeClasspathEntry[] getEntries();
@@ -32,7 +32,7 @@
 	/**
 	 * Sets the entries in this viewer to the given runtime classpath
 	 * entries
-	 * 
+	 *
 	 * @param entries runtime classpath entries
 	 */
 	public void setEntries(IRuntimeClasspathEntry[] entries);
@@ -51,10 +51,10 @@
 
 	/**
 	 * Adds the given entries to the list. If there is no selection
-	 * in the list, the entries are added at the end of the list, 
+	 * in the list, the entries are added at the end of the list,
 	 * otherwise the new entries are added before the (first) selected
 	 * entry. The new entries are selected.
-	 * 
+	 *
 	 * @param entries additions
 	 */
 	public void addEntries(IRuntimeClasspathEntry[] res);
@@ -73,14 +73,14 @@
 
 	/**
 	 * Returns the index of an equivalent entry, or -1 if none.
-	 * 
+	 *
 	 * @return the index of an equivalent entry, or -1 if none
 	 */
 	public int indexOf(IRuntimeClasspathEntry entry);
 
 	/**
 	 * Returns whether an action of the supplied action type should be enabled based on the supplied selection.
-	 * 
+	 *
 	 * @param actionType One of RuntimeClasspathAction constants defining the action type
 	 * @param selection The selection to use for the update
 	 * @return Whether the action of this type should be enabled based on the selection
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IEntriesChangedListener.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IEntriesChangedListener.java
index 1639b98..f484aba 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IEntriesChangedListener.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/IEntriesChangedListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JREResolution.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JREResolution.java
index 16bd936..58c6d24 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JREResolution.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JREResolution.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,11 +26,11 @@
  * Superclass of for JRE resolution errors.
  */
 public abstract class JREResolution implements IMarkerResolution {
-	
+
 	/**
 	 * Prompts the user to choose a JRE for the given project.
 	 * Returns the selected VM or <code>null</code>.
-	 * 
+	 *
 	 * @param title the title for the dialog
 	 * @param message the message for the dialog
 	 * @return selected VM or <code>null</code>
@@ -44,15 +44,15 @@
 		dialog.open();
 		return (IVMInstall)dialog.getFirstResult();
 	}
-	
+
 	/**
 	 * Returns all defined VMs
-	 * 
+	 *
 	 * @return IVMInstall[]
 	 */
 	protected static IVMInstall[] getAllVMs() {
 		IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
-		List<IVMInstall> vms = new ArrayList<IVMInstall>();
+		List<IVMInstall> vms = new ArrayList<>();
 		for (int i = 0; i < types.length; i++) {
 			IVMInstallType type = types[i];
 			IVMInstall[] installs = type.getVMInstalls();
@@ -60,7 +60,7 @@
 				vms.add(installs[j]);
 			}
 		}
-		return vms.toArray(new IVMInstall[vms.size()]);		
+		return vms.toArray(new IVMInstall[vms.size()]);
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaAppletTabGroup.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaAppletTabGroup.java
index e6f3e33..c92b3c7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaAppletTabGroup.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaAppletTabGroup.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,13 +23,13 @@
 import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;
 
 public class JavaAppletTabGroup extends AbstractLaunchConfigurationTabGroup {
-	
+
 	/**
 	 * Constructs a new Java applet tab group.
 	 */
 	public JavaAppletTabGroup() {
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String)
 	 */
@@ -41,10 +41,10 @@
 			new AppletArgumentsTab(),
 			new JavaJRETab(),
 			new JavaClasspathTab(),
-			new SourceLookupTab(),	
+			new SourceLookupTab(),
 			new CommonTab()
 		};
 		setTabs(tabs);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaWorkingDirectoryBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaWorkingDirectoryBlock.java
index 8a46c96..3eec859 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaWorkingDirectoryBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JavaWorkingDirectoryBlock.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Remy Chi Jian Suen <remy.suen@gmail.com>
@@ -25,7 +25,7 @@
 /**
  * A UI block allowing a working directory to be specified for a launch
  * configuration.
- * 
+ *
  * @since 3.4
  */
 public class JavaWorkingDirectoryBlock extends WorkingDirectoryBlock {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java
index d8924d9..830b11b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,7 +30,7 @@
  * Generates quick fixes for unbound JREs.
  */
 public class JreResolutionGenerator implements IMarkerResolutionGenerator2 {
-	
+
 	private final static IMarkerResolution[] NO_RESOLUTION = new IMarkerResolution[0];
 
 	/**
@@ -39,10 +39,10 @@
 	@Override
 	public IMarkerResolution[] getResolutions(IMarker marker) {
 		try {
-			if(JavaRuntime.JRE_CONTAINER_MARKER.equals(marker.getType())) { 
-				return new IMarkerResolution[] {new OpenPreferencePageResolution(ExecutionEnvironmentsPreferencePage.ID, 
-						new String[] {ExecutionEnvironmentsPreferencePage.ID, JREsPreferencePage.ID}, 
-						LauncherMessages.JreResolutionGenerator_open_ee_prefs, 
+			if(JavaRuntime.JRE_CONTAINER_MARKER.equals(marker.getType())) {
+				return new IMarkerResolution[] {new OpenPreferencePageResolution(ExecutionEnvironmentsPreferencePage.ID,
+						new String[] {ExecutionEnvironmentsPreferencePage.ID, JREsPreferencePage.ID},
+						LauncherMessages.JreResolutionGenerator_open_ee_prefs,
 						LauncherMessages.JreResolutionGenerator_opens_ee_prefs)};
 			}
 			int id = marker.getAttribute(IJavaModelMarker.ID, -1);
@@ -61,7 +61,7 @@
 						return new IMarkerResolution[]{new DefineSystemLibraryQuickFix()};
 					}
 					break;
-	
+
 				// unbound classpath variable
 				case IJavaModelStatusConstants.CP_VARIABLE_PATH_UNBOUND :
 					arguments = CorrectionEngine.getProblemArguments(marker);
@@ -76,7 +76,7 @@
 					}
 					break;
 				// deprecated JRE library variables
-				case IJavaModelStatusConstants.DEPRECATED_VARIABLE : 
+				case IJavaModelStatusConstants.DEPRECATED_VARIABLE :
 					arguments = CorrectionEngine.getProblemArguments(marker);
 					path = new Path(arguments[0]);
 					if (path.segment(0).equals(JavaRuntime.JRELIB_VARIABLE) ||
@@ -92,7 +92,7 @@
 	}
 
 	/**
-	 * Returns the java project from the specified marker, or <code>null</code> if the marker 
+	 * Returns the java project from the specified marker, or <code>null</code> if the marker
 	 * does not have an associated java project
 	 * @param marker
 	 * @return the associated java project or <code>null</code>
@@ -108,7 +108,7 @@
 	public boolean hasResolutions(IMarker marker) {
 		try {
 			String type = marker.getType();
-			return IJavaModelMarker.BUILDPATH_PROBLEM_MARKER.equals(type) || 
+			return IJavaModelMarker.BUILDPATH_PROBLEM_MARKER.equals(type) ||
 				   JavaRuntime.JRE_CONTAINER_MARKER.equals(type);
 		} catch (CoreException ce) {}
 		return false;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java
index e329a2b..8b27be5 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *  IBM - Initial API and implementation
  *  BEA - Daniel R Somerfield - Bug 88939
@@ -90,7 +90,7 @@
 	public static String JavaClasspathTab_Invalid_runtime_classpath_1;
 
 	public static String JavaSourceLookupTab_Source_1;
-	
+
 	public static String SourceLookupBlock_Source_1;
 	public static String SourceLookupBlock__Source_Lookup_Path__1;
 	public static String SourceLookupBlock__Search_for_duplicate_source_files_on_path_1;
@@ -106,7 +106,7 @@
 	public static String AbstractJavaMainTab_2;
 	public static String AbstractJavaMainTab_4;
 	public static String AbstractJavaMainTab_3;
-	
+
 	public static String appletlauncher_argumenttab_widthlabel_text;
 	public static String appletlauncher_argumenttab_heightlabel_text;
 	public static String appletlauncher_argumenttab_namelabel_text;
@@ -156,7 +156,7 @@
 
 	public static String ExecutionEnvironmentSelector_0;
 	public static String ExecutionEnvironmentSelector_1;
-	
+
 	public static String JavaAppletLaunchShortcut_0;
 	public static String JavaAppletLaunchShortcut_1;
 	public static String JavaAppletLaunchShortcut_2;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LocalJavaApplicationTabGroup.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LocalJavaApplicationTabGroup.java
index 0c982eb..28ef7a6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LocalJavaApplicationTabGroup.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LocalJavaApplicationTabGroup.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.launcher;
 
- 
+
 import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
 import org.eclipse.debug.ui.CommonTab;
 import org.eclipse.debug.ui.EnvironmentTab;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/MainMethodSearchEngine.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/MainMethodSearchEngine.java
index ee84fd2..8e8fc2b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/MainMethodSearchEngine.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/MainMethodSearchEngine.java
@@ -38,17 +38,17 @@
 import org.eclipse.jface.operation.IRunnableWithProgress;
 
 public class MainMethodSearchEngine{
-	
+
 	private class MethodCollector extends SearchRequestor {
 		private List<IType> fResult;
 
 		public MethodCollector() {
-			fResult = new ArrayList<IType>(200);
+			fResult = new ArrayList<>(200);
 		}
 
 		public List<IType> getResult() {
 			return fResult;
-		}	
+		}
 
 		/* (non-Javadoc)
 		 * @see org.eclipse.jdt.core.search.SearchRequestor#acceptSearchMatch(org.eclipse.jdt.core.search.SearchMatch)
@@ -74,18 +74,18 @@
 	 * Searches for all main methods in the given scope.
 	 * Valid styles are IJavaElementSearchConstants.CONSIDER_BINARIES and
 	 * IJavaElementSearchConstants.CONSIDER_EXTERNAL_JARS
-	 * 
+	 *
 	 * @param pm progress monitor
 	 * @param scope search scope
 	 * @param includeSubtypes whether to consider types that inherit a main method
-	 */	
+	 */
 	public IType[] searchMainMethods(IProgressMonitor pm, IJavaSearchScope scope, boolean includeSubtypes) {
-		pm.beginTask(LauncherMessages.MainMethodSearchEngine_1, 100); 
+		pm.beginTask(LauncherMessages.MainMethodSearchEngine_1, 100);
 		int searchTicks = 100;
 		if (includeSubtypes) {
 			searchTicks = 25;
 		}
-		
+
 		SearchPattern pattern = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE); //$NON-NLS-1$
 		SearchParticipant[] participants = new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()};
 		MethodCollector collector = new MethodCollector();
@@ -99,7 +99,7 @@
 		List<IType> result = collector.getResult();
 		if (includeSubtypes) {
 			IProgressMonitor subtypesMonitor = new SubProgressMonitor(pm, 75);
-			subtypesMonitor.beginTask(LauncherMessages.MainMethodSearchEngine_2, result.size()); 
+			subtypesMonitor.beginTask(LauncherMessages.MainMethodSearchEngine_2, result.size());
 			Set<IType> set = addSubtypes(result, subtypesMonitor, scope);
 			return set.toArray(new IType[set.size()]);
 		}
@@ -107,7 +107,7 @@
 	}
 
 	/**
-	 * Adds subtypes and enclosed types to the listing of 'found' types 
+	 * Adds subtypes and enclosed types to the listing of 'found' types
 	 * @param types the list of found types thus far
 	 * @param monitor progress monitor
 	 * @param scope the scope of elements
@@ -115,7 +115,7 @@
 	 */
 	private Set<IType> addSubtypes(List<IType> types, IProgressMonitor monitor, IJavaSearchScope scope) {
 		Iterator<IType> iterator = types.iterator();
-		Set<IType> result = new HashSet<IType>(types.size());
+		Set<IType> result = new HashSet<>(types.size());
 		IType type = null;
 		ITypeHierarchy hierarchy = null;
 		IType[] subtypes = null;
@@ -129,34 +129,34 @@
 						if (scope.encloses(subtypes[i])) {
 							result.add(subtypes[i]);
 						}
-					}				
-				} 
+					}
+				}
 				catch (JavaModelException e) {JDIDebugUIPlugin.log(e);}
 			}
 			monitor.worked(1);
 		}
 		return result;
 	}
-	
-	
+
+
 	/**
 	 * Returns the package fragment root of <code>IJavaElement</code>. If the given
 	 * element is already a package fragment root, the element itself is returned.
 	 */
 	public static IPackageFragmentRoot getPackageFragmentRoot(IJavaElement element) {
 		return (IPackageFragmentRoot) element.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
-	}	
-	
+	}
+
 	/**
 	 * Searches for all main methods in the given scope.
 	 * Valid styles are IJavaElementSearchConstants.CONSIDER_BINARIES and
 	 * IJavaElementSearchConstants.CONSIDER_EXTERNAL_JARS
-	 * 
+	 *
 	 * @param includeSubtypes whether to consider types that inherit a main method
 	 */
-	public IType[] searchMainMethods(IRunnableContext context, final IJavaSearchScope scope, final boolean includeSubtypes) throws InvocationTargetException, InterruptedException  {		
+	public IType[] searchMainMethods(IRunnableContext context, final IJavaSearchScope scope, final boolean includeSubtypes) throws InvocationTargetException, InterruptedException  {
 		final IType[][] res= new IType[1][];
-		
+
 		IRunnableWithProgress runnable= new IRunnableWithProgress() {
 			@Override
 			public void run(IProgressMonitor pm) throws InvocationTargetException {
@@ -164,8 +164,8 @@
 			}
 		};
 		context.run(true, true, runnable);
-		
+
 		return res[0];
 	}
-			
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/NameValuePairDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/NameValuePairDialog.java
index 11d5339..9bf0627 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/NameValuePairDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/NameValuePairDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -34,7 +34,7 @@
 	private String fTitle;
 	private String[] fFieldLabels;
 	private String[] fInitialValues;
-	
+
 	private Label fNameLabel;
 	private Text fNameText;
 	private Label fValueLabel;
@@ -53,21 +53,21 @@
 	@Override
 	protected Control createDialogArea(Composite parent) {
 		Font font = parent.getFont();
-		
+
 		Composite comp = (Composite) super.createDialogArea(parent);
 		((GridLayout)comp.getLayout()).numColumns=2;
-		
+
 		fNameLabel = new Label(comp, SWT.NONE);
 		fNameLabel.setText(fFieldLabels[0]);
 		fNameLabel.setFont(font);
-		
+
 		ModifyListener listener= new ModifyListener() {
 			@Override
 			public void modifyText(ModifyEvent e) {
 				updateButtons();
 			}
 		};
-		
+
 		fNameText = new Text(comp, SWT.BORDER | SWT.SINGLE);
 		fNameText.setText(fInitialValues[0]);
 		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
@@ -75,23 +75,23 @@
 		fNameText.setLayoutData(gd);
 		fNameText.setFont(font);
 		fNameText.addModifyListener(listener);
-		
+
 		fValueLabel = new Label(comp, SWT.NONE);
 		fValueLabel.setText(fFieldLabels[1]);
 		fValueLabel.setFont(font);
-		
+
 		fValueText = new Text(comp, SWT.BORDER | SWT.SINGLE);
 		fValueText.setText(fInitialValues[1]);
 		gd = new GridData(GridData.FILL_HORIZONTAL);
 		gd.widthHint = 300;
 		fValueText.setLayoutData(gd);
 		fValueText.setFont(font);
-		fValueText.addModifyListener(listener);		
-		
+		fValueText.addModifyListener(listener);
+
 		applyDialogFont(comp);
 		return comp;
 	}
-	
+
 	/**
 	 * Return the name/value pair entered in this dialog.  If the cancel button was hit,
 	 * both will be <code>null</code>.
@@ -99,7 +99,7 @@
 	public String[] getNameValuePair() {
 		return new String[] {fName, fValue};
 	}
-	
+
 	/**
 	 * @see Dialog#buttonPressed(int)
 	 */
@@ -114,7 +114,7 @@
 		}
 		super.buttonPressed(buttonId);
 	}
-	
+
 	/**
 	 * @see Window#configureShell(Shell)
 	 */
@@ -125,7 +125,7 @@
 			shell.setText(fTitle);
 		}
 	}
-	
+
 	/**
 	 * Enable the OK button if valid input
 	 */
@@ -134,7 +134,7 @@
 		String value = fValueText.getText().trim();
 		getButton(IDialogConstants.OK_ID).setEnabled((name.length() > 0) &&(value.length() > 0));
 	}
-	
+
 	/**
 	 * Enable the buttons on creation.
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/OpenPreferencePageResolution.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/OpenPreferencePageResolution.java
index 3413508..89d5f59 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/OpenPreferencePageResolution.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/OpenPreferencePageResolution.java
@@ -22,7 +22,7 @@
 
 /**
  * Marker resolution to open a preference page
- * 
+ *
  * @since 3.5
  */
 public class OpenPreferencePageResolution implements IMarkerResolution2 {
@@ -31,10 +31,10 @@
 	private String label = null;
 	private String description = null;
 	private String[] additional = null;
-	
+
 	/**
 	 * Constructor
-	 * 
+	 *
 	 * @param pageid the id of the page to show
 	 * @param additional the page ids of additional pages to show as well
 	 * @param label the label to show for the resolution
@@ -46,7 +46,7 @@
 		this.label = label;
 		this.description = description;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IMarkerResolution2#getDescription()
 	 */
@@ -80,7 +80,7 @@
 			@Override
 			public IStatus runInUIThread(IProgressMonitor monitor) {
 				SWTFactory.showPreferencePage(
-							OpenPreferencePageResolution.this.pageid, 
+							OpenPreferencePageResolution.this.pageid,
 							OpenPreferencePageResolution.this.additional);
 				return Status.OK_STATUS;
 			}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ProjectClasspathArgumentSelector.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ProjectClasspathArgumentSelector.java
index f78410e..899049c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ProjectClasspathArgumentSelector.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/ProjectClasspathArgumentSelector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,7 +38,7 @@
 		dialog.setTitle(LauncherMessages.ProjectClasspathArugumentSelector_0);
 		dialog.setMultipleSelection(false);
 		dialog.setMessage(LauncherMessages.ProjectClasspathArugumentSelector_1);
-		List<IJavaProject> javaProjects = new ArrayList<IJavaProject>();
+		List<IJavaProject> javaProjects = new ArrayList<>();
 		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
 		for (int i = 0; i < projects.length; i++) {
 			IJavaProject jp = JavaCore.create(projects[i]);
@@ -46,7 +46,7 @@
 				javaProjects.add(jp);
 			}
 		}
-		dialog.setElements(javaProjects.toArray()); 
+		dialog.setElements(javaProjects.toArray());
 		if (dialog.open() == Window.OK) {
 			return (((IJavaProject)dialog.getResult()[0]).getElementName());
 		}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RemoteJavaApplicationTabGroup.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RemoteJavaApplicationTabGroup.java
index 79e0b1c..1e70373 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RemoteJavaApplicationTabGroup.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RemoteJavaApplicationTabGroup.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.launcher;
 
- 
+
 import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
 import org.eclipse.debug.ui.CommonTab;
 import org.eclipse.debug.ui.ILaunchConfigurationDialog;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathAdvancedDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathAdvancedDialog.java
index 421c8d6..7fcf993 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathAdvancedDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathAdvancedDialog.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,8 +39,8 @@
 public class RuntimeClasspathAdvancedDialog extends Dialog {
 
 	private IAction[] fActions;
-	private Button[] fButtons;	
-	
+	private Button[] fButtons;
+
 	private IClasspathViewer fViewer;
 	private Button fAddVariableStringButton;
 	private Text fVariableString;
@@ -48,7 +48,7 @@
 	/**
 	 * Constructs a new dialog on the given shell, with the specified
 	 * set of actions.
-	 * 
+	 *
 	 * @param parentShell
 	 * @param actions advanced actions
 	 */
@@ -67,15 +67,15 @@
 		Composite inner= new Composite(parent, SWT.NONE);
 		GridLayout layout= new GridLayout();
 		inner.setLayout(layout);
-		
+
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		inner.setLayoutData(gd);
-		
+
 		Label l = new Label(inner, SWT.NONE);
-		l.setText(LauncherMessages.RuntimeClasspathAdvancedDialog_Select_an_advanced_option__1); 
+		l.setText(LauncherMessages.RuntimeClasspathAdvancedDialog_Select_an_advanced_option__1);
 		gd = new GridData(GridData.FILL_HORIZONTAL);
 		l.setLayoutData(gd);
-		
+
 		fButtons = new Button[fActions.length];
 		for (int i = 0; i < fActions.length; i++) {
 			IAction action= fActions[i];
@@ -85,34 +85,34 @@
 			fButtons[i].setEnabled(action.isEnabled());
 			fButtons[i].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 		}
-		
+
 		addVariableStringComposite(inner);
 
-		getShell().setText(LauncherMessages.RuntimeClasspathAdvancedDialog_Advanced_Options_1); 
-		
+		getShell().setText(LauncherMessages.RuntimeClasspathAdvancedDialog_Advanced_Options_1);
+
 		Dialog.applyDialogFont(parent);
 		return inner;
 	}
 
 	private void addVariableStringComposite(Composite composite) {
 		fAddVariableStringButton = new Button(composite, SWT.RADIO);
-		fAddVariableStringButton.setText(LauncherMessages.RuntimeClasspathAdvancedDialog_6); 
+		fAddVariableStringButton.setText(LauncherMessages.RuntimeClasspathAdvancedDialog_6);
 		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
 		fAddVariableStringButton.setLayoutData(gd);
-		
+
 		final Composite inner = new Composite(composite, SWT.NONE);
 		inner.setLayout(new GridLayout(2, false));
 		inner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
+
 		fVariableString = new Text(inner, SWT.SINGLE | SWT.BORDER);
 		gd = new GridData(GridData.FILL_HORIZONTAL);
 		gd.grabExcessHorizontalSpace = true;
 		fVariableString.setLayoutData(gd);
-		
-		final Button fVariablesButton = createButton(inner, IDialogConstants.IGNORE_ID, LauncherMessages.RuntimeClasspathAdvancedDialog_7, false); 
+
+		final Button fVariablesButton = createButton(inner, IDialogConstants.IGNORE_ID, LauncherMessages.RuntimeClasspathAdvancedDialog_7, false);
 		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
 		fVariablesButton.setLayoutData(gd);
-		
+
 		fVariablesButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -124,7 +124,7 @@
 				}
 			}
 		});
-		
+
 		fAddVariableStringButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -164,11 +164,11 @@
 		}
 		super.okPressed();
 	}
-		
+
 	protected String getDialogSettingsSectionName() {
 		return IJavaDebugUIConstants.PLUGIN_ID + ".RUNTIME_CLASSPATH_ADVANCED_DIALOG"; //$NON-NLS-1$
 	}
-	
+
 	 /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
      */
@@ -178,7 +178,7 @@
          IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
          if (section == null) {
              section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
+         }
          return section;
     }
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathEntryLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathEntryLabelProvider.java
index c32a69d..f71cef4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathEntryLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathEntryLabelProvider.java
@@ -46,14 +46,14 @@
  * Label provider for runtime classpath entries.
  */
 public class RuntimeClasspathEntryLabelProvider extends LabelProvider {
-		
+
 	private WorkbenchLabelProvider lp = new WorkbenchLabelProvider();
-	
+
 	/**
 	 * Context in which to render containers, or <code>null</code>
 	 */
 	private ILaunchConfiguration fLaunchConfiguration;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
 	 */
@@ -87,7 +87,7 @@
 	                        key = ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE_WITH_SOURCE;
 						} else {
 							key = ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE;
-						}	
+						}
 					}
 
 				} else {
@@ -99,7 +99,7 @@
 				}
 				return JavaUI.getSharedImages().getImage(key);
 			case IRuntimeClasspathEntry.VARIABLE:
-				return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_ENV_VAR);				
+				return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_ENV_VAR);
 			case IRuntimeClasspathEntry.CONTAINER:
                 return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
 			case IRuntimeClasspathEntry.OTHER:
@@ -115,7 +115,7 @@
                     return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
 				}
 				return lp.getImage(resource);
-		}	
+		}
 		return null;
 	}
 
@@ -151,7 +151,7 @@
 						displayPath.append(device);
 					}
 					displayPath.append(File.separator);
-					for (int i = 0; i < segments.length - 1; i++) { 
+					for (int i = 0; i < segments.length - 1; i++) {
 						displayPath.append(segments[i]).append(File.separator);
 					}
 				} else {
@@ -170,12 +170,12 @@
 						buf.append(IPath.SEPARATOR);
 						buf.append(rootPath.toString());
 					}
-					buf.append(']'); 
+					buf.append(']');
 				}
 				// append JRE name if we can compute it
 				if (path.equals(new Path(JavaRuntime.JRELIB_VARIABLE)) && fLaunchConfiguration != null) {
 					try {
-						IVMInstall vm = JavaRuntime.computeVMInstall(fLaunchConfiguration);					
+						IVMInstall vm = JavaRuntime.computeVMInstall(fLaunchConfiguration);
 						buf.append(" - "); //$NON-NLS-1$
 						buf.append(vm.getName());
 					} catch (CoreException e) {
@@ -219,10 +219,10 @@
 					return ((IRuntimeClasspathEntry2)delegate).getName();
 				}
 				return name;
-		}	
+		}
 		return ""; //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
 	 */
@@ -231,7 +231,7 @@
 		super.dispose();
 		lp.dispose();
 	}
-	
+
 	/**
 	 * Sets the launch configuration context for this label provider
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathViewer.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathViewer.java
index 5767171..c356217 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathViewer.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/RuntimeClasspathViewer.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.launcher;
 
- 
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -33,24 +33,24 @@
  * A viewer that displays and manipulates runtime classpath entries.
  */
 public class RuntimeClasspathViewer extends TableViewer implements IClasspathViewer {
-	
+
 	/**
 	 * Whether enabled/editable.
 	 */
 	private boolean fEnabled = true;
-	
+
 	/**
 	 * Entry changed listeners
 	 */
 	private ListenerList<IEntriesChangedListener> fListeners = new ListenerList<>();
-	
+
 	/**
 	 * The runtime classpath entries displayed in this viewer
 	 */
-	protected List<IRuntimeClasspathEntry> fEntries = new ArrayList<IRuntimeClasspathEntry>();
-	
+	protected List<IRuntimeClasspathEntry> fEntries = new ArrayList<>();
+
 	class ContentProvider implements IStructuredContentProvider {
-			
+
 		/**
 		 * @see IStructuredContentProvider#getElements(Object)
 		 */
@@ -72,9 +72,9 @@
 		@Override
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
-		
+
 	}
-		
+
 	/**
 	 * Creates a runtime classpath viewer with the given parent.
 	 *
@@ -86,7 +86,7 @@
 		RuntimeClasspathEntryLabelProvider lp = new RuntimeClasspathEntryLabelProvider();
 		setLabelProvider(lp);
 		setInput(fEntries);
-		
+
 		getTable().addKeyListener(new KeyAdapter() {
 			@Override
 			public void keyPressed(KeyEvent event) {
@@ -97,8 +97,8 @@
 					notifyChanged();
 				}
 			}
-		});	
-	}	
+		});
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#setEntries(org.eclipse.jdt.launching.IRuntimeClasspathEntry[])
@@ -112,7 +112,7 @@
 		setInput(fEntries);
 		notifyChanged();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#getEntries()
 	 */
@@ -120,7 +120,7 @@
 	public IRuntimeClasspathEntry[] getEntries() {
 		return fEntries.toArray(new IRuntimeClasspathEntry[fEntries.size()]);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#addEntries(org.eclipse.jdt.launching.IRuntimeClasspathEntry[])
 	 */
@@ -145,8 +145,8 @@
 		setSelection(new StructuredSelection(entries));
 		refresh();
 		notifyChanged();
-	}	
-	
+	}
+
 	/**
 	 * Enables/disables this viewer. Note the control is not disabled, since
 	 * we still want the user to be able to scroll if required to see the
@@ -157,7 +157,7 @@
 		// fire selection change to update actions
 		setSelection(getSelection());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#isEnabled()
 	 */
@@ -165,7 +165,7 @@
 	public boolean isEnabled() {
 		return fEnabled;
 	}
-	
+
 	/**
 	 * Sets the launch configuration context for this viewer, if any
 	 */
@@ -174,15 +174,15 @@
 			((RuntimeClasspathEntryLabelProvider)getLabelProvider()).setLaunchConfiguration(configuration);
 		}
 	}
-	
+
 	public void addEntriesChangedListener(IEntriesChangedListener listener) {
 		fListeners.add(listener);
 	}
-	
+
 	public void removeEntriesChangedListener(IEntriesChangedListener listener) {
 		fListeners.remove(listener);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#notifyChanged()
 	 */
@@ -192,7 +192,7 @@
 			listener.entriesChanged(this);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.debug.ui.launcher.IClasspathViewer#indexOf(org.eclipse.jdt.launching.IRuntimeClasspathEntry)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectDefaultSystemLibraryQuickFix.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectDefaultSystemLibraryQuickFix.java
index f115d2a..49df54b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectDefaultSystemLibraryQuickFix.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectDefaultSystemLibraryQuickFix.java
@@ -26,10 +26,10 @@
 import org.eclipse.ui.PlatformUI;
 
 /**
- * Quick fix to select an alternate default JRE. 
+ * Quick fix to select an alternate default JRE.
  */
 public class SelectDefaultSystemLibraryQuickFix extends JREResolution {
-	
+
 	public SelectDefaultSystemLibraryQuickFix() {
 		super();
 	}
@@ -40,9 +40,9 @@
 	@Override
 	public void run(IMarker marker) {
 		try {
-			String title = LauncherMessages.SelectDefaultSystemLibraryQuickFix_Select_Default_System_Library_1; 
-			String message = LauncherMessages.SelectDefaultSystemLibraryQuickFix__Select_the_system_library_to_use_by_default_for_building_and_running_Java_projects__2; 
-		
+			String title = LauncherMessages.SelectDefaultSystemLibraryQuickFix_Select_Default_System_Library_1;
+			String message = LauncherMessages.SelectDefaultSystemLibraryQuickFix__Select_the_system_library_to_use_by_default_for_building_and_running_Java_projects__2;
+
 			final IVMInstall vm = chooseVMInstall(title, message);
 			if (vm == null) {
 				return;
@@ -58,7 +58,7 @@
 						}
 				}
 			};
-		
+
 			try {
 				PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
 			} catch (InvocationTargetException e) {
@@ -68,18 +68,18 @@
 				throw new CoreException(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR,	"An exception occurred while updating the default system library.", e.getTargetException()));  //$NON-NLS-1$
 			} catch (InterruptedException e) {
 				// canceled
-			}			
+			}
 		} catch (CoreException e) {
-			JDIDebugUIPlugin.statusDialog(LauncherMessages.SelectDefaultSystemLibraryQuickFix_Unable_to_update_the_default_system_library__4, e.getStatus()); 
+			JDIDebugUIPlugin.statusDialog(LauncherMessages.SelectDefaultSystemLibraryQuickFix_Unable_to_update_the_default_system_library__4, e.getStatus());
 		}
 	}
-		
+
 	/**
 	 * @see org.eclipse.ui.IMarkerResolution#getLabel()
 	 */
 	@Override
 	public String getLabel() {
-		return LauncherMessages.SelectDefaultSystemLibraryQuickFix_Select_default_system_library_5; 
+		return LauncherMessages.SelectDefaultSystemLibraryQuickFix_Select_default_system_library_5;
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectSystemLibraryQuickFix.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectSystemLibraryQuickFix.java
index bbd0a72..895d5f8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectSystemLibraryQuickFix.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SelectSystemLibraryQuickFix.java
@@ -31,16 +31,16 @@
 import org.eclipse.ui.PlatformUI;
 
 /**
- * Quick fix to select an alternate JRE for a project. 
+ * Quick fix to select an alternate JRE for a project.
  */
 public class SelectSystemLibraryQuickFix extends JREResolution {
-	
+
 	private IPath fOldPath;
 	private IJavaProject fProject;
-	
+
 	public SelectSystemLibraryQuickFix(IPath oldPath, IJavaProject project) {
 		fOldPath = oldPath;
-		fProject = project;	
+		fProject = project;
 	}
 
 	/**
@@ -51,12 +51,12 @@
 		try {
 			handleContainerResolutionError(fOldPath, fProject);
 		} catch (CoreException e) {
-			JDIDebugUIPlugin.statusDialog(LauncherMessages.JREContainerResolution_Unable_to_update_classpath_1, e.getStatus());  
+			JDIDebugUIPlugin.statusDialog(LauncherMessages.JREContainerResolution_Unable_to_update_classpath_1, e.getStatus());
 		}
 	}
-	
-	protected void handleContainerResolutionError(final IPath oldPath, final IJavaProject project) throws CoreException {			
-		
+
+	protected void handleContainerResolutionError(final IPath oldPath, final IJavaProject project) throws CoreException {
+
 		String lib = oldPath.segment(0);
 		IPath initialPath = null;
 		if (JavaRuntime.JRELIB_VARIABLE.equals(lib)) {
@@ -89,7 +89,7 @@
 				}
 			}
 		};
-		
+
 		try {
 			PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
 		} catch (InvocationTargetException e) {
@@ -100,13 +100,13 @@
 		} catch (InterruptedException e) {
 			// cancelled
 		}
-	}		
+	}
 	/**
 	 * @see org.eclipse.ui.IMarkerResolution#getLabel()
 	 */
 	@Override
 	public String getLabel() {
-		return NLS.bind(LauncherMessages.JREContainerResolution_Select_a_system_library_to_use_when_building__0__2, new String[]{fProject.getElementName()}); 
+		return NLS.bind(LauncherMessages.JREContainerResolution_Select_a_system_library_to_use_when_building__0__2, new String[]{fProject.getElementName()});
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SharedJavaMainTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SharedJavaMainTab.java
index 0c2788e..3d48218 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SharedJavaMainTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SharedJavaMainTab.java
@@ -38,25 +38,25 @@
 import org.eclipse.swt.widgets.Text;
 
 /**
- * Provides general widgets and methods for a Java type launch configuration 
- * 'Main' tab. 
+ * Provides general widgets and methods for a Java type launch configuration
+ * 'Main' tab.
  * This class provides shared functionality for those main tabs which have a 'main type' field on them;
  * such as a main method for a local Java application, or an Applet for Java Applets
- * 
+ *
  * @since 3.2
  */
 public abstract class SharedJavaMainTab extends AbstractJavaMainTab {
 
 	protected Text fMainText;
 	private Button fSearchButton;
-	
+
 	/**
 	 * Creates the widgets for specifying a main type.
-	 * 
+	 *
 	 * @param parent the parent composite
 	 */
 	protected void createMainTypeEditor(Composite parent, String text) {
-		Group group = SWTFactory.createGroup(parent, text, 2, 1, GridData.FILL_HORIZONTAL); 
+		Group group = SWTFactory.createGroup(parent, text, 2, 1, GridData.FILL_HORIZONTAL);
 		fMainText = SWTFactory.createSingleText(group, 1);
 		fMainText.addModifyListener(new ModifyListener() {
 			@Override
@@ -65,7 +65,7 @@
 			}
 		});
 		ControlAccessibleListener.addListener(fMainText, group.getText());
-		fSearchButton = createPushButton(group, LauncherMessages.AbstractJavaMainTab_2, null); 
+		fSearchButton = createPushButton(group, LauncherMessages.AbstractJavaMainTab_2, null);
 		fSearchButton.addSelectionListener(new SelectionListener() {
 			@Override
 			public void widgetDefaultSelected(SelectionEvent e) {
@@ -77,19 +77,19 @@
 		});
 		createMainTypeExtensions(group);
 	}
-	
+
 	/**
 	 * This method allows the group for main type to be extended with custom controls.
 	 * All control added via this method come after the main type text editor and search button in
 	 * the order they are added to the parent composite
-	 * 
+	 *
 	 * @param parent the parent to add to
 	 * @since 3.3
 	 */
 	protected void createMainTypeExtensions(Composite parent) {
 		//do nothing by default
 	}
-	
+
 	/**
 	 * The select button pressed handler
 	 */
@@ -113,13 +113,13 @@
 			try {
 				IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[]{javaElement}, false);
 				MainMethodSearchEngine engine = new MainMethodSearchEngine();
-				IType[] types = engine.searchMainMethods(getLaunchConfigurationDialog(), scope, false);				
+				IType[] types = engine.searchMainMethods(getLaunchConfigurationDialog(), scope, false);
 				if (types != null && (types.length > 0)) {
 					// Simply grab the first main type found in the searched element
 					name = types[0].getFullyQualifiedName();
 				}
 			}
-			catch (InterruptedException ie) {JDIDebugUIPlugin.log(ie);} 
+			catch (InterruptedException ie) {JDIDebugUIPlugin.log(ie);}
 			catch (InvocationTargetException ite) {JDIDebugUIPlugin.log(ite);}
 		}
 		if (name == null) {
@@ -130,12 +130,12 @@
 			int index = name.lastIndexOf('.');
 			if (index > 0) {
 				name = name.substring(index + 1);
-			}	
+			}
 			name = getLaunchConfigurationDialog().generateName(name);
 			config.rename(name);
 		}
 	}
-	
+
 	/**
 	 * Loads the main type from the launch configuration's preference store
 	 * @param config the config to load the main type from
@@ -145,7 +145,7 @@
 		try {
 			mainTypeName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, EMPTY_STRING);
 		}
-		catch (CoreException ce) {JDIDebugUIPlugin.log(ce);}	
-		fMainText.setText(mainTypeName);	
+		catch (CoreException ce) {JDIDebugUIPlugin.log(ce);}
+		fMainText.setText(mainTypeName);
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementLabelProvider.java
index 93c30ff..00cb0db 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementQualifierProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementQualifierProvider.java
index 01b72c7..4532e3f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementQualifierProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceElementQualifierProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,7 +33,7 @@
  * A label provider for source element qualifiers found with a JavaSourceLocator
  */
 public class SourceElementQualifierProvider extends LabelProvider implements ILabelProvider {
-	
+
 	private JavaElementLabelProvider fJavaLabels;
 
 	/* (non-Javadoc)
@@ -63,7 +63,7 @@
 		}
 		return super.getText(element);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceLookupBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceLookupBlock.java
index 8fd4244..fbc7237 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceLookupBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/SourceLookupBlock.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -50,43 +50,43 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
- 
+
 /**
  * Control used to edit the source lookup path for a Java launch configuration.
  */
 public class SourceLookupBlock extends AbstractJavaClasspathTab implements ILaunchConfigurationTab {
-	
+
 	protected ILaunchConfiguration fConfig;
-	
+
 	protected RuntimeClasspathViewer fPathViewer;
 	protected Button fDefaultButton;
 	protected Button fDuplicatesButton;
-	
+
 	protected static final String DIALOG_SETTINGS_PREFIX = "SourceLookupBlock"; //$NON-NLS-1$
-	
+
 	/**
 	 * Creates and returns the source lookup control.
-	 * 
+	 *
 	 * @param parent the parent widget of this control
 	 */
 	@Override
 	public void createControl(Composite parent) {
 		Font font = parent.getFont();
-		
+
 		Composite comp = new Composite(parent, SWT.NONE);
 		GridLayout topLayout = new GridLayout();
 		topLayout.numColumns = 2;
-		comp.setLayout(topLayout);		
+		comp.setLayout(topLayout);
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		comp.setLayoutData(gd);
-		
+
 		Label viewerLabel= new Label(comp, SWT.LEFT);
-		viewerLabel.setText(LauncherMessages.SourceLookupBlock__Source_Lookup_Path__1); 
+		viewerLabel.setText(LauncherMessages.SourceLookupBlock__Source_Lookup_Path__1);
 		gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
 		gd.horizontalSpan= 2;
 		viewerLabel.setLayoutData(gd);
 		viewerLabel.setFont(font);
-		
+
 		fPathViewer = new RuntimeClasspathViewer(comp);
 		fPathViewer.addEntriesChangedListener(this);
 		gd = new GridData(GridData.FILL_BOTH);
@@ -101,11 +101,11 @@
 		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL);
 		pathButtonComp.setLayoutData(gd);
 		pathButtonComp.setFont(font);
-		
+
 		createVerticalSpacer(comp, 2);
-						
+
 		fDefaultButton = new Button(comp, SWT.CHECK);
-		fDefaultButton.setText(LauncherMessages.SourceLookupBlock_Use_defau_lt_source_lookup_path_1); 
+		fDefaultButton.setText(LauncherMessages.SourceLookupBlock_Use_defau_lt_source_lookup_path_1);
 		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
 		gd.horizontalSpan = 2;
 		fDefaultButton.setLayoutData(gd);
@@ -116,9 +116,9 @@
 				handleDefaultButtonSelected();
 			}
 		});
-		
+
 		fDuplicatesButton = new Button(comp, SWT.CHECK);
-		fDuplicatesButton.setText(LauncherMessages.SourceLookupBlock__Search_for_duplicate_source_files_on_path_1); 
+		fDuplicatesButton.setText(LauncherMessages.SourceLookupBlock__Search_for_duplicate_source_files_on_path_1);
 		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
 		gd.horizontalSpan = 2;
 		fDuplicatesButton.setLayoutData(gd);
@@ -129,59 +129,59 @@
 				setDirty(true);
 				updateLaunchConfigurationDialog();
 			}
-		});		
-		
-		List<RuntimeClasspathAction> advancedActions = new ArrayList<RuntimeClasspathAction>(5);
-		
+		});
+
+		List<RuntimeClasspathAction> advancedActions = new ArrayList<>(5);
+
 		GC gc = new GC(parent);
 		gc.setFont(parent.getFont());
 		FontMetrics fontMetrics= gc.getFontMetrics();
 		gc.dispose();
-				
-		RuntimeClasspathAction action = new MoveUpAction(fPathViewer);								
+
+		RuntimeClasspathAction action = new MoveUpAction(fPathViewer);
 		Button button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
 		action.setButton(button);
-		
-		action = new MoveDownAction(fPathViewer);								
-		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
-		action.setButton(button);	
 
-		action = new RemoveAction(fPathViewer);								
-		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
-		action.setButton(button);
-		
-		action = new AddProjectAction(fPathViewer);								
+		action = new MoveDownAction(fPathViewer);
 		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
 		action.setButton(button);
 
-		action = new AddJarAction(fPathViewer);								
+		action = new RemoveAction(fPathViewer);
 		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
 		action.setButton(button);
 
-		action = new AddExternalJarAction(fPathViewer, DIALOG_SETTINGS_PREFIX);								
+		action = new AddProjectAction(fPathViewer);
 		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
 		action.setButton(button);
 
-		action = new AddFolderAction(fPathViewer);								
+		action = new AddJarAction(fPathViewer);
+		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
+		action.setButton(button);
+
+		action = new AddExternalJarAction(fPathViewer, DIALOG_SETTINGS_PREFIX);
+		button  = createPushButton(pathButtonComp, action.getText(), fontMetrics);
+		action.setButton(button);
+
+		action = new AddFolderAction(fPathViewer);
 		advancedActions.add(action);
 
-		action = new AddExternalFolderAction(fPathViewer, DIALOG_SETTINGS_PREFIX);								
-		advancedActions.add(action);		
+		action = new AddExternalFolderAction(fPathViewer, DIALOG_SETTINGS_PREFIX);
+		advancedActions.add(action);
 
-		action = new AddVariableAction(fPathViewer);								
-		advancedActions.add(action);		
-		
+		action = new AddVariableAction(fPathViewer);
+		advancedActions.add(action);
+
 		action = new AddLibraryAction(null);
 		advancedActions.add(action);
-		
-		action = new AttachSourceAction(fPathViewer, SWT.RADIO);								
-		advancedActions.add(action);				
-									
+
+		action = new AttachSourceAction(fPathViewer, SWT.RADIO);
+		advancedActions.add(action);
+
 		IAction[] adv = advancedActions.toArray(new IAction[advancedActions.size()]);
 		action = new AddAdvancedAction(fPathViewer, adv);
 		button = createPushButton(pathButtonComp, action.getText(), fontMetrics);
 		action.setButton(button);
-				
+
 		setControl(comp);
 	}
 
@@ -210,10 +210,10 @@
 		fPathViewer.setEnabled(!def);
 		updateLaunchConfigurationDialog();
 	}
-	
+
 	/**
-	 * Creates and returns a button 
-	 * 
+	 * Creates and returns a button
+	 *
 	 * @param parent parent widget
 	 * @param label label
 	 * @return Button
@@ -224,15 +224,15 @@
 		button.setText(label);
 		GridData gd= getButtonGridData(button, fontMetrics);
 		button.setLayoutData(gd);
-		return button;	
+		return button;
 	}
-	
+
 	private GridData getButtonGridData(Button button, FontMetrics fontMetrics) {
 		GridData gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
 
 		int widthHint= Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH);
 		gd.widthHint= Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-	
+
 		return gd;
 	}
 
@@ -247,7 +247,7 @@
 			useDefault = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_SOURCE_PATH, true);
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
-		}		
+		}
 		if (config == getLaunchConfiguration()) {
 			// same as previously viewed launch config
 			if (!useDefault && !fDefaultButton.getSelection()) {
@@ -274,14 +274,14 @@
 		}
 		setDirty(false);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 	 */
 	@Override
 	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
 		if (isDirty()) {
-			boolean def = fDefaultButton.getSelection();		
+			boolean def = fDefaultButton.getSelection();
 			if (def) {
 				configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_SOURCE_PATH, (String)null);
 				configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH, (List<String>)null);
@@ -289,57 +289,57 @@
 				configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_SOURCE_PATH, def);
 				try {
 					IRuntimeClasspathEntry[] entries = fPathViewer.getEntries();
-					List<String> mementos = new ArrayList<String>(entries.length);
+					List<String> mementos = new ArrayList<>(entries.length);
 					for (int i = 0; i < entries.length; i++) {
 						mementos.add(entries[i].getMemento());
 					}
 					configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH, mementos);
 				} catch (CoreException e) {
-					JDIDebugUIPlugin.statusDialog(LauncherMessages.SourceLookupBlock_Unable_to_save_source_lookup_path_1, e.getStatus()); 
-				}	
+					JDIDebugUIPlugin.statusDialog(LauncherMessages.SourceLookupBlock_Unable_to_save_source_lookup_path_1, e.getStatus());
+				}
 			}
 			boolean dup = fDuplicatesButton.getSelection();
 			if (dup) {
-				configuration.setAttribute(JavaUISourceLocator.ATTR_FIND_ALL_SOURCE_ELEMENTS, true);		
+				configuration.setAttribute(JavaUISourceLocator.ATTR_FIND_ALL_SOURCE_ELEMENTS, true);
 			} else {
 				configuration.setAttribute(JavaUISourceLocator.ATTR_FIND_ALL_SOURCE_ELEMENTS, (String)null);
 			}
 		}
-	}	
-	
+	}
+
 	/**
 	 * Returns the entries visible in the viewer
 	 */
 	public IRuntimeClasspathEntry[] getEntries() {
 		return fPathViewer.getEntries();
-	}	
-	
+	}
+
 	/**
 	 * Sets the configuration associated with this source lookup
 	 * block.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 */
 	private void setLaunchConfiguration(ILaunchConfiguration configuration) {
 		fConfig = configuration;
 	}
-	
+
 	/**
 	 * Sets the configuration associated with this source lookup
 	 * block.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 */
 	protected ILaunchConfiguration getLaunchConfiguration() {
 		return fConfig;
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.SourceLookupBlock_Source_1; 
+		return LauncherMessages.SourceLookupBlock_Source_1;
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java
index 21a7156..2dcd9c7 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java
@@ -45,7 +45,7 @@
 	protected Text fVMArgumentsText;
 	private Button fUseStartOnFirstThread = null;
 	private Button fPgrmArgVariableButton;
-	
+
 	/**
 	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
 	 */
@@ -56,12 +56,12 @@
 		Group group = new Group(parent, SWT.NONE);
 		setControl(group);
 		GridLayout topLayout = new GridLayout();
-		group.setLayout(topLayout);	
+		group.setLayout(topLayout);
 		GridData gd = new GridData(GridData.FILL_BOTH);
 		group.setLayoutData(gd);
 		group.setFont(font);
-		group.setText(LauncherMessages.JavaArgumentsTab_VM_ar_guments__6); 
-		
+		group.setText(LauncherMessages.JavaArgumentsTab_VM_ar_guments__6);
+
 		fVMArgumentsText = new Text(group, SWT.MULTI | SWT.WRAP| SWT.BORDER | SWT.V_SCROLL);
 		fVMArgumentsText.addTraverseListener(new TraverseListener() {
 			@Override
@@ -96,9 +96,9 @@
 			public void modifyText(ModifyEvent evt) {
 				scheduleUpdateJob();
 			}
-		});	
+		});
 		ControlAccessibleListener.addListener(fVMArgumentsText, group.getText());
-			
+
 		fPgrmArgVariableButton = createPushButton(group, LauncherMessages.VMArgumentsBlock_4, null);
 		fPgrmArgVariableButton.setFont(font);
 		fPgrmArgVariableButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
@@ -113,7 +113,7 @@
 				}
 			}
 		});
-		
+
 		if(Platform.OS_MACOSX.equals(Platform.getOS())) {
 			fUseStartOnFirstThread = SWTFactory.createCheckButton(group, LauncherMessages.VMArgumentsBlock_0, null, false, 1);
 			fUseStartOnFirstThread.addSelectionListener(new SelectionAdapter() {
@@ -130,7 +130,7 @@
 	 */
 	@Override
 	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, (String)null);	
+		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, (String)null);
 		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_START_ON_FIRST_THREAD, true);
 	}
 
@@ -145,8 +145,8 @@
 				fUseStartOnFirstThread.setSelection(configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_START_ON_FIRST_THREAD, true));
 			}
 		} catch (CoreException e) {
-			setErrorMessage(LauncherMessages.JavaArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage()); 
-			JDIDebugUIPlugin.log(e);			
+			setErrorMessage(LauncherMessages.JavaArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage());
+			JDIDebugUIPlugin.log(e);
 		}
 	}
 
@@ -166,12 +166,12 @@
 	 */
 	@Override
 	public String getName() {
-		return LauncherMessages.VMArgumentsBlock_VM_Arguments; 
+		return LauncherMessages.VMArgumentsBlock_VM_Arguments;
 	}
-	
+
 	/**
 	 * Returns the string in the text widget, or <code>null</code> if empty.
-	 * 
+	 *
 	 * @return text or <code>null</code>
 	 */
 	protected String getAttributeValueFrom(Text text) {
@@ -180,8 +180,8 @@
 			return content;
 		}
 		return null;
-	}	
-	
+	}
+
 	public void setEnabled(boolean enabled) {
 		fVMArgumentsText.setEnabled(enabled);
 		fPgrmArgVariableButton.setEnabled(enabled);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMConnectTimeoutStatusHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMConnectTimeoutStatusHandler.java
index a6e5fa6..f9a846c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMConnectTimeoutStatusHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMConnectTimeoutStatusHandler.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,8 +31,8 @@
 		JDIDebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
 			@Override
 			public void run() {
-				String title= LauncherMessages.VMConnectTimeoutStatusHandler_Java_Application_1; 
-				String message= LauncherMessages.jdkLauncher_error_timeout; 
+				String title= LauncherMessages.VMConnectTimeoutStatusHandler_Java_Application_1;
+				String message= LauncherMessages.jdkLauncher_error_timeout;
 				result[0]= (MessageDialog.openQuestion(JDIDebugUIPlugin.getActiveWorkbenchShell(), title, message));
 			}
 		});
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/WorkspaceOperationRunner.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/WorkspaceOperationRunner.java
index 354d8d2..1c2fdc1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/WorkspaceOperationRunner.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/WorkspaceOperationRunner.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,15 +26,15 @@
  * @since 3.0
  */
 class WorkspaceOperationRunner implements IRunnableContext {
-	
+
 	private IProgressMonitor fProgressMonitor;
-	
+
 	public WorkspaceOperationRunner() {
 	}
-	
+
 	/**
 	 * Sets the progress monitor.
-	 * 
+	 *
 	 * @param progressMonitor the progress monitor to set
 	 */
 	public void setProgressMonitor(IProgressMonitor progressMonitor) {
@@ -44,7 +44,7 @@
 	/**
 	 * Returns the progress monitor. It there is no progress monitor the monitor\
 	 * is set to the <code>NullProgressMonitor</code>.
-	 * 
+	 *
 	 * @return the progress monitor
 	 */
 	public IProgressMonitor getProgressMonitor() {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ContendedMonitorContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ContendedMonitorContentProvider.java
index 7bb22bb..00fb6b5 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ContendedMonitorContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ContendedMonitorContentProvider.java
@@ -16,7 +16,7 @@
 
 /**
  * Content provider for a contended monitor.
- * 
+ *
  * @since 3.3
  */
 public class ContendedMonitorContentProvider extends JavaElementContentProvider {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaContendedMonitor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaContendedMonitor.java
index ebd74c7..b29a3de 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaContendedMonitor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaContendedMonitor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -50,7 +50,7 @@
 		monitor.addElement(this);
 		fParent= parent;
 	}
-	
+
 	/**
 	 * returns the monitor that is in contention
 	 * @return the monitor that is in contention
@@ -58,7 +58,7 @@
 	public JavaMonitor getMonitor() {
 		return fMonitor;
 	}
-	
+
 	/**
 	 * Returns the parent <code>JavaOwningThread</code> or the original <code>IThread</code>
 	 * @return the parent <code>JavaOwningThread</code> or the original <code>IThread</code>
@@ -69,7 +69,7 @@
 		}
 		return fParent;
 	}
-	
+
 	/**
 	 * returns the <code>JavaOwningThread</code> that owns this monitor
 	 * @return the <code>JavaOwningThread</code> that owns this monitor
@@ -140,7 +140,7 @@
 		}
 		return thread;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaElementContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaElementContentProvider.java
index 2f39ce8..6773571 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaElementContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaElementContentProvider.java
@@ -21,14 +21,14 @@
 
 /**
  * Common element presentation for the debug view.
- * 
+ *
  * @since 3.3
  */
 public abstract class JavaElementContentProvider extends ElementContentProvider {
-	
+
 	private static boolean fgDisplayMonitors;
 	private static boolean fgDisplayThreadGroups;
-	
+
 	static {
 		IPreferenceStore preferenceStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
 		preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() {
@@ -40,12 +40,12 @@
 					fgDisplayThreadGroups= JDIDebugUIPreferenceInitializer.getBoolean(event);
 				}
 			}
-		
+
 		});
 		fgDisplayMonitors= preferenceStore.getBoolean(IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO);
 		fgDisplayThreadGroups = preferenceStore.getBoolean(IJavaDebugUIConstants.PREF_SHOW_THREAD_GROUPS);
 	}
-	
+
 	public static boolean isDisplayThreadGroups() {
 		return fgDisplayThreadGroups;
 	}
@@ -53,7 +53,7 @@
 	public static boolean isDisplayMonitors() {
 	    return fgDisplayMonitors;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitor.java
index ab77076..b9d6b18 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,12 +26,12 @@
  * Represent a Java monitor in the threads and monitors model.
  */
 public class JavaMonitor {
-	
+
 	/**
 	 * The underlying object.
 	 */
 	private IJavaObject fMonitor;
-	
+
 	/**
 	 * The thread which owns this monitor
 	 */
@@ -49,21 +49,21 @@
 	 * may have changed.
 	 */
 	private boolean fToUpdate= true;
-	
+
 	/**
 	 * The List of JavaContendedMonitor and JavaOwnedMonitor associated with this
 	 * monitor.
 	 */
-	private List<PlatformObject> fElements= new ArrayList<PlatformObject>();
-	
+	private List<PlatformObject> fElements= new ArrayList<>();
+
 	public JavaMonitor(IJavaObject monitor) {
 		fMonitor= monitor;
 	}
-	
+
 	public IJavaObject getMonitor() {
 		return fMonitor;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
 	 */
@@ -82,7 +82,7 @@
 	public String getModelIdentifier() {
 		return fMonitor.getModelIdentifier();
 	}
-	
+
 	/**
 	 * Returns the thread which owns this monitor, refresh the data
 	 * first if need.
@@ -93,7 +93,7 @@
 		}
 		return fOwningThread;
 	}
-	
+
 	/**
 	 * Returns the threads waiting for this monitor, refresh the data
 	 * first if need.
@@ -104,7 +104,7 @@
 		}
 		return fWaitingThreads;
 	}
-	
+
 	/**
 	 * Update the information for this monitor.
 	 * @return <code>true</code> if the owning thread or
@@ -145,7 +145,7 @@
 							}
 							changed= true;
 						} else {
-							// we need to check in the new list contains the same threads as the 
+							// we need to check in the new list contains the same threads as the
 							// previous list
 							int sameThread= 0;
 							for (int i= 0; i < waitingThreads.length; i++) {
@@ -171,7 +171,7 @@
 				fToUpdate= false;
 			}
 		}
-		
+
 		if (toRemove) {
 			threadMonitorManager.removeJavaMonitor(this);
 		} else if (changed) {
@@ -179,7 +179,7 @@
 		}
 		return changed;
 	}
-	
+
 	/**
 	 * Send a change event for theJavaContendedMonitor and JavaOwnedMonitor
 	 * associated with this monitor
@@ -206,15 +206,15 @@
 			}
 		}
 	}
-	
+
 	protected void addElement(JavaOwnedMonitor monitor) {
 		fElements.add(monitor);
 	}
-	
+
 	protected void addElement(JavaContendedMonitor monitor) {
 		fElements.add(monitor);
 	}
-	
+
 	public void refresh() {
 		if (fToUpdate && !update()) {
 			if (fOwningThread != null) {
@@ -225,7 +225,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Indicate if this monitor is currently part of a deadlock
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitorThread.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitorThread.java
index 1d8aa75..2569431 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitorThread.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaMonitorThread.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,14 +31,14 @@
  * Represent a Java thread in the threads and monitors model.
  */
 public class JavaMonitorThread extends PlatformObject {
-	
+
 	/**
 	 * The underlying thread.
 	 */
 	private IJavaThread fThread;
 
 	private IThread fOriginalThread;
-	
+
 	/**
 	 * The monitor this thread is waiting for.
 	 */
@@ -56,11 +56,11 @@
 	 * may have changed.
 	 */
 	private boolean fToUpdate= true;
-	
+
 	/**
 	 * List of JavaOwningThread and JavaWaitingThread associated with this thread.
 	 */
-	private List<IDebugElement> fElements= new ArrayList<IDebugElement>();
+	private List<IDebugElement> fElements= new ArrayList<>();
 
 	/**
 	 * JavaWaitingThread object used to return the JavaOwnedMonitor for this
@@ -77,15 +77,15 @@
 		fThread= underlyingThread;
 		fOriginalThread= originalThread;
 	}
-	
+
 	public IJavaThread getThread() {
 		return fThread;
 	}
-	
+
 	public IThread getOriginalThread() {
 		return fOriginalThread;
 	}
-	
+
 	protected void setOriginalThread(IThread originalThread) {
 		fOriginalThread= originalThread;
 	}
@@ -110,14 +110,14 @@
 	public ILaunch getLaunch() {
 		return fThread.getLaunch();
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
 	 */
 	public boolean isSuspended() {
 		return fThread.isSuspended();
 	}
-	
+
 	/**
 	 * Returns the contended monitor to be used as a child
 	 * of the underlying thread in the debug launch view.
@@ -139,7 +139,7 @@
 		}
 		return fBaseWaitingThread.getOwnedMonitors();
 	}
-	
+
 	/**
 	 * Returns the monitor this thread is waiting for.
 	 */
@@ -149,7 +149,7 @@
 		}
 		return fContendedMonitor;
 	}
-	
+
 	/**
 	 * Returns the monitors owned by this thread.
 	 */
@@ -159,7 +159,7 @@
 		}
 		return fOwnedMonitors;
 	}
-	
+
 	/**
 	 * Update the information for this thread.
 	 * @return <code>true</code> if the contended monitor or
@@ -197,7 +197,7 @@
 						}
 						changed= true;
 					} else {
-						// we need to check in the new list contains the same monitors as the 
+						// we need to check in the new list contains the same monitors as the
 						// previous list
 						int sameMonitor= 0;
 						for (int i= 0; i < ownedMonitors.length; i++) {
@@ -232,20 +232,20 @@
 		}
 		return changed;
 	}
-	
+
 	/**
 	 * send a change event for theJavaWaitingThread and JavaOwningThread
 	 * associated with this thread
 	 */
 	private void fireChangeEvent(int detail) {
 		Object[] elements= fElements.toArray();
-		List<Object> changedElement= new ArrayList<Object>();
+		List<Object> changedElement= new ArrayList<>();
 		if (fOriginalThread != null) {
 			changedElement.add(fOriginalThread);
 		}
 		for (int i= 0; i < elements.length; i++) {
 			Object element= elements[i];
-			// the two 'base' elements are not part of the hierarchy, they are 
+			// the two 'base' elements are not part of the hierarchy, they are
 			// used to get the children of the Thread.
 			if (element != fBaseOwningThread && element != fBaseWaitingThread) {
 			    changedElement.add(element);
@@ -272,15 +272,15 @@
 			}
 		}
 	}
-	
+
 	protected void addElement(JavaOwningThread thread) {
 		fElements.add(thread);
 	}
-	
+
 	protected void addElement(JavaWaitingThread thread) {
 		fElements.add(thread);
 	}
-	
+
 	public void refresh() {
 		if (fToUpdate && !update()) {
 			if (fContendedMonitor != null) {
@@ -291,7 +291,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Indicate if this thread is currently part of a deadlock
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwnedMonitor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwnedMonitor.java
index 038c041..c0302e4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwnedMonitor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwnedMonitor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,12 +26,12 @@
  * by the parent thread.
  */
 public class JavaOwnedMonitor extends PlatformObject implements IDebugElement, ITerminate, ISuspendResume {
-	
+
 	/**
 	 * The monitor object in the thread and monitor model.
 	 */
 	private JavaMonitor fMonitor;
-	
+
 	/**
 	 * The threads waiting for this monitor.
 	 */
@@ -51,7 +51,7 @@
 		monitor.addElement(this);
 		fParent= parent;
 	}
-	
+
 	/**
 	 * Returns the monitor
 	 * @return the monitor
@@ -59,7 +59,7 @@
 	public JavaMonitor getMonitor() {
 		return fMonitor;
 	}
-	
+
 	/**
 	 * Returns the original <code>IThread</code> or the parent thread
 	 * @return the original <code>IThread</code> of the parent thread
@@ -70,7 +70,7 @@
 		}
 		return fParent;
 	}
-	
+
 	/**
 	 * Returns an array of all of the threads waiting on this monitor
 	 * @return the array of <code>JavaWaitingThread</code>s waiting on this monitor
@@ -99,7 +99,7 @@
 		fWaitingThreads = tmp;
 		return fWaitingThreads;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
 	 */
@@ -155,7 +155,7 @@
 		}
 		return thread;
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
 	 */
@@ -179,7 +179,7 @@
 	public void terminate() throws DebugException {
 		getDebugTarget().terminate();
 	}
-	
+
 	/**
 	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwningThread.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwningThread.java
index 7604000..bc12e48 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwningThread.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaOwningThread.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,12 +24,12 @@
  * and owns the parent monitor.
  */
 public class JavaOwningThread extends PlatformObject implements IDebugElement, ITerminate {
-	
+
 	/**
 	 * The thread object in the thread and monitor model.
 	 */
 	private JavaMonitorThread fThread;
-	
+
 	/**
 	 * The monitor this thread is waiting for.
 	 */
@@ -56,7 +56,7 @@
 	public JavaMonitorThread getThread() {
 		return fThread;
 	}
-	
+
 	/**
 	 * Returns the parent contended
 	 * @return
@@ -75,7 +75,7 @@
 		}
 		return fContendedMonitor;
 	}
-	
+
 	public void update() {
 	}
 
@@ -149,5 +149,5 @@
 	public void terminate() throws DebugException {
 		getDebugTarget().terminate();
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaThreadContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaThreadContentProvider.java
index b25f802..5cefe20 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaThreadContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaThreadContentProvider.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 
 /**
  * Java thread presentation adapter.
- * 
+ *
  * @since 3.3
  */
 public class JavaThreadContentProvider extends JavaElementContentProvider {
@@ -67,7 +67,7 @@
 		}
 		return getElements(getChildren(thread), index, length);
 	}
-	
+
 	protected Object[] getChildren(IJavaThread thread) {
 		try {
 			if (thread instanceof JDIThread) {
@@ -109,7 +109,7 @@
 			return children;
 		} catch (DebugException e) {
 			return EMPTY;
-		}		
+		}
 	}
 
 	/* (non-Javadoc)
@@ -152,12 +152,12 @@
 	protected ISchedulingRule getRule(IHasChildrenUpdate[] updates) {
 		return getThreadRule(updates);
 	}
-	
+
 	/**
 	 * Returns a scheduling rule to ensure we aren't trying to get thread content
 	 * while executing an implicit evaluation (like toString() for the details
 	 * pane).
-	 * 
+	 *
 	 * @param updates viewer updates
 	 * @return scheduling rule or <code>null</code>
 	 */
@@ -170,6 +170,6 @@
 		}
 		return null;
 	}
-	
+
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaWaitingThread.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaWaitingThread.java
index d1cb07a..e523bec 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaWaitingThread.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/JavaWaitingThread.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -48,7 +48,7 @@
 	public JavaMonitorThread getThread() {
 		return fThread;
 	}
-	
+
 	public JavaOwnedMonitor getParent() {
 		return fParent;
 	}
@@ -77,7 +77,7 @@
 		fOwnedMonitors= tmp;
 		return fOwnedMonitors;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/MonitorsAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/MonitorsAdapterFactory.java
index 976a10c..c0a124d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/MonitorsAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/MonitorsAdapterFactory.java
@@ -21,21 +21,21 @@
  * provide thread monitor information in the debug view.
  */
 public class MonitorsAdapterFactory implements IAdapterFactory {
-	
+
     private static IElementContentProvider fgCPThread;
     private static IElementContentProvider fgCPFrame = new JavaStackFrameContentProvider();
     private static IElementContentProvider fgCPOwnedMonitor;
     private static IElementContentProvider fgCPWaitingThread;
     private static IElementContentProvider fgCPContendedMonitor;
     private static IElementContentProvider fgCPOwningThread;
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
      */
 	@Override
 	@SuppressWarnings("unchecked")
 	public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
-		
+
     	if (IElementContentProvider.class.equals(adapterType)) {
     		if (adaptableObject instanceof IJavaThread) {
 				return (T) getThreadPresentation();
@@ -73,32 +73,32 @@
 		}
 		return fgCPThread;
 	}
-	
+
 	private IElementContentProvider getOwnedMonitorContentProvider() {
 		if (fgCPOwnedMonitor == null) {
 			fgCPOwnedMonitor = new OwnedMonitorContentProvider();
 		}
 		return fgCPOwnedMonitor;
 	}
-	
+
 	private IElementContentProvider getWaitingThreadContentProvider() {
 		if (fgCPWaitingThread == null) {
 			fgCPWaitingThread = new WaitingThreadContentProvider();
 		}
 		return fgCPWaitingThread;
-	}	
-	
+	}
+
 	private IElementContentProvider getContendedMonitorContentProvider() {
 		if (fgCPContendedMonitor == null) {
 			fgCPContendedMonitor = new ContendedMonitorContentProvider();
 		}
 		return fgCPContendedMonitor;
-	}	
-	
+	}
+
 	private IElementContentProvider getOwningThreadContentProvider() {
 		if (fgCPOwningThread == null) {
 			fgCPOwningThread = new OwningThreadContentProvider();
 		}
 		return fgCPOwningThread;
-	}		
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/NoMonitorInformationElement.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/NoMonitorInformationElement.java
index 2f65649..f4a7d3f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/NoMonitorInformationElement.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/NoMonitorInformationElement.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwnedMonitorContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwnedMonitorContentProvider.java
index 985ab9c..6b64120 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwnedMonitorContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwnedMonitorContentProvider.java
@@ -16,7 +16,7 @@
 
 /**
  * Content provider for an owned monitor.
- * 
+ *
  * @since 3.3
  */
 public class OwnedMonitorContentProvider extends JavaElementContentProvider {
@@ -36,5 +36,5 @@
 	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
 		 return getElements(((JavaOwnedMonitor) parent).getWaitingThreads(), index, length);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwningThreadContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwningThreadContentProvider.java
index e843d13..470dc0a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwningThreadContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/OwningThreadContentProvider.java
@@ -16,7 +16,7 @@
 
 /**
  * Content provider for an 'owning thread' in a monitor tree.
- * 
+ *
  * @since 3.3
  */
 public class OwningThreadContentProvider extends JavaElementContentProvider {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ThreadMonitorManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ThreadMonitorManager.java
index 78c4556..5e0a0c0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ThreadMonitorManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/ThreadMonitorManager.java
@@ -36,9 +36,9 @@
  * Manager for the thread and monitor model.
  */
 public class ThreadMonitorManager implements IDebugEventSetListener, IPropertyChangeListener {
-	
+
 	private static ThreadMonitorManager fDefaultManager;
-	
+
 	/**
 	 * HashMap IJavaThread -> JavaMonitorThread
 	 */
@@ -47,9 +47,9 @@
 	 * HashMap IJavaObject -> JavaMonitor
 	 */
 	private HashMap<IDebugElement, Object> fJavaMonitors;
-	
+
 	private boolean fIsEnabled;
-	
+
 	/**
 	 * Returns the default ThreadMonitorManager object.
 	 */
@@ -59,10 +59,10 @@
 		}
 		return fDefaultManager;
 	}
-	
+
 	private ThreadMonitorManager() {
-		fJavaMonitorThreads= new HashMap<IDebugElement, Object>();
-		fJavaMonitors= new HashMap<IDebugElement, Object>();
+		fJavaMonitorThreads= new HashMap<>();
+		fJavaMonitors= new HashMap<>();
 		IPreferenceStore preferenceStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
 		preferenceStore.addPropertyChangeListener(this);
 		fIsEnabled= preferenceStore.getBoolean(IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO);
@@ -119,7 +119,7 @@
 			}
 		}
 	}
-	
+
 	private void handleSuspendResume() {
 		JavaMonitorThread[] threads = getJavaMonitorThreads();
 		for (int i = 0; i < threads.length; i++) {
@@ -144,7 +144,7 @@
 	private void clean(Map<IDebugElement, Object> map, IJavaDebugTarget debugTarget) {
 		IDebugElement debugElements[] = null;
 		synchronized(map) {
-			debugElements = new IDebugElement[map.size()]; 
+			debugElements = new IDebugElement[map.size()];
 			debugElements =	map.keySet().toArray(debugElements);
 		}
 		for(int i = 0; i < debugElements.length; ++i) {
@@ -155,7 +155,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the unique JavaMonitorThread object for the given thread.
 	 */
@@ -165,14 +165,14 @@
 			if (javaMonitorThread == null) {
 				javaMonitorThread= new JavaMonitorThread(thread, originalThread);
 				fJavaMonitorThreads.put(thread, javaMonitorThread);
-				DebugPlugin.getDefault().asyncExec(new DetectDeadlock());			
+				DebugPlugin.getDefault().asyncExec(new DetectDeadlock());
 			} else if (originalThread != null) {
 				javaMonitorThread.setOriginalThread(originalThread);
 			}
 			return javaMonitorThread;
 		}
 	}
-	
+
 	/**
 	 * Returns the unique JavaMonitor object for the given monitor.
 	 */
@@ -195,7 +195,7 @@
 			fJavaMonitors.remove(monitor.getMonitor());
 		}
 	}
-			
+
 	/**
 	 * Returns the monitor the given thread is waiting for.
 	 */
@@ -206,7 +206,7 @@
 		}
 		return getJavaMonitorThread(javaThread, thread).getContendedMonitor();
 	}
-	
+
 	/**
 	 * Returns the monitors the given thread owns.
 	 */
@@ -219,7 +219,7 @@
 	}
 
 	/**
-	 *  Runnable to be run asynchronously, to refresh the model and 
+	 *  Runnable to be run asynchronously, to refresh the model and
 	 *  look for deadlocks.
 	 */
 	class RefreshAndDetectDeadlock extends DetectDeadlock {
@@ -238,11 +238,11 @@
 		public void run() {
 			JavaMonitorThread[] threads= getJavaMonitorThreads();
 			JavaMonitor[] monitors= getJavaMonitors();
-			List<Object> inDeadlock= new ArrayList<Object>();
+			List<Object> inDeadlock= new ArrayList<>();
 			for (int i = 0; i < threads.length; i++) {
 				JavaMonitorThread thread= threads[i];
-				List<JavaMonitorThread> threadStack= new ArrayList<JavaMonitorThread>();
-				List<JavaMonitor> monitorStack= new ArrayList<JavaMonitor>();
+				List<JavaMonitorThread> threadStack= new ArrayList<>();
+				List<JavaMonitor> monitorStack= new ArrayList<>();
 				while (thread != null) {
 					boolean isInDeadlock= false;
 					if (inDeadlock.contains(thread) || threadStack.contains(thread)) {
@@ -296,7 +296,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns <code>true</code> if SHOW_MONITOR_THREAD_INFO is on and the given thread is
 	 * in a deadlock, <code>false</code> otherwise.
@@ -315,7 +315,7 @@
 			return fJavaMonitors.values().toArray(monitors);
 		}
 	}
-	
+
 	private JavaMonitorThread[] getJavaMonitorThreads() {
 		synchronized(fJavaMonitorThreads) {
 			JavaMonitorThread[] threads = new JavaMonitorThread[fJavaMonitorThreads.size()];
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/WaitingThreadContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/WaitingThreadContentProvider.java
index 55d4df6..23465be 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/WaitingThreadContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/monitors/WaitingThreadContentProvider.java
@@ -16,8 +16,8 @@
 
 /**
  * Content provider for a 'thread waiting on a monitor' in a monitor tree.
- * 
- * @since 3.3 
+ *
+ * @since 3.3
  */
 public class WaitingThreadContentProvider extends JavaElementContentProvider {
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ExceptionFilterEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ExceptionFilterEditor.java
index bd6d856..3a69591 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ExceptionFilterEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ExceptionFilterEditor.java
@@ -86,7 +86,7 @@
 	private CheckboxTableViewer fFilterViewer;
 	private Table fFilterTable;
 	private FilterContentProvider fFilterContentProvider;
-	
+
 	private SelectionListener fSelectionListener= new SelectionAdapter() {
 		@Override
 		public void widgetSelected(SelectionEvent e) {
@@ -118,12 +118,12 @@
 		outer.setFont(parent.getFont());
 		// filter table
 		Label label= new Label(outer, SWT.NONE);
-		label.setText(PropertyPageMessages.ExceptionFilterEditor_5); 
+		label.setText(PropertyPageMessages.ExceptionFilterEditor_5);
 		label.setFont(parent.getFont());
 		gd= new GridData();
 		gd.horizontalSpan= 2;
 		label.setLayoutData(gd);
-		
+
 		fFilterTable = new Table(outer, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
 
 		TableLayout tableLayout = new TableLayout();
@@ -178,8 +178,8 @@
 
 	protected void doStore() {
 		Object[] filters = fFilterContentProvider.getElements(null);
-		List<String> inclusionFilters = new ArrayList<String>(filters.length);
-		List<String> exclusionFilters = new ArrayList<String>(filters.length);
+		List<String> inclusionFilters = new ArrayList<>(filters.length);
+		List<String> exclusionFilters = new ArrayList<>(filters.length);
 		for (int i = 0; i < filters.length; i++) {
 			Filter filter = (Filter) filters[i];
 			String name = filter.getName();
@@ -215,20 +215,20 @@
 		buttonContainer.setLayout(buttonLayout);
 
 		fAddFilterButton = createPushButton(buttonContainer,
-				PropertyPageMessages.ExceptionFilterEditor_6, 
-				PropertyPageMessages.ExceptionFilterEditor_7); 
+				PropertyPageMessages.ExceptionFilterEditor_6,
+				PropertyPageMessages.ExceptionFilterEditor_7);
 		fAddTypeButton = createPushButton(buttonContainer,
-				PropertyPageMessages.ExceptionFilterEditor_8, 
-				PropertyPageMessages.ExceptionFilterEditor_9); 
+				PropertyPageMessages.ExceptionFilterEditor_8,
+				PropertyPageMessages.ExceptionFilterEditor_9);
 		fAddPackageButton = createPushButton(buttonContainer,
-				PropertyPageMessages.ExceptionFilterEditor_10, 
-				PropertyPageMessages.ExceptionFilterEditor_11); 
+				PropertyPageMessages.ExceptionFilterEditor_10,
+				PropertyPageMessages.ExceptionFilterEditor_11);
 		fRemoveFilterButton = createPushButton(buttonContainer,
-				PropertyPageMessages.ExceptionFilterEditor_12, 
-				PropertyPageMessages.ExceptionFilterEditor_13); 
+				PropertyPageMessages.ExceptionFilterEditor_12,
+				PropertyPageMessages.ExceptionFilterEditor_13);
 		fRemoveFilterButton.setEnabled(false);
 	}
-	
+
 	/**
 	 * Creates a fully configured push button with the given label and tooltip.
 	 */
@@ -323,7 +323,7 @@
 				}
 			}
 		});
-		// Consume traversal events from the text widget so that CR doesn't 
+		// Consume traversal events from the text widget so that CR doesn't
 		// traverse away to dialog's default button.  Without this, hitting
 		// CR in the text field closes the entire dialog.
 		text.addListener(SWT.Traverse, new Listener() {
@@ -343,7 +343,7 @@
 		// if it's invalid, beep and leave sitting in the editor
 		else if (!validateEditorInput(trimmedValue)) {
 			fInvalidEditorText = trimmedValue;
-			fEditorText.setText(PropertyPageMessages.ExceptionFilterEditor_14); 
+			fEditorText.setText(PropertyPageMessages.ExceptionFilterEditor_14);
 			return;
 			// otherwise, commit the new value if not a duplicate
 		} else {
@@ -369,7 +369,7 @@
 	 * scoping must be limited to exact matches or patterns that
 	 * begin with '*' or end with '*'. Beyond this, a string cannot be validated
 	 * as corresponding to an existing type or package (and this is probably not
-	 * even desirable).  
+	 * even desirable).
 	 */
 	private boolean validateEditorInput(String trimmedValue) {
 		char firstChar = trimmedValue.charAt(0);
@@ -427,16 +427,16 @@
 		try {
 			dialog = JDIDebugUIPlugin.createAllPackagesDialog(shell, null, false);
 		} catch (JavaModelException jme) {
-			String title = PropertyPageMessages.ExceptionFilterEditor_15; 
-			String message = PropertyPageMessages.ExceptionFilterEditor_16; 
+			String title = PropertyPageMessages.ExceptionFilterEditor_15;
+			String message = PropertyPageMessages.ExceptionFilterEditor_16;
 			ExceptionHandler.handle(jme, title, message);
 			return;
 		}
 		if (dialog == null) {
 			return;
 		}
-		dialog.setTitle(PropertyPageMessages.ExceptionFilterEditor_15); 
-		dialog.setMessage(PropertyPageMessages.ExceptionFilterEditor_18); 
+		dialog.setTitle(PropertyPageMessages.ExceptionFilterEditor_15);
+		dialog.setMessage(PropertyPageMessages.ExceptionFilterEditor_18);
 		dialog.setMultipleSelection(true);
 		if (dialog.open() == IDialogConstants.CANCEL_ID) {
 			return;
@@ -463,14 +463,14 @@
 		try {
 			dialog = JavaUI.createTypeDialog(shell, PlatformUI.getWorkbench().getProgressService(), SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_CLASSES, false);
 		} catch (JavaModelException jme) {
-			String title = PropertyPageMessages.ExceptionFilterEditor_19; 
-			String message = PropertyPageMessages.ExceptionFilterEditor_20; 
+			String title = PropertyPageMessages.ExceptionFilterEditor_19;
+			String message = PropertyPageMessages.ExceptionFilterEditor_20;
 			ExceptionHandler.handle(jme, title, message);
 			return;
 		}
 
-		dialog.setTitle(PropertyPageMessages.ExceptionFilterEditor_19); 
-		dialog.setMessage(PropertyPageMessages.ExceptionFilterEditor_22); 
+		dialog.setTitle(PropertyPageMessages.ExceptionFilterEditor_19);
+		dialog.setMessage(PropertyPageMessages.ExceptionFilterEditor_22);
 		if (dialog.open() == IDialogConstants.CANCEL_ID) {
 			return;
 		}
@@ -512,7 +512,7 @@
 				eFilters = new String[] {
 				};
 			}
-			fFilters = new ArrayList<Filter>();
+			fFilters = new ArrayList<>();
 			populateFilters(iFilters, true);
 			populateFilters(eFilters, false);
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/InstanceFilterEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/InstanceFilterEditor.java
index 2229e77..c8b7287 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/InstanceFilterEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/InstanceFilterEditor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,7 +30,7 @@
 import org.eclipse.swt.widgets.Label;
 
 /**
- * 
+ *
  */
 public class InstanceFilterEditor {
 	private IJavaBreakpoint fBreakpoint;
@@ -38,15 +38,15 @@
 	private Composite fParent;
 	private InstanceFilterContentProvider fContentProvider;
 	private CheckHandler fCheckHandler;
-	
+
 	public InstanceFilterEditor(Composite parent, IJavaBreakpoint breakpoint) {
 		fBreakpoint= breakpoint;
 		fContentProvider= new InstanceFilterContentProvider();
 		fCheckHandler= new CheckHandler();
 		Label label= new Label(parent, SWT.NONE);
 		label.setFont(parent.getFont());
-		label.setText(PropertyPageMessages.InstanceFilterEditor_0); 
-		
+		label.setText(PropertyPageMessages.InstanceFilterEditor_0);
+
 		fParent= parent;
 		//fOuter= new Composite(parent, SWT.NONE);
 		//fOuter.setFont(parent.getFont());
@@ -56,13 +56,13 @@
 		//layout.marginHeight = 0;
 		//layout.numColumns = 2;
 		//fOuter.setLayout(layout);
-		
+
 		//GridData data= new GridData(GridData.FILL_BOTH);
 		//fOuter.setLayoutData(data);
-		
+
 		createViewer();
 	}
-	
+
 	/**
 	 * Create and initialize the thread filter tree viewer.
 	 */
@@ -98,7 +98,7 @@
 			JDIDebugUIPlugin.log(e);
 		}
 	}
-	
+
 	protected void doStore() {
 		try {
 			IJavaObject[] objects = fBreakpoint.getInstanceFilters();
@@ -109,24 +109,24 @@
 			}
 		}  catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
-		}						
+		}
 	}
-	
-	class CheckHandler implements ICheckStateListener {	
-		
+
+	class CheckHandler implements ICheckStateListener {
+
 		@Override
 		public void checkStateChanged(CheckStateChangedEvent event) {
 			fInstanceViewer.setChecked(event.getElement(), event.getChecked());
 		}
-		
+
 		public void checkObject(IJavaObject object, boolean checked) {
 			fInstanceViewer.setChecked(object, checked);
 		}
-		
+
 	}
-	
+
 	class InstanceFilterContentProvider implements ITreeContentProvider {
-		
+
 		/**
 		 * @see ITreeContentProvider#getChildren(Object)
 		 */
@@ -160,7 +160,7 @@
 		public boolean hasChildren(Object element) {
 			if (element instanceof IJavaBreakpoint) {
 				return getChildren(element).length > 0;
-			} 
+			}
 			return false;
 		}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointAdvancedPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointAdvancedPage.java
index 97be3c4..28bdc96 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointAdvancedPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointAdvancedPage.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 import org.eclipse.ui.dialogs.PropertyPage;
 
 /**
- * 
+ *
  */
 public class JavaBreakpointAdvancedPage extends PropertyPage {
 
@@ -66,7 +66,7 @@
 		setValid(true);
 		return mainComposite;
 	}
-	
+
 	public void createInstanceFilterEditor(Composite parent) {
 		IJavaBreakpoint breakpoint= getBreakpoint();
 		try {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointPage.java
index 7cb94d6..5a589f2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaBreakpointPage.java
@@ -61,27 +61,27 @@
  * Property page for configuring IJavaBreakpoints.
  */
 public class JavaBreakpointPage extends PropertyPage {
-	
+
 	protected JavaElementLabelProvider fJavaLabelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
 	protected Button fEnabledButton;
 	/*
 	 * protected Button fTriggerPointButton; protected Button fTriggerPointButtonActive;
 	 */
-	protected List<String> fErrorMessages= new ArrayList<String>();
+	protected List<String> fErrorMessages= new ArrayList<>();
 	protected String fPrevMessage = null;
 	private AbstractJavaBreakpointEditor fEditor;
-	
+
 	/**
 	 * Attribute used to indicate that a breakpoint should be deleted
 	 * when cancel is pressed.
 	 */
 	public static final String ATTR_DELETE_ON_CANCEL = JDIDebugUIPlugin.getUniqueIdentifier() + ".ATTR_DELETE_ON_CANCEL";  //$NON-NLS-1$
-	
+
 	/**
 	 * Constant for the empty string
 	 */
 	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	
+
 	/**
 	 * Store the breakpoint properties.
 	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
@@ -104,14 +104,14 @@
 		};
 		try {
 			ResourcesPlugin.getWorkspace().run(wr, null, 0, null);
-		} 
+		}
 		catch (CoreException e) {
-			JDIDebugUIPlugin.statusDialog(e.getStatus()); 
+			JDIDebugUIPlugin.statusDialog(e.getStatus());
 			JDIDebugUIPlugin.log(e);
 		}
 		return super.performOk();
 	}
-	
+
 	/**
 	 * Adds the given error message to the errors currently displayed on this page.
 	 * The page displays the most recently added error message.
@@ -126,7 +126,7 @@
 		setErrorMessage(message);
 		setValid(message == null);
 	}
-	
+
 	/**
 	 * Removes the given error message from the errors currently displayed on this page.
 	 * When an error message is removed, the page displays the error that was added
@@ -142,7 +142,7 @@
 			addErrorMessage(fErrorMessages.get(fErrorMessages.size() - 1));
 		}
 	}
-	
+
 	/**
 	 * Stores the values configured in this page. This method
 	 * should be called from within a workspace runnable to
@@ -168,7 +168,7 @@
 	private void storeEnabled(IJavaBreakpoint breakpoint) throws CoreException {
 		breakpoint.setEnabled(fEnabledButton.getSelection());
 	}
-	
+
 	/**
 	 * Creates the labels and editors displayed for the breakpoint.
 	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
@@ -192,7 +192,7 @@
                     @Override
 					public void shellActivated(ShellEvent e) {
                         Shell shell = (Shell)e.getSource();
-                        shell.setText(NLS.bind(PropertyPageMessages.JavaBreakpointPage_10, new String[]{getName(getBreakpoint())})); 
+                        shell.setText(NLS.bind(PropertyPageMessages.JavaBreakpointPage_10, new String[]{getName(getBreakpoint())}));
                         shell.removeShellListener(this);
                     }
                     @Override
@@ -213,10 +213,10 @@
         }
 		return mainComposite;
 	}
-	
+
     /**
      * Returns the name of the given element.
-     * 
+     *
      * @param element the element
      * @return the name of the element
      */
@@ -224,10 +224,10 @@
 		IWorkbenchAdapter adapter = element.getAdapter(IWorkbenchAdapter.class);
         if (adapter != null) {
             return adapter.getLabel(element);
-        } 
+        }
         return EMPTY_STRING;
-    }	
-	
+    }
+
 	/**
 	 * Creates the labels displayed for the breakpoint.
 	 * @param parent the parent composite
@@ -237,7 +237,7 @@
 		try {
 			String typeName = ((IJavaBreakpoint) getElement()).getTypeName();
 			if (typeName != null) {
-				createLabel(labelComposite, PropertyPageMessages.JavaBreakpointPage_3); 
+				createLabel(labelComposite, PropertyPageMessages.JavaBreakpointPage_3);
 				Text text = SWTFactory.createText(labelComposite, SWT.READ_ONLY, 1, typeName);
 				text.setBackground(parent.getBackground());
 			}
@@ -252,7 +252,7 @@
 	 * @param parent the parent composite
 	 */
 	protected void createEnabledButton(Composite parent) {
-		fEnabledButton = createCheckButton(parent, PropertyPageMessages.JavaBreakpointPage_5); 
+		fEnabledButton = createCheckButton(parent, PropertyPageMessages.JavaBreakpointPage_5);
 		try {
 			fEnabledButton.setSelection(getBreakpoint().isEnabled());
 		}
@@ -260,7 +260,7 @@
 			JDIDebugUIPlugin.log(ce);
 		}
 	}
-	
+
 	/**
 	 * Returns the breakpoint that this preference page configures
 	 * @return the breakpoint this page configures
@@ -268,7 +268,7 @@
 	protected IJavaBreakpoint getBreakpoint() {
 		return (IJavaBreakpoint) getElement();
 	}
-	
+
 	/**
 	 * Allows subclasses to add type specific labels to the common Java
 	 * breakpoint page.
@@ -289,7 +289,7 @@
 				JDIDebugUIPlugin.log(ce);
 			}
 			if (lineNumber.length() > 0) {
-				createLabel(parent, PropertyPageMessages.JavaLineBreakpointPage_2); 
+				createLabel(parent, PropertyPageMessages.JavaLineBreakpointPage_2);
 				Text text = SWTFactory.createText(parent, SWT.READ_ONLY, 1, lineNumber.toString());
 				text.setBackground(parent.getBackground());
 			}
@@ -299,20 +299,20 @@
 				if (member == null) {
 					return;
 				}
-				String label = PropertyPageMessages.JavaLineBreakpointPage_3; 
+				String label = PropertyPageMessages.JavaLineBreakpointPage_3;
 				if (breakpoint instanceof IJavaMethodBreakpoint) {
-					label = PropertyPageMessages.JavaLineBreakpointPage_4; 
+					label = PropertyPageMessages.JavaLineBreakpointPage_4;
 				} else if (breakpoint instanceof IJavaWatchpoint) {
-					label = PropertyPageMessages.JavaLineBreakpointPage_5; 
+					label = PropertyPageMessages.JavaLineBreakpointPage_5;
 				}
 				createLabel(parent, label);
 				Text text = SWTFactory.createText(parent, SWT.READ_ONLY, 1, fJavaLabelProvider.getText(member));
 				text.setBackground(parent.getBackground());
-			} 
+			}
 			catch (CoreException exception) {JDIDebugUIPlugin.log(exception);}
 		}
 	}
-	
+
 	/**
 	* Allows subclasses to add type specific editors to the common Java
 	* breakpoint page.
@@ -337,7 +337,7 @@
 						new JavaBreakpointConditionEditor(null) });
 		} else if (JavaMethodBreakpoint.JAVA_METHOD_BREAKPOINT.equals(type)) {
 			setTitle(PropertyPageMessages.JavaLineBreakpointPage_20);
-			fEditor = new CompositeBreakpointEditor(new AbstractJavaBreakpointEditor[] 
+			fEditor = new CompositeBreakpointEditor(new AbstractJavaBreakpointEditor[]
 			    {new MethodBreakpointEditor(), new JavaBreakpointConditionEditor(null)});
 		} else {
 			// use standard editor for any other kind of breakpoint (@see bug 325161)
@@ -364,7 +364,7 @@
 		setErrorMessage(e.getMessage());
 	}
    }
-	
+
 	/**
 	 * Creates a fully configured text editor with the given initial value
 	 * @param parent the parent composite
@@ -404,7 +404,7 @@
 	protected Button createRadioButton(Composite parent, String text) {
 		return SWTFactory.createRadioButton(parent, text, 1);
 	}
-	
+
 	/**
 	 * Check to see if the breakpoint should be deleted.
 	 * @return <code>true</code> if the page was canceled, <code>false</code> othewise
@@ -417,11 +417,11 @@
 				getBreakpoint().delete();
 			}
 		} catch (CoreException e) {
-			JDIDebugUIPlugin.statusDialog(PropertyPageMessages.JavaBreakpointPage_9, e.getStatus()); 
+			JDIDebugUIPlugin.statusDialog(PropertyPageMessages.JavaBreakpointPage_9, e.getStatus());
 		}
 		return super.performCancel();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaExceptionBreakpointAdvancedPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaExceptionBreakpointAdvancedPage.java
index 6291c9b..96674fa 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaExceptionBreakpointAdvancedPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/JavaExceptionBreakpointAdvancedPage.java
@@ -37,7 +37,7 @@
 	protected void createTypeSpecificEditors(Composite parent) {
 		fFilterEditor= new ExceptionFilterEditor(parent, this);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/PropertyPageMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/PropertyPageMessages.java
index 63597fb..488032e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/PropertyPageMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/PropertyPageMessages.java
@@ -36,7 +36,7 @@
 	public static String ExceptionFilterEditor_19;
 	public static String ExceptionFilterEditor_20;
 	public static String ExceptionFilterEditor_22;
-	
+
 	public static String JavaBreakpointConditionEditor_0;
 	public static String JavaBreakpointConditionEditor_1;
 	public static String JavaBreakpointConditionEditor_2;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ThreadFilterEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ThreadFilterEditor.java
index 80a35ca..6f2cb9e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ThreadFilterEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/ThreadFilterEditor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -40,7 +40,7 @@
 import org.eclipse.swt.widgets.Label;
 
 /**
- * 
+ *
  */
 public class ThreadFilterEditor {
 
@@ -49,20 +49,20 @@
 	private ThreadFilterContentProvider fContentProvider;
 	private CheckHandler fCheckHandler;
 	private static String MAIN= "main"; //$NON-NLS-1$
-	
+
 	public ThreadFilterEditor(Composite parent, JavaBreakpointAdvancedPage page) {
 		fPage= page;
 		fContentProvider= new ThreadFilterContentProvider();
-		fCheckHandler= new CheckHandler();		
+		fCheckHandler= new CheckHandler();
 		createThreadViewer(parent);
 	}
-	
+
 	private void createThreadViewer(Composite parent) {
 		Label label= new Label(parent, SWT.NONE);
-		label.setText(PropertyPageMessages.ThreadFilterEditor_1); 
+		label.setText(PropertyPageMessages.ThreadFilterEditor_1);
 		label.setFont(parent.getFont());
 		label.setLayoutData(new GridData());
-		
+
 		GridData data= new GridData(GridData.FILL_BOTH);
 		data.heightHint= 100;
 		fThreadViewer= new CheckboxTreeViewer(parent, SWT.BORDER);
@@ -74,7 +74,7 @@
 		fThreadViewer.setInput(DebugPlugin.getDefault().getLaunchManager());
 		setInitialCheckedState();
 	}
-	
+
 	protected void doStore() {
 		IDebugTarget[] targets= getDebugTargets();
 		IJavaDebugTarget target;
@@ -127,7 +127,7 @@
 			JDIDebugUIPlugin.log(e);
 		}
 	}
-	
+
 	/**
 	 * Returns the debug targets that appear in the tree
 	 */
@@ -139,8 +139,8 @@
 		ILaunchManager launchManager= (ILaunchManager)input;
 		return launchManager.getDebugTargets();
 	}
-	
-	class CheckHandler implements ICheckStateListener {	
+
+	class CheckHandler implements ICheckStateListener {
 		@Override
 		public void checkStateChanged(CheckStateChangedEvent event) {
 			Object element= event.getElement();
@@ -151,7 +151,7 @@
 			}
 			verifyCheckedState();
 		}
-		
+
 		/**
 		 * Check or uncheck a debug target in the tree viewer.
 		 * When a debug target is checked, attempt to
@@ -207,7 +207,7 @@
 				}
 			}
 		}
-	
+
 		/**
 		 * Check or uncheck a thread.
 		 * When a thread is checked, make sure its debug
@@ -215,14 +215,14 @@
 		 * When a thread is unchecked, uncheck its debug
 		 * target.
 		 */
-		protected void checkThread(IThread thread, boolean checked) {	
+		protected void checkThread(IThread thread, boolean checked) {
 			fThreadViewer.setChecked(thread, checked);
 			IDebugTarget target= (thread).getDebugTarget();
 			if (checked) {
 				// When a thread is checked, make sure the target
 				// is checked and all other threads are
 				// unchecked (simulate radio button behavior)
-				if (!fThreadViewer.getChecked(target)) {					
+				if (!fThreadViewer.getChecked(target)) {
 					fThreadViewer.setChecked(target, true);
 				}
 				IThread[] threads;
@@ -243,7 +243,7 @@
 				fThreadViewer.setChecked(target, false);
 			}
 		}
-	
+
 		/**
 		 * Verify the state of the tree viewer.
 		 * If the user selects a debug target, they must select
@@ -275,13 +275,13 @@
 				if (checkedThread) {
 					fPage.setErrorMessage(null);
 				} else {
-					fPage.setErrorMessage(PropertyPageMessages.ThreadFilterEditor_2); 
+					fPage.setErrorMessage(PropertyPageMessages.ThreadFilterEditor_2);
 				}
 			}
 		}
-		
+
 	}
-	
+
 	class ThreadFilterContentProvider implements ITreeContentProvider {
 		/**
 		 * @see ITreeContentProvider#getChildren(Object)
@@ -297,9 +297,9 @@
 						JDIDebugUIPlugin.log(e);
 					}
 				}
-			}		
+			}
 			if (parent instanceof ILaunchManager) {
-				List<IJavaDebugTarget> children= new ArrayList<IJavaDebugTarget>();
+				List<IJavaDebugTarget> children= new ArrayList<>();
 				ILaunch[] launches= ((ILaunchManager) parent).getLaunches();
 				IDebugTarget[] targets;
 				IJavaDebugTarget target;
@@ -344,7 +344,7 @@
 			}
 			if (element instanceof IDebugElement) {
 				return getChildren(element).length > 0;
-			} 
+			}
 			if (element instanceof ILaunch) {
 				return true;
 			}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/VMCapabilitiesPropertyPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/VMCapabilitiesPropertyPage.java
index 2fe6710..1e30b8c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/VMCapabilitiesPropertyPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/propertypages/VMCapabilitiesPropertyPage.java
@@ -42,7 +42,7 @@
 /**
  * This class provides a properties page displaying all of the capabilities
  * of the VM associated with the selected <code>IDebugTarget</code> or <code>IProcess</code>
- * 
+ *
  * @since 3.3
  */
 public class VMCapabilitiesPropertyPage extends PropertyPage {
@@ -61,16 +61,16 @@
 			setLayout(layout);
 		}
 	}
-	
+
 	private List<ExpandableComposite> fExpandedComps;
 	private static final String EXPANDED_STATE = "vmc_expanded_state"; //$NON-NLS-1$
 	private static Font fHeadingFont = JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);
-	
+
 	/**
-	 * Constructor 
+	 * Constructor
 	 */
 	public VMCapabilitiesPropertyPage() {
-		fExpandedComps = new ArrayList<ExpandableComposite>();
+		fExpandedComps = new ArrayList<>();
 	}
 
 	/* (non-Javadoc)
@@ -97,7 +97,7 @@
 			SWTFactory.createVerticalSpacer(comp, 1);
 			createHeadingLabel(comp, vm);
 			SWTFactory.createVerticalSpacer(comp, 1);
-			
+
 			// breakpoints
 			ExpandableComposite breakpoints = createExpandibleComposite(comp, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT, PropertyPageMessages.VMCapabilitiesPropertyPage_27, 2, GridData.FILL_HORIZONTAL);
 			fExpandedComps.add(breakpoints);
@@ -105,10 +105,10 @@
 			breakpoints.setClient(bp_inner);
 			createCapabilityEntry(bp_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_4, vm.canUseInstanceFilters());
 			createCapabilityEntry(bp_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_9, vm.canWatchFieldModification());
-			createCapabilityEntry(bp_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_10, vm.canWatchFieldAccess());			
+			createCapabilityEntry(bp_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_10, vm.canWatchFieldAccess());
 			createCapabilityEntry(bp_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_24, vm.canGetMethodReturnValues());
 			createCapabilityEntry(bp_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_25, vm.canRequestMonitorEvents());
-			
+
 			// hot code replace
 			ExpandableComposite hcr = createExpandibleComposite(comp, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT, PropertyPageMessages.VMCapabilitiesPropertyPage_28, 2, GridData.FILL_HORIZONTAL);
 			fExpandedComps.add(hcr);
@@ -117,7 +117,7 @@
 			createCapabilityEntry(hcr_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_15, vm.canRedefineClasses());
 			createCapabilityEntry(hcr_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_12, vm.canAddMethod());
 			createCapabilityEntry(hcr_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_16, vm.canUnrestrictedlyRedefineClasses());
-			
+
 			// stepping
 			ExpandableComposite stepping = createExpandibleComposite(comp, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT, PropertyPageMessages.VMCapabilitiesPropertyPage_29, 2, GridData.FILL_HORIZONTAL);
 			fExpandedComps.add(stepping);
@@ -126,7 +126,7 @@
 			createCapabilityEntry(stepping_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_14, vm.canPopFrames());
 			createCapabilityEntry(stepping_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_3, vm.canGetSyntheticAttribute());
 			createCapabilityEntry(stepping_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_21, vm.canForceEarlyReturn());
-			
+
 			// others
 			ExpandableComposite general = createExpandibleComposite(comp, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT, PropertyPageMessages.VMCapabilitiesPropertyPage_30, 2, GridData.FILL_HORIZONTAL);
 			fExpandedComps.add(general);
@@ -135,30 +135,30 @@
 			createCapabilityEntry(general_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_6, vm.canGetCurrentContendedMonitor() && vm.canGetOwnedMonitorInfo());
 			createCapabilityEntry(general_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_18, vm.canSetDefaultStratum());
 			createCapabilityEntry(general_inner, PropertyPageMessages.VMCapabilitiesPropertyPage_26, vm.canGetInstanceInfo());
-			
+
 			restoreExpansionState();
 		}
         applyDialogFont(comp);
 		return comp;
 	}
-	
+
 	private void createExplanation(Composite parent) {
 		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 2, GridData.FILL_HORIZONTAL);
 		Label label = new Label(comp, SWT.WRAP);
         label.setFont(parent.getFont());
         label.setText(PropertyPageMessages.VMCapabilitiesPropertyPage_31);
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 
+		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 	}
-	
+
 	private void createHeadingLabel(Composite parent, VirtualMachineImpl vm) {
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 2, 2, GridData.HORIZONTAL_ALIGN_BEGINNING);				
+		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 2, 2, GridData.HORIZONTAL_ALIGN_BEGINNING);
 		SWTFactory.createLabel(comp, PropertyPageMessages.VMCapabilitiesPropertyPage_1, fHeadingFont, 1);
 		StringBuffer buff = new StringBuffer(vm.name().trim());
 		buff = buff.append(" ").append(vm.version().trim()); //$NON-NLS-1$
 		Text text = SWTFactory.createText(comp, SWT.READ_ONLY, 1, buff.toString());
 		text.setBackground(parent.getBackground());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
@@ -167,7 +167,7 @@
 		super.createControl(parent);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.VMCAPABILITIES_PROPERTY_PAGE);
 	}
-	
+
 	/**
 	 * Returns the VM from the debug target
 	 * @return the VM form the element
@@ -191,7 +191,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a new capability entry for a specified group
 	 * @param parent the parent group to add this entry to
@@ -202,7 +202,7 @@
 		SWTFactory.createCheckButton(parent, null, null, enabled, 1).setEnabled(false);
 		SWTFactory.createLabel(parent, label, parent.getFont(), 1);
 	}
-	
+
 	/**
 	 * Creates an ExpandibleComposite widget
 	 * @param parent the parent to add this widget to
@@ -225,7 +225,7 @@
 		});
 		return ex;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
 	 */
@@ -233,7 +233,7 @@
 	protected IPreferenceStore doGetPreferenceStore() {
 		return JDIDebugUIPlugin.getDefault().getPreferenceStore();
 	}
-	
+
 	/**
 	 * save the expansion state for next time, this only happens when the user selects the OK button when closing the dialog
 	 */
@@ -245,7 +245,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * restore the expansion state
 	 */
@@ -262,7 +262,7 @@
 			}
 		}
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/search/LaunchConfigurationQueryParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/search/LaunchConfigurationQueryParticipant.java
index fdc20bc..ffa683f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/search/LaunchConfigurationQueryParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/search/LaunchConfigurationQueryParticipant.java
@@ -47,10 +47,10 @@
 import org.eclipse.ui.PartInitException;
 
 /**
- * This class provides a search participant to find class references in the 
+ * This class provides a search participant to find class references in the
  * {@linkplain IJavaLaunchConfigurationConstants#ATTR_MAIN_TYPE_NAME} attribute
  * of Java launch configurations
- * 
+ *
  * @since 3.4.0
  */
 public class LaunchConfigurationQueryParticipant implements IQueryParticipant {
@@ -214,7 +214,7 @@
 	}
 
 	/**
-	 * Returns the success of the the pattern matching 
+	 * Returns the success of the the pattern matching
 	 * @param scope the search scope
 	 * @param config the backing {@link ILaunchConfiguration}
 	 * @param pattern the search pattern
@@ -277,7 +277,7 @@
 
 	/**
 	 * The UI participant for showing configuration matches in the search view
-	 * 
+	 *
 	 * @since 3.4.0
 	 */
 	private static class UIParticipant implements IMatchPresentation {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ISnippetStateChangedListener.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ISnippetStateChangedListener.java
index 6a77c34..5c7415a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ISnippetStateChangedListener.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ISnippetStateChangedListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
  * A listener interested in snippet evaluation state changes.
  */
 public interface ISnippetStateChangedListener {
-	
+
 	/**
 	 * Informs about the changed snippet evaluation state
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java
index 57fe393..9bbf258 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
 
- 
+
 import java.util.Arrays;
 
 import org.eclipse.jdt.core.JavaModelException;
@@ -37,27 +37,27 @@
  * Java snippet completion processor.
  */
 public class JavaSnippetCompletionProcessor implements IContentAssistProcessor {
-	
+
 	private CompletionProposalCollector fCollector;
 	private JavaSnippetEditor fEditor;
 	private IContextInformationValidator fValidator;
 	private TemplateEngine fTemplateEngine;
 	private CompletionProposalComparator fComparator;
 	private String fErrorMessage;
-	
+
 	private char[] fProposalAutoActivationSet;
 	private ContentAssistant fAssistant;
-			
+
 	public JavaSnippetCompletionProcessor(JavaSnippetEditor editor) {
 		fEditor= editor;
 		TemplateContextType contextType= JavaPlugin.getDefault().getTemplateContextRegistry().getContextType("java"); //$NON-NLS-1$
 		if (contextType != null) {
 			fTemplateEngine= new TemplateEngine(contextType);
 		}
-		
+
 		fComparator= new CompletionProposalComparator();
 	}
-	
+
 	public void setContentAssistant(ContentAssistant assistant) {
 		fAssistant = assistant;
 	}
@@ -68,7 +68,7 @@
 	public String getErrorMessage() {
 		return fErrorMessage;
 	}
-	
+
 	protected void setErrorMessage(String message) {
 		if (message != null && message.length() == 0) {
 			message = null;
@@ -102,7 +102,7 @@
 	public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
 		return null;
 	}
-	
+
 	/**
 	 * @see IContentAssistProcessor#computeProposals(ITextViewer, int)
 	 */
@@ -118,15 +118,15 @@
 				ErrorDialog.openError(shell, SnippetMessages.getString("CompletionProcessor.errorTitle"), SnippetMessages.getString("CompletionProcessor.errorMessage"), x.getStatus()); //$NON-NLS-2$ //$NON-NLS-1$
 				JDIDebugUIPlugin.log(x);
 			}
-			
+
 			IJavaCompletionProposal[] results= fCollector.getJavaCompletionProposals();
-			
+
 			if (fTemplateEngine != null) {
 				fTemplateEngine.reset();
-				fTemplateEngine.complete(viewer, position, null);			
-			
+				fTemplateEngine.complete(viewer, position, null);
+
 				TemplateProposal[] templateResults= fTemplateEngine.getResults();
-	
+
 				// concatenate arrays
 				IJavaCompletionProposal[] total= new IJavaCompletionProposal[results.length + templateResults.length];
 				System.arraycopy(templateResults, 0, total, 0, templateResults.length);
@@ -139,7 +139,7 @@
 			fCollector = null;
 		}
 	}
-	
+
 	/**
 	 * Order the given proposals.
 	 */
@@ -156,9 +156,9 @@
 			}
 
 		});
-		return proposals;	
-	}	
-	
+		return proposals;
+	}
+
 	/**
 	 * @see IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
 	 */
@@ -166,20 +166,20 @@
 	public char[] getCompletionProposalAutoActivationCharacters() {
 		return fProposalAutoActivationSet;
 	}
-	
+
 	/**
 	 * Sets this processor's set of characters triggering the activation of the
 	 * completion proposal computation.
-	 * 
+	 *
 	 * @param activationSet the activation set
 	 */
 	public void setCompletionProposalAutoActivationCharacters(char[] activationSet) {
 		fProposalAutoActivationSet= activationSet;
 	}
-	
+
 	/**
 	 * Tells this processor to order the proposals alphabetically.
-	 * 
+	 *
 	 * @param order <code>true</code> if proposals should be ordered.
 	 */
 	public void orderProposalsAlphabetically(boolean order) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetEditor.java
index 2f12c9b..dd9dd12 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetEditor.java
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
 
- 
+
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 import java.lang.reflect.InvocationTargetException;
@@ -130,15 +130,15 @@
 /**
  * An editor for Java snippets.
  */
-public class JavaSnippetEditor extends AbstractDecoratedTextEditor implements IDebugEventFilter, IEvaluationListener, IValueDetailListener {			
+public class JavaSnippetEditor extends AbstractDecoratedTextEditor implements IDebugEventFilter, IEvaluationListener, IValueDetailListener {
 	public static final String IMPORTS_CONTEXT = "SnippetEditor.imports"; //$NON-NLS-1$
-	
+
 	public final static int RESULT_DISPLAY= 1;
 	public final static int RESULT_RUN= 2;
 	public final static int RESULT_INSPECT= 3;
-	
+
 	private int fResultMode; // one of the RESULT_* constants
-	
+
 	private IJavaProject fJavaProject;
 	private IEvaluationContext fEvaluationContext;
 	private IDebugTarget fVM;
@@ -146,20 +146,20 @@
 	private String fLaunchedWorkingDir;
 	private String fLaunchedVMArgs;
 	private IVMInstall fLaunchedVM;
-	private List<ISnippetStateChangedListener> fSnippetStateListeners;	
-	
+	private List<ISnippetStateChangedListener> fSnippetStateListeners;
+
 	private boolean fEvaluating;
 	private IJavaThread fThread;
 	private boolean fStepFiltersSetting;
-	
+
 	private int fSnippetStart;
 	private int fSnippetEnd;
-	
+
 	private String[] fImports= null;
-	
+
 	private Image fOldTitleImage= null;
 	private IClassFileEvaluationEngine fEngine= null;
-	
+
 	/**
 	 * The debug model presentation used for computing toString
 	 */
@@ -171,7 +171,7 @@
 	private String fResult;
 
 	/**
-	 * A thread that waits to have a 
+	 * A thread that waits to have a
 	 * thread to perform an evaluation in.
 	 */
 	private static class WaitThread extends Thread {
@@ -179,16 +179,16 @@
 		 * The display used for event dispatching.
 		 */
 		private Display fDisplay;
-		
+
 		/**
 		 * Indicates whether to continue event queue dispatching.
 		 */
 		private volatile boolean fContinueEventDispatching = true;
-		
+
 		private Object fLock;
 		/**
 		 * Creates a "wait" thread
-		 * 
+		 *
 		 * @param display the display to be used to read and dispatch events
 		 * @param lock the monitor to wait on
 		 */
@@ -203,7 +203,7 @@
 			try {
 				synchronized (fLock) {
 					//should be notified out of #setThread(IJavaThread)
-					fLock.wait(10000);	
+					fLock.wait(10000);
 				}
 			} catch (InterruptedException e) {
 			} finally {
@@ -215,14 +215,14 @@
 						// do nothing
 					}
 				});
-				
+
 				// Stop event dispatching
 				fContinueEventDispatching= false;
-				
+
 				// Force the event loop to return from sleep () so that
 				// it stops event dispatching.
 				fDisplay.asyncExec(null);
-			}	
+			}
 		}
 		/**
 		 * Processes events.
@@ -235,9 +235,9 @@
 					}
 				}
 			}
-		}		
+		}
 	}
-	
+
 	/**
 	 * Listens for part activation to set scrapbook active system property
 	 * for action enablement.
@@ -280,22 +280,22 @@
 		@Override
 		public void partVisible(IWorkbenchPartReference partRef) {
 		}
-		
+
 	};
-	
+
 	public JavaSnippetEditor() {
 		super();
 		setDocumentProvider(JDIDebugUIPlugin.getDefault().getSnippetDocumentProvider());
 		IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[] {
 				PreferenceConstants.getPreferenceStore(),
 				EditorsUI.getPreferenceStore()});
-		setSourceViewerConfiguration(new JavaSnippetViewerConfiguration(JDIDebugUIPlugin.getDefault().getJavaTextTools(), store, this));		
+		setSourceViewerConfiguration(new JavaSnippetViewerConfiguration(JDIDebugUIPlugin.getDefault().getJavaTextTools(), store, this));
 		fSnippetStateListeners = new ArrayList<>(4);
 		setPreferenceStore(store);
 		setEditorContextMenuId("#JavaSnippetEditorContext"); //$NON-NLS-1$
 		setRulerContextMenuId("#JavaSnippetRulerContext"); //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#doSetInput(org.eclipse.ui.IEditorInput)
 	 */
@@ -310,7 +310,7 @@
 			}
 		}
 	}
-		
+
 	@Override
 	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
 		super.init(site, input);
@@ -332,7 +332,7 @@
 		getSite().getWorkbenchWindow().getPartService().removePartListener(fActivationListener);
 		super.dispose();
 	}
-	
+
 	/**
 	 * Actions for the editor popup menu
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#createActions()
@@ -348,16 +348,16 @@
 			setAction("Stop", new StopAction(this));  //$NON-NLS-1$
 			setAction("SelectImports", new SelectImportsAction(this));  //$NON-NLS-1$
 		}
-	} 
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#editorContextMenuAboutToShow(org.eclipse.jface.action.IMenuManager)
 	 */
 	@Override
 	protected void editorContextMenuAboutToShow(IMenuManager menu) {
 		super.editorContextMenuAboutToShow(menu);
-		addGroup(menu, ITextEditorActionConstants.GROUP_EDIT, IContextMenuConstants.GROUP_GENERATE);		
-		addGroup(menu, ITextEditorActionConstants.GROUP_FIND, IContextMenuConstants.GROUP_SEARCH);		
+		addGroup(menu, ITextEditorActionConstants.GROUP_EDIT, IContextMenuConstants.GROUP_GENERATE);
+		addGroup(menu, ITextEditorActionConstants.GROUP_FIND, IContextMenuConstants.GROUP_SEARCH);
 		addGroup(menu, IContextMenuConstants.GROUP_SEARCH,  IContextMenuConstants.GROUP_SHOW);
 		if (getFile() != null) {
 			addAction(menu, IContextMenuConstants.GROUP_SHOW, "ShowInPackageView"); //$NON-NLS-1$
@@ -370,11 +370,11 @@
 	protected boolean isVMLaunched() {
 		return fVM != null;
 	}
-	
+
 	public boolean isEvaluating() {
 		return fEvaluating;
 	}
-	
+
 	public void evalSelection(int resultMode) {
 		if (!isInJavaProject()) {
 			reportNotInJavaProjectError();
@@ -383,14 +383,14 @@
 		if (isEvaluating()) {
 			return;
 		}
-		
+
 		checkCurrentProject();
-		
+
 		evaluationStarts();
 
 		fResultMode= resultMode;
 		buildAndLaunch();
-		
+
 		if (fVM == null) {
 			evaluationEnds();
 			return;
@@ -401,15 +401,15 @@
 		String snippet= selection.getText();
 		fSnippetStart= selection.getOffset();
 		fSnippetEnd= fSnippetStart + selection.getLength();
-		
-		evaluate(snippet);			
+
+		evaluate(snippet);
 	}
-	
+
 	/**
 	 * Checks if the page has been copied/moved to a different project or the project has been renamed.
 	 * Updates the launch configuration template if a copy/move/rename has occurred.
 	 */
-	protected void checkCurrentProject() {	
+	protected void checkCurrentProject() {
 		IFile file= getFile();
 		if (file == null) {
 			return;
@@ -429,10 +429,10 @@
 			ErrorDialog.openError(getShell(), SnippetMessages.getString("SnippetEditor.error.evaluating"), null, ce.getStatus()); //$NON-NLS-1$
 			evaluationEnds();
 			return;
-			
+
 		}
-	}	
-	
+	}
+
 	protected void buildAndLaunch() {
 		IJavaProject javaProject= getJavaProject();
 		if (javaProject == null) {
@@ -440,13 +440,13 @@
 		}
 		boolean build = !javaProject.getProject().getWorkspace().isAutoBuilding()
 			|| !javaProject.hasBuildState();
-		
+
 		if (build) {
 			if (!performIncrementalBuild()) {
 				return;
 			}
 		}
-		
+
 		boolean changed= classPathHasChanged();
 		if (!changed) {
 			changed = workingDirHasChanged();
@@ -462,7 +462,7 @@
 		if (changed) {
 			shutDownVM();
 		}
-	
+
 		if (fVM == null) {
 			checkMultipleEditors();
 		}
@@ -471,7 +471,7 @@
 			fVM= ScrapbookLauncher.getDefault().getDebugTarget(getFile());
 		}
 	}
-	
+
 	protected boolean performIncrementalBuild() {
 		IRunnableWithProgress r= new IRunnableWithProgress() {
 			@Override
@@ -484,7 +484,7 @@
 			}
 		};
 		try {
-			PlatformUI.getWorkbench().getProgressService().run(true, false, r);		
+			PlatformUI.getWorkbench().getProgressService().run(true, false, r);
 		} catch (InterruptedException e) {
 			JDIDebugUIPlugin.log(e);
 			evaluationEnds();
@@ -496,7 +496,7 @@
 		}
 		return true;
 	}
-	
+
 	protected void checkMultipleEditors() {
 		fVM= ScrapbookLauncher.getDefault().getDebugTarget(getFile());
 		//multiple editors are opened on the same page
@@ -515,7 +515,7 @@
 			}
 		}
 	}
-	
+
 	protected void setImports(String[] imports) {
 		fImports= imports;
 		IFile file= getFile();
@@ -534,11 +534,11 @@
 			ErrorDialog.openError(getShell(), SnippetMessages.getString("SnippetEditor.error.imports"), null, e.getStatus()); //$NON-NLS-1$
 		}
 	}
-	
+
 	protected String[] getImports() {
 		return fImports;
 	}
-			
+
 	protected IEvaluationContext getEvaluationContext() {
 		if (fEvaluationContext == null) {
 			IJavaProject project= getJavaProject();
@@ -547,7 +547,7 @@
 			}
 		}
 		if (fEvaluationContext != null) {
-			if (getImports() != null) {		
+			if (getImports() != null) {
 				fEvaluationContext.setImports(getImports());
 			} else {
 				fEvaluationContext.setImports(new String[]{});
@@ -555,7 +555,7 @@
 		}
 		return fEvaluationContext;
 	}
-	
+
 	protected IJavaProject getJavaProject() {
 		if (fJavaProject == null) {
 			try {
@@ -567,7 +567,7 @@
 		}
 		return fJavaProject;
 	}
-	
+
 	protected void shutDownVM() {
 		DebugPlugin.getDefault().removeDebugEventFilter(this);
 
@@ -582,7 +582,7 @@
 				if (getThread() != null) {
 					getThread().resume();
 				}
-				
+
 				fVM.terminate();
 			} catch (DebugException e) {
 				JDIDebugUIPlugin.log(e);
@@ -593,7 +593,7 @@
 			ScrapbookLauncher.getDefault().cleanup(target);
 		}
 	}
-	
+
 	/**
 	 * The VM has terminated, update state
 	 */
@@ -608,13 +608,13 @@
 		fEngine= null;
 		fireEvalStateChanged();
 	}
-	
+
 	public void addSnippetStateChangedListener(ISnippetStateChangedListener listener) {
 		if (fSnippetStateListeners != null && !fSnippetStateListeners.contains(listener)) {
 			fSnippetStateListeners.add(listener);
 		}
 	}
-	
+
 	public void removeSnippetStateChangedListener(ISnippetStateChangedListener listener) {
 		if (fSnippetStateListeners != null) {
 			fSnippetStateListeners.remove(listener);
@@ -640,7 +640,7 @@
 			getShell().getDisplay().asyncExec(r);
 		}
 	}
-	
+
 	protected void evaluate(String snippet) {
 		if (getThread() == null) {
 			WaitThread eThread= new WaitThread(Display.getCurrent(), this);
@@ -654,9 +654,9 @@
 			return;
 		}
 		boolean hitBreakpoints = Platform.getPreferencesService().getBoolean(
-				JDIDebugPlugin.getUniqueIdentifier(), 
-				JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION, 
-				true, 
+				JDIDebugPlugin.getUniqueIdentifier(),
+				JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION,
+				true,
 				null);
 		try {
 			getEvaluationEngine().evaluate(snippet,getThread(), this, hitBreakpoints);
@@ -666,7 +666,7 @@
 			evaluationEnds();
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.debug.eval.IEvaluationListener#evaluationComplete(org.eclipse.jdt.debug.eval.IEvaluationResult)
 	 */
@@ -680,7 +680,7 @@
 					showException(result.getException());
 				}
 				showAllErrors(errors);
-			} 
+			}
 			IJavaValue value= result.getValue();
 			if (value != null && !severeErrors) {
 				switch (fResultMode) {
@@ -698,7 +698,7 @@
 			}
 			evaluationEnds();
 	}
-	
+
 	/**
 	 * Make the expression view visible or open one
 	 * if required.
@@ -723,20 +723,20 @@
 				}
 			}
 		};
-		
+
 		async(r);
 	}
-		
+
 	protected void codeComplete(CompletionRequestor requestor) throws JavaModelException {
 		ITextSelection selection= (ITextSelection)getSelectionProvider().getSelection();
 		int start= selection.getOffset();
-		String snippet= getSourceViewer().getDocument().get();	
+		String snippet= getSourceViewer().getDocument().get();
 		IEvaluationContext e= getEvaluationContext();
 		if (e != null) {
 			e.codeComplete(snippet, start, requestor);
 		}
 	}
-		 
+
 	protected IJavaElement[] codeResolve() throws JavaModelException {
 		ISourceViewer viewer= getSourceViewer();
 		if (viewer == null) {
@@ -745,27 +745,27 @@
 		ITextSelection selection= (ITextSelection) getSelectionProvider().getSelection();
 		int start= selection.getOffset();
 		int len= selection.getLength();
-		
-		String snippet= viewer.getDocument().get();	
+
+		String snippet= viewer.getDocument().get();
 		IEvaluationContext e= getEvaluationContext();
 		if (e != null) {
 			return e.codeSelect(snippet, start, len);
 		}
 		return null;
-	}	
-	
+	}
+
 	protected void showError(IStatus status) {
 		evaluationEnds();
 		if (!status.isOK()) {
 			ErrorDialog.openError(getShell(), SnippetMessages.getString("SnippetEditor.error.evaluating2"), null, status); //$NON-NLS-1$
 		}
 	}
-	
+
 	protected void showError(String message) {
 		Status status= new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, message, null);
 		showError(status);
 	}
-	
+
 	protected void displayResult(IJavaValue result) {
 		StringBuffer resultString= new StringBuffer();
 		try {
@@ -779,7 +779,7 @@
 						resultString.append(SnippetMessages.getFormattedString("SnippetEditor.typename", result.getReferenceTypeName())); //$NON-NLS-1$
 					} else {
 						resultString.append(" "); //$NON-NLS-1$
-					}   
+					}
                     resultString.append(DisplayAction.trimDisplayResult(evaluateToString(result)));
 				}
 			} else {
@@ -789,7 +789,7 @@
 			JDIDebugUIPlugin.log(e);
 			ErrorDialog.openError(getShell(), SnippetMessages.getString("SnippetEditor.error.toString"), null, e.getStatus()); //$NON-NLS-1$
 		}
-		
+
 		final String message = resultString.toString();
 		Runnable r = new Runnable() {
 			@Override
@@ -803,11 +803,11 @@
 		};
 		async(r);
 	}
-	
+
 	/**
 	 * Returns the result of evaluating 'toString' on the given
 	 * value.
-	 * 
+	 *
 	 * @param value object or primitive data type the 'toString'
 	 *  is required for
 	 * @return the result of evaluating toString
@@ -826,7 +826,7 @@
 		}
 		return fResult;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.ui.IValueDetailListener#detailComputed(org.eclipse.debug.core.model.IValue, java.lang.String)
 	 */
@@ -835,16 +835,16 @@
 		fResult= result;
 		this.notifyAll();
 	}
-	
+
 	protected void showAllErrors(final String[] errors) {
 		IDocument document = getSourceViewer().getDocument();
 		String delimiter = document.getLegalLineDelimiters()[0];
-		
+
 		final StringBuffer errorString = new StringBuffer();
 		for (int i = 0; i < errors.length; i++) {
 			errorString.append(errors[i] + delimiter);
 		}
-		
+
 		Runnable r = new Runnable() {
 			@Override
 			public void run() {
@@ -857,7 +857,7 @@
 		};
 		async(r);
 	}
-	
+
 	private void showExpression(final JavaInspectExpression expression) {
 	    Runnable r = new Runnable() {
 	        @Override
@@ -867,8 +867,8 @@
 	    };
 	    async(r);
 	}
-    
-	
+
+
 	protected void showException(Throwable exception) {
 		if (exception instanceof DebugException) {
 			DebugException de = (DebugException)exception;
@@ -882,7 +882,7 @@
 		ByteArrayOutputStream bos= new ByteArrayOutputStream();
 		PrintStream ps= new PrintStream(bos, true);
 		exception.printStackTrace(ps);
-		
+
 		final String message = bos.toString();
 		Runnable r = new Runnable() {
 			@Override
@@ -896,7 +896,7 @@
 		};
 		async(r);
 	}
-	
+
 	protected void showUnderlyingException(Throwable t) {
 		if (t instanceof InvocationException) {
 			InvocationException ie= (InvocationException)t;
@@ -918,7 +918,7 @@
 			showException(t);
 		}
 	}
-	
+
 	protected IJavaProject findJavaProject() throws CoreException {
 		IFile file = getFile();
 		if (file != null) {
@@ -929,7 +929,7 @@
 		}
 		return null;
 	}
-		
+
 	protected boolean classPathHasChanged() {
 		String[] classpath= getClassPath(getJavaProject());
 		if (fLaunchedClassPath != null && !classPathsEqual(fLaunchedClassPath, classpath)) {
@@ -938,7 +938,7 @@
 		}
 		return false;
 	}
-	
+
 	protected boolean workingDirHasChanged() {
 		String wd = getWorkingDirectoryAttribute();
 		boolean changed = false;
@@ -956,7 +956,7 @@
 		}
 		return changed;
 	}
-	
+
 	protected boolean vmArgsChanged() {
 		String args = getVMArgsAttribute();
 		boolean changed = false;
@@ -973,8 +973,8 @@
 			MessageDialog.openWarning(getShell(), SnippetMessages.getString("SnippetEditor.Warning_1"), SnippetMessages.getString("SnippetEditor.1")); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 		return changed;
-	}	
-	
+	}
+
 	protected boolean vmHasChanged() {
 		IVMInstall vm = getVMInstall();
 		boolean changed = false;
@@ -992,7 +992,7 @@
 		}
 		return changed;
 	}
-			
+
 	protected boolean classPathsEqual(String[] path1, String[] path2) {
 		if (path1.length != path2.length) {
 			return false;
@@ -1004,7 +1004,7 @@
 		}
 		return true;
 	}
-		
+
 	protected synchronized void evaluationStarts() {
 		if (fThread != null) {
 			try {
@@ -1016,15 +1016,15 @@
 				showException(e);
 				return;
 			}
-		}		
+		}
 		fEvaluating = true;
 		setTitleImage();
 		fireEvalStateChanged();
 		showStatus(SnippetMessages.getString("SnippetEditor.evaluating")); //$NON-NLS-1$
 		getSourceViewer().setEditable(false);
 	}
-	
-	/** 
+
+	/**
 	 * Sets the tab image to indicate whether in the process of
 	 * evaluating or not.
 	 */
@@ -1041,7 +1041,7 @@
 			setTitleImage(image);
 		}
 	}
-		
+
 	protected void evaluationEnds() {
 		Runnable r = new Runnable() {
 			@Override
@@ -1055,13 +1055,13 @@
 		};
 		async(r);
 	}
-	
+
 	protected void showStatus(String message) {
 		IEditorSite site=(IEditorSite)getSite();
 		EditorActionBarContributor contributor= (EditorActionBarContributor)site.getActionBarContributor();
 		contributor.getActionBars().getStatusLineManager().setMessage(message);
 	}
-	
+
 	protected String[] getClassPath(IJavaProject project) {
 		try {
 			return JavaRuntime.computeDefaultRuntimeClassPath(project);
@@ -1070,14 +1070,14 @@
 			return new String[0];
 		}
 	}
-	
+
 	protected Shell getShell() {
 		return getSite().getShell();
 	}
-	
+
 	/**
 	 * @see IDebugEventFilter#filterDebugEvents(DebugEvent[])
-	 */	
+	 */
 	@Override
 	public DebugEvent[] filterDebugEvents(DebugEvent[] events) {
 		for (int i = 0; i < events.length; i++) {
@@ -1113,7 +1113,7 @@
 								int lineNumber = f.getLineNumber();
 								if (e.getDetail() == DebugEvent.STEP_END && (lineNumber == 28)
 									&& f.getDeclaringTypeName().equals("org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain1") //$NON-NLS-1$
-									&& jt.getDebugTarget() == fVM) { 
+									&& jt.getDebugTarget() == fVM) {
 								    // restore step filters
 								    target.setStepFiltersEnabled(fStepFiltersSetting);
 									setThread(jt);
@@ -1142,7 +1142,7 @@
 		}
 		return events;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#affectsTextPresentation(org.eclipse.jface.util.PropertyChangeEvent)
 	 */
@@ -1151,7 +1151,7 @@
         JavaSourceViewerConfiguration sourceViewerConfiguration = (JavaSourceViewerConfiguration) getSourceViewerConfiguration();
         return sourceViewerConfiguration.affectsTextPresentation(event);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#handlePreferenceStoreChanged(org.eclipse.jface.util.PropertyChangeEvent)
 	 */
@@ -1174,11 +1174,11 @@
 			super.handlePreferenceStoreChanged(event);
 		}
 	}
-	
+
 	protected IJavaThread getThread() {
 		return fThread;
 	}
-	
+
 	/**
 	 * Sets the thread to perform any evaluations in.
 	 * Notifies the WaitThread waiting on getting an evaluation thread
@@ -1188,7 +1188,7 @@
 		fThread= thread;
 		notifyAll();
 	}
-	
+
 	protected void launchVM() {
 		DebugPlugin.getDefault().addDebugEventFilter(this);
 		fLaunchedClassPath = getClassPath(getJavaProject());
@@ -1203,7 +1203,7 @@
 		};
 		BusyIndicator.showWhile(getShell().getDisplay(), r);
 	}
-	
+
 	/**
      * Return the <code>IFile</code> associated with the current
      * editor input. Will return <code>null</code> if the current
@@ -1213,7 +1213,7 @@
 		IEditorInput input= getEditorInput();
 		return input.getAdapter(IFile.class);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#updateSelectionDependentActions()
 	 */
@@ -1222,7 +1222,7 @@
 		super.updateSelectionDependentActions();
 		fireEvalStateChanged();
 	}
-	
+
 	/**
      * Terminates existing VM on a rename of the editor
  	 */
@@ -1231,7 +1231,7 @@
 		cleanupOnRenameOrMove();
 		super.setPartName(title);
 	}
-	
+
 	/**
 	 * If the launch configuration has been copied, moved or
 	 * renamed, shut down any running VM and clear the relevant cached information.
@@ -1243,15 +1243,15 @@
 			fThread= null;
 			fEvaluationContext= null;
 			fLaunchedClassPath= null;
-			
+
 			if (fEngine != null) {
 				fEngine.dispose();
 				fEngine= null;
-			}	
+			}
 		}
 		fJavaProject= null;
 	}
-	
+
 	/**
 	 * Returns whether this editor has been opened on a resource that
 	 * is in a Java project.
@@ -1264,7 +1264,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Displays an error dialog indicating that evaluation
 	 * cannot occur outside of a Java Project.
@@ -1282,7 +1282,7 @@
 		}
 		showError(message + SnippetMessages.getString("JavaSnippetEditor.Unable_to_perform_evaluation_outside_of_a_Java_Project_2")); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Asks the user for the workspace path
 	 * of a file resource and saves the document there.
@@ -1294,18 +1294,18 @@
 		SaveAsDialog dialog= new SaveAsDialog(shell);
 		dialog.open();
 		IPath path= dialog.getResult();
-		
+
 		if (path == null) {
 			if (progressMonitor != null) {
 				progressMonitor.setCanceled(true);
 			}
 			return;
 		}
-			
+
 		IWorkspace workspace= ResourcesPlugin.getWorkspace();
 		IFile file= workspace.getRoot().getFile(path);
 		final IEditorInput newInput= new FileEditorInput(file);
-		
+
 		WorkspaceModifyOperation op= new WorkspaceModifyOperation() {
 			@Override
 			public void execute(final IProgressMonitor monitor) throws CoreException {
@@ -1313,7 +1313,7 @@
 				dp.saveDocument(monitor, newInput, dp.getDocument(getEditorInput()), true);
 			}
 		};
-		
+
 		boolean success= false;
 		try {
 			getDocumentProvider().aboutToChange(newInput);
@@ -1331,12 +1331,12 @@
 				setInput(newInput);
 			}
 		}
-		
+
 		if (progressMonitor != null) {
 			progressMonitor.setCanceled(!success);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
 	 */
@@ -1344,7 +1344,7 @@
 	public boolean isSaveAsAllowed() {
 		return true;
 	}
-	
+
 	protected IClassFileEvaluationEngine getEvaluationEngine() {
 		if (fEngine == null) {
 			IPath outputLocation =	getJavaProject().getProject().getWorkingLocation(JDIDebugUIPlugin.getUniqueIdentifier());
@@ -1358,7 +1358,7 @@
 		}
 		return fEngine;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#createSourceViewer(org.eclipse.swt.widgets.Composite, org.eclipse.jface.text.source.IVerticalRuler, int)
 	 */
@@ -1374,7 +1374,7 @@
 
 		return viewer;
 	}
-	
+
 	/**
 	 * Returns the working directory attribute for this scrapbook
 	 */
@@ -1389,7 +1389,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the working directory attribute for this scrapbook
 	 */
@@ -1403,8 +1403,8 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Returns the vm install for this scrapbook
 	 */
@@ -1418,8 +1418,8 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Executes the given runnable in the Display thread
 	 */
@@ -1427,9 +1427,9 @@
 		Control control= getVerticalRuler().getControl();
 		if (!control.isDisposed()) {
 			control.getDisplay().asyncExec(r);
-		}		
+		}
 	}
-	
+
 	protected void showAndSelect(final String text, final int offset) {
 		Runnable r = new Runnable() {
 			@Override
@@ -1442,7 +1442,7 @@
 				selectAndReveal(offset, text.length());
 			}
 		};
-		async(r);		
+		async(r);
 	}
 
 	@SuppressWarnings("unchecked")
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetViewerConfiguration.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetViewerConfiguration.java
index 7bab110..cc0f5e2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetViewerConfiguration.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetViewerConfiguration.java
@@ -30,18 +30,18 @@
  *  The source viewer configuration for the Java snippet editor.
  */
 public class JavaSnippetViewerConfiguration extends JavaSourceViewerConfiguration {
-	
+
 	public JavaSnippetViewerConfiguration(JavaTextTools tools, IPreferenceStore preferenceStore, JavaSnippetEditor editor) {
 		super(tools.getColorManager(), preferenceStore, editor, IJavaPartitions.JAVA_PARTITIONING);
 	}
-	
+
 	/**
 	 * @see JDIViewerConfiguration#getContentAssistantProcessor()
 	 */
 	public IContentAssistProcessor getContentAssistantProcessor() {
 		return new JavaSnippetCompletionProcessor((JavaSnippetEditor)getEditor());
 	}
-	
+
 	/**
 	 * @see SourceViewerConfiguration#getContentAssistant(ISourceViewer)
 	 */
@@ -66,7 +66,7 @@
 
 		return assistant;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getReconciler(org.eclipse.jface.text.source.ISourceViewer)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileCreationWizard.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileCreationWizard.java
index ad3449b..5ab943d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileCreationWizard.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileCreationWizard.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,7 +29,7 @@
 
 	private NewSnippetFileWizardPage fPage;
 	private IStructuredSelection fSelection;
-	
+
 	public NewSnippetFileCreationWizard() {
 		setNeedsProgressMonitor(true);
 		setWindowTitle(SnippetMessages.getString("NewSnippetFileCreationWizard.title")); //$NON-NLS-1$
@@ -55,7 +55,7 @@
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */	
+	 */
 	@Override
 	public boolean performFinish() {
 		return fPage.finish();
@@ -69,7 +69,7 @@
 		fSelection= selection;
 		setDefaultPageImageDescriptor(JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_WIZBAN_NEWSCRAPPAGE));
 	}
-	
+
 	/**
 	 * If the current active editor edits a Java element return it, else
 	 * return null
@@ -85,6 +85,6 @@
 				}
 			}
 		}
-		return null;	
+		return null;
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileWizardPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileWizardPage.java
index d65164f..c674bdb 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileWizardPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/NewSnippetFileWizardPage.java
@@ -37,9 +37,9 @@
  * Page to create a new Java snippet file.
  */
 public class NewSnippetFileWizardPage extends WizardNewFileCreationPage {
-	
+
 	private static final String fgDefaultExtension= ".jpage"; //$NON-NLS-1$
-	
+
 	public NewSnippetFileWizardPage(IStructuredSelection selection) {
 		super("createScrapBookPage", selection); //$NON-NLS-1$
 		setTitle(SnippetMessages.getString("NewSnippetFileWizardPage.title")); //$NON-NLS-1$
@@ -47,7 +47,7 @@
 	}
 
 	public boolean finish() {
-		// add extension if non is provided 
+		// add extension if non is provided
 		String fileName= getFileName();
 		if (fileName != null && !fileName.endsWith(fgDefaultExtension)) {
 			setFileName(fileName + fgDefaultExtension);
@@ -81,7 +81,7 @@
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.dialogs.WizardNewFileCreationPage#validatePage()
 	 */
@@ -92,7 +92,7 @@
 		if (!valid) {
 			return false;
 		}
-		
+
 		IWorkspaceRoot workspaceRoot= ResourcesPlugin.getWorkspace().getRoot();
 		IPath containerPath= getContainerFullPath();
 		if (containerPath != null && containerPath.segmentCount() > 0) {
@@ -106,12 +106,12 @@
 				JDIDebugUIPlugin.log(e.getStatus());
 			}
 		}
-	
+
 		String fileName= getFileName();
-		if (fileName != null && !fileName.endsWith(fgDefaultExtension)) {		
+		if (fileName != null && !fileName.endsWith(fgDefaultExtension)) {
 			fileName= fileName + fgDefaultExtension;
 			IPath path= getContainerFullPath();
-			
+
 			if (path != null && workspaceRoot.exists(path.append(fileName))) {
 				setErrorMessage(SnippetMessages.getString("NewSnippetFileWizardPage.error.AlreadyExists")); //$NON-NLS-1$
 				return false;
@@ -119,13 +119,13 @@
 		}
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
 	@Override
 	public void createControl(Composite parent) {
 		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.NEW_SNIPPET_WIZARD_PAGE);		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.NEW_SNIPPET_WIZARD_PAGE);
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookLauncher.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookLauncher.java
index 12e9feb..e56af53 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookLauncher.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookLauncher.java
@@ -9,8 +9,8 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
- 
- 
+
+
 import java.io.File;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -69,62 +69,62 @@
  */
 
 public class ScrapbookLauncher implements IDebugEventSetListener {
-	
+
 	public static final String SCRAPBOOK_LAUNCH = IJavaDebugUIConstants.PLUGIN_ID + ".scrapbook_launch"; //$NON-NLS-1$
-	
+
 	public static final String SCRAPBOOK_FILE_PATH = IJavaDebugUIConstants.PLUGIN_ID + ".scrapbook_file_path"; //$NON-NLS-1$
-	
+
 	/**
 	 * Persistent property associated with snippet files specifying working directory.
 	 * Same format as the associated launch configuration attribute
 	 * <code>ATTR_WORKING_DIR</code>.
 	 */
 	public static final QualifiedName SNIPPET_EDITOR_LAUNCH_CONFIG_HANDLE_MEMENTO = new QualifiedName(IJavaDebugUIConstants.PLUGIN_ID, "snippet_editor_launch_config"); //$NON-NLS-1$
-		
+
 	private IJavaLineBreakpoint fMagicBreakpoint;
-	
-	private HashMap<IFile, IDebugTarget> fScrapbookToVMs = new HashMap<IFile, IDebugTarget>(10);
-	private HashMap<IDebugTarget, IBreakpoint> fVMsToBreakpoints = new HashMap<IDebugTarget, IBreakpoint>(10);
-	private HashMap<IDebugTarget, IFile> fVMsToScrapbooks = new HashMap<IDebugTarget, IFile>(10);
-	
+
+	private HashMap<IFile, IDebugTarget> fScrapbookToVMs = new HashMap<>(10);
+	private HashMap<IDebugTarget, IBreakpoint> fVMsToBreakpoints = new HashMap<>(10);
+	private HashMap<IDebugTarget, IFile> fVMsToScrapbooks = new HashMap<>(10);
+
 	private static ScrapbookLauncher fgDefault = null;
-	
+
 	private ScrapbookLauncher() {
 		//see getDefault()
 	}
-	
+
 	public static ScrapbookLauncher getDefault() {
 		if (fgDefault == null) {
 			fgDefault = new ScrapbookLauncher();
 		}
 		return fgDefault;
 	}
-	
+
 	/**
 	 * Launches a VM for the given scrapbook page, in debug mode.
 	 * Returns an existing launch if the page is already running.
 	 * @param page the scrapbook page file
-	 * 
+	 *
 	 * @return resulting launch, or <code>null</code> on failure
 	 */
 	protected ILaunch launch(IFile page) {
 
 		// clean up orphaned launch configurations
 		cleanupLaunchConfigurations();
-							
+
 		if (!page.getFileExtension().equals("jpage")) { //$NON-NLS-1$
 			showNoPageDialog();
 			return null;
 		}
-		
+
 		IDebugTarget vm = getDebugTarget(page);
 		if (vm != null) {
 			//already launched
 			return vm.getLaunch();
 		}
-		
+
 		IJavaProject javaProject= JavaCore.create(page.getProject());
-			
+
 		URL jarURL = null;
 		try {
 			jarURL = JDIDebugUIPlugin.getDefault().getBundle().getEntry("snippetsupport.jar"); //$NON-NLS-1$
@@ -136,8 +136,8 @@
 			JDIDebugUIPlugin.errorDialog("Unable to launch scrapbook VM", e); //$NON-NLS-1$
 			return null;
 		}
-		
-		List<IRuntimeClasspathEntry> cp = new ArrayList<IRuntimeClasspathEntry>(3);
+
+		List<IRuntimeClasspathEntry> cp = new ArrayList<>(3);
 		String jarFile = jarURL.getFile();
 		IRuntimeClasspathEntry supportEntry = JavaRuntime.newArchiveRuntimeClasspathEntry(new Path(jarFile));
 		cp.add(supportEntry);
@@ -150,7 +150,7 @@
 				}
 			}
 			IRuntimeClasspathEntry[] classPath = cp.toArray(new IRuntimeClasspathEntry[cp.size()]);
-			
+
 			return doLaunch(javaProject, page, classPath, jarFile);
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.errorDialog("Unable to launch scrapbook VM", e); //$NON-NLS-1$
@@ -169,18 +169,18 @@
 			try {
 				config = getLaunchConfigurationTemplate(page);
 				if (config != null) {
-					wc = config.getWorkingCopy();		
+					wc = config.getWorkingCopy();
 				}
 			} catch (CoreException e) {
 				config = null;
 				JDIDebugUIPlugin.errorDialog("Unable to retrieve scrapbook settings", e); //$NON-NLS-1$
 			}
-			
+
 			if (config == null) {
 				config = createLaunchConfigurationTemplate(page);
 				wc = config.getWorkingCopy();
-			}							
-			
+			}
+
 			IPath outputLocation =	p.getProject().getWorkingLocation(JDIDebugUIPlugin.getUniqueIdentifier());
 			File f = outputLocation.toFile();
 			URL u = null;
@@ -210,9 +210,9 @@
 					return null;
 				}
 			}
-			
-			// convert to mementos 
-			List<String> classpathList= new ArrayList<String>(classPath.length);
+
+			// convert to mementos
+			List<String> classpathList= new ArrayList<>(classPath.length);
 			for (int i = 0; i < classPath.length; i++) {
 				classpathList.add(classPath[i].getMemento());
 			}
@@ -225,7 +225,7 @@
 			if (wc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, (String)null) == null) {
 				wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, "org.eclipse.jdt.debug.ui.scrapbookSourcepathProvider"); //$NON-NLS-1$
 			}
-			
+
 			StringBuffer urlsString = new StringBuffer();
 			for (int i = 0; i < urls.length; i++) {
 				urlsString.append(' ');
@@ -233,9 +233,9 @@
 			}
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, urlsString.toString());
 			wc.setAttribute(SCRAPBOOK_LAUNCH, SCRAPBOOK_LAUNCH);
-			
+
 			config = wc.doSave();
-			
+
 			ILaunch launch = config.launch(ILaunchManager.DEBUG_MODE, null);
 			if (launch != null) {
 				IDebugTarget dt = launch.getDebugTarget();
@@ -252,10 +252,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Creates an "invisible" line breakpoint.
-	 * 
+	 *
 	 * @param jarFile
 	 *            path to the snippetsupport.jar file
 	 * @return the new 'magic' breakpoint
@@ -297,37 +297,37 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the debug target associated with the given
 	 * scrapbook page, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param page file representing scrapbook page
 	 * @return associated debug target or <code>null</code>
 	 */
 	public IDebugTarget getDebugTarget(IFile page) {
 		return fScrapbookToVMs.get(page);
 	}
-	
+
 	/**
 	 * Returns the magic breakpoint associated with the given
 	 * scrapbook VM. The magic breakpoint is the location at
 	 * which an evaluation begins.
-	 * 
-	 * @param target a scrapbook debug target 
+	 *
+	 * @param target a scrapbook debug target
 	 * @return the breakpoint at which an evaluation begins
 	 *  or <code>null</code> if none
 	 */
 	public IBreakpoint getMagicBreakpoint(IDebugTarget target) {
 		return fVMsToBreakpoints.get(target);
 	}
-	
+
 	protected void showNoPageDialog() {
 		String title= SnippetMessages.getString("ScrapbookLauncher.error.title"); //$NON-NLS-1$
 		String msg= SnippetMessages.getString("ScrapbookLauncher.error.pagenotfound"); //$NON-NLS-1$
 		MessageDialog.openError(JDIDebugUIPlugin.getActiveWorkbenchShell(),title, msg);
 	}
-	
+
 	protected void cleanup(IDebugTarget target) {
 		Object page = fVMsToScrapbooks.get(target);
 		if (page != null) {
@@ -344,15 +344,15 @@
 			}
 		}
 	}
-	
+
 	protected URL getEncodedURL(File file) throws MalformedURLException, UnsupportedEncodingException {
-		//looking at File.toURL the delimiter is always '/' 
+		//looking at File.toURL the delimiter is always '/'
 		// NOT File.separatorChar
 		String urlDelimiter= "/"; //$NON-NLS-1$
 		String unencoded= file.toURL().toExternalForm();
 		StringBuffer encoded= new StringBuffer();
 		StringTokenizer tokenizer= new StringTokenizer(unencoded, urlDelimiter);
-		
+
 		encoded.append(tokenizer.nextToken()); //file:
 		encoded.append(urlDelimiter);
 		encoded.append(tokenizer.nextToken()); //drive letter and ':'
@@ -370,7 +370,7 @@
 		}
 		return new URL(encoded.toString());
 	}
-	
+
 	/**
 	 * Returns the launch configuration used as a template for launching the
 	 * given scrapbook file, or <code>null</code> if none. The template contains
@@ -386,7 +386,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Creates and saves template launch configuration for the given scrapbook file.
 	 * @param page the backing page
@@ -398,7 +398,7 @@
 		String name = NLS.bind(SnippetMessages.getString("ScrapbookLauncher.17"), new String[]{page.getName()}); //$NON-NLS-1$
 		ILaunchConfigurationWorkingCopy wc = lcType.newInstance(null, name);
 		wc.setAttribute(IDebugUIConstants.ATTR_PRIVATE, true);
-		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain"); //$NON-NLS-1$			
+		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain"); //$NON-NLS-1$
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, page.getProject().getName());
 		wc.setAttribute(SCRAPBOOK_LAUNCH, SCRAPBOOK_LAUNCH);
 		wc.setAttribute(SCRAPBOOK_FILE_PATH, page.getFullPath().toString());
@@ -406,9 +406,9 @@
 		JavaMigrationDelegate.updateResourceMapping(wc);
 		ILaunchConfiguration config = wc.doSave();
 		setLaunchConfigMemento(page, config.getMemento());
-		return config;		
-	}	
-		
+		return config;
+	}
+
 	/**
 	 * Returns the handle memento for the given scrapbook's launch configuration
 	 * template, or <code>null</code> if none.
@@ -422,8 +422,8 @@
 			JDIDebugUIPlugin.log(e);
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Sets the handle memento for the given scrapbook's launch configuration
 	 * template.
@@ -436,7 +436,7 @@
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
 		}
-	}	
+	}
 
 	/**
 	 * Returns the launch manager.
@@ -445,13 +445,13 @@
 	protected static ILaunchManager getLaunchManager() {
 		return DebugPlugin.getDefault().getLaunchManager();
 	}
-	
+
 	/**
 	 * Returns the working directory attribute for the given snippet file,
 	 * possibly <code>null</code>.
 	 * @param file the backing file
 	 * @return the working directory
-	 * 
+	 *
 	 * @exception CoreException if unable to retrieve the attribute
 	 */
 	public static String getWorkingDirectoryAttribute(IFile file) throws CoreException {
@@ -461,13 +461,13 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the VM arguments attribute for the given snippet file,
 	 * possibly <code>null</code>.
 	 * @param file the backing file
 	 * @return the VM arguments
-	 * 
+	 *
 	 * @exception CoreException if unable to retrieve the attribute
 	 */
 	public static String getVMArgsAttribute(IFile file) throws CoreException {
@@ -476,13 +476,13 @@
 			return config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, (String)null);
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Returns the VM install used to launch the given snippet file.
 	 * @param file the backing file
 	 * @return the VM install
-	 * 
+	 *
 	 * @exception CoreException if unable to retrieve the attribute
 	 */
 	public static IVMInstall getVMInstall(IFile file) throws CoreException {
@@ -492,8 +492,8 @@
 			return JavaRuntime.getVMInstall(pro);
 		}
 		return JavaRuntime.computeVMInstall(config);
-	}	
-	
+	}
+
 	/**
 	 * Deletes any scrapbook launch configurations for scrap books that
 	 * have been deleted. Rather than listening to all resource deltas,
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookSourcepathProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookSourcepathProvider.java
index f95fb49..bb7c547 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookSourcepathProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ScrapbookSourcepathProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsAction.java
index 7d2a57b..bb2ea38 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 import org.eclipse.ui.PlatformUI;
 
 public class SelectImportsAction extends SnippetAction {
-	
+
 	public SelectImportsAction(JavaSnippetEditor editor) {
 		super(editor);
 		setText(SnippetMessages.getString("SelectImports.label")); //$NON-NLS-1$
@@ -28,7 +28,7 @@
 		setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_OBJS_IMPCONT));
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaDebugHelpContextIds.SCRAPBOOK_IMPORTS_ACTION);
 	}
-	
+
 	/**
 	 * @see IAction#run()
 	 */
@@ -39,14 +39,14 @@
 			return;
 		}
 		chooseImports();
-	} 
-	
+	}
+
 	private void chooseImports() {
 		String[] imports= getEditor().getImports();
 		Dialog dialog= new SelectImportsDialog(getEditor(), imports);
-		dialog.open();		
+		dialog.open();
 	}
-	
+
 	/**
 	 * @see ISnippetStateChangedListener#snippetStateChanged(JavaSnippetEditor)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsDialog.java
index 60b1556..c729e84 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SelectImportsDialog.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
 
- 
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -62,24 +62,24 @@
 	private TableViewer fImportsViewer;
 	private Table fImportsTable;
 	private JavaSnippetEditor fEditor;
-	
+
 	private ImportsContentProvider fImportContentProvider;
-	
+
 	/**
 	 * Content provider for the table.  Content consists of instances of Filter.
-	 */	
+	 */
 	protected class ImportsContentProvider implements IStructuredContentProvider {
-		
+
 		private TableViewer fViewer;
 		private List<Filter> fImportNames;
-		
+
 		public ImportsContentProvider(TableViewer viewer) {
 			fViewer = viewer;
 			populateImports();
 		}
-		
+
 		protected void populateImports() {
-			fImportNames= new ArrayList<Filter>(1);
+			fImportNames= new ArrayList<>(1);
 			if (fImports != null) {
 				for (int i = 0; i < fImports.length; i++) {
 					String name = fImports[i];
@@ -87,7 +87,7 @@
 				}
 			}
 		}
-		
+
 		protected void addImport(String name) {
 			Filter imprt = new Filter(name, false);
 			if (!fImportNames.contains(imprt)) {
@@ -95,8 +95,8 @@
 				fViewer.add(imprt);
 			}
 		}
-		
-		
+
+
 		protected void removeImports(Object[] imports) {
 			for (int i = 0; i < imports.length; i++) {
 				Filter imprt = (Filter)imports[i];
@@ -104,7 +104,7 @@
 			}
 			fViewer.remove(imports);
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
 		 */
@@ -112,35 +112,35 @@
 		public Object[] getElements(Object inputElement) {
 			return fImportNames.toArray();
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
 		 */
 		@Override
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
 		 */
 		@Override
 		public void dispose() {
-		}		
+		}
 	}
-	
+
 	public SelectImportsDialog(JavaSnippetEditor editor, String[] imports) {
 		super(editor.getShell());
 		fEditor= editor;
 		fImports= imports;
 	}
-	
+
 	private void createImportButtons(Composite container) {
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(container, IJavaDebugHelpContextIds.SNIPPET_IMPORTS_DIALOG);
 		Composite bcomp = SWTFactory.createComposite(container, container.getFont(), 1, 1, GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL, 0, 0);
 		GridLayout gl = (GridLayout) bcomp.getLayout();
 		gl.verticalSpacing = 0;
 		// Add type button
-		fAddTypeButton = SWTFactory.createPushButton(bcomp, 
+		fAddTypeButton = SWTFactory.createPushButton(bcomp,
 				SnippetMessages.getString("SelectImportsDialog.Add_&Type_1"),  //$NON-NLS-1$
 				SnippetMessages.getString("SelectImportsDialog.Choose_a_Type_to_Add_as_an_Import_2"),  //$NON-NLS-1$
 				null);
@@ -153,9 +153,9 @@
 			public void widgetDefaultSelected(SelectionEvent se) {
 			}
 		});
-		
+
 		// Add package button
-		fAddPackageButton = SWTFactory.createPushButton(bcomp, 
+		fAddPackageButton = SWTFactory.createPushButton(bcomp,
 				SnippetMessages.getString("SelectImportsDialog.Add_&Package_3"),  //$NON-NLS-1$
 				SnippetMessages.getString("SelectImportsDialog.Choose_a_Package_to_Add_as_an_Import_4"),  //$NON-NLS-1$
 				null);
@@ -168,9 +168,9 @@
 			public void widgetDefaultSelected(SelectionEvent se) {
 			}
 		});
-		
+
 		// Remove button
-		fRemoveImportsButton = SWTFactory.createPushButton(bcomp, 
+		fRemoveImportsButton = SWTFactory.createPushButton(bcomp,
 				SnippetMessages.getString("SelectImportsDialog.&Remove_5"),  //$NON-NLS-1$
 				SnippetMessages.getString("SelectImportsDialog.Remove_All_Selected_Imports_6"),  //$NON-NLS-1$
 				null);
@@ -185,18 +185,18 @@
 		});
 		fRemoveImportsButton.setEnabled(false);
 	}
-	
+
 	private void removeImports() {
-		IStructuredSelection selection = (IStructuredSelection)fImportsViewer.getSelection();		
+		IStructuredSelection selection = (IStructuredSelection)fImportsViewer.getSelection();
 		fImportContentProvider.removeImports(selection.toArray());
 	}
-	
+
 	private void addPackage() {
 		Shell shell= fAddPackageButton.getDisplay().getActiveShell();
 		ElementListSelectionDialog dialog = null;
 		try {
 			IJavaProject project= fEditor.getJavaProject();
-			List<IJavaElement> projects= new ArrayList<IJavaElement>();
+			List<IJavaElement> projects= new ArrayList<>();
 			projects.add(project);
 			IPackageFragmentRoot[] roots= project.getAllPackageFragmentRoots();
 			for (int i = 0; i < roots.length; i++) {
@@ -208,7 +208,7 @@
 			String title= SnippetMessages.getString("SelectImportsDialog.Add_package_as_import_7"); //$NON-NLS-1$
 			String message= SnippetMessages.getString("SelectImportsDialog.Could_not_open_package_selection_dialog_8");  //$NON-NLS-1$
 			ExceptionHandler.handle(jme, title, message);
-			return;			
+			return;
 		}
 		if (dialog == null) {
 			return;
@@ -227,9 +227,9 @@
 				filter += ".*"; //$NON-NLS-1$
 				fImportContentProvider.addImport(filter);
 			}
-		}		
+		}
 	}
-				
+
 	private void addType() {
 		Shell shell= fAddTypeButton.getDisplay().getActiveShell();
 		SelectionDialog dialog= null;
@@ -242,20 +242,20 @@
 			ExceptionHandler.handle(jme, title, message);
 			return;
 		}
-	
+
 		dialog.setTitle(SnippetMessages.getString("SelectImportsDialog.Add_Type_as_Import_12")); //$NON-NLS-1$
 		dialog.setMessage(SnippetMessages.getString("SelectImportsDialog.&Select_a_type_to_add_to_add_as_an_import_15")); //$NON-NLS-1$
 		if (dialog.open() == IDialogConstants.CANCEL_ID) {
 			return;
 		}
-		
+
 		Object[] types= dialog.getResult();
 		if (types != null && types.length > 0) {
 			IType type = (IType)types[0];
 			fImportContentProvider.addImport(type.getFullyQualifiedName());
-		}		
+		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
 	 */
@@ -287,10 +287,10 @@
 				if (selection.isEmpty()) {
 					fRemoveImportsButton.setEnabled(false);
 				} else {
-					fRemoveImportsButton.setEnabled(true);					
+					fRemoveImportsButton.setEnabled(true);
 				}
 			}
-		});		
+		});
 		createImportButtons(outer);
 		applyDialogFont(outer);
 		return parent;
@@ -313,10 +313,10 @@
 		fEditor.setImports(imports);
 		super.okPressed();
 	}
-	
+
 	/**
 	 * Sets the title for the dialog and establishes the help context.
-	 * 
+	 *
 	 * @see org.eclipse.jface.window.Window#configureShell(Shell);
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ShowInPackageViewAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ShowInPackageViewAction.java
index 3b4f274..a4f480b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ShowInPackageViewAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/ShowInPackageViewAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Sebastian Davids <sdavids@gmx.de> - initial API and implementation
  *     IBM Corporation - bug fixes
@@ -22,29 +22,29 @@
 import org.eclipse.ui.PlatformUI;
 
 /**
- * This action reveals the snippet editor in the package explorer. 
- * 
+ * This action reveals the snippet editor in the package explorer.
+ *
  * <p>
  * This class may be instantiated; it is not intended to be subclassed.
  * </p>
  * @since 3.0
  */
 public class ShowInPackageViewAction extends Action {
-	
+
 	private JavaSnippetEditor fEditor;
-	
+
 	/**
 	 * Creates a new <code>ShowInPackageViewAction</code>.
-	 * 
+	 *
 	 * @param site the site providing context information for this action
 	 */
 	public ShowInPackageViewAction() {
 		super(SnippetMessages.getString("ShowInPackageViewAction.label")); //$NON-NLS-1$
 		setDescription(SnippetMessages.getString("ShowInPackageViewAction.description")); //$NON-NLS-1$
 		setToolTipText(SnippetMessages.getString("ShowInPackageViewAction.tooltip")); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.SHOW_IN_PACKAGEVIEW_ACTION);	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.SHOW_IN_PACKAGEVIEW_ACTION);
 	}
-	
+
 	/**
 	 * Note: This constructor is for internal use only. Clients should not call this constructor.
 	 */
@@ -52,7 +52,7 @@
 		this();
 		fEditor= editor;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.action.Action#run()
 	 */
@@ -84,7 +84,7 @@
 	private Object getSelectedElement(PackageExplorerPart view) {
 		return ((IStructuredSelection) view.getSite().getSelectionProvider().getSelection()).getFirstElement();
 	}
-	
+
 	private static String getDialogTitle() {
 		return SnippetMessages.getString("ShowInPackageViewAction.dialog.title"); //$NON-NLS-1$
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetAction.java
index a6eb741..3595257 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,29 +16,29 @@
  * A base class for evaluation state dependent actions.
  */
 public abstract class SnippetAction extends Action implements ISnippetStateChangedListener {
-		
+
 	private JavaSnippetEditor fEditor;
-	
+
 	public SnippetAction(JavaSnippetEditor editor) {
 		setEditor(editor);
 	}
-		
+
 	public void setEditor(JavaSnippetEditor editor) {
 		if (fEditor != null) {
 			fEditor.removeSnippetStateChangedListener(this);
 		}
 		fEditor= editor;
-		
+
 		if (fEditor != null) {
 			if (fEditor.getFile() == null) { //external file
 				setEnabled(false);
 				return;
-			} 
+			}
 			fEditor.addSnippetStateChangedListener(this);
 		}
 		snippetStateChanged(fEditor);
-	} 
-	
+	}
+
 	protected JavaSnippetEditor getEditor() {
 		return fEditor;
 	}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetDocumentSetupParticipant.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetDocumentSetupParticipant.java
index 2334c91..2666eee 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetDocumentSetupParticipant.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetDocumentSetupParticipant.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - Initial implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 
 	public SnippetDocumentSetupParticipant() {
 	}
-	
+
 	/*
 	 * @see org.eclipse.core.filebuffers.IDocumentSetupParticipant#setup(org.eclipse.jface.text.IDocument)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorActionContributor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorActionContributor.java
index 19700ef..b6834e2 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorActionContributor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorActionContributor.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
 
- 
+
 import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
 import org.eclipse.jdt.internal.ui.javaeditor.BasicCompilationUnitEditorActionContributor;
 import org.eclipse.jface.action.IMenuManager;
@@ -23,24 +23,24 @@
  * Contributions of the Java Snippet Editor to the Workbench's tool and menu bar.
  */
 public class SnippetEditorActionContributor extends BasicCompilationUnitEditorActionContributor {
- 	
+
 	protected JavaSnippetEditor fSnippetEditor;
-	
+
 	private StopAction fStopAction;
 	private SelectImportsAction fSelectImportsAction;
 	private SnippetOpenOnSelectionAction fOpenOnSelectionAction;
 	private SnippetOpenHierarchyOnSelectionAction fOpenOnTypeSelectionAction;
-	
+
 	public SnippetEditorActionContributor() {
 		super();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
 	 */
 	@Override
 	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		
+
 		if (fStopAction == null) {
 			toolBarManager.add(new Separator(IJavaDebugUIConstants.EVALUATION_GROUP));
 			return;
@@ -49,7 +49,7 @@
 		toolBarManager.add(fSelectImportsAction);
 		toolBarManager.update(false);
 	}
-			
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager)
 	 */
@@ -59,7 +59,7 @@
 			return;
 		}
 		super.contributeToMenu(menu);
-		
+
 		IMenuManager navigateMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
 		if (navigateMenu != null) {
 			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fOpenOnSelectionAction);
@@ -67,13 +67,13 @@
 			navigateMenu.setVisible(true);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(org.eclipse.ui.IEditorPart)
 	 */
 	@Override
 	public void setActiveEditor(IEditorPart part) {
-		
+
 		super.setActiveEditor(part);
 		fSnippetEditor= null;
 		if (part instanceof JavaSnippetEditor) {
@@ -86,32 +86,32 @@
 		}
 
 		if (fOpenOnSelectionAction != null) {
-			fStopAction.setEditor(fSnippetEditor);		
+			fStopAction.setEditor(fSnippetEditor);
 			fSelectImportsAction.setEditor(fSnippetEditor);
 			fOpenOnSelectionAction.setEditor(fSnippetEditor);
 			fOpenOnTypeSelectionAction.setEditor(fSnippetEditor);
 		}
-			
-		updateStatus(fSnippetEditor);			
+
+		updateStatus(fSnippetEditor);
 	}
-	 
+
 	protected void initializeActions() {
-		 
+
 		fOpenOnSelectionAction= new SnippetOpenOnSelectionAction(fSnippetEditor);
 		fOpenOnTypeSelectionAction= new SnippetOpenHierarchyOnSelectionAction(fSnippetEditor);
 		fStopAction= new StopAction(fSnippetEditor);
-		
+
 		fSelectImportsAction= new SelectImportsAction(fSnippetEditor);
 		if (fSnippetEditor.getFile() == null) {
 			fSelectImportsAction.setEnabled(false);
 		}
-	}	
-	
+	}
+
 	protected void updateStatus(JavaSnippetEditor editor) {
 		String message= ""; //$NON-NLS-1$
 		if (editor != null && editor.isEvaluating()) {
 			message= SnippetMessages.getString("SnippetActionContributor.evalMsg");  //$NON-NLS-1$
-		} 
+		}
 		getActionBars().getStatusLineManager().setMessage(message);
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorPropertyPage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorPropertyPage.java
index a881aef..31cab71 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorPropertyPage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorPropertyPage.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *     Remy Chi Jian Suen <remy.suen@gmail.com>
@@ -37,17 +37,17 @@
  * Page to set working directory property on scrapbook page.
  */
 public class SnippetEditorPropertyPage extends PropertyPage {
-	
+
 	private WorkingDirectoryBlock fWorkingDirBlock = new JavaWorkingDirectoryBlock();
-	
+
 	private JavaJRETab fJRETab = new JavaJRETab();
-	
+
 	private VMArgumentsBlock fVMArgumentsBlock = new VMArgumentsBlock();
-	
+
 	// launch config template for this scrapbook file
 	private ILaunchConfiguration fConfig;
 	private ILaunchConfigurationWorkingCopy fWorkingCopy;
-	
+
 	private Proxy fProxy;
 
 	class Proxy implements ILaunchConfigurationDialog {
@@ -95,7 +95,7 @@
 		 */
 		@Override
 		public void updateButtons() {
-			
+
 		}
 
 		/* (non-Javadoc)
@@ -129,7 +129,7 @@
 		public void setActiveTab(int index) {
 		}
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
 	 */
@@ -139,11 +139,11 @@
 		GridLayout topLayout = new GridLayout();
 		topLayout.numColumns = 1;
 		comp.setLayout(topLayout);
-		comp.setFont(parent.getFont());		
-		
+		comp.setFont(parent.getFont());
+
 		// fake launch config dialog
 		fProxy = new Proxy();
-		
+
 		try {
 			fConfig = ScrapbookLauncher.getLaunchConfigurationTemplate(getFile());
 			if (fConfig != null) {
@@ -164,20 +164,20 @@
 				JDIDebugUIPlugin.statusDialog(SnippetMessages.getString("ScrapbookLauncher.Unable_to_retrieve_settings"), e.getStatus()); //$NON-NLS-1$
 			}
 		}
-				
+
 		fWorkingDirBlock.setLaunchConfigurationDialog(fProxy);
-		fWorkingDirBlock.createControl(comp);		
+		fWorkingDirBlock.createControl(comp);
 		fWorkingDirBlock.initializeFrom(fConfig);
-		
+
 		fVMArgumentsBlock.setLaunchConfigurationDialog(fProxy);
 		fVMArgumentsBlock.createControl(comp);
-		fVMArgumentsBlock.initializeFrom(fConfig);		
-		
+		fVMArgumentsBlock.initializeFrom(fConfig);
+
 		fJRETab.setLaunchConfigurationDialog(fProxy);
 		fJRETab.setVMSpecificArgumentsVisible(false);
 		fJRETab.createControl(comp);
 		fJRETab.initializeFrom(fConfig);
-		
+
 		return comp;
 	}
 
@@ -187,7 +187,7 @@
 	protected IFile getFile() {
 		return (IFile)getElement();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
 	 */
@@ -201,7 +201,7 @@
 		fJRETab.initializeFrom(fWorkingCopy);
 		fVMArgumentsBlock.initializeFrom(fWorkingCopy);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.IPreferencePage#isValid()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorStorageDocumentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorStorageDocumentProvider.java
index 6d142d8..bed8ebc 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorStorageDocumentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetEditorStorageDocumentProvider.java
@@ -20,7 +20,7 @@
  * @since 3.0
  */
 public class SnippetEditorStorageDocumentProvider extends StorageDocumentProvider {
-	
+
 	/*
 	 * @see org.eclipse.ui.editors.text.StorageDocumentProvider#setupDocument(java.lang.Object,
 	 *      org.eclipse.jface.text.IDocument)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetFileDocumentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetFileDocumentProvider.java
index 1ca0ba3..d7b719f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetFileDocumentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetFileDocumentProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetMessages.java
index a687c4f..4633455 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetMessages.java
@@ -31,10 +31,10 @@
 			return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
 		}
 	}
-	
+
 	/**
 	 * Gets a string from the resource bundle and formats it with the argument
-	 * 
+	 *
 	 * @param key	the string used to get the bundle value, must not be null
 	 */
 	public static String getFormattedString(String key, Object arg) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenHierarchyOnSelectionAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenHierarchyOnSelectionAction.java
index bb654e8..b858c69 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenHierarchyOnSelectionAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenHierarchyOnSelectionAction.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
 
- 
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,15 +30,15 @@
 
 /**
  * This action opens a Java editor on the element represented by text selection of
- * the connected Java source editor. In addition, if the element is a type, it also 
+ * the connected Java source editor. In addition, if the element is a type, it also
  * opens shows the element in the type hierarchy viewer.
  */
 public class SnippetOpenHierarchyOnSelectionAction extends OpenTypeHierarchyAction {
-	
+
 	private JavaSnippetEditor fEditor;
 	private String fDialogTitle;
 	private String fDialogMessage;
-	
+
 	public SnippetOpenHierarchyOnSelectionAction(JavaSnippetEditor editor) {
 		super(editor.getSite());
 		fEditor= editor;
@@ -49,7 +49,7 @@
 		IHandlerService handlerService = editor.getSite().getService(IHandlerService.class);
 		handlerService.activateHandler(IJavaEditorActionDefinitionIds.OPEN_TYPE_HIERARCHY, handler);
 	}
-	
+
 	protected void setResources() {
 		setText(SnippetMessages.getString("SnippetOpenHierarchyOnSelectionAction.label")); //$NON-NLS-1$
 		setDescription(SnippetMessages.getString("SnippetOpenHierarchyOnSelectionAction.tooltip")); //$NON-NLS-1$
@@ -57,15 +57,15 @@
 		setDialogTitle(SnippetMessages.getString("SnippetOpenHierarchyOnSelectionDialog.title")); //$NON-NLS-1$
 		setDialogMessage(SnippetMessages.getString("SnippetOpenHierarchyOnSelectionDialog.message")); //$NON-NLS-1$
 	}
-	
+
 	protected void setDialogTitle(String title) {
 		fDialogTitle= title;
 	}
-	
+
 	protected void setDialogMessage(String message) {
 		fDialogMessage= message;
 	}
-	
+
 	@Override
 	public void run() {
 		if (fEditor == null) {
@@ -84,18 +84,18 @@
 			JDIDebugUIPlugin.log(x);
 		}
 	}
-	
+
 	protected void setEditor(JavaSnippetEditor contentEditor) {
 		fEditor= contentEditor;
 	}
-	
+
 	/**
 	 * Filters out source references from the given code resolve results.
-	 * A utility method that can be called by subclassers. 
+	 * A utility method that can be called by subclassers.
 	 */
 	protected List<IJavaElement> filterResolveResults(IJavaElement[] codeResolveResults) {
 		int nResults= codeResolveResults.length;
-		List<IJavaElement> refs= new ArrayList<IJavaElement>(nResults);
+		List<IJavaElement> refs= new ArrayList<>(nResults);
 		for (int i= 0; i < nResults; i++) {
 			if (codeResolveResults[i] instanceof ISourceReference) {
 				refs.add(codeResolveResults[i]);
@@ -103,33 +103,33 @@
 		}
 		return refs;
 	}
-			
+
 
 	/**
 	 * Shows a dialog for resolving an ambigous Java element.
 	 * Utility method that can be called by subclassers.
 	 */
 	protected IJavaElement selectJavaElement(List<IJavaElement> elements, Shell shell, String title, String message) {
-		
+
 		int nResults= elements.size();
-		
+
 		if (nResults == 0) {
 			return null;
 		}
-		
+
 		if (nResults == 1) {
 			return elements.get(0);
 		}
-		
+
 		int flags= JavaElementLabelProvider.SHOW_DEFAULT
 						| JavaElementLabelProvider.SHOW_QUALIFIED
 						| JavaElementLabelProvider.SHOW_ROOT;
-						
+
 		ElementListSelectionDialog dialog= new ElementListSelectionDialog(shell, new JavaElementLabelProvider(flags));
 		dialog.setTitle(title);
 		dialog.setMessage(message);
 		dialog.setElements(elements.toArray());
-		
+
 		if (dialog.open() == Window.OK) {
 			Object[] selection= dialog.getResult();
 			if (selection != null && selection.length > 0) {
@@ -141,7 +141,7 @@
 					}
 				}
 			}
-		}		
+		}
 		return null;
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenOnSelectionAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenOnSelectionAction.java
index 784eaf8..28e4e7b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenOnSelectionAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/SnippetOpenOnSelectionAction.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.snippeteditor;
 
- 
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -36,11 +36,11 @@
  * the code snippet.
  */
 public class SnippetOpenOnSelectionAction extends OpenAction {
-	
+
 	protected JavaSnippetEditor fEditor;
 	private String fDialogTitle;
 	private String fDialogMessage;
-	
+
 	public SnippetOpenOnSelectionAction(JavaSnippetEditor editor) {
 		super(editor.getSite());
 		fEditor= editor;
@@ -51,7 +51,7 @@
 		IHandlerService service = editor.getSite().getService(IHandlerService.class);
 		service.activateHandler(IJavaEditorActionDefinitionIds.OPEN_EDITOR, handler);
 	}
-	
+
 	protected void setResources() {
 		setText(SnippetMessages.getString("SnippetOpenOnSelectionAction.label")); //$NON-NLS-1$
 		setDescription(SnippetMessages.getString("SnippetOpenOnSelectionAction.tooltip")); //$NON-NLS-1$
@@ -59,19 +59,19 @@
 		setDialogTitle(SnippetMessages.getString("SnippetOpenOnSelectionDialog.title")); //$NON-NLS-1$
 		setDialogMessage(SnippetMessages.getString("SnippetOpenOnSelectionDialog.message")); //$NON-NLS-1$
 	}
-	
+
 	protected void setDialogTitle(String title) {
 		fDialogTitle= title;
 	}
-	
+
 	protected void setDialogMessage(String message) {
 		fDialogMessage= message;
 	}
-	
+
 	protected void setEditor(JavaSnippetEditor contentEditor) {
 		fEditor= contentEditor;
 	}
-	
+
 	/**
 	 * Shows a dialog for resolving an ambiguous java element.
 	 * Utility method that can be called by sub-classes.
@@ -87,7 +87,7 @@
 		int flags= JavaElementLabelProvider.SHOW_DEFAULT
 						| JavaElementLabelProvider.SHOW_QUALIFIED
 						| JavaElementLabelProvider.SHOW_ROOT;
-						
+
 		ElementListSelectionDialog dialog= new ElementListSelectionDialog(shell, new JavaElementLabelProvider(flags));
 		dialog.setTitle(title);
 		dialog.setMessage(message);
@@ -103,18 +103,18 @@
 					}
 				}
 			}
-		}		
+		}
 		return null;
 	}
-	
-	
+
+
 	/**
 	 * Filters out source references from the given code resolve results.
-	 * A utility method that can be called by sub-classes. 
+	 * A utility method that can be called by sub-classes.
 	 */
 	protected List<IJavaElement> filterResolveResults(IJavaElement[] codeResolveResults) {
 		int nResults= codeResolveResults.length;
-		List<IJavaElement> refs= new ArrayList<IJavaElement>(nResults);
+		List<IJavaElement> refs= new ArrayList<>(nResults);
 		for (int i= 0; i < nResults; i++) {
 			if (codeResolveResults[i] instanceof ISourceReference) {
 				refs.add(codeResolveResults[i]);
@@ -122,7 +122,7 @@
 		}
 		return refs;
 	}
-			
+
 	@Override
 	public void run() {
 		if (fEditor == null) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/StopAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/StopAction.java
index 3832501..6bf1347 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/StopAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/StopAction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,10 +21,10 @@
  *
  */
 public class StopAction extends SnippetAction {
-	
+
 	public StopAction(JavaSnippetEditor editor) {
 		super(editor);
-		
+
 		setText(SnippetMessages.getString("StopAction.label"));  //$NON-NLS-1$
 		setToolTipText(SnippetMessages.getString("StopAction.tooltip")); //$NON-NLS-1$
 		setDescription(SnippetMessages.getString("StopAction.description"));  //$NON-NLS-1$
@@ -34,7 +34,7 @@
 		setHoverImageDescriptor(JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_TOOL_TERMSNIPPET_HOVER));
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaDebugHelpContextIds.TERMINATE_SCRAPBOOK_VM_ACTION);
 	}
-	
+
 	/**
 	 * @see IAction#run()
 	 */
@@ -42,7 +42,7 @@
 	public void run() {
 		getEditor().shutDownVM();
 	}
-	
+
 	/**
 	 * @see ISnippetStateChangedListener#snippetStateChanged(JavaSnippetEditor)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathContainerSourceContainerBrowser.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathContainerSourceContainerBrowser.java
index 093f257..b662b2f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathContainerSourceContainerBrowser.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathContainerSourceContainerBrowser.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 
 /**
  * Used to choose a classpath container.
- * 
+ *
  * @since 3.0
  */
 public class ClasspathContainerSourceContainerBrowser extends AbstractSourceContainerBrowser {
@@ -56,10 +56,10 @@
 		return editLibraries(shell, director, classpathEntry);
 		//, SourceLookupMessages.getString("ClasspathContainerSourceContainerBrowser.1")
 	}
-	
+
 	/**
 	 * Create or edit a container classpath entry.
-	 * 
+	 *
 	 * @param shell shell to open dialog on
 	 * @param director source lookup director
 	 * @param classpathEntry entry to edit, or <code>null</code> if creating
@@ -96,7 +96,7 @@
 				newContainers[i] = container;
 			}
 			return newContainers;
-		}			
+		}
 		return new ISourceContainer[0];
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathVariableSourceContainerBrowser.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathVariableSourceContainerBrowser.java
index 07f0f9e..edd82de 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathVariableSourceContainerBrowser.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/ClasspathVariableSourceContainerBrowser.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 
 /**
  * Used to choose a classpath variable.
- * 
+ *
  * @since 3.0
  */
 public class ClasspathVariableSourceContainerBrowser extends AbstractSourceContainerBrowser {
@@ -38,7 +38,7 @@
 	public ISourceContainer[] editSourceContainers(Shell shell, ISourceLookupDirector director, ISourceContainer[] containers) {
 		ClasspathVariableSourceContainer container = (ClasspathVariableSourceContainer) containers[0];
 		IPath path = BuildPathDialogAccess.configureVariableEntry(shell, container.getPath(), new IPath[]{container.getPath()});
-		if (path != null) {			
+		if (path != null) {
 			containers = new ISourceContainer[1];
 			containers[0] = new ClasspathVariableSourceContainer(path);
 			return containers;
@@ -51,7 +51,7 @@
 	@Override
 	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
 		IPath[] paths = BuildPathDialogAccess.chooseVariableEntries(shell, new IPath[0]);
-		if (paths != null) {			
+		if (paths != null) {
 			ISourceContainer[] containers = new ISourceContainer[paths.length];
 			for (int i = 0; i < containers.length; i++) {
 				containers[i] = new ClasspathVariableSourceContainer(paths[i]);
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaDebugShowInAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaDebugShowInAdapterFactory.java
index a7ccf91..1f823ef 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaDebugShowInAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaDebugShowInAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaProjectSourceContainerBrowser.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaProjectSourceContainerBrowser.java
index ac96631..ffd007e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaProjectSourceContainerBrowser.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/JavaProjectSourceContainerBrowser.java
@@ -43,19 +43,19 @@
 
 /**
  * Browser to select Java projects to add to the source lookup path.
- * 
+ *
  * @since 3.0
  */
 public class JavaProjectSourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
+
 	class ContentProvider implements IStructuredContentProvider {
-		
+
 		private List<IJavaProject> fProjects;
-		
+
 		public ContentProvider(List<IJavaProject> projects) {
 			fProjects = projects;
 		}
-		
+
 		/**
 		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
 		 */
@@ -78,7 +78,7 @@
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 		}
 
-	}		
+	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -86,13 +86,13 @@
 	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
 		List<IJavaProject> projects = getPossibleAdditions(director);
 		ProjectSelectionDialog dialog= new ProjectSelectionDialog(shell, projects);
-		dialog.setTitle(SourceLookupMessages.JavaProjectSourceContainerBrowser_1); 
+		dialog.setTitle(SourceLookupMessages.JavaProjectSourceContainerBrowser_1);
 		MultiStatus status = new MultiStatus(JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Failed to add project(s)", null);  //$NON-NLS-1$
-				
-		List<ISourceContainer> sourceContainers = new ArrayList<ISourceContainer>();
-		if (dialog.open() == Window.OK) {			
+
+		List<ISourceContainer> sourceContainers = new ArrayList<>();
+		if (dialog.open() == Window.OK) {
 			Object[] selections = dialog.getResult();
-			List<IJavaProject> additions = new ArrayList<IJavaProject>(selections.length);
+			List<IJavaProject> additions = new ArrayList<>(selections.length);
 			try {
 				for (int i = 0; i < selections.length; i++) {
 					IJavaProject jp = (IJavaProject)selections[i];
@@ -105,7 +105,7 @@
 			} catch (JavaModelException e) {
 				status.add(e.getStatus());
 			}
-			
+
 			Iterator<IJavaProject> iter = additions.iterator();
 			while (iter.hasNext()) {
 				IJavaProject jp = iter.next();
@@ -118,8 +118,8 @@
 					}
 				}
 			}
-		}	
-		
+		}
+
 		if (!status.isOK()) {
 			JDIDebugUIPlugin.statusDialog(status);
 		}
@@ -128,7 +128,7 @@
 
 	/**
 	 * Returns the possible projects that can be added
-	 * 
+	 *
 	 * @param director the source lookup director currently being edited
 	 * @return the listing of {@link IJavaProject}s to add
 	 */
@@ -141,11 +141,11 @@
 			JDIDebugUIPlugin.log(e);
 			projects= new IJavaProject[0];
 		}
-		List<IJavaProject> remaining = new ArrayList<IJavaProject>();
+		List<IJavaProject> remaining = new ArrayList<>();
 		for (int i = 0; i < projects.length; i++) {
 			remaining.add(projects[i]);
 		}
-		List<IJavaProject> alreadySelected = new ArrayList<IJavaProject>();
+		List<IJavaProject> alreadySelected = new ArrayList<>();
 		ISourceContainer[] containers = director.getSourceContainers();
 		for (int i = 0; i < containers.length; i++) {
 			ISourceContainer container = containers[i];
@@ -154,13 +154,13 @@
 			}
 		}
 		remaining.removeAll(alreadySelected);
-		return remaining;		
+		return remaining;
 	}
 
 	/**
 	 * Adds all projects required by <code>proj</code> to the list
 	 * <code>res</code>
-	 * 
+	 *
 	 * @param proj the project for which to compute required
 	 *  projects
 	 * @param res the list to add all required projects too
@@ -169,9 +169,9 @@
 	protected void collectRequiredProjects(IJavaProject proj, List<IJavaProject> res) throws JavaModelException {
 		if (!res.contains(proj)) {
 			res.add(proj);
-			
+
 			IJavaModel model= proj.getJavaModel();
-			
+
 			IClasspathEntry[] entries= proj.getRawClasspath();
 			for (int i= 0; i < entries.length; i++) {
 				IClasspathEntry curr= entries[i];
@@ -183,12 +183,12 @@
 				}
 			}
 		}
-	}		
-	
+	}
+
 	/**
 	 * Adds all exported entries defined by <code>proj</code> to the list
 	 * <code>list</code>.
-	 * 
+	 *
 	 * @param proj the project to inspect
 	 * @param list the listing of containers
 	 * @throws CoreException if an exception occurs
@@ -233,5 +233,5 @@
 				}
 			}
 		}
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapter.java
index 1f44485..dd77178 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 
 /**
  * Class provides the Duplicate JavaElement labels and Images for SourceElementLabelProvider Objects while debugging
- * 
+ *
  * @since 3.7
  */
 @SuppressWarnings("restriction")
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapterFactory.java
index 03a14c1..5d8e3ab 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceElementLabelProviderAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 
 /**
  * Adapter factory for duplicate source lookup elements.
- * 
+ *
  * @since 3.7
  */
 public class SourceElementLabelProviderAdapterFactory implements IAdapterFactory {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceLookupMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceLookupMessages.java
index 65ba168..1b7ef70 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceLookupMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/SourceLookupMessages.java
@@ -3,8 +3,8 @@
  * program and the accompanying materials are made available under the terms of
  * the Eclipse Public License v1.0 which accompanies this distribution, and is
  * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
+ *
+ * Contributors:
  * IBM - Initial API and implementation
  **********************************************************************/
 package org.eclipse.jdt.internal.debug.ui.sourcelookup;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInSourceAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInSourceAdapter.java
index e090149..860157e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInSourceAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInSourceAdapter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,11 +24,11 @@
  *
  */
 public class StackFrameShowInSourceAdapter implements IShowInSource {
-	
+
 	class LazyShowInContext extends ShowInContext {
 
 		boolean resolved = false;
-		
+
 		/**
 		 * Constructs a 'show in context' that resolves its selection lazily
 		 * since it requires a source lookup.
@@ -36,7 +36,7 @@
 		public LazyShowInContext() {
 			super(null, null);
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.ui.part.ShowInContext#getSelection()
 		 */
@@ -54,22 +54,22 @@
 			}
 			return super.getSelection();
 		}
-		
+
 	}
-	
+
 	private IJavaStackFrame fFrame;
-	
+
 	private ShowInContext fLazyContext = null;
 
 	/**
 	 * Constructs a new adapter on the given frame.
-	 * 
+	 *
 	 * @param frame
 	 */
 	public StackFrameShowInSourceAdapter(IJavaStackFrame frame) {
 		fFrame = frame;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.part.IShowInSource#getShowInContext()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInTargetListAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInTargetListAdapter.java
index 2f2cdf0..121caf4 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInTargetListAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/StackFrameShowInTargetListAdapter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapter.java
index eca73d8..93ada17 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,7 +30,7 @@
 /**
  * Workbench adapter for Java source containers and source container
  * types.
- * 
+ *
  * @since 3.0
  */
 public class WorkbenchAdapter implements IWorkbenchAdapter {
@@ -55,7 +55,7 @@
 			JavaProjectSourceContainer container = (JavaProjectSourceContainer) object;
 			IJavaProject javaProject = container.getJavaProject();
 			return getImageDescriptor(javaProject);
-		}		
+		}
 		if (object instanceof ClasspathVariableSourceContainer) {
 			return DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_OBJS_ENV_VAR);
 		}
@@ -64,11 +64,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns an image descriptor for a java element, or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param element java element
 	 * @return an image descriptor for a java element, or <code>null</code>
 	 * if none
@@ -77,10 +77,10 @@
 		IWorkbenchAdapter adapter = element.getAdapter(IWorkbenchAdapter.class);
 		if (adapter != null) {
 			return adapter.getImageDescriptor(element);
-		}	
+		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapterFactory.java
index 87873d8..290588f 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/sourcelookup/WorkbenchAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java
index 805c4bd..3a06ee0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaDebugTargetProxy.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -37,14 +37,14 @@
 public class JavaDebugTargetProxy extends DebugTargetProxy {
 
 	private JavaThreadEventHandler fThreadEventHandler;
-	
+
 	/**
 	 * Whether this proxy is for a scrapbook.
 	 */
 	private boolean fIsScrapbook = false;
-	
+
 	private IDebugTarget fDebugTarget = null;
-	
+
 	/**
 	 * @param target the backing target
 	 */
@@ -77,7 +77,7 @@
 			return;
 		}
 		final Viewer finalViewer = viewer;
-		// Delay the auto-select-expand job to allow for transient suspend states to resolve. 
+		// Delay the auto-select-expand job to allow for transient suspend states to resolve.
 		// See bug 225377
 		Job job = new Job("Initialize Java Debug Session") { //$NON-NLS-1$
 			@Override
@@ -99,7 +99,7 @@
 	private void doInstalled(Viewer viewer) {
         // select any thread that is already suspended after installation
         IDebugTarget target = fDebugTarget;
-        
+
         if (target != null) {
             ModelDelta delta = getNextSuspendedThreadDelta(null, false);
             if (delta == null) {
@@ -114,17 +114,17 @@
                 } catch (DebugException e) {
                     // In case of exception do not fire delta
                     return;
-                }                     
+                }
             }
             // expand the target if no suspended thread
             fireModelChanged(delta);
-        }	    
-	}	
-	
+        }
+	}
+
 	private int getTargetChildCount(IDebugTarget target) throws DebugException{
 	    if (target instanceof IJavaDebugTarget) {
 	        IJavaDebugTarget javaTarget = (IJavaDebugTarget)target;
-	    
+
             if (JavaElementContentProvider.isDisplayThreadGroups()) {
                 if (javaTarget.isDisconnected() || javaTarget.isTerminated()) {
                     return 0;
@@ -135,5 +135,5 @@
 	    }
 	    return 0;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadEventHandler.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadEventHandler.java
index b487ca2..6755f87 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadEventHandler.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadEventHandler.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -51,13 +51,13 @@
  *
  */
 public class JavaThreadEventHandler extends ThreadEventHandler implements IPropertyChangeListener, TreeListener {
-	
+
 	private boolean fDisplayMonitors;
 	private Tree fTree;
 
 	/**
 	 * Constructs and event handler for a Java thread.
-	 * 
+	 *
 	 * @param proxy
 	 */
 	public JavaThreadEventHandler(AbstractModelProxy proxy) {
@@ -66,7 +66,7 @@
 		preferenceStore.addPropertyChangeListener(this);
 		fDisplayMonitors= preferenceStore.getBoolean(IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO);
 	}
-	
+
 	protected void init(Viewer viewer) {
 		Control control = viewer.getControl();
 		if (control instanceof Tree) {
@@ -79,7 +79,7 @@
 			});
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#dispose()
 	 */
@@ -101,7 +101,7 @@
 			Object[] launchChildren = launch.getChildren();
 			delta = delta.addNode(launch, indexOf(launches, launch), IModelDelta.NO_CHANGE, launchChildren.length);
 			IJavaDebugTarget debugTarget = (IJavaDebugTarget) thread.getDebugTarget();
-			List<IJavaThreadGroup> groups = new ArrayList<IJavaThreadGroup>();
+			List<IJavaThreadGroup> groups = new ArrayList<>();
 			try{
 				delta = delta.addNode(debugTarget, indexOf(launchChildren, debugTarget), IModelDelta.NO_CHANGE, debugTarget.getRootThreadGroups().length);
 				IJavaThread javaThread = (IJavaThread) thread;
@@ -133,7 +133,7 @@
 		}
 		return super.addPathToThread(delta, thread);
 	}
-	
+
 	@Override
 	public void propertyChange(PropertyChangeEvent event) {
 		if (event.getProperty().equals(IJavaDebugUIConstants.PREF_SHOW_MONITOR_THREAD_INFO)) {
@@ -143,8 +143,8 @@
 
 	protected boolean isDisplayMonitors() {
 	    return fDisplayMonitors;
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#indexOf(org.eclipse.debug.core.model.IStackFrame)
 	 */
@@ -168,10 +168,10 @@
 		}
 		return super.indexOf(frame);
 	}
-	
+
 	/**
 	 * Returns the number of children the given thread has in the view.
-	 * 
+	 *
 	 * @param thread thread
 	 * @return number of children
 	 */
@@ -195,8 +195,8 @@
 		} catch (DebugException e) {
 		}
 		return -1;
-	}	
-	
+	}
+
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#indexOf(org.eclipse.debug.core.model.IThread)
@@ -274,7 +274,7 @@
 				queueSuspendedThread((IJavaThread)data);
 			}
 		}
-	}	
+	}
 
 	/**
 	 * Do not update for quiet resume/suspend
@@ -286,12 +286,12 @@
 		}
 		super.handleOther(event);
 	}
-	
+
 	/**
 	 * Returns whether the given thread is missing its required thread group in order
-	 * to build a proper delta. See bug 274552. Returns <code>false</code> when not 
+	 * to build a proper delta. See bug 274552. Returns <code>false</code> when not
 	 * displaying thread groups.
-	 * 
+	 *
 	 * @param event thread start/death event
 	 * @return <code>true</code> if the thread group is missing
 	 */
@@ -313,7 +313,7 @@
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#handleCreate(org.eclipse.debug.core.DebugEvent)
 	 */
@@ -325,7 +325,7 @@
 		}
 		super.handleCreate(event);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#handleTerminate(org.eclipse.debug.core.DebugEvent)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupContentProvider.java
index 2d76836..f927794 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupContentProvider.java
@@ -35,7 +35,7 @@
 				count += group.getThreadGroups().length;
 				count += group.getThreads().length;
 			}
-		} 
+		}
 		return count;
 	}
 
@@ -49,7 +49,7 @@
 		}
 		return EMPTY;
 	}
-	
+
 	protected Object[] getChildren(IJavaThreadGroup group) throws CoreException {
 		if (isAvailable(group)) {
 			IJavaThreadGroup[] threadGroups = group.getThreadGroups();
@@ -68,7 +68,7 @@
 		}
 		return EMPTY;
 	}
-	
+
 	protected boolean isAvailable(IJavaThreadGroup group) {
 		IDebugTarget debugTarget = group.getDebugTarget();
 		return !(debugTarget.isTerminated() || debugTarget.isDisconnected());
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupLabelProvider.java
index 49033f6..fa772d3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaThreadGroupLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
  * @since 3.3
  */
 public class JavaThreadGroupLabelProvider extends ElementLabelProvider {
-	
+
 	private static ImageDescriptor fgImage = JavaDebugImages.getImageDescriptor(JavaDebugImages.IMG_OBJS_THREAD_GROUP);
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/TargetAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/TargetAdapterFactory.java
index 15a0564..73b2c7d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/TargetAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/TargetAdapterFactory.java
@@ -17,11 +17,11 @@
 
 /**
  * Adapter factory for Java debug target.
- * 
+ *
  * @since 3.3
  */
 public class TargetAdapterFactory implements IAdapterFactory{
-	
+
 	private static IModelProxyFactory fgJavaModelProxyFactory = new JavaModelProxyFactory();
 	private static IElementContentProvider fgCPTarget = new JavaDebugTargetContentProvider();
 
@@ -43,7 +43,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupAdapterFactory.java
index b847729..86e1471 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupAdapterFactory.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,8 +19,8 @@
  * @since 3.3
  */
 public class ThreadGroupAdapterFactory implements IAdapterFactory{
-	
-	
+
+
 	private static IElementContentProvider fgCPThreadGroup = new JavaThreadGroupContentProvider();
 	private static IElementLabelProvider fgLPThreadGroup = new JavaThreadGroupLabelProvider();
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupMessages.java
index b0a9913..b2ac864 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/ThreadGroupMessages.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/ColumnPresentationAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/ColumnPresentationAdapterFactory.java
index c63166f..1503cd1 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/ColumnPresentationAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/ColumnPresentationAdapterFactory.java
@@ -18,11 +18,11 @@
 
 /**
  * Adapter factory.
- * 
+ *
  * @since 3.2
  */
 public class ColumnPresentationAdapterFactory implements IAdapterFactory {
-	
+
 	private static final IColumnPresentationFactory fgColumnPresentation = new JavaVariableColumnPresentationFactory();
 	private static final IElementEditor fgEEJavaVariable = new JavaVariableEditor();
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaContentProviderFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaContentProviderFilter.java
index bc9b81a..9613cad 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaContentProviderFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaContentProviderFilter.java
@@ -24,7 +24,7 @@
  * Provides static methods for filtering the content in Java views.  By filtering in the
  * content provider rather than in the model the UI does not get updated until after the
  * filtering is done.
- * 
+ *
  * @since 3.4
  * @see JavaVariableContentProvider
  * @see JavaExpressionContentProvider
@@ -45,7 +45,7 @@
 		boolean filterConstants = !includeConstants(context);
 
 		if (filterStatics || filterConstants) {
-			List<Object> keep = new ArrayList<Object>(variables.length);
+			List<Object> keep = new ArrayList<>(variables.length);
 			for (int i = 0; i < variables.length; i++) {
 				boolean filter = false;
 				if (variables[i] instanceof IJavaVariable){
@@ -71,7 +71,7 @@
 	 * Returns whether static variables should be displayed in the view
 	 * identified by the given presentation context.  Checks for a preference
 	 * that is specific to the presentation context.
-	 * 
+	 *
 	 * @param context the context of the view being displayed
 	 * @return whether static variable should be displayed
 	 */
@@ -85,13 +85,13 @@
 	 * Returns whether constants should be displayed in the view
 	 * identified by the given presentation context.  Checks for a preference
 	 * that is specific to the presentation context.
-	 * 
+	 *
 	 * @param context the context of the view being displayed
 	 * @return whether constants should be displayed
 	 */
 	private static boolean includeConstants(IPresentationContext context){
 		IPreferenceStore store = JDIDebugUIPlugin.getDefault().getPreferenceStore();
 		String constants = context.getId() + "." + IJDIPreferencesConstants.PREF_SHOW_CONSTANTS; //$NON-NLS-1$
-		return store.getBoolean(constants); 
+		return store.getBoolean(constants);
 	}
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaDebugElementAdapterFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaDebugElementAdapterFactory.java
index 2b88a4c..549397c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaDebugElementAdapterFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaDebugElementAdapterFactory.java
@@ -24,7 +24,7 @@
 
 /**
  * Provides provider adapters for IJavaVariables and IJavaStackFrames
- * 
+ *
  * @see IJavaVariable
  * @see JavaVariableLabelProvider
  * @see JavaVariableContentProvider
@@ -35,7 +35,7 @@
  * @since 3.3
  */
 public class JavaDebugElementAdapterFactory implements IAdapterFactory {
-	
+
 	private static final IElementLabelProvider fgLPVariable = new JavaVariableLabelProvider();
 	private static final IElementContentProvider fgCPVariable = new JavaVariableContentProvider();
 	private static final IElementLabelProvider fgLPExpression = new ExpressionLabelProvider();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaExpressionContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaExpressionContentProvider.java
index 5ba1f3d..d681112 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaExpressionContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaExpressionContentProvider.java
@@ -26,10 +26,10 @@
 
 /**
  * Provides content for the result of an inspect operation that is displayed in the expressions view.
- * 
+ *
  * @since 3.3
  * @see JavaVariableContentProvider
- * @see JavaInspectExpression 
+ * @see JavaInspectExpression
  */
 public class JavaExpressionContentProvider extends ExpressionContentProvider{
 
@@ -50,7 +50,7 @@
         }
         return getElements(variables, index, length);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.VariableContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
 	 */
@@ -65,7 +65,7 @@
 		}
 		return count;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.ExpressionContentProvider#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
 	 */
@@ -76,7 +76,7 @@
 		}
 		return super.hasChildren(element, context, monitor);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.ExpressionContentProvider#getAllChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameContentProvider.java
index b76b47b..26c394d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameContentProvider.java
@@ -22,9 +22,9 @@
 public class JavaStackFrameContentProvider extends StackFrameContentProvider {
 
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Cancels updates when thread is resumed.
-	 * 
+	 *
 	 * @see org.eclipse.debug.internal.ui.model.elements.StackFrameContentProvider#getAllChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	@Override
@@ -40,6 +40,6 @@
 			throw e;
 		}
 	}
-	
+
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameLabelProvider.java
index 2592e56..b3377ca 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameLabelProvider.java
@@ -20,7 +20,7 @@
 /**
  * Provides labels for Java stack frames with a specific scheduling rule as
  * not to conflict with implicit evaluations in the variables view.
- * 
+ *
  * @since 3.4
  */
 public class JavaStackFrameLabelProvider extends DebugElementLabelProvider {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameMementoProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameMementoProvider.java
index 0ed6404..504623e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameMementoProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaStackFrameMementoProvider.java
@@ -19,7 +19,7 @@
 /**
  * Creates mementos for Java stack frames. Uses qualified names and signature rather than just
  * simple method name used by the default model.
- * 
+ *
  * @since 3.4
  */
 public class JavaStackFrameMementoProvider extends DebugElementMementoProvider implements IElementMementoProvider {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableCellModifier.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableCellModifier.java
index b369943..33b57c8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableCellModifier.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableCellModifier.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,13 +18,13 @@
 
 /**
  * @since 3.2
- * 
+ *
  */
 public class JavaVariableCellModifier extends DefaultVariableCellModifier {
-	
+
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier#canModify(java.lang.Object,
      *      java.lang.String)
      */
@@ -53,7 +53,7 @@
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier#getValue(java.lang.Object,
      *      java.lang.String)
      */
@@ -108,7 +108,7 @@
 
     /**
      * Returns whether the given variable is a boolean.
-     * 
+     *
      * @param variable
      * @return
      */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentation.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentation.java
index d44754e..7ec8843 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentation.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentation.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,17 +26,17 @@
 	 * Instance ID column identifier
 	 */
 	public final static String COLUMN_INSTANCE_ID = JAVA_VARIABLE_COLUMN_PRESENTATION + ".COL_INSTANCE_ID"; //$NON-NLS-1$
-	
+
 	/**
 	 * Instance count column identifier
 	 */
 	public final static String COLUMN_INSTANCE_COUNT = JAVA_VARIABLE_COLUMN_PRESENTATION + ".COL_INSTANCE_COUNT"; //$NON-NLS-1$
-	
+
 	/**
 	 * Column ids
 	 */
 	private static String[] fgAllColumns = null;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation#getAvailableColumns()
 	 */
@@ -51,7 +51,7 @@
 		}
 		return fgAllColumns;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation#getHeader(java.lang.String)
 	 */
@@ -65,7 +65,7 @@
 		}
 		return super.getHeader(id);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation#getId()
 	 */
@@ -73,6 +73,6 @@
 	public String getId() {
 		return JAVA_VARIABLE_COLUMN_PRESENTATION;
 	}
-	
-	
+
+
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentationFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentationFactory.java
index c77a81f..e1b0d4d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentationFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableColumnPresentationFactory.java
@@ -44,7 +44,7 @@
 		}
 		return null;
 	}
-	
+
 	private boolean isApplicable(IPresentationContext context, Object element) {
 		IJavaStackFrame frame = null;
 		if (IDebugUIConstants.ID_VARIABLE_VIEW.equals(context.getId())) {
@@ -53,7 +53,7 @@
 				frame = adaptable.getAdapter(IJavaStackFrame.class);
 			}
 		}
-		return frame != null;		
+		return frame != null;
 	}
 
 }
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableContentProvider.java
index 63b1918..5da8e29 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableContentProvider.java
@@ -28,7 +28,7 @@
 
 /**
  * Determines the child content of an IJavaVariable.
- * 
+ *
  * @since 3.3
  * @see VariableContentProvider
  * @see IJavaVariable
@@ -60,7 +60,7 @@
 			throw e;
 		}
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.VariableContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
 	 */
@@ -80,7 +80,7 @@
 			throw e;
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.VariableContentProvider#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
 	 */
@@ -97,12 +97,12 @@
 				return false;
 			}
 			throw e;
-		}			
+		}
 	}
-	
+
 	/**
 	 * Determines if an all references variable should be added as a child to the passed object.
-	 * 
+	 *
 	 * @param parent element to display references as a child for
 	 * @return whether to display references as a child of the given parent
 	 * @throws DebugException
@@ -132,7 +132,7 @@
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.VariableContentProvider#getAllChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableEditor.java
index 17914d3..81e0b11 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableEditor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,12 +21,12 @@
 
 /**
  * Editor for Java variable columns. Restricts edits to primitives and strings.
- * 
+ *
  * @since 3.2
  *
  */
 public class JavaVariableEditor extends VariableEditor {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor#getCellModifier(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableLabelProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableLabelProvider.java
index 4216025..e2e7a64 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableLabelProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/JavaVariableLabelProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -49,23 +49,23 @@
  * @since 3.2
  */
 public class JavaVariableLabelProvider extends VariableLabelProvider implements IPreferenceChangeListener {
-	
+
 	public static JDIModelPresentation fLabelProvider = new JDIModelPresentation();
 	/**
 	 * Map of view id to qualified name setting
 	 */
-	private Map<String, Boolean> fQualifiedNameSettings = new HashMap<String, Boolean>();
+	private Map<String, Boolean> fQualifiedNameSettings = new HashMap<>();
 	private boolean fQualifiedNames = false;
-	
+
 	/**
 	 * Whether to use a thread rule for a label update job (serialize on thread)
 	 */
 	private int fSerializeMode = SERIALIZE_NONE;
-	
+
 	private static final int SERIALIZE_ALL = 0; // no toString()'s in line, so serialize labels
 	private static final int SERIALIZE_NONE = 1; // all toString()'s in line, so don't serialize labels (evaluations will be serialized)
 	private static final int SERIALIZE_SOME = 2; // some - only serialize those that don't have formatters (ones with formatters will be serialized by evaluation)
-	
+
 	public JavaVariableLabelProvider() {
 		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JDIDebugUIPlugin.getUniqueIdentifier());
 		if(prefs != null) {
@@ -73,7 +73,7 @@
 			determineSerializationMode(prefs.get(IJDIPreferencesConstants.PREF_SHOW_DETAILS, IJDIPreferencesConstants.DETAIL_PANE));
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.elements.adapters.VariableLabelAdapter#getValueText(org.eclipse.debug.core.model.IVariable, org.eclipse.debug.core.model.IValue)
 	 */
@@ -112,7 +112,7 @@
 				return fLabelProvider.removeQualifierFromGenericName(typeName);
 			}
 		} catch (DebugException e) {}
-		return typeName;		
+		return typeName;
 	}
 
 	/**
@@ -182,10 +182,10 @@
 		fLabelProvider.setAttribute(JDIModelPresentation.DISPLAY_QUALIFIED_NAMES, showQ);
 		super.retrieveLabel(update);
 	}
-	
+
 	/**
 	 * Sets the serialization mode for label jobs based on the current preference setting.
-	 * 
+	 *
 	 * @param value preference value for PREF_SHOW_DETAILS
 	 */
 	private void determineSerializationMode(String value) {
@@ -212,7 +212,7 @@
 		}
 		return super.getLabel(elementPath, context, columnId);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.ui.model.elements.ElementLabelProvider#getRule(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate)
 	 */
@@ -234,7 +234,7 @@
 					if (value instanceof IJavaValue) {
 						if (!fLabelProvider.isShowLabelDetails((IJavaValue)value)) {
 							input = update.getViewerInput();
-							frame = (IJavaStackFrame) DebugPlugin.getAdapter(input, IJavaStackFrame.class);			
+							frame = (IJavaStackFrame) DebugPlugin.getAdapter(input, IJavaStackFrame.class);
 						}
 					}
 				} catch (DebugException e) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableMessages.java
index 1e75bdc..ede4a73 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableMessages.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableOptionsAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableOptionsAction.java
index bb722ec..14f479e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableOptionsAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/variables/VariableOptionsAction.java
@@ -20,7 +20,7 @@
  * Action which opens preference settings for Java variables.
  */
 public class VariableOptionsAction implements IViewActionDelegate {
-	
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
      */
diff --git a/org.eclipse.jdt.debug/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jdt.debug/.settings/org.eclipse.jdt.ui.prefs
index dd11fc7..c3c6981 100644
--- a/org.eclipse.jdt.debug/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.jdt.debug/.settings/org.eclipse.jdt.ui.prefs
@@ -52,7 +52,7 @@
 cleanup_profile=_Platform Debug Cleanups
 cleanup_settings_version=2
 eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 formatter_profile=_Platform Debug Formatting
 formatter_settings_version=12
 sp_cleanup.add_default_serial_version_id=true
@@ -89,8 +89,8 @@
 sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/EvaluationManager.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/EvaluationManager.java
index 47da156..2daaa32 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/EvaluationManager.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/EvaluationManager.java
@@ -20,7 +20,7 @@
 /**
  * The evaluation manager provides factory methods for creating evaluation
  * engines.
- * 
+ *
  * @see org.eclipse.jdt.debug.eval.IEvaluationEngine
  * @see org.eclipse.jdt.debug.eval.IClassFileEvaluationEngine
  * @see org.eclipse.jdt.debug.eval.IAstEvaluationEngine
@@ -41,7 +41,7 @@
 	/**
 	 * Creates and returns a new evaluation engine that performs evaluations for
 	 * local Java applications by deploying class files.
-	 * 
+	 *
 	 * @param project
 	 *            the Java project in which expressions are to be compiled
 	 * @param target
@@ -61,7 +61,7 @@
 	 * compiling expressions into abstract syntax trees (ASTs), and interpreting
 	 * the AST over a JDI connection. This type of evaluation engine is capable
 	 * of performing remote evaluations.
-	 * 
+	 *
 	 * @param project
 	 *            the Java project in which expressions are to be compiled
 	 * @param target
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IAstEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IAstEvaluationEngine.java
index ee8a8db..cbbe5c2 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IAstEvaluationEngine.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IAstEvaluationEngine.java
@@ -20,7 +20,7 @@
  * An evaluation engine that performs evaluations by interpreting abstract
  * syntax trees. An AST evaluation engine is capable of creating compiled
  * expressions that can be evaluated multiple times in a given runtime context.
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -36,7 +36,7 @@
 	 * evaluation with the given evaluation detail (@see
 	 * IJavaThread#runEvaluation(IEvaluationRunnable, IProgressMonitor, int)).
 	 * Compilation and runtime errors are reported in the evaluation result.
-	 * 
+	 *
 	 * @param expression
 	 *            expression to evaluate
 	 * @param frame
@@ -80,7 +80,7 @@
 	 * the given evaluation detail (@see
 	 * IJavaThread#runEvaluation(IEvaluationRunnable, IProgressMonitor, int)).
 	 * Compilation and runtime errors are reported in the evaluation result.
-	 * 
+	 *
 	 * @param expression
 	 *            the expression to evaluate
 	 * @param object
@@ -122,7 +122,7 @@
 	 * in the context of the specified stack frame. The generated expression can
 	 * be stored and evaluated later in a valid runtime context. Compilation
 	 * errors are reported in the returned compiled expression.
-	 * 
+	 *
 	 * @param expression
 	 *            expression to compile
 	 * @param frame
@@ -147,7 +147,7 @@
 	 * in the context of the specified object. The generated expression can be
 	 * stored and evaluated later in a valid runtime context. Compilation errors
 	 * are reported in the returned compiled expression.
-	 * 
+	 *
 	 * @param expression
 	 *            expression to compile
 	 * @param object
@@ -172,7 +172,7 @@
 	 * in the context of the specified type. The generated expression can be
 	 * stored and evaluated later in a valid runtime context. Compilation errors
 	 * are reported in the returned compiled expression.
-	 * 
+	 *
 	 * @param expression
 	 *            expression to compile
 	 * @param type
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IClassFileEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IClassFileEvaluationEngine.java
index c484404..50f2c1a 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IClassFileEvaluationEngine.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IClassFileEvaluationEngine.java
@@ -16,7 +16,7 @@
 /**
  * An evaluation engine that performs evaluations by deploying and executing
  * class files locally.
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -28,7 +28,7 @@
 	 * corresponds to a fully qualified type name, or to an on-demand package
 	 * name as defined by ImportDeclaration (JLS2 7.5). For example,
 	 * <code>"java.util.Hashtable"</code> or <code>"java.util.*"</code>.
-	 * 
+	 *
 	 * @return the list of import names
 	 */
 	public String[] getImports();
@@ -39,7 +39,7 @@
 	 * a fully qualified type name, or to an on-demand package name as defined
 	 * by ImportDeclaration (JLS2 7.5). For example,
 	 * <code>"java.util.Hashtable"</code> or <code>"java.util.*"</code>.
-	 * 
+	 *
 	 * @param imports
 	 *            the list of import names
 	 */
@@ -55,7 +55,7 @@
 	 * evaluation completes, the thread will be suspened at this original
 	 * location. Compilation and runtime errors are reported in the evaluation
 	 * result.
-	 * 
+	 *
 	 * @param snippet
 	 *            code snippet to evaluate
 	 * @param thread
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/ICompiledExpression.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/ICompiledExpression.java
index 64e7986..3e5fedd 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/ICompiledExpression.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/ICompiledExpression.java
@@ -15,7 +15,7 @@
 /**
  * A compiled expression can be compiled once and evaluated multiple times in a
  * runtime context.
- * 
+ *
  * @see org.eclipse.jdt.debug.eval.IAstEvaluationEngine
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -27,7 +27,7 @@
 	/**
 	 * Returns the source snippet from which this compiled expression was
 	 * created.
-	 * 
+	 *
 	 * @return the source snippet from which this compiled expression was
 	 *         created
 	 */
@@ -35,7 +35,7 @@
 
 	/**
 	 * Returns whether this compiled expression has any compilation errors.
-	 * 
+	 *
 	 * @return whether this compiled expression has any compilation errors
 	 */
 	public boolean hasErrors();
@@ -43,7 +43,7 @@
 	/**
 	 * Returns any errors which occurred while creating this compiled
 	 * expression.
-	 * 
+	 *
 	 * @return any errors which occurred while creating this compiled expression
 	 * @deprecated use getErrorMessages()
 	 */
@@ -53,7 +53,7 @@
 	/**
 	 * Returns an array of problem messages. Each message describes a problem
 	 * that occurred while while creating this compiled expression.
-	 * 
+	 *
 	 * @return error messages, or an empty array if no errors occurred
 	 * @since 2.1
 	 */
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationEngine.java
index d52328d..d51ac14 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationEngine.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationEngine.java
@@ -21,7 +21,7 @@
  * An evaluation engine performs an evaluation of a code snippet or expression
  * in a specified thread of a debug target. An evaluation engine is associated
  * with a specific debug target and Java project on creation.
- * 
+ *
  * @see IEvaluationResult
  * @see IEvaluationListener
  * @since 2.0
@@ -43,7 +43,7 @@
 	 * (@see IJavaThread#runEvaluation(IEvaluationRunnable, IProgressMonitor,
 	 * int)). Compilation and runtime errors are reported in the evaluation
 	 * result.
-	 * 
+	 *
 	 * @param snippet
 	 *            code snippet to evaluate
 	 * @param frame
@@ -88,7 +88,7 @@
 	 * thread runs the evaluation with the given evaluation detail (@see
 	 * IJavaThread#runEvaluation(IEvaluationRunnable, IProgressMonitor, int)).
 	 * Compilation and runtime errors are reported in the evaluation result.
-	 * 
+	 *
 	 * @param snippet
 	 *            code snippet to evaluate
 	 * @param thisContext
@@ -126,14 +126,14 @@
 
 	/**
 	 * Returns the Java project in which expressions are compiled.
-	 * 
+	 *
 	 * @return Java project context
 	 */
 	public IJavaProject getJavaProject();
 
 	/**
 	 * Returns the debug target for which evaluations are executed.
-	 * 
+	 *
 	 * @return Java debug target
 	 */
 	public IJavaDebugTarget getDebugTarget();
@@ -143,7 +143,7 @@
 	 * cleanup any resources (such as threads) that it maintains. Clients should
 	 * call this method when they are finished performing evaluations with this
 	 * engine.
-	 * 
+	 *
 	 * This engine must not be used to perform evaluations after it has been
 	 * disposed.
 	 */
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationListener.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationListener.java
index 67e065f..4d53858 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationListener.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,7 +17,7 @@
  * <p>
  * Clients may implement this interface.
  * </p>
- * 
+ *
  * @see IEvaluationResult
  * @since 2.0
  */
@@ -27,7 +27,7 @@
 	/**
 	 * Notifies this listener that an evaluation has completed, with the given
 	 * result.
-	 * 
+	 *
 	 * @param result
 	 *            The result from the evaluation
 	 * @see IEvaluationResult
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationResult.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationResult.java
index bd7d575..65f4a1f 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationResult.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/debug/eval/IEvaluationResult.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * The result of an evaluation. An evaluation result may contain problems and/or
  * a result value.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -36,7 +36,7 @@
 	 * Since 3.5, this method can also return null if the evaluation was
 	 * terminated before it completed.
 	 * </p>
-	 * 
+	 *
 	 * @return the resulting value, possibly <code>null</code>
 	 */
 	public IJavaValue getValue();
@@ -44,7 +44,7 @@
 	/**
 	 * Returns whether the evaluation had any problems or if an exception
 	 * occurred while performing the evaluation.
-	 * 
+	 *
 	 * @return whether there were any problems.
 	 * @see #getErrors()
 	 * @see #getException()
@@ -54,7 +54,7 @@
 	/**
 	 * Returns an array of problem messages. Each message describes a problem
 	 * that occurred while compiling the snippet.
-	 * 
+	 *
 	 * @return compilation error messages, or an empty array if no errors
 	 *         occurred
 	 * @deprecated use getErrorMessages()
@@ -65,7 +65,7 @@
 	/**
 	 * Returns an array of problem messages. Each message describes a problem
 	 * that occurred while compiling the snippet.
-	 * 
+	 *
 	 * @return compilation error messages, or an empty array if no errors
 	 *         occurred
 	 * @since 2.1
@@ -74,7 +74,7 @@
 
 	/**
 	 * Returns the snippet that was evaluated.
-	 * 
+	 *
 	 * @return The string code snippet.
 	 */
 	public String getSnippet();
@@ -85,7 +85,7 @@
 	 * debug exception or a debug exception that wrappers a JDI exception that
 	 * indicates a problem communicating with the target or with actually
 	 * performing some action in the target.
-	 * 
+	 *
 	 * @return The exception that occurred during the evaluation
 	 * @see com.sun.jdi.InvocationException
 	 * @see org.eclipse.debug.core.DebugException
@@ -94,21 +94,21 @@
 
 	/**
 	 * Returns the thread in which the evaluation was performed.
-	 * 
+	 *
 	 * @return the thread in which the evaluation was performed
 	 */
 	public IJavaThread getThread();
 
 	/**
 	 * Returns the evaluation engine used to evaluate the original snippet.
-	 * 
+	 *
 	 * @return the evaluation engine used to evaluate the original snippet
 	 */
 	public IEvaluationEngine getEvaluationEngine();
 
 	/**
 	 * Returns whether this evaluation was terminated before it completed.
-	 * 
+	 *
 	 * @return whether terminated.
 	 * @since 3.5
 	 */
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/EvaluationResult.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/EvaluationResult.java
index 42c06e2..7495e85 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/EvaluationResult.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/EvaluationResult.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 
 /**
  * The result of an evaluation.
- * 
+ *
  * @see org.eclipse.jdt.debug.eval.IEvaluationResult
  */
 public class EvaluationResult implements IEvaluationResult {
@@ -72,7 +72,7 @@
 		setEvaluationEngine(engine);
 		setThread(thread);
 		setSnippet(snippet);
-		fErrors = new ArrayList<String>();
+		fErrors = new ArrayList<>();
 	}
 
 	/**
@@ -85,7 +85,7 @@
 
 	/**
 	 * Sets the result of an evaluation, possibly <code>null</code>.
-	 * 
+	 *
 	 * @param value
 	 *            result of an evaluation, possibly <code>null</code>
 	 */
@@ -134,7 +134,7 @@
 
 	/**
 	 * Sets the code snippet that was evaluated.
-	 * 
+	 *
 	 * @param snippet
 	 *            the source code that was evaluated
 	 */
@@ -153,7 +153,7 @@
 	/**
 	 * Sets an exception that occurred while attempting the associated
 	 * evaluation.
-	 * 
+	 *
 	 * @param e
 	 *            exception
 	 */
@@ -171,7 +171,7 @@
 
 	/**
 	 * Sets the thread this result was generated from.
-	 * 
+	 *
 	 * @param thread
 	 *            thread in which the associated evaluation was executed
 	 */
@@ -189,7 +189,7 @@
 
 	/**
 	 * Sets the evaluation that created this result.
-	 * 
+	 *
 	 * @param engine
 	 *            the evaluation that created this result
 	 */
@@ -206,7 +206,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.eval.IEvaluationResult#isTerminated()
 	 */
 	@Override
@@ -216,7 +216,7 @@
 
 	/**
 	 * Sets whether terminated.
-	 * 
+	 *
 	 * @param terminated
 	 *            whether terminated
 	 */
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/LocalEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/LocalEvaluationEngine.java
index 1aaee46..6f66a2f 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/LocalEvaluationEngine.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/LocalEvaluationEngine.java
@@ -121,7 +121,7 @@
 	/**
 	 * Array of modifier constants for visible local variables in the current
 	 * evaluation.
-	 * 
+	 *
 	 * XXX: constants should be 'default' or 'final'. Where are these constants
 	 * defined.
 	 */
@@ -178,7 +178,7 @@
 	 * specified project. Class files required for the evaluation will be
 	 * deployed to the specified directory (which must be on the class path of
 	 * the VM in order for evaluation to work).
-	 * 
+	 *
 	 * @param project
 	 *            context in which to compile snippets
 	 * @param vm
@@ -273,7 +273,7 @@
 	 * Initializes the value of instance variables in the 'code snippet object'
 	 * that are used as place-holders for locals and 'this' in the current stack
 	 * frame.
-	 * 
+	 *
 	 * @param object
 	 *            instance of code snippet class that will be run
 	 * @exception DebugException
@@ -322,7 +322,7 @@
 	 * Restores the value local variables from the instance variables in the
 	 * 'code snippet object' that are used as place-holders for locals in the
 	 * current stack frame.
-	 * 
+	 *
 	 * @param object
 	 *            instance of code snippet class that was run
 	 * @exception DebugException
@@ -374,7 +374,7 @@
 
 	/**
 	 * Sets the debug target in which snippets are executed.
-	 * 
+	 *
 	 * @param debugTarget
 	 *            the debug target in which snippets are executed
 	 */
@@ -392,7 +392,7 @@
 
 	/**
 	 * Sets the Java project in which snippets are compiled.
-	 * 
+	 *
 	 * @param javaProject
 	 *            the Java project in which snippets are compiled
 	 */
@@ -402,7 +402,7 @@
 
 	/**
 	 * Returns the directory in which snippet class files are deployed.
-	 * 
+	 *
 	 * @return the directory in which snippet class files are deployed.
 	 */
 	public File getOutputDirectory() {
@@ -411,7 +411,7 @@
 
 	/**
 	 * Sets the directory in which snippet class files are deployed.
-	 * 
+	 *
 	 * @param outputDirectory
 	 *            location to deploy snippet class files
 	 */
@@ -492,8 +492,8 @@
 			// set up local variables and 'this' context for evaluation
 			IJavaVariable[] locals = frame.getLocalVariables();
 
-			List<String> typeNames = new ArrayList<String>(locals.length);
-			List<String> varNames = new ArrayList<String>(locals.length);
+			List<String> typeNames = new ArrayList<>(locals.length);
+			List<String> varNames = new ArrayList<>(locals.length);
 
 			for (IJavaVariable var : locals) {
 				String typeName = getTranslatedTypeName(var
@@ -560,7 +560,7 @@
 
 	/**
 	 * Verifies the receiving type was resolved and is not an inner type.
-	 * 
+	 *
 	 * @param receivingType
 	 * @throws DebugException
 	 */
@@ -657,7 +657,7 @@
 
 	/**
 	 * Throws an exception if this engine has already been disposed.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this engine has been disposed
 	 */
@@ -675,7 +675,7 @@
 
 	/**
 	 * Throws an exception if this engine is already in an evaluation.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this engine is currently performing an evaluation
 	 */
@@ -692,7 +692,7 @@
 	/**
 	 * Throws an exception if this engine's current evaluation thread is not
 	 * suspended.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this engine's current evaluation thread is not
 	 *                suspended
@@ -711,7 +711,7 @@
 
 	/**
 	 * Deletes deployed class files, and clears state.
-	 * 
+	 *
 	 * @see IEvaluationEngine#dispose()
 	 */
 	@Override
@@ -782,7 +782,7 @@
 
 	/**
 	 * Returns the listener to notify when the current evaluation is complete.
-	 * 
+	 *
 	 * @return the listener to notify when the current evaluation is complete
 	 */
 	protected IEvaluationListener getListener() {
@@ -791,7 +791,7 @@
 
 	/**
 	 * Sets the listener to notify when the current evaluation is complete.
-	 * 
+	 *
 	 * @param listener
 	 *            the listener to notify when the current evaluation is complete
 	 */
@@ -802,7 +802,7 @@
 	/**
 	 * Returns the stack frame context for the current evaluation, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @return the stack frame context for the current evaluation, or
 	 *         <code>null</code> if none
 	 */
@@ -812,7 +812,7 @@
 
 	/**
 	 * Sets the stack frame context for the current evaluation.
-	 * 
+	 *
 	 * @param stackFrame
 	 *            stack frame context or <code>null</code> if none
 	 */
@@ -822,7 +822,7 @@
 
 	/**
 	 * Returns the thread in which the current evaluation is to be executed.
-	 * 
+	 *
 	 * @return the thread in which the current evaluation is to be executed
 	 */
 	protected IJavaThread getThread() {
@@ -831,7 +831,7 @@
 
 	/**
 	 * Returns the code snippet being evaluated.
-	 * 
+	 *
 	 * @return the code snippet being evaluated.
 	 */
 	protected String getSnippet() {
@@ -840,7 +840,7 @@
 
 	/**
 	 * Returns the current evaluation result.
-	 * 
+	 *
 	 * @return the current evaluation result
 	 */
 	protected EvaluationResult getResult() {
@@ -849,7 +849,7 @@
 
 	/**
 	 * Sets the current evaluation result.
-	 * 
+	 *
 	 * @param result
 	 *            the current evaluation result
 	 */
@@ -861,7 +861,7 @@
 	 * Deploys the given class files to this engine's output location, and adds
 	 * the files to this engines list of temporary files to be deleted when
 	 * disposed.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this fails due to a lower level exception.
 	 */
@@ -907,13 +907,13 @@
 	/**
 	 * Adds the given file to this engine's collection of deployed snippet class
 	 * files, which are to be deleted when this engine is disposed.
-	 * 
+	 *
 	 * @param File
 	 *            snippet class file
 	 */
 	private void addSnippetFile(File file) {
 		if (fSnippetFiles == null) {
-			fSnippetFiles = new ArrayList<File>();
+			fSnippetFiles = new ArrayList<>();
 		}
 		fSnippetFiles.add(file);
 	}
@@ -921,13 +921,13 @@
 	/**
 	 * Adds the given file to this engine's collection of created directories,
 	 * which are to be deleted when this engine is disposed.
-	 * 
+	 *
 	 * @param file
 	 *            directory created for class file deployment
 	 */
 	private void addDirectory(File file) {
 		if (fDirectories == null) {
-			fDirectories = new ArrayList<File>();
+			fDirectories = new ArrayList<>();
 		}
 		fDirectories.add(file);
 	}
@@ -936,7 +936,7 @@
 	 * Returns an evaluation context for this evaluation engine. An evaluation
 	 * context is associated with a specific Java project. The evaluation context
 	 * is created lazily on the first access.
-	 * 
+	 *
 	 * @return evaluation context
 	 */
 	protected IEvaluationContext getEvaluationContext() {
@@ -948,7 +948,7 @@
 
 	/**
 	 * Sets the evaluation context for this evaluation engine.
-	 * 
+	 *
 	 * @param context
 	 *            evaluation context
 	 */
@@ -959,7 +959,7 @@
 	/**
 	 * Returns a collection of snippet class file deployed by this evaluation
 	 * engine, possibly empty.
-	 * 
+	 *
 	 * @return deployed class files
 	 */
 	protected List<File> getSnippetFiles() {
@@ -972,7 +972,7 @@
 	/**
 	 * Returns a collection of directories created by this evaluation engine,
 	 * possibly empty.
-	 * 
+	 *
 	 * @return directories created when deploying class files
 	 */
 	protected List<File> getDirectories() {
@@ -984,7 +984,7 @@
 
 	/**
 	 * Returns whether this evaluation engine has been disposed.
-	 * 
+	 *
 	 * @return whether this evaluation engine has been disposed
 	 */
 	protected boolean isDisposed() {
@@ -1049,7 +1049,7 @@
 	/**
 	 * Constructs and returns a new instance of the specified class on the
 	 * target VM.
-	 * 
+	 *
 	 * @param className
 	 *            fully qualified class name
 	 * @return a new instance on the target, as an <code>IJavaValue</code>
@@ -1112,7 +1112,7 @@
 	 * <code>java.lang.Integer</code>, to be interpreted as a
 	 * <code>java.lang.Integer</code>.
 	 * </p>
-	 * 
+	 *
 	 * @param resultType
 	 *            the class of the result
 	 * @param resultValue
@@ -1170,7 +1170,7 @@
 	/**
 	 * Returns the modifiers of the local variables visible in this evaluation,
 	 * possibly empty.
-	 * 
+	 *
 	 * @return array of modifiers
 	 */
 	private int[] getLocalVariableModifiers() {
@@ -1180,7 +1180,7 @@
 	/**
 	 * Sets the modifiers of the local variables visible in this evaluation,
 	 * possibly empty.
-	 * 
+	 *
 	 * @param localVariableModifiers
 	 *            array of modifiers
 	 */
@@ -1191,7 +1191,7 @@
 	/**
 	 * Returns the names of the local variables visible in this evaluation,
 	 * possibly empty.
-	 * 
+	 *
 	 * @param array
 	 *            of names
 	 */
@@ -1202,7 +1202,7 @@
 	/**
 	 * Sets the names of the local variables visible in this evaluation,
 	 * possibly empty.
-	 * 
+	 *
 	 * @param localVariableNames
 	 *            array of names
 	 */
@@ -1213,7 +1213,7 @@
 	/**
 	 * Returns the type names of the local variables visible in this evaluation,
 	 * possibly empty.
-	 * 
+	 *
 	 * @param array
 	 *            of type names
 	 */
@@ -1224,7 +1224,7 @@
 	/**
 	 * Sets the type names of the local variables visible in this evaluation,
 	 * possibly empty.
-	 * 
+	 *
 	 * @param localVariableTypeNames
 	 *            array of type names
 	 */
@@ -1236,7 +1236,7 @@
 	 * Sets the receiver context for the associated evaluation, possibly
 	 * <code>null</code> if the evaluation is in the context of a static method
 	 * or there is no object context.
-	 * 
+	 *
 	 * @param thisObject
 	 *            the receiver content of the associated evaluation, or
 	 *            <code>null</code>
@@ -1249,7 +1249,7 @@
 	 * Returns the receiver context for the associated evaluation, or
 	 * <code>null</code> if the evaluation is in the context of a static method
 	 * or there is no object context.
-	 * 
+	 *
 	 * @return the receiver context of the associated evaluation or
 	 *         <code>null</code>
 	 */
@@ -1261,7 +1261,7 @@
 	 * Returns a copy of the type name with '$' replaced by '.', or returns
 	 * <code>null</code> if the given type name refers to an anonymous inner
 	 * class.
-	 * 
+	 *
 	 * @param typeName
 	 *            a fully qualified type name
 	 * @return a copy of the type name with '$' replaced by '.', or returns
@@ -1290,7 +1290,7 @@
 	 * Returns an array of simple type names that are part of the given type's
 	 * qualified name. For example, if the given name is <code>x.y.A$B</code>,
 	 * an array with <code>["A", "B"]</code> is returned.
-	 * 
+	 *
 	 * @param typeName
 	 *            fully qualified type name
 	 * @return array of nested type names
@@ -1301,7 +1301,7 @@
 			typeName = typeName.substring(index + 1);
 		}
 		index = typeName.indexOf('$');
-		ArrayList<String> list = new ArrayList<String>(1);
+		ArrayList<String> list = new ArrayList<>(1);
 		while (index >= 0) {
 			list.add(typeName.substring(0, index));
 			typeName = typeName.substring(index + 1);
@@ -1330,7 +1330,7 @@
 	/**
 	 * Sets the name of the code snippet to instantiate to run the current
 	 * evaluation.
-	 * 
+	 *
 	 * @param name
 	 *            the name of the deployed code snippet to instantiate and run
 	 */
@@ -1341,7 +1341,7 @@
 	/**
 	 * Returns the name of the code snippet to instantiate to run the current
 	 * evaluation.
-	 * 
+	 *
 	 * @return the name of the deployed code snippet to instantiate and run
 	 */
 	protected String getCodeSnippetClassName() {
@@ -1357,7 +1357,7 @@
 
 	/**
 	 * Returns whether to hit breakpoints in the evaluation thread.
-	 * 
+	 *
 	 * @return whether to hit breakpoints in the evaluation thread
 	 */
 	protected boolean getHitBreakpoints() {
@@ -1366,7 +1366,7 @@
 
 	/**
 	 * Sets whether to hit breakpoints in the evaluation thread.
-	 * 
+	 *
 	 * @param hit
 	 *            whether to hit breakpoints in the evaluation thread
 	 */
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java
index 0b3b5fc..4c1cae6 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java
@@ -83,7 +83,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.debug.core.IDebugEventFilter#filterDebugEvents(org.eclipse
 		 * .debug.core.DebugEvent[])
@@ -121,7 +121,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IEvaluationEngine#evaluate(java.lang.String,
 	 * org.eclipse.jdt.debug.core.IJavaStackFrame,
@@ -139,7 +139,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IEvaluationEngine#evaluate(java.lang.String,
 	 * org.eclipse.jdt.debug.core.IJavaObject,
@@ -159,7 +159,7 @@
 
 	/**
 	 * Writes a stack dump to trace the calling thread.
-	 * 
+	 *
 	 * @param snippet
 	 *            expression to evaluate
 	 * @param thread
@@ -186,7 +186,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IAstEvaluationEngine#evaluateExpression(org
 	 * .eclipse.jdt.debug.eval.ICompiledExpression,
@@ -205,7 +205,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IAstEvaluationEngine#evaluateExpression(org
 	 * .eclipse.jdt.debug.eval.ICompiledExpression,
@@ -267,7 +267,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IAstEvaluationEngine#getCompiledExpression
 	 * (java.lang.String, org.eclipse.jdt.debug.core.IJavaStackFrame)
@@ -290,7 +290,7 @@
 				innerClassFields = new IVariable[0];
 			}
 			int numLocalsVar = localsVar.length;
-			Set<String> names = new HashSet<String>();
+			Set<String> names = new HashSet<>();
 			// ******
 			// to hide problems with local variable declare as instance of Local
 			// Types
@@ -461,7 +461,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IAstEvaluationEngine#getCompiledExpression
 	 * (java.lang.String, org.eclipse.jdt.debug.core.IJavaObject)
@@ -486,7 +486,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.eval.IAstEvaluationEngine#getCompiledExpression
 	 * (java.lang.String, org.eclipse.jdt.debug.core.IJavaType)
@@ -520,7 +520,7 @@
 	/**
 	 * Creates a compiled expression for the given snippet using the given
 	 * mapper and compilation unit (AST).
-	 * 
+	 *
 	 * @param snippet
 	 *            the code snippet to be compiled
 	 * @param mapper
@@ -583,7 +583,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.eval.IEvaluationEngine#getJavaProject()
 	 */
 	@Override
@@ -593,7 +593,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.eval.IEvaluationEngine#getDebugTarget()
 	 */
 	@Override
@@ -603,7 +603,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.eval.IEvaluationEngine#dispose()
 	 */
 	@Override
@@ -815,7 +815,7 @@
 
 	/**
 	 * Replaces references to 'this' with the 'array_this' variable.
-	 * 
+	 *
 	 * @param snippet
 	 *            code snippet
 	 * @return snippet with 'this' references replaced
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java
index 3f62171..0a293db 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java
@@ -155,8 +155,8 @@
 	public ASTInstructionCompiler(int startPosition, String snippet) {
 		fStartPosition = startPosition;
 		fInstructions = new InstructionSequence(snippet);
-		fStack = new Stack<Instruction>();
-		fCompleteInstructions = new ArrayList<CompleteInstruction>();
+		fStack = new Stack<>();
+		fCompleteInstructions = new ArrayList<>();
 	}
 
 	/**
@@ -208,8 +208,8 @@
 		}
 		catch(EmptyStackException ese) {
 			JDIDebugPlugin.log(new Status(
-					IStatus.WARNING, 
-					JDIDebugPlugin.getUniqueIdentifier(), 
+					IStatus.WARNING,
+					JDIDebugPlugin.getUniqueIdentifier(),
 					NLS.bind(EvaluationEngineMessages.ASTInstructionCompiler_4, fCounter),
 					ese));
 		}
@@ -225,7 +225,7 @@
 
 	/**
 	 * Prints the given message to the console if verbose mode is on.
-	 * 
+	 *
 	 * @param message
 	 *            the message to display
 	 */
@@ -334,7 +334,7 @@
 
 	/**
 	 * Return the label associated with the given statement.
-	 * 
+	 *
 	 * @param statement
 	 *            the statement.
 	 * @return the associated label, or <code>null</code> if there is none.
@@ -352,7 +352,7 @@
 	 * instruction is added when the expression has a return value, i.e. all
 	 * expressions expect method invocation expressions which have
 	 * <code>void</code> as return type and variable declaration expression.
-	 * 
+	 *
 	 * @param expression
 	 *            the expression to test.
 	 */
@@ -383,7 +383,7 @@
 	}
 
 	/**
-	 * 
+	 *
 	 */
 	private void addPopInstruction() {
 		Instruction lastInstruction = fInstructions
@@ -511,7 +511,7 @@
 
 	/**
 	 * End visit methods
-	 * 
+	 *
 	 * There are two paths to ending a visit to a node:
 	 * <ol>
 	 * <li>For control statements, the necessary control instructions (jump,
@@ -731,7 +731,7 @@
 
 		/*
 		 * The structure of generated instructions is :
-		 * 
+		 *
 		 * -- | body -- -- |condition -- - jump to the first instruction of the
 		 * body if the condition is true.
 		 */
@@ -789,7 +789,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom
 	 * .EnhancedForStatement)
@@ -801,12 +801,12 @@
 
 		/*
 		 * The structure of generated instructions is :
-		 * 
+		 *
 		 * For an array: -- | <ParameterType>[] a= Expression | int i= 0 |
 		 * <ParameterType> <ParameterName> -- -- | i < a.length - jump to the
 		 * instruction after the last jump if the condition is false. -- -- | s=
 		 * a[i] | Body -- -- - jump to the first instruction of the condition.
-		 * 
+		 *
 		 * For an Iterable: -- | Iterator i= Expression.iterator() |
 		 * <ParameterType> <ParameterName> -- -- | i.hasNext() - jump to the
 		 * instruction after the last jump if the condition is false. -- -- | s=
@@ -897,7 +897,7 @@
 
 		/*
 		 * The structure of generated instructions is :
-		 * 
+		 *
 		 * -- |initialization -- -- |condition -- - jump to the instruction
 		 * after the last jump if the condition is false. -- | body -- -- |
 		 * updaters -- - jump to the first instruction of the condition.
@@ -1391,7 +1391,7 @@
 
 		/*
 		 * The structure of generated instructions is :
-		 * 
+		 *
 		 * -- |condition -- - jump to the instruction after the last jump if the
 		 * condition is false. -- | body -- - jump to the first instruction of
 		 * the condition.
@@ -1445,7 +1445,7 @@
 
 	/*
 	 * Visit methods
-	 * 
+	 *
 	 * There are two variations of node visiting: <ol> <li>Push the instruction
 	 * corresponding to the node onto the stack and return <code>true</code> to
 	 * visit the children of the node.</li> <li>Push the instruction
@@ -1456,7 +1456,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * AnnotationTypeDeclaration)
 	 */
@@ -1467,7 +1467,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * AnnotationTypeMemberDeclaration)
 	 */
@@ -1831,7 +1831,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * BlockComment)
 	 */
@@ -1935,7 +1935,7 @@
 	/**
 	 * return false, visit expression, type name & arguments, don't visit body
 	 * declaration
-	 * 
+	 *
 	 * @see ASTVisitor#visit(ClassInstanceCreation)
 	 */
 	@Override
@@ -2129,7 +2129,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnhancedForStatement)
 	 */
@@ -2259,7 +2259,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnumConstantDeclaration)
 	 */
@@ -2275,7 +2275,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnumDeclaration)
 	 */
@@ -2312,7 +2312,7 @@
 
 	/**
 	 * return false, visit expression, don't visit name
-	 * 
+	 *
 	 * @see ASTVisitor#visit(FieldAccess)
 	 */
 	@Override
@@ -2427,7 +2427,7 @@
 
 	/**
 	 * return <code>false</code>, don't use the standard accept order.
-	 * 
+	 *
 	 * @see ASTVisitor#visit(InfixExpression)
 	 */
 	@Override
@@ -2662,10 +2662,10 @@
 		if (hasErrors()) {
 			return false;
 		}
-		
+
 		iterator = extendedOperands.iterator();
 
-		if ((char0 == '&' && char1 == '&') || (char0 == '|' && char1 == '|')) { 
+		if ((char0 == '&' && char1 == '&') || (char0 == '|' && char1 == '|')) {
 			boolean isOrOr = char0 == '|';
 
 			ConditionalJump[] conditionalJumps = new ConditionalJump[operatorNumber];
@@ -2814,7 +2814,7 @@
 	}
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * LineComment)
 	 */
@@ -2825,7 +2825,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MarkerAnnotation)
 	 */
@@ -2836,7 +2836,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MemberRef
 	 * )
@@ -2848,7 +2848,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MemberValuePair)
 	 */
@@ -2872,7 +2872,7 @@
 
 	/**
 	 * return false, don't visit name, visit expression & arguments
-	 * 
+	 *
 	 * @see ASTVisitor#visit(MethodInvocation)
 	 */
 	@Override
@@ -2944,7 +2944,7 @@
 	/**
 	 * Pushes method arguments onto the stack for a method or constructor
 	 * invocation taking variable arguments and auto-boxing into consideration.
-	 * 
+	 *
 	 * @param methodBinding
 	 *            method or constructor being called
 	 * @param arguments
@@ -2962,8 +2962,8 @@
 				return;
 			}
 		}
-		if (methodBinding.isVarargs() && 
-				!(paramCount == argCount && 
+		if (methodBinding.isVarargs() &&
+				!(paramCount == argCount &&
 				parameterTypes[paramCount - 1].getDimensions() == lastArgBinding.getDimensions())) {
 			// if this method is a varargs, and if the method is invoked using
 			// the varargs syntax
@@ -3013,7 +3013,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodRef
 	 * )
@@ -3025,7 +3025,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MethodRefParameter)
 	 */
@@ -3036,7 +3036,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Modifier
 	 * )
@@ -3048,7 +3048,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * NormalAnnotation)
 	 */
@@ -3123,7 +3123,7 @@
 	/**
 	 * Removes all preamble typing and underscores and returns the base integer
 	 * value
-	 * 
+	 *
 	 * @param token
 	 *            the token to parse
 	 * @return the int value of the token
@@ -3145,7 +3145,7 @@
 	/**
 	 * Removes all preamble typing and underscores and returns the base short
 	 * value
-	 * 
+	 *
 	 * @param token
 	 *            the token to parse
 	 * @return the short value of the token
@@ -3167,7 +3167,7 @@
 	/**
 	 * Removes all preamble typing and underscores and returns the base byte
 	 * value
-	 * 
+	 *
 	 * @param token
 	 *            the token to parse
 	 * @return the byte value of the token
@@ -3189,7 +3189,7 @@
 	/**
 	 * Removes all preamble typing and underscores and returns the base long
 	 * value
-	 * 
+	 *
 	 * @param token
 	 *            the token to parse
 	 * @return the long value of the token
@@ -3211,7 +3211,7 @@
 	/**
 	 * Returns the numeric base for the given token according to the Java
 	 * specification. Returns 8, 10, or 16.
-	 * 
+	 *
 	 * @param token
 	 *            the token to get the base from
 	 * @return the numeric base for the given token
@@ -3245,7 +3245,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * ParameterizedType)
 	 */
@@ -3567,7 +3567,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * QualifiedType)
 	 */
@@ -3644,7 +3644,7 @@
 
 	/**
 	 * return false, don't visit child
-	 * 
+	 *
 	 * @see ASTVisitor#visit(SimpleType)
 	 */
 	@Override
@@ -3662,7 +3662,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * SingleMemberAnnotation)
 	 */
@@ -3770,7 +3770,7 @@
 
 	/**
 	 * return false, don't visit name, visit arguments
-	 * 
+	 *
 	 * @see ASTVisitor#visit(SuperMethodInvocation)
 	 */
 	@Override
@@ -3826,8 +3826,8 @@
 				return false;
 			}
 		}
-		if (methodBinding.isVarargs() && 
-				!(paramCount == argCount && 
+		if (methodBinding.isVarargs() &&
+				!(paramCount == argCount &&
 				parameterTypes[paramCount - 1].getDimensions() == lastArgBinding.getDimensions())) {
 			// if this method is a varargs, and if the method is invoked using
 			// the varargs syntax
@@ -3889,7 +3889,7 @@
 		addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression);
 		return false;
 	}
-	
+
 	/**
 	 * @see ASTVisitor#visit(SwitchCase)
 	 */
@@ -3900,10 +3900,10 @@
 	}
 
 	class slot {
-		ArrayList<ConditionalJump> jumps = new ArrayList<ConditionalJump>();
+		ArrayList<ConditionalJump> jumps = new ArrayList<>();
 		ArrayList<Statement> stmts = null;
 	}
-	
+
 	/**
 	 * @see ASTVisitor#visit(SwitchStatement)
 	 */
@@ -3918,7 +3918,7 @@
 
 		ArrayList<Statement> statementsDefault = null;
 		Jump jumpDefault = null;
-		ArrayList<slot> jumpsStatements = new ArrayList<slot>();
+		ArrayList<slot> jumpsStatements = new ArrayList<>();
 		slot currentslot = new slot();
 		jumpsStatements.add(currentslot);
 
@@ -3930,7 +3930,7 @@
 					jumpDefault = new Jump();
 					push(jumpDefault);
 					storeInstruction(); // jump
-					statementsDefault = new ArrayList<Statement>();
+					statementsDefault = new ArrayList<>();
 				} else {
 					if (switchCase.getExpression() instanceof StringLiteral) {
 						push(new SendMessage(
@@ -3957,7 +3957,7 @@
 					statementsDefault.add(statement);
 				} else {
 					if (currentslot.stmts == null) {
-						currentslot.stmts = new ArrayList<Statement>();
+						currentslot.stmts = new ArrayList<>();
 					}
 					currentslot.stmts.add(statement);
 				}
@@ -4032,7 +4032,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TagElement
 	 * )
@@ -4044,7 +4044,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * TextElement)
 	 */
@@ -4129,7 +4129,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * TypeParameter)
 	 */
@@ -4264,7 +4264,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * WildcardType)
 	 */
@@ -4421,7 +4421,7 @@
 	/**
 	 * Returns the method signature given the binding and the enclosing type
 	 * signature (if there is one)
-	 * 
+	 *
 	 * @param methodBinding
 	 *            the binding to get the signature for
 	 * @param enclosingTypeSignature
@@ -4486,7 +4486,7 @@
 	/**
 	 * Resolves and returns the type binding from the given expression reporting
 	 * an error if the binding is <code>null</code>.
-	 * 
+	 *
 	 * @param expression
 	 *            expression to resolve type binding for
 	 * @return type binding or <code>null</code> if not available
@@ -4505,7 +4505,7 @@
 	/**
 	 * Resolves and returns the type binding for the give type reporting an
 	 * error if the binding is <code>null</code>.
-	 * 
+	 *
 	 * @param type
 	 *            type to resolve binding for
 	 * @return type binding or <code>null</code> if not available
@@ -4524,7 +4524,7 @@
 	/**
 	 * Resolves and returns the binding for the given name reporting an error if
 	 * the binding is <code>null</code>.
-	 * 
+	 *
 	 * @param name
 	 *            name to resolve binding for
 	 * @return binding or <code>null</code> if not available
@@ -4543,7 +4543,7 @@
 	/**
 	 * Resolves and returns the type binding for the given name reporting an
 	 * error if the binding is <code>null</code>.
-	 * 
+	 *
 	 * @param name
 	 *            name to resolve type binding for
 	 * @return type binding or <code>null</code> if not available
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/AbstractRuntimeContext.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/AbstractRuntimeContext.java
index ccc5d52..c25ebef 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/AbstractRuntimeContext.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/AbstractRuntimeContext.java
@@ -31,7 +31,7 @@
 /**
  * Common runtime context code for class loading and cache of class
  * loader/java.lang.Class.
- * 
+ *
  * @since 3.2
  */
 
@@ -63,7 +63,7 @@
 	/**
 	 * Returns the class loader used to load classes for this runtime context or
 	 * <code>null</code> when loaded by the bootstrap loader
-	 * 
+	 *
 	 * @return the class loader used to load classes for this runtime context or
 	 *         <code>null</code> when loaded by the bootstrap loader
 	 * @throws CoreException
@@ -78,7 +78,7 @@
 
 	/**
 	 * Return the java.lang.Class type.
-	 * 
+	 *
 	 * @return the java.lang.Class type
 	 * @throws CoreException
 	 *             if unable to retrieve the type
@@ -104,7 +104,7 @@
 	/**
 	 * Invokes Class.classForName(String, boolean, ClassLoader) on the target to
 	 * force load the specified class.
-	 * 
+	 *
 	 * @param qualifiedName
 	 *            name of class to load
 	 * @param loader
@@ -164,7 +164,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#classForName
 	 * (java.lang.String)
@@ -176,7 +176,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#getProject
 	 * ()
@@ -190,7 +190,7 @@
 	 * Returns whether the class loaded by the <code>otherLoader</code> is
 	 * compatible with the receiver's class loader. To be compatible, the
 	 * other's loader must be the same or a parent of the receiver's loader.
-	 * 
+	 *
 	 * @param recLoader
 	 *            class loader of receiver
 	 * @param otherLoader
@@ -222,7 +222,7 @@
 	/**
 	 * Returns the parent class loader of the given class loader object or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param loader
 	 *            class loader object
 	 * @return parent class loader or <code>null</code>
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ArrayRuntimeContext.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ArrayRuntimeContext.java
index c593886..301c60b 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ArrayRuntimeContext.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ArrayRuntimeContext.java
@@ -51,7 +51,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#getVM()
 	 */
@@ -62,7 +62,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#getThis()
 	 */
@@ -73,7 +73,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#
 	 * getReceivingType()
 	 */
@@ -96,7 +96,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#getLocals
 	 * ()
@@ -108,7 +108,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#getThread
 	 * ()
@@ -120,7 +120,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext#isConstructor
 	 * ()
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/BinaryBasedSourceGenerator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/BinaryBasedSourceGenerator.java
index aa8a99a..8520276 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/BinaryBasedSourceGenerator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/BinaryBasedSourceGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Holger Schill - Bug 455199 - [debug] Debugging doesn't work properly when inner classes are used
@@ -604,7 +604,7 @@
 	/**
 	 * Returns whether the source to be generated is greater than or equal to
 	 * the given source level.
-	 * 
+	 *
 	 * @param major
 	 *            major level - e.g. 1 from 1.4
 	 * @param minor
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java
index 212cec5..4e10c8d 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper Steen Moller - bug 341232
@@ -72,16 +72,16 @@
 		this(new String[0], new String[0], codeSnippet, javaProject);
 	}
 
-	
+
 	/**
 	 * Returns the completed codeSnippet by adding required semicolon and
-	 * return 
+	 * return
 	 */
 	protected String getCompleteSnippet(String codeSnippet) {
 		codeSnippet = codeSnippet.trim(); // remove whitespaces at the end
 		boolean inString = false;
 		byte[] chars = codeSnippet.getBytes();
-		
+
 		int semicolonIndex = -1;
 		int lastSemilcolonIndex = -1;
 		for (int i = 0, numChars = chars.length; i < numChars; i++) {
@@ -104,7 +104,7 @@
 			}
 		}
 		StringBuffer wordBuffer = new StringBuffer();
-		// if semicolon missing at the end 
+		// if semicolon missing at the end
 		if (lastSemilcolonIndex != chars.length-1)
 			semicolonIndex = lastSemilcolonIndex;
 		int i ;
@@ -119,7 +119,7 @@
 		String lastSentence  = codeSnippet.substring(i);
 		// don't add return if it there in some condition
 		String returnString = "return "; //$NON-NLS-1$
-		int index = codeSnippet.lastIndexOf(returnString); 
+		int index = codeSnippet.lastIndexOf(returnString);
 		if (index == -1){
 			if (needsReturn(lastSentence))
 				wordBuffer.append(returnString);
@@ -129,7 +129,7 @@
 				if (needsReturn(lastSentence))
 					wordBuffer.append(returnString);
 			}
-		} else if (chars[chars.length -1] !='}' && ( i+7 > chars.length || (i + 7 <= chars.length && !codeSnippet.substring(i, i+7).equals(returnString)))){ 
+		} else if (chars[chars.length -1] !='}' && ( i+7 > chars.length || (i + 7 <= chars.length && !codeSnippet.substring(i, i+7).equals(returnString)))){
 			// add return if last statement does not have return
 			if (needsReturn(lastSentence))
 				wordBuffer.append(returnString);
@@ -150,12 +150,12 @@
 		return wordBuffer.toString();
 	}
 
-	
+
 	/**
 	 * Returns <code>true</code> if the snippet required return to be added, or
 	 * <code>false</code> if the snippet does not require return to be added.
 	 */
-	
+
 	private boolean needsReturn(String codeSnippet){
 		if ( codeSnippet.length() == 0) {
 			return false;
@@ -167,7 +167,7 @@
 			token = scanner.getNextToken();
 			int count = 0;
 			while (token != ITerminalSymbols.TokenNameEOF) {
-				if (count == 0 && (token == ITerminalSymbols.TokenNameIdentifier || token == ITerminalSymbols.TokenNameint || token == ITerminalSymbols.TokenNamefloat || 
+				if (count == 0 && (token == ITerminalSymbols.TokenNameIdentifier || token == ITerminalSymbols.TokenNameint || token == ITerminalSymbols.TokenNamefloat ||
 						token == ITerminalSymbols.TokenNamedouble || token == ITerminalSymbols.TokenNameboolean || token == ITerminalSymbols.TokenNamechar ||
 						token == ITerminalSymbols.TokenNameshort || token == ITerminalSymbols.TokenNamelong)) {
 					int currentToken = token;
@@ -176,7 +176,7 @@
 						return true;
 					}
 					count = 1;
-				} 
+				}
 				else if ( count == 0 && (token == ITerminalSymbols.TokenNamestatic || token == ITerminalSymbols.TokenNamefinal || token == ITerminalSymbols.TokenNamepackage ||
 						token == ITerminalSymbols.TokenNameprivate || token == ITerminalSymbols.TokenNameprotected || token == ITerminalSymbols.TokenNamepublic)){
 					token = scanner.getNextToken();
@@ -220,19 +220,19 @@
 				else if ( (count == 3 || count == 1 ) && token == ITerminalSymbols.TokenNameIdentifier ){
 					 return false;
 				}
-				else { 
+				else {
 					return true;
 				}
-				
+
 			}
 		}
 		catch (InvalidInputException e) {
 			// ignore
 		}
-		
+
 		return true;
 	}
-	
+
 	public String getCompilationUnitName() {
 		return fCompilationUnitName;
 	}
@@ -302,7 +302,7 @@
 	 * Turns all errors and warnings into ignore and disables task tags. The
 	 * customizable set of compiler options only contains additional Eclipse
 	 * options. The standard JDK compiler options can't be changed anyway.
-	 * 
+	 *
 	 * @param element
 	 *            an element (not the Java model)
 	 * @return compiler options
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/IRuntimeContext.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/IRuntimeContext.java
index bf04301..e4987bd 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/IRuntimeContext.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/IRuntimeContext.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,7 +31,7 @@
 
 	/**
 	 * Returns the virtual machine in which to perform the evaluation.
-	 * 
+	 *
 	 * @return virtual machine
 	 */
 	IJavaDebugTarget getVM();
@@ -40,7 +40,7 @@
 	 * Returns the receiving object context in which to perform the evaluation -
 	 * equivalent to 'this'. Returns <code>null</code> if the context of an
 	 * evaluation is in a class rather than an object.
-	 * 
+	 *
 	 * @return 'this', or <code>null</code>
 	 * @exception EvaluationException
 	 *                if this method fails. Reasons include:
@@ -56,7 +56,7 @@
 	 * Returns the receiving type context in which to perform the evaluation.
 	 * The type of 'this', or in the case of a static context, the class or
 	 * interface in which the evaluation is being performed.
-	 * 
+	 *
 	 * @return receiving class
 	 * @exception EvaluationException
 	 *                if this method fails. Reasons include:
@@ -72,7 +72,7 @@
 	 * Returns the local variables visible for the evaluation. This includes
 	 * method arguments, if any. Does not return <code>null</code> returns an
 	 * empty collection if there are no locals.
-	 * 
+	 *
 	 * @return local variables
 	 * @exception EvaluationException
 	 *                if this method fails. Reasons include:
@@ -87,21 +87,21 @@
 	/**
 	 * Returns the Java project context in which this expression should be
 	 * compiled.
-	 * 
+	 *
 	 * @return project
 	 */
 	IJavaProject getProject();
 
 	/**
 	 * Returns the thread in which message sends may be performed.
-	 * 
+	 *
 	 * @return thread
 	 */
 	IJavaThread getThread();
 
 	/**
 	 * Returns whether the context of this evaluation is within a constructor.
-	 * 
+	 *
 	 * @return whether the context of this evaluation is within a constructor
 	 * @exception EvaluationException
 	 *                if this method fails. Reasons include:
@@ -117,7 +117,7 @@
 	 * Loads, prepares and returns the class with the given name in this runtime
 	 * context's receiving type's class loader. If the class is already loaded,
 	 * it is simply returned.
-	 * 
+	 *
 	 * @param name
 	 *            fully qualified class name
 	 * @return class object
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/Interpreter.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/Interpreter.java
index 3e81f2c..ee36651 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/Interpreter.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/Interpreter.java
@@ -54,7 +54,7 @@
 	public Interpreter(InstructionSequence instructions, IRuntimeContext context) {
 		fInstructions = instructions.getInstructions();
 		fContext = context;
-		fInternalVariables = new HashMap<String, IVariable>();
+		fInternalVariables = new HashMap<>();
 	}
 
 	public void execute() throws CoreException {
@@ -79,7 +79,7 @@
 	}
 
 	private void reset() {
-		fStack = new Stack<Object>();
+		fStack = new Stack<>();
 		fInstructionCounter = 0;
 	}
 
@@ -104,13 +104,13 @@
 
 	/**
 	 * Avoid garbage collecting interim results.
-	 * 
+	 *
 	 * @param value
 	 *            object to disable garbage collection for
 	 */
 	private void disableCollection(IJavaObject value) {
 		if (fPermStorage == null) {
-			fPermStorage = new ArrayList<IJavaObject>(5);
+			fPermStorage = new ArrayList<>(5);
 		}
 		try {
 			value.disableCollection();
@@ -193,7 +193,7 @@
 	/**
 	 * Create a new variable in the interpreter with the given name and the
 	 * given type.
-	 * 
+	 *
 	 * @param name
 	 *            the name of the variable to create.
 	 * @param type
@@ -211,7 +211,7 @@
 	 * Return the variable with the given name. This method only looks in the
 	 * list of internal variable (i.e. created by
 	 * Interpreter#createInternalVariable(String, IJavaType))
-	 * 
+	 *
 	 * @param name
 	 *            the name of the variable to retrieve.
 	 * @return the corresponding variable, or <code>null</code> if there is
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/InterpreterVariable.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/InterpreterVariable.java
index e306c23..1dabe7f 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/InterpreterVariable.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/InterpreterVariable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -250,7 +250,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getGenericSignature()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/JavaObjectRuntimeContext.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/JavaObjectRuntimeContext.java
index 7a58bfc..712bae7 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/JavaObjectRuntimeContext.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/JavaObjectRuntimeContext.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,7 +32,7 @@
 
 	/**
 	 * ObjectValueRuntimeContext constructor.
-	 * 
+	 *
 	 * @param thisObject
 	 *            <code>this</code> object of this context.
 	 * @param javaProject
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/RuntimeContext.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/RuntimeContext.java
index cfacf37..d2cde91 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/RuntimeContext.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/RuntimeContext.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 
 	/**
 	 * Creates a runtime context for the given java project and stack frame.
-	 * 
+	 *
 	 * @param project
 	 *            Java project context used to compile expressions in
 	 * @param frame
@@ -78,7 +78,7 @@
 
 	/**
 	 * Sets the stack frame context used to compile/run expressions
-	 * 
+	 *
 	 * @param frame
 	 *            the stack frame context used to compile/run expressions
 	 */
@@ -88,7 +88,7 @@
 
 	/**
 	 * Sets the stack frame context used to compile/run expressions
-	 * 
+	 *
 	 * @param frame
 	 *            the stack frame context used to compile/run expressions
 	 */
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SignatureExt.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SignatureExt.java
index 5c60291..d95d585 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SignatureExt.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SignatureExt.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -47,7 +47,7 @@
 					throw new IllegalArgumentException();
 				i++; // trailing '>'
 			}
-			ArrayList<char[]> superList = new ArrayList<char[]>();
+			ArrayList<char[]> superList = new ArrayList<>();
 			while (i < length) {
 				int superStart = i;
 				i = Util.scanTypeSignature(typeSignature, i);
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java
index ac64031..72bca4e 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java
@@ -155,7 +155,7 @@
 	private int fSourceMajorLevel;
 	private int fSourceMinorLevel;
 
-	private Stack<Map<String, String>> fTypeParameterStack = new Stack<Map<String, String>>();
+	private Stack<Map<String, String>> fTypeParameterStack = new Stack<>();
 	private Map<String, String> fMatchingTypeParameters = null;
 	private CompilationUnit fCompilationUnit;
 	{
@@ -166,7 +166,7 @@
 	 * if the <code>createInAnInstanceMethod</code> flag is set, the method
 	 * created which contains the code snippet is an no-static method, even if
 	 * <code>position</code> is in a static method.
-	 * 
+	 *
 	 * @param type
 	 *            the root {@link IType}
 	 * @param sourcePosition
@@ -202,7 +202,7 @@
 	/**
 	 * Returns the generated source or <code>null</code> if no source can be
 	 * generated.
-	 * 
+	 *
 	 * @return returns the backing source from the generator
 	 */
 	public String getSource() {
@@ -287,7 +287,7 @@
 
 	/**
 	 * Adds generic type parameters as needed to the given buffer
-	 * 
+	 *
 	 * @param buffer
 	 * @since 3.8.0
 	 */
@@ -309,11 +309,11 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns if the specified {@link ASTNode} has the 'correct' parent type to
 	 * match the current type name context
-	 * 
+	 *
 	 * @param node
 	 *            the {@link ASTNode} to check source ranges for
 	 * @return true if the parent type of the given node matches the current
@@ -337,7 +337,7 @@
 					ClassInstanceCreation decl = (ClassInstanceCreation) node;
 					Type type = decl.getType();
 					ISourceRange name = fType.getNameRange();
-					return name.getOffset() >= type.getStartPosition() && 
+					return name.getOffset() >= type.getStartPosition() &&
 							name.getOffset()+name.getLength() <= type.getStartPosition()+type.getLength();
 				}
 			}
@@ -398,7 +398,7 @@
 	/**
 	 * Builds up the given buffer with the source from each of
 	 * {@link BodyDeclaration}s in the given list
-	 * 
+	 *
 	 * @param buffer
 	 *            the buffer to clone and append to
 	 * @param list
@@ -706,7 +706,7 @@
 	 * Returns a method name that will be unique in the generated source. The
 	 * generated name is baseName plus as many '_' characters as necessary to
 	 * not duplicate an existing method name.
-	 * 
+	 *
 	 * @param methodName
 	 *            the method name to look for
 	 * @param bodyDeclarations
@@ -735,7 +735,7 @@
 	 * Returns a field name that will be unique in the generated source. The
 	 * generated name is baseName plus as many '_' characters as necessary to
 	 * not duplicate an existing method name.
-	 * 
+	 *
 	 * @param fieldName
 	 *            the name of the field to look for
 	 * @param bodyDeclarations
@@ -927,7 +927,7 @@
 	 * <br>
 	 * This method adds the new <code>___eval</code> method source to the root
 	 * {@link #fSource} variable directly
-	 * 
+	 *
 	 * @param isstatic
 	 *            if the keyword <code>static</code> should be added to the
 	 *            method source
@@ -964,7 +964,7 @@
 	 * Recursively finds the parent {@link Type} from the given type, in the
 	 * cases where the type is an {@link ArrayType} or a
 	 * {@link ParameterizedType}
-	 * 
+	 *
 	 * @param type
 	 *            the {@link Type}
 	 * @return the parent {@link Type}
@@ -996,7 +996,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom
 	 * .EnumDeclaration)
@@ -1119,7 +1119,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * AnnotationTypeDeclaration)
 	 */
@@ -1130,7 +1130,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * AnnotationTypeMemberDeclaration)
 	 */
@@ -1229,7 +1229,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * BlockComment)
 	 */
@@ -1373,7 +1373,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnhancedForStatement)
 	 */
@@ -1387,7 +1387,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnumConstantDeclaration)
 	 */
@@ -1401,7 +1401,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnumDeclaration)
 	 */
@@ -1504,7 +1504,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * InstanceofExpression)
 	 */
@@ -1540,7 +1540,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * LineComment)
 	 */
@@ -1551,7 +1551,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MarkerAnnotation)
 	 */
@@ -1562,7 +1562,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MemberRef
 	 * )
@@ -1574,7 +1574,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MemberValuePair)
 	 */
@@ -1590,7 +1590,7 @@
 	public boolean visit(MethodDeclaration node) {
 		int firstLine = fCompilationUnit.getLineNumber(node.getStartPosition());
 		int lastLine = fCompilationUnit.getLineNumber(node.getStartPosition() + node.getLength());
-		
+
 		List<TypeParameter> typeParameters = node.typeParameters();
 		pushTypeParameters(typeParameters);
 		if (isRightType(node.getParent()) && firstLine <= fLine && fLine <= lastLine) {
@@ -1604,7 +1604,7 @@
 
 	private void pushTypeParameters(List<TypeParameter> typeParameters) {
 		if (!typeParameters.isEmpty()) {
-			HashMap<String,String> newTypeParameters = new HashMap<String,String>(fTypeParameterStack.peek());
+			HashMap<String,String> newTypeParameters = new HashMap<>(fTypeParameterStack.peek());
 			Iterator<TypeParameter> iterator = typeParameters.iterator();
 			while (iterator.hasNext()) {
 				TypeParameter typeParameter = iterator.next();
@@ -1630,7 +1630,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodRef
 	 * )
@@ -1642,7 +1642,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MethodRefParameter)
 	 */
@@ -1653,7 +1653,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Modifier
 	 * )
@@ -1665,7 +1665,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * NormalAnnotation)
 	 */
@@ -1709,7 +1709,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * ParameterizedType)
 	 */
@@ -1778,7 +1778,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * QualifiedType)
 	 */
@@ -1822,7 +1822,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * SingleMemberAnnotation)
 	 */
@@ -1921,7 +1921,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TagElement
 	 * )
@@ -1933,7 +1933,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * TextElement)
 	 */
@@ -1977,7 +1977,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.UnionType
 	 * )
@@ -2028,7 +2028,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * TypeParameter)
 	 */
@@ -2083,7 +2083,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * WildcardType)
 	 */
@@ -2095,7 +2095,7 @@
 	/**
 	 * Returns whether the source to be generated is greater than or equal to
 	 * the given source level.
-	 * 
+	 *
 	 * @param major
 	 *            major level - e.g. 1 from 1.4
 	 * @param minor
@@ -2110,7 +2110,7 @@
 
 	/**
 	 * Appends type parameters to source.
-	 * 
+	 *
 	 * @param source
 	 *            the current buffer of source to append to
 	 * @param typeParameters
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndAssignmentOperator.java
index 5137a00..b4a7a91 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndOperator.java
index 528d90d..a6c55ed 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AndOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAccess.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAccess.java
index 7e78e6b..df3ee6e 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAccess.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAccess.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -56,19 +56,13 @@
 	/**
 	 * Pops an array object off the top of the stack. Throws an exception if not
 	 * an array object or <code>null</code>.
-	 * 
+	 *
 	 * @return array object on top of the stack
 	 * @throws CoreException
 	 *             if not available
 	 */
 	protected IJavaArray popArray() throws CoreException {
-		Object popValue = popValue();
-		if (! (popValue instanceof IJavaValue)) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
-					"Internal error: attempt to access non-java object", null)); //$NON-NLS-1$
-		}
-		IJavaValue value = (IJavaValue) popValue;
+		IJavaValue value = popValue();
 		if (value instanceof IJavaArray) {
 			return (IJavaArray) value;
 		} else if (value.isNull()) {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAllocation.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAllocation.java
index da98d15..8c519c1 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAllocation.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayAllocation.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 
 	/**
 	 * Constructor for ArrayAllocation.
-	 * 
+	 *
 	 * @param start
 	 */
 	public ArrayAllocation(int dimension, int exprDimension,
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInitializerInstruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInitializerInstruction.java
index e812e51..01a2305 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInitializerInstruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInitializerInstruction.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,7 +13,6 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.debug.core.IJavaArray;
 import org.eclipse.jdt.debug.core.IJavaArrayType;
-import org.eclipse.jdt.debug.core.IJavaValue;
 
 public class ArrayInitializerInstruction extends ArrayInstruction {
 
@@ -25,7 +24,7 @@
 
 	/**
 	 * Constructor for ArrayInitializerInstruction.
-	 * 
+	 *
 	 * @param start
 	 */
 	public ArrayInitializerInstruction(String typeSignature, int length,
@@ -47,10 +46,7 @@
 		IJavaArray array = arrayType.newInstance(fLength);
 
 		for (int i = fLength - 1; i >= 0; i--) {
-			Object popValue = popValue();
-			if (popValue instanceof IJavaValue) {
-				array.setValue(i, (IJavaValue) popValue);
-			}
+			array.setValue(i, popValue());
 		}
 
 		push(array);
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInstruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInstruction.java
index b50a642..2f9707d 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInstruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ArrayInstruction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AssignmentOperator.java
index 9b7f06e..b666d50 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/AssignmentOperator.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,10 +31,7 @@
 	 */
 	@Override
 	public void execute() throws CoreException {
-		Object popValue = popValue();
-		if (!(popValue instanceof IJavaValue))
-			return;
-		IJavaValue value = (IJavaValue) popValue;
+		IJavaValue value = popValue();
 		IJavaVariable variable = (IJavaVariable) pop();
 
 		if (value instanceof IJavaPrimitiveValue) {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/BinaryOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/BinaryOperator.java
index 70151a6..8fcb7a1 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/BinaryOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/BinaryOperator.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -42,10 +42,7 @@
 	}
 
 	private void executeAssignment() throws CoreException {
-		Object popValue = popValue();
-		if (!(popValue instanceof IJavaValue))
-			return;
-		IJavaValue value = (IJavaValue) popValue;
+		IJavaValue value = popValue();
 		IJavaVariable variable = (IJavaVariable) pop();
 		IJavaValue variableValue = (IJavaValue) variable.getValue();
 
@@ -83,11 +80,8 @@
 	}
 
 	private void executeBinary() throws CoreException {
-		Object popValue = popValue();
-		if (!(popValue instanceof IJavaValue))
-			return;
-		IJavaValue right = (IJavaValue) popValue;
-		IJavaValue left = (IJavaValue) popValue();
+		IJavaValue right = popValue();
+		IJavaValue left = popValue();
 
 		switch (fResultTypeId) {
 		case T_String:
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Cast.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Cast.java
index 3007ad7..2ade4fa 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Cast.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Cast.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -34,7 +34,7 @@
 
 	/**
 	 * Cast instruction constructor.
-	 * 
+	 *
 	 * @param typeTypeId
 	 *            the id of the type to cast into.
 	 * @param baseTypeName
@@ -56,10 +56,7 @@
 	 */
 	@Override
 	public void execute() throws CoreException {
-		Object popValue = popValue();
-		if (!(popValue instanceof IJavaValue))
-			return;
-		IJavaValue value = (IJavaValue) popValue;
+		IJavaValue value = popValue();
 
 		if (value instanceof IJavaPrimitiveValue) {
 			IJavaPrimitiveValue primitiveValue = (IJavaPrimitiveValue) value;
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/CompoundInstruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/CompoundInstruction.java
index 7b3830a..ebcbd4e 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/CompoundInstruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/CompoundInstruction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 
 	/**
 	 * Constructor for CompoundInstruction.
-	 * 
+	 *
 	 * @param start
 	 */
 	protected CompoundInstruction(int start) {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ConditionalJump.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ConditionalJump.java
index c28b839..0f02f72 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ConditionalJump.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ConditionalJump.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jacob Saoumi - Bug 434722 error in ConditionalJump Instruction
@@ -28,10 +28,7 @@
 	 */
 	@Override
 	public void execute() throws CoreException {
-		Object popValue = popValue();
-		if (!(popValue instanceof IJavaValue))
-			return;
-		IJavaValue conditionValue = (IJavaValue) popValue;
+		IJavaValue conditionValue = popValue();
 		IJavaPrimitiveValue condition = null;
 		if (conditionValue instanceof IJavaPrimitiveValue) {
 			condition = (IJavaPrimitiveValue) conditionValue;
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Constructor.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Constructor.java
index 72f4911..27f9aff 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Constructor.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Constructor.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -34,10 +34,7 @@
 		IJavaValue[] args = new IJavaValue[fArgCount];
 		// args are in reverse order
 		for (int i = fArgCount - 1; i >= 0; i--) {
-			Object popValue = popValue();
-			if (popValue instanceof IJavaValue) {
-				args[i] = (IJavaValue) popValue;
-			}
+			args[i] = popValue();
 		}
 		IJavaClassType clazz = (IJavaClassType) pop();
 		IJavaValue result = clazz.newInstance(fSignature, args, getContext()
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideAssignmentOperator.java
index 858ddc9..a7e9eea 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideOperator.java
index 19c0a8d..ec4cf86 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DivideOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Dup.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Dup.java
index 06a9f69..6e3c949 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Dup.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Dup.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,19 +14,19 @@
 
 /**
  * Duplicate the top element of the stack
- * 
+ *
  * Element ...
- * 
+ *
  * ->
- * 
+ *
  * Element Element ...
- * 
+ *
  */
 public class Dup extends SimpleInstruction {
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction#execute
 	 * ()
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DupX1.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DupX1.java
index 9854a14..955f2ff 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DupX1.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/DupX1.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,19 +15,19 @@
 /**
  * Duplicate the top element of the stack and put in it behind the second
  * element of the stack.
- * 
+ *
  * Element1 Element2 ...
- * 
+ *
  * ->
- * 
+ *
  * Element1 Element2 Element3 ...
- * 
+ *
  */
 public class DupX1 extends SimpleInstruction {
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction#execute
 	 * ()
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterEqualOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterEqualOperator.java
index e39e512..4e5fbe4 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterEqualOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterEqualOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterOperator.java
index 1f7796f..4bfba7c 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/GreaterOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstanceOfOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstanceOfOperator.java
index f4f04b4..4697334 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstanceOfOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstanceOfOperator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -34,10 +34,7 @@
 	@Override
 	public void execute() throws CoreException {
 		IJavaType type = (IJavaType) pop();
-		Object popValue = popValue();
-		if (!(popValue instanceof IJavaValue))
-			return;
-		IJavaValue value = (IJavaValue) popValue;
+		IJavaValue value = popValue();
 		if (value instanceof JDINullValue) {
 			pushNewValue(false);
 			return;
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Instruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Instruction.java
index 9a9011c..68754e7 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Instruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Instruction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -65,7 +65,7 @@
 
 	/**
 	 * Return the internal variable with the given name.
-	 * 
+	 *
 	 * @see Interpreter#getInternalVariable(String)
 	 */
 	protected IVariable getInternalVariable(String name) {
@@ -75,7 +75,7 @@
 	/**
 	 * Create and return a new internal variable with the given name and the
 	 * given type.
-	 * 
+	 *
 	 * @see Interpreter#createInternalVariable(String, String)
 	 */
 	protected IVariable createInternalVariable(String name,
@@ -105,12 +105,12 @@
 		return fInterpreter.pop();
 	}
 
-	protected Object popValue() throws CoreException {
+	protected IJavaValue popValue() throws CoreException {
 		Object element = fInterpreter.pop();
 		if (element instanceof IJavaVariable) {
-			return ((IJavaVariable) element).getValue();
+			return (IJavaValue) ((IJavaVariable) element).getValue();
 		}
-		return  element;
+		return (IJavaValue) element;
 	}
 
 	protected void pushNewValue(boolean value) {
@@ -215,7 +215,7 @@
 
 	/**
 	 * Returns the primitive type with the given name.
-	 * 
+	 *
 	 * @param name
 	 *            type name, for example - "int"
 	 * @return primitive type
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionSequence.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionSequence.java
index c4fd3c0..0a163f2 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionSequence.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionSequence.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,8 +30,8 @@
 	private CoreException fException;
 
 	public InstructionSequence(String snippet) {
-		fInstructions = new ArrayList<Instruction>(10);
-		fErrors = new ArrayList<String>();
+		fInstructions = new ArrayList<>(10);
+		fErrors = new ArrayList<>();
 		fSnippet = snippet;
 	}
 
@@ -131,7 +131,7 @@
 	 * Inserts the instruction at the given index. If the index is less than 0
 	 * or greater than the current instruction count, the instruction is added
 	 * at the end of the sequence.
-	 * 
+	 *
 	 * Instructs the instructions to update their program counters.
 	 */
 	public void insert(Instruction instruction, int index) {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionsEvaluationMessages.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionsEvaluationMessages.java
index 15f3a7e..9ff135c 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionsEvaluationMessages.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/InstructionsEvaluationMessages.java
@@ -3,8 +3,8 @@
  * program and the accompanying materials are made available under the terms of
  * the Eclipse Public License v1.0 which accompanies this distribution, and is
  * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
+ *
+ * Contributors:
  * IBM - Initial API and implementation
  **********************************************************************/
 package org.eclipse.jdt.internal.debug.eval.ast.instructions;
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Jump.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Jump.java
index fadd501..b625e54 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Jump.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Jump.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftAssignmentOperator.java
index b1f009e..ef9e357 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftOperator.java
index 727004e..49d533c 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LeftShiftOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessEqualOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessEqualOperator.java
index fe9ab30..53bf45b 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessEqualOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessEqualOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessOperator.java
index 93ef365..5db8599 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LessOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LocalVariableCreation.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LocalVariableCreation.java
index e12c865..5c5491a 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LocalVariableCreation.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/LocalVariableCreation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,6 @@
 package org.eclipse.jdt.internal.debug.eval.ast.instructions;
 
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.core.model.IVariable;
 import org.eclipse.jdi.internal.PrimitiveTypeImpl;
 import org.eclipse.jdi.internal.VirtualMachineImpl;
@@ -52,7 +51,7 @@
 
 	/**
 	 * Constructor for LocalVariableCreation.
-	 * 
+	 *
 	 * @param name
 	 *            the name of the variable to create.
 	 * @param typeSignature
@@ -104,9 +103,7 @@
 		}
 		IVariable var = createInternalVariable(fName, type);
 		if (fHasInitializer) {
-			Object value = popValue();
-			if (value instanceof IValue)
-				var.setValue((IValue) value);
+			var.setValue(popValue());
 		}
 	}
 
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusAssignmentOperator.java
index 667bbc8..6b603b7 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusOperator.java
index 44f87f4..6752486 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MinusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyAssignmentOperator.java
index 3ebfe3c..88864dd 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyOperator.java
index 363597d..8879ebc 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/MultiplyOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NoOp.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NoOp.java
index 2211e4b..bc87b86 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NoOp.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NoOp.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NotOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NotOperator.java
index 52c718a..2976050 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NotOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/NotOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrAssignmentOperator.java
index 220c490..daec899 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrOperator.java
index 0321a47..334b77f 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/OrOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusAssignmentOperator.java
index 33f9cd0..e5e8d30 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusOperator.java
index 38e9b59..8390485 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PlusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Pop.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Pop.java
index 010f879..c02be29 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Pop.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Pop.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction#getSize
 	 * ()
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixMinusMinusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixMinusMinusOperator.java
index 3341d7d..ee2a843 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixMinusMinusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixMinusMinusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixPlusPlusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixPlusPlusOperator.java
index d47c133..f9743e4 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixPlusPlusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PostfixPlusPlusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixMinusMinusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixMinusMinusOperator.java
index 5fa8da0..a541831 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixMinusMinusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixMinusMinusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixPlusPlusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixPlusPlusOperator.java
index b456f90..915457d 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixPlusPlusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PrefixPlusPlusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayLength.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayLength.java
index 7d157fb..5a77409 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayLength.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayLength.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayType.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayType.java
index 6694619..f3ec5a4 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayType.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushArrayType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushBoolean.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushBoolean.java
index 4f253ae..d2b84e2 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushBoolean.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushBoolean.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushChar.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushChar.java
index 1a3dcad..fbaeefb 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushChar.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushChar.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushClassLiteralValue.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushClassLiteralValue.java
index 73c2fd8..dfbe49e 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushClassLiteralValue.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushClassLiteralValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushDouble.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushDouble.java
index ee89be4..ac7a946 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushDouble.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushDouble.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFieldVariable.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFieldVariable.java
index ea7764f..2053618 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFieldVariable.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFieldVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,7 +17,6 @@
 import org.eclipse.jdt.debug.core.IJavaObject;
 import org.eclipse.jdt.debug.core.IJavaVariable;
 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
-import org.eclipse.jdt.internal.debug.core.model.JDIClassType;
 import org.eclipse.jdt.internal.debug.core.model.JDINullValue;
 import org.eclipse.jdt.internal.debug.core.model.JDIObjectValue;
 import org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext;
@@ -56,17 +55,15 @@
 					JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
 					InstructionsEvaluationMessages.PushFieldVariable_0, null));
 		}
+		IJavaObject receiver = (IJavaObject) value;
+
 		IJavaVariable field = null;
-		if (value instanceof JDIClassType ) {
-			field = ((JDIClassType) value).getField(fName);
-		} else if (value instanceof IJavaObject){
-			IJavaObject receiver = (IJavaObject) value;
-			if (fDeclaringTypeSignature == null) {
-				field = ((JDIObjectValue) receiver).getField(fName,
-						fSuperClassLevel);
-			} else {
-				field = receiver.getField(fName, fDeclaringTypeSignature);
-			}
+
+		if (fDeclaringTypeSignature == null) {
+			field = ((JDIObjectValue) receiver).getField(fName,
+					fSuperClassLevel);
+		} else {
+			field = receiver.getField(fName, fDeclaringTypeSignature);
 		}
 
 		if (field == null) {
@@ -91,7 +88,7 @@
 							IStatus.OK,
 							NLS.bind(InstructionsEvaluationMessages.PushFieldVariable_Cannot_find_the_field__0__for_the_object__1__1,
 											new String[] { fName,
-													value.toString() }),
+													receiver.toString() }),
 							null)); //
 		}
 		push(field);
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFloat.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFloat.java
index 68169ed..04408a9 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFloat.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushFloat.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushInt.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushInt.java
index 9489381..309df6d 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushInt.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushInt.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLocalVariable.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLocalVariable.java
index 827b31e..c91820a 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLocalVariable.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLocalVariable.java
@@ -72,7 +72,7 @@
 
 	/**
 	 * Returns the name of the variable to push onto the stack.
-	 * 
+	 *
 	 * @return the name of the variable to push onto the stack
 	 */
 	protected String getName() {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLong.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLong.java
index 799a682..f1cf72d 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLong.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushLong.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushNull.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushNull.java
index 670eb70..263002a 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushNull.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushNull.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushPrimitiveType.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushPrimitiveType.java
index eb81df0..2984963 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushPrimitiveType.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushPrimitiveType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,7 +14,7 @@
 
 /**
  * Pushes a primitive type onto the stack.
- * 
+ *
  * @since 3.4
  */
 public class PushPrimitiveType extends SimpleInstruction {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushString.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushString.java
index 48b1d45..e982e52 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushString.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushString.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushThis.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushThis.java
index f933ab0..3a53829 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushThis.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushThis.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushType.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushType.java
index 641101c..fb1c575 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushType.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/PushType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderAssignmentOperator.java
index 684f808..9b69ca5 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderOperator.java
index ef31878..1cfee87 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RemainderOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ReturnInstruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ReturnInstruction.java
index b34e97d..b5a8ccc 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ReturnInstruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ReturnInstruction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -14,7 +14,7 @@
 
 	/**
 	 * Constructor for ReturnInstruction.
-	 * 
+	 *
 	 * @param start
 	 */
 	public ReturnInstruction(int start) {
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftAssignmentOperator.java
index d007172..c0cfdee 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftOperator.java
index 18ebf86..9c3c559 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RightShiftOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RuntimeSignature.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RuntimeSignature.java
index cfe3b87..297e6d7 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RuntimeSignature.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/RuntimeSignature.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendMessage.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendMessage.java
index cbcd065..02811f9 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendMessage.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendMessage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -44,9 +44,7 @@
 		IJavaValue[] args = new IJavaValue[fArgCount];
 		// args are in reverse order
 		for (int i = fArgCount - 1; i >= 0; i--) {
-			Object popValue = popValue();
-			if ((popValue instanceof IJavaValue))
-				args[i] = (IJavaValue) popValue;
+			args[i] = popValue();
 		}
 		Object receiver = pop();
 		IJavaValue result = null;
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendStaticMessage.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendStaticMessage.java
index a26c735..75925f7 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendStaticMessage.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SendStaticMessage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -46,9 +46,7 @@
 		IJavaValue[] args = new IJavaValue[fArgCount];
 		// args are in reverse order
 		for (int i = fArgCount - 1; i >= 0; i--) {
-			Object popValue = popValue();
-			if ((popValue instanceof IJavaValue))
-				args[i] = (IJavaValue) popValue;
+			args[i] = popValue();
 		}
 
 		IJavaType receiver = getType(fTypeName);
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SimpleInstruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SimpleInstruction.java
index 8512282..7951e41 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SimpleInstruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/SimpleInstruction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ThrowInstruction.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ThrowInstruction.java
index f45e2ae..b63bf7c 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ThrowInstruction.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/ThrowInstruction.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/TwiddleOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/TwiddleOperator.java
index 85e4d67..3e3b856 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/TwiddleOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/TwiddleOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryMinusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryMinusOperator.java
index 06041fa..fea8903 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryMinusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryMinusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryOperator.java
index 1de1a11..7904cdc 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryPlusOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryPlusOperator.java
index 2dfc0be..99d03ff 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryPlusOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnaryPlusOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftAssignmentOperator.java
index 7008f96..e3d7bd6 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftOperator.java
index e36f488..be51f24 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/UnsignedRightShiftOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Value.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Value.java
index febf9a4..1229870 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Value.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/Value.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction#execute
 	 * ()
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XfixOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XfixOperator.java
index 2355cc8..036653d 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XfixOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XfixOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorAssignmentOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorAssignmentOperator.java
index 9b43567..e87e53e 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorAssignmentOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorAssignmentOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorOperator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorOperator.java
index 7beca7a..1323a44 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorOperator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/instructions/XorOperator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/AbsentInformationException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/AbsentInformationException.java
index ca0625e..2609a46 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/AbsentInformationException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/AbsentInformationException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Accessible.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Accessible.java
index 5fc51fc..d10919c 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Accessible.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Accessible.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayReference.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayReference.java
index e0aa7e8..b5b7334 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayReference.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayReference.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayType.java
index 95214d5..72c4170 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ArrayType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanType.java
index b35d356..e8fe4ae 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanValue.java
index a0224a8..6c44d97 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/BooleanValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Bootstrap.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Bootstrap.java
index d259acc..af7efe9 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Bootstrap.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Bootstrap.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteType.java
index 224d65d..fdcbee5 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteValue.java
index 2bc615a..6752466 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ByteValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharType.java
index f868772..bb9375b 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharValue.java
index 347756d..33ab55a 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/CharValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassLoaderReference.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassLoaderReference.java
index 834cb58..4fdaca5 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassLoaderReference.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassLoaderReference.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotLoadedException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotLoadedException.java
index 36c4e87..5289f99 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotLoadedException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotLoadedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotPreparedException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotPreparedException.java
index 40f8231..778df65 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotPreparedException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassNotPreparedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassObjectReference.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassObjectReference.java
index ad8a8a4..0a378ef 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassObjectReference.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassObjectReference.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassType.java
index 963f02c..046e4b8 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ClassType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleType.java
index e243a70..b7ea3e1 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleValue.java
index 245974b..72fd483 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/DoubleValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Field.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Field.java
index e0c0a82..fa84384 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Field.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Field.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatType.java
index 69cf955..e633176 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatValue.java
index e57a786..40a50e0 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/FloatValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IncompatibleThreadStateException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IncompatibleThreadStateException.java
index 18dc852..d87da64 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IncompatibleThreadStateException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IncompatibleThreadStateException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InconsistentDebugInfoException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InconsistentDebugInfoException.java
index e9660fe..68ea2c5 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InconsistentDebugInfoException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InconsistentDebugInfoException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerType.java
index 7fa6c65..091d1b0 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerValue.java
index 3785fc5..68d3cd5 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/IntegerValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InterfaceType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InterfaceType.java
index 9b73e01..7267cf6 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InterfaceType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InterfaceType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InternalException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InternalException.java
index 3a3f6ba..89447ec 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InternalException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InternalException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidCodeIndexException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidCodeIndexException.java
index 176e44c..ca81ff9 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidCodeIndexException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidCodeIndexException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidLineNumberException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidLineNumberException.java
index 183d987..41d5318 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidLineNumberException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidLineNumberException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidStackFrameException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidStackFrameException.java
index 1e3b0c6..4273777 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidStackFrameException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidStackFrameException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidTypeException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidTypeException.java
index 9079e08..0373b01 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidTypeException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvalidTypeException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvocationException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvocationException.java
index 3f01e2e..d6bf6e1 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvocationException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/InvocationException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/JDIPermission.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/JDIPermission.java
index ffa4b3a..9afb9bd 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/JDIPermission.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/JDIPermission.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LocalVariable.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LocalVariable.java
index f4d062e..6e0e3b5 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LocalVariable.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LocalVariable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Locatable.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Locatable.java
index 1ff8e79..3429562 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Locatable.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Locatable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Location.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Location.java
index 4bc3aba..829d260 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Location.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Location.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongType.java
index 2f28ae1..5aee0db 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongValue.java
index 8e2a93f..f9e80fd 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/LongValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Method.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Method.java
index a880703..7a111ce 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Method.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Method.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Mirror.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Mirror.java
index 2ea3f6a..4ca309c 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Mirror.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Mirror.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/MonitorInfo.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/MonitorInfo.java
index 02a937d..d5a5db8 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/MonitorInfo.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/MonitorInfo.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/NativeMethodException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/NativeMethodException.java
index 6996a8b..fde6f91 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/NativeMethodException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/NativeMethodException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ObjectCollectedException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ObjectCollectedException.java
index 8fec828..961cab4 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ObjectCollectedException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ObjectCollectedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PathSearchingVirtualMachine.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PathSearchingVirtualMachine.java
index d4d304d..7dd4fdb 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PathSearchingVirtualMachine.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PathSearchingVirtualMachine.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveType.java
index 7b150af..7f0bb56 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveValue.java
index ffd8367..9209367 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/PrimitiveValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortType.java
index cf66fe4..2cfbd86 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortValue.java
index 002c71e..a96889e 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ShortValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/StringReference.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/StringReference.java
index 9b5d811..8ea8a83 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/StringReference.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/StringReference.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ThreadGroupReference.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ThreadGroupReference.java
index 8db51cc..ebcf2c6 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ThreadGroupReference.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/ThreadGroupReference.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Type.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Type.java
index 63d80be..311f56c 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Type.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Type.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/TypeComponent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/TypeComponent.java
index 781e6bb..b4bebcb 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/TypeComponent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/TypeComponent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMCannotBeModifiedException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMCannotBeModifiedException.java
index f5d4bc4..fff82ab 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMCannotBeModifiedException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMCannotBeModifiedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMDisconnectedException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMDisconnectedException.java
index 219053d..2887572 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMDisconnectedException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMDisconnectedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMMismatchException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMMismatchException.java
index 8148759..ff0032f 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMMismatchException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMMismatchException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMOutOfMemoryException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMOutOfMemoryException.java
index be96116..e2ea443 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMOutOfMemoryException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VMOutOfMemoryException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Value.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Value.java
index 54116e9..86f35fc 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Value.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/Value.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VirtualMachineManager.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VirtualMachineManager.java
index db1f3e2..7d043a3 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VirtualMachineManager.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VirtualMachineManager.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidType.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidType.java
index 0ab1a84..0033773 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidType.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidValue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidValue.java
index 00a9740..cb78778 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidValue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/VoidValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/AttachingConnector.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/AttachingConnector.java
index 31b08d0..6a159d8 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/AttachingConnector.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/AttachingConnector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Connector.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Connector.java
index 414353e..3cdd615 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Connector.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Connector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/IllegalConnectorArgumentsException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/IllegalConnectorArgumentsException.java
index db3981f..ef1e0f6 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/IllegalConnectorArgumentsException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/IllegalConnectorArgumentsException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,7 +31,7 @@
 
 	public IllegalConnectorArgumentsException(String message, String argName) {
 		super(message);
-		fNames = new ArrayList<String>(1);
+		fNames = new ArrayList<>(1);
 		fNames.add(argName);
 	}
 
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/LaunchingConnector.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/LaunchingConnector.java
index 3b77e88..4e8f11a 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/LaunchingConnector.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/LaunchingConnector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/ListeningConnector.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/ListeningConnector.java
index 0584abc..d6d6d01 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/ListeningConnector.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/ListeningConnector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Transport.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Transport.java
index 1d78c23..de19f31 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Transport.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/Transport.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/TransportTimeoutException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/TransportTimeoutException.java
index 6339c74..a0909d3 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/TransportTimeoutException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/TransportTimeoutException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/VMStartException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/VMStartException.java
index 40ecc9e..35b685d 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/VMStartException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/VMStartException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/ClosedConnectionException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/ClosedConnectionException.java
index e5182f4..a497fbb 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/ClosedConnectionException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/ClosedConnectionException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/Connection.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/Connection.java
index c61a5ee..6d13bff 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/Connection.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/Connection.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/TransportService.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/TransportService.java
index 609d7d0..b4db216 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/TransportService.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/connect/spi/TransportService.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/AccessWatchpointEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/AccessWatchpointEvent.java
index 220d2a7..496cc60 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/AccessWatchpointEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/AccessWatchpointEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/BreakpointEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/BreakpointEvent.java
index e7a8923..7e6e073 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/BreakpointEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/BreakpointEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassPrepareEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassPrepareEvent.java
index cc222ac..ccac13b 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassPrepareEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassPrepareEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassUnloadEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassUnloadEvent.java
index 5b7cab2..42dd4b8 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassUnloadEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ClassUnloadEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/Event.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/Event.java
index 4a5134b..eda4e6b 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/Event.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/Event.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventIterator.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventIterator.java
index ea17178..c3ad8c9 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventIterator.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventIterator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventQueue.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventQueue.java
index bc74c07..520bac0 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventQueue.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventQueue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventSet.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventSet.java
index deb72f4..40178e8 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventSet.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/EventSet.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ExceptionEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ExceptionEvent.java
index 2385d76..6fa47c5 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ExceptionEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ExceptionEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/LocatableEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/LocatableEvent.java
index cd779c3..4b8e162 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/LocatableEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/LocatableEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MethodEntryEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MethodEntryEvent.java
index 849ad6d..b29d1a7 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MethodEntryEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MethodEntryEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ModificationWatchpointEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ModificationWatchpointEvent.java
index 5c9cf26..b21b371 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ModificationWatchpointEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ModificationWatchpointEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnterEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnterEvent.java
index b40453a..aaa9fba 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnterEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnterEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnteredEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnteredEvent.java
index 6d08541..b254810 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnteredEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorContendedEnteredEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitEvent.java
index abbac25..0bc7a2d 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitedEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitedEvent.java
index d19decf..f6d051e 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitedEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/MonitorWaitedEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/StepEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/StepEvent.java
index 086b3ca..f371f5b 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/StepEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/StepEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadDeathEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadDeathEvent.java
index 663bb87..b788258 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadDeathEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadDeathEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadStartEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadStartEvent.java
index 5071afd..e386d98 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadStartEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/ThreadStartEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDeathEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDeathEvent.java
index 10ed854..f19238a 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDeathEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDeathEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDisconnectEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDisconnectEvent.java
index 2063a55..4dcf898 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDisconnectEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMDisconnectEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMStartEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMStartEvent.java
index e0f190e..8f97d74 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMStartEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/VMStartEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/WatchpointEvent.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/WatchpointEvent.java
index e2d986a..cac4b52 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/WatchpointEvent.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/event/WatchpointEvent.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/AccessWatchpointRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/AccessWatchpointRequest.java
index 989194b..56060fb 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/AccessWatchpointRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/AccessWatchpointRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/BreakpointRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/BreakpointRequest.java
index 80261d7..94dc17d 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/BreakpointRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/BreakpointRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ClassUnloadRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ClassUnloadRequest.java
index 7162f55..fc4567a 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ClassUnloadRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ClassUnloadRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/DuplicateRequestException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/DuplicateRequestException.java
index d06a253..fe20e3e 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/DuplicateRequestException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/DuplicateRequestException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequest.java
index 0490569..08b39c7 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequestManager.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequestManager.java
index 75134af..941de0e 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequestManager.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/EventRequestManager.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ExceptionRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ExceptionRequest.java
index 16e1a4b..00b827a 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ExceptionRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ExceptionRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/InvalidRequestStateException.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/InvalidRequestStateException.java
index 65c46a2..81dccfa 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/InvalidRequestStateException.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/InvalidRequestStateException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodEntryRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodEntryRequest.java
index b2298c0..8ee7324 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodEntryRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodEntryRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodExitRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodExitRequest.java
index 0649580..c76c461 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodExitRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MethodExitRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ModificationWatchpointRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ModificationWatchpointRequest.java
index 83431f4..e691d58 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ModificationWatchpointRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ModificationWatchpointRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnterRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnterRequest.java
index bb46e1f..92bce9a 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnterRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnterRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnteredRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnteredRequest.java
index eca31c6..301f5ae 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnteredRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorContendedEnteredRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitRequest.java
index 38ed2f8..ce7c029 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitedRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitedRequest.java
index 4b9819a..8db2231 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitedRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/MonitorWaitedRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/StepRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/StepRequest.java
index 2a2ba5c..86d4e1d 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/StepRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/StepRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadDeathRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadDeathRequest.java
index 8dcb506..5a353a1 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadDeathRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadDeathRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadStartRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadStartRequest.java
index 669b6c5..9305e06 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadStartRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/ThreadStartRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/VMDeathRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/VMDeathRequest.java
index 86def1e..ab32de3 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/VMDeathRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/VMDeathRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/WatchpointRequest.java b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/WatchpointRequest.java
index 7cfe279..c389cdf 100644
--- a/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/WatchpointRequest.java
+++ b/org.eclipse.jdt.debug/jdi interfaces/com/sun/jdi/request/WatchpointRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/Bootstrap.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/Bootstrap.java
index f0fec0b..216ec82 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/Bootstrap.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/Bootstrap.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/TimeoutException.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/TimeoutException.java
index 33403b6..33c53cb 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/TimeoutException.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/TimeoutException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/VirtualMachine.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/VirtualMachine.java
index 6140a39..0879aad 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/VirtualMachine.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/VirtualMachine.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,7 +13,7 @@
 public interface VirtualMachine {
 	/**
 	 * Sets request timeout in milliseconds
-	 * 
+	 *
 	 * @param timeout the timeout for the request
 	 */
 	public void setRequestTimeout(int timeout);
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/EventRequestManager.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/EventRequestManager.java
index 1b44ae6..c160534 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/EventRequestManager.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/EventRequestManager.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -35,7 +35,7 @@
 	 * operation. This in recognition that the VM may be in an awkward state and
 	 * unable to comply. For example, execution is suspended in a native method
 	 * and the arguments would be unavailable on return .
-	 * 
+	 *
 	 * @param thread
 	 *            the thread in which to step
 	 * @return the created {@link ReenterStepRequest}
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/OperationRefusedException.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/OperationRefusedException.java
index 347bf97..85f4395 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/OperationRefusedException.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/OperationRefusedException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReenterStepRequest.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReenterStepRequest.java
index c17b7c4..691dfc4 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReenterStepRequest.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReenterStepRequest.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -36,14 +36,14 @@
  * Note that other events may need to be reported as well (e.g., hit breakpoint
  * on first instruction). Execution does not reenter the caller at any point; so
  * no step out or step into events are reported.
- * 
+ *
  */
 public interface ReenterStepRequest extends StepRequest {
 	/**
 	 * Restricts the events generated by this request to those whose location is
 	 * in a class whose name does NOT match this restricted regular expression.
 	 * e.g. "java.*" or "*.Foo".
-	 * 
+	 *
 	 * @param classPattern
 	 *            the pattern String to filter against.
 	 */
@@ -53,7 +53,7 @@
 	/**
 	 * Restricts the events generated by this request to those whose location is
 	 * in this class..
-	 * 
+	 *
 	 * @param clazz
 	 *            the class to filter on.
 	 */
@@ -64,7 +64,7 @@
 	 * Restricts the events generated by this request to those whose location is
 	 * in a class whose name matches this restricted regular expression. e.g.
 	 * "java.*" or "*.Foo".
-	 * 
+	 *
 	 * @param classPattern
 	 *            the pattern String to filter for.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReferenceType.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReferenceType.java
index 935c657..b74deb3 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReferenceType.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ReferenceType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -54,16 +54,16 @@
 	 * <p>
 	 * @return the CRC-32 of the entire class file contents for this reference
 	 * type.
-	 * 
+	 *
 	 * @see org.eclipse.jdi.hcr.VirtualMachine#classesHaveChanged
 	 */
 	public int getClassFileVersion();
 
 	/**
 	 * Returns whether this reference type is eligible for hot code replacement.
-	 * 
+	 *
 	 * @return whether this reference type is eligible for hot code replacement
-	 * 
+	 *
 	 * @see org.eclipse.jdi.hcr.ReferenceType#getClassFileVersion
 	 */
 	public boolean isHCREligible();
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ThreadReference.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ThreadReference.java
index 4068992..735eeac 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ThreadReference.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/ThreadReference.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -55,9 +55,9 @@
 	 * Note that a <code>finally</code> block manifests itself as (and is
 	 * indistinguishable from) a <code>catch Throwable</code> block.
 	 * <code>synchronized</code> statements also compile to a
-	 * <code> catch Throwable block<code>.The target program may inadventently 
-	 * end up catching this exception. 
-	 * 
+	 * <code> catch Throwable block<code>.The target program may inadventently
+	 * end up catching this exception.
+	 *
 	 * Since the choices each have their pros and cons, making the decision
 	 * is left to the debugger. However the later option is the  recommended choice.
 	 * <p>
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/VirtualMachine.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/VirtualMachine.java
index b28b81b..fb88bf1 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/VirtualMachine.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/hcr/VirtualMachine.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 	/**
 	 * Determines if this implementation supports the early return of the top
 	 * stack frame of a thread.
-	 * 
+	 *
 	 * @return <code>true</code> if the feature is supported, <code>false</code>
 	 *         otherwise.
 	 */
@@ -33,7 +33,7 @@
 	/**
 	 * Determines if this implementation supports the retrieval of a class file
 	 * version.
-	 * 
+	 *
 	 * @return <code>true</code> if the feature is supported, <code>false</code>
 	 *         otherwise.
 	 */
@@ -41,7 +41,7 @@
 
 	/**
 	 * Determines if this implementation supports the reenter stepping.
-	 * 
+	 *
 	 * @return <code>true</code> if the feature is supported, <code>false</code>
 	 *         otherwise.
 	 */
@@ -50,7 +50,7 @@
 	/**
 	 * Determines if this implementation supports the replacement of classes on
 	 * the fly.
-	 * 
+	 *
 	 * @return <code>true</code> if the feature is supported, <code>false</code>
 	 *         otherwise.
 	 */
@@ -144,7 +144,7 @@
 	 * whether it was ignored (for example if the VM doesn't support this kind
 	 * of replacement), or whether the operation failed and the VM should be
 	 * restarted
-	 * 
+	 *
 	 */
 	public int classesHaveChanged(String[] arg1);
 }
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/AccessibleImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/AccessibleImpl.java
index c4e3464..7aedc04 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/AccessibleImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/AccessibleImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class AccessibleImpl extends MirrorImpl implements Accessible {
 	/** Modifier bit flag: Is synthetic. see MODIFIER_ACC_SYNTHETIC. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayReferenceImpl.java
index 81782f4..090eaf3 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayReferenceImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -35,7 +35,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ArrayReferenceImpl extends ObjectReferenceImpl implements
 		ArrayReference {
@@ -83,8 +83,8 @@
 
 	/**
 	 * Gets all of the values starting at firstIndex and ending at firstIndex+length
-	 *  
-	 * @param firstIndex the start 
+	 *
+	 * @param firstIndex the start
 	 * @param length the  number of values to return
 	 * @return the list of {@link Value}s
 	 * @throws IndexOutOfBoundsException if the index is outside the bounds of the array
@@ -182,14 +182,14 @@
 	/**
 	 * Reads the given length of objects from the given stream
 	 * @param length the number of objects to read
-	 * @param in the stream to read from 
+	 * @param in the stream to read from
 	 * @return the {@link List} of {@link ValueImpl}s
 	 * @throws IOException if the reading fails
 	 * @returns Returns sequence of object reference values.
 	 */
 	private List<Value> readObjectSequence(int length, DataInputStream in)
 			throws IOException {
-		List<Value> elements = new ArrayList<Value>(length);
+		List<Value> elements = new ArrayList<>(length);
 		for (int i = 0; i < length; i++) {
 			ValueImpl value = ObjectReferenceImpl
 					.readObjectRefWithTag(this, in);
@@ -211,7 +211,7 @@
 	 */
 	private List<Value> readPrimitiveSequence(int length, int type, DataInputStream in)
 			throws IOException {
-		List<Value> elements = new ArrayList<Value>(length);
+		List<Value> elements = new ArrayList<>(length);
 		for (int i = 0; i < length; i++) {
 			ValueImpl value = ValueImpl.readWithoutTag(this, type, in);
 			elements.add(value);
@@ -231,7 +231,7 @@
 						JdwpCommandPacket.AR_LENGTH, this);
 				defaultReplyErrorHandler(replyPacket.errorCode());
 				DataInputStream replyData = replyPacket.dataInStream();
-				fLength = readInt("length", replyData); //$NON-NLS-1$ 
+				fLength = readInt("length", replyData); //$NON-NLS-1$
 			} catch (IOException e) {
 				defaultIOExceptionHandler(e);
 				return 0;
@@ -244,7 +244,7 @@
 
 	/**
 	 * Replaces an array component with another value.
-	 * 
+	 *
 	 * @param index
 	 *            the index to set the value in
 	 * @param value
@@ -260,14 +260,14 @@
 	@Override
 	public void setValue(int index, Value value) throws InvalidTypeException,
 			ClassNotLoadedException {
-		ArrayList<Value> list = new ArrayList<Value>(1);
+		ArrayList<Value> list = new ArrayList<>(1);
 		list.add(value);
 		setValues(index, list, 0, 1);
 	}
 
 	/**
 	 * Replaces all array components with other values.
-	 * 
+	 *
 	 * @param values
 	 *            the new values to set in the array
 	 * @throws InvalidTypeException
@@ -286,7 +286,7 @@
 
 	/**
 	 * Replaces a range of array components with other values.
-	 * 
+	 *
 	 * @param index
 	 *            offset in this array to start replacing values at
 	 * @param values
@@ -383,7 +383,7 @@
 	/**
 	 * Check the type and the VM of the values. If the given type is a primitive
 	 * type, the values may be converted to match this type.
-	 * 
+	 *
 	 * @param values
 	 *            the value(s) to check
 	 * @param type
@@ -392,12 +392,12 @@
 	 * @throws InvalidTypeException
 	 *             if the underlying type of an object in the list is not
 	 *             compatible
-	 * 
+	 *
 	 * @see ValueImpl#checkValue(Value, Type, VirtualMachineImpl)
 	 */
 	private List<Value> checkValues(List<? extends Value> values, Type type)
 			throws InvalidTypeException {
-		List<Value> checkedValues = new ArrayList<Value>(values.size());
+		List<Value> checkedValues = new ArrayList<>(values.size());
 		Iterator<? extends Value> iterValues = values.iterator();
 		while (iterValues.hasNext()) {
 			checkedValues.add(ValueImpl.checkValue(iterValues.next(),
@@ -408,7 +408,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdi.internal.ObjectReferenceImpl#toString()
 	 */
 	@Override
@@ -423,7 +423,7 @@
 			return buf.toString();
 		} catch (ObjectCollectedException e) {
 			return JDIMessages.ArrayReferenceImpl__Garbage_Collected__ArrayReference_5
-					+ "[" + length() + "] " + idString(); //$NON-NLS-1$ //$NON-NLS-2$ 
+					+ "[" + length() + "] " + idString(); //$NON-NLS-1$ //$NON-NLS-2$
 		} catch (Exception e) {
 			return fDescription;
 		}
@@ -431,7 +431,7 @@
 
 	/**
 	 * Reads JDWP representation and returns new instance.
-	 * 
+	 *
 	 * @param target
 	 *            the target {@link Mirror} object
 	 * @param in
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayTypeImpl.java
index fb1f33f..a81b1a4 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ArrayTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ArrayTypeImpl extends ReferenceTypeImpl implements ArrayType {
 	/** JDWP Tag. */
@@ -216,7 +216,7 @@
 	@Override
 	public Map<Field, Value> getValues(List<? extends Field> fields) {
 		if (fields.isEmpty()) {
-			return new HashMap<Field, Value>();
+			return new HashMap<>();
 		}
 
 		throw new IllegalArgumentException(
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanTypeImpl.java
index 369d3b9..1c5fe01 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class BooleanTypeImpl extends PrimitiveTypeImpl implements BooleanType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanValueImpl.java
index c858dee..69bcb34 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/BooleanValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class BooleanValueImpl extends PrimitiveValueImpl implements
 		BooleanValue {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteTypeImpl.java
index 12d7fa2..8bb8b39 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ByteTypeImpl extends PrimitiveTypeImpl implements ByteType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteValueImpl.java
index bc37193..8a28c5d 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ByteValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ByteValueImpl extends PrimitiveValueImpl implements ByteValue, Comparable<ByteValue> {
 	/** JDWP Tag. */
@@ -52,7 +52,7 @@
 	public int compareTo(ByteValue o) {
 		return ((Byte)byteValue()).compareTo(o.byteValue());
 	}
-	
+
 	/**
 	 * @returns type of value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharTypeImpl.java
index b322805..939737c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class CharTypeImpl extends PrimitiveTypeImpl implements CharType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharValueImpl.java
index 06c4668..0203857 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/CharValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class CharValueImpl extends PrimitiveValueImpl implements CharValue, Comparable<CharValue> {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public int compareTo(CharValue o) {
 		return ((Character)charValue()).compareTo(o.charValue());
 	}
-	
+
 	/**
 	 * @returns Value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassLoaderReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassLoaderReferenceImpl.java
index 460844f..047ae22 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassLoaderReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassLoaderReferenceImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassLoaderReferenceImpl extends ObjectReferenceImpl implements ClassLoaderReference {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public List<ReferenceType> definedClasses() {
 		// Note that this information should not be cached.
 		List<ReferenceType> visibleClasses = visibleClasses();
-		List<ReferenceType> result = new ArrayList<ReferenceType>(visibleClasses.size());
+		List<ReferenceType> result = new ArrayList<>(visibleClasses.size());
 		Iterator<ReferenceType> iter = visibleClasses.iterator();
 		while (iter.hasNext()) {
 			try {
@@ -87,7 +87,7 @@
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			List<ReferenceType> elements = new ArrayList<ReferenceType>(nrOfElements);
+			List<ReferenceType> elements = new ArrayList<>(nrOfElements);
 			for (int i = 0; i < nrOfElements; i++) {
 				ReferenceTypeImpl elt = ReferenceTypeImpl.readWithTypeTag(this, replyData);
 				if (elt == null)
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassObjectReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassObjectReferenceImpl.java
index e235236..a812329 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassObjectReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassObjectReferenceImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassObjectReferenceImpl extends ObjectReferenceImpl implements
 		ClassObjectReference {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassTypeImpl.java
index 9a20028..9989725 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ClassTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
@@ -41,7 +41,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassTypeImpl extends ReferenceTypeImpl implements ClassType {
 
@@ -274,7 +274,7 @@
 	@Override
 	public List<ClassType> subclasses() {
 		// Note that this information should not be cached.
-		List<ClassType> subclasses = new ArrayList<ClassType>();
+		List<ClassType> subclasses = new ArrayList<>();
 		Iterator<ReferenceType> itr = virtualMachineImpl().allRefTypes();
 		while (itr.hasNext()) {
 			try {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleTypeImpl.java
index 0525ecf..a58f3a3 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class DoubleTypeImpl extends PrimitiveTypeImpl implements DoubleType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleValueImpl.java
index c0ac822..25d3672 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/DoubleValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class DoubleValueImpl extends PrimitiveValueImpl implements DoubleValue, Comparable<DoubleValue> {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public int compareTo(DoubleValue o) {
 		return ((Double)doubleValue()).compareTo(o.doubleValue());
 	}
-	
+
 	/**
 	 * @returns Value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FieldImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FieldImpl.java
index a8d4ebd..814f6a0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FieldImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FieldImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class FieldImpl extends TypeComponentImpl implements Field {
 	/** ID that corresponds to this reference. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatTypeImpl.java
index a421a4e..a16bfbe 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class FloatTypeImpl extends PrimitiveTypeImpl implements FloatType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatValueImpl.java
index cef4ed5..6f6064e 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/FloatValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class FloatValueImpl extends PrimitiveValueImpl implements FloatValue, Comparable<FloatValue> {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public int compareTo(FloatValue o) {
 		return ((Float)floatValue()).compareTo(o.floatValue());
 	}
-	
+
 	/**
 	 * @returns Value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/GenericSignature.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/GenericSignature.java
index 46d21bc..bb9ec3c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/GenericSignature.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/GenericSignature.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -43,7 +43,7 @@
 	}
 
 	private static List<String> getTypeSignatureList(String typeSignatureList) {
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		int pos = 0;
 		while (pos < typeSignatureList.length()) {
 			int signatureLength = nextTypeSignatureLength(typeSignatureList, pos);
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerTypeImpl.java
index ad8e5b8..c33998a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class IntegerTypeImpl extends PrimitiveTypeImpl implements IntegerType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerValueImpl.java
index 6fd8234..fcdfbe6 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/IntegerValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class IntegerValueImpl extends PrimitiveValueImpl implements IntegerValue, Comparable<IntegerValue> {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public int compareTo(IntegerValue o) {
 		return ((Integer)intValue()).compareTo(o.intValue());
 	}
-	
+
 	/**
 	 * @returns Value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/InterfaceTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/InterfaceTypeImpl.java
index 868faf1..65137b9 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/InterfaceTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/InterfaceTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
@@ -37,7 +37,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class InterfaceTypeImpl extends ReferenceTypeImpl implements
 		InterfaceType {
@@ -104,7 +104,7 @@
 	@Override
 	public List<ClassType> implementors() {
 		// Note that this information should not be cached.
-		List<ClassType> implementors = new ArrayList<ClassType>();
+		List<ClassType> implementors = new ArrayList<>();
 		Iterator<ReferenceType> itr = virtualMachineImpl().allRefTypes();
 		while (itr.hasNext()) {
 			ReferenceType refType = itr.next();
@@ -129,7 +129,7 @@
 	@Override
 	public List<InterfaceType> subinterfaces() {
 		// Note that this information should not be cached.
-		List<InterfaceType> implementors = new ArrayList<InterfaceType>();
+		List<InterfaceType> implementors = new ArrayList<>();
 		Iterator<ReferenceType> itr = virtualMachineImpl().allRefTypes();
 		while (itr.hasNext()) {
 			try {
@@ -200,7 +200,7 @@
 		return null;
 	}
 
-	
+
 	/**
 	 * @return Returns true if this type has been initialized.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocalVariableImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocalVariableImpl.java
index 5af76a4..196d8d2 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocalVariableImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocalVariableImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class LocalVariableImpl extends MirrorImpl implements LocalVariable, Comparable<LocalVariable> {
 	/** Method that holds local variable. */
@@ -65,7 +65,7 @@
 		fSlot = slot;
 		fIsArgument = isArgument;
 	}
-	
+
 	/**
 	 * @return Returns local variable's index in its frame.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocationImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocationImpl.java
index 3994014..be31ff8 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocationImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocationImpl.java
@@ -25,7 +25,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class LocationImpl extends MirrorImpl implements Location {
 	/** Line nr used if line numbers are not available. */
@@ -85,7 +85,7 @@
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Comparable#compareTo(java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongTypeImpl.java
index a7cc42f..d86d6a5 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class LongTypeImpl extends PrimitiveTypeImpl implements LongType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongValueImpl.java
index 18f8f6d..6c9f734 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LongValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class LongValueImpl extends PrimitiveValueImpl implements LongValue {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public int compareTo(LongValue o) {
 		return ((Long)longValue()).compareTo(o.longValue());
 	}
-	
+
 	/**
 	 * @returns Value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MethodImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MethodImpl.java
index 7e8696c..b61d475 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MethodImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MethodImpl.java
@@ -173,8 +173,8 @@
 			fLowestValidCodeIndex = readLong("lowest index", replyData); //$NON-NLS-1$
 			fHighestValidCodeIndex = readLong("highest index", replyData); //$NON-NLS-1$
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			fCodeIndexToLine = new HashMap<Long, Integer>();
-			fLineToCodeIndexes = new HashMap<Integer, List<Long>>();
+			fCodeIndexToLine = new HashMap<>();
+			fLineToCodeIndexes = new HashMap<>();
 			if (nrOfElements == 0) {
 				throw new AbsentInformationException(
 						JDIMessages.MethodImpl_Got_empty_line_number_table_for_this_method_3);
@@ -195,7 +195,7 @@
 
 				List<Long> lineNrEntry = fLineToCodeIndexes.get(lineNrInt);
 				if (lineNrEntry == null) {
-					lineNrEntry = new ArrayList<Long>();
+					lineNrEntry = new ArrayList<>();
 					fLineToCodeIndexes.put(lineNrInt, lineNrEntry);
 				}
 				lineNrEntry.add(lineCodeIndexLong);
@@ -267,7 +267,7 @@
 			return fArguments;
 		}
 
-		List<LocalVariable> result = new ArrayList<LocalVariable>();
+		List<LocalVariable> result = new ArrayList<>();
 		Iterator<LocalVariable> iter = variables().iterator();
 		while (iter.hasNext()) {
 			LocalVariable var = iter.next();
@@ -288,7 +288,7 @@
 			return fArgumentTypeNames;
 		}
 		List<String> argumentTypeSignatures = argumentTypeSignatures();
-		List<String> result = new ArrayList<String>();
+		List<String> result = new ArrayList<>();
 		for (Iterator<String> iter = argumentTypeSignatures.iterator(); iter.hasNext();) {
 			result.add(TypeImpl.signatureToName(iter.next()));
 		}
@@ -318,7 +318,7 @@
 		if (fArgumentTypes != null) {
 			return fArgumentTypes;
 		}
-		List<Type> result = new ArrayList<Type>();
+		List<Type> result = new ArrayList<>();
 		Iterator<String> iter = argumentTypeSignatures().iterator();
 		ClassLoaderReference classLoaderRef = declaringType().classLoader();
 		VirtualMachineImpl vm = virtualMachineImpl();
@@ -540,7 +540,7 @@
 			DataInputStream replyData = replyPacket.dataInStream();
 			fArgumentSlotsCount = readInt("arg count", replyData); //$NON-NLS-1$
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			List<LocalVariable> variables = new ArrayList<LocalVariable>(nrOfElements);
+			List<LocalVariable> variables = new ArrayList<>(nrOfElements);
 			for (int i = 0; i < nrOfElements; i++) {
 				long codeIndex = readLong("code index", replyData); //$NON-NLS-1$
 				String name = readString("name", replyData); //$NON-NLS-1$
@@ -605,7 +605,7 @@
 		}
 		if (signatures.length > 0) {
 			fArgumentSlotsCount = signatures.length;
-			fVariables = new ArrayList<LocalVariable>(fArgumentSlotsCount);
+			fVariables = new ArrayList<>(fArgumentSlotsCount);
 			for (int i = 0; i < signatures.length; i++) {
 				String name = "arg" + i; //$NON-NLS-1$
 				LocalVariableImpl localVar = new LocalVariableImpl(virtualMachineImpl(), this, 0, name, signatures[i], genericSignatures[i], -1, slot, true);
@@ -625,7 +625,7 @@
 	@Override
 	public List<LocalVariable> variablesByName(String name) throws AbsentInformationException {
 		Iterator<LocalVariable> iter = variables().iterator();
-		List<LocalVariable> result = new ArrayList<LocalVariable>();
+		List<LocalVariable> result = new ArrayList<>();
 		while (iter.hasNext()) {
 			LocalVariable var = iter.next();
 			if (var.name().equals(name)) {
@@ -802,7 +802,7 @@
 
 	/**
 	 * @see Method#isObsolete()
-	 * 
+	 *
 	 *      The JDK 1.4.0 specification states that obsolete methods are given
 	 *      an ID of zero. It also states that when a method is redefined, the
 	 *      new method gets the ID of the old method. Thus, the JDWP query for
@@ -816,7 +816,7 @@
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.Method#allLineLocations(java.lang.String, java.lang.String)
 	 */
@@ -832,14 +832,14 @@
 		Map<String, List<Location>> sourceNameAllLineLocations = null;
 		if (fStratumAllLineLocations == null) { // the stratum map doesn't
 												// exist, create it
-			fStratumAllLineLocations = new HashMap<String, Map<String, List<Location>>>();
+			fStratumAllLineLocations = new HashMap<>();
 		} else {
 			// get the source name map
 			sourceNameAllLineLocations = fStratumAllLineLocations.get(stratum);
 		}
 		if (sourceNameAllLineLocations == null) { // the source name map doesn't
 													// exist, create it
-			sourceNameAllLineLocations = new HashMap<String, List<Location>>();
+			sourceNameAllLineLocations = new HashMap<>();
 			fStratumAllLineLocations.put(stratum, sourceNameAllLineLocations);
 		} else {
 			// get the line locations
@@ -873,7 +873,7 @@
 	 * the specified lines.
 	 */
 	protected List<Location> javaStratumLocationsOfLines(List<Integer> javaLines)	throws AbsentInformationException {
-		Set<Long> tmpLocations = new TreeSet<Long>();
+		Set<Long> tmpLocations = new TreeSet<>();
 		for (Iterator<Integer> iter = javaLines.iterator(); iter.hasNext();) {
 			Integer key = iter.next();
 			List<Long> indexes = javaStratumLineToCodeIndexes(key.intValue());
@@ -881,14 +881,14 @@
 				tmpLocations.addAll(indexes);
 			}
 		}
-		List<Location> locations = new ArrayList<Location>();
+		List<Location> locations = new ArrayList<>();
 		for (Iterator<Long> iter = tmpLocations.iterator(); iter.hasNext();) {
 			long index = iter.next().longValue();
 			int position = Arrays.binarySearch(fCodeIndexTable, index);
 			if(position < 0) {
 				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=388172
-				//the key is not in the code index, we should not insert it as the line table is supposed to be 
-				//constant unless the parent class is redefined. 
+				//the key is not in the code index, we should not insert it as the line table is supposed to be
+				//constant unless the parent class is redefined.
 				//See http://docs.oracle.com/javase/6/docs/platform/jpda/jdwp/jdwp-protocol.html#JDWP_Method_LineTable for more information
 				continue;
 			}
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MirrorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MirrorImpl.java
index c48176c..1fa24d6 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MirrorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MirrorImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,7 +39,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class MirrorImpl implements Mirror {
 
@@ -177,7 +177,7 @@
 
 	/**
 	 * Performs a VM request.
-	 * 
+	 *
 	 * @return Returns reply data.
 	 */
 	public JdwpReplyPacket requestVM(int command, byte[] outData) {
@@ -220,7 +220,7 @@
 
 	/**
 	 * Performs a VM request.
-	 * 
+	 *
 	 * @return Returns reply data.
 	 */
 	public JdwpReplyPacket requestVM(int command, ByteArrayOutputStream outData) {
@@ -229,7 +229,7 @@
 
 	/**
 	 * Performs a VM request for a specified object.
-	 * 
+	 *
 	 * @return Returns reply data.
 	 */
 	public JdwpReplyPacket requestVM(int command, ObjectReferenceImpl object) {
@@ -245,7 +245,7 @@
 
 	/**
 	 * Performs a VM request for a specified object.
-	 * 
+	 *
 	 * @return Returns reply data.
 	 */
 	public JdwpReplyPacket requestVM(int command, ReferenceTypeImpl refType) {
@@ -261,7 +261,7 @@
 
 	/**
 	 * Performs a VM request.
-	 * 
+	 *
 	 * @return Returns reply data.
 	 */
 	public JdwpReplyPacket requestVM(int command) {
@@ -313,7 +313,7 @@
 
 	/**
 	 * Waits for a specified command packet from the VM.
-	 * 
+	 *
 	 * @return Returns Command Packet from VM.
 	 */
 	public final JdwpCommandPacket getCommandVM(int command, long timeout)
@@ -346,7 +346,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public byte readByte(String description, DataInputStream in)
@@ -360,7 +360,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public short readShort(String description, DataInputStream in)
@@ -374,7 +374,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public int readInt(String description, DataInputStream in)
@@ -388,7 +388,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public long readLong(String description, DataInputStream in)
@@ -402,7 +402,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public byte readByte(String description, Map<Integer, String> valueToString,
@@ -416,7 +416,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public short readShort(String description, Map<Integer, String> valueToString,
@@ -430,7 +430,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public int readInt(String description, Map<Integer, String> valueToString, DataInputStream in)
@@ -444,7 +444,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public String readString(String description, DataInputStream in)
@@ -458,7 +458,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public boolean readBoolean(String description, DataInputStream in)
@@ -472,7 +472,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public char readChar(String description, DataInputStream in)
@@ -486,7 +486,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public double readDouble(String description, DataInputStream in)
@@ -500,7 +500,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public float readFloat(String description, DataInputStream in)
@@ -514,7 +514,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public byte[] readByteArray(int length, String description,
@@ -683,7 +683,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public byte readByte(String description, String[] bitNames,
@@ -697,7 +697,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public short readShort(String description, String[] bitNames,
@@ -711,7 +711,7 @@
 
 	/**
 	 * Reads Jdwp data and, if verbose is on, outputs verbose info.
-	 * 
+	 *
 	 * @return Returns value that has been read.
 	 */
 	public int readInt(String description, String[] bitNames, DataInputStream in)
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MonitorInfoImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MonitorInfoImpl.java
index 09a3e07..52ce2c7 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MonitorInfoImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/MonitorInfoImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  * @since 3.3
  */
 public class MonitorInfoImpl extends MirrorImpl implements MonitorInfo {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ObjectReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ObjectReferenceImpl.java
index 9314a7f..899b317 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ObjectReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ObjectReferenceImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -44,7 +44,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ObjectReferenceImpl extends ValueImpl implements ObjectReference {
 	/** JDWP Tag. */
@@ -154,7 +154,7 @@
 			result.owner = ThreadReferenceImpl.read(this, replyData);
 			result.entryCount = readInt("entry count", replyData); //$NON-NLS-1$
 			int nrOfWaiters = readInt("nr of waiters", replyData); //$NON-NLS-1$
-			result.waiters = new ArrayList<ThreadReference>(nrOfWaiters);
+			result.waiters = new ArrayList<>(nrOfWaiters);
 			for (int i = 0; i < nrOfWaiters; i++)
 				result.waiters.add(ThreadReferenceImpl.read(this, replyData));
 			return result;
@@ -200,7 +200,7 @@
 	 */
 	@Override
 	public Value getValue(Field field) {
-		ArrayList<Field> list = new ArrayList<Field>(1);
+		ArrayList<Field> list = new ArrayList<>(1);
 		list.add(field);
 		return getValues(list).get(field);
 	}
@@ -212,7 +212,7 @@
 	 *         ways, such as from a local variable in a stack frame, or from a
 	 *         JNI global reference. Such non-object referrers are not returned
 	 *         by this method.
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	@Override
@@ -250,7 +250,7 @@
 			if (max > 0 && elements > max) {
 				elements = max;
 			}
-			ArrayList<ObjectReference> list = new ArrayList<ObjectReference>();
+			ArrayList<ObjectReference> list = new ArrayList<>();
 			for (int i = 0; i < elements; i++) {
 				list.add((ObjectReference)ValueImpl.readWithTag(this, replyData));
 			}
@@ -271,7 +271,7 @@
 	public Map<Field, Value> getValues(List<? extends Field> allFields) {
 		// if the field list is empty, nothing to do.
 		if (allFields.isEmpty()) {
-			return new HashMap<Field, Value>();
+			return new HashMap<>();
 		}
 		// Note that this information should not be cached.
 		initJdwpRequest();
@@ -283,8 +283,8 @@
 			 * Distinguish static fields from non-static fields: For static
 			 * fields ReferenceTypeImpl.getValues() must be used.
 			 */
-			List<Field> staticFields = new ArrayList<Field>();
-			List<FieldImpl> nonStaticFields = new ArrayList<FieldImpl>();
+			List<Field> staticFields = new ArrayList<>();
+			List<FieldImpl> nonStaticFields = new ArrayList<>();
 
 			// Separate static and non-static fields.
 			int allFieldsSize = allFields.size();
@@ -300,7 +300,7 @@
 			// First get values for the static fields.
 			Map<Field, Value> resultMap;
 			if (staticFields.isEmpty()) {
-				resultMap = new HashMap<Field, Value>();
+				resultMap = new HashMap<>();
 			} else {
 				resultMap = referenceType().getValues(staticFields);
 			}
@@ -381,7 +381,7 @@
 
 	/**
 	 * Invokes the specified static Method in the target VM.
-	 * 
+	 *
 	 * @return Returns a Value mirror of the invoked method's return value.
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveTypeImpl.java
index ac0e0ed..5845496 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class PrimitiveTypeImpl extends TypeImpl implements
 		PrimitiveType {
@@ -75,7 +75,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveValueImpl.java
index 69a915d..c43804b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/PrimitiveValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class PrimitiveValueImpl extends ValueImpl implements PrimitiveValue {
 	/** Primitive value in wrapper. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ReferenceTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ReferenceTypeImpl.java
index e65d1ce..5673199 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ReferenceTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ReferenceTypeImpl.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Yavor Boyadzhiev <yavor.vasilev.boyadzhiev@sap.com> - Bug 162399  
+ *     Yavor Boyadzhiev <yavor.vasilev.boyadzhiev@sap.com> - Bug 162399
  *     Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
  *******************************************************************************/
 package org.eclipse.jdi.internal;
@@ -60,7 +60,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class ReferenceTypeImpl extends TypeImpl implements
 		ReferenceType, org.eclipse.jdi.hcr.ReferenceType {
@@ -104,7 +104,7 @@
 
 		/**
 		 * FileInfo constructor.
-		 * 
+		 *
 		 * @param fileId
 		 *            the id.
 		 * @param fileName
@@ -116,13 +116,13 @@
 			fFileId = fileId;
 			fFileName = fileName;
 			fAbsoluteFileName = absoluteFileName;
-			fLineInfo = new HashMap<Integer, List<int[]>>();
+			fLineInfo = new HashMap<>();
 		}
 
 		/**
 		 * Add information about the mapping of one line. Associate a line in
 		 * the input source file to a snippet of code in the output source file.
-		 * 
+		 *
 		 * @param inputLine
 		 *            the line number in the input source file.
 		 * @param outputStartLine
@@ -137,7 +137,7 @@
 			Integer key = new Integer(inputLine);
 			List<int[]> outputLines = fLineInfo.get(key);
 			if (outputLines == null) {
-				outputLines = new ArrayList<int[]>();
+				outputLines = new ArrayList<>();
 				fLineInfo.put(key, outputLines);
 			}
 			outputLines.add(new int[] { outputStartLine, outputLineRange });
@@ -146,13 +146,13 @@
 		/**
 		 * Return a list of line information about the code in the output source
 		 * file associated to the given line in the input source file.
-		 * 
+		 *
 		 * @param lineNumber
 		 *            the line number in the input source file.
 		 * @return a List of int[2].
 		 */
 		public List<Integer> getOutputLinesForLine(int lineNumber) {
-			List<Integer> list = new ArrayList<Integer>();
+			List<Integer> list = new ArrayList<>();
 			List<int[]> outputLines = fLineInfo.get(new Integer(lineNumber));
 			if (outputLines != null) {
 				for (Iterator<int[]> iter = outputLines.iterator(); iter.hasNext();) {
@@ -211,20 +211,20 @@
 
 		/**
 		 * Stratum constructor.
-		 * 
+		 *
 		 * @param id
 		 *            The id of this stratum.
 		 */
 		public Stratum(String id) {
 			fId = id;
-			fFileInfos = new ArrayList<FileInfo>();
-			fOutputLineToInputLine = new HashMap<Integer, List<int[]>>();
+			fFileInfos = new ArrayList<>();
+			fOutputLineToInputLine = new HashMap<>();
 			fPrimaryFileId = -1;
 		}
 
 		/**
 		 * Add a file info to this stratum.
-		 * 
+		 *
 		 * @param fileId
 		 *            the id.
 		 * @param fileName
@@ -237,7 +237,7 @@
 
 		/**
 		 * Add a file info to this stratum.
-		 * 
+		 *
 		 * @param fileId
 		 *            the id.
 		 * @param fileName
@@ -261,7 +261,7 @@
 
 		/**
 		 * Add line mapping information.
-		 * 
+		 *
 		 * @param inputStartLine
 		 *            number of the first line in the input source file.
 		 * @param lineFileId
@@ -315,7 +315,7 @@
 			Integer key = new Integer(outputStartLine);
 			List<int[]> inputLines = fOutputLineToInputLine.get(key);
 			if (inputLines == null) {
-				inputLines = new ArrayList<int[]>();
+				inputLines = new ArrayList<>();
 				fOutputLineToInputLine.put(key, inputLines);
 			}
 			inputLines.add(new int[] { lineFileId, inputStartLine });
@@ -325,7 +325,7 @@
 		 * Return the FileInfo object for the specified source name. Return
 		 * <code>null</code> if the specified name is the source name of no file
 		 * info.
-		 * 
+		 *
 		 * @param sourceName
 		 *            the source name to search.
 		 */
@@ -488,7 +488,7 @@
 		// The interfaces are maintained in a set, to avoid duplicates.
 		// The interfaces of its own (own interfaces() command) are first
 		// inserted.
-		HashSet<InterfaceType> allInterfacesSet = new HashSet<InterfaceType>(interfaces());
+		HashSet<InterfaceType> allInterfacesSet = new HashSet<>(interfaces());
 
 		// All interfaces of the interfaces it implements.
 		Iterator<InterfaceType> interfaces = interfaces().iterator();
@@ -506,7 +506,7 @@
 			}
 		}
 
-		fAllInterfaces = new ArrayList<InterfaceType>(allInterfacesSet);
+		fAllInterfaces = new ArrayList<>(allInterfacesSet);
 		return fAllInterfaces;
 	}
 
@@ -574,8 +574,8 @@
 		 */
 		// The name+signature combinations of methods are maintained in a set,
 		// to avoid including methods that have been overridden.
-		Set<String> namesAndSignatures = new HashSet<String>();
-		List<Method> visibleMethods = new ArrayList<Method>();
+		Set<String> namesAndSignatures = new HashSet<>();
+		List<Method> visibleMethods = new ArrayList<>();
 
 		// The methods of its own (own methods() command).
 		for (Iterator<Method> iter = methods().iterator(); iter.hasNext();) {
@@ -621,7 +621,7 @@
 		 * methods of it's superclass.
 		 */
 		// The name+signature combinations of methods are maintained in a set.
-		HashSet<Method> resultSet = new HashSet<Method>();
+		HashSet<Method> resultSet = new HashSet<>();
 
 		// The methods of its own (own methods() command).
 		resultSet.addAll(methods());
@@ -641,7 +641,7 @@
 				resultSet.addAll(superclass.allMethods());
 		}
 
-		fAllMethods = new ArrayList<Method>(resultSet);
+		fAllMethods = new ArrayList<>(resultSet);
 		return fAllMethods;
 	}
 
@@ -668,7 +668,7 @@
 				defaultReplyErrorHandler(replyPacket.errorCode());
 			}
 			DataInputStream replyData = replyPacket.dataInStream();
-			List<InterfaceType> elements = new ArrayList<InterfaceType>();
+			List<InterfaceType> elements = new ArrayList<>();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
 			for (int i = 0; i < nrOfElements; i++) {
 				InterfaceTypeImpl ref = InterfaceTypeImpl.read(this, replyData);
@@ -720,10 +720,10 @@
 		 */
 		// The names of fields are maintained in a set, to avoid including
 		// fields that have been overridden.
-		HashSet<String> fieldNames = new HashSet<String>();
+		HashSet<String> fieldNames = new HashSet<>();
 
 		// The fields of its own (own fields() command).
-		List<Field> visibleFields = new ArrayList<Field>();
+		List<Field> visibleFields = new ArrayList<>();
 		addVisibleFields(fields(), fieldNames, visibleFields);
 
 		// All fields of the interfaces it implements.
@@ -763,7 +763,7 @@
 		 */
 		// The names of fields are maintained in a set, to avoid including
 		// fields that have been inherited double.
-		HashSet<Field> resultSet = new HashSet<Field>();
+		HashSet<Field> resultSet = new HashSet<>();
 
 		// The fields of its own (own fields() command).
 		resultSet.addAll(fields());
@@ -783,7 +783,7 @@
 				resultSet.addAll(superclass.allFields());
 		}
 
-		fAllFields = new ArrayList<Field>(resultSet);
+		fAllFields = new ArrayList<>(resultSet);
 		return fAllFields;
 	}
 
@@ -925,7 +925,7 @@
 			JdwpReplyPacket replyPacket = requestVM(jdwpCommand, this);
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
-			List<Field> elements = new ArrayList<Field>();
+			List<Field> elements = new ArrayList<>();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
 			for (int i = 0; i < nrOfElements; i++) {
 				FieldImpl elt = FieldImpl.readWithNameSignatureModifiers(this,
@@ -967,10 +967,10 @@
 		if (methodID.value() == 0) {
 			return new MethodImpl(virtualMachineImpl(), this, methodID,
 					JDIMessages.ReferenceTypeImpl_Obsolete_method_1,
-					"", null, -1); //$NON-NLS-1$ 
+					"", null, -1); //$NON-NLS-1$
 		}
 		if (fMethodTable == null) {
-			fMethodTable = new Hashtable<JdwpMethodID, Method>();
+			fMethodTable = new Hashtable<>();
 			Iterator<Method> iter = methods().iterator();
 			while (iter.hasNext()) {
 				MethodImpl method = (MethodImpl) iter.next();
@@ -985,7 +985,7 @@
 	 */
 	@Override
 	public Value getValue(Field field) {
-		ArrayList<Field> list = new ArrayList<Field>(1);
+		ArrayList<Field> list = new ArrayList<>(1);
 		list.add(field);
 		return getValues(list).get(field);
 	}
@@ -997,7 +997,7 @@
 	public Map<Field, Value> getValues(List<? extends Field> fields) {
 		// if the field list is empty, nothing to do
 		if (fields.isEmpty()) {
-			return new HashMap<Field, Value>();
+			return new HashMap<>();
 		}
 		// Note that this information should not be cached.
 		initJdwpRequest();
@@ -1018,7 +1018,7 @@
 			defaultReplyErrorHandler(replyPacket.errorCode());
 
 			DataInputStream replyData = replyPacket.dataInStream();
-			HashMap<Field, Value> map = new HashMap<Field, Value>();
+			HashMap<Field, Value> map = new HashMap<>();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
 			if (nrOfElements != fieldsSize)
 				throw new InternalError(
@@ -1126,7 +1126,7 @@
 			JdwpReplyPacket replyPacket = requestVM(jdwpCommand, this);
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
-			List<Method> elements = new ArrayList<Method>();
+			List<Method> elements = new ArrayList<>();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
 			for (int i = 0; i < nrOfElements; i++) {
 				MethodImpl elt = MethodImpl.readWithNameSignatureModifiers(
@@ -1152,7 +1152,7 @@
 	 */
 	@Override
 	public List<Method> methodsByName(String name) {
-		List<Method> elements = new ArrayList<Method>();
+		List<Method> elements = new ArrayList<>();
 		Iterator<Method> iter = visibleMethods().iterator();
 		while (iter.hasNext()) {
 			Method method = iter.next();
@@ -1169,7 +1169,7 @@
 	 */
 	@Override
 	public List<Method> methodsByName(String name, String signature) {
-		List<Method> elements = new ArrayList<Method>();
+		List<Method> elements = new ArrayList<>();
 		Iterator<Method> iter = visibleMethods().iterator();
 		while (iter.hasNext()) {
 			MethodImpl method = (MethodImpl) iter.next();
@@ -1225,7 +1225,7 @@
 		// Note that the VM gives an empty reply on RT_NESTED_TYPES, therefore
 		// we search for the
 		// nested types in the loaded types.
-		List<ReferenceType> result = new ArrayList<ReferenceType>();
+		List<ReferenceType> result = new ArrayList<>();
 		Iterator<ReferenceType> itr = virtualMachineImpl().allRefTypes();
 		while (itr.hasNext()) {
 			try {
@@ -1507,7 +1507,7 @@
 	 */
 	@Override
 	public List<String> sourceNames(String stratumId) throws AbsentInformationException {
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		Stratum stratum = getStratum(stratumId);
 		if (stratum != null) {
 			// return the source names defined for this stratum in the SMAP.
@@ -1534,7 +1534,7 @@
 	 */
 	@Override
 	public List<String> sourcePaths(String stratumId) throws AbsentInformationException {
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		Stratum stratum = getStratum(stratumId);
 		if (stratum != null) {
 			// return the source paths defined for this stratum in the SMAP.
@@ -1583,21 +1583,21 @@
 		Map<String, List<Location>> sourceNameAllLineLocations = null;
 		if (fStratumAllLineLocations == null) { // the stratum map doesn't
 												// exist, create it
-			fStratumAllLineLocations = new HashMap<String, Map<String, List<Location>>>();
+			fStratumAllLineLocations = new HashMap<>();
 		} else {
 			// get the source name map
 			sourceNameAllLineLocations = fStratumAllLineLocations.get(stratum);
 		}
 		if (sourceNameAllLineLocations == null) { // the source name map doesn't
 													// exist, create it
-			sourceNameAllLineLocations = new HashMap<String, List<Location>>();
+			sourceNameAllLineLocations = new HashMap<>();
 			fStratumAllLineLocations.put(stratum, sourceNameAllLineLocations);
 		} else {
 			// get the line locations
 			allLineLocations = sourceNameAllLineLocations.get(sourceName);
 		}
 		if (allLineLocations == null) { // the line locations are not known, compute and store them
-			allLineLocations = new ArrayList<Location>();
+			allLineLocations = new ArrayList<>();
 			boolean hasLineInformation = false;
 			AbsentInformationException exception = null;
 			while (allMethods.hasNext()) {
@@ -1626,7 +1626,7 @@
 	@Override
 	public List<Location> locationsOfLine(String stratum, String sourceName, int lineNumber) throws AbsentInformationException {
 		Iterator<Method> allMethods = methods().iterator();
-		List<Location> locations = new ArrayList<Location>();
+		List<Location> locations = new ArrayList<>();
 		boolean hasLineInformation = false;
 		AbsentInformationException exception = null;
 		while (allMethods.hasNext()) {
@@ -1655,7 +1655,7 @@
 	 */
 	@Override
 	public List<String> availableStrata() {
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		// The strata defined in the SMAP.
 		if (isSourceDebugExtensionAvailable()) {
 			list.addAll(fStrata.keySet());
@@ -1717,7 +1717,7 @@
 
 	/**
 	 * Get the source debug extension from the VM.
-	 * 
+	 *
 	 * @throws AbsentInformationException
 	 */
 	private void getSourceDebugExtension() throws AbsentInformationException {
@@ -1747,13 +1747,13 @@
 					JDIMessages.ReferenceTypeImpl_31);
 		}
 		// parse the source map.
-		fStrata = new HashMap<String, Stratum>();
+		fStrata = new HashMap<>();
 		SourceDebugExtensionParser.parse(fSmap, this);
 	}
 
 	/**
 	 * Get the name of the Java source file from the VM.
-	 * 
+	 *
 	 * @throws AbsentInformationException
 	 */
 	private void getSourceName() throws AbsentInformationException {
@@ -1834,7 +1834,7 @@
 	 * part of the translation, for this stratum. If the code at the given index
 	 * is not a part of the translation of the given stratum code, return the
 	 * name of the primary input source file.
-	 * 
+	 *
 	 * @param codeIndex
 	 *            the index of the code.
 	 * @param method
@@ -1862,7 +1862,7 @@
 	 * code index is part of the translation, for this stratum. If the code at
 	 * the given index is not a part of the translation of the given stratum
 	 * code, return the FileInfo of the primary input source file.
-	 * 
+	 *
 	 * @param codeIndex
 	 *            the index of the code.
 	 * @param method
@@ -1895,7 +1895,7 @@
 	/**
 	 * Return the list of line number in the input files of the stratum
 	 * associated with the code at the given address.
-	 * 
+	 *
 	 * @param codeIndex
 	 *            the index of the code.
 	 * @param method
@@ -1921,7 +1921,7 @@
 	 * part of the translation, for this stratum. If the code at the given index
 	 * is not a part of the translation of the given stratum code, return the
 	 * path of the primary input source file.
-	 * 
+	 *
 	 * @param codeIndex
 	 *            the index of the code.
 	 * @param method
@@ -1951,7 +1951,7 @@
 	/**
 	 * Return the number of the line of which the given code index is part of
 	 * the translation, for this stratum.
-	 * 
+	 *
 	 * @param codeIndex
 	 *            the index of the code.
 	 * @param method
@@ -1984,7 +1984,7 @@
 	 * in the given stratum in the source file with the given source name. If
 	 * sourceName is <code>null</code>, return the locations for all source file
 	 * in the given stratum. The returned location are in the given method.
-	 * 
+	 *
 	 * @param stratumId
 	 *            the stratum id.
 	 * @param sourceName
@@ -1997,7 +1997,7 @@
 	 */
 	public List<Location> locationsOfLine(String stratumId, String sourceName, int lineNumber, MethodImpl method)	throws AbsentInformationException {
 		Stratum stratum = getStratum(stratumId);
-		List<Integer> javaLines = new ArrayList<Integer>();
+		List<Integer> javaLines = new ArrayList<>();
 		if (stratum != null) {
 			boolean found = false;
 			for (Iterator<FileInfo> iter = stratum.fFileInfos.iterator(); iter.hasNext() && !found;) {
@@ -2020,7 +2020,7 @@
 	 * stratum which are included in the given method. If sourceName is
 	 * <code>null</code>, return the locations for all source file in the given
 	 * stratum.
-	 * 
+	 *
 	 * @param stratumId
 	 *            the stratum id
 	 * @param sourceName
@@ -2077,7 +2077,7 @@
 					}
 				}
 			}
-			List<Location> locations = new ArrayList<Location>();
+			List<Location> locations = new ArrayList<>();
 			for (int i = 0, length = lineInfoTable.length; i < length; i++) {
 				if (lineInfoTable[i] != null) {
 					locations.add(new LocationImpl(virtualMachineImpl(), method, codeIndexTable[i]));
@@ -2086,7 +2086,7 @@
 			return locations;
 		}
 		// Java stratum
-		List<Location> result = new ArrayList<Location>();
+		List<Location> result = new ArrayList<>();
 		for (long element : codeIndexTable) {
 			result.add(new LocationImpl(virtualMachineImpl(), method, element));
 		}
@@ -2095,7 +2095,7 @@
 
 	/*
 	 * @since 3.0
-	 * 
+	 *
 	 * @since java 1.5
 	 */
 	@Override
@@ -2135,7 +2135,7 @@
 	 * no-generic-signature (genericSignature() will return null) if
 	 * genericSignature is an non-empty String, the generic signature is set to
 	 * the specified value (genericSignature() will return the specified value)
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public void setGenericSignature(String genericSignature) {
@@ -2190,7 +2190,7 @@
 			if (max > 0 && elements > max) {
 				elements = max;
 			}
-			ArrayList<ObjectReference> list = new ArrayList<ObjectReference>();
+			ArrayList<ObjectReference> list = new ArrayList<>();
 			for (int i = 0; i < elements; i++) {
 				list.add((ObjectReference) ValueImpl.readWithTag(this, replyData));
 			}
@@ -2361,7 +2361,7 @@
 			handledJdwpRequest();
 		}
 	}
-	
+
 	/**
 	 * @return Returns Jdwp version of given options.
 	 */
@@ -2371,11 +2371,11 @@
 			jdwpOptions |= MethodImpl.INVOKE_SINGLE_THREADED_JDWP;
 		return jdwpOptions;
 	}
-	
+
 
 	/**
 	 * Invoke static method on class or interface type
-	 * 
+	 *
 	 * @param thread the debugger thread in which to invoke
 	 * @param method the resolved chosed Method to invoke
 	 * @param arguments the list of Values to supply as arguments for the method, assigned to arguments in the order they appear in the method signature.
@@ -2448,7 +2448,7 @@
 			case JdwpReplyPacket.NOT_IMPLEMENTED:
 				throw new UnsupportedOperationException(JDIMessages.InterfaceTypeImpl_Static_interface_methods_require_newer_JVM);
 			}
-			
+
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
 			ValueImpl value = ValueImpl.readWithTag(this, replyData);
@@ -2464,5 +2464,5 @@
 			handledJdwpRequest();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortTypeImpl.java
index d56db88..35de222 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ShortTypeImpl extends PrimitiveTypeImpl implements ShortType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortValueImpl.java
index 4303333..bde901a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ShortValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ShortValueImpl extends PrimitiveValueImpl implements ShortValue {
 	/** JDWP Tag. */
@@ -58,7 +58,7 @@
 	public int compareTo(ShortValue o) {
 		return ((Short)shortValue()).compareTo(o.shortValue());
 	}
-	
+
 	/**
 	 * @returns Value.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/SourceDebugExtensionParser.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/SourceDebugExtensionParser.java
index 170d365..07895fd 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/SourceDebugExtensionParser.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/SourceDebugExtensionParser.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 import com.sun.jdi.AbsentInformationException;
 
 /**
- * 
+ *
  */
 public class SourceDebugExtensionParser {
 
@@ -62,7 +62,7 @@
 
 		/**
 		 * Compute the next lexem.
-		 * 
+		 *
 		 * @return the type of the next lexem.
 		 */
 		public int nextLexem() throws AbsentInformationException {
@@ -119,7 +119,7 @@
 		}
 
 		/**
-		 * 
+		 *
 		 */
 		private void startWithOtherChar() {
 			int lexemStart = fPointer;
@@ -164,7 +164,7 @@
 		}
 
 		/**
-		 * 
+		 *
 		 */
 		private void startWithAsterisk() throws AbsentInformationException {
 			nextChar();
@@ -203,7 +203,7 @@
 		}
 
 		/**
-		 * 
+		 *
 		 */
 		private void startWithCR() {
 			if (fChar == '\r') {
@@ -221,7 +221,7 @@
 		}
 
 		/**
-		 * 
+		 *
 		 */
 		private void consumeWhiteSpace() {
 			while (fChar == ' ' || fChar == '\t') {
@@ -268,12 +268,12 @@
 	 */
 	private SourceDebugExtensionParser(ReferenceTypeImpl referenceType) {
 		fReferenceType = referenceType;
-		fDefinedStrata = new ArrayList<String>();
+		fDefinedStrata = new ArrayList<>();
 		fDefinedStrata.add(VirtualMachineImpl.JAVA_STRATUM_NAME);
 	}
 
 	/**
-	 * 
+	 *
 	 */
 	private void parseSmap(String smap) throws AbsentInformationException {
 		Lexer lexer = new Lexer(smap);
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StackFrameImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StackFrameImpl.java
index 97dc649..e7a3615 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StackFrameImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StackFrameImpl.java
@@ -42,7 +42,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class StackFrameImpl extends MirrorImpl implements StackFrame, Locatable {
 	/** FrameID that corresponds to this reference. */
@@ -70,7 +70,7 @@
 	public Value getValue(LocalVariable variable)
 			throws IllegalArgumentException, InvalidStackFrameException,
 			VMMismatchException {
-		ArrayList<LocalVariable> list = new ArrayList<LocalVariable>(1);
+		ArrayList<LocalVariable> list = new ArrayList<>(1);
 		list.add(variable);
 		return getValues(list).get(variable);
 	}
@@ -82,7 +82,7 @@
 	public Map<LocalVariable, Value> getValues(List<? extends LocalVariable> variables) throws IllegalArgumentException,
 			InvalidStackFrameException, VMMismatchException {
 		// Note that this information should not be cached.
-		Map<LocalVariable, Value> map = new HashMap<LocalVariable, Value>(variables.size());
+		Map<LocalVariable, Value> map = new HashMap<>(variables.size());
 		// if the variable list is empty, nothing to do
 		if (variables.isEmpty()) {
 			return map;
@@ -169,7 +169,7 @@
 		}
 		try {
 			List<LocalVariable> list = location().method().variables();
-			ArrayList<Value> ret = new ArrayList<Value>();
+			ArrayList<Value> ret = new ArrayList<>();
 			LocalVariable var = null;
 			for (Iterator<LocalVariable> iter = list.iterator(); iter.hasNext();) {
 				var = iter.next();
@@ -294,7 +294,7 @@
 	public List<LocalVariable> visibleVariables() throws AbsentInformationException {
 		List<LocalVariable> variables = fLocation.method().variables();
 		Iterator<LocalVariable> iter = variables.iterator();
-		List<LocalVariable> visibleVars = new ArrayList<LocalVariable>(variables.size());
+		List<LocalVariable> visibleVars = new ArrayList<>(variables.size());
 		while (iter.hasNext()) {
 			LocalVariableImpl var = (LocalVariableImpl) iter.next();
 			// Only return local variables other than the this pointer.
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StringReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StringReferenceImpl.java
index db6bd98..9cfa492 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StringReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/StringReferenceImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class StringReferenceImpl extends ObjectReferenceImpl implements
 		StringReference {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadGroupReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadGroupReferenceImpl.java
index 3551908..fe19d7b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadGroupReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadGroupReferenceImpl.java
@@ -27,7 +27,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ThreadGroupReferenceImpl extends ObjectReferenceImpl implements
 		ThreadGroupReference {
@@ -156,12 +156,12 @@
 			DataInputStream replyData = replyPacket.dataInStream();
 			ChildrenInfo result = new ChildrenInfo();
 			int nrThreads = readInt("nr threads", replyData); //$NON-NLS-1$
-			result.childThreads = new ArrayList<ThreadReference>(nrThreads);
+			result.childThreads = new ArrayList<>(nrThreads);
 			for (int i = 0; i < nrThreads; i++)
 				result.childThreads.add(ThreadReferenceImpl.read(this,
 						replyData));
 			int nrThreadGroups = readInt("nr thread groups", replyData); //$NON-NLS-1$
-			result.childThreadGroups = new ArrayList<ThreadGroupReference>(nrThreadGroups);
+			result.childThreadGroups = new ArrayList<>(nrThreadGroups);
 			for (int i = 0; i < nrThreadGroups; i++)
 				result.childThreadGroups.add(ThreadGroupReferenceImpl.read(
 						this, replyData));
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadReferenceImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadReferenceImpl.java
index 40651a8..d9e0b0c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadReferenceImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ThreadReferenceImpl.java
@@ -45,7 +45,7 @@
 /**
  * This class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ThreadReferenceImpl extends ObjectReferenceImpl implements	ThreadReference, org.eclipse.jdi.hcr.ThreadReference {
 	/** ThreadStatus Constants. */
@@ -276,7 +276,7 @@
 
 			DataInputStream replyData = replyPacket.dataInStream();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			List<StackFrame> frames = new ArrayList<StackFrame>(nrOfElements);
+			List<StackFrame> frames = new ArrayList<>(nrOfElements);
 			for (int i = 0; i < nrOfElements; i++) {
 				StackFrameImpl frame = StackFrameImpl.readWithLocation(this,
 						this, replyData);
@@ -394,7 +394,7 @@
 			DataInputStream replyData = replyPacket.dataInStream();
 
 			int nrOfMonitors = readInt("nr of monitors", replyData); //$NON-NLS-1$
-			List<ObjectReference> result = new ArrayList<ObjectReference>(nrOfMonitors);
+			List<ObjectReference> result = new ArrayList<>(nrOfMonitors);
 			for (int i = 0; i < nrOfMonitors; i++) {
 				result.add(ObjectReferenceImpl.readObjectRefWithTag(this,
 						replyData));
@@ -436,7 +436,7 @@
 			DataInputStream replyData = replyPacket.dataInStream();
 
 			int owned = readInt("owned monitors", replyData); //$NON-NLS-1$
-			List<com.sun.jdi.MonitorInfo> result = new ArrayList<com.sun.jdi.MonitorInfo>(owned);
+			List<com.sun.jdi.MonitorInfo> result = new ArrayList<>(owned);
 			ObjectReference monitor = null;
 			int depth = -1;
 			for (int i = 0; i < owned; i++) {
@@ -456,7 +456,7 @@
 
 	/**
 	 * Resumes this thread.
-	 * 
+	 *
 	 * @see com.sun.jdi.ThreadReference#resume()
 	 */
 	@Override
@@ -524,7 +524,7 @@
 
 	/**
 	 * Stops this thread with an asynchronous exception.
-	 * 
+	 *
 	 * @see com.sun.jdi.ThreadReference#stop(com.sun.jdi.ObjectReference)
 	 */
 	@Override
@@ -558,7 +558,7 @@
 
 	/**
 	 * Suspends this thread.
-	 * 
+	 *
 	 * @see com.sun.jdi.ThreadReference#suspend()
 	 */
 	@Override
@@ -630,7 +630,7 @@
 	/**
 	 * Simulate the execution of a return instruction instead of executing the
 	 * next byte code in a method.
-	 * 
+	 *
 	 * @return Returns whether any finally or synchronized blocks are enclosing
 	 *         the current instruction.
 	 */
@@ -735,7 +735,7 @@
 		}
 
 		Field[] fields = ThreadReferenceImpl.class.getDeclaredFields();
-		fgThreadStatusMap = new HashMap<Integer, String>();
+		fgThreadStatusMap = new HashMap<>();
 		fgSuspendStatusStrings = new String[32]; // Int
 
 		for (Field field : fields) {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeComponentImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeComponentImpl.java
index fecfed8..661d711 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeComponentImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeComponentImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class TypeComponentImpl extends AccessibleImpl implements
 		TypeComponent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeImpl.java
index 3dca1cd..edcd732 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/TypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class TypeImpl extends AccessibleImpl implements Type {
 	/** Text representation of this type. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueCache.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueCache.java
index aa29cc4..37744f0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueCache.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueCache.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,30 +24,30 @@
  * This class is used to cache values. It uses soft references to store cached
  * values. Once a value is garbage collected by the VM, the corresponding entry
  * is removed from the cache on the next invocation of put() or get().
- * 
+ *
  * Note that WeakHashMap can't be used for this purpose because in WeakHashMap
  * soft references are only used for the keys, and values may not have 'strong'
  * references to keys otherwise they will never be garbage collected.
- * 
+ *
  */
 public class ValueCache {
 	/**
 	 * Map to store <key, Reference> pairs, where Reference is a soft reference
 	 * to an Object.
 	 */
-	private Map<Object, SoftReference<Object>> cacheTable = new Hashtable<Object, SoftReference<Object>>();
+	private Map<Object, SoftReference<Object>> cacheTable = new Hashtable<>();
 	/**
 	 * Map to store <Reference, key> pairs, to find the cacheTable-key of a
 	 * garbage collected Reference.
 	 */
-	private Map<SoftReference<Object>, Object> refTable = new Hashtable<SoftReference<Object>, Object>();
+	private Map<SoftReference<Object>, Object> refTable = new Hashtable<>();
 
 	/**
 	 * The reference-queue that is registered with the soft references. The
 	 * garbage collector will enqueue soft references that are garbage
 	 * collected.
 	 */
-	private ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
+	private ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
 
 	/**
 	 * Clean up all entries from the table for which the values were garbage
@@ -68,14 +68,14 @@
 	 */
 	public void put(Object key, Object value) {
 		cleanup();
-		SoftReference<Object> ref = new SoftReference<Object>(value, refQueue);
+		SoftReference<Object> ref = new SoftReference<>(value, refQueue);
 		cacheTable.put(key, ref);
 		refTable.put(ref, key);
 	}
 
 	/**
 	 * Get entry from the cache.
-	 * 
+	 *
 	 * @return Returns value that is cached under the given key, or null of one
 	 *         of the following is true: - The value has not been cached. - The
 	 *         value had been cached but is garbage collected.
@@ -95,7 +95,7 @@
 	 */
 	public Collection<Object> values() {
 		cleanup();
-		List<Object> returnValues = new ArrayList<Object>();
+		List<Object> returnValues = new ArrayList<>();
 		synchronized (cacheTable) {
 			Iterator<SoftReference<Object>> iter = cacheTable.values().iterator();
 			SoftReference<Object> ref;
@@ -117,7 +117,7 @@
 	 */
 	public Collection<Object> valuesWithType(Class<?> type) {
 		cleanup();
-		List<Object> returnValues = new ArrayList<Object>();
+		List<Object> returnValues = new ArrayList<>();
 		synchronized (cacheTable) {
 			Iterator<SoftReference<Object>> iter = cacheTable.values().iterator();
 			SoftReference<Object> ref;
@@ -135,7 +135,7 @@
 
 	/**
 	 * Removes the key and its corresponding value from this cache.
-	 * 
+	 *
 	 * @return Returns The value to which the key had been mapped in this
 	 *         hashtable, or null if the key did not have a mapping.
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueImpl.java
index 2585b9a..d9e0ae0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/ValueImpl.java
@@ -36,7 +36,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class ValueImpl extends MirrorImpl implements Value {
 	/**
@@ -154,13 +154,13 @@
 	 * Check the type and the vm of each values, according to the associated
 	 * type. For primitive values, convert the value for match the given type if
 	 * needed. The two list must have the same size.
-	 * 
+	 *
 	 * @return the (converted) values.
 	 * @see checkValue(Value, Type, VirtualMachineImpl)
 	 */
 	protected static List<Value> checkValues(List<?extends Value> values, List<Type> types,
 			VirtualMachineImpl vm) throws InvalidTypeException {
-		List<Value> result = new ArrayList<Value>(values.size());
+		List<Value> result = new ArrayList<>(values.size());
 		Iterator<? extends Value> iterValues = values.iterator();
 		Iterator<Type> iterTypes = types.iterator();
 		while (iterValues.hasNext()) {
@@ -174,7 +174,7 @@
 	/**
 	 * Check the type and the vm of the given value. In case of primitive value,
 	 * the value is converted if needed.
-	 * 
+	 *
 	 * @return the (converted) value.
 	 * @throws InvalidTypeException
 	 *             if the given value is no assignment compatible with the given
@@ -300,7 +300,7 @@
 	/**
 	 * Check the type of the given value, and convert the value to the given
 	 * type if needed (see Java Language Spec, section 5.2).
-	 * 
+	 *
 	 * @return the (converted) value.
 	 * @throws InvalidTypeException
 	 *             if the given value is no assignment compatible with the given
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VerboseWriter.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VerboseWriter.java
index f724f39..f2c0aed 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VerboseWriter.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VerboseWriter.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -44,7 +44,7 @@
 	 */
 	public VerboseWriter(PrintWriter out) {
 		fOutput = out;
-		fLineBuffer = new ArrayList<StringBuffer>();
+		fLineBuffer = new ArrayList<>();
 		fPosition = 0;
 		fLineBuffer.add(new StringBuffer());
 	}
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineImpl.java
index 60f4748..557815f 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineImpl.java
@@ -57,7 +57,7 @@
 /**
  * This class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class VirtualMachineImpl extends MirrorImpl implements VirtualMachine,
 		org.eclipse.jdi.hcr.VirtualMachine, org.eclipse.jdi.VirtualMachine {
@@ -374,7 +374,7 @@
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			List<ReferenceType> elements = new ArrayList<ReferenceType>(nrOfElements);
+			List<ReferenceType> elements = new ArrayList<>(nrOfElements);
 			for (int i = 0; i < nrOfElements; i++) {
 				ReferenceTypeImpl elt = ReferenceTypeImpl
 						.readWithTypeTagAndSignature(this,
@@ -423,7 +423,7 @@
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			List<ThreadReference> elements = new ArrayList<ThreadReference>(nrOfElements);
+			List<ThreadReference> elements = new ArrayList<>(nrOfElements);
 			for (int i = 0; i < nrOfElements; i++) {
 				ThreadReferenceImpl elt = ThreadReferenceImpl.read(this,
 						replyData);
@@ -654,7 +654,7 @@
 			defaultReplyErrorHandler(replyPacket.errorCode());
 			DataInputStream replyData = replyPacket.dataInStream();
 			int nrOfElements = readInt("elements", replyData); //$NON-NLS-1$
-			List<ReferenceType> elements = new ArrayList<ReferenceType>(nrOfElements);
+			List<ReferenceType> elements = new ArrayList<>(nrOfElements);
 			for (int i = 0; i < nrOfElements; i++) {
 				ReferenceTypeImpl elt = ReferenceTypeImpl.readWithTypeTag(this,
 						replyData);
@@ -908,7 +908,7 @@
 
 			DataInputStream replyData = replyPacket.dataInStream();
 			int nrGroups = readInt("nr of groups", replyData); //$NON-NLS-1$
-			ArrayList<ThreadGroupReference> result = new ArrayList<ThreadGroupReference>(nrGroups);
+			ArrayList<ThreadGroupReference> result = new ArrayList<>(nrGroups);
 			for (int i = 0; i < nrGroups; i++) {
 				ThreadGroupReferenceImpl threadGroup = ThreadGroupReferenceImpl.read(this, replyData);
 				result.add(threadGroup);
@@ -1184,7 +1184,7 @@
 		}
 
 		Field[] fields = VirtualMachineImpl.class.getDeclaredFields();
-		fgHCRResultMap = new HashMap<Integer, String>();
+		fgHCRResultMap = new HashMap<>();
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
@@ -1236,7 +1236,7 @@
 	/**
 	 * Returns whether the JDWP version is greater than or equal to the
 	 * specified major/minor version numbers.
-	 * 
+	 *
 	 * @return whether the JDWP version is greater than or equal to the
 	 *         specified major/minor version numbers
 	 */
@@ -1494,7 +1494,7 @@
 
 	/**
 	 * Returns whether this VM is disconnected.
-	 * 
+	 *
 	 * @return whether this VM is disconnected
 	 */
 	public boolean isDisconnected() {
@@ -1503,7 +1503,7 @@
 
 	/**
 	 * Sets whether this VM is disconnected.
-	 * 
+	 *
 	 * @param disconected
 	 *            whether this VM is disconnected
 	 */
@@ -1593,7 +1593,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.VirtualMachine#canBeModified()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineManagerImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineManagerImpl.java
index f75fcdc..d983e73 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineManagerImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VirtualMachineManagerImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -52,7 +52,7 @@
 	 */
 	private PrintWriter fVerbosePrintWriter = null;
 	/** List of all VMs that are currently connected. */
-	List<VirtualMachine> fConnectedVMs = new ArrayList<VirtualMachine>();
+	List<VirtualMachine> fConnectedVMs = new ArrayList<>();
 	/** True if in verbose mode. */
 	private boolean fVerbose = false;
 	/** Name of verbose file. */
@@ -143,9 +143,9 @@
 			IPreferencesService srvc = Platform.getPreferencesService();
 			if(srvc != null) {
 				return Platform.getPreferencesService().getInt(
-						JDIDebugModel.getPluginIdentifier(), 
-						JDIDebugModel.PREF_REQUEST_TIMEOUT, 
-						JDIDebugModel.DEF_REQUEST_TIMEOUT, 
+						JDIDebugModel.getPluginIdentifier(),
+						JDIDebugModel.PREF_REQUEST_TIMEOUT,
+						JDIDebugModel.DEF_REQUEST_TIMEOUT,
 						null);
 			}
 		} catch (NoClassDefFoundError e) {
@@ -182,7 +182,7 @@
 	 */
 	@Override
 	public List<Connector> allConnectors() {
-		List<Connector> result = new ArrayList<Connector>(attachingConnectors());
+		List<Connector> result = new ArrayList<>(attachingConnectors());
 		result.addAll(launchingConnectors());
 		result.addAll(listeningConnectors());
 		return result;
@@ -193,7 +193,7 @@
 	 */
 	@Override
 	public List<AttachingConnector> attachingConnectors() {
-		ArrayList<AttachingConnector> list = new ArrayList<AttachingConnector>(1);
+		ArrayList<AttachingConnector> list = new ArrayList<>(1);
 		list.add(new SocketAttachingConnectorImpl(this));
 		return list;
 	}
@@ -203,7 +203,7 @@
 	 */
 	@Override
 	public List<LaunchingConnector> launchingConnectors() {
-		ArrayList<LaunchingConnector> list = new ArrayList<LaunchingConnector>(2);
+		ArrayList<LaunchingConnector> list = new ArrayList<>(2);
 		list.add(new SocketLaunchingConnectorImpl(this));
 		list.add(new SocketRawLaunchingConnectorImpl(this));
 		return list;
@@ -214,7 +214,7 @@
 	 */
 	@Override
 	public List<ListeningConnector> listeningConnectors() {
-		ArrayList<ListeningConnector> list = new ArrayList<ListeningConnector>(1);
+		ArrayList<ListeningConnector> list = new ArrayList<>(1);
 		list.add(new SocketListeningConnectorImpl(this));
 		return list;
 	}
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidTypeImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidTypeImpl.java
index 6a18f07..7b3d2e2 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidTypeImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidTypeImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class VoidTypeImpl extends TypeImpl implements VoidType {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidValueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidValueImpl.java
index b5daa51..214ea47 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidValueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/VoidValueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class VoidValueImpl extends ValueImpl implements VoidValue {
 	/** JDWP Tag. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/ConnectorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/ConnectorImpl.java
index 69e5f0e..5bfffab 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/ConnectorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/ConnectorImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Ivan Popov - Bug 184211: JDI connectors throw NullPointerException if used separately
@@ -27,7 +27,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class ConnectorImpl implements Connector {
 	/** Virtual machine manager that created this connector. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketManager.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketManager.java
index ea6786f..fb06e69 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketManager.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketManager.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,7 +17,7 @@
 /**
  * This class implements threads that receive/send packets from/to the Virtual
  * Machine.
- * 
+ *
  */
 public abstract class PacketManager implements Runnable {
 	/** Connector that performs IO to Virtual Machine. */
@@ -43,7 +43,7 @@
 	/**
 	 * Used to indicate that an IO exception occurred, closes connection to
 	 * Virtual Machine.
-	 * 
+	 *
 	 * @param disconnectException
 	 *            the IOException that occurred
 	 */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java
index 54423ac..2393096 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java
@@ -60,9 +60,9 @@
 	public PacketReceiveManager(Connection connection, VirtualMachineImpl vmImpl) {
 		super(connection);
 		fVM = vmImpl;
-		fCommandPackets = new LinkedList<JdwpCommandPacket>();
-		fReplyPackets = new LinkedList<JdwpReplyPacket>();
-		fTimedOutPackets = new ArrayList<Integer>();
+		fCommandPackets = new LinkedList<>();
+		fReplyPackets = new LinkedList<>();
+		fTimedOutPackets = new ArrayList<>();
 	}
 
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketSendManager.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketSendManager.java
index 62b755a..4d67de6 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketSendManager.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketSendManager.java
@@ -23,7 +23,7 @@
 /**
  * This class implements a thread that sends available packets to the Virtual
  * Machine.
- * 
+ *
  */
 public class PacketSendManager extends PacketManager {
 	/** List of packets to be sent to Virtual Machine */
@@ -34,7 +34,7 @@
 	 */
 	public PacketSendManager(Connection connection) {
 		super(connection);
-		fOutgoingPackets = new LinkedList<JdwpPacket>();
+		fOutgoingPackets = new LinkedList<>();
 	}
 
 	@Override
@@ -103,7 +103,7 @@
 	 */
 	private void sendAvailablePackets() throws InterruptedException,
 			IOException {
-		LinkedList<JdwpPacket> packetsToSend = new LinkedList<JdwpPacket>();
+		LinkedList<JdwpPacket> packetsToSend = new LinkedList<>();
 		synchronized (fOutgoingPackets) {
 			while (fOutgoingPackets.size() == 0) {
 				fOutgoingPackets.wait();
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketAttachingConnectorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketAttachingConnectorImpl.java
index bc63e3d..82d4dac 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketAttachingConnectorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketAttachingConnectorImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -49,22 +49,22 @@
 	 */
 	@Override
 	public Map<String, Connector.Argument> defaultArguments() {
-		HashMap<String, Connector.Argument> arguments = new HashMap<String, Connector.Argument>(2);
+		HashMap<String, Connector.Argument> arguments = new HashMap<>(2);
 
 		// Host name
 		StringArgumentImpl strArg = new StringArgumentImpl(
-				"hostname", ConnectMessages.SocketAttachingConnectorImpl_Machine_name_to_which_to_attach_for_VM_connections_1, ConnectMessages.SocketAttachingConnectorImpl_Host_2, false); //$NON-NLS-1$  
+				"hostname", ConnectMessages.SocketAttachingConnectorImpl_Machine_name_to_which_to_attach_for_VM_connections_1, ConnectMessages.SocketAttachingConnectorImpl_Host_2, false); //$NON-NLS-1$
 		strArg.setValue("localhost"); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Port
 		IntegerArgumentImpl intArg = new IntegerArgumentImpl(
-				"port", ConnectMessages.SocketAttachingConnectorImpl_Port_number_to_which_to_attach_for_VM_connections_3, ConnectMessages.SocketAttachingConnectorImpl_Port_4, true, SocketTransportImpl.MIN_PORTNR, SocketTransportImpl.MAX_PORTNR); //$NON-NLS-1$  
+				"port", ConnectMessages.SocketAttachingConnectorImpl_Port_number_to_which_to_attach_for_VM_connections_3, ConnectMessages.SocketAttachingConnectorImpl_Port_4, true, SocketTransportImpl.MIN_PORTNR, SocketTransportImpl.MAX_PORTNR); //$NON-NLS-1$
 		arguments.put(intArg.name(), intArg);
 
 		// Timeout
 		IntegerArgumentImpl timeoutArg = new IntegerArgumentImpl(
-				"timeout", ConnectMessages.SocketAttachingConnectorImpl_1, ConnectMessages.SocketAttachingConnectorImpl_2, false, 0, Integer.MAX_VALUE); //$NON-NLS-1$  
+				"timeout", ConnectMessages.SocketAttachingConnectorImpl_1, ConnectMessages.SocketAttachingConnectorImpl_2, false, 0, Integer.MAX_VALUE); //$NON-NLS-1$
 		timeoutArg.setValue(0); // by default wait forever
 		arguments.put(timeoutArg.name(), timeoutArg);
 
@@ -136,7 +136,7 @@
 			connection = ((SocketTransportImpl) fTransport).attach(fHostname,
 					fPort, fTimeout, 0);
 		} catch (IllegalArgumentException e) {
-			List<String> args = new ArrayList<String>();
+			List<String> args = new ArrayList<>();
 			args.add("hostname"); //$NON-NLS-1$
 			args.add("port"); //$NON-NLS-1$
 			throw new IllegalConnectorArgumentsException(e.getMessage(), args);
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketConnection.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketConnection.java
index 858fcc1..4ae41ab 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketConnection.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketConnection.java
@@ -37,7 +37,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.Connection#close()
 	 */
 	@Override
@@ -51,7 +51,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.Connection#isOpen()
 	 */
 	@Override
@@ -61,7 +61,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.Connection#readPacket()
 	 */
 	@Override
@@ -98,7 +98,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.Connection#writePacket(byte[])
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketLaunchingConnectorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketLaunchingConnectorImpl.java
index 439af3c..3be7c5c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketLaunchingConnectorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketLaunchingConnectorImpl.java
@@ -68,39 +68,39 @@
 	 */
 	@Override
 	public Map<String, Connector.Argument> defaultArguments() {
-		HashMap<String, Connector.Argument> arguments = new HashMap<String, Connector.Argument>(6);
+		HashMap<String, Connector.Argument> arguments = new HashMap<>(6);
 
 		// Home
 		StringArgumentImpl strArg = new StringArgumentImpl(
-				"home", ConnectMessages.SocketLaunchingConnectorImpl_Home_directory_of_the_SDK_or_runtime_environment_used_to_launch_the_application_1, ConnectMessages.SocketLaunchingConnectorImpl_Home_2, false); //$NON-NLS-1$  
+				"home", ConnectMessages.SocketLaunchingConnectorImpl_Home_directory_of_the_SDK_or_runtime_environment_used_to_launch_the_application_1, ConnectMessages.SocketLaunchingConnectorImpl_Home_2, false); //$NON-NLS-1$
 		strArg.setValue(System.getProperty("java.home")); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Options
 		strArg = new StringArgumentImpl(
-				"options", ConnectMessages.SocketLaunchingConnectorImpl_Launched_VM_options_3, ConnectMessages.SocketLaunchingConnectorImpl_Options_4, false); //$NON-NLS-1$  
+				"options", ConnectMessages.SocketLaunchingConnectorImpl_Launched_VM_options_3, ConnectMessages.SocketLaunchingConnectorImpl_Options_4, false); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Main
 		strArg = new StringArgumentImpl(
-				"main", ConnectMessages.SocketLaunchingConnectorImpl_Main_class_and_arguments__or_if__jar_is_an_option__the_main_jar_file_and_arguments_5, ConnectMessages.SocketLaunchingConnectorImpl_Main_6, true); //$NON-NLS-1$  
+				"main", ConnectMessages.SocketLaunchingConnectorImpl_Main_class_and_arguments__or_if__jar_is_an_option__the_main_jar_file_and_arguments_5, ConnectMessages.SocketLaunchingConnectorImpl_Main_6, true); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Suspend
 		BooleanArgumentImpl boolArg = new BooleanArgumentImpl(
-				"suspend", ConnectMessages.SocketLaunchingConnectorImpl_All_threads_will_be_suspended_before_execution_of_main_7, ConnectMessages.SocketLaunchingConnectorImpl_Suspend_8, false); //$NON-NLS-1$  
+				"suspend", ConnectMessages.SocketLaunchingConnectorImpl_All_threads_will_be_suspended_before_execution_of_main_7, ConnectMessages.SocketLaunchingConnectorImpl_Suspend_8, false); //$NON-NLS-1$
 		boolArg.setValue(true);
 		arguments.put(boolArg.name(), boolArg);
 
 		// Quote
 		strArg = new StringArgumentImpl(
-				"quote", ConnectMessages.SocketLaunchingConnectorImpl_Character_used_to_combine_space_delimited_text_into_a_single_command_line_argument_9, ConnectMessages.SocketLaunchingConnectorImpl_Quote_10, true); //$NON-NLS-1$  
+				"quote", ConnectMessages.SocketLaunchingConnectorImpl_Character_used_to_combine_space_delimited_text_into_a_single_command_line_argument_9, ConnectMessages.SocketLaunchingConnectorImpl_Quote_10, true); //$NON-NLS-1$
 		strArg.setValue("\""); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Launcher
 		strArg = new StringArgumentImpl(
-				"vmexec", ConnectMessages.SocketLaunchingConnectorImpl_Name_of_the_Java_VM_launcher_11, ConnectMessages.SocketLaunchingConnectorImpl_Launcher_12, true); //$NON-NLS-1$  
+				"vmexec", ConnectMessages.SocketLaunchingConnectorImpl_Name_of_the_Java_VM_launcher_11, ConnectMessages.SocketLaunchingConnectorImpl_Launcher_12, true); //$NON-NLS-1$
 		strArg.setValue("java"); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
@@ -207,7 +207,7 @@
 			proc.destroy();
 			String message = NLS.bind(ConnectMessages.SocketLaunchingConnectorImpl_VM_did_not_connect_within_given_time___0__ms_1,
 							new String[] { ((Connector.IntegerArgument) args
-									.get("timeout")).value() }); //$NON-NLS-1$ 
+									.get("timeout")).value() }); //$NON-NLS-1$
 			throw new VMStartException(message, proc);
 		}
 
@@ -218,7 +218,7 @@
 	/**
 	 * Returns a free port number on localhost, or -1 if unable to find a free
 	 * port.
-	 * 
+	 *
 	 * @return a free port number on localhost, or -1 if unable to find a free
 	 *         port
 	 * @since 3.2
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketListeningConnectorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketListeningConnectorImpl.java
index ce62aa4..86ab266 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketListeningConnectorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketListeningConnectorImpl.java
@@ -47,19 +47,19 @@
 	 */
 	@Override
 	public Map<String, Connector.Argument> defaultArguments() {
-		HashMap<String, Connector.Argument> arguments = new HashMap<String, Connector.Argument>(1);
+		HashMap<String, Connector.Argument> arguments = new HashMap<>(1);
 
 		// Port
 		IntegerArgumentImpl intArg = new IntegerArgumentImpl(
-				"port", ConnectMessages.SocketListeningConnectorImpl_Port_number_at_which_to_listen_for_VM_connections_1, ConnectMessages.SocketListeningConnectorImpl_Port_2, true, SocketTransportImpl.MIN_PORTNR, SocketTransportImpl.MAX_PORTNR); //$NON-NLS-1$  
+				"port", ConnectMessages.SocketListeningConnectorImpl_Port_number_at_which_to_listen_for_VM_connections_1, ConnectMessages.SocketListeningConnectorImpl_Port_2, true, SocketTransportImpl.MIN_PORTNR, SocketTransportImpl.MAX_PORTNR); //$NON-NLS-1$
 		arguments.put(intArg.name(), intArg);
 
 		// Timeout
 		intArg = new IntegerArgumentImpl(
-				"timeout", ConnectMessages.SocketListeningConnectorImpl_Timeout_before_accept_returns_3, ConnectMessages.SocketListeningConnectorImpl_Timeout_4, false, 0, Integer.MAX_VALUE); //$NON-NLS-1$  
+				"timeout", ConnectMessages.SocketListeningConnectorImpl_Timeout_before_accept_returns_3, ConnectMessages.SocketListeningConnectorImpl_Timeout_4, false, 0, Integer.MAX_VALUE); //$NON-NLS-1$
 		arguments.put(intArg.name(), intArg);
 
-		// FIXME: connectionLimit is not actually used in this class, but in the higher-level controller, SocketListenConnector.  
+		// FIXME: connectionLimit is not actually used in this class, but in the higher-level controller, SocketListenConnector.
 		// But IntegerArgumentImpl is package restricted so we must put it here.
 		intArg = new IntegerArgumentImpl("connectionLimit", ConnectMessages.SocketListeningConnectorImpl_Limit_incoming_connections, ConnectMessages.SocketListeningConnectorImpl_Limit, false, 0, Integer.MAX_VALUE); //$NON-NLS-1$
 		intArg.setValue(1);  // mimics previous behaviour, allowing a single connection
@@ -126,7 +126,7 @@
 
 	/**
 	 * Listens for one or more connections initiated by target VMs.
-	 * 
+	 *
 	 * @return Returns the address at which the connector is listening for a
 	 *         connection.
 	 */
@@ -154,7 +154,7 @@
 
 	/**
 	 * Waits for a target VM to attach to this connector.
-	 * 
+	 *
 	 * @return Returns a connected Virtual Machine.
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketRawLaunchingConnectorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketRawLaunchingConnectorImpl.java
index 2634bb1..9986bb1 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketRawLaunchingConnectorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketRawLaunchingConnectorImpl.java
@@ -56,21 +56,21 @@
 	 */
 	@Override
 	public Map<String, Connector.Argument> defaultArguments() {
-		HashMap<String, Connector.Argument> arguments = new HashMap<String, Connector.Argument>(3);
+		HashMap<String, Connector.Argument> arguments = new HashMap<>(3);
 
 		// Command
 		StringArgumentImpl strArg = new StringArgumentImpl(
-				"command", ConnectMessages.SocketRawLaunchingConnectorImpl_Raw_command_to_start_the_debugged_application_VM_1, ConnectMessages.SocketRawLaunchingConnectorImpl_Command_2, true); //$NON-NLS-1$  
+				"command", ConnectMessages.SocketRawLaunchingConnectorImpl_Raw_command_to_start_the_debugged_application_VM_1, ConnectMessages.SocketRawLaunchingConnectorImpl_Command_2, true); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Address
 		strArg = new StringArgumentImpl(
-				"address", ConnectMessages.SocketRawLaunchingConnectorImpl_Address_from_which_to_listen_for_a_connection_after_the_raw_command_is_run_3, ConnectMessages.SocketRawLaunchingConnectorImpl_Address_4, true); //$NON-NLS-1$  
+				"address", ConnectMessages.SocketRawLaunchingConnectorImpl_Address_from_which_to_listen_for_a_connection_after_the_raw_command_is_run_3, ConnectMessages.SocketRawLaunchingConnectorImpl_Address_4, true); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
 		// Quote
 		strArg = new StringArgumentImpl(
-				"quote", ConnectMessages.SocketRawLaunchingConnectorImpl_Character_used_to_combine_space_delimited_text_into_a_single_command_line_argument_5, ConnectMessages.SocketRawLaunchingConnectorImpl_Quote_6, true); //$NON-NLS-1$  
+				"quote", ConnectMessages.SocketRawLaunchingConnectorImpl_Character_used_to_combine_space_delimited_text_into_a_single_command_line_argument_5, ConnectMessages.SocketRawLaunchingConnectorImpl_Quote_6, true); //$NON-NLS-1$
 		strArg.setValue("\""); //$NON-NLS-1$
 		arguments.put(strArg.name(), strArg);
 
@@ -153,7 +153,7 @@
 			proc.destroy();
 			String message = NLS.bind(ConnectMessages.SocketLaunchingConnectorImpl_VM_did_not_connect_within_given_time___0__ms_1,
 							new String[] { ((Connector.IntegerArgument) args
-									.get("timeout")).value() }); //$NON-NLS-1$ 
+									.get("timeout")).value() }); //$NON-NLS-1$
 			throw new VMStartException(message, proc);
 		}
 
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportImpl.java
index dcb12d3..624d3e6 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,7 +33,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.Transport#name()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportService.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportService.java
index e8b2c75..f363e24 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportService.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/SocketTransportService.java
@@ -65,7 +65,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see com.sun.jdi.connect.spi.TransportService.ListenKey#address()
 		 */
 		@Override
@@ -79,7 +79,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * com.sun.jdi.connect.spi.TransportService#accept(com.sun.jdi.connect.spi
 	 * .TransportService.ListenKey, long, long)
@@ -107,7 +107,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.TransportService#attach(java.lang.String,
 	 * long, long)
 	 */
@@ -226,7 +226,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.TransportService#capabilities()
 	 */
 	@Override
@@ -236,7 +236,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.TransportService#description()
 	 */
 	@Override
@@ -246,7 +246,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.TransportService#name()
 	 */
 	@Override
@@ -256,7 +256,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.connect.spi.TransportService#startListening()
 	 */
 	@Override
@@ -267,7 +267,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * com.sun.jdi.connect.spi.TransportService#startListening(java.lang.String)
 	 */
@@ -298,7 +298,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * com.sun.jdi.connect.spi.TransportService#stopListening(com.sun.jdi.connect
 	 * .spi.TransportService.ListenKey)
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/TransportImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/TransportImpl.java
index 686a446..42af7ae 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/TransportImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/TransportImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class TransportImpl implements Transport {
 	/** Name of Transport. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/AccessWatchpointEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/AccessWatchpointEventImpl.java
index 194115b..f0dac58 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/AccessWatchpointEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/AccessWatchpointEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class AccessWatchpointEventImpl extends WatchpointEventImpl implements
 		AccessWatchpointEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/BreakpointEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/BreakpointEventImpl.java
index 7a99b8a..e4d81c5 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/BreakpointEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/BreakpointEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class BreakpointEventImpl extends LocatableEventImpl implements
 		BreakpointEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassPrepareEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassPrepareEventImpl.java
index 0fdd93f..e7514aa 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassPrepareEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassPrepareEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassPrepareEventImpl extends EventImpl implements
 		ClassPrepareEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassUnloadEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassUnloadEventImpl.java
index a570b06..c8d4075 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassUnloadEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ClassUnloadEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassUnloadEventImpl extends EventImpl implements ClassUnloadEvent {
 	/** Jdwp Event Kind. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventImpl.java
index bac2fe1..7a0df05 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventImpl.java
@@ -28,7 +28,7 @@
 /**
  * This class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class EventImpl extends MirrorImpl implements Event {
 	/** Constants for EventKind. */
@@ -211,7 +211,7 @@
 			return;
 
 		java.lang.reflect.Field[] fields = EventImpl.class.getDeclaredFields();
-		fEventKindMap = new HashMap<Integer, String>();
+		fEventKindMap = new HashMap<>();
 		for (Field field : fields) {
 			if ((field.getModifiers() & java.lang.reflect.Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & java.lang.reflect.Modifier.STATIC) == 0
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventIteratorImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventIteratorImpl.java
index 36ab027..02dceed 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventIteratorImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventIteratorImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class EventIteratorImpl implements EventIterator {
 	/** List iterator implementation of iterator. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventQueueImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventQueueImpl.java
index 3f11ff8..393c1e2 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventQueueImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventQueueImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class EventQueueImpl extends MirrorImpl implements EventQueue {
 	/** Flag used to see if a VMDisconnectEvent has already been generated. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventSetImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventSetImpl.java
index 4129b40..642e1a9 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventSetImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/EventSetImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,7 +31,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class EventSetImpl extends MirrorImpl implements EventSet {
 	/** Set that is used to store events. */
@@ -51,7 +51,7 @@
 	 */
 	public EventSetImpl(VirtualMachineImpl vmImpl, EventImpl[] events) {
 		this(vmImpl);
-		fEvents = new ArrayList<Event>(events.length);
+		fEvents = new ArrayList<>(events.length);
 		for (EventImpl event : events)
 			fEvents.add(event);
 	}
@@ -61,7 +61,7 @@
 	 */
 	public EventSetImpl(VirtualMachineImpl vmImpl, EventImpl event) {
 		this(vmImpl);
-		fEvents = new ArrayList<Event>(1);
+		fEvents = new ArrayList<>(1);
 		fEvents.add(event);
 	}
 
@@ -129,7 +129,7 @@
 			return;
 		}
 		Iterator<Event> iter = fEvents.iterator();
-		List<ThreadReference> resumedThreads = new ArrayList<ThreadReference>(fEvents.size());
+		List<ThreadReference> resumedThreads = new ArrayList<>(fEvents.size());
 		while (iter.hasNext()) {
 			EventImpl event = (EventImpl)iter.next();
 			ThreadReference thread = event.thread();
@@ -161,7 +161,7 @@
 		// Read size.
 		int size = target.readInt("size", in); //$NON-NLS-1$
 		// Create event list.
-		eventSet.fEvents = new ArrayList<Event>(size);
+		eventSet.fEvents = new ArrayList<>(size);
 
 		while (size-- > 0) {
 			EventImpl event = EventImpl.read(target, in);
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ExceptionEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ExceptionEventImpl.java
index 2a38360..9491d18 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ExceptionEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ExceptionEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ExceptionEventImpl extends LocatableEventImpl implements
 		ExceptionEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/LocatableEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/LocatableEventImpl.java
index f3d30a4..71e03f7 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/LocatableEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/LocatableEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
 /**
  * This class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class LocatableEventImpl extends EventImpl implements Locatable {
 	/** Location where event occurred. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodEntryEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodEntryEventImpl.java
index e2b2110..26965d0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodEntryEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodEntryEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class MethodEntryEventImpl extends LocatableEventImpl implements
 		MethodEntryEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodExitEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodExitEventImpl.java
index eb8a862..8b0c4be 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodExitEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MethodExitEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -25,7 +25,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class MethodExitEventImpl extends LocatableEventImpl implements
 		MethodExitEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ModificationWatchpointEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ModificationWatchpointEventImpl.java
index 7ce9dd3..3d4c4dd 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ModificationWatchpointEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ModificationWatchpointEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ModificationWatchpointEventImpl extends WatchpointEventImpl
 		implements ModificationWatchpointEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnterEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnterEventImpl.java
index f0587a7..7e3180b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnterEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnterEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 /**
  * This class provides an implementation of MonitorContendedEnterEvent according
  * to Sun's 1.6 specs
- * 
+ *
  * @since 3.3
  */
 public class MonitorContendedEnterEventImpl extends LocatableEventImpl
@@ -63,7 +63,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.event.MonitorContendedEnterEvent#monitor()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnteredEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnteredEventImpl.java
index 8ec51c6..318ab98 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnteredEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorContendedEnteredEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 /**
  * This class provides an implementation of MonitorContendedEnteredEvent
  * according to Sun's 1.6 specs
- * 
+ *
  * @since 3.3
  */
 public class MonitorContendedEnteredEventImpl extends LocatableEventImpl
@@ -63,7 +63,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.event.MonitorContendedEnteredEvent#monitor()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitEventImpl.java
index 23ffbad..eb30843 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -62,7 +62,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.event.MonitorWaitedEvent#monitor()
 	 */
 	@Override
@@ -72,7 +72,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.event.MonitorWaitEvent#timeout()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitedEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitedEventImpl.java
index dcebca7..8878e05 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitedEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/MonitorWaitedEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,7 +28,7 @@
 /**
  * This class provides an implementation of MonitorContendedEnterEvent according
  * to Sun's 1.6 specs
- * 
+ *
  * @since 3.3
  */
 public class MonitorWaitedEventImpl extends LocatableEventImpl implements
@@ -70,7 +70,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.event.MonitorWaitedEvent#monitor()
 	 */
 	@Override
@@ -80,7 +80,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see com.sun.jdi.event.MonitorWaitedEvent#timedout()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/StepEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/StepEventImpl.java
index e6cfa2f..613f9c9 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/StepEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/StepEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class StepEventImpl extends LocatableEventImpl implements StepEvent {
 	/** Jdwp Event Kind. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadDeathEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadDeathEventImpl.java
index dec9494..c3762df 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadDeathEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadDeathEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ThreadDeathEventImpl extends EventImpl implements ThreadDeathEvent {
 	/** Jdwp Event Kind. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadStartEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadStartEventImpl.java
index 62ab023..f78b7a0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadStartEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/ThreadStartEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ThreadStartEventImpl extends EventImpl implements ThreadStartEvent {
 	/** Jdwp Event Kind. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDeathEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDeathEventImpl.java
index d32dee1..19486b9 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDeathEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDeathEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class VMDeathEventImpl extends EventImpl implements VMDeathEvent {
 	/** Jdwp Event Kind. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDisconnectEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDisconnectEventImpl.java
index 6c37909..6de4b8b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDisconnectEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMDisconnectEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class VMDisconnectEventImpl extends EventImpl implements
 		VMDisconnectEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMStartEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMStartEventImpl.java
index 85f4998..db3034d 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMStartEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/VMStartEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class VMStartEventImpl extends EventImpl implements VMStartEvent {
 	/** Jdwp Event Kind. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/WatchpointEventImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/WatchpointEventImpl.java
index 2ef1db1..5325d42 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/WatchpointEventImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/event/WatchpointEventImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,7 +27,7 @@
 /**
  * This class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class WatchpointEventImpl extends LocatableEventImpl implements
 		WatchpointEvent {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JDWPMessages.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JDWPMessages.java
index 8dcb07d..1ccc113 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JDWPMessages.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JDWPMessages.java
@@ -3,8 +3,8 @@
  * program and the accompanying materials are made available under the terms of
  * the Eclipse Public License v1.0 which accompanies this distribution, and is
  * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
+ *
+ * Contributors:
  * IBM - Initial API and implementation
  **********************************************************************/
 package org.eclipse.jdi.internal.jdwp;
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpArrayID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpArrayID.java
index a394d9c..703b454 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpArrayID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpArrayID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpArrayID extends JdwpReferenceTypeID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassID.java
index bb91a0f..1b2e1bb 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpClassID extends JdwpReferenceTypeID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassLoaderID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassLoaderID.java
index c3a8d58..04162fb 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassLoaderID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassLoaderID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpClassLoaderID extends JdwpObjectID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassObjectID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassObjectID.java
index 5d337dc..86c595a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassObjectID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpClassObjectID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpClassObjectID extends JdwpObjectID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java
index ed2e326..103383c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
@@ -20,7 +20,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP)
  * packet declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpCommandPacket extends JdwpPacket {
 	/** Command Sets. */
@@ -257,7 +257,7 @@
 		Field[] fields = JdwpCommandPacket.class.getDeclaredFields();
 
 		// First get the set names.
-		Map<Integer, String> setNames = new HashMap<Integer, String>(fields.length);
+		Map<Integer, String> setNames = new HashMap<>(fields.length);
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
@@ -282,7 +282,7 @@
 		}
 
 		// Get the commands.
-		fgCommandMap = new HashMap<Integer, String>();
+		fgCommandMap = new HashMap<>();
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
@@ -332,7 +332,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#toString()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFieldID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFieldID.java
index ea2e58b..5d36bad 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFieldID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFieldID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpFieldID extends JdwpID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFrameID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFrameID.java
index 102d499..acc725a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFrameID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpFrameID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpFrameID extends JdwpID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpID.java
index 33d79a5..868f6ab 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * From this class all Java Debug Wire Protocol (JDWP) IDs declared by the JDWP
  * specification are derived.
- * 
+ *
  */
 public abstract class JdwpID {
 	/** Tag Constants. */
@@ -161,8 +161,8 @@
 			return;
 
 		java.lang.reflect.Field[] fields = JdwpID.class.getDeclaredFields();
-		fTagMap = new HashMap<Integer, String>();
-		fTypeTagMap = new HashMap<Integer, String>();
+		fTagMap = new HashMap<>();
+		fTypeTagMap = new HashMap<>();
 		for (Field field : fields) {
 			if ((field.getModifiers() & java.lang.reflect.Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & java.lang.reflect.Modifier.STATIC) == 0
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpInterfaceID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpInterfaceID.java
index c148622..77ee5e0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpInterfaceID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpInterfaceID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpInterfaceID extends JdwpReferenceTypeID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpMethodID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpMethodID.java
index 630ac32..aa0a32d 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpMethodID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpMethodID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpMethodID extends JdwpID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpObjectID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpObjectID.java
index 3419a1c..417f5d0 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpObjectID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpObjectID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpObjectID extends JdwpID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpPacket.java
index ed0f6ef..e47828d 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpPacket.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP)
  * packet declared by the JDWP specification.
- * 
+ *
  */
 public abstract class JdwpPacket {
 	/** General JDWP constants. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReferenceTypeID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReferenceTypeID.java
index e351408..54dcab3 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReferenceTypeID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReferenceTypeID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpReferenceTypeID extends JdwpID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReplyPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReplyPacket.java
index 0622e15..90f333b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReplyPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpReplyPacket.java
@@ -19,7 +19,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP)
  * packet declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpReplyPacket extends JdwpPacket {
 	/** Error code constants. */
@@ -139,7 +139,7 @@
 		}
 
 		Field[] fields = JdwpReplyPacket.class.getDeclaredFields();
-		fErrorMap = new HashMap<Integer, String>(fields.length);
+		fErrorMap = new HashMap<>(fields.length);
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
@@ -169,7 +169,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#toString()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpString.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpString.java
index 0bf384e..8b1af64 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpString.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpString.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpString {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpStringID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpStringID.java
index 70c91f0..fd19a1a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpStringID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpStringID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpStringID extends JdwpObjectID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadGroupID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadGroupID.java
index d634c32..f3e3de9 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadGroupID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadGroupID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpThreadGroupID extends JdwpObjectID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadID.java
index 942bc64..2439c12 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpThreadID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP) ID
  * declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpThreadID extends JdwpObjectID {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/AccessWatchpointRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/AccessWatchpointRequestImpl.java
index 6adff9b..611e13a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/AccessWatchpointRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/AccessWatchpointRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class AccessWatchpointRequestImpl extends WatchpointRequestImpl
 		implements AccessWatchpointRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/BreakpointRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/BreakpointRequestImpl.java
index dca970b..4458f6c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/BreakpointRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/BreakpointRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class BreakpointRequestImpl extends EventRequestImpl implements
 		BreakpointRequest, Locatable {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassPrepareRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassPrepareRequestImpl.java
index 9173d9a..dd14eb6 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassPrepareRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassPrepareRequestImpl.java
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassPrepareRequestImpl extends EventRequestImpl implements
 		ClassPrepareRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassUnloadRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassUnloadRequestImpl.java
index 3aae982..dc91026 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassUnloadRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ClassUnloadRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ClassUnloadRequestImpl extends EventRequestImpl implements
 		ClassUnloadRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestImpl.java
index 21f43c6..c86bb83 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestImpl.java
@@ -43,7 +43,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class EventRequestImpl extends MirrorImpl implements
 		EventRequest {
@@ -137,7 +137,7 @@
 	protected ArrayList<ObjectReference> fInstanceFilters = null;
 	/**
 	 * source name filters
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	protected ArrayList<String> fSourceNameFilters = null;
@@ -177,7 +177,7 @@
 	@Override
 	public void putProperty(Object key, Object value) {
 		if (fPropertyMap == null)
-			fPropertyMap = new HashMap<Object, Object>();
+			fPropertyMap = new HashMap<>();
 
 		if (value == null)
 			fPropertyMap.remove(key);
@@ -344,7 +344,7 @@
 	public void addCountFilter(int count) throws InvalidRequestStateException {
 		checkDisabled();
 		if (fCountFilters == null)
-			fCountFilters = new ArrayList<Integer>();
+			fCountFilters = new ArrayList<>();
 
 		fCountFilters.add(new Integer(count));
 	}
@@ -360,7 +360,7 @@
 		if (threadFilter.isCollected())
 			throw new ObjectCollectedException();
 		if (fThreadFilters == null)
-			fThreadFilters = new ArrayList<ThreadReference>();
+			fThreadFilters = new ArrayList<>();
 
 		fThreadFilters.add(threadFilter);
 	}
@@ -374,7 +374,7 @@
 		checkVM(filter);
 		checkDisabled();
 		if (fClassFilterRefs == null)
-			fClassFilterRefs = new ArrayList<ReferenceType>();
+			fClassFilterRefs = new ArrayList<>();
 
 		fClassFilterRefs.add(filter);
 	}
@@ -387,7 +387,7 @@
 			throws InvalidRequestStateException {
 		checkDisabled();
 		if (fClassFilters == null)
-			fClassFilters = new ArrayList<String>();
+			fClassFilters = new ArrayList<>();
 
 		fClassFilters.add(filter);
 	}
@@ -401,7 +401,7 @@
 			throws InvalidRequestStateException {
 		checkDisabled();
 		if (fClassExclusionFilters == null)
-			fClassExclusionFilters = new ArrayList<String>();
+			fClassExclusionFilters = new ArrayList<>();
 
 		fClassExclusionFilters.add(filter);
 	}
@@ -416,7 +416,7 @@
 		// Used in createBreakpointRequest.
 		checkVM(location);
 		if (fLocationFilters == null)
-			fLocationFilters = new ArrayList<LocationImpl>();
+			fLocationFilters = new ArrayList<>();
 
 		fLocationFilters.add(location);
 	}
@@ -434,7 +434,7 @@
 			checkVM(refType);
 
 		if (fExceptionFilters == null)
-			fExceptionFilters = new ArrayList<ExceptionFilter>();
+			fExceptionFilters = new ArrayList<>();
 
 		ExceptionFilter filter = new ExceptionFilter();
 		filter.fException = refType;
@@ -451,7 +451,7 @@
 		// Used in createXWatchpointRequest methods.
 		checkVM(field);
 		if (fFieldFilters == null)
-			fFieldFilters = new ArrayList<FieldImpl>();
+			fFieldFilters = new ArrayList<>();
 
 		fFieldFilters.add(field);
 	}
@@ -467,7 +467,7 @@
 		checkVM(thread);
 
 		if (fThreadStepFilters == null)
-			fThreadStepFilters = new ArrayList<ThreadStepFilter>();
+			fThreadStepFilters = new ArrayList<>();
 
 		ThreadStepFilter filter = new ThreadStepFilter();
 		filter.fThread = thread;
@@ -478,7 +478,7 @@
 
 	/**
 	 * Helper method which allows instance filters to be added
-	 * 
+	 *
 	 * @param instance
 	 *            the object ref instance to add to the listing
 	 */
@@ -486,7 +486,7 @@
 		checkDisabled();
 		checkVM(instance);
 		if (fInstanceFilters == null) {
-			fInstanceFilters = new ArrayList<ObjectReference>();
+			fInstanceFilters = new ArrayList<>();
 		}
 		fInstanceFilters.add(instance);
 	}
@@ -494,7 +494,7 @@
 	/**
 	 * Adds a source name filter to the request. An exact match or pattern
 	 * beginning OR ending in '*'.
-	 * 
+	 *
 	 * @param pattern
 	 *            source name pattern
 	 * @since 3.3
@@ -502,7 +502,7 @@
 	public void addSourceNameFilter(String pattern) {
 		checkDisabled();
 		if (fSourceNameFilters == null) {
-			fSourceNameFilters = new ArrayList<String>();
+			fSourceNameFilters = new ArrayList<>();
 		}
 		fSourceNameFilters.add(pattern);
 	}
@@ -714,7 +714,7 @@
 
 	/**
 	 * Returns whether JDWP supports source name filters (a 1.6 feature).
-	 * 
+	 *
 	 * @return whether JDWP supports source name filters
 	 */
 	private boolean supportsSourceNameFilters() {
@@ -731,10 +731,10 @@
 
 		java.lang.reflect.Field[] fields = EventRequestImpl.class
 				.getDeclaredFields();
-		fStepSizeMap = new HashMap<Integer, String>();
-		fStepDepthMap = new HashMap<Integer, String>();
-		fSuspendPolicyMap = new HashMap<Integer, String>();
-		fModifierKindMap = new HashMap<Integer, String>();
+		fStepSizeMap = new HashMap<>();
+		fStepDepthMap = new HashMap<>();
+		fSuspendPolicyMap = new HashMap<>();
+		fModifierKindMap = new HashMap<>();
 		for (Field field : fields) {
 			if ((field.getModifiers() & java.lang.reflect.Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & java.lang.reflect.Modifier.STATIC) == 0
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestManagerImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestManagerImpl.java
index 1fb53fd..a86f15f 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestManagerImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/EventRequestManagerImpl.java
@@ -83,36 +83,36 @@
 		private Hashtable<RequestID, RT> enabledrequests;
 
 		private EventRequestType() {
-			requests= new ArrayList<RT>();
-			enabledrequests= new Hashtable<RequestID, RT>();
+			requests= new ArrayList<>();
+			enabledrequests= new Hashtable<>();
 		}
-		
+
 		public List<RT> getUnmodifiableList() {
 			return Collections.unmodifiableList(requests);
 		}
-		
+
 		public void clear() {
 			requests.clear();
 			enabledrequests.clear();
 		}
 	}
-	
-	private EventRequestType<AccessWatchpointRequest> ACCESS_WATCHPOINT_TYPE= new EventRequestType<AccessWatchpointRequest>();
-	private EventRequestType<BreakpointRequest> BREAKPOINT_TYPE= new EventRequestType<BreakpointRequest>();
-	private EventRequestType<ClassPrepareRequest> CLASS_PREPARE_TYPE= new EventRequestType<ClassPrepareRequest>();
-	private EventRequestType<ClassUnloadRequest> CLASS_UNLOAD_TYPE= new EventRequestType<ClassUnloadRequest>();
-	private EventRequestType<MethodEntryRequest> METHOD_ENTRY_TYPE= new EventRequestType<MethodEntryRequest>();
-	private EventRequestType<MethodExitRequest> METHOD_EXIT_TYPE= new EventRequestType<MethodExitRequest>();
-	private EventRequestType<ExceptionRequest> EXCEPTION_TYPE= new EventRequestType<ExceptionRequest>();
-	private EventRequestType<ModificationWatchpointRequest> MODIFICATION_WATCHPOINT_TYPE= new EventRequestType<ModificationWatchpointRequest>();
-	private EventRequestType<StepRequest> STEP_TYPE= new EventRequestType<StepRequest>();
-	private EventRequestType<ThreadDeathRequest> THREAD_DEATH_TYPE= new EventRequestType<ThreadDeathRequest>();
-	private EventRequestType<ThreadStartRequest> THREAD_START_TYPE= new EventRequestType<ThreadStartRequest>();
-	private EventRequestType<VMDeathRequest> VM_DEATH_TYPE= new EventRequestType<VMDeathRequest>();
-	private EventRequestType<MonitorContendedEnteredRequest> MONITOR_CONTENDED_ENTERED_TYPE= new EventRequestType<MonitorContendedEnteredRequest>();
-	private EventRequestType<MonitorContendedEnterRequest> MONITOR_CONTENDED_ENTER_TYPE= new EventRequestType<MonitorContendedEnterRequest>();
-	private EventRequestType<MonitorWaitedRequest> MONITOR_WAITED_TYPE= new EventRequestType<MonitorWaitedRequest>();
-	private EventRequestType<MonitorWaitRequest> MONITOR_WAIT_TYPE= new EventRequestType<MonitorWaitRequest>();
+
+	private EventRequestType<AccessWatchpointRequest> ACCESS_WATCHPOINT_TYPE= new EventRequestType<>();
+	private EventRequestType<BreakpointRequest> BREAKPOINT_TYPE= new EventRequestType<>();
+	private EventRequestType<ClassPrepareRequest> CLASS_PREPARE_TYPE= new EventRequestType<>();
+	private EventRequestType<ClassUnloadRequest> CLASS_UNLOAD_TYPE= new EventRequestType<>();
+	private EventRequestType<MethodEntryRequest> METHOD_ENTRY_TYPE= new EventRequestType<>();
+	private EventRequestType<MethodExitRequest> METHOD_EXIT_TYPE= new EventRequestType<>();
+	private EventRequestType<ExceptionRequest> EXCEPTION_TYPE= new EventRequestType<>();
+	private EventRequestType<ModificationWatchpointRequest> MODIFICATION_WATCHPOINT_TYPE= new EventRequestType<>();
+	private EventRequestType<StepRequest> STEP_TYPE= new EventRequestType<>();
+	private EventRequestType<ThreadDeathRequest> THREAD_DEATH_TYPE= new EventRequestType<>();
+	private EventRequestType<ThreadStartRequest> THREAD_START_TYPE= new EventRequestType<>();
+	private EventRequestType<VMDeathRequest> VM_DEATH_TYPE= new EventRequestType<>();
+	private EventRequestType<MonitorContendedEnteredRequest> MONITOR_CONTENDED_ENTERED_TYPE= new EventRequestType<>();
+	private EventRequestType<MonitorContendedEnterRequest> MONITOR_CONTENDED_ENTER_TYPE= new EventRequestType<>();
+	private EventRequestType<MonitorWaitedRequest> MONITOR_WAITED_TYPE= new EventRequestType<>();
+	private EventRequestType<MonitorWaitRequest> MONITOR_WAIT_TYPE= new EventRequestType<>();
 
 	/**
 	 * Creates new EventRequestManager.
@@ -132,7 +132,7 @@
 		ACCESS_WATCHPOINT_TYPE.requests.add(req);
 		return req;
 	}
- 
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createBreakpointRequest(com.sun.jdi.Location)
 	 */
@@ -144,7 +144,7 @@
 		BREAKPOINT_TYPE.requests.add(req);
 		return req;
 	}
- 
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createClassPrepareRequest()
 	 */
@@ -153,8 +153,8 @@
 		ClassPrepareRequestImpl req = new ClassPrepareRequestImpl(virtualMachineImpl());
 		CLASS_PREPARE_TYPE.requests.add(req);
 		return req;
-	} 
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createClassUnloadRequest()
 	 */
@@ -163,8 +163,8 @@
 		ClassUnloadRequestImpl req = new ClassUnloadRequestImpl(virtualMachineImpl());
 		CLASS_UNLOAD_TYPE.requests.add(req);
 		return req;
-	} 
- 	 
+	}
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createExceptionRequest(com.sun.jdi.ReferenceType, boolean, boolean)
 	 */
@@ -175,7 +175,7 @@
 		req.addExceptionFilter(refTypeImpl, notifyCaught, notifyUncaught);
 		EXCEPTION_TYPE.requests.add(req);
 		return req;
-	} 
+	}
 
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createMethodEntryRequest()
@@ -185,7 +185,7 @@
 		MethodEntryRequestImpl req = new MethodEntryRequestImpl(virtualMachineImpl());
 		METHOD_ENTRY_TYPE.requests.add(req);
 		return req;
-	} 
+	}
 
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createMethodExitRequest()
@@ -195,8 +195,8 @@
 		MethodExitRequestImpl req = new MethodExitRequestImpl(virtualMachineImpl());
 		METHOD_EXIT_TYPE.requests.add(req);
 		return req;
-	} 
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createMonitorContendedEnteredRequest()
 	 */
@@ -206,7 +206,7 @@
 		MONITOR_CONTENDED_ENTERED_TYPE.requests.add(req);
 		return req;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createMonitorContendedEnterRequest()
 	 */
@@ -216,7 +216,7 @@
 		MONITOR_CONTENDED_ENTER_TYPE.requests.add(req);
 		return req;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createMonitorWaitedRequest()
 	 */
@@ -226,7 +226,7 @@
 		MONITOR_WAITED_TYPE.requests.add(req);
 		return req;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createMonitorWaitRequest()
 	 */
@@ -236,7 +236,7 @@
 		MONITOR_WAIT_TYPE.requests.add(req);
 		return req;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createModificationWatchpointRequest(com.sun.jdi.Field)
 	 */
@@ -247,19 +247,19 @@
 		req.addFieldFilter(fieldImpl);
 		MODIFICATION_WATCHPOINT_TYPE.requests.add(req);
 		return req;
-	} 
-	 
+	}
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createStepRequest(com.sun.jdi.ThreadReference, int, int)
 	 */
 	@Override
 	public StepRequest createStepRequest(ThreadReference thread, int size, int depth) throws DuplicateRequestException, ObjectCollectedException {
 	   	ThreadReferenceImpl threadImpl = (ThreadReferenceImpl)thread;
-		StepRequestImpl req = new StepRequestImpl(virtualMachineImpl());		
+		StepRequestImpl req = new StepRequestImpl(virtualMachineImpl());
 		req.addStepFilter(threadImpl, size, depth);
 		STEP_TYPE.requests.add(req);
 		return req;
-	} 
+	}
 
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createThreadDeathRequest()
@@ -269,7 +269,7 @@
 		ThreadDeathRequestImpl req = new ThreadDeathRequestImpl(virtualMachineImpl());
 		THREAD_DEATH_TYPE.requests.add(req);
 		return req;
-	} 
+	}
 
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#createThreadStartRequest()
@@ -280,7 +280,7 @@
 		THREAD_START_TYPE.requests.add(req);
 		return req;
 	}
-	
+
 	/*
 	 * @see EventRequestManager#createVMDeathRequest()
 	 */
@@ -289,7 +289,7 @@
 		VMDeathRequestImpl req = new VMDeathRequestImpl(virtualMachineImpl());
 		VM_DEATH_TYPE.requests.add(req);
 		return req;
-	}	
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdi.hcr.EventRequestManager#createReenterStepRequest(com.sun.jdi.ThreadReference)
@@ -306,7 +306,7 @@
 		STEP_TYPE.requests.add(req);
 		return req;
 	}
-	
+
 	/**
 	 * Enables class prepare requests for all loaded classes.  This is
 	 * necessary for current versions of the KVM to function correctly.
@@ -323,11 +323,11 @@
 
 		requestPrepare.enable();
 	}
-	
+
 	/**
 	 * Creates ClassUnloadRequest for maintaining class information for within JDI.
 	 * Needed to known when to flush the cache.
-	 */ 
+	 */
 	public void enableInternalClasUnloadEvent(/* TBD: ReferenceTypeImpl refType*/) {
 		// Note that these requests are not stored in the set of outstanding requests because
 		// they must be invisible from outside.
@@ -342,7 +342,7 @@
 
 	/**
 	 * Checks if a steprequest is for the given thread is already enabled.
-	 */ 
+	 */
 	boolean existsEnabledStepRequest(ThreadReferenceImpl threadImpl) {
 		Enumeration<StepRequest> enumeration = STEP_TYPE.enabledrequests.elements();
 		StepRequestImpl step;
@@ -353,7 +353,7 @@
 		}
 		return false;
 	}
- 
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#deleteAllBreakpoints()
 	 */
@@ -362,10 +362,10 @@
 		EventRequestImpl.clearAllBreakpoints(this);
 		BREAKPOINT_TYPE.clear();
 	}
- 
+
 	/**
 	 * Deletes an EventRequest.
-	 */ 
+	 */
 	private void deleteEventRequest(EventRequestType<? extends EventRequest> type, EventRequestImpl req) throws VMMismatchException {
 		// Remove request from list of requests and from the mapping of requestIDs to requests.
 		checkVM(req);
@@ -375,7 +375,7 @@
 			type.enabledrequests.remove(id);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#deleteEventRequest(com.sun.jdi.request.EventRequest)
 	 */
@@ -421,7 +421,7 @@
 			throw new InternalError(NLS.bind(RequestMessages.EventRequestManagerImpl_EventRequest_type_of__0__is_unknown_1, new String[]{req.toString()}));
 		}
 	}
- 
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#deleteEventRequests(java.util.List)
 	 */
@@ -489,7 +489,7 @@
 	public List<MethodExitRequest> methodExitRequests() {
 		return METHOD_EXIT_TYPE.getUnmodifiableList();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#modificationWatchpointRequests()
 	 */
@@ -521,7 +521,7 @@
 	public List<ThreadStartRequest> threadStartRequests() {
 		return THREAD_START_TYPE.getUnmodifiableList();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see com.sun.jdi.request.EventRequestManager#vmDeathRequests()
 	 */
@@ -545,7 +545,7 @@
 	public List<MonitorContendedEnteredRequest> monitorContendedEnteredRequests() {
     	return MONITOR_CONTENDED_ENTERED_TYPE.getUnmodifiableList();
     }
-    
+
     /* (non-Javadoc)
      * @see com.sun.jdi.request.EventRequestManager#monitorWaitRequests()
      */
@@ -561,7 +561,7 @@
 	public List<MonitorWaitedRequest> monitorWaitedRequests() {
     	return MONITOR_WAITED_TYPE.getUnmodifiableList();
     }
-	
+
 	public void removeRequestIDMapping(EventRequestImpl req) {
 		if (req instanceof AccessWatchpointRequestImpl) {
 			ACCESS_WATCHPOINT_TYPE.enabledrequests.remove(req.requestID());
@@ -597,10 +597,10 @@
 			VM_DEATH_TYPE.enabledrequests.remove(req.requestID());
 		}
 	}
-	
+
 	/**
 	 * Maps a request ID to requests.
-	 */ 
+	 */
 	public void addRequestIDMapping(EventRequestImpl req) {
 		if (req instanceof AccessWatchpointRequestImpl) {
 			ACCESS_WATCHPOINT_TYPE.enabledrequests.put(req.requestID(), (AccessWatchpointRequestImpl) req);
@@ -639,7 +639,7 @@
 
 	/**
 	 * Find Request that matches event.
-	 */ 
+	 */
 	public EventRequest findRequest(EventImpl event) {
 		if (event instanceof AccessWatchpointEventImpl) {
 			return ACCESS_WATCHPOINT_TYPE.enabledrequests.get(event.requestID());
@@ -674,6 +674,6 @@
 		} else if(event instanceof MonitorContendedEnteredEventImpl) {
 			return MONITOR_CONTENDED_ENTERED_TYPE.enabledrequests.get(event.requestID());
 		}
-		throw new InternalError(RequestMessages.EventRequestManagerImpl_Got_event_of_unknown_type_2); 
+		throw new InternalError(RequestMessages.EventRequestManagerImpl_Got_event_of_unknown_type_2);
 	}
 }
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ExceptionRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ExceptionRequestImpl.java
index 8e45c61..f8cf47f 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ExceptionRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ExceptionRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 /**
  * This class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ExceptionRequestImpl extends EventRequestImpl implements
 		ExceptionRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodEntryRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodEntryRequestImpl.java
index cbfa413..80d3949 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodEntryRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodEntryRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class MethodEntryRequestImpl extends EventRequestImpl implements
 		MethodEntryRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodExitRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodExitRequestImpl.java
index 1e0de02..f88e21d 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodExitRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MethodExitRequestImpl.java
@@ -19,7 +19,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class MethodExitRequestImpl extends EventRequestImpl implements
 		MethodExitRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ModificationWatchpointRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ModificationWatchpointRequestImpl.java
index 8f4d991..09566b7 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ModificationWatchpointRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ModificationWatchpointRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ModificationWatchpointRequestImpl extends WatchpointRequestImpl
 		implements ModificationWatchpointRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnterRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnterRequestImpl.java
index a63d42d..41bc86e 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnterRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnterRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  * @since 3.3
  */
 public class MonitorContendedEnterRequestImpl extends EventRequestImpl
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnteredRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnteredRequestImpl.java
index 455dc28..bb481b8 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnteredRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorContendedEnteredRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  * @since 3.3
  */
 public class MonitorContendedEnteredRequestImpl extends EventRequestImpl
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitRequestImpl.java
index 2d431d9..7435960 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  * @since 3.3
  */
 public class MonitorWaitRequestImpl extends EventRequestImpl implements
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitedRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitedRequestImpl.java
index 37a9d64..ded2463 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitedRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/MonitorWaitedRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,7 +16,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  * @since 3.3
  */
 public class MonitorWaitedRequestImpl extends EventRequestImpl implements
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ReenterStepRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ReenterStepRequestImpl.java
index 7361a1b..e6cb949 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ReenterStepRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ReenterStepRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestID.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestID.java
index f2fcc56..4d35361 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestID.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestID.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestMessages.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestMessages.java
index 48352b2..150e7e1 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestMessages.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/RequestMessages.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *  IBM - Initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/StepRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/StepRequestImpl.java
index d83a50b..fe2334d 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/StepRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/StepRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class StepRequestImpl extends EventRequestImpl implements StepRequest {
 	/**
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadDeathRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadDeathRequestImpl.java
index ca133c1..30229c3 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadDeathRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadDeathRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ThreadDeathRequestImpl extends EventRequestImpl implements
 		ThreadDeathRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadStartRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadStartRequestImpl.java
index b335d0c..8dc014e 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadStartRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/ThreadStartRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public class ThreadStartRequestImpl extends EventRequestImpl implements
 		ThreadStartRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/VMDeathRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/VMDeathRequestImpl.java
index 7086cdc..00d05a5 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/VMDeathRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/VMDeathRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/WatchpointRequestImpl.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/WatchpointRequestImpl.java
index 3e7017a..53a8d8b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/WatchpointRequestImpl.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/request/WatchpointRequestImpl.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * this class implements the corresponding interfaces declared by the JDI
  * specification. See the com.sun.jdi package for more information.
- * 
+ *
  */
 public abstract class WatchpointRequestImpl extends EventRequestImpl implements
 		WatchpointRequest {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java
index 6940d32..d459ff1 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP)
  * packet declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpCommandPacket extends JdwpPacket {
 	/** Command Sets. */
@@ -248,7 +248,7 @@
 		Field[] fields = JdwpCommandPacket.class.getDeclaredFields();
 
 		// First get the set names.
-		Map<Integer, String> setNames = new HashMap<Integer, String>(fields.length);
+		Map<Integer, String> setNames = new HashMap<>(fields.length);
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
@@ -273,7 +273,7 @@
 		}
 
 		// Get the commands.
-		fgCommandMap = new HashMap<Integer, String>();
+		fgCommandMap = new HashMap<>();
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpPacket.java
index 3bfd219..741748c 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpPacket.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP)
  * packet declared by the JDWP specification.
- * 
+ *
  */
 public abstract class JdwpPacket {
 	/** General JDWP constants. */
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpReplyPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpReplyPacket.java
index a70c0cf..ac0df7e 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpReplyPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpReplyPacket.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +21,7 @@
 /**
  * This class implements the corresponding Java Debug Wire Protocol (JDWP)
  * packet declared by the JDWP specification.
- * 
+ *
  */
 public class JdwpReplyPacket extends JdwpPacket {
 	/** Error code constants. */
@@ -137,7 +137,7 @@
 		}
 
 		Field[] fields = JdwpReplyPacket.class.getDeclaredFields();
-		fErrorMap = new HashMap<Integer, String>(fields.length);
+		fErrorMap = new HashMap<>(fields.length);
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/TcpipSpy.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/TcpipSpy.java
index efd9fba..074a6af 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/TcpipSpy.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/TcpipSpy.java
@@ -37,7 +37,7 @@
  * connects; 2) The name of the host on which the VM or proxy waits for a JDWP
  * connection; 3) The port number on which the VM or proxy waits for a JDWP
  * connection; 4) The file where the trace is written to.
- * 
+ *
  * Note that if this program is used for tracing JDWP activity of Leapfrog, the
  * 'debug remote program' option must be used, and the J9 proxy must first be
  * started up by hand on the port to which Leapfrog will connect. The J9 proxy
@@ -51,7 +51,7 @@
 	private DataOutputStream fDataOut;
 
 	private static VerbosePacketStream out = new VerbosePacketStream(System.out);
-	private static Map<Integer, JdwpConversation> fPackets = new HashMap<Integer, JdwpConversation>();
+	private static Map<Integer, JdwpConversation> fPackets = new HashMap<>();
 
 	private static int fFieldIDSize;
 	private static int fMethodIDSize;
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/UnableToParseDataException.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/UnableToParseDataException.java
index 2b402ed..1d54528 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/UnableToParseDataException.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/UnableToParseDataException.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/VerbosePacketStream.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/VerbosePacketStream.java
index 9d05da7..d5c133b 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/VerbosePacketStream.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/VerbosePacketStream.java
@@ -553,7 +553,7 @@
 			int cset = commandId >> 8;
 			int cmd = commandId & 0xFF;
 			println(MessageFormat
-					.format("Unknown command : {0} {1}", new Object[] { "" + cset, "" + cmd })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					.format("Unknown command : {0} {1}", new Object[] { "" + cset, "" + cmd })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			break;
 		}
 	}
@@ -859,7 +859,7 @@
 			int cset = commandId >> 8;
 			int cmd = commandId & 0xFF;
 			println(MessageFormat
-					.format("Unknown command : {0} {1}", new Object[] { "" + cset, "" + cmd })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					.format("Unknown command : {0} {1}", new Object[] { "" + cset, "" + cmd })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			break;
 		}
 	}
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IEvaluationRunnable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IEvaluationRunnable.java
index fb28029..eb2a335 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IEvaluationRunnable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IEvaluationRunnable.java
@@ -19,7 +19,7 @@
  * <p>
  * Clients are intended to implement this interface.
  * </p>
- * 
+ *
  * @see org.eclipse.jdt.debug.core.IJavaThread#runEvaluation(IEvaluationRunnable,
  *      IProgressMonitor, int, boolean)
  * @since 2.0
@@ -29,7 +29,7 @@
 	/**
 	 * Runs this evaluation in the specified thread, reporting progress to the
 	 * given progress monitor.
-	 * 
+	 *
 	 * @param thread
 	 *            the thread in which to run the evaluation
 	 * @param monitor
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArray.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArray.java
index 93b53a8..f3fab69 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArray.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArray.java
@@ -15,7 +15,7 @@
 
 /**
  * A value referencing an array on a target VM.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -26,7 +26,7 @@
 
 	/**
 	 * Returns the values contained in this array.
-	 * 
+	 *
 	 * @return the values contained in this array
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -40,7 +40,7 @@
 
 	/**
 	 * Returns the value at the given index in this array.
-	 * 
+	 *
 	 * @param index
 	 *            the index of the value to return
 	 * @return the value at the given index
@@ -58,7 +58,7 @@
 
 	/**
 	 * Returns the length of this array.
-	 * 
+	 *
 	 * @return the length of this array
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -72,7 +72,7 @@
 
 	/**
 	 * Sets the value at the given index to the specified value.
-	 * 
+	 *
 	 * @param index
 	 *            the index at which to assign a new value
 	 * @param value
@@ -97,7 +97,7 @@
 	 * given array are replaced. If the given replacement values length is
 	 * longer than the length of this array, values in positions greater than
 	 * the length of this array are ignored.
-	 * 
+	 *
 	 * @param values
 	 *            replacement values
 	 * @exception DebugException
@@ -108,7 +108,7 @@
 
 	/**
 	 * Replaces a range of values in this array.
-	 * 
+	 *
 	 * @param offset
 	 *            offset in this array to start replacing values at
 	 * @param length
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArrayType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArrayType.java
index 2c82779..73d3dc1 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArrayType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaArrayType.java
@@ -14,7 +14,7 @@
 
 /**
  * The type of an array on a Java debug target.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -26,7 +26,7 @@
 	/**
 	 * Returns a new instance of an array of this type, with the specified
 	 * length.
-	 * 
+	 *
 	 * @param size
 	 *            the length of the new array
 	 * @return a new array of the specified length
@@ -42,7 +42,7 @@
 
 	/**
 	 * Returns the type of the elements in this array.
-	 * 
+	 *
 	 * @return type
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpoint.java
index 4988e17..8964bb2 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpoint.java
@@ -25,7 +25,7 @@
  * <li>an installed property that indicates a breakpoint was successfully
  * installed in a VM</li>
  * </ul>
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -47,7 +47,7 @@
 	/**
 	 * Returns whether this breakpoint is installed in at least one debug
 	 * target.
-	 * 
+	 *
 	 * @return whether this breakpoint is installed
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -59,7 +59,7 @@
 	 * Returns the fully qualified name of the type this breakpoint is located
 	 * in, or <code>null</code> if this breakpoint is not located in a specific
 	 * type - for example, a pattern breakpoint.
-	 * 
+	 *
 	 * @return the fully qualified name of the type this breakpoint is located
 	 *         in, or <code>null</code>
 	 * @exception CoreException
@@ -71,7 +71,7 @@
 	/**
 	 * Returns this breakpoint's hit count or, -1 if this breakpoint does not
 	 * have a hit count.
-	 * 
+	 *
 	 * @return this breakpoint's hit count, or -1
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
@@ -83,7 +83,7 @@
 	 * Sets the hit count attribute of this breakpoint. If this breakpoint is
 	 * currently disabled and the hit count is set greater than -1, this
 	 * breakpoint is automatically enabled.
-	 * 
+	 *
 	 * @param count
 	 *            the new hit count
 	 * @exception CoreException
@@ -97,7 +97,7 @@
 	 * breakpoint is hit. When <code>SUSPEND_VM</code> the target VM is
 	 * suspended, and when <code>SUSPEND_THREAD</code> only the thread in which
 	 * this breakpoint occurred is suspended.
-	 * 
+	 *
 	 * @param suspendPolicy
 	 *            one of <code>SUSPEND_VM</code> or <code>SUSPEND_THREAD</code>
 	 * @exception CoreException
@@ -109,7 +109,7 @@
 	/**
 	 * Returns the suspend policy used by this breakpoint, one of
 	 * <code>SUSPEND_VM</code> or <code>SUSPEND_THREAD</code>.
-	 * 
+	 *
 	 * @return one of <code>SUSPEND_VM</code> or <code>SUSPEND_THREAD</code>
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
@@ -123,10 +123,10 @@
 	 * restricted to one thread per target. Any previous thread filter for the
 	 * same target is lost. A thread filter is not persisted across workbench
 	 * invocations.
-	 * 
+	 *
 	 * @param thread
 	 *            the thread to add the filter to
-	 * 
+	 *
 	 * @exception CoreException
 	 *                if unable to set the thread filter
 	 */
@@ -135,7 +135,7 @@
 	/**
 	 * Removes this breakpoint's thread filter in the given target, if any. Has
 	 * no effect if this breakpoint does not have a filter in the given target.
-	 * 
+	 *
 	 * @param target
 	 *            the target whose thread filter will be removed
 	 * @exception CoreException
@@ -148,10 +148,10 @@
 	 * Returns the thread in the given target in which this breakpoint is
 	 * enabled or <code>null</code> if this breakpoint is enabled in all threads
 	 * in the given target.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target
-	 * 
+	 *
 	 * @return the thread in the given target that this breakpoint is enabled
 	 *         for
 	 * @exception CoreException
@@ -162,7 +162,7 @@
 
 	/**
 	 * Returns all thread filters set on this breakpoint.
-	 * 
+	 *
 	 * @return the threads that this breakpoint is restricted to
 	 * @exception CoreException
 	 *                if unable to determine this breakpoint's thread filters
@@ -180,7 +180,7 @@
 	 * will never be hit in that target, as the current context cannot be two
 	 * different instances at the same time.
 	 * </p>
-	 * 
+	 *
 	 * @param object
 	 *            instance filter to add
 	 * @exception CoreException
@@ -193,7 +193,7 @@
 	 * Removes the given object from the list of objects in which this
 	 * breakpoint is restricted to suspend execution. Has no effect if the
 	 * object has not yet been added as an instance filter.
-	 * 
+	 *
 	 * @param object
 	 *            instance filter to remove
 	 * @exception CoreException
@@ -204,7 +204,7 @@
 
 	/**
 	 * Returns whether this breakpoints supports instance filters.
-	 * 
+	 *
 	 * @return whether this breakpoints supports instance filters
 	 * @since 3.0
 	 */
@@ -212,7 +212,7 @@
 
 	/**
 	 * Returns the current set of active instance filters.
-	 * 
+	 *
 	 * @return the current set of active instance filters.
 	 * @exception CoreException
 	 *                if unable to retrieve the list
@@ -222,7 +222,7 @@
 
 	/**
 	 * Returns whether this breakpoints supports thread filters.
-	 * 
+	 *
 	 * @return whether this breakpoints supports thread filters
 	 * @since 3.0
 	 */
@@ -231,7 +231,7 @@
 	/**
 	 * Returns a collection of identifiers of breakpoint listener extensions
 	 * registered for this breakpoint, possibly empty.
-	 * 
+	 *
 	 * @return breakpoint listener extension identifiers registered on this
 	 *         breakpoint
 	 * @throws CoreException
@@ -243,7 +243,7 @@
 	/**
 	 * Adds the breakpoint listener extension with specified identifier to this
 	 * breakpoint. Has no effect if an identical listener is already registered.
-	 * 
+	 *
 	 * @param identifier
 	 *            breakpoint listener extension identifier
 	 * @throws CoreException
@@ -255,7 +255,7 @@
 	/**
 	 * Removes the breakpoint listener extension with the specified identifier
 	 * from this breakpoint and returns whether the listener was removed.
-	 * 
+	 *
 	 * @param identifier
 	 *            breakpoint listener extension identifier
 	 * @return whether the listener was removed
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpointListener.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpointListener.java
index 6e16fcc..0c9a4d0 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpointListener.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaBreakpointListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
  * <p>
  * Clients are intended to implement this interface.
  * </p>
- * 
+ *
  * @since 2.0
  * @see JDIDebugModel
  * @see IJavaBreakpoint
@@ -36,35 +36,35 @@
 	/**
 	 * Return code in response to a "breakpoint hit" notification, indicating a
 	 * vote to suspend the associated thread.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static int SUSPEND = 0x0001;
 	/**
 	 * Return code in response to a "breakpoint hit" notification, indicating a
 	 * vote to not suspend (i.e. resume) the associated thread.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static int DONT_SUSPEND = 0x0002;
 	/**
 	 * Return code in response to an "installing" notification, indicating a
 	 * vote to install the associated breakpoint.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static int INSTALL = 0x0001;
 	/**
 	 * Return code in response to an "installing" notification, indicating a
 	 * vote to not install the associated breakpoint.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static int DONT_INSTALL = 0x0002;
 	/**
 	 * Return code indicating that this listener should not be considered in a
 	 * vote to suspend a thread or install a breakpoint.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static int DONT_CARE = 0x0004;
@@ -73,7 +73,7 @@
 	 * Notification that the given breakpoint is about to be added to the
 	 * specified target. This message is sent before the breakpoint is actually
 	 * added to the debut target (i.e. this is a pre-notification).
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -91,7 +91,7 @@
 	 * breakpoint, there must be at least one <code>DONT_INSTALL</code> vote to
 	 * cancel the installation. If all listeners vote <code>DONT_CARE</code>,
 	 * the breakpoint will be installed by default.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -114,7 +114,7 @@
 	/**
 	 * Notification that the given breakpoint has been installed in the
 	 * specified target.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -137,7 +137,7 @@
 	 * Listeners may query thread state and perform evaluations. All subsequent
 	 * breakpoints in this thread will be ignored until voting has completed.
 	 * </p>
-	 * 
+	 *
 	 * @param thread
 	 *            Java thread
 	 * @param breakpoint
@@ -152,7 +152,7 @@
 	/**
 	 * Notification that the given breakpoint has been removed from the
 	 * specified target.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -164,7 +164,7 @@
 	/**
 	 * Notification that the given breakpoint had runtime errors in its
 	 * conditional expression.
-	 * 
+	 *
 	 * @param breakpoint
 	 *            the breakpoint
 	 * @param exception
@@ -177,7 +177,7 @@
 	/**
 	 * Notification that the given breakpoint has compilation errors in its
 	 * conditional expression.
-	 * 
+	 *
 	 * @param breakpoint
 	 *            the breakpoint
 	 * @param errors
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassObject.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassObject.java
index 63f04d9..f0a26f7 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassObject.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassObject.java
@@ -13,7 +13,7 @@
 /**
  * An object referencing an instance of <code>java.lang.Class</code> on a target
  * VM.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -24,7 +24,7 @@
 
 	/**
 	 * Returns the type associated with instances of this class.
-	 * 
+	 *
 	 * @return the type associated with instances of this class
 	 */
 	IJavaType getInstanceType();
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassPrepareBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassPrepareBreakpoint.java
index 3bdf1f8..b44446d 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassPrepareBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassPrepareBreakpoint.java
@@ -14,7 +14,7 @@
 
 /**
  * A breakpoint that suspends execution when a class is prepared in a target VM.
- * 
+ *
  * @since 3.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -35,7 +35,7 @@
 	/**
 	 * Returns a constant indicating what kind of type this breakpoint is
 	 * associated with.
-	 * 
+	 *
 	 * @return one of <code>TYPE_CLASS</code> or <code>TYPE_INTERFACE</code>
 	 * @throws CoreException
 	 *             if unable to retrieve the attribute
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassType.java
index 8a6734c..e8115a5 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaClassType.java
@@ -14,7 +14,7 @@
 
 /**
  * The class of an object on a Java debug target.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -29,7 +29,7 @@
 	 * location when this method invocation is complete. This method does not
 	 * return until the method invocation is complete. Resuming the specified
 	 * thread can result in breakpoints being hit, infinite loops, and deadlock.
-	 * 
+	 *
 	 * @param signature
 	 *            the JNI style signature of the method to be invoked
 	 * @param args
@@ -68,7 +68,7 @@
 	 * complete. This method does not return until the method invocation is
 	 * complete. Resuming the specified thread can result in breakpoints being
 	 * hit, infinite loops, and deadlock.
-	 * 
+	 *
 	 * @param selector
 	 *            the selector of the method to be invoked
 	 * @param signature
@@ -103,7 +103,7 @@
 	/**
 	 * Returns the superclass of this class type, or <code>null</code> if no
 	 * such class exists.
-	 * 
+	 *
 	 * @return the superclass of this class type, or <code>null</code>
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -119,7 +119,7 @@
 	 * Returns the interface objects associated with the interfaces this class
 	 * directly implements. Only those interfaces declared in the
 	 * <code>implements</code> clause for this class are included.
-	 * 
+	 *
 	 * @return the interface objects associated with the interfaces this class
 	 *         directly implements
 	 * @exception DebugException
@@ -136,7 +136,7 @@
 	/**
 	 * Returns the interface objects associated with <em>all</em> interfaces
 	 * this class implements, directly or indirectly.
-	 * 
+	 *
 	 * @return the interface objects associated with the interfaces this class
 	 *         directly implements, directly or indirectly
 	 * @exception DebugException
@@ -152,7 +152,7 @@
 
 	/**
 	 * Returns whether this type is declared as a type safe enumeration.
-	 * 
+	 *
 	 * @return <code>true</code> if this type is a type safe enumeration,
 	 *         <code>false</code> otherwise.
 	 * @exception DebugException
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaDebugTarget.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaDebugTarget.java
index 97d83ce..7c6c7ff 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaDebugTarget.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaDebugTarget.java
@@ -18,7 +18,7 @@
 
 /**
  * A Java virtual machine.
- * 
+ *
  * @see IDebugTarget
  * @see org.eclipse.core.runtime.IAdaptable
  * @noimplement This interface is not intended to be implemented by clients.
@@ -36,7 +36,7 @@
 	 * this debug target has no suspended threads, <code>null</code> is
 	 * returned.
 	 * </p>
-	 * 
+	 *
 	 * @param variableName
 	 *            name of the variable
 	 * @return a variable with the given name, or <code>null</code> if none
@@ -55,7 +55,7 @@
 	 * Returns the types loaded in this debug target with the given fully
 	 * qualified name, or <code>null</code> of no type with the given name is
 	 * loaded.
-	 * 
+	 *
 	 * @param name
 	 *            fully qualified name of type, for example
 	 *            <code>java.lang.String</code>
@@ -74,7 +74,7 @@
 	 * Returns a value from this target that corresponds to the given boolean.
 	 * The returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a boolean from which to create a value
 	 * @return a corresponding value from this target
@@ -85,7 +85,7 @@
 	 * Returns a value from this target that corresponds to the given byte. The
 	 * returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a byte from which to create a value
 	 * @return a corresponding value from this target
@@ -96,7 +96,7 @@
 	 * Returns a value from this target that corresponds to the given char. The
 	 * returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a char from which to create a value
 	 * @return a corresponding value from this target
@@ -107,7 +107,7 @@
 	 * Returns a value from this target that corresponds to the given double.
 	 * The returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a double from which to create a value
 	 * @return a corresponding value from this target
@@ -118,7 +118,7 @@
 	 * Returns a value from this target that corresponds to the given float. The
 	 * returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a float from which to create a value
 	 * @return a corresponding value from this target
@@ -129,7 +129,7 @@
 	 * Returns a value from this target that corresponds to the given int. The
 	 * returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            an int from which to create a value
 	 * @return a corresponding value from this target
@@ -140,7 +140,7 @@
 	 * Returns a value from this target that corresponds to the given long. The
 	 * returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a long from which to create a value
 	 * @return a corresponding value from this target
@@ -151,7 +151,7 @@
 	 * Returns a value from this target that corresponds to the given short. The
 	 * returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a short from which to create a value
 	 * @return a corresponding value from this target
@@ -162,7 +162,7 @@
 	 * Returns a value from this target that corresponds to the given string.
 	 * The returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @param value
 	 *            a string from which to create a value
 	 * @return a corresponding value from this target
@@ -173,7 +173,7 @@
 	 * Returns a value from this target that corresponds to <code>null</code>.
 	 * The returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @return a value corresponding to <code>null</code>
 	 */
 	public abstract IJavaValue nullValue();
@@ -182,7 +182,7 @@
 	 * Returns a value from this target that corresponds to <code>void</code>.
 	 * The returned value can be used for setting and comparing against a value
 	 * retrieved from this debug target.
-	 * 
+	 *
 	 * @return a value corresponding to <code>void</code>
 	 */
 	public abstract IJavaValue voidValue();
@@ -191,7 +191,7 @@
 	 * Returns whether any of the threads associated with this debug target are
 	 * running code in the VM that is out of synch with the code in the
 	 * workspace.
-	 * 
+	 *
 	 * @return whether this debug target is out of synch with the workspace.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -206,7 +206,7 @@
 	 * Returns whether any of the threads associated with this debug target may
 	 * be running code in the VM that is out of synch with the code in the
 	 * workspace.
-	 * 
+	 *
 	 * @return whether this debug target may be out of synch with the workspace.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -219,14 +219,14 @@
 
 	/**
 	 * Returns whether this target supports hot code replace.
-	 * 
+	 *
 	 * @return whether this target supports hot code replace
 	 */
 	public boolean supportsHotCodeReplace();
 
 	/**
 	 * Returns whether this target is currently performing a hot code replace.
-	 * 
+	 *
 	 * @return whether this target is currently performing a hot code replace
 	 * @since 2.1
 	 */
@@ -234,7 +234,7 @@
 
 	/**
 	 * Returns whether this target supports instance breakpoints.
-	 * 
+	 *
 	 * @return whether this target supports instance breakpoints
 	 * @since 2.1
 	 */
@@ -243,14 +243,14 @@
 	/**
 	 * Returns whether synthetic methods are filtered when stepping, if step
 	 * filters are enabled.
-	 * 
+	 *
 	 * @return whether synthetic methods are filtered when stepping
 	 */
 	public abstract boolean isFilterSynthetics();
 
 	/**
 	 * Sets whether synthetic methods are filtered when stepping.
-	 * 
+	 *
 	 * @param filter
 	 *            whether to synthetic methods are filtered when stepping
 	 */
@@ -258,7 +258,7 @@
 
 	/**
 	 * Returns whether simple getters are filtered when stepping.
-	 * 
+	 *
 	 * @return true, if simple getters should be filtered when stepping
 	 * @since 3.7
 	 */
@@ -266,7 +266,7 @@
 
 	/**
 	 * Sets whether simple getters are filtered when stepping.
-	 * 
+	 *
 	 * @param filter
 	 *            whether to filter simple getters when stepping
 	 * @since 3.7
@@ -275,7 +275,7 @@
 
 	/**
 	 * Returns whether simple setters are filtered when stepping.
-	 * 
+	 *
 	 * @return true, if simple setters should be filtered when stepping
 	 * @since 3.7
 	 */
@@ -283,7 +283,7 @@
 
 	/**
 	 * Sets whether simple setters are filtered when stepping.
-	 * 
+	 *
 	 * @param filter
 	 *            whether to filter simple setters when stepping
 	 * @since 3.7
@@ -293,14 +293,14 @@
 	/**
 	 * Returns whether static initializers are filtered when stepping, if step
 	 * filters are enabled.
-	 * 
+	 *
 	 * @return whether static initializers are filtered when stepping
 	 */
 	public abstract boolean isFilterStaticInitializers();
 
 	/**
 	 * Sets whether to filter static initializers when stepping.
-	 * 
+	 *
 	 * @param filter
 	 *            whether to filter static initializers when stepping
 	 */
@@ -309,14 +309,14 @@
 	/**
 	 * Returns whether constructors are filtered when stepping, if step filters
 	 * are enabled.
-	 * 
+	 *
 	 * @return whether constructors are filtered when stepping
 	 */
 	public abstract boolean isFilterConstructors();
 
 	/**
 	 * Sets whether to filter constructors when stepping.
-	 * 
+	 *
 	 * @param filter
 	 *            whether to filter constructors when stepping
 	 */
@@ -327,7 +327,7 @@
 	 * collection of Strings. Each string is the fully qualified name/pattern of
 	 * a type/package to filter when stepping. For example
 	 * <code>java.lang.*</code> or <code>java.lang.String</code>.
-	 * 
+	 *
 	 * @return the list of active step filters, or <code>null</code>
 	 */
 	public abstract String[] getStepFilters();
@@ -337,7 +337,7 @@
 	 * collection of Strings. Each string is the fully qualified name/pattern of
 	 * a type/package to filter when stepping. For example
 	 * <code>java.lang.*</code> or <code>java.lang.String</code>.
-	 * 
+	 *
 	 * @param list
 	 *            active step filters, or <code>null</code>
 	 */
@@ -347,7 +347,7 @@
 	 * Sets whether a step that lands in a filtered location should continue
 	 * through to an un-filtered location, or return to where the step
 	 * originated.
-	 * 
+	 *
 	 * @param thru
 	 *            whether to step thru a filtered location or return to location
 	 *            where step originated
@@ -359,7 +359,7 @@
 	 * Returns whether a step that lands in a filtered location should proceed
 	 * through to an un-filtered location or return to the location where a step
 	 * originated.
-	 * 
+	 *
 	 * @return whether a step that lands in a filtered location should proceed
 	 *         through to an un-filtered location or return to the location
 	 *         where a step originated
@@ -371,7 +371,7 @@
 	 * Returns whether this debug target supports a request timeout - a maximum
 	 * time for a JDI request to receive a response. This option is only
 	 * supported by the Eclipse JDI implementation.
-	 * 
+	 *
 	 * @return whether this debug target supports a request timeout
 	 */
 	public boolean supportsRequestTimeout();
@@ -379,7 +379,7 @@
 	/**
 	 * Sets the timeout value for JDI requests in milliseconds. Has no effect if
 	 * this target does not support a request timeout.
-	 * 
+	 *
 	 * @param timeout
 	 *            the communication timeout, in milliseconds
 	 */
@@ -388,14 +388,14 @@
 	/**
 	 * Returns the timeout value for JDI requests in milliseconds, or -1 if not
 	 * supported.
-	 * 
+	 *
 	 * @return timeout value, in milliseconds, or -1 if not supported
 	 */
 	public int getRequestTimeout();
 
 	/**
 	 * Returns whether this target supports providing monitor information.
-	 * 
+	 *
 	 * @return whether this target supports providing monitor information.
 	 * @since 2.1
 	 */
@@ -403,7 +403,7 @@
 
 	/**
 	 * Returns whether this target supports access watchpoints.
-	 * 
+	 *
 	 * @return whether this target supports access watchpoints
 	 * @since 3.0
 	 */
@@ -411,7 +411,7 @@
 
 	/**
 	 * Returns whether this target supports modification watchpoints.
-	 * 
+	 *
 	 * @return whether this target supports modification watchpoints
 	 * @since 3.0
 	 */
@@ -419,7 +419,7 @@
 
 	/**
 	 * Set the default stratum used in this debug target.
-	 * 
+	 *
 	 * @param stratum
 	 *            the new default stratum, or <code>null</code> to indicate
 	 *            per-class default stratum
@@ -430,7 +430,7 @@
 	/**
 	 * Return the default stratum used in this the target, or <code>null</code>
 	 * to indicate a per-class default stratum.
-	 * 
+	 *
 	 * @return the default stratum, or <code>null</code> to indicate a per-class
 	 *         default stratum
 	 * @see #setDefaultStratum(String)
@@ -441,7 +441,7 @@
 	/**
 	 * Returns the top level thread groups in this target. Top level thread
 	 * groups do not have a parent.
-	 * 
+	 *
 	 * @return top level thread groups
 	 * @throws DebugException
 	 *             if an exception occurs
@@ -451,7 +451,7 @@
 
 	/**
 	 * Returns all thread groups in this target.
-	 * 
+	 *
 	 * @return all thread groups in this target
 	 * @throws DebugException
 	 *             if an exception occurs
@@ -462,7 +462,7 @@
 	/**
 	 * Returns whether this VM supports instance and reference retrieval for
 	 * types and objects.
-	 * 
+	 *
 	 * @return whether this VM supports instance and reference retrieval for
 	 *         types and objects
 	 * @since 3.3
@@ -472,7 +472,7 @@
 	/**
 	 * Returns whether this VM supports the ability to force an early return
 	 * from methods.
-	 * 
+	 *
 	 * @return whether this VM can force an early return from methods
 	 * @since 3.3
 	 * @see IJavaThread
@@ -482,7 +482,7 @@
 	/**
 	 * Returns whether this VM supports the ability to enable and disable
 	 * garbage collection of individual objects.
-	 * 
+	 *
 	 * @return whether this VM supports the ability to enable and disable
 	 *         garbage collection of individual objects
 	 * @see IJavaObject
@@ -493,7 +493,7 @@
 	/**
 	 * Returns the name of the underlying virtual machine as defined by the
 	 * system property <code>java.vm.name</code>.
-	 * 
+	 *
 	 * @return virtual machine name
 	 * @exception DebugException
 	 *                if retrieving the name fails
@@ -504,7 +504,7 @@
 	/**
 	 * Returns the version of the underlying virtual machine as defined by the
 	 * system property <code>java.version</code>.
-	 * 
+	 *
 	 * @return <code>java.version</code> system property
 	 * @exception DebugException
 	 *                if retrieving the version property fails
@@ -523,7 +523,7 @@
 	 * changes. For example, a thread would fire a resume event if it discovered
 	 * it was in a running state when it thought it was suspended.
 	 * </p>
-	 * 
+	 *
 	 * @throws DebugException
 	 *             if an exception occurs
 	 * @since 3.6
@@ -534,7 +534,7 @@
 	 * Sends a JDWP command to the back end and returns the JDWP reply packet as
 	 * bytes. This method creates an appropriate command header and packet id,
 	 * before sending to the back end.
-	 * 
+	 *
 	 * @param commandSet
 	 *            command set identifier as defined by JDWP
 	 * @param commandId
@@ -561,7 +561,7 @@
 	 * for that target. This allows a target to override general/default hot
 	 * code replace listeners/handlers.
 	 * </p>
-	 * 
+	 *
 	 * @param listener
 	 *            hot code replace listener
 	 * @since 3.6
@@ -571,7 +571,7 @@
 	/**
 	 * Removes the given listener from this target. Has no effect if an
 	 * identical listener is not already registered.
-	 * 
+	 *
 	 * @param listener
 	 *            hot code replace listener
 	 * @since 3.6
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaExceptionBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaExceptionBreakpoint.java
index c32e75b..bc7bda0 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaExceptionBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaExceptionBreakpoint.java
@@ -18,7 +18,7 @@
  * execution when the corresponding exception is thrown in a caught or uncaught
  * location. As well, the location can be filtered inclusively or exclusively by
  * type name patterns.
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -28,7 +28,7 @@
 	 * Sets the inclusion filters that will define the scope for the associated
 	 * exception. Filters are a collection of strings of type name prefixes.
 	 * Default packages should be specified as the empty string.
-	 * 
+	 *
 	 * @param filters
 	 *            the array of filters to apply
 	 * @exception CoreException
@@ -41,7 +41,7 @@
 	/**
 	 * Returns the inclusive filters that define the scope for the associated
 	 * exception. Filters are a collection of strings of type name prefixes.
-	 * 
+	 *
 	 * @return the array of defined inclusive filters
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -53,7 +53,7 @@
 	/**
 	 * Returns whether this breakpoint suspends execution when the associated
 	 * exception is thrown in a caught location (in a try/catch statement).
-	 * 
+	 *
 	 * @return <code>true</code> if this is a caught exception breakpoint
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
@@ -65,7 +65,7 @@
 	 * Returns whether this breakpoint suspends execution when the associated
 	 * exception is thrown in an uncaught location (not caught by a try/catch
 	 * statement).
-	 * 
+	 *
 	 * @return <code>true</code> if this is an uncaught exception breakpoint.
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
@@ -76,7 +76,7 @@
 	/**
 	 * Sets whether this breakpoint suspends execution when the associated
 	 * exception is thrown in a caught location (in a try/catch statement).
-	 * 
+	 *
 	 * @param caught
 	 *            whether or not this breakpoint suspends execution when the
 	 *            associated exception is thrown in a caught location
@@ -89,7 +89,7 @@
 	/**
 	 * Sets whether this breakpoint suspends execution when the associated
 	 * exception is thrown in an uncaught location.
-	 * 
+	 *
 	 * @param uncaught
 	 *            whether or not this breakpoint suspends execution when the
 	 *            associated exception is thrown in an uncaught location
@@ -102,7 +102,7 @@
 	/**
 	 * Returns whether the exception associated with this breakpoint is a
 	 * checked exception (compiler detected).
-	 * 
+	 *
 	 * @return <code>true</code> if the exception associated with this
 	 *         breakpoint is a checked exception
 	 * @exception CoreException
@@ -116,7 +116,7 @@
 	 * this breakpoint to suspend, of <code>null</code> if this breakpoint has
 	 * not caused a thread to suspend. Note that this name may be a sub type of
 	 * the exception that this breakpoint is associated with.
-	 * 
+	 *
 	 * @return fully qualified exception name or <code>null</code>
 	 */
 	public String getExceptionTypeName();
@@ -125,7 +125,7 @@
 	 * Sets the filters that will define the scope for the associated exception.
 	 * Filters are a collection of strings of type name prefixes. Default
 	 * packages should be specified as the empty string.
-	 * 
+	 *
 	 * @param filters
 	 *            the array of filters to apply
 	 * @param inclusive
@@ -145,7 +145,7 @@
 	 * Sets the exclusion filters that will define the scope for the associated
 	 * exception. Filters are a collection of strings of type name prefixes.
 	 * Default packages should be specified as the empty string.
-	 * 
+	 *
 	 * @param filters
 	 *            the array of filters to apply
 	 * @exception CoreException
@@ -158,7 +158,7 @@
 	/**
 	 * Returns the filters that define the scope for the associated exception.
 	 * Filters are a collection of strings of type name prefixes.
-	 * 
+	 *
 	 * @return the array of defined filters
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -171,7 +171,7 @@
 	/**
 	 * Returns the exclusive filters that define the scope for the associated
 	 * exception. Filters are a collection of strings of type name prefixes.
-	 * 
+	 *
 	 * @return the array of defined inclusive filters
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -182,7 +182,7 @@
 
 	/**
 	 * Returns whether any inclusive filters have been applied.
-	 * 
+	 *
 	 * @return <code>true</code> if the inclusive filters have been applied
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaFieldVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaFieldVariable.java
index e8dbe14..23577a0 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaFieldVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaFieldVariable.java
@@ -14,7 +14,7 @@
 
 /**
  * A variable that contains the value of an instance or class variable.
- * 
+ *
  * @see org.eclipse.debug.core.model.IVariable
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -24,7 +24,7 @@
 
 	/**
 	 * Returns whether this variable is declared as transient.
-	 * 
+	 *
 	 * @return whether this variable has been declared as transient
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -38,7 +38,7 @@
 
 	/**
 	 * Returns whether this variable is declared as volatile.
-	 * 
+	 *
 	 * @return whether this variable has been declared as volatile
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -52,7 +52,7 @@
 
 	/**
 	 * Returns the type that declares this variable.
-	 * 
+	 *
 	 * @return the type that declares this variable
 	 */
 	public IJavaType getDeclaringType();
@@ -61,7 +61,7 @@
 	 * Returns the object that contains this field variable, or
 	 * <code>null</code> if no object contains this field variable (static field
 	 * variable).
-	 * 
+	 *
 	 * @return the object that contains this field variable
 	 * @since 3.0
 	 */
@@ -69,7 +69,7 @@
 
 	/**
 	 * Returns the type that contains this field variable.
-	 * 
+	 *
 	 * @return the type that contains this field variable
 	 * @since 3.0
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaHotCodeReplaceListener.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaHotCodeReplaceListener.java
index 2bc13bb..3d5bb0e 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaHotCodeReplaceListener.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaHotCodeReplaceListener.java
@@ -19,14 +19,14 @@
  * <p>
  * Clients may implement this interface
  * </p>
- * 
+ *
  * @since 2.0
  */
 public interface IJavaHotCodeReplaceListener {
 
 	/**
 	 * Notification that a hot code replace attempt failed in the given target.
-	 * 
+	 *
 	 * @param target
 	 *            the target in which the hot code replace failed
 	 * @param exception
@@ -40,7 +40,7 @@
 	/**
 	 * Notification that a hot code replace attempt succeeded in the given
 	 * target.
-	 * 
+	 *
 	 * @param target
 	 *            the target in which the hot code replace succeeded
 	 */
@@ -49,7 +49,7 @@
 	/**
 	 * Notification that obsolete methods remain on the stack in one or more
 	 * threads in the given target after a hot code replace.
-	 * 
+	 *
 	 * @param target
 	 *            the target in which obsolete methods remain after a hot code
 	 *            replace
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaInterfaceType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaInterfaceType.java
index b5666d9..f78c3fa 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaInterfaceType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaInterfaceType.java
@@ -15,7 +15,7 @@
 
 /**
  * An interface an object implements on a Java debug target.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -26,7 +26,7 @@
 	/**
 	 * Returns the class objects associated with the implementors of this
 	 * interface type. Returns an empty array if there are none.
-	 * 
+	 *
 	 * @return the class objects associated with the implementors of this
 	 *         interface type
 	 * @exception DebugException
@@ -46,7 +46,7 @@
 	 * sub-interfaces are those interfaces that directly extend this interface,
 	 * that is, those interfaces that declared this interface in their
 	 * <code>extends</code> clause.
-	 * 
+	 *
 	 * @return the interface objects associated with the sub-interfaces of this
 	 *         interface type
 	 * @exception DebugException
@@ -66,7 +66,7 @@
 	 * super-interfaces are those interfaces that are directly extended by this
 	 * interface, that is, those interfaces that this interface declared to be
 	 * extended.
-	 * 
+	 *
 	 * @return the interface objects associated with the super-interfaces of
 	 *         this interface type
 	 * @exception DebugException
@@ -88,7 +88,7 @@
 	 * complete. This method does not return until the method invocation is
 	 * complete. Resuming the specified thread can result in breakpoints being
 	 * hit, infinite loops, and deadlock.
-	 * 
+	 *
 	 * @param selector
 	 *            the selector of the method to be invoked
 	 * @param signature
@@ -116,7 +116,7 @@
 	 *                <li>The given thread was explicitly suspended (status code
 	 *                <code>IJavaThread.ERR_INCOMPATIBLE_THREAD_STATE</code>)</li>
 	 *                </ul>
-	 *                
+	 *
 	 * @since 3.10
 	 */
 	public IJavaValue sendMessage(String selector, String signature,
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaLineBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaLineBreakpoint.java
index f85ad64..136c6c6 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaLineBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaLineBreakpoint.java
@@ -16,7 +16,7 @@
 /**
  * A breakpoint that suspends execution when a particular line of code is
  * reached.
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -27,7 +27,7 @@
 	 * Returns whether this breakpoint supports a conditional expression.
 	 * Conditional breakpoints only suspend when their associated condition
 	 * evaluates to <code>true</code>.
-	 * 
+	 *
 	 * @return whether this breakpoint supports a condition
 	 */
 	public boolean supportsCondition();
@@ -35,7 +35,7 @@
 	/**
 	 * Returns the conditional expression associated with this breakpoint, or
 	 * <code>null</code> if this breakpoint does not have a condition.
-	 * 
+	 *
 	 * @return this breakpoint's conditional expression, or <code>null</code>
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -52,7 +52,7 @@
 	 * If this breakpoint does not support conditions, setting the condition has
 	 * no effect.
 	 * </p>
-	 * 
+	 *
 	 * @param condition
 	 *            conditional expression
 	 * @exception CoreException
@@ -63,7 +63,7 @@
 
 	/**
 	 * Returns whether the condition on this breakpoint is enabled.
-	 * 
+	 *
 	 * @return whether this breakpoint's condition is enabled
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -76,10 +76,10 @@
 	 * When enabled, this breakpoint will only suspend when its condition
 	 * evaluates to true. When disabled, this breakpoint will suspend as it
 	 * would with no condition defined.
-	 * 
+	 *
 	 * @param enabled
 	 *            the enabled state of the condition
-	 * 
+	 *
 	 * @exception CoreException
 	 *                if unable to set the property on this breakpoint's
 	 *                underlying marker
@@ -89,7 +89,7 @@
 	/**
 	 * Returns whether the breakpoint suspends when the value of the condition
 	 * is <code>true</code> or when the value of the condition changes.
-	 * 
+	 *
 	 * @return <code>true</code> if this breakpoint suspends when the value of
 	 *         the condition is <code>true</code>, <code>false</code> if this
 	 *         breakpoint suspends when the value of the condition changes.
@@ -105,10 +105,10 @@
 	 * <code>true</code>, the breakpoint will stop when the value of the
 	 * condition is <code>true</code>. If the value is <code>false</code>, the
 	 * breakpoint will stop when the value of the condition changes.
-	 * 
+	 *
 	 * @param suspendOnTrue
 	 *            if the condition should suspend when true
-	 * 
+	 *
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
 	 *                underlying marker
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodBreakpoint.java
index 2abd144..7dba6f2 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodBreakpoint.java
@@ -15,7 +15,7 @@
 
 /**
  * A method breakpoint suspends execution when a method is entered or exited.
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -26,7 +26,7 @@
 	 * Returns the name of the method(s) this breakpoint suspends execution in,
 	 * or <code>null</code> if this breakpoint does not suspend execution based
 	 * on method name.
-	 * 
+	 *
 	 * @return the name of the method(s) this breakpoint suspends execution in,
 	 *         or <code>null</code> if this breakpoint does not suspend
 	 *         execution based on method name
@@ -40,7 +40,7 @@
 	 * Returns the signature of the method(s) this breakpoint suspends execution
 	 * in, or <code>null</code> if this breakpoint does not suspend execution
 	 * based on method signature.
-	 * 
+	 *
 	 * @return the signature of the method(s) this breakpoint suspends execution
 	 *         in, or <code>null</code> if this breakpoint does not suspend
 	 *         execution based on method signature
@@ -54,7 +54,7 @@
 	 * Returns the pattern specifying the fully qualified name of type(s) this
 	 * breakpoint suspends execution in. Patterns are limited to exact matches
 	 * and patterns that begin or end with '*'.
-	 * 
+	 *
 	 * @return the pattern specifying the fully qualified name of type(s) this
 	 *         breakpoint suspends execution in
 	 * @exception CoreException
@@ -68,7 +68,7 @@
 	/**
 	 * Returns whether this breakpoint causes execution to suspend on entry to
 	 * methods.
-	 * 
+	 *
 	 * @return whether this breakpoint causes execution to suspend on entry to
 	 *         methods
 	 * @exception CoreException
@@ -80,7 +80,7 @@
 	/**
 	 * Returns whether this breakpoint causes execution to suspend on exit of
 	 * methods.
-	 * 
+	 *
 	 * @return whether this breakpoint causes execution to suspend on exit of
 	 *         methods
 	 * @exception CoreException
@@ -92,7 +92,7 @@
 	/**
 	 * Sets whether this breakpoint causes execution to suspend on entry to
 	 * methods.
-	 * 
+	 *
 	 * @param entry
 	 *            whether this breakpoint causes execution to suspend on entry
 	 *            to methods
@@ -105,7 +105,7 @@
 	/**
 	 * Sets whether this breakpoint causes execution to suspend on exit of
 	 * methods.
-	 * 
+	 *
 	 * @param exit
 	 *            whether this breakpoint causes execution to suspend on exit of
 	 *            methods
@@ -118,7 +118,7 @@
 	/**
 	 * Sets whether this breakpoint causes execution to suspend only on
 	 * entry/exit of native methods.
-	 * 
+	 *
 	 * @param nativeOnly
 	 *            whether this breakpoint causes execution to suspend only on
 	 *            entry/exit of native methods
@@ -131,7 +131,7 @@
 	/**
 	 * Returns whether this breakpoint causes execution to suspend only on
 	 * entry/exit of native methods.
-	 * 
+	 *
 	 * @return whether this breakpoint causes execution to suspend only on
 	 *         entry/exit of native methods
 	 * @exception CoreException
@@ -143,10 +143,10 @@
 	/**
 	 * Returns whether this breakpoint last suspended in the given target due to
 	 * a method entry (<code>true</code>) or exit (<code>false</code>).
-	 * 
+	 *
 	 * @param target
 	 *            the debug target
-	 * 
+	 *
 	 * @return <code>true</code> if this breakpoint last suspended the given
 	 *         target due to a method entry; <code>false</code> if this
 	 *         breakpoint last suspended in the given target due to a method
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodEntryBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodEntryBreakpoint.java
index 35a683c..171d651 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodEntryBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaMethodEntryBreakpoint.java
@@ -23,7 +23,7 @@
  * the implementation is based on line breakpoints and does not require method
  * enter/exit tracing in the target VM.
  * </p>
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -32,7 +32,7 @@
 
 	/**
 	 * Returns the name of the method this breakpoint suspends execution in.
-	 * 
+	 *
 	 * @return the name of the method this breakpoint suspends execution in
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
@@ -43,7 +43,7 @@
 	/**
 	 * Returns the signature of the method this breakpoint suspends execution
 	 * in.
-	 * 
+	 *
 	 * @return the signature of the method this breakpoint suspends execution in
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaModifiers.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaModifiers.java
index 21fe7ac..14e4314 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaModifiers.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaModifiers.java
@@ -16,7 +16,7 @@
  * Modifiers common to Java debug elements that have associated Java member
  * declarations. For example, the method associated with a stack frame, or the
  * field associated with a variable.
- * 
+ *
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
  */
@@ -24,7 +24,7 @@
 
 	/**
 	 * Returns whether the associated Java construct is declared as public.
-	 * 
+	 *
 	 * @return whether the associated Java construct is declared as public
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -38,7 +38,7 @@
 
 	/**
 	 * Returns whether the associated Java construct is declared as private.
-	 * 
+	 *
 	 * @return whether the associated Java construct is declared as private
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -52,7 +52,7 @@
 
 	/**
 	 * Returns whether the associated Java construct is declared as protected.
-	 * 
+	 *
 	 * @return whether the associated Java construct is declared as protected
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -67,7 +67,7 @@
 	/**
 	 * Returns whether the associated Java construct is declared with no
 	 * protection modifier (package private protection).
-	 * 
+	 *
 	 * @return whether the associated Java construct is declared as package
 	 *         private
 	 * @exception DebugException
@@ -82,7 +82,7 @@
 
 	/**
 	 * Returns whether the associated Java construct is declared as final.
-	 * 
+	 *
 	 * @return whether the associated Java construct is declared as final
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -96,7 +96,7 @@
 
 	/**
 	 * Returns whether the associated Java construct is declared as static.
-	 * 
+	 *
 	 * @return whether the associated Java construct is declared as static
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -111,7 +111,7 @@
 	/**
 	 * Returns whether the associated Java construct is synthetic. Synthetic
 	 * members are generated by the compiler and are not present in source code.
-	 * 
+	 *
 	 * @return whether the associated Java construct is synthetic
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaObject.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaObject.java
index f34c3b9..5345a91 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaObject.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaObject.java
@@ -14,7 +14,7 @@
 
 /**
  * A value referencing an object on a target VM.
- * 
+ *
  * @see IJavaValue
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -30,7 +30,7 @@
 	 * return until the method invocation is complete. Invoking a method in the
 	 * target VM can result in breakpoints being hit, infinite loops, and
 	 * deadlock.
-	 * 
+	 *
 	 * @param selector
 	 *            the selector of the method to be invoked
 	 * @param signature
@@ -74,7 +74,7 @@
 	 * is complete. This method does not return until the method invocation is
 	 * complete. Invoking a method in the target VM can result in breakpoints
 	 * being hit, infinite loops, and deadlock.
-	 * 
+	 *
 	 * @param selector
 	 *            the selector of the method to be invoked
 	 * @param signature
@@ -116,7 +116,7 @@
 	 * Returns a variable representing the field in this object with the given
 	 * name, or <code>null</code> if there is no field with the given name, or
 	 * the name is ambiguous.
-	 * 
+	 *
 	 * @param name
 	 *            field name
 	 * @param superField
@@ -137,7 +137,7 @@
 	 * Returns a variable representing the field in this object with the given
 	 * name declared in the type with the given signature, or <code>null</code>
 	 * if there is no field with the given name, or the name is ambiguous.
-	 * 
+	 *
 	 * @param name
 	 *            field name
 	 * @param typeSignature
@@ -156,7 +156,7 @@
 	/**
 	 * Returns the threads waiting for the monitor associated to this object, or
 	 * <code>null</code> if no thread is waiting for the monitor.
-	 * 
+	 *
 	 * @return the thread waiting for the monitor, or <code>null</code>.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -174,7 +174,7 @@
 	/**
 	 * Returns the threads which owns for the monitor associated to this object,
 	 * or <code>null</code> if no thread owns the monitor.
-	 * 
+	 *
 	 * @return the thread which owns the monitor, or <code>null</code>.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -191,7 +191,7 @@
 
 	/**
 	 * Returns objects that directly reference this object.
-	 * 
+	 *
 	 * @param max
 	 *            the maximum number of references to retrieve or 0 for all
 	 *            references
@@ -206,7 +206,7 @@
 	 * Permits this object to be garbage collected. Has no effect if this VM
 	 * does not support enabling/disabling of garbage collection of specific
 	 * objects.
-	 * 
+	 *
 	 * @throws DebugException
 	 *             if request fails
 	 * @see IJavaDebugTarget
@@ -218,7 +218,7 @@
 	 * Prevents this object from being garbage collected. Has no effect if this
 	 * VM does not support enabling/disabling of garbage collection of specific
 	 * objects.
-	 * 
+	 *
 	 * @throws DebugException
 	 *             if request fails
 	 * @see IJavaDebugTarget
@@ -228,7 +228,7 @@
 
 	/**
 	 * Returns the unique id for this object.
-	 * 
+	 *
 	 * @return unique id or -1 if this value is <code>null</code>
 	 * @throws DebugException
 	 *             if the request fails
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPatternBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPatternBreakpoint.java
index cb98c4f..c8b8c5d 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPatternBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPatternBreakpoint.java
@@ -16,7 +16,7 @@
  * A line breakpoint installed in types associated with a specific source file
  * (based on source file name debug attribute) and whose fully qualified name
  * matches a specified pattern.
- * 
+ *
  * @since 2.0
  * @deprecated use <code>IJavaStratumLineBreakpoint</code> instead
  * @noimplement This interface is not intended to be implemented by clients.
@@ -28,7 +28,7 @@
 	/**
 	 * Returns the type name pattern this breakpoint uses to identify types in
 	 * which to install itself.
-	 * 
+	 *
 	 * @return the type name pattern this breakpoint uses to identify types in
 	 *         which to install itself
 	 * @exception CoreException
@@ -42,7 +42,7 @@
 	 * breakpoint specifies a source file name, this breakpoint is only
 	 * installed in types whose source file name debug attribute match this
 	 * value.
-	 * 
+	 *
 	 * @return the source file name in which this breakpoint is set
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPrimitiveValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPrimitiveValue.java
index 425e3ba..7016b45 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPrimitiveValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaPrimitiveValue.java
@@ -12,7 +12,7 @@
 
 /**
  * A primitive value on a Java debug target.
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -21,56 +21,56 @@
 
 	/**
 	 * Returns this value as a boolean.
-	 * 
+	 *
 	 * @return this value as a boolean
 	 */
 	public boolean getBooleanValue();
 
 	/**
 	 * Returns this value as a byte
-	 * 
+	 *
 	 * @return this value as a byte
 	 */
 	public byte getByteValue();
 
 	/**
 	 * Returns this value as a char
-	 * 
+	 *
 	 * @return this value as a char
 	 */
 	public char getCharValue();
 
 	/**
 	 * Returns this value as a double
-	 * 
+	 *
 	 * @return this value as a double
 	 */
 	public double getDoubleValue();
 
 	/**
 	 * Returns this value as a float
-	 * 
+	 *
 	 * @return this value as a float
 	 */
 	public float getFloatValue();
 
 	/**
 	 * Returns this value as an int
-	 * 
+	 *
 	 * @return this value as an int
 	 */
 	public int getIntValue();
 
 	/**
 	 * Returns this value as a long
-	 * 
+	 *
 	 * @return this value as a long
 	 */
 	public long getLongValue();
 
 	/**
 	 * Returns this value as a short
-	 * 
+	 *
 	 * @return this value as a short
 	 */
 	public short getShortValue();
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaReferenceType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaReferenceType.java
index 3d96605..9b2996a 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaReferenceType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaReferenceType.java
@@ -15,7 +15,7 @@
 /**
  * Represents the type of an object in a virtual machine - including classes,
  * interfaces and array types.
- * 
+ *
  * @since 3.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -26,7 +26,7 @@
 	 * Returns a variable representing the static field in this type with the
 	 * given name, or <code>null</code> if there is no field with the given
 	 * name, or the name is ambiguous.
-	 * 
+	 *
 	 * @param name
 	 *            field name
 	 * @return the variable representing the static field, or <code>null</code>
@@ -42,7 +42,7 @@
 
 	/**
 	 * Returns the class object associated with this type.
-	 * 
+	 *
 	 * @return the class object associated with this type
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -56,7 +56,7 @@
 
 	/**
 	 * Returns a collection of strata available for this type.
-	 * 
+	 *
 	 * @return a collection of strata available for this type
 	 * @throws DebugException
 	 *             if unable to retrieve available strata
@@ -65,7 +65,7 @@
 
 	/**
 	 * Returns the default stratum for this type.
-	 * 
+	 *
 	 * @return the default stratum for this type
 	 * @throws DebugException
 	 *             if unable to retrieve the default stratum
@@ -74,7 +74,7 @@
 
 	/**
 	 * Returns a collection of the names of the fields declared in this type.
-	 * 
+	 *
 	 * @return a collection of the names of the field declared in this type
 	 * @throws DebugException
 	 *             if unable to retrieve declared field names
@@ -85,7 +85,7 @@
 	 * Returns a collection of the names of all of the fields declared in this
 	 * type, all of its super classes, implemented interfaces and super
 	 * interfaces.
-	 * 
+	 *
 	 * @return a collection of the names of all of the fields declared in this
 	 *         type, all of its super classes, implemented interfaces and super
 	 *         interfaces
@@ -98,7 +98,7 @@
 	 * Returns the class loader object that loaded the class corresponding to
 	 * this type, or <code>null</code> if this type was loaded by the bootstrap
 	 * loader.
-	 * 
+	 *
 	 * @return the class loader object that loaded the class corresponding to
 	 *         this type or <code>null</code>
 	 * @throws DebugException
@@ -110,7 +110,7 @@
 	/**
 	 * Returns the generic signature as defined in the JVM specification for
 	 * this type. Returns <code>null</code> if this type is not a generic type.
-	 * 
+	 *
 	 * @return signature, or <code>null</code> if generic signature not
 	 *         available
 	 * @exception DebugException
@@ -128,7 +128,7 @@
 	 * Returns the unqualified name of the source file corresponding to this
 	 * type, or <code>null</code> if source name debug attribute is not present.
 	 * The source name returned is based on this target's default stratum.
-	 * 
+	 *
 	 * @return unqualified source file name or <code>null</code>
 	 * @throws DebugException
 	 *             if an exception occurs retrieving the source name
@@ -140,7 +140,7 @@
 	 * Returns the unqualified names of the source files corresponding to this
 	 * type in the specified stratum, or <code>null</code> if the source name
 	 * debug attribute is not present.
-	 * 
+	 *
 	 * @param stratum
 	 *            stratum identifier or <code>null</code> to use this type's
 	 *            default stratum
@@ -155,7 +155,7 @@
 	 * Returns the qualified names of the source files corresponding to this
 	 * type in the specified stratum, or <code>null</code> if the source name
 	 * debug attribute is not present.
-	 * 
+	 *
 	 * @param stratum
 	 *            stratum identifier or <code>null</code> to use this type's
 	 *            default stratum
@@ -168,7 +168,7 @@
 
 	/**
 	 * Retrieves and returns instances of this reference type.
-	 * 
+	 *
 	 * @param max
 	 *            the maximum number of instances to retrieve or 0 to retrieve
 	 *            all instances
@@ -183,7 +183,7 @@
 	 * Returns the number of instances of this type currently allocated in the
 	 * target virtual machine, or -1 if instance counts are not supported by the
 	 * target.
-	 * 
+	 *
 	 * @return number of instances of this type, or -1 if unsupported
 	 * @throws DebugException
 	 *             on failure
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStackFrame.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStackFrame.java
index a4d66d5..e5f4b89 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStackFrame.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStackFrame.java
@@ -23,7 +23,7 @@
  * Since 3.1, <code>IJavaStackFrame</code> also implements
  * {@link org.eclipse.debug.core.model.IDropToFrame}.
  * </p>
- * 
+ *
  * @see org.eclipse.debug.core.model.IStackFrame
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -37,7 +37,7 @@
 	 * invalid when the thread containing the stack frame resumes. A stack frame
 	 * may or may not be valid if the thread subsequently suspends, depending on
 	 * the location where the thread suspends.
-	 * 
+	 *
 	 * @since 3.1
 	 */
 	public static final int ERR_INVALID_STACK_FRAME = 130;
@@ -45,7 +45,7 @@
 	/**
 	 * Returns whether this stack frame currently supports the drop to frame
 	 * operation. Note that not all VMs support the operation.
-	 * 
+	 *
 	 * @return whether this stack frame currently supports drop to frame
 	 * @deprecated since 3.1, IJavaStackFrame extends
 	 *             org.eclipse.debug.core.IDropToFrame which defines
@@ -57,7 +57,7 @@
 	/**
 	 * Returns whether the method associated with this stack frame is a
 	 * constructor.
-	 * 
+	 *
 	 * @return whether this stack frame is associated with a constructor
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -75,7 +75,7 @@
 	/**
 	 * Returns whether the method associated with this stack frame has been
 	 * declared as native.
-	 * 
+	 *
 	 * @return whether this stack frame has been declared as native
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -93,7 +93,7 @@
 	/**
 	 * Returns whether the method associated with this stack frame is a static
 	 * initializer.
-	 * 
+	 *
 	 * @return whether this stack frame is a static initializer
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -112,7 +112,7 @@
 	/**
 	 * Returns whether the method associated with this stack frame has been
 	 * declared as synchronized.
-	 * 
+	 *
 	 * @return whether this stack frame has been declared as synchronized
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -130,7 +130,7 @@
 	/**
 	 * Returns whether the method associated with this stack frame is running
 	 * code in the VM that is out of synch with the code in the workspace.
-	 * 
+	 *
 	 * @return whether this stack frame is out of synch with the workspace.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -151,7 +151,7 @@
 	 * that is, it is running old byte codes that have been replaced in the VM.
 	 * This can occur when a hot code replace succeeds but the VM is unable to
 	 * pop a call to an affected method from the call stack.
-	 * 
+	 *
 	 * @return whether this stack frame's method is obsolete
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -170,7 +170,7 @@
 	/**
 	 * Returns the fully qualified name of the type that declares the method
 	 * associated with this stack frame.
-	 * 
+	 *
 	 * @return declaring type name
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -188,7 +188,7 @@
 	/**
 	 * Returns the fully qualified name of the type that is the receiving object
 	 * associated with this stack frame
-	 * 
+	 *
 	 * @return receiving type name
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -206,7 +206,7 @@
 	/**
 	 * Returns the JNI signature for the method this stack frame is associated
 	 * with.
-	 * 
+	 *
 	 * @return signature
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -224,7 +224,7 @@
 	/**
 	 * Returns a list of fully qualified type names of the arguments for the
 	 * method associated with this stack frame.
-	 * 
+	 *
 	 * @return argument type names, or an empty list if this method has no
 	 *         arguments
 	 * @exception DebugException
@@ -242,7 +242,7 @@
 
 	/**
 	 * Returns the name of the method associated with this stack frame
-	 * 
+	 *
 	 * @return method name
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -260,7 +260,7 @@
 	/**
 	 * Returns the local, static, or "this" variable with the given name, or
 	 * <code>null</code> if unable to resolve a variable with the name.
-	 * 
+	 *
 	 * @param variableName
 	 *            the name of the variable to search for
 	 * @return a variable, or <code>null</code> if none
@@ -283,7 +283,7 @@
 	 * that corresponds to the line in the associated source element in the
 	 * specified stratum, or <code>-1</code> if line number information is
 	 * unavailable.
-	 * 
+	 *
 	 * @param stratum
 	 *            the stratum to use.
 	 * @return line number of instruction pointer in this stack frame, or
@@ -295,7 +295,7 @@
 	 *                DebugException's status code contains the underlying
 	 *                exception responsible for the failure.</li>
 	 *                </ul>
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public int getLineNumber(String stratum) throws DebugException;
@@ -304,7 +304,7 @@
 	 * Returns the source name debug attribute associated with the declaring
 	 * type of this stack frame, or <code>null</code> if the source name debug
 	 * attribute not present.
-	 * 
+	 *
 	 * @return source name debug attribute, or <code>null</code>
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -323,7 +323,7 @@
 	 * Returns the source name debug attribute associated with the declaring
 	 * type of this stack frame in the specified stratum, or <code>null</code>
 	 * if the source name debug attribute not present.
-	 * 
+	 *
 	 * @param stratum
 	 *            the stratum to use.
 	 * @return source name debug attribute, or <code>null</code>
@@ -337,7 +337,7 @@
 	 *                thread containing this stack frame has since been resumed.
 	 *                </li>
 	 *                </ul>
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public String getSourceName(String stratum) throws DebugException;
@@ -346,7 +346,7 @@
 	 * Returns the source path debug attribute associated with this stack frame
 	 * in the specified stratum, or <code>null</code> if the source path is not
 	 * known.
-	 * 
+	 *
 	 * @param stratum
 	 *            the stratum to use.
 	 * @return source path debug attribute, or <code>null</code>
@@ -367,7 +367,7 @@
 	/**
 	 * Returns the source path debug attribute associated with this stack frame,
 	 * or <code>null</code> if the source path is not known.
-	 * 
+	 *
 	 * @return source path debug attribute, or <code>null</code>
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -386,7 +386,7 @@
 	/**
 	 * Returns a collection of local variables that are visible at the current
 	 * point of execution in this stack frame. The list includes arguments.
-	 * 
+	 *
 	 * @return collection of locals and arguments
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -406,7 +406,7 @@
 	 * Returns a reference to the receiver of the method associated with this
 	 * stack frame, or <code>null</code> if this stack frame represents a static
 	 * method.
-	 * 
+	 *
 	 * @return 'this' object, or <code>null</code>
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -423,7 +423,7 @@
 
 	/**
 	 * Returns the class in which this stack frame's method is declared.
-	 * 
+	 *
 	 * @return the class in which this stack frame's method is declared
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -447,7 +447,7 @@
 
 	/**
 	 * Returns the type in which this stack frame's method is declared.
-	 * 
+	 *
 	 * @return the type in which this stack frame's method is declared
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -468,11 +468,11 @@
 	 * variables were retrieved from the target for this frame. Returns
 	 * <code>true</code> if locals have never been retrieved. This data is
 	 * available after the fact, since variable retrieval is expensive.
-	 * 
+	 *
 	 * @return whether local variable information was available when variables
 	 *         were retrieved from the target. Returns <code>true</code> if
 	 *         locals have never been retrieved
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public boolean wereLocalsAvailable();
@@ -480,7 +480,7 @@
 	/**
 	 * Returns whether the method associated with this stack frame accepts a
 	 * variable number of arguments.
-	 * 
+	 *
 	 * @return <code>true</code> if the method associated with this stack frame
 	 *         accepts a variable number of arguments, <code>false</code>
 	 *         otherwise.
@@ -505,7 +505,7 @@
 	 * <p>
 	 * Force return is only available when a thread is suspended.
 	 * </p>
-	 * 
+	 *
 	 * @return whether force return can be performed currently
 	 * @since 3.3
 	 */
@@ -522,7 +522,7 @@
 	 * method's return type. Use a void value when a method return type is void
 	 * (see <code>IJavaDebugTarget.voidValue()</code>).</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param value
 	 *            return value that must be assignment compatible with this
 	 *            frame's method's return value
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStratumLineBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStratumLineBreakpoint.java
index fd2d6a5..87a7991 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStratumLineBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaStratumLineBreakpoint.java
@@ -15,7 +15,7 @@
 /**
  * A line breakpoint identified by its source file name and/or path, and stratum
  * that it is relative to.
- * 
+ *
  * @since 3.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -31,7 +31,7 @@
 	 * Multiple patterns can be specified in this breakpoint by delimiting the
 	 * patterns with a comma - e.g. "x.y.z,a.b.c".
 	 * </p>
-	 * 
+	 *
 	 * @return the type name patterns this breakpoint uses to identify types in
 	 *         which to install itself.
 	 * @exception CoreException
@@ -46,7 +46,7 @@
 	 * name, this breakpoint is only installed in types whose source file name
 	 * debug attribute matches this value, relative to this breakpoint's
 	 * stratum.
-	 * 
+	 *
 	 * @return the source file name in which this breakpoint is set, or
 	 *         <code>null</code>
 	 * @exception CoreException
@@ -59,7 +59,7 @@
 	 * Returns the stratum that this breakpoint's source name, source path, and
 	 * line number are relative to, or <code>null</code> if this breakpoint is
 	 * relative to a type's default stratum.
-	 * 
+	 *
 	 * @return the stratum that this breakpoint's source name, source path, and
 	 *         line number are relative to, or <code>null</code>
 	 * @throws CoreException
@@ -73,7 +73,7 @@
 	 * or <code>null</code>. When specified, this breakpoint is only installed
 	 * in types whose source file path debug attribute matches this value,
 	 * relative to this breakpoint's stratum.
-	 * 
+	 *
 	 * @return the qualified source file path in which this breakpoint is set,
 	 *         or <code>null</code>
 	 * @throws CoreException
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaTargetPatternBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaTargetPatternBreakpoint.java
index 47bde82..fcdfe9d 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaTargetPatternBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaTargetPatternBreakpoint.java
@@ -19,7 +19,7 @@
  * are not persisted with this breakpoint, as targets are transient. Clients
  * that use this type of breakpoint are intended to be breakpoint listeners that
  * set a pattern per target as each breakpoint is added to a target.
- * 
+ *
  * @see org.eclipse.jdt.debug.core.IJavaBreakpointListener
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
@@ -30,7 +30,7 @@
 	/**
 	 * Returns the type name pattern this breakpoint uses to identify types in
 	 * which to install itself in the given target
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 * @return the type name pattern this breakpoint uses to identify types in
@@ -41,7 +41,7 @@
 	/**
 	 * Sets the type name pattern this breakpoint uses to identify types in
 	 * which to install itself in the given target
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 * @param pattern
@@ -57,7 +57,7 @@
 	 * breakpoint specifies a source file name, this breakpoint is only
 	 * installed in types whose source file name debug attribute match this
 	 * value.
-	 * 
+	 *
 	 * @return the source file name in which this breakpoint is set
 	 * @exception CoreException
 	 *                if unable to access the property from this breakpoint's
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThread.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThread.java
index 601f518..77d2963 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThread.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThread.java
@@ -17,7 +17,7 @@
 
 /**
  * A thread in a Java virtual machine.
- * 
+ *
  * @see org.eclipse.debug.core.model.IThread
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -34,7 +34,7 @@
 	/**
 	 * Status code indicating a request to perform a message send failed because
 	 * a thread was already performing a message send.
-	 * 
+	 *
 	 * @see IJavaObject#sendMessage(String, String, IJavaValue[], IJavaThread,
 	 *      boolean)
 	 * @see IJavaClassType#sendMessage(String, String, IJavaValue[],
@@ -48,7 +48,7 @@
 	 * a thread was not suspended by a step or breakpoint event. When a thread
 	 * is suspended explicitly via the <code>suspend()</code> method, it is not
 	 * able to perform method invocations (this is a JDI limitation).
-	 * 
+	 *
 	 * @see IJavaObject#sendMessage(String, String, IJavaValue[], IJavaThread,
 	 *      boolean)
 	 * @see IJavaClassType#sendMessage(String, String, IJavaValue[],
@@ -59,7 +59,7 @@
 
 	/**
 	 * Returns whether this thread is a system thread.
-	 * 
+	 *
 	 * @return whether this thread is a system thread
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -75,7 +75,7 @@
 	 * Returns whether any of the stack frames associated with this thread are
 	 * running code in the VM that is out of synch with the code in the
 	 * workspace.
-	 * 
+	 *
 	 * @return whether this thread is out of synch with the workspace.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -90,7 +90,7 @@
 	/**
 	 * Returns whether this thread may be running code in the VM that is out of
 	 * synch with the code in the workspace.
-	 * 
+	 *
 	 * @return whether this thread may be out of synch with the workspace.
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -104,7 +104,7 @@
 
 	/**
 	 * Returns whether this thread is currently performing an evaluation.
-	 * 
+	 *
 	 * @return whether this thread is currently performing an evaluation
 	 * @since 2.0
 	 */
@@ -113,7 +113,7 @@
 	/**
 	 * Returns the name of the thread group this thread belongs to, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @return thread group name, or <code>null</code> if none
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -134,7 +134,7 @@
 	 * performed in all stack frames, in a top-down order, returning the first
 	 * successful match, or <code>null</code> if no match is found.
 	 * </p>
-	 * 
+	 *
 	 * @param variableName
 	 *            the name of the variable to search for
 	 * @return a variable, or <code>null</code> if none
@@ -161,7 +161,7 @@
 	 * back. Suspend and resume events are not fired during listener call backs.
 	 * Unspecified model specific events are fired.
 	 * </p>
-	 * 
+	 *
 	 * @param evaluation
 	 *            the evaluation to perform
 	 * @param monitor
@@ -186,7 +186,7 @@
 	 * thread. Runnables are executed asynchronously in a separate thread. This
 	 * method should be used to execute any code which performs an operation
 	 * like a method invocation.
-	 * 
+	 *
 	 * @param runnable
 	 *            the runnable to execute.
 	 * @since 2.1
@@ -196,12 +196,12 @@
 	/**
 	 * Attempts to terminate the currently executing
 	 * <code>IEvaluationRunnable</code> in this thread, if any.
-	 * 
+	 *
 	 * Evaluations may be composed of a series of instructions. Terminating an
 	 * evaluation means stopping the evaluation after the current instruction
 	 * completes. A single instruction (such as a method invocation) cannot be
 	 * interrupted.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if an exception occurs while terminating the evaluation.
 	 * @since 2.1
@@ -212,7 +212,7 @@
 	 * Returns whether the currently executing <code>IEvaluationRunnable</code>
 	 * supports termination. An IEvaluationRunnable supports termination if it
 	 * implements <code>ITerminate</code>
-	 * 
+	 *
 	 * @return whether the current evaluation supports termination
 	 * @since 2.1
 	 */
@@ -221,7 +221,7 @@
 	/**
 	 * Returns a Java object for the monitor for which this thread is currently
 	 * waiting or <code>null</code>.
-	 * 
+	 *
 	 * @return IJavaObject the contended monitor object or <code>null</code> if
 	 *         this thread is not waiting on a monitor.
 	 * @exception DebugException
@@ -234,7 +234,7 @@
 	/**
 	 * Returns the monitors owned by this thread or <code>null</code> if this
 	 * thread owns no monitors.
-	 * 
+	 *
 	 * @return the owned monitors
 	 * @exception DebugException
 	 *                if an exception occurs while retrieving the owned monitors
@@ -245,7 +245,7 @@
 
 	/**
 	 * Returns whether this threads owns at least one monitor.
-	 * 
+	 *
 	 * @return boolean whether this thread owns a monitor
 	 * @exception DebugException
 	 *                if an exception occurs determining if there are owned
@@ -260,9 +260,9 @@
 	 * java.lang.Thread#stop(java.lang.Throwable).<br>
 	 * If the thread is suspended when the method is called, the thread must be
 	 * resumed to complete the action.<br>
-	 * 
+	 *
 	 * <em>exception</em> must represent an exception.
-	 * 
+	 *
 	 * @param exception
 	 *            the exception to throw.
 	 * @exception DebugException
@@ -275,7 +275,7 @@
 	/**
 	 * Returns the thread group this thread belongs to or <code>null</code> if
 	 * none.
-	 * 
+	 *
 	 * @return thread group or <code>null</code>
 	 * @throws DebugException
 	 *             if the thread group cannot be computed
@@ -285,7 +285,7 @@
 
 	/**
 	 * Returns whether this thread is a daemon thread.
-	 * 
+	 *
 	 * @return whether this thread is a daemon thread
 	 * @throws DebugException
 	 *             if an exception occurs while determining status
@@ -295,7 +295,7 @@
 
 	/**
 	 * Returns the number of frames in this thread.
-	 * 
+	 *
 	 * @return number of stack frames
 	 * @throws DebugException
 	 *             if an exception occurs while retrieving the count
@@ -305,7 +305,7 @@
 
 	/**
 	 * Returns the object reference associated with this thread.
-	 * 
+	 *
 	 * @return thread object reference
 	 * @throws DebugException
 	 *             if unable to retrieve an object reference
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThreadGroup.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThreadGroup.java
index 612eebe..26cfea3 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThreadGroup.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaThreadGroup.java
@@ -15,7 +15,7 @@
 
 /**
  * Represents a thread group in the target VM.
- * 
+ *
  * @since 3.2
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -25,7 +25,7 @@
 	/**
 	 * Returns the threads in this thread group. Does not include threads in
 	 * subgroups.
-	 * 
+	 *
 	 * @return threads in this group
 	 * @throws DebugException
 	 *             if the request fails
@@ -34,7 +34,7 @@
 
 	/**
 	 * Returns whether this group contains any threads.
-	 * 
+	 *
 	 * @return whether this group contains any threads
 	 * @throws DebugException
 	 *             if the request fails
@@ -44,7 +44,7 @@
 	/**
 	 * Returns the thread group this thread group is contained in or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @return parent thread group or <code>null</code>
 	 * @throws DebugException
 	 *             if the request fails
@@ -53,7 +53,7 @@
 
 	/**
 	 * Returns whether this thread group contains subgroups.
-	 * 
+	 *
 	 * @return whether this thread group contains subgroups
 	 * @throws DebugException
 	 *             if the request fails
@@ -63,7 +63,7 @@
 	/**
 	 * Returns immediate thread groups contained in this thread. Does not
 	 * include subgroups of immediate groups.
-	 * 
+	 *
 	 * @return thread groups contained in this group
 	 * @throws DebugException
 	 *             if the request fails
@@ -72,7 +72,7 @@
 
 	/**
 	 * Returns the name of this thread group.
-	 * 
+	 *
 	 * @return thread group name
 	 * @throws DebugException
 	 *             if the request fails
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaType.java
index 52a2213..3a213b7 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaType.java
@@ -19,7 +19,7 @@
  * <p>
  * Since 3.2, an <code>IJavaType</code> is also a debug element
  * </p>
- * 
+ *
  * @see IJavaValue
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -27,7 +27,7 @@
 public interface IJavaType extends IDebugElement {
 	/**
 	 * Returns the JNI-style signature for this type.
-	 * 
+	 *
 	 * @return signature
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -42,7 +42,7 @@
 	/**
 	 * Returns the name of this type. For example,
 	 * <code>"java.lang.String"</code>.
-	 * 
+	 *
 	 * @return the name of this type
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaValue.java
index 3620ba2..1769b46 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaValue.java
@@ -15,7 +15,7 @@
 
 /**
  * An object, primitive data type, or array, on a Java virtual machine.
- * 
+ *
  * @see org.eclipse.debug.core.model.IValue
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -24,7 +24,7 @@
 	/**
 	 * Returns the JNI-style signature for the type of this value, or
 	 * <code>null</code> if the value is <code>null</code>.
-	 * 
+	 *
 	 * @return signature, or <code>null</code> if signature is <code>null</code>
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -42,7 +42,7 @@
 	 * Returns the generic signature as defined in the JVM specification for the
 	 * type of this value. Returns <code>null</code> if the value is
 	 * <code>null</code>, or if the type of this value is not a generic type.
-	 * 
+	 *
 	 * @return signature, or <code>null</code> if generic signature not
 	 *         available
 	 * @exception DebugException
@@ -61,19 +61,19 @@
 	/**
 	 * Returns the type of this value, or <code>null</code> if this value
 	 * represents the <code>null</code> value
-	 * 
+	 *
 	 * @return the type of this value, or <code>null</code> if this value
 	 *         represents the <code>null</code> value
 	 * @throws DebugException
 	 *             if the request fails
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public IJavaType getJavaType() throws DebugException;
 
 	/**
 	 * Returns whether this value represents <code>null</code>.
-	 * 
+	 *
 	 * @return whether this value represents <code>null</code>
 	 * @since 3.5
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaVariable.java
index 67f069d..79ed5a0 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaVariable.java
@@ -15,7 +15,7 @@
 
 /**
  * A local variable, field slot, or receiver (this) in a Java virtual machine.
- * 
+ *
  * @see org.eclipse.debug.core.model.IVariable
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -26,7 +26,7 @@
 	 * Returns the JNI-style signature for the declared type of this variable,
 	 * or <code>null</code> if the type associated with the signature is not yet
 	 * loaded in the target VM.
-	 * 
+	 *
 	 * @return signature, or <code>null</code> if not accessible
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -46,7 +46,7 @@
 	 * associated with the signature is not yet loaded in the target VM. Returns
 	 * the same value as #getSignature() if the declared type of this variable
 	 * is not a generic type.
-	 * 
+	 *
 	 * @return generic signature, or <code>null</code> if not accessible
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -63,7 +63,7 @@
 
 	/**
 	 * Returns the declared type of this variable.
-	 * 
+	 *
 	 * @return the declared type of this variable
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -80,7 +80,7 @@
 
 	/**
 	 * Returns whether this variable is local.
-	 * 
+	 *
 	 * @return whether this variable is a local variable
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaWatchpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaWatchpoint.java
index 70cb923..c18032c 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaWatchpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/IJavaWatchpoint.java
@@ -23,7 +23,7 @@
  * Since 3.1, <code>IJavaWatchpoint</code> also implements
  * {@link org.eclipse.debug.core.model.IWatchpoint}.
  * </p>
- * 
+ *
  * @since 2.0
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
@@ -31,7 +31,7 @@
 public interface IJavaWatchpoint extends IJavaLineBreakpoint, IWatchpoint {
 	/**
 	 * Returns the name of the field associated with this watchpoint
-	 * 
+	 *
 	 * @return field the name of the field on which this watchpoint is installed
 	 * @exception CoreException
 	 *                if unable to access the property on this breakpoint's
@@ -42,10 +42,10 @@
 	/**
 	 * Returns whether this breakpoint last suspended in this target due to an
 	 * access (<code>true</code>) or modification (<code>false</code>).
-	 * 
+	 *
 	 * @param target
 	 *            the debug target
-	 * 
+	 *
 	 * @return <code>true</code> if this watchpoint last suspended the given
 	 *         target due to a field access; <code>false</code> if this
 	 *         watchpoint last suspended the given target due to a modification
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/JDIDebugModel.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/JDIDebugModel.java
index 1bfadb1..d1e64bf 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/JDIDebugModel.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/debug/core/JDIDebugModel.java
@@ -58,7 +58,7 @@
  * <p>
  * This class provides static utility methods only.
  * </p>
- * 
+ *
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
@@ -87,7 +87,7 @@
 	 * evaluation operation. If true, breakpoints will be hit as usual during
 	 * evaluations. If false, the breakpoint manager will be automatically
 	 * disabled during evaluations.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static final String PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION = getPluginIdentifier()
@@ -100,7 +100,7 @@
 	 */
 	public static final String PREF_FILTER_BREAKPOINTS_FROM_UNRELATED_SOURCES = getPluginIdentifier()
 			+ ".do_not_install_breakpoints_from_unrelated_sources"; //$NON-NLS-1$
-	
+
 	/**
 	 * Preference key for specifying if the value returned or thrown should be displayed as variable after a "step return" or "step over" (if
 	 * supported by the vm)
@@ -125,7 +125,7 @@
 	 * <code>IDisconnect</code>). Launching the actual VM is a client
 	 * responsibility. By default, the target VM will be resumed on startup. The
 	 * debug target is added to the given launch.
-	 * 
+	 *
 	 * @param launch
 	 *            the launch the new debug target will be contained in
 	 * @param vm
@@ -164,7 +164,7 @@
 	 * when the connection to the VM was established). Launching the actual VM
 	 * is a client responsibility. The debug target is added to the given
 	 * launch.
-	 * 
+	 *
 	 * @param launch
 	 *            the launch the new debug target will be contained in
 	 * @param vm
@@ -211,7 +211,7 @@
 
 	/**
 	 * Returns the identifier for the JDI debug model plug-in
-	 * 
+	 *
 	 * @return plug-in identifier
 	 */
 	public static String getPluginIdentifier() {
@@ -227,7 +227,7 @@
 	 * class are not notified of hot code replace events for that target. This
 	 * allows a target to have custom hot code replace notification behavior.
 	 * </p>
-	 * 
+	 *
 	 * @param listener
 	 *            hot code replace listener
 	 * @see IJavaHotCodeReplaceListener
@@ -242,7 +242,7 @@
 	/**
 	 * Unregisters the given listener for hot code replace notifications. Has no
 	 * effect if an identical listener is not already registered.
-	 * 
+	 *
 	 * @param listener
 	 *            hot code replace listener
 	 * @see IJavaHotCodeReplaceListener
@@ -256,7 +256,7 @@
 	/**
 	 * Registers the given listener for breakpoint notifications. Has no effect
 	 * if an identical listener is already registered.
-	 * 
+	 *
 	 * @param listener
 	 *            breakpoint listener
 	 * @see IJavaBreakpointListener
@@ -270,7 +270,7 @@
 	/**
 	 * Unregisters the given listener for breakpoint notifications. Has no
 	 * effect if an identical listener is not already registered.
-	 * 
+	 *
 	 * @param listener
 	 *            breakpoint listener
 	 * @see IJavaBreakpointListener
@@ -288,7 +288,7 @@
 	 * is known, it may be specified by charStart/charEnd. If hitCount is > 0,
 	 * the breakpoint will suspend execution when it is "hit" the specified
 	 * number of times.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -337,7 +337,7 @@
 			int hitCount, boolean register, Map<String, Object> attributes)
 			throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaLineBreakpoint(resource, typeName, lineNumber,
 				charStart, charEnd, hitCount, register, attributes);
 	}
@@ -347,7 +347,7 @@
 	 * given line number, which is installed in all classes whose fully
 	 * qualified name matches the given pattern. If hitCount > 0, the breakpoint
 	 * will suspend execution when it is "hit" the specified number of times.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -398,7 +398,7 @@
 			int lineNumber, int charStart, int charEnd, int hitCount,
 			boolean register, Map<String, Object> attributes) throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaPatternBreakpoint(resource, sourceName, pattern,
 				lineNumber, charStart, charEnd, hitCount, register, attributes);
 	}
@@ -406,7 +406,7 @@
 	/**
 	 * Creates and returns a line breakpoint identified by its source file name
 	 * and/or path, and stratum that it is relative to.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -482,7 +482,7 @@
 			int charStart, int charEnd, int hitCount, boolean register,
 			Map<String, Object> attributes) throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaStratumLineBreakpoint(resource, stratum, sourceName,
 				sourcePath, classNamePattern, lineNumber, charStart, charEnd,
 				hitCount, register, attributes);
@@ -493,7 +493,7 @@
 	 * the given line number. Clients must set the class name pattern per target
 	 * for this type of breakpoint. If hitCount > 0, the breakpoint will suspend
 	 * execution when it is "hit" the specified number of times.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -538,7 +538,7 @@
 			int charStart, int charEnd, int hitCount, boolean register,
 			Map<String, Object> attributes) throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaTargetPatternBreakpoint(resource, sourceName,
 				lineNumber, charStart, charEnd, hitCount, register, attributes);
 	}
@@ -550,7 +550,7 @@
 	 * should cause thread suspensions - that is, in caught and/or uncaught
 	 * locations. Checked indicates if the given exception is a checked
 	 * exception.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -585,7 +585,7 @@
 			boolean uncaught, boolean checked, boolean register, Map<String, Object> attributes)
 			throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaExceptionBreakpoint(resource, exceptionName, caught,
 				uncaught, checked, register, attributes);
 	}
@@ -595,7 +595,7 @@
 	 * with the given name. The marker associated with the breakpoint will be
 	 * created on the specified resource. If hitCount > 0, the breakpoint will
 	 * suspend execution when it is "hit" the specified number of times.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -647,14 +647,14 @@
 			int charEnd, int hitCount, boolean register, Map<String, Object> attributes)
 			throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaWatchpoint(resource, typeName, fieldName, lineNumber,
 				charStart, charEnd, hitCount, register, attributes);
 	}
 
 	/**
 	 * Creates and returns a method breakpoint with the specified criteria.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -717,7 +717,7 @@
 			int hitCount, boolean register, Map<String, Object> attributes)
 			throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaMethodBreakpoint(resource, typePattern, methodName,
 				methodSignature, entry, exit, nativeOnly, lineNumber,
 				charStart, charEnd, hitCount, register, attributes);
@@ -727,7 +727,7 @@
 	 * Creates and returns a method entry breakpoint with the specified
 	 * criteria. A method entry breakpoint will only be installed for methods
 	 * that have executable code (i.e. will not work for native methods).
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -776,7 +776,7 @@
 			int hitCount, boolean register, Map<String, Object> attributes)
 			throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaMethodEntryBreakpoint(resource, typeName, methodName,
 				methodSignature, lineNumber, charStart, charEnd, hitCount,
 				register, attributes);
@@ -786,7 +786,7 @@
 	 * Returns a Java line breakpoint that is already registered with the
 	 * breakpoint manager for a type with the given name at the given line
 	 * number.
-	 * 
+	 *
 	 * @param typeName
 	 *            fully qualified type name
 	 * @param lineNumber
@@ -826,7 +826,7 @@
 	 * Returns a Java line breakpoint that is already registered with the
 	 * breakpoint manager for a type with the given name at the given line
 	 * number in the given resource.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource
 	 * @param typeName
@@ -873,14 +873,14 @@
 	 * convenience method. <br>
 	 * <br>
 	 * For example:
-	 * 
+	 *
 	 * <pre>
 	 * IEclipsePreferences node = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
 	 * if(node != null) {
 	 * 	...
 	 * }
 	 * </pre>
-	 * 
+	 *
 	 * @return the preference store for this plug-in
 	 * @since 2.0
 	 * @deprecated the {@link Preferences} class has been deprecated, use the {@link IEclipsePreferences} accessors instead
@@ -896,7 +896,7 @@
 	/**
 	 * Saves the preference store for this plug-in.
 	 * <br><br>
-	 * The Preferences class has been deprecated and clients should directly be using the 
+	 * The Preferences class has been deprecated and clients should directly be using the
 	 * InstanceScope node for JDIDebugPlugin rather than this convenience method.
 	 * <br><br>
 	 * For example:
@@ -928,7 +928,7 @@
 	 * Creates and returns a class prepare breakpoint for a type with the given
 	 * name. The marker associated with the breakpoint will be created on the
 	 * specified resource.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -965,7 +965,7 @@
 			IResource resource, String typeName, int memberType, int charStart,
 			int charEnd, boolean register, Map<String, Object> attributes) throws CoreException {
 		if (attributes == null)
-			attributes = new HashMap<String, Object>(10);
+			attributes = new HashMap<>(10);
 		return new JavaClassPrepareBreakpoint(resource, typeName, memberType,
 				charStart, charEnd, register, attributes);
 	}
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/EventDispatcher.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/EventDispatcher.java
index c5af456..92c0328 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/EventDispatcher.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/EventDispatcher.java
@@ -76,24 +76,24 @@
 	 * Queue of debug model events to fire, created when processing events on
 	 * the target VM. Keyed by event sets, processed independently.
 	 */
-	private Map<EventSet, List<DebugEvent>> fSetToQueue = new HashMap<EventSet, List<DebugEvent>>();
+	private Map<EventSet, List<DebugEvent>> fSetToQueue = new HashMap<>();
 
 	/**
 	 * Constructs a new event dispatcher listening for events originating from
 	 * the specified debug target's underlying VM.
-	 * 
+	 *
 	 * @param target
 	 *            the target this event dispatcher belongs to
 	 */
 	public EventDispatcher(JDIDebugTarget target) {
-		fEventHandlers = new HashMap<EventRequest, IJDIEventListener>(10);
+		fEventHandlers = new HashMap<>(10);
 		fTarget = target;
 		fShutdown = false;
 	}
 
 	/**
 	 * Dispatch the given event set.
-	 * 
+	 *
 	 * @param eventSet
 	 *            events to dispatch
 	 */
@@ -139,7 +139,7 @@
 					try {
 						if (((IJavaLineBreakpoint) listener).isConditionEnabled()) {
 							if (deferredEvents == null) {
-								deferredEvents = new ArrayList<Event>(5);
+								deferredEvents = new ArrayList<>(5);
 							}
 							deferredEvents.add(event);
 							continue;
@@ -224,7 +224,7 @@
 	 * Continuously reads events that are coming from the event queue, until
 	 * this event dispatcher is shutdown. A debug target starts a thread on this
 	 * method on startup.
-	 * 
+	 *
 	 * @see #shutdown()
 	 */
 	@Override
@@ -287,7 +287,7 @@
 
 	/**
 	 * Returns whether this event dispatcher has been shutdown.
-	 * 
+	 *
 	 * @return whether this event dispatcher has been shutdown
 	 */
 	private boolean isShutdown() {
@@ -298,7 +298,7 @@
 	 * Registers the given listener for with the given event request. When an
 	 * event is received from the underlying VM, that is associated with the
 	 * given event request, the listener will be notified.
-	 * 
+	 *
 	 * @param listener
 	 *            the listener to register
 	 * @param request
@@ -314,7 +314,7 @@
 	 * De-registers the given listener and event request. The listener will no
 	 * longer be notified of events associated with the request. Listeners are
 	 * responsible for deleting the associated event request if required.
-	 * 
+	 *
 	 * @param listener
 	 *            the listener to de-register
 	 * @param request
@@ -327,7 +327,7 @@
 	/**
 	 * Adds the given event to the queue of debug events to fire when done
 	 * dispatching events from the given event set.
-	 * 
+	 *
 	 * @param event
 	 *            the event to queue
 	 * @param set
@@ -337,7 +337,7 @@
 		synchronized (fSetToQueue) {
 			List<DebugEvent> list = fSetToQueue.get(set);
 			if (list == null) {
-				list = new ArrayList<DebugEvent>(5);
+				list = new ArrayList<>(5);
 				fSetToQueue.put(set, list);
 			}
 			list.add(event);
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/HeapWalkingManager.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/HeapWalkingManager.java
index d21d357..bd1efa4 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/HeapWalkingManager.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/HeapWalkingManager.java
@@ -21,7 +21,7 @@
 /**
  * Controls preferences related to heap walking so that they are available in
  * java debug model code, but can be updated through the UI.
- * 
+ *
  * @since 3.3
  */
 public class HeapWalkingManager {
@@ -38,7 +38,7 @@
 	 * Returns whether the given parent object is a debug element with a debug
 	 * target that supports retrieval of instance and reference information from
 	 * the VM.
-	 * 
+	 *
 	 * @param object
 	 *            the object to test, can be <code>null</code>
 	 * @return whether the given object has a debug target that supports heap
@@ -76,8 +76,8 @@
 	public boolean isShowReferenceInVarView() {
 		return Platform.getPreferencesService().getBoolean(
 				JDIDebugPlugin.getUniqueIdentifier(),
-				JDIDebugPlugin.PREF_SHOW_REFERENCES_IN_VAR_VIEW, 
-				false, 
+				JDIDebugPlugin.PREF_SHOW_REFERENCES_IN_VAR_VIEW,
+				false,
 				null);
 	}
 
@@ -107,7 +107,7 @@
 
 	/**
 	 * Stores the passed vale in the preference store
-	 * 
+	 *
 	 * @param value
 	 *            whether to display references as variables in the variables
 	 *            view
@@ -126,7 +126,7 @@
 
 	/**
 	 * Stores the passed value in the preference store
-	 * 
+	 *
 	 * @param max
 	 *            the maximum number of references that should be displayed to
 	 *            the user
@@ -145,7 +145,7 @@
 
 	/**
 	 * Stores the passed value in the preference store
-	 * 
+	 *
 	 * @param max
 	 *            the maximum number of instances that should be displayed to
 	 *            the user
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/IJDIEventListener.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/IJDIEventListener.java
index f94242b..6032ebd 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/IJDIEventListener.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/IJDIEventListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,7 +20,7 @@
  * A jdi event listener is notified of events associated with a specific jdi
  * event request. A listener registers/deregisters event requests with a debug
  * target.
- * 
+ *
  * @see JDIDebugTarget#addJDIEventListener(IJDIEventListener, EventRequest)
  * @see JDIDebugTarget#removeJDIEventListener(IJDIEventListener, EventRequest)
  */
@@ -40,7 +40,7 @@
 	 * running its evaluation since the vote is already to suspend (if it
 	 * coincides with a step end).
 	 * </p>
-	 * 
+	 *
 	 * @param event
 	 *            the event to handle
 	 * @param target
@@ -57,7 +57,7 @@
 	/**
 	 * Notification that all event handlers for an event set have handled their
 	 * associated events and whether the event set will suspend.
-	 * 
+	 *
 	 * @param event
 	 *            event the listener was registered for/handled
 	 * @param target
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugMessages.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugMessages.java
index 9d3bfb2..ff6695f 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugMessages.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugMessages.java
@@ -3,8 +3,8 @@
  * program and the accompanying materials are made available under the terms of
  * the Eclipse Public License v1.0 which accompanies this distribution, and is
  * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
+ *
+ * Contributors:
  * IBM - Initial API and implementation
  **********************************************************************/
 package org.eclipse.jdt.internal.debug.core;
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugOptions.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugOptions.java
index 88549d2..062eddd 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugOptions.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugOptions.java
@@ -22,17 +22,17 @@
 
 /**
  * Debug flags in options file.
- * 
+ *
  * @since 3.5
  */
 public class JDIDebugOptions implements DebugOptionsListener {
-	
+
 	public static final String DEBUG_AST_EVALUATIONS_CALLING_THREADS_FLAG = "org.eclipse.jdt.debug/debug/astEvaluations/callingThreads"; //$NON-NLS-1$
 	public static final String DEBUG_AST_EVALUATIONS_FLAG = "org.eclipse.jdt.debug/debug/astEvaluations"; //$NON-NLS-1$
 	public static final String DEBUG_JDI_REQUEST_TIMES_FLAG = "org.eclipse.jdt.debug/debug/jdiRequestTimes"; //$NON-NLS-1$
 	public static final String DEBUG_JDI_EVENTS_FLAG = "org.eclipse.jdt.debug/debug/jdiEvents"; //$NON-NLS-1$
 	public static final String DEBUG_FLAG = "org.eclipse.jdt.debug/debug"; //$NON-NLS-1$
-	
+
 	public static boolean DEBUG = false;
 	public static boolean DEBUG_JDI_EVENTS = false;
 	public static boolean DEBUG_JDI_REQUEST_TIMES = false;
@@ -44,16 +44,16 @@
 	 * @since 3.8
 	 */
 	private static DebugTrace fgDebugTrace;
-	
+
 	/**
 	 * Constructor
 	 */
 	public JDIDebugOptions(BundleContext context) {
-		Hashtable<String, String> props = new Hashtable<String, String>(2);
+		Hashtable<String, String> props = new Hashtable<>(2);
 		props.put(org.eclipse.osgi.service.debug.DebugOptions.LISTENER_SYMBOLICNAME, JDIDebugPlugin.getUniqueIdentifier());
 		context.registerService(DebugOptionsListener.class.getName(), this, props);
 	}
-	
+
 	// used to format debug messages
 	public static final DateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); //$NON-NLS-1$
 
@@ -69,7 +69,7 @@
 		DEBUG_AST_EVAL = DEBUG && options.getBooleanOption(DEBUG_AST_EVALUATIONS_FLAG, false);
 		DEBUG_AST_EVAL_THREAD_TRACE = DEBUG && options.getBooleanOption(DEBUG_AST_EVALUATIONS_CALLING_THREADS_FLAG, false);
 	}
-	
+
 	/**
 	 * Prints the given message to System.out and to the OSGi tracing (if started)
 	 * @param option the option or <code>null</code>
@@ -83,10 +83,10 @@
 			fgDebugTrace.trace(option, message, throwable);
 		}
 	}
-	
+
 	/**
 	 * Prints the given message to System.out and to the OSGi tracing (if enabled)
-	 * 
+	 *
 	 * @param message the message or <code>null</code>
 	 * @since 3.8
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java
index 64520fa..5d92208 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java
@@ -56,16 +56,16 @@
 
 	/**
 	 * Boolean preference controlling if hot code replace is enabled.
-	 * 
+	 *
 	 * @since 3.11
 	 */
 	public static final String PREF_ENABLE_HCR = JDIDebugPlugin
 			.getUniqueIdentifier() + ".enable_hcr"; //$NON-NLS-1$
-	
+
 	/**
 	 * integer preference controlling if we should, by default, suspend the VM
 	 * instead of the thread
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	public static final String PREF_DEFAULT_BREAKPOINT_SUSPEND_POLICY = JDIDebugPlugin
@@ -74,7 +74,7 @@
 	/**
 	 * integer preference controlling which default suspend option to set on new
 	 * watchpoints
-	 * 
+	 *
 	 * @since 3.3.1
 	 */
 	public static final String PREF_DEFAULT_WATCHPOINT_SUSPEND_POLICY = JDIDebugPlugin
@@ -83,7 +83,7 @@
 	/**
 	 * Boolean preference controlling if references should be displayed as
 	 * variables in the variables and expressions view
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String PREF_SHOW_REFERENCES_IN_VAR_VIEW = JDIDebugPlugin
@@ -92,7 +92,7 @@
 	/**
 	 * Integer preference determining the maximum number of references that
 	 * should be returned to the user when displaying reference information
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String PREF_ALL_REFERENCES_MAX_COUNT = JDIDebugPlugin
@@ -101,7 +101,7 @@
 	/**
 	 * Integer preference determining the maximum number of instances that
 	 * should be returned to the user when displaying instance information
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	public static final String PREF_ALL_INSTANCES_MAX_COUNT = JDIDebugPlugin
@@ -109,14 +109,14 @@
 
 	/**
 	 * Extension point for java logical structures.
-	 * 
+	 *
 	 * @since 3.1
 	 */
 	public static final String EXTENSION_POINT_JAVA_LOGICAL_STRUCTURES = "javaLogicalStructures"; //$NON-NLS-1$
 
 	/**
 	 * Extension point for java breakpoint action delegates.
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	public static final String EXTENSION_POINT_JAVA_BREAKPOINT_LISTENERS = "breakpointListeners"; //$NON-NLS-1$
@@ -165,7 +165,7 @@
 	 * evaluations, via a status handler. A status handler is contributed by the
 	 * Java debug UI. When not present, the debug model uses any suspended
 	 * thread.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static final int INFO_EVALUATION_THREAD = 110;
@@ -175,14 +175,14 @@
 	 */
 	public static final IStatus STATUS_GET_EVALUATION_THREAD = new Status(
 			IStatus.INFO, getUniqueIdentifier(), INFO_EVALUATION_THREAD,
-			"Provides thread context for an evaluation", null); //$NON-NLS-1$	
+			"Provides thread context for an evaluation", null); //$NON-NLS-1$
 
 	/**
 	 * Status code used by the debug model to retrieve a frame to use for
 	 * evaluations, via a status handler. A status handler is contributed by the
 	 * Java debug UI. When not present, the debug model uses any suspended
 	 * thread.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static final int INFO_EVALUATION_STACK_FRAME = 111;
@@ -201,7 +201,7 @@
 
 	/**
 	 * Returns whether the debug UI plug-in is in trace mode.
-	 * 
+	 *
 	 * @return whether the debug UI plug-in is in trace mode
 	 */
 	public boolean isTraceMode() {
@@ -210,7 +210,7 @@
 
 	/**
 	 * Logs the given message if in trace mode.
-	 * 
+	 *
 	 * @param message the string to log
 	 */
 	public static void logTraceMessage(String message) {
@@ -224,7 +224,7 @@
 
 	/**
 	 * Return the singleton instance of the JDI Debug Model plug-in.
-	 * 
+	 *
 	 * @return the singleton instance of JDIDebugPlugin
 	 */
 	public static JDIDebugPlugin getDefault() {
@@ -245,7 +245,7 @@
 	 * Returns the detected version of JDI support. This is intended to
 	 * distinguish between clients that support JDI 1.4 methods like hot code
 	 * replace.
-	 * 
+	 *
 	 * @return an array of version numbers, major followed by minor
 	 * @since 2.1
 	 */
@@ -262,7 +262,7 @@
 	/**
 	 * Returns if the JDI version being used is greater than or equal to the
 	 * given version (major, minor).
-	 * 
+	 *
 	 * @param version the array of version number identifiers to compare
 	 * @return boolean
 	 */
@@ -337,7 +337,7 @@
 
 	/**
 	 * Shutdown the HCR manager and the Java debug targets.
-	 * 
+	 *
 	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
 	 * @see org.eclipse.core.runtime.Plugin#shutdown()
 	 */
@@ -372,9 +372,9 @@
 	public void preferenceChange(PreferenceChangeEvent event) {
 		if (event.getKey().equals(JDIDebugModel.PREF_REQUEST_TIMEOUT)) {
 			int value = Platform.getPreferencesService().getInt(
-					JDIDebugPlugin.getUniqueIdentifier(), 
-					JDIDebugModel.PREF_REQUEST_TIMEOUT, 
-					JDIDebugModel.DEF_REQUEST_TIMEOUT, 
+					JDIDebugPlugin.getUniqueIdentifier(),
+					JDIDebugModel.PREF_REQUEST_TIMEOUT,
+					JDIDebugModel.DEF_REQUEST_TIMEOUT,
 					null);
 			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
 			for (IDebugTarget target : targets) {
@@ -384,10 +384,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Logs the specified {@link Throwable} with this plug-in's log.
-	 * 
+	 *
 	 * @param t {@link Throwable} to log
 	 */
 	public static void log(Throwable t) {
@@ -402,12 +402,12 @@
 		// this message is intentionally not internationalized, as an exception
 		// may be due to the resource bundle itself
 		log(new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR,
-				"Internal error logged from JDI Debug: ", top)); //$NON-NLS-1$		
+				"Internal error logged from JDI Debug: ", top)); //$NON-NLS-1$
 	}
 
 	/**
 	 * Logs the specified status with this plug-in's log.
-	 * 
+	 *
 	 * @param status
 	 *            status to log
 	 */
@@ -436,7 +436,7 @@
 
 	/**
 	 * Adds the given breakpoint listener to the JDI debug model.
-	 * 
+	 *
 	 * @param listener
 	 *            breakpoint listener
 	 */
@@ -446,7 +446,7 @@
 
 	/**
 	 * Removes the given breakpoint listener from the JDI debug model.
-	 * 
+	 *
 	 * @param listener
 	 *            breakpoint listener
 	 */
@@ -456,7 +456,7 @@
 
 	/**
 	 * Notifies listeners that the given breakpoint is about to be added.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -469,7 +469,7 @@
 
 	/**
 	 * Notifies listeners that the given breakpoint has been installed.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -483,7 +483,7 @@
 
 	/**
 	 * Notifies listeners that the given breakpoint has been removed.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -497,7 +497,7 @@
 	/**
 	 * Notifies listeners that the given breakpoint has been hit. Returns
 	 * whether the thread should suspend.
-	 * 
+	 *
 	 * @param thread the current thread context
 	 * @param breakpoint Java breakpoint
 	 * @return if the thread should suspend
@@ -509,7 +509,7 @@
 	/**
 	 * Notifies listeners that the given breakpoint is about to be installed in
 	 * the given type. Returns whether the breakpoint should be installed.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @param breakpoint
@@ -576,7 +576,7 @@
 		/**
 		 * Returns the breakpoint for which notification is proceeding or
 		 * <code>null</code> if not in notification.
-		 * 
+		 *
 		 * @return breakpoint or <code>null</code>
 		 */
 		protected IJavaBreakpoint getBreakpoint() {
@@ -586,7 +586,7 @@
 		/**
 		 * Returns the listener for which notification is proceeding or
 		 * <code>null</code> if not in notification loop.
-		 * 
+		 *
 		 * @return breakpoint listener or <code>null</code>
 		 */
 		protected IJavaBreakpointListener getListener() {
@@ -636,7 +636,7 @@
 
 		/**
 		 * Notifies listeners of the given addition, install, or remove.
-		 * 
+		 *
 		 * @param target
 		 *            debug target
 		 * @param breakpoint
@@ -697,7 +697,7 @@
 		 * Notifies listeners that the given breakpoint is about to be installed
 		 * in the given type. Returns whether the breakpoint should be
 		 * installed.
-		 * 
+		 *
 		 * @param target
 		 *            Java debug target
 		 * @param breakpoint
@@ -757,7 +757,7 @@
 		/**
 		 * Notifies listeners that the given breakpoint has been hit. Returns
 		 * whether the thread should suspend.
-		 * 
+		 *
 		 * @param thread
 		 *            thread in which the breakpoint was hit
 		 * @param breakpoint
@@ -780,7 +780,7 @@
 	 * Returns an evaluation engine for the given project in the given debug
 	 * target or <code>null</code> if target does not have a IJavaDebugTarget
 	 * that is a JDIDebugTarget implementation.
-	 * 
+	 *
 	 * @param project java project
 	 * @param target the debug target
 	 * @return evaluation engine or <code>null</code>
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java
index 080b144..ca27983 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java
@@ -25,7 +25,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#
 	 * initializeDefaultPreferences()
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugPropertyTester.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugPropertyTester.java
index db2d768..47831fd 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugPropertyTester.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugPropertyTester.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object,
 	 * java.lang.String, java.lang.Object[], java.lang.Object)
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
index 0cd5809..30ac59d 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
@@ -49,7 +49,7 @@
 
 /**
  * A Utilities class.
- * 
+ *
  * @since 3.2
  */
 public class JavaDebugUtils {
@@ -60,7 +60,7 @@
 	/**
 	 * Resolves and returns a type from the Java model that corresponds to the
 	 * declaring type of the given stack frame, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param frame
 	 *            frame to resolve declaring type for
 	 * @return corresponding Java model type or <code>null</code>
@@ -80,7 +80,7 @@
 	/**
 	 * Resolves and returns a type from the Java model that corresponds to the
 	 * type of the given value, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param value
 	 *            value to resolve type for
 	 * @return corresponding Java model type or <code>null</code>
@@ -98,7 +98,7 @@
 	/**
 	 * Resolves and returns the Java model type associated with the given Java
 	 * debug type, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param type
 	 *            Java debug model type
 	 * @return Java model type or <code>null</code>
@@ -115,7 +115,7 @@
 	/**
 	 * Returns the source name associated with the given object, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param object
 	 *            an object with an <code>IJavaStackFrame</code> adapter, an
 	 *            IJavaValue or an IJavaType
@@ -184,7 +184,7 @@
 	 * Generates and returns a source file path based on a qualified type name.
 	 * For example, when <code>java.lang.String</code> is provided, the returned
 	 * source name is <code>java/lang/String.java</code>.
-	 * 
+	 *
 	 * @param qualifiedTypeName
 	 *            fully qualified type name that may contain inner types denoted
 	 *            with <code>$</code> character
@@ -212,7 +212,7 @@
 	/**
 	 * Resolves the type corresponding to the given name contained in the given
 	 * top-level Java element (class file, compilation unit, or type).
-	 * 
+	 *
 	 * @param qualifiedName
 	 *            fully qualified type name
 	 * @param javaElement
@@ -294,7 +294,7 @@
 	/**
 	 * Returns the Java element corresponding to the given object or
 	 * <code>null</code> if none, in the context of the given launch.
-	 * 
+	 *
 	 * @param launch
 	 *            provides source locator
 	 * @param object
@@ -316,7 +316,7 @@
 	/**
 	 * Returns the {@link IJavaElement} associated with the given source element
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param sourceElement
 	 *            a java element, object that adapts to a java element, or a
 	 *            resource
@@ -344,7 +344,7 @@
 
 	/**
 	 * Returns the source element corresponding to the given object or <code>null</code> if none, in the context of the given launch.
-	 * 
+	 *
 	 * @param launch
 	 *            provides source locator
 	 * @param object
@@ -360,7 +360,7 @@
 	/**
 	 * Returns the source element corresponding to the given object in the given stratum or <code>null</code> if none, in the context of the given
 	 * launch.
-	 * 
+	 *
 	 * @param launch
 	 *            provides source locator
 	 * @param object
@@ -400,7 +400,7 @@
 
 	/**
 	 * Resolves the {@link IJavaProject} within the context of the given {@link IJavaStackFrame}
-	 * 
+	 *
 	 * @param frame
 	 * @return the {@link IJavaProject} or <code>null</code>
 	 * @since 3.8.0
@@ -435,12 +435,12 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns an array of simple type names that are part of the given type's
 	 * qualified name. For example, if the given name is <code>x.y.A$B</code>,
 	 * an array with <code>["A", "B"]</code> is returned.
-	 * 
+	 *
 	 * @param typeName
 	 *            fully qualified type name
 	 * @return array of nested type names
@@ -451,7 +451,7 @@
 			typeName = typeName.substring(index + 1);
 		}
 		index = typeName.indexOf('$');
-		List<String> list = new ArrayList<String>(1);
+		List<String> list = new ArrayList<>(1);
 		while (index >= 0) {
 			list.add(typeName.substring(0, index));
 			typeName = typeName.substring(index + 1);
@@ -465,7 +465,7 @@
 	 * Returns the class file or compilation unit containing the given fully
 	 * qualified name in the specified project. All registered java like file
 	 * extensions are considered.
-	 * 
+	 *
 	 * @param qualifiedTypeName
 	 *            fully qualified type name
 	 * @param project
@@ -481,7 +481,7 @@
 			path = path.substring(0, pos);
 		}
 		path = path.replace('.', IPath.SEPARATOR);
-		path += "."; //$NON-NLS-1$    	
+		path += "."; //$NON-NLS-1$
 		for (String ext : javaLikeExtensions) {
 			IJavaElement element = project.findElement(new Path(path + ext));
 			if (element != null) {
@@ -497,7 +497,7 @@
 	 * <li>The names are non-null and equal</li>
 	 * <li>The names are both null</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param name1
 	 *            The first name
 	 * @param name2
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/BreakpointListenerManager.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/BreakpointListenerManager.java
index c15e4bf..f79ec37 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/BreakpointListenerManager.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/BreakpointListenerManager.java
@@ -34,7 +34,7 @@
 
 /**
  * Manages breakpoint listener extensions.
- * 
+ *
  * @since 3.5
  */
 public class BreakpointListenerManager {
@@ -69,7 +69,7 @@
 
 		/**
 		 * Returns the underlying delegate or <code>null</code> if none/error
-		 * 
+		 *
 		 * @return breakpoint listener extension
 		 */
 		private synchronized IJavaBreakpointListener getDelegate() {
@@ -87,7 +87,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.debug.core.IJavaBreakpointListener#addingBreakpoint
 		 * (org.eclipse.jdt.debug.core.IJavaDebugTarget,
@@ -104,7 +104,7 @@
 
 		/**
 		 * Whether this listener is for all breakpoints.
-		 * 
+		 *
 		 * @return whether for all breakpoints
 		 */
 		boolean isGlobal() {
@@ -117,7 +117,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.debug.core.IJavaBreakpointListener#
 		 * breakpointHasCompilationErrors
 		 * (org.eclipse.jdt.debug.core.IJavaLineBreakpoint,
@@ -134,7 +134,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.debug.core.IJavaBreakpointListener#
 		 * breakpointHasRuntimeException
 		 * (org.eclipse.jdt.debug.core.IJavaLineBreakpoint,
@@ -151,7 +151,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.debug.core.IJavaBreakpointListener#breakpointHit(
 		 * org.eclipse.jdt.debug.core.IJavaThread,
@@ -168,7 +168,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.debug.core.IJavaBreakpointListener#breakpointInstalled
 		 * (org.eclipse.jdt.debug.core.IJavaDebugTarget,
@@ -185,7 +185,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.debug.core.IJavaBreakpointListener#breakpointRemoved
 		 * (org.eclipse.jdt.debug.core.IJavaDebugTarget,
@@ -202,7 +202,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.debug.core.IJavaBreakpointListener#installingBreakpoint
 		 * (org.eclipse.jdt.debug.core.IJavaDebugTarget,
@@ -226,8 +226,8 @@
 	 */
 	private synchronized void init() {
 		if (fgJavaBreakpointListenersMap == null) {
-			fgJavaBreakpointListenersMap = new HashMap<String, JavaBreakpointListenerProxy>();
-			List<JavaBreakpointListenerProxy> global = new ArrayList<JavaBreakpointListenerProxy>();
+			fgJavaBreakpointListenersMap = new HashMap<>();
+			List<JavaBreakpointListenerProxy> global = new ArrayList<>();
 			IExtensionPoint extensionPoint = Platform
 					.getExtensionRegistry()
 					.getExtensionPoint(
@@ -261,7 +261,7 @@
 	/**
 	 * Returns the listener registered with the given identifier or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param id
 	 *            extension identifier
 	 * @return breakpoint listener or <code>null</code>
@@ -274,7 +274,7 @@
 	/**
 	 * Returns breakpoint listener extensions registered to listen for changes
 	 * to all breakpoints.
-	 * 
+	 *
 	 * @return global listeners
 	 */
 	public IJavaBreakpointListener[] getGlobalListeners() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ConditionalBreakpointHandler.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ConditionalBreakpointHandler.java
index 94c2465..3b74bcf 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ConditionalBreakpointHandler.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ConditionalBreakpointHandler.java
@@ -43,7 +43,7 @@
 
 /**
  * Breakpoint listener to handle breakpoint conditions.
- * 
+ *
  * @since 3.5
  */
 public class ConditionalBreakpointHandler implements IJavaBreakpointListener {
@@ -90,7 +90,7 @@
 
 		/**
 		 * Processes the result to determine whether to suspend or resume.
-		 * 
+		 *
 		 * @param result
 		 *            evaluation result
 		 * @return vote
@@ -108,10 +108,10 @@
 				if (wrappedException instanceof VMDisconnectedException) {
 					// VM terminated/disconnected during evaluation
 					return DONT_SUSPEND;
-				} 
+				}
 				fireConditionHasRuntimeErrors(fBreakpoint, exception);
 				return SUSPEND;
-			} 
+			}
 			try {
 				IValue value = result.getValue();
 				if (fBreakpoint.isConditionSuspendOnTrue()) {
@@ -122,7 +122,7 @@
 								.equals("boolean")) { //$NON-NLS-1$
 							if (javaValue.getBooleanValue()) {
 								return SUSPEND;
-							} 
+							}
 							return DONT_SUSPEND;
 						}
 					}
@@ -145,13 +145,13 @@
 					// result was not JDIValue
 					fireConditionHasRuntimeErrors(fBreakpoint, new DebugException(status));
 					return SUSPEND;
-				} 
+				}
 				IDebugTarget debugTarget = thread.getDebugTarget();
 				IValue lastValue = fBreakpoint
 						.setCurrentConditionValue(debugTarget, value);
 				if (!value.equals(lastValue)) {
 					return SUSPEND;
-				} 
+				}
 				return DONT_SUSPEND;
 			} catch (DebugException e) {
 				// Suspend when an error occurs
@@ -163,7 +163,7 @@
 		/**
 		 * Result of the conditional expression evaluation - to resume or not
 		 * resume, that is the question.
-		 * 
+		 *
 		 * @return vote result
 		 */
 		int getVote() {
@@ -172,7 +172,7 @@
 
 		/**
 		 * Returns the lock object to synchronize this evaluation.
-		 * 
+		 *
 		 * @return lock object
 		 */
 		Object getLock() {
@@ -331,7 +331,7 @@
 	/**
 	 * Returns whether errors were encountered when evaluating the condition
 	 * (compilation or runtime).
-	 * 
+	 *
 	 * @return whether errors were encountered when evaluating the condition
 	 */
 	public boolean hasErrors() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpoint.java
index c8cff8f..cad7552 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpoint.java
@@ -79,7 +79,7 @@
 	 * <code>"org.eclipse.jdt.debug.core.installCount"</code>). This attribute
 	 * is a <code>int</code>.
 	 */
-	protected static final String INSTALL_COUNT = "org.eclipse.jdt.debug.core.installCount"; //$NON-NLS-1$	
+	protected static final String INSTALL_COUNT = "org.eclipse.jdt.debug.core.installCount"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing the fully qualified name of the type this
@@ -87,7 +87,7 @@
 	 * <code>"org.eclipse.jdt.debug.core.typeName"</code>). This attribute is a
 	 * <code>String</code>.
 	 */
-	protected static final String TYPE_NAME = "org.eclipse.jdt.debug.core.typeName"; //$NON-NLS-1$		
+	protected static final String TYPE_NAME = "org.eclipse.jdt.debug.core.typeName"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing suspend policy code for this breakpoint.
@@ -96,13 +96,13 @@
 	 * <code>IJavaBreakpoint.SUSPEND_VM</code> or
 	 * <code>IJavaBreakpoint.SUSPEND_THREAD</code>.
 	 */
-	protected static final String SUSPEND_POLICY = "org.eclipse.jdt.debug.core.suspendPolicy"; //$NON-NLS-1$	
+	protected static final String SUSPEND_POLICY = "org.eclipse.jdt.debug.core.suspendPolicy"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing a comma delimited list of extension
 	 * identifiers of breakpoint listeners. The listeners will be notified in
 	 * the order specified in the list.
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	public static final String BREAKPOINT_LISTENERS = JDIDebugPlugin.EXTENSION_POINT_JAVA_BREAKPOINT_LISTENERS;
@@ -111,7 +111,7 @@
 	 * <code>"org.eclipse.jdt.debug.core.expiredTriggerPoint"</code>). This attribute is
 	 * stored as a <code>boolean</code>. Once a trigger point is hit, a
 	 * breakpoint is considered to be "expired" as trigger point for the session.
-	 * 
+	 *
 	 * @since 3.11
 	 */
 	public static final String EXPIRED_TRIGGER_POINT = "org.eclipse.jdt.debug.core.expiredTriggerPoint"; //$NON-NLS-1$
@@ -176,15 +176,15 @@
 	 */
 	protected static final String[] fgExpiredEnabledAttributes = new String[] {
 			EXPIRED, ENABLED };
-	
+
 	public JavaBreakpoint() {
-		fRequestsByTarget = new HashMap<JDIDebugTarget, List<EventRequest>>(1);
-		fFilteredThreadsByTarget = new HashMap<JDIDebugTarget, IJavaThread>(1);
+		fRequestsByTarget = new HashMap<>(1);
+		fFilteredThreadsByTarget = new HashMap<>(1);
 	}
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IBreakpoint#getModelIdentifier()
 	 */
 	@Override
@@ -194,7 +194,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.Breakpoint#setMarker(org.eclipse.core.resources
 	 * .IMarker)
@@ -266,7 +266,7 @@
 	protected ArrayList<EventRequest> getRequests(JDIDebugTarget target) {
 		ArrayList<EventRequest> list = (ArrayList<EventRequest>) fRequestsByTarget.get(target);
 		if (list == null) {
-			list = new ArrayList<EventRequest>(2);
+			list = new ArrayList<>(2);
 		}
 		return list;
 	}
@@ -291,7 +291,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.IJDIEventListener#handleEvent(com
 	 * .sun.jdi.event.Event,
@@ -324,7 +324,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.IJDIEventListener#eventSetComplete
 	 * (com.sun.jdi.event.Event,
@@ -371,7 +371,7 @@
 	/**
 	 * Handle the given class prepare event, which was generated by the class
 	 * prepare event installed in the given target by this breakpoint.
-	 * 
+	 *
 	 * If the class which has been loaded is a class in which this breakpoint
 	 * should install, create a breakpoint request for that class.
 	 * @param event the event
@@ -395,7 +395,7 @@
 
 	/**
 	 * @see IJDIEventListener#handleEvent(Event, JDIDebugTarget)
-	 * 
+	 *
 	 *      Handle the given event, which was generated by the breakpoint
 	 *      request installed in the given target by this breakpoint.
 	 */
@@ -410,7 +410,7 @@
 	 * Delegates to the given thread to suspend, and returns whether the thread
 	 * suspended It is possible that the thread will not suspend as directed by
 	 * a Java breakpoint listener.
-	 * 
+	 *
 	 * @see IJavaBreakpointListener#breakpointHit(IJavaThread, IJavaBreakpoint)
 	 */
 	protected boolean suspend(JDIThread thread, boolean suspendVote) {
@@ -451,7 +451,7 @@
 	/**
 	 * Called when a breakpoint event is encountered. Expires the hit count in
 	 * the event's request and updates the marker.
-	 * 
+	 *
 	 * @param event
 	 *            the event whose request should have its hit count expired or
 	 *            <code>null</code> to only update the breakpoint marker.
@@ -476,7 +476,7 @@
 			}
 		}
 	}
-	
+
 	protected void disableTriggerPoint(Event event) {
 		try{
 			if (isTriggerPoint() && isEnabled()) {
@@ -487,14 +487,14 @@
 			}catch (CoreException ce) {
 				JDIDebugPlugin.log(ce);
 			}
-	
+
 	}
 
 	/**
 	 * Returns whether this breakpoint should be "skipped". Breakpoints are
 	 * skipped if the breakpoint manager is disabled and the breakpoint is
 	 * registered with the manager
-	 * 
+	 *
 	 * @return whether this breakpoint should be skipped
 	 */
 	public boolean shouldSkipBreakpoint() throws CoreException {
@@ -506,7 +506,7 @@
 	/**
 	 * Attempts to create a breakpoint request for this breakpoint in the given
 	 * reference type in the given target.
-	 * 
+	 *
 	 * @return Whether a request was created
 	 */
 	protected boolean createRequest(JDIDebugTarget target, ReferenceType type)
@@ -548,7 +548,7 @@
 	/**
 	 * Adds an instance filter to the given request. Since the implementation is
 	 * request specific, subclasses must override.
-	 * 
+	 *
 	 * @param request
 	 * @param object
 	 *            instance filter
@@ -598,7 +598,7 @@
 	/**
 	 * Creates, installs, and returns all event requests for this breakpoint in
 	 * the given reference type and and target.
-	 * 
+	 *
 	 * @return the event requests created or <code>null</code> if creation
 	 *         failed
 	 */
@@ -675,9 +675,9 @@
 	 * attempts to create a request when a breakpoint is being added to a target
 	 * fail, we must be dealing with a local type and therefore resort to
 	 * looking up all of the nested types of the top level enclosing type.
-	 * 
+	 *
 	 * @param target the target
-	 * @param enclosingTypeName the type name of the enclosing type 
+	 * @param enclosingTypeName the type name of the enclosing type
 	 * @throws CoreException if something bad happens
 	 */
 	protected void addToTargetForLocalType(JDIDebugTarget target, String enclosingTypeName) throws CoreException {
@@ -694,7 +694,7 @@
 	/**
 	 * Returns the JDI suspend policy that corresponds to this breakpoint's
 	 * suspend policy
-	 * 
+	 *
 	 * @return the JDI suspend policy that corresponds to this breakpoint's
 	 *         suspend policy
 	 * @exception CoreException
@@ -712,18 +712,18 @@
 	/**
 	 * returns the default suspend policy based on the pref setting on the
 	 * Java-Debug pref page
-	 * 
+	 *
 	 * @return the default suspend policy
 	 * @since 3.2
 	 */
 	protected int getDefaultSuspendPolicy() {
 		return Platform.getPreferencesService().getInt(
-				JDIDebugPlugin.getUniqueIdentifier(), 
-				JDIDebugPlugin.PREF_DEFAULT_BREAKPOINT_SUSPEND_POLICY, 
-				IJavaBreakpoint.SUSPEND_THREAD, 
+				JDIDebugPlugin.getUniqueIdentifier(),
+				JDIDebugPlugin.PREF_DEFAULT_BREAKPOINT_SUSPEND_POLICY,
+				IJavaBreakpoint.SUSPEND_THREAD,
 				null);
 	}
-	
+
 	/**
 	 * Returns whether the hitCount of this breakpoint is equal to the hitCount
 	 * of the associated request.
@@ -780,7 +780,7 @@
 		// removing was previously done is a workspace runnable, but that is
 		// not possible since it can be a resource callback (marker deletion)
 		// that causes a breakpoint to be removed
-		ArrayList<EventRequest> requests = new ArrayList<EventRequest>(getRequests(target));
+		ArrayList<EventRequest> requests = new ArrayList<>(getRequests(target));
 		// Iterate over a copy of the requests since this list of requests
 		// can be changed in other threads which would cause an
 		// ConcurrentModificationException
@@ -860,7 +860,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#isInstalled()
 	 */
 	@Override
@@ -883,7 +883,7 @@
 	public int getInstallCount() throws CoreException {
 		return ensureMarker().getAttribute(INSTALL_COUNT, 0);
 	}
-	
+
 	/**
 	 * Returns whether this trigger breakpoint has expired.
 	 */
@@ -917,7 +917,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#getTypeName()
 	 */
 	@Override
@@ -937,15 +937,15 @@
 	 */
 	private void configureAtStartup() throws CoreException {
 		List<String> attributes = null;
-		List<Object> values = new ArrayList<Object>(3);
+		List<Object> values = new ArrayList<>(3);
 		if (isInstalled()) {
-			attributes = new ArrayList<String>(3);
+			attributes = new ArrayList<>(3);
 			attributes.add(INSTALL_COUNT);
 			values.add(new Integer(0));
 		}
 		if (isExpired()) {
 			if (attributes == null) {
-				attributes = new ArrayList<String>(3);
+				attributes = new ArrayList<>(3);
 			}
 			// if breakpoint was auto-disabled, re-enable it
 			attributes.add(EXPIRED);
@@ -959,7 +959,7 @@
 		}
 		String[] listeners = readBreakpointListeners();
 		if (listeners.length > 0) {
-			fBreakpointListenerIds = new ArrayList<String>();
+			fBreakpointListenerIds = new ArrayList<>();
 			for (String listener : listeners) {
 				fBreakpointListenerIds.add(listener);
 			}
@@ -968,7 +968,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#getHitCount()
 	 */
 	@Override
@@ -978,7 +978,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#setHitCount(int)
 	 */
 	@Override
@@ -1024,7 +1024,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#getSuspendPolicy()
 	 */
 	@Override
@@ -1035,7 +1035,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#setSuspendPolicy(int)
 	 */
 	@Override
@@ -1048,7 +1048,7 @@
 
 	/**
 	 * Notifies listeners this breakpoint is to be added to the given target.
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 */
@@ -1062,7 +1062,7 @@
 	/**
 	 * Notifies listeners this breakpoint has been removed from the given
 	 * target.
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 */
@@ -1077,7 +1077,7 @@
 	/**
 	 * Notifies listeners this breakpoint has been installed in the given
 	 * target.
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 */
@@ -1091,7 +1091,7 @@
 
 	/**
 	 * Returns whether this breakpoint is installed in the given target.
-	 * 
+	 *
 	 * @param target
 	 * @return whether this breakpoint is installed in the given target
 	 */
@@ -1101,7 +1101,7 @@
 
 	/**
 	 * Sets this breakpoint as installed in the given target
-	 * 
+	 *
 	 * @param target
 	 * @param installed
 	 *            whether installed
@@ -1109,7 +1109,7 @@
 	protected void setInstalledIn(IJavaDebugTarget target, boolean installed) {
 		if (installed) {
 			if (fInstalledTargets == null) {
-				fInstalledTargets = new HashSet<IJavaDebugTarget>();
+				fInstalledTargets = new HashSet<>();
 			}
 			fInstalledTargets.add(target);
 		} else {
@@ -1121,7 +1121,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#setThreadFilter(org.eclipse
 	 * .jdt.debug.core.IJavaThread)
@@ -1150,7 +1150,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse
 	 * .debug.core.DebugEvent[])
@@ -1177,9 +1177,9 @@
 
 	/**
 	 * Removes cached information relevant to this thread which has terminated.
-	 * 
+	 *
 	 * Remove thread filters for terminated threads
-	 * 
+	 *
 	 * Subclasses may override but need to call super.
 	 */
 	protected void cleanupForThreadTermination(JDIThread thread) {
@@ -1204,7 +1204,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#getThreadFilter(org.eclipse
 	 * .jdt.debug.core.IJavaDebugTarget)
@@ -1216,7 +1216,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#getThreadFilters()
 	 */
 	@Override
@@ -1230,7 +1230,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#removeThreadFilter(org.eclipse
 	 * .jdt.debug.core.IJavaDebugTarget)
@@ -1252,7 +1252,7 @@
 	 * Returns whether this breakpoint should be installed in the given
 	 * reference type in the given target according to registered breakpoint
 	 * listeners.
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 * @param type
@@ -1274,7 +1274,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#addInstanceFilter(org.eclipse
 	 * .jdt.debug.core.IJavaObject)
@@ -1282,7 +1282,7 @@
 	@Override
 	public void addInstanceFilter(IJavaObject object) throws CoreException {
 		if (fInstanceFilters == null) {
-			fInstanceFilters = new ArrayList<IJavaObject>();
+			fInstanceFilters = new ArrayList<>();
 		}
 		if (!fInstanceFilters.contains(object)) {
 			fInstanceFilters.add(object);
@@ -1305,7 +1305,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#getInstanceFilters()
 	 */
 	@Override
@@ -1319,7 +1319,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#removeInstanceFilter(org.eclipse
 	 * .jdt.debug.core.IJavaObject)
@@ -1369,7 +1369,7 @@
 	/**
 	 * Recreate this breakpoint in the given target, as long as the target
 	 * already contains this breakpoint.
-	 * 
+	 *
 	 * @param target
 	 *            the target in which to re-create the breakpoint
 	 */
@@ -1382,7 +1382,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.Breakpoint#setEnabled(boolean)
 	 */
 	@Override
@@ -1393,7 +1393,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#supportsInstanceFilters()
 	 */
 	@Override
@@ -1403,7 +1403,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#supportsThreadFilters()
 	 */
 	@Override
@@ -1413,7 +1413,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#addBreakpointListener(java
 	 * .lang.String)
@@ -1422,7 +1422,7 @@
 	public synchronized void addBreakpointListener(String identifier)
 			throws CoreException {
 		if (fBreakpointListenerIds == null) {
-			fBreakpointListenerIds = new ArrayList<String>();
+			fBreakpointListenerIds = new ArrayList<>();
 		}
 		if (!fBreakpointListenerIds.contains(identifier)) {
 			fBreakpointListenerIds.add(identifier);
@@ -1433,7 +1433,7 @@
 	/**
 	 * Writes the current breakpoint listener collection to the underlying
 	 * marker.
-	 * 
+	 *
 	 * @throws CoreException
 	 */
 	private void writeBreakpointListeners() throws CoreException {
@@ -1450,7 +1450,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#removeBreakpointListener(java
 	 * .lang.String)
@@ -1469,7 +1469,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#getBreakpointListeners()
 	 */
 	@Override
@@ -1484,7 +1484,7 @@
 
 	/**
 	 * Reads breakpoint listeners from the underlying marker.
-	 * 
+	 *
 	 * @return breakpoint listener identifiers stored in this breakpoint's
 	 *         marker
 	 * @throws CoreException
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpointImportParticipant.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpointImportParticipant.java
index f8f0064..7acaeaa 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpointImportParticipant.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaBreakpointImportParticipant.java
@@ -49,7 +49,7 @@
 
 /**
  * Default implementation covering the import of all platform Java breakpoints
- * 
+ *
  * @since 3.5
  */
 public class JavaBreakpointImportParticipant implements
@@ -69,7 +69,7 @@
 
 		/**
 		 * Constructor
-		 * 
+		 *
 		 * @param breakpoint
 		 * @param unit
 		 */
@@ -79,13 +79,13 @@
 			fSignature = getMemberSignature(breakpoint);
 			fBreakpoint = breakpoint;
 			fUnit = unit;
-			fTypeNameStack = new Stack<String>();
+			fTypeNameStack = new Stack<>();
 		}
 
 		/**
 		 * Returns the value of the {@link JavaBreakpoint#TYPE_NAME} attribute
 		 * from the breakpoint or <code>null</code>
-		 * 
+		 *
 		 * @param breakpoint
 		 * @return the value of the type name attribute
 		 */
@@ -101,7 +101,7 @@
 		 * {@link JavaMethodBreakpoint#METHOD_NAME} if the breakpoint is a
 		 * method or method entry breakpoint (3) <code>null</code> if there is
 		 * no member name
-		 * 
+		 *
 		 * @param breakpoint
 		 * @return the member name or <code>null</code>
 		 */
@@ -118,7 +118,7 @@
 		 * Returns the signature of the member, defined with the
 		 * {@link JavaMethodBreakpoint#METHOD_SIGNATURE} attribute, or
 		 * <code>null</code>
-		 * 
+		 *
 		 * @param breakpoint
 		 * @return the signature of the member or <code>null</code>
 		 */
@@ -130,7 +130,7 @@
 		/**
 		 * Returns the fully qualified name of the enclosing type for the given
 		 * node
-		 * 
+		 *
 		 * @param node
 		 * @return the fully qualified name of the enclosing type
 		 */
@@ -140,7 +140,7 @@
 
 		/**
 		 * Constructs the qualified name of the enclosing parent type
-		 * 
+		 *
 		 * @param node
 		 *            the node to get the parent name for
 		 * @param buffer
@@ -223,7 +223,7 @@
 
 		/**
 		 * Visits the type node and return if children should be visited
-		 * 
+		 *
 		 * @param node
 		 * @return true if child nodes should be visited false otherwise
 		 */
@@ -319,7 +319,7 @@
 
 		/**
 		 * Creates a method signature from a specified {@link MethodDeclaration}
-		 * 
+		 *
 		 * @param node
 		 * @return the signature for the given method node or <code>null</code>
 		 */
@@ -355,12 +355,12 @@
 
 		/**
 		 * Returns the listing of the signatures of the parameters passed in
-		 * 
+		 *
 		 * @param rawparams
 		 * @return a listing of signatures for the specified parameters
 		 */
 		private List<String> getParametersTypeNames(List<SingleVariableDeclaration> rawparams) {
-			List<String> rparams = new ArrayList<String>(rawparams.size());
+			List<String> rparams = new ArrayList<>(rawparams.size());
 			String pname = null;
 			for (SingleVariableDeclaration param : rawparams) {
 				pname = getTypeSignature(param.getType());
@@ -373,7 +373,7 @@
 
 		/**
 		 * Processes the signature for the given {@link Type}
-		 * 
+		 *
 		 * @param type
 		 *            the type to process
 		 * @return the signature for the type or <code>null</code> if one could
@@ -410,7 +410,7 @@
 		/**
 		 * Collects the synthetic parameter of the fully qualified name of the
 		 * enclosing context for a constructor of an inner type
-		 * 
+		 *
 		 * @param method
 		 *            the constructor declaration
 		 * @param rparams
@@ -454,7 +454,7 @@
 		/**
 		 * Determines if the given {@link MethodDeclaration} is present in a top
 		 * level type
-		 * 
+		 *
 		 * @param method
 		 * @return
 		 */
@@ -466,7 +466,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IBreakpointImportParticipant#matches(java
 	 * .util.Map, org.eclipse.debug.core.model.IBreakpoint)
@@ -524,7 +524,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IBreakpointImportParticipant#verify(org.
 	 * eclipse.debug.core.model.IBreakpoint)
@@ -584,7 +584,7 @@
 
 	/**
 	 * Compares two attributes in a <code>null</code> safe way
-	 * 
+	 *
 	 * @param attr1
 	 *            the first attribute
 	 * @param attr2
@@ -604,7 +604,7 @@
 
 	/**
 	 * Returns if the given map of attributes matches the given line breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -621,7 +621,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given class prepare
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -641,7 +641,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given exception
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -658,7 +658,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given method
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -678,7 +678,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given method entry
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -697,7 +697,7 @@
 
 	/**
 	 * Returns if the given map of attributes matches the given watchpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the watchpoints' attributes, false
@@ -715,7 +715,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given stratum line
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -738,7 +738,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given pattern
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
@@ -760,7 +760,7 @@
 	/**
 	 * Returns if the given map of attributes matches the given target pattern
 	 * breakpoint
-	 * 
+	 *
 	 * @param attributes
 	 * @param breakpoint
 	 * @return true if the attributes match the breakpoints' attributes, false
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaClassPrepareBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaClassPrepareBreakpoint.java
index 67d2cfb..0fc8c5e 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaClassPrepareBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaClassPrepareBreakpoint.java
@@ -39,7 +39,7 @@
 
 /**
  * Class prepare breakpoint.
- * 
+ *
  * @since 3.0
  */
 public class JavaClassPrepareBreakpoint extends JavaBreakpoint implements
@@ -57,7 +57,7 @@
 
 	/**
 	 * Creates and returns a Java class prepare breakpoint for the given type.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -157,9 +157,9 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * Not supported for class prepare breakpoints.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * addInstanceFilter(com.sun.jdi.request.EventRequest,
 	 * com.sun.jdi.ObjectReference)
@@ -171,9 +171,9 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * This method not used for class prepare breakpoints.
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#newRequest
 	 * (org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget,
@@ -187,9 +187,9 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * Not supported for class prepare breakpoints.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * setRequestThreadFilter(com.sun.jdi.request.EventRequest,
 	 * com.sun.jdi.ThreadReference)
@@ -201,7 +201,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * handleClassPrepareEvent(com.sun.jdi.event.ClassPrepareEvent,
 	 * org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget)
@@ -226,7 +226,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * classPrepareComplete(com.sun.jdi.event.Event,
 	 * org.eclipse.jdt.internal.debug.core.model.JDIThread, boolean)
@@ -239,7 +239,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaClassPrepareBreakpoint#getMemberType()
 	 */
@@ -251,7 +251,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#supportsInstanceFilters()
 	 */
 	@Override
@@ -261,7 +261,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#addInstanceFilter(org.eclipse
 	 * .jdt.debug.core.IJavaObject)
@@ -276,7 +276,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaBreakpoint#setThreadFilter(org.eclipse
 	 * .jdt.debug.core.IJavaThread)
@@ -291,7 +291,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaBreakpoint#supportsThreadFilters()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaExceptionBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaExceptionBreakpoint.java
index 5a4ff4a..b82a9e4 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaExceptionBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaExceptionBreakpoint.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -65,14 +65,14 @@
 	 * <code>true</code>, an uncaught exception of the associated type will
 	 * cause execution to suspend.
 	 */
-	protected static final String UNCAUGHT = "org.eclipse.jdt.debug.core.uncaught"; //$NON-NLS-1$	
+	protected static final String UNCAUGHT = "org.eclipse.jdt.debug.core.uncaught"; //$NON-NLS-1$
 	/**
 	 * Exception breakpoint attribute storing the checked value (value
 	 * <code>"org.eclipse.jdt.debug.core.checked"</code>). This attribute is
 	 * stored as a <code>boolean</code>, indicating whether an exception is a
 	 * checked exception.
 	 */
-	protected static final String CHECKED = "org.eclipse.jdt.debug.core.checked"; //$NON-NLS-1$	
+	protected static final String CHECKED = "org.eclipse.jdt.debug.core.checked"; //$NON-NLS-1$
 
 	/**
 	 * Exception breakpoint attribute storing the String value (value
@@ -81,7 +81,7 @@
 	 * The filters are applied as inclusion or exclusion depending on
 	 * INCLUSIVE_FILTERS.
 	 */
-	protected static final String INCLUSION_FILTERS = "org.eclipse.jdt.debug.core.inclusion_filters"; //$NON-NLS-1$	
+	protected static final String INCLUSION_FILTERS = "org.eclipse.jdt.debug.core.inclusion_filters"; //$NON-NLS-1$
 
 	/**
 	 * Exception breakpoint attribute storing the String value (value
@@ -90,11 +90,11 @@
 	 * The filters are applied as inclusion or exclusion depending on
 	 * INCLUSIVE_FILTERS.
 	 */
-	protected static final String EXCLUSION_FILTERS = "org.eclipse.jdt.debug.core.exclusion_filters"; //$NON-NLS-1$	
+	protected static final String EXCLUSION_FILTERS = "org.eclipse.jdt.debug.core.exclusion_filters"; //$NON-NLS-1$
 	/**
 	 * Allows the user to specify whether we should suspend if subclasses of the
 	 * specified exception are thrown/caught
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	protected static final String SUSPEND_ON_SUBCLASSES = "org.eclipse.jdt.debug.core.suspend_on_subclasses"; //$NON-NLS-1$
@@ -126,7 +126,7 @@
 	 * type. Caught and uncaught specify where the exception should cause thread
 	 * suspensions - that is, in caught and/or uncaught locations. Checked
 	 * indicates if the given exception is a checked exception.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -214,7 +214,7 @@
 
 	/**
 	 * Enable this exception breakpoint.
-	 * 
+	 *
 	 * If the exception breakpoint is not catching caught or uncaught, turn both
 	 * modes on. If this isn't done, the resulting state (enabled with caught
 	 * and uncaught both disabled) is ambiguous.
@@ -269,7 +269,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint#setSuspendOnSubclasses
 	 * (boolean)
@@ -283,7 +283,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint#isSuspendOnSubclasses
 	 * ()
@@ -337,7 +337,7 @@
 	/**
 	 * @see JavaBreakpoint#handleBreakpointEvent(Event, JDIDebugTarget,
 	 *      JDIThread) Decides how to handle an exception being thrown
-	 * 
+	 *
 	 * @return true if we do not want to suspend false otherwise
 	 */
 	@Override
@@ -407,7 +407,7 @@
 					}
 				}
 			}
-			
+
 			return !suspend(thread, suspendVote);
 		}
 		return true;
@@ -416,7 +416,7 @@
 	/**
 	 * Returns whether the given class type is a subclass of the classes with the
 	 * given name.
-	 * 
+	 *
 	 * @param type
 	 *            the class type reference
 	 * @return true if the specified the class type is a subclass of the class
@@ -436,7 +436,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#setInstalledIn
 	 * (org.eclipse.jdt.debug.core.IJavaDebugTarget, boolean)
@@ -451,7 +451,7 @@
 	/**
 	 * Determines of the filters for this exception include the default package
 	 * or not
-	 * 
+	 *
 	 * @param filters
 	 *            the list of filters to inspect
 	 * @return true if any one of the specified filters include the default
@@ -468,7 +468,7 @@
 
 	/**
 	 * Returns whether the given type is in the given filter set.
-	 * 
+	 *
 	 * @param filters
 	 *            the filter set
 	 * @param typeName
@@ -497,7 +497,7 @@
 
 	/**
 	 * Sets the name of the exception that was last hit
-	 * 
+	 *
 	 * @param name
 	 *            fully qualified exception name
 	 */
@@ -507,7 +507,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint#getExceptionTypeName
 	 * ()
@@ -550,7 +550,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * configureRequest(com.sun.jdi.request.EventRequest,
 	 * org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget)
@@ -584,7 +584,7 @@
 		if (list == null) {
 			return ""; //$NON-NLS-1$
 		}
-		Set<String> set = new HashSet<String>(list.length);
+		Set<String> set = new HashSet<>(list.length);
 		StringBuffer buffer = new StringBuffer();
 		for (int i = 0; i < list.length; i++) {
 			if (i > 0 && i < list.length) {
@@ -607,7 +607,7 @@
 	 * Parses the comma separated String into an array of Strings
 	 */
 	protected String[] parseList(String listString) {
-		List<String> list = new ArrayList<String>(10);
+		List<String> list = new ArrayList<>(10);
 		StringTokenizer tokenizer = new StringTokenizer(listString, ","); //$NON-NLS-1$
 		while (tokenizer.hasMoreTokens()) {
 			String token = tokenizer.nextToken();
@@ -750,9 +750,9 @@
 
 	/**
 	 * Returns the last exception object that was encountered by this exception
-	 * 
+	 *
 	 * TODO: make API in future release.
-	 * 
+	 *
 	 * @return
 	 */
 	public IJavaObject getLastException() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
index b56ae2b..44b4e2c 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
@@ -95,25 +95,25 @@
 	/**
 	 * Maps suspended threads to the suspend event that suspended them
 	 */
-	private Map<IJavaThread, ICompiledExpression> fSuspendEvents = new HashMap<IJavaThread, ICompiledExpression>();
+	private Map<IJavaThread, ICompiledExpression> fSuspendEvents = new HashMap<>();
 	/**
 	 * The map of cached compiled expressions (ICompiledExpression) for this
 	 * breakpoint, keyed by thread. This value must be cleared every time the
 	 * breakpoint is added to a target.
 	 */
-	private Map<IJavaThread, ICompiledExpression> fCompiledExpressions = new HashMap<IJavaThread, ICompiledExpression>();
+	private Map<IJavaThread, ICompiledExpression> fCompiledExpressions = new HashMap<>();
 
 	/**
 	 * Cache of projects for stack frames to avoid repetitive project resolution
 	 * on conditional breakpoints.
 	 */
-	private Map<IJavaStackFrame, IJavaProject> fProjectsByFrame = new HashMap<IJavaStackFrame, IJavaProject>();
+	private Map<IJavaStackFrame, IJavaProject> fProjectsByFrame = new HashMap<>();
 
 	/**
 	 * The map of the result value of the condition (IValue) for this
 	 * breakpoint, keyed by debug target.
 	 */
-	private Map<IDebugTarget, IValue> fConditionValues = new HashMap<IDebugTarget, IValue>();
+	private Map<IDebugTarget, IValue> fConditionValues = new HashMap<>();
 
 	/**
 	 * Status code indicating that a request to create a breakpoint in a type
@@ -165,7 +165,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#addToTarget
 	 * (org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget)
@@ -178,7 +178,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * removeFromTarget
 	 * (org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget)
@@ -201,7 +201,7 @@
 
 	private void removeCachedThreads(Map<IJavaThread, ICompiledExpression> map, JDIDebugTarget target) {
 		Set<IJavaThread> threads = map.keySet();
-		List<IJavaThread> threadsToRemove = new ArrayList<IJavaThread>();
+		List<IJavaThread> threadsToRemove = new ArrayList<>();
 		Iterator<IJavaThread> iter = threads.iterator();
 		JDIThread thread;
 		while (iter.hasNext()) {
@@ -226,7 +226,7 @@
 		// clean up cached projects for stack frames
 		synchronized (fProjectsByFrame) {
 			Set<IJavaStackFrame> frames = fProjectsByFrame.keySet();
-			List<IJavaStackFrame> framesToRemove = new ArrayList<IJavaStackFrame>();
+			List<IJavaStackFrame> framesToRemove = new ArrayList<>();
 			Iterator<IJavaStackFrame> iter = frames.iterator();
 			JDIStackFrame frame;
 			while (iter.hasNext()) {
@@ -245,7 +245,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getLineNumber()
 	 */
 	@Override
@@ -255,7 +255,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getCharStart()
 	 */
 	@Override
@@ -265,7 +265,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getCharEnd()
 	 */
 	@Override
@@ -282,7 +282,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#newRequest
 	 * (org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget,
@@ -358,7 +358,7 @@
 			if (((type.modifiers() & (AccessibleImpl.MODIFIER_ACC_SYNTHETIC | AccessibleImpl.MODIFIER_SYNTHETIC)) != 0)||(type instanceof InterfaceType)) {
 				return null;
 			}
-			
+
 			IStatus status = new Status(
 					IStatus.ERROR,
 					JDIDebugPlugin.getUniqueIdentifier(),
@@ -399,7 +399,7 @@
 	 * <li>IMarker.CHAR_START</li>
 	 * <li>IMarker.CHAR_END</li>
 	 * </ol>
-	 * 
+	 *
 	 */
 	public void addLineBreakpointAttributes(Map<String, Object> attributes,
 			String modelIdentifier, boolean enabled, int lineNumber,
@@ -413,7 +413,7 @@
 
 	/**
 	 * Adds type name and hit count attributes to the given map.
-	 * 
+	 *
 	 * If <code>hitCount > 0</code>, adds the <code>HIT_COUNT</code> attribute
 	 * to the given breakpoint, and resets the <code>EXPIRED</code> attribute to
 	 * false (since, if the hit count is changed, the breakpoint should no
@@ -468,7 +468,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaLineBreakpoint#supportsCondition()
 	 */
 	@Override
@@ -478,7 +478,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaLineBreakpoint#getCondition()
 	 */
 	@Override
@@ -488,7 +488,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaLineBreakpoint#setCondition(java.lang
 	 * .String)
@@ -526,7 +526,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaLineBreakpoint#isConditionEnabled()
 	 */
 	@Override
@@ -536,7 +536,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaLineBreakpoint#setConditionEnabled(boolean
 	 * )
@@ -551,7 +551,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * cleanupForThreadTermination
 	 * (org.eclipse.jdt.internal.debug.core.model.JDIThread)
@@ -565,7 +565,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * addInstanceFilter(com.sun.jdi.request.EventRequest,
 	 * com.sun.jdi.ObjectReference)
@@ -580,7 +580,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaLineBreakpoint#isConditionSuspendOnTrue()
 	 */
@@ -591,7 +591,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaLineBreakpoint#setConditionSuspendOnTrue
 	 * (boolean)
@@ -610,7 +610,7 @@
 	/**
 	 * Returns existing compiled expression for the given thread or
 	 * <code>null</code>.
-	 * 
+	 *
 	 * @param thread
 	 *            thread the breakpoint was hit in
 	 * @return compiled expression or <code>null</code>
@@ -621,7 +621,7 @@
 
 	/**
 	 * Sets the compiled expression for a thread.
-	 * 
+	 *
 	 * @param thread
 	 *            thread the breakpoint was hit in
 	 * @param expression
@@ -636,7 +636,7 @@
 	 * Sets the current result value of the conditional expression evaluation
 	 * for this breakpoint in the given target, and returns the previous value
 	 * or <code>null</code> if none
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 * @param value
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodBreakpoint.java
index df30d52..7c25d2e 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodBreakpoint.java
@@ -57,7 +57,7 @@
 	 * is contained. (value <code>"org.eclipse.jdt.debug.core.methodName"</code>
 	 * ). This attribute is a <code>String</code>.
 	 */
-	protected static final String METHOD_NAME = "org.eclipse.jdt.debug.core.methodName"; //$NON-NLS-1$	
+	protected static final String METHOD_NAME = "org.eclipse.jdt.debug.core.methodName"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing the signature of the method in which a
@@ -65,21 +65,21 @@
 	 * <code>"org.eclipse.jdt.debug.core.methodSignature"</code>). This
 	 * attribute is a <code>String</code>.
 	 */
-	protected static final String METHOD_SIGNATURE = "org.eclipse.jdt.debug.core.methodSignature"; //$NON-NLS-1$	
+	protected static final String METHOD_SIGNATURE = "org.eclipse.jdt.debug.core.methodSignature"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing whether this breakpoint is an entry
 	 * breakpoint. (value <code>"org.eclipse.jdt.debug.core.entry"</code>). This
 	 * attribute is a <code>boolean</code>.
 	 */
-	protected static final String ENTRY = "org.eclipse.jdt.debug.core.entry"; //$NON-NLS-1$	
+	protected static final String ENTRY = "org.eclipse.jdt.debug.core.entry"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing whether this breakpoint is an exit
 	 * breakpoint. (value <code>"org.eclipse.jdt.debug.core.exit"</code>). This
 	 * attribute is a <code>boolean</code>.
 	 */
-	protected static final String EXIT = "org.eclipse.jdt.debug.core.exit"; //$NON-NLS-1$	
+	protected static final String EXIT = "org.eclipse.jdt.debug.core.exit"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing whether this breakpoint only applies to
@@ -118,7 +118,7 @@
 	 * <li>Method exit (value <code>EXIT_EVENT</code>)</li>
 	 * </ol>
 	 */
-	private Map<IDebugTarget, Integer> fLastEventTypes = new HashMap<IDebugTarget, Integer>(10);
+	private Map<IDebugTarget, Integer> fLastEventTypes = new HashMap<>(10);
 
 	/**
 	 * Used to match type names
@@ -192,7 +192,7 @@
 
 	/**
 	 * Returns a new method entry request for this breakpoint's criteria
-	 * 
+	 *
 	 * @param the
 	 *            target in which to create the request
 	 * @param type
@@ -210,7 +210,7 @@
 
 	/**
 	 * Returns a new method exit request for this breakpoint's criteria
-	 * 
+	 *
 	 * @param target
 	 *            the target in which to create the request
 	 * @param type
@@ -228,7 +228,7 @@
 
 	/**
 	 * Returns a new method entry request for this breakpoint's criteria
-	 * 
+	 *
 	 * @param the
 	 *            target in which to create the request
 	 * @param type
@@ -245,7 +245,7 @@
 
 	/**
 	 * Returns a new method exit request for the given reference type
-	 * 
+	 *
 	 * @param target
 	 *            the target in which to create the request
 	 * @param type
@@ -265,11 +265,11 @@
 	 *      ReferenceType) or
 	 *      JavaMethodBreakpoint#createMethodExitRequest(JDIDebugTarget,
 	 *      ReferenceType)
-	 * 
+	 *
 	 *      Returns a <code>MethodEntryRequest</code> or
 	 *      <code>BreakpointRequest</code> if entry is <code>true</code>, a
 	 *      <code>MethodExitRequest</code> if entry is <code>false</code>.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target in which to create the request
 	 * @param classFilter
@@ -533,7 +533,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaMethodEntryBreakpoint#getMethodName()
 	 */
@@ -544,7 +544,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaMethodEntryBreakpoint#getMethodSignature
 	 * ()
@@ -623,7 +623,7 @@
 
 	/**
 	 * Initialize cache of attributes
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IBreakpoint#setMarker(IMarker)
 	 */
 	@Override
@@ -646,7 +646,7 @@
 
 	/**
 	 * converts the specified string to one which has been formated to our needs
-	 * 
+	 *
 	 * @param stringMatcherPattern
 	 *            the initial pattern
 	 * @return the modified pattern
@@ -660,7 +660,7 @@
 
 	/**
 	 * If this breakpoint is not entry or exit enabled, set the default (entry)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IBreakpoint#setEnabled(boolean)
 	 */
 	@Override
@@ -689,7 +689,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaLineBreakpoint#supportsCondition()
 	 */
 	@Override
@@ -728,7 +728,7 @@
 
 	/**
 	 * Returns whether this breakpoint uses type name pattern matching.
-	 * 
+	 *
 	 * @return whether this breakpoint uses type name pattern matching
 	 */
 	protected boolean usesTypePattern() throws CoreException {
@@ -743,7 +743,7 @@
 	/**
 	 * Used when this breakpoint is for a specific type (i.e. not using type
 	 * name pattern matching).
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#createRequest(JDIDebugTarget,
 	 *      ReferenceType)
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodEntryBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodEntryBreakpoint.java
index 4d05a03..81b1d7f 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodEntryBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaMethodEntryBreakpoint.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -43,7 +43,7 @@
 	 * is contained. (value <code>"org.eclipse.jdt.debug.core.methodName"</code>
 	 * ). This attribute is a <code>String</code>.
 	 */
-	private static final String METHOD_NAME = "org.eclipse.jdt.debug.core.methodName"; //$NON-NLS-1$	
+	private static final String METHOD_NAME = "org.eclipse.jdt.debug.core.methodName"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing the signature of the method in which a
@@ -51,7 +51,7 @@
 	 * <code>"org.eclipse.jdt.debug.core.methodSignature"</code>). This
 	 * attribute is a <code>String</code>.
 	 */
-	private static final String METHOD_SIGNATURE = "org.eclipse.jdt.debug.core.methodSignature"; //$NON-NLS-1$	
+	private static final String METHOD_SIGNATURE = "org.eclipse.jdt.debug.core.methodSignature"; //$NON-NLS-1$
 
 	/**
 	 * Cache of method name attribute
@@ -132,7 +132,7 @@
 
 	/**
 	 * Initialize cache of attributes
-	 * 
+	 *
 	 * @see IBreakpoint#setMarker(IMarker)
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaPatternBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaPatternBreakpoint.java
index 105323c..c4d6976 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaPatternBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaPatternBreakpoint.java
@@ -42,7 +42,7 @@
 	 * <code>"org.eclipse.jdt.debug.core.pattern"</code>). This attribute is a
 	 * <code>String</code>.
 	 */
-	protected static final String PATTERN = "org.eclipse.jdt.debug.core.pattern"; //$NON-NLS-1$	
+	protected static final String PATTERN = "org.eclipse.jdt.debug.core.pattern"; //$NON-NLS-1$
 
 	public JavaPatternBreakpoint() {
 	}
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaStratumLineBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaStratumLineBreakpoint.java
index 9b45923..03807f3 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaStratumLineBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaStratumLineBreakpoint.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,7 +38,7 @@
 /**
  * A line breakpoint identified by its source file name and/or path, and stratum
  * that it is relative to.
- * 
+ *
  * @since 3.0
  */
 public class JavaStratumLineBreakpoint extends JavaLineBreakpoint implements
@@ -58,7 +58,7 @@
 	/**
 	 * Creates and returns a line breakpoint identified by its source file name
 	 * and/or path, and stratum that it is relative to.
-	 * 
+	 *
 	 * @param resource
 	 *            the resource on which to create the associated breakpoint
 	 *            marker
@@ -188,7 +188,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * installableReferenceType(com.sun.jdi.ReferenceType,
 	 * org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget)
@@ -350,7 +350,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint#getPattern()
 	 */
 	@Override
@@ -360,7 +360,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint#getSourceName()
 	 */
@@ -371,7 +371,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint#getStratum()
 	 */
 	@Override
@@ -381,7 +381,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint#getSourcePath()
 	 */
@@ -444,7 +444,7 @@
 		String patterns = getPattern();
 
 		// delimit by ","
-		fTypeNamePatterns = patterns.split(","); //$NON-NLS-1$  
+		fTypeNamePatterns = patterns.split(","); //$NON-NLS-1$
 		fSuffix = new String[fTypeNamePatterns.length];
 		fPrefix = new String[fTypeNamePatterns.length];
 		for (int i = 0; i < fTypeNamePatterns.length; i++) {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaTargetPatternBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaTargetPatternBreakpoint.java
index b9c002e..e6e470b 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaTargetPatternBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaTargetPatternBreakpoint.java
@@ -34,7 +34,7 @@
 public class JavaTargetPatternBreakpoint extends JavaLineBreakpoint implements
 		IJavaTargetPatternBreakpoint {
 
-	private static final String TARGET_PATTERN_BREAKPOINT = "org.eclipse.jdt.debug.javaTargetPatternBreakpointMarker"; //$NON-NLS-1$	
+	private static final String TARGET_PATTERN_BREAKPOINT = "org.eclipse.jdt.debug.javaTargetPatternBreakpointMarker"; //$NON-NLS-1$
 
 	/**
 	 * Table of targets to patterns
@@ -162,9 +162,9 @@
 				}
 				target.targetRequestFailed(
 						MessageFormat.format(
-								JDIDebugBreakpointMessages.JavaPatternBreakpoint_exception_source_name, 
-								e.toString(), 
-								type.name()), 
+								JDIDebugBreakpointMessages.JavaPatternBreakpoint_exception_source_name,
+								e.toString(),
+								type.name()),
 								e);
 				// execution will not reach this line, as
 				// #targetRequestFailed will throw an exception
@@ -235,7 +235,7 @@
 	public void setPattern(IJavaDebugTarget target, String pattern)
 			throws CoreException {
 		if (fPatterns == null) {
-			fPatterns = new HashMap<IJavaDebugTarget, String>(2);
+			fPatterns = new HashMap<>(2);
 		}
 		// if pattern is changing then remove and re-add
 		String oldPattern = getPattern(target);
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaWatchpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaWatchpoint.java
index 56bc2bd..bbf34a3 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaWatchpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaWatchpoint.java
@@ -62,7 +62,7 @@
 	 * is stored as a <code>boolean</code>, indicating whether a watchpoint is a
 	 * modification watchpoint.
 	 */
-	protected static final String MODIFICATION = "org.eclipse.jdt.debug.core.modification"; //$NON-NLS-1$	
+	protected static final String MODIFICATION = "org.eclipse.jdt.debug.core.modification"; //$NON-NLS-1$
 	/**
 	 * Watchpoint attribute storing the auto_disabled value (value
 	 * <code>"org.eclipse.jdt.debug.core.auto_disabled"</code>). This attribute
@@ -76,7 +76,7 @@
 	 * is set. (value <code>"org.eclipse.jdt.debug.core.fieldName"</code>). This
 	 * attribute is a <code>String</code>.
 	 */
-	protected static final String FIELD_NAME = "org.eclipse.jdt.debug.core.fieldName"; //$NON-NLS-1$		
+	protected static final String FIELD_NAME = "org.eclipse.jdt.debug.core.fieldName"; //$NON-NLS-1$
 	/**
 	 * Flag indicating that this breakpoint last suspended execution due to a
 	 * field access
@@ -95,7 +95,7 @@
 	 * <li>Field modification (value <code>MODIFICATION_EVENT</code>)</li>
 	 * </ol>
 	 */
-	private HashMap<JDIDebugTarget, Integer> fLastEventTypes = new HashMap<JDIDebugTarget, Integer>(10);
+	private HashMap<JDIDebugTarget, Integer> fLastEventTypes = new HashMap<>(10);
 
 	public JavaWatchpoint() {
 	}
@@ -135,7 +135,7 @@
 
 	/**
 	 * @see JavaBreakpoint#createRequest(JDIDebugTarget, ReferenceType)
-	 * 
+	 *
 	 *      Creates and installs an access and modification watchpoint request
 	 *      in the given reference type, configuring the requests as appropriate
 	 *      for this watchpoint. The requests are then enabled based on whether
@@ -187,7 +187,7 @@
 	/**
 	 * Either access or modification watchpoints are not supported. Throw an
 	 * appropriate exception.
-	 * 
+	 *
 	 * @param message
 	 *            the message that states that access or modification
 	 *            watchpoints are not supported
@@ -218,7 +218,7 @@
 
 	/**
 	 * Create a watchpoint for the given breakpoint and associated field.
-	 * 
+	 *
 	 * @param target
 	 *            the target in which the request will be installed
 	 * @param field
@@ -227,7 +227,7 @@
 	 *            <code>true</code> if an access watchpoint will be created.
 	 *            <code>false</code> if a modification watchpoint will be
 	 *            created.
-	 * 
+	 *
 	 * @return an WatchpointRequest (AccessWatchpointRequest if access is
 	 *         <code>true</code>; ModificationWatchpointRequest if access is
 	 *         <code>false</code>).
@@ -287,7 +287,7 @@
 
 	/**
 	 * @see IBreakpoint#setEnabled(boolean)
-	 * 
+	 *
 	 *      If the watchpoint is not watching access or modification, set the
 	 *      default values. If this isn't done, the resulting state (enabled
 	 *      with access and modification both disabled) is ambiguous.
@@ -315,7 +315,7 @@
 	 * field is accessed. If true and this watchpoint is disabled, this
 	 * watchpoint is automatically enabled. If both access and modification are
 	 * false, this watchpoint is automatically disabled.
-	 * 
+	 *
 	 * @param access
 	 *            whether to suspend on field access
 	 * @exception CoreException
@@ -350,7 +350,7 @@
 	 * field is modified. If true and this watchpoint is disabled, this
 	 * watchpoint is automatically enabled. If both access and modification are
 	 * false, this watchpoint is automatically disabled.
-	 * 
+	 *
 	 * @param modification
 	 *            whether to suspend on field modification
 	 * @exception CoreException
@@ -402,17 +402,17 @@
 	 * enabled</li>
 	 * </ul>
 	 * The default returned array is <code>{true, true}</code>
-	 * 
+	 *
 	 * @return an array of two boolean values representing the default access
 	 *         and modification settings
-	 * 
+	 *
 	 * @since 3.3.1
 	 */
 	protected boolean[] getDefaultAccessAndModificationValues() {
 		int value = Platform.getPreferencesService().getInt(
-				JDIDebugPlugin.getUniqueIdentifier(), 
-				JDIDebugPlugin.PREF_DEFAULT_WATCHPOINT_SUSPEND_POLICY, 
-				0, 
+				JDIDebugPlugin.getUniqueIdentifier(),
+				JDIDebugPlugin.PREF_DEFAULT_WATCHPOINT_SUSPEND_POLICY,
+				0,
 				null);
 		switch (value) {
 		case 0: {
@@ -467,7 +467,7 @@
 	 * superclass. This is useful for correctly generating the thread text when
 	 * asked (assumes thread text is requested after the event is passed to this
 	 * breakpoint.
-	 * 
+	 *
 	 * Also, @see JavaBreakpoint#handleEvent(Event, JDIDebugTarget)
 	 */
 	@Override
@@ -555,7 +555,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IWatchpoint#supportsAccess()
 	 */
 	@Override
@@ -565,7 +565,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IWatchpoint#supportsModification()
 	 */
 	@Override
@@ -575,7 +575,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint#
 	 * installableReferenceType(com.sun.jdi.ReferenceType,
 	 * org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget)
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ValidBreakpointLocationLocator.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ValidBreakpointLocationLocator.java
index 28c9c78..11f28bb 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ValidBreakpointLocationLocator.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/ValidBreakpointLocationLocator.java
@@ -159,7 +159,7 @@
 	 * breakpoint location. If this locator makes a pass of the tree and
 	 * determines that binding information would be helpful but was not
 	 * available, this method returns <code>true</code>.
-	 * 
+	 *
 	 * @return whether binding information would be helpful in validating a
 	 *         breakpoint location
 	 */
@@ -169,7 +169,7 @@
 
 	/**
 	 * Return the type of the valid location found
-	 * 
+	 *
 	 * @return one of LOCATION_NOT_FOUND, LOCATION_LINE, LOCATION_METHOD or
 	 *         LOCATION_FIELD
 	 */
@@ -207,7 +207,7 @@
 	 * <br>
 	 * Delegates to the old method of computing the type name if bindings are
 	 * not available.
-	 * 
+	 *
 	 * @see #computeTypeName0(ASTNode)
 	 * @since 3.6
 	 */
@@ -231,7 +231,7 @@
 
 	/**
 	 * Fall back to compute the type name if bindings are not resolved
-	 * 
+	 *
 	 * @param node
 	 * @return the computed type name
 	 */
@@ -268,7 +268,7 @@
 	/**
 	 * Return <code>true</code> if this node children may contain a valid
 	 * location for the breakpoint.
-	 * 
+	 *
 	 * @param node
 	 *            the node.
 	 * @param isCode
@@ -403,7 +403,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * AnnotationTypeDeclaration)
 	 */
@@ -420,7 +420,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * AnnotationTypeMemberDeclaration)
 	 */
@@ -536,7 +536,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * BlockComment)
 	 */
@@ -643,7 +643,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnhancedForStatement)
 	 */
@@ -658,7 +658,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnumConstantDeclaration)
 	 */
@@ -679,7 +679,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * EnumDeclaration)
 	 */
@@ -780,7 +780,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ForStatement)
 	 */
@@ -911,7 +911,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom
 	 * .LabeledStatement)
@@ -931,7 +931,7 @@
 
 	private void nestLabel(String label) {
 		if (fLabels == null) {
-			fLabels = new ArrayList<String>();
+			fLabels = new ArrayList<>();
 		}
 		fLabels.add(label);
 	}
@@ -945,7 +945,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * LineComment)
 	 */
@@ -956,7 +956,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MarkerAnnotation)
 	 */
@@ -967,7 +967,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MemberRef
 	 * )
@@ -979,7 +979,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MemberValuePair)
 	 */
@@ -1028,7 +1028,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodRef
 	 * )
@@ -1040,7 +1040,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MethodRefParameter)
 	 */
@@ -1051,7 +1051,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Modifier
 	 * )
@@ -1063,7 +1063,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * NormalAnnotation)
 	 */
@@ -1098,7 +1098,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * ParameterizedType)
 	 */
@@ -1160,7 +1160,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * QualifiedType)
 	 */
@@ -1196,7 +1196,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * SingleMemberAnnotation)
 	 */
@@ -1271,7 +1271,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TagElement
 	 * )
@@ -1283,7 +1283,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * TextElement)
 	 */
@@ -1318,7 +1318,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.UnionType
 	 * )
@@ -1353,7 +1353,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * TypeParameter)
 	 */
@@ -1420,7 +1420,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * WildcardType)
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/CompilationUnitDelta.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/CompilationUnitDelta.java
index 95dc262..bdf9089 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/CompilationUnitDelta.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/CompilationUnitDelta.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Yevgen Kogan - Bug 403475 - Hot Code Replace drops too much frames in some cases
@@ -172,7 +172,7 @@
 
 	/**
 	 * Returns an AST matcher
-	 * 
+	 *
 	 * @return AST matcher
 	 */
 	private ASTMatcher getMatcher() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
index 27facfb..c1b48cd 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
@@ -104,8 +104,8 @@
 	/**
 	 * The lists of hot swap targets which support HCR and those which don't
 	 */
-	private ArrayList<JDIDebugTarget> fHotSwapTargets = new ArrayList<JDIDebugTarget>(1);
-	private ArrayList<JDIDebugTarget> fNoHotSwapTargets = new ArrayList<JDIDebugTarget>(1);
+	private ArrayList<JDIDebugTarget> fHotSwapTargets = new ArrayList<>(1);
+	private ArrayList<JDIDebugTarget> fNoHotSwapTargets = new ArrayList<>(1);
 
 	/**
 	 * A mapping of the last time projects were built.
@@ -114,13 +114,13 @@
 	 * <li>value: build date (ProjectBuildTime)</li>
 	 * </ol>
 	 */
-	private Map<IProject, ProjectBuildTime> fProjectBuildTimes = new HashMap<IProject, ProjectBuildTime>();
+	private Map<IProject, ProjectBuildTime> fProjectBuildTimes = new HashMap<>();
 	private static Date fStartupDate = new Date();
 
 	/**
 	 * Cache of compilation unit deltas renewed on each HCR attempt.
 	 */
-	private Map<ICompilationUnit, CompilationUnitDelta> fDeltaCache = new HashMap<ICompilationUnit, CompilationUnitDelta>();
+	private Map<ICompilationUnit, CompilationUnitDelta> fDeltaCache = new HashMap<>();
 
 	/**
 	 * Utility object used for tracking build times of projects. The HCR manager
@@ -259,7 +259,7 @@
 		}
 		Object source = event.getSource();
 		if (source instanceof IProject) {
-			List<IProject> list = new ArrayList<IProject>();
+			List<IProject> list = new ArrayList<>();
 			list.add((IProject) source);
 			return list;
 		} else if (source instanceof IWorkspace) {
@@ -335,7 +335,7 @@
 	 * names if there is no type corresponding type loaded in the given debug
 	 * target. This method allows us to avoid bogus HCR attempts and
 	 * "HCR failed" notifications.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target
 	 * @param resources
@@ -377,8 +377,8 @@
 				// Make a local copy of the resources/names to swap so we can
 				// filter
 				// unloaded types on a per-target basis.
-				List<IResource> resourcesToReplace = new ArrayList<IResource>(resources);
-				List<String> qualifiedNamesToReplace = new ArrayList<String>(qualifiedNames);
+				List<IResource> resourcesToReplace = new ArrayList<>(resources);
+				List<String> qualifiedNamesToReplace = new ArrayList<>(qualifiedNames);
 				filterUnloadedTypes(target, resourcesToReplace,
 						qualifiedNamesToReplace);
 
@@ -407,7 +407,7 @@
 	 * replace.
 	 */
 	protected synchronized List<JDIDebugTarget> getHotSwapTargets() {
-		return new ArrayList<JDIDebugTarget>(fHotSwapTargets);
+		return new ArrayList<>(fHotSwapTargets);
 	}
 
 	/**
@@ -415,7 +415,7 @@
 	 * code replace.
 	 */
 	protected synchronized List<JDIDebugTarget> getNoHotSwapTargets() {
-		return new ArrayList<JDIDebugTarget>(fNoHotSwapTargets);
+		return new ArrayList<>(fNoHotSwapTargets);
 	}
 
 	/**
@@ -436,7 +436,7 @@
 	 * reloading the given resources and then performing a step-into operation
 	 * on all threads which were affected by the class redefinition.</li>
 	 * </ol>
-	 * 
+	 *
 	 * @param targets
 	 *            the targets in which to perform HCR
 	 * @param resources
@@ -447,9 +447,9 @@
 
 		// Check whether hot code replace is enabled
 		if (!Platform.getPreferencesService().getBoolean(
-				JDIDebugPlugin.getUniqueIdentifier(), 
-				JDIDebugPlugin.PREF_ENABLE_HCR, 
-				true, 
+				JDIDebugPlugin.getUniqueIdentifier(),
+				JDIDebugPlugin.PREF_ENABLE_HCR,
+				true,
 				null)) {
 			return; // disabled
 		}
@@ -467,8 +467,8 @@
 			}
 			// Make a local copy of the resources/names to swap so we can filter
 			// unloaded types on a per-target basis.
-			List<IResource> resourcesToReplace = new ArrayList<IResource>(resources);
-			List<String> qualifiedNamesToReplace = new ArrayList<String>(qualifiedNames);
+			List<IResource> resourcesToReplace = new ArrayList<>(resources);
+			List<String> qualifiedNamesToReplace = new ArrayList<>(qualifiedNames);
 			filterUnloadedTypes(target, resourcesToReplace,
 					qualifiedNamesToReplace);
 			if (qualifiedNamesToReplace.isEmpty()) {
@@ -476,7 +476,7 @@
 				continue;
 			}
 
-			List<IThread> poppedThreads = new ArrayList<IThread>();
+			List<IThread> poppedThreads = new ArrayList<>();
 			target.setIsPerformingHotCodeReplace(true);
 			try {
 				boolean framesPopped = false;
@@ -556,9 +556,9 @@
 	/**
 	 * Replaces the given types in the given J9 debug target. A fully qualified
 	 * name of each type must be supplied.
-	 * 
+	 *
 	 * Breakpoints are reinstalled automatically when the new types are loaded.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
 	 *                <ul>
@@ -587,7 +587,7 @@
 				result = vm.classesHaveChanged(typeNames);
 			} catch (RuntimeException e) {
 				target.targetRequestFailed(
-						MessageFormat.format(JDIDebugHCRMessages.JavaHotCodeReplaceManager_exception_replacing_types, e.toString()), 
+						MessageFormat.format(JDIDebugHCRMessages.JavaHotCodeReplaceManager_exception_replacing_types, e.toString()),
 						e);
 			}
 			switch (result) {
@@ -613,7 +613,7 @@
 
 	/**
 	 * Replaces the given types in the given JDK-compliant debug target.
-	 * 
+	 *
 	 * This method is to be used for JDK hot code replace.
 	 */
 	private void redefineTypesJDK(JDIDebugTarget target, List<IResource> resources,
@@ -638,7 +638,7 @@
 							qualifiedNames,
 							MessageFormat.format(
 									JDIDebugHCRMessages.JavaHotCodeReplaceManager_hcr_unsupported_operation,
-									detail), 
+									detail),
 							exception);
 				} else {
 					redefineTypesFailedJDK(
@@ -692,7 +692,7 @@
 
 	/**
 	 * Error handling for JDK hot code replace.
-	 * 
+	 *
 	 * The given exception occurred when redefinition was attempted for the
 	 * given types.
 	 */
@@ -706,7 +706,7 @@
 	/**
 	 * Returns a mapping of class files to the bytes that make up those class
 	 * files.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target to query
 	 * @param resources
@@ -720,7 +720,7 @@
 	 */
 	private Map<ReferenceType, byte[]> getTypesToBytes(JDIDebugTarget target, List<IResource> resources,
 			List<String> qualifiedNames) {
-		Map<ReferenceType, byte[]> typesToBytes = new HashMap<ReferenceType, byte[]>(resources.size());
+		Map<ReferenceType, byte[]> typesToBytes = new HashMap<>(resources.size());
 		Iterator<IResource> resourceIter = resources.iterator();
 		Iterator<String> nameIter = qualifiedNames.iterator();
 		IResource resource;
@@ -746,7 +746,7 @@
 	 * Return the listeners to notify for the given target. Target specific
 	 * listeners take precedence over generic listeners registered with the
 	 * debug model plug-in.
-	 * 
+	 *
 	 * @param target
 	 *            Java debug target
 	 * @return hot code replace listeners
@@ -796,7 +796,7 @@
 	/**
 	 * Looks for the deepest affected stack frame in the stack and forces a drop
 	 * to frame. Does this for all of the active stack frames in the target.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target in which frames are to be dropped
 	 * @param replacedClassNames
@@ -827,7 +827,7 @@
 	/**
 	 * Looks for the deepest affected stack frame in the stack and forces a drop
 	 * to frame. Does this for all of the active stack frames in the target.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target in which frames are to be dropped
 	 * @param replacedClassNames
@@ -885,7 +885,7 @@
 			List<String> replacedClassNames) throws DebugException {
 		JDIThread thread = null;
 		JDIStackFrame affectedFrame = null;
-		List<JDIStackFrame> popFrames = new ArrayList<JDIStackFrame>();
+		List<JDIStackFrame> popFrames = new ArrayList<>();
 		int numThreads = threads.length;
 		IResource[] resources = new IResource[resourceList.size()];
 		resourceList.toArray(resources);
@@ -947,10 +947,10 @@
 								.getProject();
 						delta = getDelta(compilationUnit,
 								getLastProjectBuildTime(project));
-						
+
 						String typeName = frame.getDeclaringTypeName();
 						typeName = typeName.replace('$', '.');
-						
+
 						if (!delta.hasChanged(typeName, frame.getName(),
 								frame.getSignature())) {
 							continue;
@@ -983,7 +983,7 @@
 
 	/**
 	 * Returns the delta object for the given compilation unit
-	 * 
+	 *
 	 * @param cu
 	 *            compilation unit
 	 * @param time
@@ -1197,9 +1197,9 @@
 								boolean hasBlockingErrors = false;
 								try {
 									if (!Platform.getPreferencesService().getBoolean(
-											JDIDebugPlugin.getUniqueIdentifier(), 
-											JDIDebugModel.PREF_HCR_WITH_COMPILATION_ERRORS, 
-											true, 
+											JDIDebugPlugin.getUniqueIdentifier(),
+											JDIDebugModel.PREF_HCR_WITH_COMPILATION_ERRORS,
+											true,
 											null)) {
 										// If the user doesn't want to replace
 										// classfiles containing
@@ -1259,8 +1259,8 @@
 		 * Resets the file collection to empty
 		 */
 		public void reset() {
-			fFiles = new ArrayList<IResource>();
-			fNames = new ArrayList<String>();
+			fFiles = new ArrayList<>();
+			fNames = new ArrayList<>();
 		}
 
 		/**
@@ -1273,7 +1273,7 @@
 		/**
 		 * Returns a collection of qualified type names corresponding to the
 		 * changed class files.
-		 * 
+		 *
 		 * @return List
 		 */
 		public List<String> getQualifiedNamesList() {
@@ -1283,7 +1283,7 @@
 		/**
 		 * Returns the source file associated with the given type, or
 		 * <code>null</code> if no source file could be found.
-		 * 
+		 *
 		 * @param project
 		 *            the java project containing the classfile
 		 * @param qualifiedName
@@ -1355,7 +1355,7 @@
 	/**
 	 * Begin listening for resource changes when a launch is registered with a
 	 * hot swap-able target.
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
 	 */
 	@Override
@@ -1384,7 +1384,7 @@
 	/**
 	 * Begin listening for resource changes when a launch is registered with a
 	 * hot swap-able target.
-	 * 
+	 *
 	 * @see ILaunchListener#launchChanged(ILaunch)
 	 */
 	@Override
@@ -1394,7 +1394,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse
 	 * .debug.core.DebugEvent[])
@@ -1442,7 +1442,7 @@
 	/**
 	 * Adds the given target to the list of hot-swap-able targets. Has no effect
 	 * if the target is already registered.
-	 * 
+	 *
 	 * @param target
 	 *            a target that supports hot swap
 	 */
@@ -1455,7 +1455,7 @@
 	/**
 	 * Adds the given target to the list of non hot-swap-able targets. Has no
 	 * effect if the target is already registered.
-	 * 
+	 *
 	 * @param target
 	 *            a target that does not support hot swap
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/MethodSearchVisitor.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/MethodSearchVisitor.java
index 05e7c99..cd0821e 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/MethodSearchVisitor.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/MethodSearchVisitor.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Yevgen Kogan - Bug 403475 - Hot Code Replace drops too much frames in some cases
@@ -125,7 +125,7 @@
 
 	/**
 	 * Sets the signature of the method to search for
-	 * 
+	 *
 	 * @param methodName
 	 *            name of method to search for
 	 * @param methodSignature
@@ -147,7 +147,7 @@
 
 	/**
 	 * Returns the search result, or <code>null</code> if none
-	 * 
+	 *
 	 * @return matching method declartion or <code>null</code>
 	 */
 	public MethodDeclaration getMatch() {
@@ -156,7 +156,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.
 	 * MethodDeclaration)
 	 */
@@ -206,7 +206,7 @@
 
 	/**
 	 * Returns whether this visitor is still searching for a match.
-	 * 
+	 *
 	 * @return whether this visitor is still searching for a match
 	 */
 	private boolean isSearching() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/IJavaStructuresListener.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/IJavaStructuresListener.java
index 2e5cab8..865b974 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/IJavaStructuresListener.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/IJavaStructuresListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIAllInstancesValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIAllInstancesValue.java
index 2fb46ee..f9506a0 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIAllInstancesValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIAllInstancesValue.java
@@ -29,7 +29,7 @@
 /**
  * Java value containing an array of java objects. This value is used to hold a
  * list of all instances of a specific java type.
- * 
+ *
  * @since 3.3
  * @see org.eclipse.jdt.internal.debug.ui.heapwalking.AllInstancesActionDelegate
  */
@@ -43,7 +43,7 @@
 	/**
 	 * Constructor, specifies whether there are more instances available than
 	 * should be displayed according to the user's preference settings.
-	 * 
+	 *
 	 * @param target
 	 *            the target VM
 	 * @param root
@@ -67,7 +67,7 @@
 	protected IJavaObject[] getInstances() {
 		if (fInstances != null) {
 			return fInstances;
-		} 
+		}
 		IJavaObject[] instances = new IJavaObject[0];
 		fIsMoreThanPreference = false;
 		if (fRoot != null) {
@@ -95,7 +95,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getLength()
 	 */
 	@Override
@@ -105,7 +105,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getSize()
 	 */
 	@Override
@@ -115,7 +115,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getValue(int)
 	 */
@@ -129,7 +129,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getValues()
 	 */
 	@Override
@@ -139,7 +139,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getVariable(int)
 	 */
@@ -160,7 +160,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getVariables(int,
 	 * int)
@@ -183,7 +183,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getVariables()
 	 */
 	@Override
@@ -193,7 +193,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getReferringObjects
 	 * (long)
@@ -205,7 +205,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#isAllocated()
 	 */
 	@Override
@@ -215,7 +215,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#getInitialOffset
 	 * ()
@@ -227,7 +227,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIArrayValue#hasVariables()
 	 */
@@ -238,7 +238,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getJavaType()
 	 */
 	@Override
@@ -248,7 +248,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getSignature()
 	 */
 	@Override
@@ -258,7 +258,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getReferenceTypeName
 	 * ()
@@ -270,7 +270,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getValueString()
 	 */
 	@Override
@@ -290,7 +290,7 @@
 	/**
 	 * Returns a string representation of this value intended to be displayed in
 	 * the detail pane of views. Lists the references on separate lines.
-	 * 
+	 *
 	 * @return a string representation of this value to display in the detail
 	 *         pane
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIPlaceholderVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIPlaceholderVariable.java
index 6f10c53..78b298c 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIPlaceholderVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JDIPlaceholderVariable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,7 +24,7 @@
  * Encapsulates a name and a value. Used when a variable is required (such as
  * for the VariablesView), but we only have a value available (such as the
  * result of an evaluation for an object browser).
- * 
+ *
  * @since 3.0
  */
 public class JDIPlaceholderVariable extends PlatformObject implements
@@ -37,7 +37,7 @@
 	 * When created for a logical structure we hold onto the original
 	 * non-logical value for purposes of equality. This way a logical
 	 * structure's children remain more stable in the variables view.
-	 * 
+	 *
 	 * This is <code>null</code> when not created for a logical structure.
 	 */
 	private IJavaValue fLogicalParent;
@@ -50,7 +50,7 @@
 	/**
 	 * Constructs a place holder with the given name and value originating from
 	 * the specified logical parent.
-	 * 
+	 *
 	 * @param name
 	 *            variable name
 	 * @param value
@@ -67,7 +67,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getSignature()
 	 */
 	@Override
@@ -77,7 +77,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getGenericSignature()
 	 */
 	@Override
@@ -87,7 +87,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getJavaType()
 	 */
 	@Override
@@ -97,7 +97,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#isLocal()
 	 */
 	@Override
@@ -107,7 +107,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IVariable#getValue()
 	 */
 	@Override
@@ -117,7 +117,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IVariable#getName()
 	 */
 	@Override
@@ -127,7 +127,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
 	 */
 	@Override
@@ -137,7 +137,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
 	 */
 	@Override
@@ -147,7 +147,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isPublic()
 	 */
 	@Override
@@ -157,7 +157,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isPrivate()
 	 */
 	@Override
@@ -167,7 +167,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isProtected()
 	 */
 	@Override
@@ -177,7 +177,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isPackagePrivate()
 	 */
 	@Override
@@ -187,7 +187,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isFinal()
 	 */
 	@Override
@@ -197,7 +197,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isStatic()
 	 */
 	@Override
@@ -207,7 +207,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaModifiers#isSynthetic()
 	 */
 	@Override
@@ -217,7 +217,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
 	 */
 	@Override
@@ -227,7 +227,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
 	 */
 	@Override
@@ -237,7 +237,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
 	 */
 	@Override
@@ -247,7 +247,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String
 	 * )
@@ -258,7 +258,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.
 	 * debug.core.model.IValue)
@@ -269,7 +269,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#supportsValueModification
 	 * ()
@@ -281,7 +281,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang
 	 * .String)
@@ -293,7 +293,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse
 	 * .debug.core.model.IValue)
@@ -305,7 +305,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
 	 */
 	@Override
@@ -320,7 +320,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
@@ -330,7 +330,7 @@
 			if (fLogicalParent != null) {
 				return var.getName().equals(getName())
 						&& fLogicalParent.equals(var.fLogicalParent);
-			} 
+			}
 			return var.getName().equals(getName())
 					&& var.getValue().equals(getValue());
 		}
@@ -339,7 +339,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#hashCode()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java
index f641004..2bbb232 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java
@@ -88,7 +88,7 @@
 
 		/**
 		 * Constructor
-		 * 
+		 *
 		 * @param value
 		 * @param type
 		 * @param thread
@@ -104,7 +104,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.debug.eval.IEvaluationListener#evaluationComplete
 		 * (org.eclipse.jdt.debug.eval.IEvaluationResult)
@@ -120,7 +120,7 @@
 		/**
 		 * Evaluates the specified snippet and returns the
 		 * <code>IJavaValue</code> from the evaluation
-		 * 
+		 *
 		 * @param snippet
 		 *            the snippet to evaluate
 		 * @return the <code>IJavaValue</code> from the evaluation
@@ -327,7 +327,7 @@
 	/**
 	 * Returns the <code>IJavaReferenceType</code> from the specified
 	 * <code>IJavaObject</code>
-	 * 
+	 *
 	 * @param value
 	 * @return the <code>IJavaReferenceType</code> from the specified
 	 *         <code>IJavaObject</code>
@@ -372,7 +372,7 @@
 	/**
 	 * Return the current stack frame context, or a valid stack frame for the
 	 * given value.
-	 * 
+	 *
 	 * @param value
 	 * @return the current stack frame context, or a valid stack frame for the
 	 *         given value.
@@ -404,7 +404,7 @@
 
 	/**
 	 * Returns the singleton stackframe provider
-	 * 
+	 *
 	 * @return the singleton stackframe provider
 	 */
 	private static IStatusHandler getStackFrameProvider() {
@@ -417,7 +417,7 @@
 
 	/**
 	 * Returns if this logical structure should be used for subtypes too.
-	 * 
+	 *
 	 * @return if this logical structure should be used for subtypes too.
 	 */
 	public boolean isSubtypes() {
@@ -426,7 +426,7 @@
 
 	/**
 	 * Sets if this logical structure should be used for subtypes or not.
-	 * 
+	 *
 	 * @param subtypes
 	 */
 	public void setSubtypes(boolean subtypes) {
@@ -435,7 +435,7 @@
 
 	/**
 	 * Returns the name of the type this logical structure should be used for.
-	 * 
+	 *
 	 * @return the name of the type this logical structure should be used for.
 	 */
 	public String getQualifiedTypeName() {
@@ -444,7 +444,7 @@
 
 	/**
 	 * Sets the name of the type this logical structure should be used for.
-	 * 
+	 *
 	 * @param type
 	 */
 	public void setType(String type) {
@@ -453,7 +453,7 @@
 
 	/**
 	 * Returns the code snippet to use to generate the logical structure.
-	 * 
+	 *
 	 * @return the code snippet to use to generate the logical structure.
 	 */
 	public String getValue() {
@@ -462,7 +462,7 @@
 
 	/**
 	 * Sets the code snippet to use to generate the logical structure.
-	 * 
+	 *
 	 * @param value
 	 */
 	public void setValue(String value) {
@@ -471,7 +471,7 @@
 
 	/**
 	 * Returns the variables of this logical structure.
-	 * 
+	 *
 	 * @return the variables of this logical structure.
 	 */
 	public String[][] getVariables() {
@@ -480,7 +480,7 @@
 
 	/**
 	 * Sets the variables of this logical structure.
-	 * 
+	 *
 	 * @param variables
 	 */
 	public void setVariables(String[][] variables) {
@@ -489,7 +489,7 @@
 
 	/**
 	 * Set the description of this logical structure.
-	 * 
+	 *
 	 * @param description
 	 */
 	public void setDescription(String description) {
@@ -498,7 +498,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.ILogicalStructureTypeDelegate2#getDescription
 	 * (org.eclipse.debug.core.model.IValue)
@@ -510,7 +510,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.ILogicalStructureType#getDescription()
 	 */
 	@Override
@@ -521,7 +521,7 @@
 	/**
 	 * Indicates if this logical structure was contributed by a plug-in or
 	 * defined by a user.
-	 * 
+	 *
 	 * @return if this logical structure is contributed
 	 */
 	public boolean isContributed() {
@@ -532,7 +532,7 @@
 	 * Returns the plugin identifier of the plugin which contributed this
 	 * logical structure or <code>null</code> if this structure was defined by
 	 * the user.
-	 * 
+	 *
 	 * @return the plugin identifier of the plugin which contributed this
 	 *         structure or <code>null</code>
 	 */
@@ -542,7 +542,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.ILogicalStructureType#getId()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructures.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructures.java
index b2989b9..772369a 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructures.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructures.java
@@ -64,11 +64,11 @@
 	/**
 	 * The list of java logical structures listeners.
 	 */
-	private static Set<IJavaStructuresListener> fListeners = new HashSet<IJavaStructuresListener>();
+	private static Set<IJavaStructuresListener> fListeners = new HashSet<>();
 
 	/**
 	 * Preference key for the list of user defined Java logical structures
-	 * 
+	 *
 	 * @since 3.1
 	 */
 	private static final String PREF_JAVA_LOGICAL_STRUCTURES = JDIDebugModel
@@ -109,7 +109,7 @@
 	}
 
 	private static void initJavaLogicalStructureMap() {
-		fJavaLogicalStructureMap = new HashMap<String, List<JavaLogicalStructure>>();
+		fJavaLogicalStructureMap = new HashMap<>();
 		addAllLogicalStructures(fPluginContributedJavaLogicalStructures);
 		addAllLogicalStructures(fUserDefinedJavaLogicalStructures);
 	}
@@ -132,7 +132,7 @@
 		String typeName = structure.getQualifiedTypeName();
 		List<JavaLogicalStructure> logicalStructure = fJavaLogicalStructureMap.get(typeName);
 		if (logicalStructure == null) {
-			logicalStructure = new ArrayList<JavaLogicalStructure>();
+			logicalStructure = new ArrayList<>();
 			fJavaLogicalStructureMap.put(typeName, logicalStructure);
 		}
 		logicalStructure.add(structure);
@@ -142,7 +142,7 @@
 	 * Get the configuration elements for the extension point.
 	 */
 	private static void initPluginContributedJavaLogicalStructure() {
-		fPluginContributedJavaLogicalStructures = new ArrayList<JavaLogicalStructure>();
+		fPluginContributedJavaLogicalStructures = new ArrayList<>();
 		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
 				.getExtensionPoint(JDIDebugPlugin.getUniqueIdentifier(),
 						JDIDebugPlugin.EXTENSION_POINT_JAVA_LOGICAL_STRUCTURES);
@@ -163,10 +163,10 @@
 	 * Get the user defined logical structures (from the preference store).
 	 */
 	private static void initUserDefinedJavaLogicalStructures() {
-		fUserDefinedJavaLogicalStructures = new ArrayList<JavaLogicalStructure>();
+		fUserDefinedJavaLogicalStructures = new ArrayList<>();
 		String logicalStructuresString = Platform.getPreferencesService().getString(
-				JDIDebugPlugin.getUniqueIdentifier(), 
-				PREF_JAVA_LOGICAL_STRUCTURES, 
+				JDIDebugPlugin.getUniqueIdentifier(),
+				PREF_JAVA_LOGICAL_STRUCTURES,
 				"",  //$NON-NLS-1$
 				null);
 		StringTokenizer tokenizer = new StringTokenizer(
@@ -280,7 +280,7 @@
 			return new ILogicalStructureType[0];
 		}
 		IJavaObject javaValue = (IJavaObject) value;
-		List<JavaLogicalStructure> logicalStructures = new ArrayList<JavaLogicalStructure>();
+		List<JavaLogicalStructure> logicalStructures = new ArrayList<>();
 		try {
 			IJavaType type = javaValue.getJavaType();
 			if (!(type instanceof IJavaClassType)) {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaStructureErrorValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaStructureErrorValue.java
index d59d746..47a091b 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaStructureErrorValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaStructureErrorValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,7 +19,7 @@
 import org.eclipse.jdt.debug.core.JDIDebugModel;
 
 /**
- * 
+ *
  */
 public class JavaStructureErrorValue implements IJavaValue {
 
@@ -39,7 +39,7 @@
 	/**
 	 * Returns this error node's parent value. This is the value for which a
 	 * logical structure could not be calculated.
-	 * 
+	 *
 	 * @return the parent value of this error node
 	 */
 	public IJavaValue getParentValue() {
@@ -48,7 +48,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getSignature()
 	 */
 	@Override
@@ -58,7 +58,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getGenericSignature()
 	 */
 	@Override
@@ -68,7 +68,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getJavaType()
 	 */
 	@Override
@@ -78,7 +78,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
 	 */
 	@Override
@@ -88,7 +88,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#getValueString()
 	 */
 	@Override
@@ -98,7 +98,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
 	 */
 	@Override
@@ -108,7 +108,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#getVariables()
 	 */
 	@Override
@@ -131,7 +131,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
 	 */
 	@Override
@@ -141,7 +141,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
 	 */
 	@Override
@@ -151,7 +151,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
 	 */
 	@Override
@@ -161,7 +161,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
 	 */
 	@Override
@@ -171,7 +171,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
 	 */
 	@Override
@@ -181,7 +181,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#isNull()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalObjectStructureValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalObjectStructureValue.java
index 118ad63..5158f90 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalObjectStructureValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalObjectStructureValue.java
@@ -32,7 +32,7 @@
 	/**
 	 * Constructs a proxy to the given object, with the given variables as
 	 * children.
-	 * 
+	 *
 	 * @param object
 	 *            original object
 	 * @param variables
@@ -46,7 +46,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#sendMessage(java.lang.String,
 	 * java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
 	 * org.eclipse.jdt.debug.core.IJavaThread, boolean)
@@ -61,7 +61,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#sendMessage(java.lang.String,
 	 * java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
 	 * org.eclipse.jdt.debug.core.IJavaThread, java.lang.String)
@@ -76,7 +76,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getField(java.lang.String,
 	 * boolean)
 	 */
@@ -88,7 +88,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getField(java.lang.String,
 	 * java.lang.String)
 	 */
@@ -100,7 +100,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getSignature()
 	 */
 	@Override
@@ -110,7 +110,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getGenericSignature()
 	 */
 	@Override
@@ -120,7 +120,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getJavaType()
 	 */
 	@Override
@@ -130,7 +130,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
 	 */
 	@Override
@@ -140,7 +140,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#getValueString()
 	 */
 	@Override
@@ -150,7 +150,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
 	 */
 	@Override
@@ -160,7 +160,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#getVariables()
 	 */
 	@Override
@@ -170,7 +170,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
 	 */
 	@Override
@@ -180,7 +180,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
 	 */
 	@Override
@@ -190,7 +190,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
 	 */
 	@Override
@@ -200,7 +200,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
 	 */
 	@Override
@@ -210,7 +210,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
 	 */
 	@Override
@@ -220,7 +220,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getWaitingThreads()
 	 */
 	@Override
@@ -230,7 +230,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getOwningThread()
 	 */
 	@Override
@@ -240,7 +240,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getReferringObjects(long)
 	 */
 	@Override
@@ -250,7 +250,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#disableCollection()
 	 */
 	@Override
@@ -260,7 +260,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#enableCollection()
 	 */
 	@Override
@@ -270,7 +270,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getUniqueId()
 	 */
 	@Override
@@ -280,7 +280,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#isNull()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalStructuresMessages.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalStructuresMessages.java
index 33f02f6..04a948b 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalStructuresMessages.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/LogicalStructuresMessages.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *  IBM - Initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/ITimeoutListener.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/ITimeoutListener.java
index 840dccf..f7de799 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/ITimeoutListener.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/ITimeoutListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -12,7 +12,7 @@
 
 /**
  * A timeout listener is notified when a timer expires.
- * 
+ *
  * @see Timer
  */
 public interface ITimeoutListener {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayEntryVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayEntryVariable.java
index 7b391ea..b9eb162 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayEntryVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayEntryVariable.java
@@ -51,14 +51,14 @@
 	 * When created for a logical structure we hold onto the original
 	 * non-logical object for purposes of equality. This way a logical
 	 * structure's children remain more stable in the variables view.
-	 * 
+	 *
 	 * This is <code>null</code> when not created for a logical structure.
 	 */
 	private IJavaValue fLogicalParent;
 
 	/**
 	 * Constructs an array entry at the given index in an array.
-	 * 
+	 *
 	 * @param target
 	 *            debug target containing the array entry
 	 * @param array
@@ -192,7 +192,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getGenericSignature()
 	 */
 	@Override
@@ -240,7 +240,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
@@ -262,7 +262,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see java.lang.Object#hashCode()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayValue.java
index ab5f2f9..3e8659a 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIArrayValue.java
@@ -33,7 +33,7 @@
 
 	/**
 	 * Constructs a value which is a reference to an array.
-	 * 
+	 *
 	 * @param target
 	 *            debug target on which the array exists
 	 * @param value
@@ -117,7 +117,7 @@
 
 	/**
 	 * Returns the underlying array reference for this array.
-	 * 
+	 *
 	 * @return underlying array reference
 	 */
 	@Override
@@ -128,7 +128,7 @@
 	/**
 	 * Returns the underlying value at the given index from the underlying array
 	 * reference.
-	 * 
+	 *
 	 * @param index
 	 *            the index at which to retrieve a value
 	 * @return value
@@ -158,7 +158,7 @@
 
 	/**
 	 * Returns the underlying values from the underlying array reference.
-	 * 
+	 *
 	 * @return list of values
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -186,7 +186,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getSize()
 	 */
 	@Override
@@ -196,7 +196,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getVariable(int)
 	 */
 	@Override
@@ -210,7 +210,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getVariables(int, int)
 	 */
 	@Override
@@ -234,7 +234,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getInitialOffset()
 	 */
 	@Override
@@ -244,7 +244,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
 	 */
 	@Override
@@ -254,7 +254,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaArray#setValues(int, int,
 	 * org.eclipse.jdt.debug.core.IJavaValue[], int)
 	 */
@@ -262,7 +262,7 @@
 	public void setValues(int offset, int length, IJavaValue[] values,
 			int startOffset) throws DebugException {
 		try {
-			List<Value> list = new ArrayList<Value>(values.length);
+			List<Value> list = new ArrayList<>(values.length);
 			for (IJavaValue value : values) {
 				list.add(((JDIValue) value).getUnderlyingValue());
 			}
@@ -290,7 +290,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaArray#setValues(org.eclipse.jdt.debug
 	 * .core.IJavaValue[])
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassObjectValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassObjectValue.java
index 5b05513..ad92b3b 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassObjectValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassObjectValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
 /**
  * An object on the target VM that is an instance of
  * <code>java.lang.Class</code>.
- * 
+ *
  * @see IJavaClassObject
  */
 public class JDIClassObjectValue extends JDIObjectValue implements
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassType.java
index 14f7e96..880653d 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIClassType.java
@@ -43,7 +43,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaClassType#newInstance(java.lang.String,
 	 * org.eclipse.jdt.debug.core.IJavaValue[],
@@ -88,7 +88,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaClassType#sendMessage(java.lang.String,
 	 * java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
@@ -132,7 +132,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaClassType#getSuperclass()
 	 */
 	@Override
@@ -156,7 +156,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaClassType#getAllInterfaces()
 	 */
 	@Override
@@ -164,7 +164,7 @@
 		try {
 			List<InterfaceType> interfaceList = ((ClassType) getUnderlyingType())
 					.allInterfaces();
-			List<JDIType> javaInterfaceTypeList = new ArrayList<JDIType>(interfaceList.size());
+			List<JDIType> javaInterfaceTypeList = new ArrayList<>(interfaceList.size());
 			for(InterfaceType interfaceType : interfaceList) {
 				if (interfaceType != null) {
 					javaInterfaceTypeList.add(JDIType.createType(
@@ -187,14 +187,14 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaClassType#getInterfaces()
 	 */
 	@Override
 	public IJavaInterfaceType[] getInterfaces() throws DebugException {
 		try {
 			List<InterfaceType> interfaceList = ((ClassType) getUnderlyingType()).interfaces();
-			List<JDIType> javaInterfaceTypeList = new ArrayList<JDIType>(interfaceList.size());
+			List<JDIType> javaInterfaceTypeList = new ArrayList<>(interfaceList.size());
 			for(InterfaceType interfaceType : interfaceList) {
 				if (interfaceType != null) {
 					javaInterfaceTypeList.add(JDIType.createType(
@@ -217,7 +217,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaClassType#isEnum()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugElement.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugElement.java
index 3d74718..2d5d5a8 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugElement.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugElement.java
@@ -42,7 +42,7 @@
 
 	/**
 	 * Creates a JDI debug element associated with the specified debug target.
-	 * 
+	 *
 	 * @param target
 	 *            The associated debug target
 	 */
@@ -101,7 +101,7 @@
 	/**
 	 * Queues a debug event with the event dispatcher to be fired as an event
 	 * set when all event processing is complete.
-	 * 
+	 *
 	 * @param event
 	 *            the event to queue
 	 * @param set
@@ -118,7 +118,7 @@
 	/**
 	 * Fires a debug event marking the SUSPEND of this element with the
 	 * associated detail.
-	 * 
+	 *
 	 * @param detail
 	 *            The int detail of the event
 	 * @see org.eclipse.debug.core.DebugEvent
@@ -132,7 +132,7 @@
 	/**
 	 * Queues a debug event marking the SUSPEND of this element with the
 	 * associated detail.
-	 * 
+	 *
 	 * @param detail
 	 *            The int detail of the event
 	 * @param set
@@ -147,7 +147,7 @@
 	/**
 	 * Throws a new debug exception with a status code of
 	 * <code>REQUEST_FAILED</code>.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -166,7 +166,7 @@
 	 * <code>TARGET_REQUEST_FAILED</code> with the given underlying exception.
 	 * If the underlying exception is not a JDI exception, the original
 	 * exception is thrown.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -187,7 +187,7 @@
 
 	/**
 	 * Throws a new debug exception with the given status code.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -205,7 +205,7 @@
 	/**
 	 * Throws a new debug exception with a status code of
 	 * <code>TARGET_REQUEST_FAILED</code>.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -223,7 +223,7 @@
 	 * Throws a new debug exception with a status code of
 	 * <code>TARGET_REQUEST_FAILED</code> with the given underlying exception.
 	 * The underlying exception is an exception thrown by a JDI request.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -240,7 +240,7 @@
 	/**
 	 * Throws a new debug exception with a status code of
 	 * <code>NOT_SUPPORTED</code>.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @throws DebugException
@@ -267,7 +267,7 @@
 	/**
 	 * Logs the given exception if it is a JDI exception, otherwise throws the
 	 * runtime exception.
-	 * 
+	 *
 	 * @param e
 	 *            The internal runtime exception
 	 */
@@ -282,7 +282,7 @@
 	/**
 	 * Logs a debug exception with the given message, with a status code of
 	 * <code>INTERNAL_ERROR</code>.
-	 * 
+	 *
 	 * @param message
 	 *            The internal error message
 	 */
@@ -294,7 +294,7 @@
 
 	/**
 	 * Returns the common "&lt;unknown&gt;" message.
-	 * 
+	 *
 	 * @return the unknown String
 	 */
 	protected String getUnknownMessage() {
@@ -303,7 +303,7 @@
 
 	/**
 	 * Returns this elements debug target as its implementation class.
-	 * 
+	 *
 	 * @return Java debug target
 	 */
 	public JDIDebugTarget getJavaDebugTarget() {
@@ -313,7 +313,7 @@
 	/**
 	 * Returns the target VM associated with this element, or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @return target VM or <code>null</code> if none
 	 */
 	protected VirtualMachine getVM() {
@@ -323,7 +323,7 @@
 	/**
 	 * Returns the underlying VM's event request manager, or <code>null</code>
 	 * if none (disconnected/terminated)
-	 * 
+	 *
 	 * @return event request manager or <code>null</code>
 	 */
 	public EventRequestManager getEventRequestManager() {
@@ -338,7 +338,7 @@
 	 * Adds the given listener to this target's event dispatcher's table of
 	 * listeners for the specified event request. The listener will be notified
 	 * each time the event occurs.
-	 * 
+	 *
 	 * @param listener
 	 *            the listener to register
 	 * @param request
@@ -358,7 +358,7 @@
 	 * listeners for the specifed event request. The listener will no longer be
 	 * notified when the event occurs. Listeners are responsible for deleting
 	 * the event request if desired.
-	 * 
+	 *
 	 * @param listener
 	 *            the listener to remove
 	 * @param request
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java
index 0d146d8..519f877 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java
@@ -353,7 +353,7 @@
 		prepareBreakpointsSearchScope();
 		setBreakpoints(new ArrayList<IBreakpoint>(5));
 		setThreadList(new ArrayList<JDIThread>(5));
-		fGroups = new ArrayList<JDIThreadGroup>(5);
+		fGroups = new ArrayList<>(5);
 		setOutOfSynchTypes(new ArrayList<String>(0));
 		setHCROccurred(false);
 		initialize();
@@ -439,7 +439,7 @@
 		List<JDIThread> threadList;
 		synchronized (fThreads) {
 			//TODO investigate making fThreads be a synchronized collection, to remove all this copying
-			threadList = new ArrayList<JDIThread>(fThreads);
+			threadList = new ArrayList<>(fThreads);
 		}
 		return threadList.iterator();
 	}
@@ -927,7 +927,7 @@
 	 * Sets the list of out of synch types to the given list.
 	 */
 	private void setOutOfSynchTypes(List<String> qualifiedNames) {
-		fOutOfSynchTypes = new HashSet<String>();
+		fOutOfSynchTypes = new HashSet<>();
 		fOutOfSynchTypes.addAll(qualifiedNames);
 	}
 
@@ -1392,7 +1392,7 @@
 		if(projects == null){
 			return true;
 		}
-		
+
 		// Breakpoint from project known by the resource mapping
 		if (projects.contains(resource.getProject())) {
 			return true;
@@ -1905,7 +1905,7 @@
 	 * cleared.
 	 */
 	protected void removeAllBreakpoints() {
-		List<IBreakpoint> list = new ArrayList<IBreakpoint>(getBreakpoints());
+		List<IBreakpoint> list = new ArrayList<>(getBreakpoints());
 		for(IBreakpoint bp : list) {
 			JavaBreakpoint breakpoint = (JavaBreakpoint) bp;
 			try {
@@ -1922,7 +1922,7 @@
 	 * target.
 	 */
 	protected void reinstallAllBreakpoints() {
-		List<IBreakpoint> list = new ArrayList<IBreakpoint>(getBreakpoints());
+		List<IBreakpoint> list = new ArrayList<>(getBreakpoints());
 		for(IBreakpoint bp : list) {
 			JavaBreakpoint breakpoint = (JavaBreakpoint) bp;
 			try {
@@ -2788,7 +2788,7 @@
 	 */
 	public IAstEvaluationEngine getEvaluationEngine(IJavaProject project) {
 		if (fEngines == null) {
-			fEngines = new HashMap<IJavaProject, IAstEvaluationEngine>(2);
+			fEngines = new HashMap<>(2);
 		}
 		IAstEvaluationEngine engine = fEngines
 				.get(project);
@@ -2901,7 +2901,7 @@
 		if (!isAvailable()) {
 			return;
 		}
-		List<IBreakpoint> list = new ArrayList<IBreakpoint>(getBreakpoints());
+		List<IBreakpoint> list = new ArrayList<>(getBreakpoints());
 		for(IBreakpoint bp : list) {
 			JavaBreakpoint breakpoint = (JavaBreakpoint) bp;
 			try {
@@ -3000,7 +3000,7 @@
 				return new IJavaThreadGroup[0];
 			}
 			List<ThreadGroupReference> groups = vm.topLevelThreadGroups();
-			List<JDIThreadGroup> modelGroups = new ArrayList<JDIThreadGroup>(groups.size());
+			List<JDIThreadGroup> modelGroups = new ArrayList<>(groups.size());
 			for(ThreadGroupReference ref : groups) {
 				JDIThreadGroup group = findThreadGroup(ref);
 				if (group != null) {
@@ -3163,9 +3163,9 @@
 		}
 		boolean prevSuspend = isSuspended();
 		int running = 0;
-		List<JDIThread> toSuspend = new ArrayList<JDIThread>();
-		List<JDIThread> toResume = new ArrayList<JDIThread>();
-		List<JDIThread> toRefresh = new ArrayList<JDIThread>();
+		List<JDIThread> toSuspend = new ArrayList<>();
+		List<JDIThread> toResume = new ArrayList<>();
+		List<JDIThread> toRefresh = new ArrayList<>();
 		Iterator<JDIThread> iterator = getThreadIterator();
 		while (iterator.hasNext()) {
 			JDIThread thread = iterator.next();
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIFieldVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIFieldVariable.java
index 054f11c..1880eb8 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIFieldVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIFieldVariable.java
@@ -54,7 +54,7 @@
 	 * When created for a logical structure we hold onto the original
 	 * non-logical value for purposes of equality. This way a logical
 	 * structure's children remain more stable in the variables view.
-	 * 
+	 *
 	 * This is <code>null</code> when not created for a logical structure.
 	 */
 	private IJavaValue fLogicalParent;
@@ -263,7 +263,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getGenericSignature()
 	 */
 	@Override
@@ -371,7 +371,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaFieldVariable#getObject()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIInterfaceType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIInterfaceType.java
index 1da333f..5e5cdcf 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIInterfaceType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIInterfaceType.java
@@ -43,7 +43,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaInterfaceType#getImplementors()
 	 */
 	@Override
@@ -51,7 +51,7 @@
 		try {
 			List<ClassType> implementorList = ((InterfaceType) getUnderlyingType())
 					.implementors();
-			List<JDIType> javaClassTypeList = new ArrayList<JDIType>(implementorList.size());
+			List<JDIType> javaClassTypeList = new ArrayList<>(implementorList.size());
 			Iterator<ClassType> iterator = implementorList.iterator();
 			while (iterator.hasNext()) {
 				ClassType classType = iterator.next();
@@ -76,7 +76,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaInterfaceType#getSubInterfaces()
 	 */
 	@Override
@@ -84,7 +84,7 @@
 		try {
 			List<InterfaceType> subList = ((InterfaceType) getUnderlyingType())
 					.subinterfaces();
-			List<JDIType> javaInterfaceTypeList = new ArrayList<JDIType>(subList.size());
+			List<JDIType> javaInterfaceTypeList = new ArrayList<>(subList.size());
 			Iterator<InterfaceType> iterator = subList.iterator();
 			while (iterator.hasNext()) {
 				InterfaceType interfaceType = iterator.next();
@@ -109,7 +109,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaInterfaceType#getSuperInterfaces()
 	 */
 	@Override
@@ -117,7 +117,7 @@
 		try {
 			List<InterfaceType> superList = ((InterfaceType) getUnderlyingType())
 					.superinterfaces();
-			List<JDIType> javaInterfaceTypeList = new ArrayList<JDIType>(superList.size());
+			List<JDIType> javaInterfaceTypeList = new ArrayList<>(superList.size());
 			Iterator<InterfaceType> iterator = superList.iterator();
 			while (iterator.hasNext()) {
 				InterfaceType interfaceType = iterator.next();
@@ -142,7 +142,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaInterfaceType#sendMessage(java.lang.String,
 	 * java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDILocalVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDILocalVariable.java
index c41c798..84a4475 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDILocalVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDILocalVariable.java
@@ -162,7 +162,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getGenericSignature()
 	 */
 	@Override
@@ -232,7 +232,7 @@
 	}
 
 	/**
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#isLocal()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIMethod.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIMethod.java
index 9686300..78cd97f 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIMethod.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIMethod.java
@@ -16,9 +16,9 @@
 
 /**
  * Class for analysing Java methods while debugging.
- * 
+ *
  * @author jmoeller2
- * 
+ *
  */
 public class JDIMethod {
 
@@ -45,7 +45,7 @@
 	/**
 	 * Determines if the opcode passes in is one of the value return
 	 * instructions.
-	 * 
+	 *
 	 * @param opCode
 	 *            opCode to check
 	 * @return If <code>opCode</code> is one of 'areturn', 'ireturn', etc.
@@ -58,7 +58,7 @@
 
 	/**
 	 * Determines if the opcode passes in is one of the 'loado_1' instruxtions.
-	 * 
+	 *
 	 * @param opCode
 	 *            opCode to check
 	 * @return If <code>opCode</code> is one of 'aload_1', 'iload_1', etc.
@@ -71,12 +71,12 @@
 
 	/**
 	 * Determines if the method in question is a simple getter, JavaBean style.
-	 * 
+	 *
 	 * Simple getters have byte code which look like this, and they start with
 	 * "get" or "is":
-	 * 
+	 *
 	 * 0 aload_0 1 getfield 4 Xreturn
-	 * 
+	 *
 	 * @param method
 	 *            Method to check
 	 * @return true if the method is a simple getter
@@ -94,12 +94,12 @@
 
 	/**
 	 * Determines if the method in question is a simple getter, JavaBean style.
-	 * 
+	 *
 	 * Simple setters have byte code which look like this, and they start with
 	 * "set":
-	 * 
+	 *
 	 * 0 aload_0 1 Xload_1 2 putfield 5 return
-	 * 
+	 *
 	 * @param method
 	 *            Method to check
 	 * @return true if the method is a simple setter
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIModificationVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIModificationVariable.java
index 2e1f2e9..13fa3f3 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIModificationVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIModificationVariable.java
@@ -31,7 +31,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#supportsValueModification
 	 * ()
@@ -43,7 +43,7 @@
 
 	/**
 	 * Returns a value generated by the vm from the given expression
-	 * 
+	 *
 	 * @param expression
 	 *            the expression to produce a value from
 	 * @return generated value, <code>null</code> is a valid value
@@ -155,7 +155,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang
 	 * .String)
@@ -169,7 +169,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse
 	 * .debug.core.model.IValue)
@@ -191,7 +191,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String
 	 * )
@@ -204,7 +204,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIVariable#setValue(org.eclipse
 	 * .debug.core.model.IValue)
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDINullValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDINullValue.java
index 8e064ff..198e5af 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDINullValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDINullValue.java
@@ -32,7 +32,7 @@
 
 	/**
 	 * Constructor
-	 * 
+	 *
 	 * @param target
 	 */
 	public JDINullValue(JDIDebugTarget target) {
@@ -179,7 +179,7 @@
 
 	/**
 	 * Creates an artificial NPE for display to the user as an error message
-	 * 
+	 *
 	 * @param selector
 	 * @param signature
 	 * @return
@@ -207,7 +207,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#disableCollection
 	 * ()
@@ -219,7 +219,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#enableCollection
 	 * ()
@@ -231,7 +231,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#isNull()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java
index 7eba9fb..710de87 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java
@@ -58,7 +58,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#sendMessage(java.lang.String,
 	 * java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
 	 * org.eclipse.jdt.debug.core.IJavaThread, boolean)
@@ -72,7 +72,7 @@
 		if (args == null) {
 			arguments = Collections.EMPTY_LIST;
 		} else {
-			arguments = new ArrayList<Value>(args.length);
+			arguments = new ArrayList<>(args.length);
 			for (IJavaValue arg : args) {
 				arguments.add(((JDIValue) arg).getUnderlyingValue());
 			}
@@ -104,7 +104,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#sendMessage(java.lang.String,
 	 * java.lang.String, org.eclipse.jdt.debug.core.IJavaValue[],
 	 * org.eclipse.jdt.debug.core.IJavaThread, java.lang.String)
@@ -118,7 +118,7 @@
 		if (args == null) {
 			arguments = Collections.EMPTY_LIST;
 		} else {
-			arguments = new ArrayList<Value>(args.length);
+			arguments = new ArrayList<>(args.length);
 			for (IJavaValue arg : args) {
 				arguments.add(((JDIValue) arg).getUnderlyingValue());
 			}
@@ -168,7 +168,7 @@
 			if (m != null) {
 				return m;
 			}
-			
+
 			for (InterfaceType iface : ((ClassType) refType).allInterfaces()) {
 				List<Method> matches = iface.methodsByName(selector, signature);
 				for (Method ifaceMethod : matches) {
@@ -202,7 +202,7 @@
 
 	/**
 	 * Returns this object's the underlying object reference
-	 * 
+	 *
 	 * @return underlying object reference
 	 */
 	public ObjectReference getUnderlyingObject() {
@@ -211,7 +211,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getField(java.lang.String,
 	 * boolean)
 	 */
@@ -257,7 +257,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getField(java.lang.String,
 	 * java.lang.String)
 	 */
@@ -296,7 +296,7 @@
 	 * Returns a variable representing the field in this object with the given
 	 * name, or <code>null</code> if there is no field with the given name, or
 	 * the name is ambiguous.
-	 * 
+	 *
 	 * @param name
 	 *            field name
 	 * @param superClassLevel
@@ -335,7 +335,7 @@
 
 	/**
 	 * Returns the underlying reference type for this object.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
 	 *                <ul>
@@ -398,12 +398,12 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getWaitingThreads()
 	 */
 	@Override
 	public IJavaThread[] getWaitingThreads() throws DebugException {
-		List<JDIThread> waiting = new ArrayList<JDIThread>();
+		List<JDIThread> waiting = new ArrayList<>();
 		try {
 			List<ThreadReference> threads = getUnderlyingObject().waitingThreads();
 			JDIDebugTarget debugTarget = (JDIDebugTarget) getDebugTarget();
@@ -425,7 +425,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getOwningThread()
 	 */
 	@Override
@@ -449,7 +449,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIValue#getReferenceTypeName()
 	 */
@@ -471,7 +471,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getUniqueId()
 	 */
 	@Override
@@ -480,7 +480,7 @@
 			ObjectReference underlyingObject = getUnderlyingObject();
 			if (underlyingObject != null) {
 				return underlyingObject.uniqueID();
-			} 
+			}
 			return -1L;
 		} catch (RuntimeException e) {
 			targetRequestFailed(
@@ -495,7 +495,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#getReferringObjects(long)
 	 */
 	@Override
@@ -517,7 +517,7 @@
 	 * Returns true if references to this object have been calculated and
 	 * cached. This method will return true even if the cached references are
 	 * stale.
-	 * 
+	 *
 	 * @return true is references to this object have been calculated and
 	 *         cached, false otherwise
 	 */
@@ -528,7 +528,7 @@
 	/**
 	 * Gets the list of objects that reference this object from the VM,
 	 * overwriting the cached list (if one exists).
-	 * 
+	 *
 	 * @param max
 	 *            The maximum number of entries to return
 	 * @throws DebugException
@@ -553,7 +553,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#disableCollection()
 	 */
 	@Override
@@ -574,7 +574,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaObject#enableCollection()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPlaceholderValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPlaceholderValue.java
index 702545d..3929c9b 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPlaceholderValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPlaceholderValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -15,7 +15,7 @@
  * to the user. Currently used to inform users that references are not available
  * for the current VM. It extends <code>JDINullValue</code> so that most actions
  * will ignore it, but returns the message instead of "null" for it's value.
- * 
+ *
  * @since 3.3
  */
 public class JDIPlaceholderValue extends JDINullValue {
@@ -24,7 +24,7 @@
 
 	/**
 	 * Constructor, passes the debug target to the super class.
-	 * 
+	 *
 	 * @param target
 	 *            debug target this value belongs to
 	 */
@@ -54,7 +54,7 @@
 	/**
 	 * Returns signature for a java string object so that the string message
 	 * passed in the constructor is displayed in the detail pane.
-	 * 
+	 *
 	 * @return signature for a java string object
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDINullValue#getSignature()
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPrimitiveValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPrimitiveValue.java
index 6a58429..4fa7a29 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPrimitiveValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIPrimitiveValue.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 
 	/**
 	 * Constructs a new primitive value.
-	 * 
+	 *
 	 * @param target
 	 *            the Java debug target
 	 * @param value
@@ -34,7 +34,7 @@
 
 	/**
 	 * Returns this value's underlying primtive value
-	 * 
+	 *
 	 * @return underlying primtive value
 	 */
 	protected PrimitiveValue getUnderlyingPrimitiveValue() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListEntryVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListEntryVariable.java
index e7dca31..99d7254 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListEntryVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListEntryVariable.java
@@ -16,7 +16,7 @@
 /**
  * This variable is created as the child of <code>JDIReferenceListValue</code>.
  * It represents one reference to a root object stored in the parent value.
- * 
+ *
  * @see JDIReferenceListValue
  * @since 3.3
  */
@@ -24,7 +24,7 @@
 
 	/**
 	 * Constructor.
-	 * 
+	 *
 	 * @param name
 	 *            The name that this variable should use as its label
 	 * @param reference
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListValue.java
index 7b2bd4c..06de5b5 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListValue.java
@@ -31,7 +31,7 @@
  * <code>JDIReferenceListVariable</code>. The children of this value will be
  * <code>JDIReferenceListEntryVariable</code>, each representing one reference
  * to the root object.
- * 
+ *
  * @see JDIReferenceListVariable
  * @see JDIReferenceListEntryVariable
  * @since 3.3
@@ -45,7 +45,7 @@
 
 	/**
 	 * Constructor, initializes this value with its debug target and root object
-	 * 
+	 *
 	 * @param target
 	 *            The debug target associated with this value
 	 * @param root
@@ -107,7 +107,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getVariables()
 	 */
 	@Override
@@ -132,7 +132,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getUnderlyingObject
 	 * ()
@@ -144,7 +144,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#hasVariables()
 	 */
 	@Override
@@ -157,7 +157,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#isAllocated()
 	 */
 	@Override
@@ -167,7 +167,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getJavaType()
 	 */
 	@Override
@@ -177,7 +177,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getSignature()
 	 */
 	@Override
@@ -187,7 +187,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIObjectValue#getReferenceTypeName
 	 * ()
@@ -199,7 +199,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#getValueString()
 	 */
 	@Override
@@ -210,7 +210,7 @@
 	/**
 	 * Returns a string representation of this value intended to be displayed in
 	 * the detail pane of views. Lists the references on separate lines.
-	 * 
+	 *
 	 * @return a string representation of this value to display in the detail
 	 *         pane
 	 */
@@ -246,7 +246,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#toString()
 	 */
 	@Override
@@ -258,7 +258,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIValue#equals(java.lang.Object
 	 * )
@@ -276,7 +276,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIValue#hashCode()
 	 */
 	@Override
@@ -286,7 +286,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getInitialOffset()
 	 */
 	@Override
@@ -296,7 +296,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getSize()
 	 */
 	@Override
@@ -306,7 +306,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getVariable(int)
 	 */
 	@Override
@@ -321,7 +321,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IIndexedValue#getVariables(int, int)
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListVariable.java
index 45a7829..2c7a1b3 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceListVariable.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,7 +18,7 @@
  * information collected from the vm using the 'all references' utility in Java
  * 6.0. This variable uses a <code>JDIReferenceListValue</code> as its value.
  * Its children will be <code>JDIReferenceListEntryVariable</code>.
- * 
+ *
  * @since 3.3
  * @see JDIReferenceListValue
  * @see JDIReferenceListEntryVariable
@@ -28,7 +28,7 @@
 	/**
 	 * Creates a new variable that stores a list of references, all referring to
 	 * the java object specified by the parameter root.
-	 * 
+	 *
 	 * @param name
 	 *            The name this variable should use
 	 * @param root
@@ -40,7 +40,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.logicalstructures.JDIPlaceholderVariable
 	 * #equals(java.lang.Object)
@@ -62,7 +62,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.logicalstructures.JDIPlaceholderVariable
 	 * #hashCode()
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceType.java
index d836a16..6dc2a16 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIReferenceType.java
@@ -50,7 +50,7 @@
 
 	/**
 	 * Constructs a new reference type in the given target.
-	 * 
+	 *
 	 * @param target
 	 *            associated VM
 	 * @param type
@@ -62,7 +62,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getAvailableStrata()
 	 */
 	@Override
@@ -73,7 +73,7 @@
 
 	/**
 	 * Returns the underlying reference type.
-	 * 
+	 *
 	 * @return the underlying reference type
 	 */
 	protected ReferenceType getReferenceType() {
@@ -82,7 +82,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getDefaultStratum()
 	 */
 	@Override
@@ -98,7 +98,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaReferenceType#getField(java.lang.String)
 	 */
@@ -122,7 +122,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getClassObject()
 	 */
 	@Override
@@ -144,7 +144,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getAllFieldNames()
 	 */
 	@Override
@@ -169,7 +169,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaReferenceType#getDeclaredFieldNames()
 	 */
@@ -195,7 +195,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaReferenceType#getSourcePaths(java.lang
 	 * .String)
@@ -216,7 +216,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getSourceName()
 	 */
 	@Override
@@ -233,7 +233,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaReferenceType#getSourceNames(java.lang
 	 * .String)
@@ -254,7 +254,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getClassLoaderObject()
 	 */
 	@Override
@@ -310,7 +310,7 @@
 
 	/**
 	 * Return the name from the given signature. Keep the '$' characters.
-	 * 
+	 *
 	 * @param genericTypeSignature
 	 *            the signature to derive the type name from
 	 * @return the type name
@@ -349,7 +349,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getGenericSignature()
 	 */
 	@Override
@@ -359,7 +359,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getInstances(long)
 	 */
 	@Override
@@ -380,7 +380,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaReferenceType#getInstanceCount()
 	 */
 	@Override
@@ -389,7 +389,7 @@
 		if (target.supportsInstanceRetrieval()) {
 			Type type = getUnderlyingType();
 			if(type instanceof ReferenceType) {
-				ArrayList<ReferenceType> list = new ArrayList<ReferenceType>(2);
+				ArrayList<ReferenceType> list = new ArrayList<>(2);
 				list.add((ReferenceType) type);
 				VirtualMachine vm = getVM();
 				try {
@@ -405,7 +405,7 @@
 
 	/**
 	 * Utility method to convert argument array to an argument list.
-	 * 
+	 *
 	 * @param args
 	 *            array of arguments, as <code>IJavaValue</code>s, possibly
 	 *            <code>null</code> or empty
@@ -416,7 +416,7 @@
 		if (args == null) {
 			arguments = Collections.EMPTY_LIST;
 		} else {
-			arguments = new ArrayList<Value>(args.length);
+			arguments = new ArrayList<>(args.length);
 			for (IJavaValue arg : args) {
 				arguments.add(((JDIValue) arg).getUnderlyingValue());
 			}
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIStackFrame.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIStackFrame.java
index a6b8275..73235e0 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIStackFrame.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIStackFrame.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Samrat Dhillon samrat.dhillon@gmail.com - Bug 384458 - debug shows value of variable in another scope 
+ *     Samrat Dhillon samrat.dhillon@gmail.com - Bug 384458 - debug shows value of variable in another scope
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.core.model;
 
@@ -130,7 +130,7 @@
 
 	/**
 	 * Creates a new stack frame in the given thread.
-	 * 
+	 *
 	 * @param thread
 	 *            The parent JDI thread
 	 * @param frame
@@ -149,7 +149,7 @@
 	 * returns a new frame representing the given frame. A frame can only be
 	 * re-bound to an underlying frame if it refers to the same depth on the
 	 * stack in the same method.
-	 * 
+	 *
 	 * @param frame
 	 *            underlying frame, or <code>null</code>
 	 * @param depth
@@ -308,7 +308,7 @@
 				}
 
 				Method method = getUnderlyingMethod();
-				fVariables = new ArrayList<IJavaVariable>();
+				fVariables = new ArrayList<>();
 				// #isStatic() does not claim to throw any exceptions - so it is
 				// not try/catch coded
 				if (method.isStatic()) {
@@ -430,7 +430,7 @@
 			// generic signature
 			String[] parameterTypes = Signature
 					.getParameterTypes(genericSignature);
-			List<String> argumentTypeNames = new ArrayList<String>();
+			List<String> argumentTypeNames = new ArrayList<>();
 			for (String parameterType : parameterTypes) {
 				argumentTypeNames.add(Signature.toString(parameterType)
 						.replace('/', '.'));
@@ -548,7 +548,7 @@
 
 	/**
 	 * Incrementally updates this stack frames variables.
-	 * 
+	 *
 	 * @see JDIDebugElement#targetRequestFailed(String, RuntimeException)
 	 */
 	protected void updateVariables() throws DebugException {
@@ -762,7 +762,7 @@
 			return null;
 		}
 		IVariable[] variables = getVariables();
-		List<IJavaVariable> possibleMatches = new ArrayList<IJavaVariable>();
+		List<IJavaVariable> possibleMatches = new ArrayList<>();
 		IJavaVariable thisVariable = null;
 		for (IVariable variable : variables) {
 			IJavaVariable var = (IJavaVariable) variable;
@@ -799,7 +799,7 @@
 	/**
 	 * Retrieves visible variables in this stack frame handling any exceptions.
 	 * Returns an empty list if there are no variables.
-	 * 
+	 *
 	 * @see JDIDebugElement#targetRequestFailed(String, RuntimeException)
 	 */
 	protected List<LocalVariable> getUnderlyingVisibleVariables() throws DebugException {
@@ -824,7 +824,7 @@
 	/**
 	 * Retrieves 'this' from the underlying stack frame. Returns
 	 * <code>null</code> for static stack frames.
-	 * 
+	 *
 	 * @see JDIDebugElement#targetRequestFailed(String, RuntimeException)
 	 */
 	protected ObjectReference getUnderlyingThisObject() throws DebugException {
@@ -1167,7 +1167,7 @@
 
 	/**
 	 * Returns this stack frame's underlying JDI frame.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this stack frame does not currently have an underlying
 	 *                frame (is in an interim state where this frame's thread
@@ -1206,7 +1206,7 @@
 	/**
 	 * Sets the underlying JDI StackFrame. Called by a thread when incrementally
 	 * updating after a step has completed.
-	 * 
+	 *
 	 * @param frame
 	 *            The underlying stack frame
 	 */
@@ -1258,7 +1258,7 @@
 
 	/**
 	 * Java stack frames do not support registers
-	 * 
+	 *
 	 * @see IStackFrame#getRegisterGroups()
 	 */
 	@Override
@@ -1290,7 +1290,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaStackFrame#getReferenceType()
 	 */
 	@Override
@@ -1311,7 +1311,7 @@
 
 	/**
 	 * Expression level stepping not supported.
-	 * 
+	 *
 	 * @see IStackFrame#getCharEnd()
 	 */
 	@Override
@@ -1321,7 +1321,7 @@
 
 	/**
 	 * Expression level stepping not supported.
-	 * 
+	 *
 	 * @see IStackFrame#getCharStart()
 	 */
 	@Override
@@ -1349,7 +1349,7 @@
 	/**
 	 * Sets whether locals were available. If the setting is not the same as the
 	 * current value, a change event is fired such that a UI client can update.
-	 * 
+	 *
 	 * @param available
 	 *            whether local variable information is available for this stack
 	 *            frame.
@@ -1481,7 +1481,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaStackFrame#isVarargs()
 	 */
 	@Override
@@ -1491,7 +1491,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaStackFrame#canForceReturn()
 	 */
 	@Override
@@ -1518,7 +1518,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaStackFrame#forceReturn(org.eclipse.jdt
 	 * .debug.core.IJavaValue)
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThisVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThisVariable.java
index fc78a77..f4d951e 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThisVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThisVariable.java
@@ -74,7 +74,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaVariable#getGenericSignature()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThread.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThread.java
index ea1d2fd..b8de172 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThread.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThread.java
@@ -166,7 +166,7 @@
 
 	/**
 	 * Whether this thread is a daemon thread
-	 * 
+	 *
 	 * @since 3.3
 	 */
 	private boolean fIsDaemon = false;
@@ -176,7 +176,7 @@
 	 * collection if the thread is not suspended or was not suspended by any
 	 * breakpoint(s).
 	 */
-	private List<IBreakpoint> fCurrentBreakpoints = new ArrayList<IBreakpoint>(2);
+	private List<IBreakpoint> fCurrentBreakpoints = new ArrayList<>(2);
 	/**
 	 * Non-null when this thread is executing an evaluation runnable. An
 	 * evaluation may involve a series of method invocations.
@@ -220,7 +220,7 @@
 	/**
 	 * Whether a suspend vote is currently in progress. While voting this thread
 	 * does not allow other breakpoints to be hit.
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	private boolean fSuspendVoteInProgress = false;
@@ -297,7 +297,7 @@
 	/**
 	 * Creates a new thread on the underlying thread reference in the given
 	 * debug target.
-	 * 
+	 *
 	 * @param target
 	 *            the debug target in which this thread is contained
 	 * @param thread
@@ -321,13 +321,13 @@
 	 * <li>Determines suspended state from underlying thread</li>
 	 * <li>Sets this threads stack frames to an empty collection</li>
 	 * </ul>
-	 * 
+	 *
 	 * @exception ObjectCollectedException
 	 *                if the thread has been garbage collected and cannot be
 	 *                initialized
 	 */
 	protected void initialize() throws ObjectCollectedException {
-		fStackFrames = new ArrayList<IJavaStackFrame>();
+		fStackFrames = new ArrayList<>();
 		// system thread
 		try {
 			determineIfSystemThread();
@@ -407,7 +407,7 @@
 	/**
 	 * Adds the given breakpoint to the list of breakpoints this thread is
 	 * suspended at
-	 * 
+	 *
 	 * @param bp
 	 *            the breakpoint to add to the listing
 	 */
@@ -419,7 +419,7 @@
 	 * Removes the given breakpoint from the list of breakpoints this thread is
 	 * suspended at (called when a breakpoint is deleted, in case we are
 	 * suspended at that breakpoint)
-	 * 
+	 *
 	 * @param bp
 	 *            the breakpoint to remove from the listing
 	 */
@@ -429,7 +429,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IThread#getBreakpoints()
 	 */
 	@Override
@@ -440,7 +440,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
 	 */
 	@Override
@@ -453,7 +453,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
 	 */
 	@Override
@@ -465,7 +465,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
 	 */
 	@Override
@@ -475,7 +475,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IStep#canStepInto()
 	 */
 	@Override
@@ -485,7 +485,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IStep#canStepOver()
 	 */
 	@Override
@@ -495,7 +495,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IStep#canStepReturn()
 	 */
 	@Override
@@ -505,7 +505,7 @@
 
 	/**
 	 * Returns whether this thread is in a valid state to step.
-	 * 
+	 *
 	 * @return whether this thread is in a valid state to step
 	 */
 	protected boolean canStep() {
@@ -522,7 +522,7 @@
 
 	/**
 	 * Determines and sets whether this thread represents a system thread.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
 	 *                <ul>
@@ -561,7 +561,7 @@
 
 	/**
 	 * Determines whether this is a daemon thread.
-	 * 
+	 *
 	 * @throws DebugException
 	 *             on failure
 	 */
@@ -592,7 +592,7 @@
 
 	/**
 	 * NOTE: this method returns a copy of this thread's stack frames.
-	 * 
+	 *
 	 * @see IThread#getStackFrames()
 	 */
 	@Override
@@ -603,7 +603,7 @@
 
 	/**
 	 * @see #computeStackFrames()
-	 * 
+	 *
 	 * @param refreshChildren
 	 *            whether or not this method should request new stack frames
 	 *            from the VM
@@ -683,7 +683,7 @@
 	 * Stack frames are cached until a subsequent call to preserve or dispose
 	 * stack frames.
 	 * </p>
-	 * 
+	 *
 	 * @return list of <code>IJavaStackFrame</code>
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -702,7 +702,7 @@
 	 * new stack frames from the VM. As this is an expensive operation, this
 	 * method should only be used by clients who know for certain that the stack
 	 * frames on the VM have changed.
-	 * 
+	 *
 	 * @see JDIThread#computeStackFrames()
 	 * @return the listing of stackframes or an empty list, never
 	 *         <code>null</code>
@@ -746,7 +746,7 @@
 
 	/**
 	 * Returns the number of frames on the stack from the underlying thread.
-	 * 
+	 *
 	 * @return number of frames on the stack
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -779,7 +779,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaThread#runEvaluation(org.eclipse.jdt.
 	 * debug.core.IEvaluationRunnable,
@@ -868,7 +868,7 @@
 
 	/**
 	 * Returns whether this thread is in a valid state to run an evaluation.
-	 * 
+	 *
 	 * @return whether this thread is in a valid state to run an evaluation
 	 */
 	protected boolean canRunEvaluation() {
@@ -887,7 +887,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaThread#queueRunnable(java.lang.Runnable)
 	 */
@@ -901,7 +901,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#terminateEvaluation()
 	 */
 	@Override
@@ -916,7 +916,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#canTerminateEvaluation()
 	 */
 	@Override
@@ -951,11 +951,11 @@
 	 * </p>
 	 * <p>
 	 * When performing an invocation, the communication timeout with
-	 * the target VM is set to infinite, as the invocation may not 
+	 * the target VM is set to infinite, as the invocation may not
 	 * complete in a timely fashion, if at all. The timeout value
 	 * is reset to its original value when the invocation completes.
 	 * </p>
-	 * 
+	 *
 	 * @param receiverClass
 	 *            the class in the target representing the receiver of a static
 	 *            message send, or <code>null</code>
@@ -1069,11 +1069,11 @@
 	 * </p>
 	 * <p>
 	 * When performing an invocation, the communication timeout with
-	 * the target VM is set to infinite, as the invocation may not 
+	 * the target VM is set to infinite, as the invocation may not
 	 * complete in a timely fashion, if at all. The timeout value
 	 * is reset to its original value when the invocation completes.
 	 * </p>
-	 * 
+	 *
 	 * @param receiverInterface
 	 *            the class in the target representing the receiver of a static
 	 *            message send, or <code>null</code>
@@ -1168,7 +1168,7 @@
 	 * fashion, if at all. The timeout value is reset to its original value when
 	 * the invocation completes.
 	 * </p>
-	 * 
+	 *
 	 * @param receiverClass
 	 *            the class in the target representing the receiver of the 'new'
 	 *            message send
@@ -1222,7 +1222,7 @@
 	/**
 	 * Called when an invocation fails. Performs cleanup and throws an
 	 * exception.
-	 * 
+	 *
 	 * @param e
 	 *            the exception that caused the failure
 	 * @param restoreTimeout
@@ -1248,7 +1248,7 @@
 	/**
 	 * Called when an invocation fails. Performs cleanup and throws an
 	 * exception.
-	 * 
+	 *
 	 * @param message
 	 *            error message
 	 * @param code
@@ -1281,7 +1281,7 @@
 	 * <li>Restores the communication timeout value</li>
 	 * <li>Computes the new set of stack frames for this thread</code>
 	 * </ul>
-	 * 
+	 *
 	 * @param restoreTimeout
 	 *            the communication timeout value, in milliseconds, that should
 	 *            be reset
@@ -1302,7 +1302,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IThread#getName()
 	 */
 	@Override
@@ -1334,7 +1334,7 @@
 	 * Returns the priority from the underlying {@link ReferenceType}, failing
 	 * that the backing {@link Value} for the underlying {@link ThreadReference}
 	 * is consulted
-	 * 
+	 *
 	 * @return the priority from the backing {@link ReferenceType} or
 	 *         {@link Value}
 	 * @throws DebugException
@@ -1372,7 +1372,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
 	 */
 	@Override
@@ -1388,7 +1388,7 @@
 	 * A breakpoint has suspended execution of this thread. Aborts any step
 	 * currently in process and notifies listeners of the breakpoint to allow a
 	 * vote to determine if the thread should suspend.
-	 * 
+	 *
 	 * @param breakpoint
 	 *            the breakpoint that caused the suspend
 	 * @param suspendVote
@@ -1434,7 +1434,7 @@
 					fSuspendVoteInProgress = false;
 					return false;
 				}
-				
+
 			}
 		}
 		catch (CoreException e) {
@@ -1494,7 +1494,7 @@
 	 * Called after an event set with a breakpoint is done being processed.
 	 * Updates thread state based on the result of handling the event set.
 	 * Aborts any step in progress and fires a suspend event is suspending.
-	 * 
+	 *
 	 * @param breakpoint
 	 *            the breakpoint that was hit
 	 * @param suspend
@@ -1542,7 +1542,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.IStep#isStepping()
 	 */
 	@Override
@@ -1552,7 +1552,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
 	 */
 	@Override
@@ -1562,7 +1562,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#isSystemThread()
 	 */
 	@Override
@@ -1572,7 +1572,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#isDaemon()
 	 */
 	@Override
@@ -1582,7 +1582,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#getThreadGroupName()
 	 */
 	@Override
@@ -1612,7 +1612,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
 	 */
 	@Override
@@ -1622,7 +1622,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#isOutOfSynch()
 	 */
 	@Override
@@ -1643,7 +1643,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#mayBeOutOfSynch()
 	 */
 	@Override
@@ -1656,7 +1656,7 @@
 
 	/**
 	 * Sets whether this thread is terminated
-	 * 
+	 *
 	 * @param terminated
 	 *            whether this thread is terminated
 	 */
@@ -1666,7 +1666,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
 	 */
 	@Override
@@ -1680,10 +1680,10 @@
 	}
 
 	/**
-	 * 
+	 *
 	 * Updates the state of this thread, but only fires notification to
 	 * listeners if <code>fireNotification</code> is <code>true</code>.
-	 * 
+	 *
 	 * @see ISuspendResume#resume()
 	 * @param fireNotification
 	 *            if a resume event should be fired
@@ -1717,7 +1717,7 @@
 	/**
 	 * Sets whether this thread is currently executing. When set to
 	 * <code>true</code>, this thread's current breakpoints are cleared.
-	 * 
+	 *
 	 * @param running
 	 *            whether this thread is executing
 	 */
@@ -1737,7 +1737,7 @@
 	 * through all current stack frames, setting their state as invalid. This
 	 * method should be called before this thread is resumed, when stack frames
 	 * are to be re-used when it later suspends.
-	 * 
+	 *
 	 * @see #computeStackFrames()
 	 */
 	protected synchronized void preserveStackFrames() {
@@ -1751,7 +1751,7 @@
 	 * Disposes stack frames, to be completely re-computed on the next suspend
 	 * event. This method should be called before this thread is resumed when
 	 * stack frames are not to be re-used on the next suspend.
-	 * 
+	 *
 	 * @see #computeStackFrames()
 	 */
 	protected synchronized void disposeStackFrames() {
@@ -1762,7 +1762,7 @@
 	/**
 	 * This method is synchronized, such that the step request begins before a
 	 * background evaluation can be performed.
-	 * 
+	 *
 	 * @see IStep#stepInto()
 	 */
 	@Override
@@ -1779,7 +1779,7 @@
 	/**
 	 * This method is synchronized, such that the step request begins before a
 	 * background evaluation can be performed.
-	 * 
+	 *
 	 * @see IStep#stepOver()
 	 */
 	@Override
@@ -1796,7 +1796,7 @@
 	/**
 	 * This method is synchronized, such that the step request begins before a
 	 * background evaluation can be performed.
-	 * 
+	 *
 	 * @see IStep#stepReturn()
 	 */
 	@Override
@@ -1844,7 +1844,7 @@
 	 * the current Location to the original Location when the user step into was
 	 * initiated. It also makes sure the stack depth now is the same as when the
 	 * step was initiated.
-	 * 
+	 *
 	 * @param location
 	 *            the location to consider
 	 * @return <code>true</code> if we should do an extra step,
@@ -1886,7 +1886,7 @@
 	 * Determines if a user did a step into and stepped through filtered code.
 	 * In this case, do a step return if the user has requested not to step thru
 	 * to an unfiltered location.
-	 * 
+	 *
 	 * @return <code>true</code> if we should do a step return
 	 * @throws DebugException
 	 *             if an exception occurs
@@ -1902,7 +1902,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
 	 */
 	@Override
@@ -1929,7 +1929,7 @@
 	 * Prepares to suspend this thread as requested by a client. Terminates any
 	 * current evaluation (to stop after next instruction). Waits for any method
 	 * invocations to complete.
-	 * 
+	 *
 	 * @throws DebugException
 	 *             if thread does not suspend before timeout
 	 */
@@ -1949,9 +1949,9 @@
 				}
 				// wait for termination to complete
 				int timeout = Platform.getPreferencesService().getInt(
-						JDIDebugPlugin.getUniqueIdentifier(), 
-						JDIDebugModel.PREF_REQUEST_TIMEOUT, 
-						JDIDebugModel.DEF_REQUEST_TIMEOUT, 
+						JDIDebugPlugin.getUniqueIdentifier(),
+						JDIDebugModel.PREF_REQUEST_TIMEOUT,
+						JDIDebugModel.DEF_REQUEST_TIMEOUT,
 						null);
 				try {
 					fEvaluationLock.wait(timeout);
@@ -1969,9 +1969,9 @@
 		synchronized (fInvocationLock) {
 			if (isInvokingMethod()) {
 				int timeout = Platform.getPreferencesService().getInt(
-						JDIDebugPlugin.getUniqueIdentifier(), 
-						JDIDebugModel.PREF_REQUEST_TIMEOUT, 
-						JDIDebugModel.DEF_REQUEST_TIMEOUT, 
+						JDIDebugPlugin.getUniqueIdentifier(),
+						JDIDebugModel.PREF_REQUEST_TIMEOUT,
+						JDIDebugModel.DEF_REQUEST_TIMEOUT,
 						null);
 				try {
 					fInvocationLock.wait(timeout);
@@ -2005,9 +2005,9 @@
 				try {
 					fThread.suspend();
 					int timeout = Platform.getPreferencesService().getInt(
-							JDIDebugPlugin.getUniqueIdentifier(), 
-							JDIDebugModel.PREF_REQUEST_TIMEOUT, 
-							JDIDebugModel.DEF_REQUEST_TIMEOUT, 
+							JDIDebugPlugin.getUniqueIdentifier(),
+							JDIDebugModel.PREF_REQUEST_TIMEOUT,
+							JDIDebugModel.DEF_REQUEST_TIMEOUT,
 							null);
 					long stop = System.currentTimeMillis() + timeout;
 					boolean suspended = isUnderlyingThreadSuspended();
@@ -2062,7 +2062,7 @@
 
 	/**
 	 * Notifies this thread that is about to be resumed due to a VM resume.
-	 * 
+	 *
 	 * @throws DebugException
 	 *             if an exception occurs
 	 */
@@ -2103,10 +2103,10 @@
 
 	/**
 	 * Drops to the given stack frame
-	 * 
+	 *
 	 * @param frame
 	 *            the stack frame to try dropping to
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
 	 *                <ul>
@@ -2187,7 +2187,7 @@
 	 * to step over/return in the non-top stack frame. This method is
 	 * synchronized, such that the step request begins before a background
 	 * evaluation can be performed.
-	 * 
+	 *
 	 * @param frame
 	 *            the stack frame to try and step to
 	 * @exception DebugException
@@ -2220,7 +2220,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaThread#findVariable(java.lang.String)
 	 */
@@ -2260,7 +2260,7 @@
 	/**
 	 * Returns this thread on the underlying VM which this model thread is a
 	 * proxy to.
-	 * 
+	 *
 	 * @return underlying thread
 	 */
 	public ThreadReference getUnderlyingThread() {
@@ -2269,7 +2269,7 @@
 
 	/**
 	 * Sets the underlying thread that this model object is a proxy to.
-	 * 
+	 *
 	 * @param thread
 	 *            underlying thread on target VM
 	 */
@@ -2279,7 +2279,7 @@
 
 	/**
 	 * Returns this thread's underlying thread group.
-	 * 
+	 *
 	 * @return thread group
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -2325,7 +2325,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#isPerformingEvaluation()
 	 */
 	@Override
@@ -2335,7 +2335,7 @@
 
 	/**
 	 * Returns whether this thread is currently performing a method invocation
-	 * 
+	 *
 	 * @return if the thread is currently invoking a method
 	 */
 	public boolean isInvokingMethod() {
@@ -2344,7 +2344,7 @@
 
 	/**
 	 * Returns whether this thread is currently ignoring breakpoints.
-	 * 
+	 *
 	 * @return if the thread is currently ignoring breakpoints
 	 */
 	public boolean isIgnoringBreakpoints() {
@@ -2354,7 +2354,7 @@
 
 	/**
 	 * Returns whether a client has requested the target/thread to suspend.
-	 * 
+	 *
 	 * @return whether a client has requested the target/thread to suspend
 	 */
 	public boolean hasClientRequestedSuspend() {
@@ -2364,7 +2364,7 @@
 	/**
 	 * Sets whether this thread is currently invoking a method. Notifies any
 	 * threads waiting for the method invocation lock
-	 * 
+	 *
 	 * @param invoking
 	 *            whether this thread is currently invoking a method
 	 */
@@ -2379,7 +2379,7 @@
 
 	/**
 	 * Sets the step handler currently handling a step request.
-	 * 
+	 *
 	 * @param handler
 	 *            the current step handler, or <code>null</code> if none
 	 */
@@ -2390,7 +2390,7 @@
 	/**
 	 * Returns the step handler currently handling a step request, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @return step handler, or <code>null</code> if none
 	 */
 	protected StepHandler getPendingStepHandler() {
@@ -2419,7 +2419,7 @@
 		 * thread.
 		 * </p>
 		 * Note this method does nothing if this thread has no stack frames.
-		 * 
+		 *
 		 * @exception DebugException
 		 *                if this method fails. Reasons include:
 		 *                <ul>
@@ -2457,7 +2457,7 @@
 		 * Resumes the underlying thread to initiate the step. By default the
 		 * thread is resumed. Step handlers that require other actions can
 		 * override this method.
-		 * 
+		 *
 		 * @exception DebugException
 		 *                if this method fails. Reasons include:
 		 *                <ul>
@@ -2485,7 +2485,7 @@
 		 * Creates and returns a step request specific to this step handler.
 		 * Subclasses must override <code>getStepKind()</code> to return the
 		 * kind of step it implements.
-		 * 
+		 *
 		 * @return step request
 		 * @exception DebugException
 		 *                if this method fails. Reasons include:
@@ -2501,7 +2501,7 @@
 
 		/**
 		 * Creates and returns a step request of the specified kind.
-		 * 
+		 *
 		 * @param kind
 		 *            of <code>StepRequest.STEP_INTO</code>,
 		 *            <code>StepRequest.STEP_OVER</code>,
@@ -2529,7 +2529,7 @@
 				request.addCountFilter(1);
 				attachFiltersToStepRequest(request);
 				request.enable();
-				
+
 				if (manager.virtualMachine().canGetMethodReturnValues() && showStepResultIsEnabled()) {
 					if (fCurrentMethodExitRequest != null) {
 						removeJDIEventListener(this, fCurrentMethodExitRequest);
@@ -2620,7 +2620,7 @@
 
 		/**
 		 * Returns the kind of step this handler implements.
-		 * 
+		 *
 		 * @return one of <code>StepRequest.STEP_INTO</code>,
 		 *         <code>StepRequest.STEP_OVER</code>,
 		 *         <code>StepRequest.STEP_OUT</code>
@@ -2629,7 +2629,7 @@
 
 		/**
 		 * Returns the detail for this step event.
-		 * 
+		 *
 		 * @return one of <code>DebugEvent.STEP_INTO</code>,
 		 *         <code>DebugEvent.STEP_OVER</code>,
 		 *         <code>DebugEvent.STEP_RETURN</code>
@@ -2640,7 +2640,7 @@
 		 * Sets the step request created by this handler in the underlying VM.
 		 * Set to <code>null<code> when
 		 * this handler deletes its request.
-		 * 
+		 *
 		 * @param request
 		 *            step request
 		 */
@@ -2651,7 +2651,7 @@
 		/**
 		 * Returns the step request created by this handler in the underlying
 		 * VM.
-		 * 
+		 *
 		 * @return step request
 		 */
 		protected StepRequest getStepRequest() {
@@ -2706,7 +2706,7 @@
 		/**
 		 * If step filters are currently switched on and the current location is
 		 * not a filtered location, set all active filters on the step request.
-		 * 
+		 *
 		 * @param request
 		 *            the request to augment
 		 */
@@ -2745,7 +2745,7 @@
 		 * Returns whether this step handler should use step filters when
 		 * creating its step request. By default, step filters can be used by
 		 * any step request. Subclasses must override if/when required.
-		 * 
+		 *
 		 * @return whether this step handler should use step filters when
 		 *         creating its step request
 		 */
@@ -2757,7 +2757,7 @@
 		 * Notification the step request has completed. If the current location
 		 * matches one of the user-specified step filter criteria (e.g.,
 		 * synthetic methods, static initializers), then continue stepping.
-		 * 
+		 *
 		 * @see IJDIEventListener#handleEvent(Event, JDIDebugTarget, boolean,
 		 *      EventSet)
 		 */
@@ -2857,7 +2857,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.jdt.internal.debug.core.IJDIEventListener#eventSetComplete
 		 * (com.sun.jdi.event.Event,
@@ -2874,7 +2874,7 @@
 		 * that the user has indicated (via the step filter preferences) should
 		 * be filtered and the step was not initiated from a filtered location.
 		 * Returns <code>false</code> otherwise.
-		 * 
+		 *
 		 * @param location
 		 *            the location to check
 		 * @return if the given {@link Location} should be filtered
@@ -2896,11 +2896,11 @@
 		 * Returns <code>true</code> if the StepEvent's Location is a Method
 		 * that the user has indicated (via the step filter preferences) should
 		 * be filtered. Returns <code>false</code> otherwise.
-		 * 
+		 *
 		 * @param method
 		 *            the {@link Method} location to check
 		 * @param orig
-		 *            <code>true</code> if the {@link Method} {@link Location} is the JDI Location 
+		 *            <code>true</code> if the {@link Method} {@link Location} is the JDI Location
 		 *         from which an original user-requested step began, <code>false</code> otherwise
 		 * @return <code>true</code> if the {@link Method} {@link Location}
 		 *         should be filtered, <code>false</code> otherwise
@@ -2936,7 +2936,7 @@
 		 * <li>The step request is deleted and removed as and event listener</li>
 		 * <li>A suspend event is fired</li>
 		 * </ul>
-		 * 
+		 *
 		 * @param set
 		 *            the remaining {@link EventSet} to queue
 		 */
@@ -2956,7 +2956,7 @@
 		 * suspended threads. When a step is initiated it is registered with its
 		 * thread as a pending step. A pending step could be cancelled if a
 		 * breakpoint suspends execution during the step.
-		 * 
+		 *
 		 * @exception DebugException
 		 *                if this method fails. Reasons include:
 		 *                <ul>
@@ -2976,7 +2976,7 @@
 		 * suspended threads. When a step is initiated it is registered with its
 		 * thread as a pending step. A pending step could be cancelled if a
 		 * breakpoint suspends execution during the step.
-		 * 
+		 *
 		 * @param kind
 		 *            of <code>StepRequest.STEP_INTO</code>,
 		 *            <code>StepRequest.STEP_OVER</code>,
@@ -3017,7 +3017,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * getStepKind()
 		 */
@@ -3028,7 +3028,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * getStepDetail()
 		 */
@@ -3045,7 +3045,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * getStepKind()
 		 */
@@ -3056,7 +3056,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * getStepDetail()
 		 */
@@ -3073,7 +3073,7 @@
 	protected class StepReturnHandler extends StepHandler {
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * locationShouldBeFiltered(com.sun.jdi.Location)
 		 */
@@ -3090,7 +3090,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * getStepKind()
 		 */
@@ -3101,7 +3101,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see org.eclipse.jdt.internal.debug.core.model.JDIThread.StepHandler#
 		 * getStepDetail()
 		 */
@@ -3126,7 +3126,7 @@
 		/**
 		 * Constructs a step handler to step until the specified stack frame is
 		 * reached.
-		 * 
+		 *
 		 * @param frame
 		 *            the stack frame to step to
 		 * @exception DebugException
@@ -3145,7 +3145,7 @@
 		/**
 		 * Sets the number of frames that should be remaining on the stack when
 		 * done.
-		 * 
+		 *
 		 * @param num
 		 *            number of remaining frames
 		 */
@@ -3156,7 +3156,7 @@
 		/**
 		 * Returns number of frames that should be remaining on the stack when
 		 * done
-		 * 
+		 *
 		 * @return number of frames that should be left
 		 */
 		protected int getRemainingFrames() {
@@ -3167,7 +3167,7 @@
 		 * Notification the step request has completed. If in the desired frame,
 		 * complete the step request normally. If not in the desired frame,
 		 * another step request is created and this thread is resumed.
-		 * 
+		 *
 		 * @see IJDIEventListener#handleEvent(Event, JDIDebugTarget, boolean,
 		 *      EventSet)
 		 */
@@ -3207,7 +3207,7 @@
 
 		/**
 		 * Constructs a handler to drop to the specified stack frame.
-		 * 
+		 *
 		 * @param frame
 		 *            the stack frame to drop to
 		 * @exception DebugException
@@ -3225,7 +3225,7 @@
 
 		/**
 		 * Sets the number of frames to pop off the stack.
-		 * 
+		 *
 		 * @param num
 		 *            number of frames to pop
 		 */
@@ -3235,7 +3235,7 @@
 
 		/**
 		 * Returns the number of frames to pop off the stack.
-		 * 
+		 *
 		 * @return remaining number of frames to pop
 		 */
 		protected int getFramesToDrop() {
@@ -3246,7 +3246,7 @@
 		 * To drop a frame or re-enter, the underlying thread is instructed to
 		 * do a return. When the frame count is less than zero, the step being
 		 * performed is a "step return", so a regular invocation is performed.
-		 * 
+		 *
 		 * @throws DebugException
 		 *             if an exception occurs
 		 */
@@ -3274,7 +3274,7 @@
 		 * pop, keep going, otherwise re-enter the top frame. Returns false, as
 		 * this handler will resume this thread with a special invocation (
 		 * <code>doReturn</code>).
-		 * 
+		 *
 		 * @see IJDIEventListener#handleEvent(Event, JDIDebugTarget, boolean,
 		 *      EventSet)
 		 * @see #invokeThread()
@@ -3301,7 +3301,7 @@
 		/**
 		 * Pops a secondary frame off the stack, does a re-enter, or a
 		 * step-into.
-		 * 
+		 *
 		 * @exception DebugException
 		 *                if this method fails. Reasons include:
 		 *                <ul>
@@ -3321,7 +3321,7 @@
 		 * Creates and returns a step request. If there are no more frames to
 		 * drop, a re-enter request is made. If the re-enter is complete, a
 		 * step-into request is created.
-		 * 
+		 *
 		 * @return step request
 		 * @exception DebugException
 		 *                if this method fails. Reasons include:
@@ -3492,7 +3492,7 @@
 		public ThreadJob(JDIThread thread) {
 			super(JDIDebugModelMessages.JDIThread_39);
 			fJDIThread = thread;
-			fRunnables = new Vector<Runnable>(5);
+			fRunnables = new Vector<>(5);
 			setSystem(true);
 		}
 
@@ -3561,7 +3561,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.debug.core.IJavaThread#stop(org.eclipse.jdt.debug.core
 	 * .IJavaObject)
@@ -3579,7 +3579,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#getThreadGroup()
 	 */
 	@Override
@@ -3593,7 +3593,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#getFrameCount()
 	 */
 	@Override
@@ -3627,7 +3627,7 @@
 	 * Implementation of a scheduling rule for this thread, which defines how it
 	 * should behave when a request for content job tries to run while the
 	 * thread is evaluating
-	 * 
+	 *
 	 * @since 3.3.0
 	 */
 	class SerialPerObjectRule implements ISchedulingRule {
@@ -3640,7 +3640,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse
 		 * .core.runtime.jobs.ISchedulingRule)
@@ -3652,7 +3652,7 @@
 
 		/*
 		 * (non-Javadoc)
-		 * 
+		 *
 		 * @see
 		 * org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse
 		 * .core.runtime.jobs.ISchedulingRule)
@@ -3671,9 +3671,9 @@
 	/**
 	 * returns the scheduling rule for getting content while evaluations are
 	 * running
-	 * 
+	 *
 	 * @return the <code>ISchedulingRule</code> for this thread
-	 * 
+	 *
 	 * @since 3.3.0
 	 */
 	public ISchedulingRule getThreadRule() {
@@ -3693,7 +3693,7 @@
 
 	/**
 	 * Returns whether a suspend vote is currently in progress.
-	 * 
+	 *
 	 * @return whether a suspend vote is currently in progress
 	 */
 	public synchronized boolean isSuspendVoteInProgress() {
@@ -3702,7 +3702,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThread#getThreadObject()
 	 */
 	@Override
@@ -3710,7 +3710,7 @@
 		return (IJavaObject) JDIValue
 				.createValue(getJavaDebugTarget(), fThread);
 	}
-	
+
 	protected StepIntoHandler createStepIntoHandler() {
         return new StepIntoHandler();
     }
@@ -3722,16 +3722,16 @@
     protected StepReturnHandler createStepReturnHandler() {
         return new StepReturnHandler();
     }
-    
+
     protected StepToFrameHandler createStepToFrameHandler(IStackFrame stackFrame) throws DebugException {
         return new StepToFrameHandler(stackFrame);
     }
-    
+
     protected DropToFrameHandler createDropToFrameHandler(IStackFrame stackFrame) throws DebugException {
         return new DropToFrameHandler(stackFrame);
     }
 	public static boolean showStepResultIsEnabled() {
 		return Platform.getPreferencesService().getBoolean(JDIDebugPlugin.getUniqueIdentifier(), JDIDebugModel.PREF_SHOW_STEP_RESULT, true, null);
 	}
-   
+
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThreadGroup.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThreadGroup.java
index 56ee382..124c893 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThreadGroup.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThreadGroup.java
@@ -25,7 +25,7 @@
 
 /**
  * @since 3.2
- * 
+ *
  */
 public class JDIThreadGroup extends JDIDebugElement implements
 		IJavaThreadGroup, ITerminate {
@@ -36,7 +36,7 @@
 	/**
 	 * Constructs a new thread group in the given target based on the underlying
 	 * thread group reference.
-	 * 
+	 *
 	 * @param target
 	 *            debug target
 	 * @param group
@@ -49,14 +49,14 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThreadGroup#getThreads()
 	 */
 	@Override
 	public synchronized IJavaThread[] getThreads() throws DebugException {
 		try {
 			List<ThreadReference> threads = fGroup.threads();
-			List<JDIThread> modelThreads = new ArrayList<JDIThread>(threads.size());
+			List<JDIThread> modelThreads = new ArrayList<>(threads.size());
 			Iterator<ThreadReference> iterator = threads.iterator();
 			while (iterator.hasNext()) {
 				ThreadReference ref = iterator.next();
@@ -78,7 +78,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThreadGroup#getThreadGroup()
 	 */
 	@Override
@@ -96,14 +96,14 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThreadGroup#getThreadGroups()
 	 */
 	@Override
 	public IJavaThreadGroup[] getThreadGroups() throws DebugException {
 		try {
 			List<ThreadGroupReference> groups = fGroup.threadGroups();
-			List<JDIThreadGroup> modelGroups = new ArrayList<JDIThreadGroup>(groups.size());
+			List<JDIThreadGroup> modelGroups = new ArrayList<>(groups.size());
 			Iterator<ThreadGroupReference> iterator = groups.iterator();
 			while (iterator.hasNext()) {
 				ThreadGroupReference ref = iterator
@@ -126,7 +126,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThreadGroup#getName()
 	 */
 	@Override
@@ -147,7 +147,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThreadGroup#hasThreadGroups()
 	 */
 	@Override
@@ -163,7 +163,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaThreadGroup#hasThreads()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIType.java
index 518062c..2d03ea9 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIType.java
@@ -36,7 +36,7 @@
 	/**
 	 * Constructs a new type based on the specified underlying type, in the
 	 * given debug target
-	 * 
+	 *
 	 * @param target
 	 *            the debug target this type originated from
 	 * @param type
@@ -49,7 +49,7 @@
 
 	/**
 	 * Throws a new debug exception with the given status code.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -81,7 +81,7 @@
 	 * <code>TARGET_REQUEST_FAILED</code> with the given underlying exception.
 	 * If the underlying exception is not a JDI exception, the original
 	 * exception is thrown.
-	 * 
+	 *
 	 * @param message
 	 *            Failure message
 	 * @param e
@@ -137,7 +137,7 @@
 
 	/**
 	 * Returns the underlying type on the VM.
-	 * 
+	 *
 	 * @return the underlying type on the VM
 	 */
 	public Type getUnderlyingType() {
@@ -146,7 +146,7 @@
 
 	/**
 	 * Sets the underlying type on the VM.
-	 * 
+	 *
 	 * @param type
 	 *            the underlying type on the VM
 	 */
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIValue.java
index 4167da0..c81761a 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIValue.java
@@ -39,7 +39,7 @@
 
 /**
  * Represents the value of a java variable
- * 
+ *
  * @see IJavaValue
  */
 public class JDIValue extends JDIDebugElement implements IJavaValue {
@@ -56,14 +56,14 @@
 	 * When created for a logical structure we hold onto the original
 	 * non-logical value for purposes of equality. This way a logical
 	 * structure's children remain more stable in the variables view.
-	 * 
+	 *
 	 * This is <code>null</code> when not created for a logical structure.
 	 */
 	protected IJavaValue fLogicalParent;
 
 	/**
 	 * Constructor
-	 * 
+	 *
 	 * @param target
 	 *            debug target that this value belongs to
 	 * @param value
@@ -76,7 +76,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see
 	 * org.eclipse.jdt.internal.debug.core.model.JDIDebugElement#getAdapter(
 	 * java.lang.Class)
@@ -230,7 +230,7 @@
 	/**
 	 * Returns a list of variables that are children of this value. The result
 	 * is cached.
-	 * 
+	 *
 	 * @return list of variable children
 	 * @throws DebugException
 	 */
@@ -239,7 +239,7 @@
 			return fVariables;
 		} else if (fValue instanceof ObjectReference) {
 			ObjectReference object = (ObjectReference) fValue;
-			fVariables = new ArrayList<IJavaVariable>();
+			fVariables = new ArrayList<>();
 			if (isArray()) {
 				try {
 					int length = getArrayLength();
@@ -383,7 +383,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#getGenericSignature()
 	 */
 	@Override
@@ -443,7 +443,7 @@
 
 	/**
 	 * Returns this value's underlying type.
-	 * 
+	 *
 	 * @return type
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
@@ -484,7 +484,7 @@
 	/**
 	 * Sets the value that is the original non-logical value that this child
 	 * value was computed for.
-	 * 
+	 *
 	 * @param logicalParent
 	 *            parent value
 	 */
@@ -495,7 +495,7 @@
 	/**
 	 * Returns the value that is the original non-logical value that this child
 	 * value was computed for or <code>null</code> if none
-	 * 
+	 *
 	 * @param logicalParent
 	 *            parent value or <code>null</code>
 	 */
@@ -505,7 +505,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.jdt.debug.core.IJavaValue#isNull()
 	 */
 	@Override
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVariable.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVariable.java
index 8f092ec..f9e2ef4 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVariable.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVariable.java
@@ -63,7 +63,7 @@
 	 * Returns this variable's current underlying jdi value. Subclasses must
 	 * implement #retrieveValue() and do not need to guard against JDI
 	 * exceptions, as this method handles them.
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if unable to access the value
 	 */
@@ -88,7 +88,7 @@
 	/**
 	 * Returns the current value of this variable. The value is cached, but on
 	 * each access we see if the value has changed and update if required.
-	 * 
+	 *
 	 * @see IVariable#getValue()
 	 */
 	@Override
@@ -230,9 +230,9 @@
 
 	/**
 	 * Returns the underlying type of this variable
-	 * 
+	 *
 	 * @return the underlying type of this variable
-	 * 
+	 *
 	 * @exception DebugException
 	 *                if this method fails. Reasons include:
 	 *                <ul>
@@ -257,7 +257,7 @@
 
 	/**
 	 * Sets this variable's change counter to the specified value
-	 * 
+	 *
 	 * @param count
 	 *            new value
 	 */
@@ -268,7 +268,7 @@
 	/**
 	 * Returns this variable's change counter. This corresponds to the last time
 	 * this variable changed.
-	 * 
+	 *
 	 * @return this variable's change counter
 	 */
 	protected int getChangeCount() {
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVoidType.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVoidType.java
index d22fa33..fc58571 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVoidType.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIVoidType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/Timer.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/Timer.java
index d8e21e4..1ee2291 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/Timer.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/Timer.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -12,7 +12,7 @@
 
 /**
  * A timer notifies listeners when a specific amount of time has passed.
- * 
+ *
  * @see ITimeoutListener
  */
 public class Timer {
@@ -79,7 +79,7 @@
 	 * passed. A call to <code>stop</code>, before the time expires, will cancel
 	 * the the timer and timeout callback. This method can only be called if
 	 * this timer is idle (i.e. <code>isStarted() == false<code>).
-	 * 
+	 *
 	 * @param listener
 	 *            The timer listener
 	 * @param ms
@@ -121,7 +121,7 @@
 
 	/**
 	 * Returns whether this timer's thread is alive
-	 * 
+	 *
 	 * @return whether this timer's thread is alive
 	 */
 	private boolean isAlive() {
@@ -131,7 +131,7 @@
 	/**
 	 * Sets whether this timer's thread is alive. When set to <code>false</code>
 	 * this timer's thread will exit on its next iteration.
-	 * 
+	 *
 	 * @param alive
 	 *            whether this timer's thread should be alive
 	 * @see #dispose()
@@ -142,7 +142,7 @@
 
 	/**
 	 * Returns the current timeout listener
-	 * 
+	 *
 	 * @return timeout listener
 	 */
 	protected ITimeoutListener getListener() {
@@ -151,7 +151,7 @@
 
 	/**
 	 * Sets the listener to be notified if this timer times out.
-	 * 
+	 *
 	 * @param listener
 	 *            timeout listener
 	 */
@@ -162,7 +162,7 @@
 	/**
 	 * Returns whether this timer has been started, and has not yet timed out,
 	 * or been stopped.
-	 * 
+	 *
 	 * @return whether this timer has been started, and has not yet timed out,
 	 *         or been stopped
 	 */
@@ -173,7 +173,7 @@
 	/**
 	 * Sets whether this timer has been started, and has not yet timed out, or
 	 * been stopped.
-	 * 
+	 *
 	 * @param started
 	 *            whether this timer has been started, and has not yet timed
 	 *            out, or been stopped
@@ -184,7 +184,7 @@
 
 	/**
 	 * Returns this timer's thread
-	 * 
+	 *
 	 * @return thread that waits for a timeout
 	 */
 	private Thread getThread() {
@@ -193,7 +193,7 @@
 
 	/**
 	 * Sets this timer's thread used to perform timeout processing
-	 * 
+	 *
 	 * @param thread
 	 *            thread that waits for a timeout
 	 */
@@ -204,7 +204,7 @@
 	/**
 	 * Returns the amount of time, in milliseconds, that this timer is/was
 	 * waiting for.
-	 * 
+	 *
 	 * @return timeout value, in milliseconds
 	 */
 	protected int getTimeout() {
@@ -214,7 +214,7 @@
 	/**
 	 * Sets the amount of time, in milliseconds, that this timer will wait for
 	 * before timing out.
-	 * 
+	 *
 	 * @param timeout
 	 *            value, in milliseconds
 	 */
diff --git a/org.eclipse.jdt.launching/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jdt.launching/.settings/org.eclipse.jdt.ui.prefs
index 69f7753..c9192ac 100644
--- a/org.eclipse.jdt.launching/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.jdt.launching/.settings/org.eclipse.jdt.ui.prefs
@@ -68,10 +68,12 @@
 sp_cleanup.always_use_parentheses_in_expressions=false
 sp_cleanup.always_use_this_for_non_static_field_access=false
 sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
 sp_cleanup.convert_to_enhanced_for_loop=false
 sp_cleanup.correct_indentation=false
 sp_cleanup.format_source_code=true
 sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.insert_inferred_type_arguments=false
 sp_cleanup.make_local_variable_final=false
 sp_cleanup.make_parameters_final=false
 sp_cleanup.make_private_fields_final=true
@@ -87,7 +89,8 @@
 sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
@@ -100,8 +103,10 @@
 sp_cleanup.remove_unused_private_types=true
 sp_cleanup.sort_members=false
 sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
 sp_cleanup.use_blocks=true
 sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
 sp_cleanup.use_parentheses_in_expressions=false
 sp_cleanup.use_this_for_non_static_field_access=false
 sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/AbstractRuntimeClasspathEntry.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/AbstractRuntimeClasspathEntry.java
index 10c64fb..1185ae0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/AbstractRuntimeClasspathEntry.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/AbstractRuntimeClasspathEntry.java
@@ -4,10 +4,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
@@ -36,7 +36,7 @@
  * @since 3.0
  */
 public abstract class AbstractRuntimeClasspathEntry extends PlatformObject implements IRuntimeClasspathEntry2 {
-	
+
 	private IPath sourceAttachmentPath = null;
 	private IPath rootSourcePath = null;
 	private IPath externalAnnotationsPath = null;
@@ -46,20 +46,20 @@
 	 * Associated Java project, or <code>null</code>
 	 */
 	private IJavaProject fJavaProject;
-	
+
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>false</code>.
 	 * Subclasses should override if required.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.internal.launching.IRuntimeClasspathEntry2#isComposite()
 	 */
 	@Override
 	public boolean isComposite() {
 		return false;
 	}
-	
-	/** 
+
+	/**
 	 * Default implementation returns an empty collection.
 	 * Subclasses should override if required.
 	 * @return the array of entries
@@ -69,10 +69,10 @@
 	public IRuntimeClasspathEntry[] getRuntimeClasspathEntries() throws CoreException {
 		return new IRuntimeClasspathEntry[0];
 	}
-	
+
 	/**
 	 * Throws an exception with the given message and underlying exception.
-	 * 
+	 *
 	 * @param message error message
 	 * @param exception underlying exception or <code>null</code> if none
 	 * @throws CoreException the new {@link CoreException}
@@ -83,12 +83,12 @@
 	}
 
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation generates a string containing an XML
 	 * document. Subclasses should override <code>buildMemento</code>
 	 * to specify the contents of the required <code>memento</code>
 	 * node.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getMemento()
 	 */
 	@Override
@@ -102,42 +102,42 @@
 		buildMemento(doc, memento);
 		return DebugPlugin.serializeDocument(doc);
 	}
-	
+
 	/**
-	 * Constructs a memento for this classpath entry in the given 
+	 * Constructs a memento for this classpath entry in the given
 	 * document and element. The memento element has already been
 	 * appended to the document.
-	 * 
+	 *
 	 * @param document XML document
 	 * @param memento element node for client specific attributes
-	 * @throws CoreException if unable to create a memento 
+	 * @throws CoreException if unable to create a memento
 	 */
 	protected abstract void buildMemento(Document document, Element memento) throws CoreException;
-	
+
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getPath()
 	 */
 	@Override
 	public IPath getPath() {
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getResource()
 	 */
 	@Override
 	public IResource getResource() {
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getSourceAttachmentPath()
 	 */
@@ -191,19 +191,19 @@
 		classpathProperty = property;
 	}
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getLocation()
 	 */
 	@Override
 	public String getLocation() {
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getSourceAttachmentLocation()
@@ -213,7 +213,7 @@
 		return null;
 	}
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getSourceAttachmentRootLocation()
@@ -223,10 +223,10 @@
 		return null;
 	}
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getVariableName()
 	 */
 	@Override
@@ -234,10 +234,10 @@
 		return null;
 	}
 	/* (non-Javadoc)
-	 * 
+	 *
 	 * Default implementation returns <code>null</code>.
 	 * Subclasses should override if required.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getClasspathEntry()
 	 */
 	@Override
@@ -251,10 +251,10 @@
 	public IJavaProject getJavaProject() {
 		return fJavaProject;
 	}
-	
+
 	/**
 	 * Sets the Java project associated with this entry.
-	 * 
+	 *
 	 * @param javaProject the Java project context
 	 */
 	protected void setJavaProject(IJavaProject javaProject) {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathContainerSourceContainerTypeDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathContainerSourceContainerTypeDelegate.java
index e84db9e..69ccf9d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathContainerSourceContainerTypeDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathContainerSourceContainerTypeDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
 
 /**
  * Classpath container source container type.
- * 
+ *
  * @since 3.0
  */
 public class ClasspathContainerSourceContainerTypeDelegate extends AbstractSourceContainerTypeDelegate {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#createSourceContainer(java.lang.String)
 	 */
@@ -37,13 +37,13 @@
 			if ("classpathContainer".equals(element.getNodeName())) { //$NON-NLS-1$
 				String string = element.getAttribute("path"); //$NON-NLS-1$
 				if (string == null || string.length() == 0) {
-					abort(LaunchingMessages.ClasspathContainerSourceContainerTypeDelegate_5, null); 
+					abort(LaunchingMessages.ClasspathContainerSourceContainerTypeDelegate_5, null);
 				}
 				return new ClasspathContainerSourceContainer(new Path(string));
-			} 
-			abort(LaunchingMessages.ClasspathContainerSourceContainerTypeDelegate_6, null); 
+			}
+			abort(LaunchingMessages.ClasspathContainerSourceContainerTypeDelegate_6, null);
 		}
-		abort(LaunchingMessages.ClasspathContainerSourceContainerTypeDelegate_7, null); 
+		abort(LaunchingMessages.ClasspathContainerSourceContainerTypeDelegate_7, null);
 		return null;
 	}
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathVariableSourceContainerTypeDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathVariableSourceContainerTypeDelegate.java
index a7750ca..146bff0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathVariableSourceContainerTypeDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathVariableSourceContainerTypeDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,11 +21,11 @@
 
 /**
  * Classpath variable source container type.
- * 
+ *
  * @since 3.0
  */
 public class ClasspathVariableSourceContainerTypeDelegate extends AbstractSourceContainerTypeDelegate {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#createSourceContainer(java.lang.String)
 	 */
@@ -37,13 +37,13 @@
 			if ("classpathVariable".equals(element.getNodeName())) { //$NON-NLS-1$
 				String string = element.getAttribute("path"); //$NON-NLS-1$
 				if (string == null || string.length() == 0) {
-					abort(LaunchingMessages.ClasspathVariableSourceContainerTypeDelegate_5, null); 
+					abort(LaunchingMessages.ClasspathVariableSourceContainerTypeDelegate_5, null);
 				}
 				return new ClasspathVariableSourceContainer(new Path(string));
-			} 
-			abort(LaunchingMessages.ClasspathVariableSourceContainerTypeDelegate_6, null); 
+			}
+			abort(LaunchingMessages.ClasspathVariableSourceContainerTypeDelegate_6, null);
 		}
-		abort(LaunchingMessages.ClasspathVariableSourceContainerTypeDelegate_7, null); 
+		abort(LaunchingMessages.ClasspathVariableSourceContainerTypeDelegate_7, null);
 		return null;
 	}
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CompositeId.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CompositeId.java
index 26f280f..12c0424 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CompositeId.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CompositeId.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,13 +17,13 @@
  */
 public class CompositeId {
 	private String[] fParts;
-	
+
 	public CompositeId(String[] parts) {
 		fParts= parts;
 	}
-	
+
 	public static CompositeId fromString(String idString) {
-		ArrayList<String> parts= new ArrayList<String>();
+		ArrayList<String> parts= new ArrayList<>();
 		int commaIndex= idString.indexOf(',');
 		while (commaIndex > 0) {
 			int length= Integer.valueOf(idString.substring(0, commaIndex)).intValue();
@@ -35,7 +35,7 @@
 		String[] result= parts.toArray(new String[parts.size()]);
 		return new CompositeId(result);
 	}
-	
+
 	@Override
 	public String toString() {
 		StringBuffer buf= new StringBuffer();
@@ -46,11 +46,11 @@
 		}
 		return buf.toString();
 	}
-	
+
 	public String get(int index) {
 		return fParts[index];
 	}
-	
+
 	public int getPartCount() {
 		return fParts.length;
 	}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultEntryResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultEntryResolver.java
index d9ed7e1..c2a33ed 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultEntryResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultEntryResolver.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -34,7 +34,7 @@
 	public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, ILaunchConfiguration configuration) throws CoreException {
 		IRuntimeClasspathEntry2 entry2 = (IRuntimeClasspathEntry2)entry;
 		IRuntimeClasspathEntry[] entries = entry2.getRuntimeClasspathEntries(configuration);
-		List<IRuntimeClasspathEntry> resolved = new ArrayList<IRuntimeClasspathEntry>();
+		List<IRuntimeClasspathEntry> resolved = new ArrayList<>();
 		for (int i = 0; i < entries.length; i++) {
 			IRuntimeClasspathEntry[] temp = JavaRuntime.resolveRuntimeClasspathEntry(entries[i], configuration);
 			for (int j = 0; j < temp.length; j++) {
@@ -50,7 +50,7 @@
 	public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, IJavaProject project) throws CoreException {
 		IRuntimeClasspathEntry2 entry2 = (IRuntimeClasspathEntry2)entry;
 		IRuntimeClasspathEntry[] entries = entry2.getRuntimeClasspathEntries(null);
-		List<IRuntimeClasspathEntry> resolved = new ArrayList<IRuntimeClasspathEntry>();
+		List<IRuntimeClasspathEntry> resolved = new ArrayList<>();
 		for (int i = 0; i < entries.length; i++) {
 			IRuntimeClasspathEntry[] temp = JavaRuntime.resolveRuntimeClasspathEntry(entries[i], project);
 			for (int j = 0; j < temp.length; j++) {
@@ -59,7 +59,7 @@
 		}
 		return resolved.toArray(new IRuntimeClasspathEntry[resolved.size()]);
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntryResolver#resolveVMInstall(org.eclipse.jdt.core.IClasspathEntry)
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultProjectClasspathEntry.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultProjectClasspathEntry.java
index 7f5e1ee..472fbbd 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultProjectClasspathEntry.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/DefaultProjectClasspathEntry.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,30 +39,30 @@
  */
 @SuppressWarnings("deprecation")
 public class DefaultProjectClasspathEntry extends AbstractRuntimeClasspathEntry {
-	
+
 	public static final String TYPE_ID = "org.eclipse.jdt.launching.classpathentry.defaultClasspath"; //$NON-NLS-1$
-	
+
 	/**
 	 * Whether only exported entries should be on the runtime classpath.
 	 * By default all entries are on the runtime classpath.
 	 */
 	private boolean fExportedEntriesOnly = false;
-	
+
 	/**
 	 * Default constructor need to instantiate extensions
 	 */
 	public DefaultProjectClasspathEntry() {
 	}
-	
+
 	/**
 	 * Constructs a new classpath entry for the given project.
-	 * 
+	 *
 	 * @param project Java project
 	 */
 	public DefaultProjectClasspathEntry(IJavaProject project) {
 		setJavaProject(project);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.launching.AbstractRuntimeClasspathEntry#buildMemento(org.w3c.dom.Document, org.w3c.dom.Element)
 	 */
@@ -71,7 +71,7 @@
 		memento.setAttribute("project", getJavaProject().getElementName()); //$NON-NLS-1$
 		memento.setAttribute("exportedEntriesOnly", Boolean.toString(fExportedEntriesOnly)); //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#initializeFrom(org.w3c.dom.Element)
 	 */
@@ -79,8 +79,8 @@
 	public void initializeFrom(Element memento) throws CoreException {
 		String name = memento.getAttribute("project"); //$NON-NLS-1$
 		if (name == null) {
-			abort(LaunchingMessages.DefaultProjectClasspathEntry_3, null); 
-		}		
+			abort(LaunchingMessages.DefaultProjectClasspathEntry_3, null);
+		}
 		IJavaProject project = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject(name));
 		setJavaProject(project);
 		name = memento.getAttribute("exportedEntriesOnly"); //$NON-NLS-1$
@@ -102,11 +102,11 @@
 	public int getType() {
 		return OTHER;
 	}
-	
+
 	protected IProject getProject() {
 		return getJavaProject().getProject();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getLocation()
 	 */
@@ -114,7 +114,7 @@
 	public String getLocation() {
 		return getProject().getLocation().toOSString();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getPath()
 	 */
@@ -122,7 +122,7 @@
 	public IPath getPath() {
 		return getProject().getFullPath();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getResource()
 	 */
@@ -130,15 +130,15 @@
 	public IResource getResource() {
 		return getProject();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#getRuntimeClasspathEntries(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
 	@Override
 	public IRuntimeClasspathEntry[] getRuntimeClasspathEntries(ILaunchConfiguration configuration) throws CoreException {
 		IClasspathEntry entry = JavaCore.newProjectEntry(getJavaProject().getProject().getFullPath());
-		List<Object> classpathEntries = new ArrayList<Object>(5);
-		List<IClasspathEntry> expanding = new ArrayList<IClasspathEntry>(5);
+		List<Object> classpathEntries = new ArrayList<>(5);
+		List<IClasspathEntry> expanding = new ArrayList<>(5);
 		expandProject(entry, classpathEntries, expanding);
 		IRuntimeClasspathEntry[] runtimeEntries = new IRuntimeClasspathEntry[classpathEntries.size()];
 		for (int i = 0; i < runtimeEntries.length; i++) {
@@ -147,23 +147,23 @@
 				IClasspathEntry cpe = (IClasspathEntry)e;
 				runtimeEntries[i] = new RuntimeClasspathEntry(cpe);
 			} else {
-				runtimeEntries[i] = (IRuntimeClasspathEntry)e;				
+				runtimeEntries[i] = (IRuntimeClasspathEntry)e;
 			}
 		}
 		// remove bootpath entries - this is a default user classpath
-		List<IRuntimeClasspathEntry> ordered = new ArrayList<IRuntimeClasspathEntry>(runtimeEntries.length);
+		List<IRuntimeClasspathEntry> ordered = new ArrayList<>(runtimeEntries.length);
 		for (int i = 0; i < runtimeEntries.length; i++) {
 			if (runtimeEntries[i].getClasspathProperty() == IRuntimeClasspathEntry.USER_CLASSES) {
 				ordered.add(runtimeEntries[i]);
-			} 
+			}
 		}
-		return ordered.toArray(new IRuntimeClasspathEntry[ordered.size()]);		
+		return ordered.toArray(new IRuntimeClasspathEntry[ordered.size()]);
 	}
-	
+
 	/**
 	 * Returns the transitive closure of classpath entries for the
 	 * given project entry.
-	 * 
+	 *
 	 * @param projectEntry project classpath entry
 	 * @param expandedPath a list of entries already expanded, should be empty
 	 * to begin, and contains the result
@@ -188,9 +188,9 @@
 			expandedPath.add(projectEntry);
 			return;
 		}
-		
+
 		IClasspathEntry[] buildPath = project.getRawClasspath();
-		List<IClasspathEntry> unexpandedPath = new ArrayList<IClasspathEntry>(buildPath.length);
+		List<IClasspathEntry> unexpandedPath = new ArrayList<>(buildPath.length);
 		boolean projectAdded = false;
 		for (int i = 0; i < buildPath.length; i++) {
 			IClasspathEntry classpathEntry = buildPath[i];
@@ -233,13 +233,13 @@
 									break;
 								case IClasspathContainer.K_DEFAULT_SYSTEM:
 									property = IRuntimeClasspathEntry.STANDARD_CLASSES;
-									break;	
+									break;
 								case IClasspathContainer.K_SYSTEM:
 									property = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
 									break;
 							}
 							IRuntimeClasspathEntry r = JavaRuntime.newRuntimeContainerClasspathEntry(entry.getPath(), property, project);
-							// check for duplicate/redundant entries 
+							// check for duplicate/redundant entries
 							boolean duplicate = false;
 							ClasspathContainerInitializer initializer = JavaCore.getClasspathContainerInitializer(r.getPath().segment(0));
 							for (int i = 0; i < expandedPath.size(); i++) {
@@ -281,7 +281,7 @@
 							}
 							if (!duplicate) {
 								expandedPath.add(r);
-							}	
+							}
 						}
 						break;
 					case IClasspathEntry.CPE_VARIABLE:
@@ -315,7 +315,7 @@
 			}
 		}
 		return;
-	}	
+	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#isComposite()
 	 */
@@ -331,7 +331,7 @@
 		if (isExportedEntriesOnly()) {
 			return NLS.bind(LaunchingMessages.DefaultProjectClasspathEntry_2, new String[] {getJavaProject().getElementName()});
 		}
-		return NLS.bind(LaunchingMessages.DefaultProjectClasspathEntry_4, new String[] {getJavaProject().getElementName()}); 
+		return NLS.bind(LaunchingMessages.DefaultProjectClasspathEntry_4, new String[] {getJavaProject().getElementName()});
 	}
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
@@ -352,11 +352,11 @@
 	public int hashCode() {
 		return getJavaProject().hashCode();
 	}
-	
+
 	/**
 	 * Sets whether the runtime classpath computation should only
 	 * include exported entries in referenced projects.
-	 * 
+	 *
 	 * @param exportedOnly if the runtime classpath computation should only
 	 * include exported entries in referenced projects.
 	 * @since 3.2
@@ -364,20 +364,20 @@
 	public void setExportedEntriesOnly(boolean exportedOnly) {
 		fExportedEntriesOnly = exportedOnly;
 	}
-	
+
 	/**
 	 * Returns whether the classpath computation only includes exported
 	 * entries in referenced projects.
-	 * 
+	 *
 	 * @return if the classpath computation only includes exported
 	 * entries in referenced projects.
 	 * @since 3.2
 	 */
 	public boolean isExportedEntriesOnly() {
 		return fExportedEntriesOnly | Platform.getPreferencesService().getBoolean(
-				LaunchingPlugin.ID_PLUGIN, 
-				JavaRuntime.PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES, 
-				false, 
+				LaunchingPlugin.ID_PLUGIN,
+				JavaRuntime.PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES,
+				false,
 				null);
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EECompilationParticipant.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EECompilationParticipant.java
index e995b10..246dac1 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EECompilationParticipant.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EECompilationParticipant.java
@@ -36,16 +36,16 @@
 
 /**
  * Creates build path errors related to execution environment bindings.
- * 
+ *
  * @since 3.5
  */
 public class EECompilationParticipant extends CompilationParticipant {
-	
+
 	/**
 	 * A set of projects that have been cleaned. When the build finishes for
 	 * a project that has been cleaned, we check for EE problems.
 	 */
-	private Set<IJavaProject> fCleaned = new HashSet<IJavaProject>();
+	private Set<IJavaProject> fCleaned = new HashSet<>();
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.compiler.CompilationParticipant#isActive(org.eclipse.jdt.core.IJavaProject)
@@ -54,7 +54,7 @@
 	public boolean isActive(IJavaProject project) {
 		return true;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.compiler.CompilationParticipant#cleanStarting(org.eclipse.jdt.core.IJavaProject)
 	 */
@@ -63,7 +63,7 @@
 		super.cleanStarting(project);
 		fCleaned.add(project);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.compiler.CompilationParticipant#buildFinished(org.eclipse.jdt.core.IJavaProject)
 	 */
@@ -91,14 +91,14 @@
 			if (container != null && eeId != null) {
 				IVMInstall vm = JREContainerInitializer.resolveVM(container);
 				validateEnvironment(eeId, project, vm);
-				
+
 			}
 		}
 	}
-	
+
 	/**
 	 * Validates the environment, creating a problem marker for the project as required.
-	 * 
+	 *
 	 * @param id execution environment ID
 	 * @param project associated project
 	 * @param vm VM binding resolved for the project
@@ -139,21 +139,21 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the severity for the specific key from the given {@link IProject},
 	 * or -1 if the problem should be ignored.
 	 * If the project does not have project specific settings, the workspace preference
 	 * is returned. If <code>null</code> is passed in as the project the workspace
 	 * preferences are consulted.
-	 * 
+	 *
 	 * @param prefkey the given preference key
 	 * @param project the given project or <code>null</code>
 	 * @return the severity level for the given preference key or -1
 	 */
 	private int getSeverityLevel(String prefkey, IProject project) {
 		IPreferencesService service = Platform.getPreferencesService();
-		List<IScopeContext> scopes = new ArrayList<IScopeContext>();
+		List<IScopeContext> scopes = new ArrayList<>();
 		scopes.add(InstanceScope.INSTANCE);
 		if(project != null) {
 			scopes.add(new ProjectScope(project));
@@ -172,8 +172,8 @@
 			return IMarker.SEVERITY_INFO;
 		}
 		return -1;
-	}	
-	
+	}
+
 	/**
 	 * creates a problem marker for a JRE container problem
 	 * @param javaProject the {@link IJavaProject}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMInstall.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMInstall.java
index 81dbb42..008e9b5 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMInstall.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMInstall.java
@@ -16,26 +16,26 @@
 
 /**
  * A VM install created from an execution environment description file.
- * 
+ *
  * @since 3.4
  */
 public class EEVMInstall extends StandardVM {
-	
+
 	/**
 	 * Attribute key for Java version property
 	 */
 	public static final String ATTR_JAVA_VERSION = "ATTR_JAVA_VERSION"; //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for supported execution environment by this runtime
 	 */
 	public static final String ATTR_EXECUTION_ENVIRONMENT_ID = "ATTR_EXECUTION_ENVIRONMENT_ID"; //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for Java executable used by this VM
 	 */
 	public static final String ATTR_JAVA_EXE = "ATTR_JAVA_EXE"; //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for VM debug arguments
 	 */
@@ -45,10 +45,10 @@
 	 * Path to file used to define the JRE
 	 */
 	public static final String ATTR_DEFINITION_FILE = "ATTR_DEFINITION_FILE"; //$NON-NLS-1$
-	
+
 	/**
 	 * Constructs a VM install.
-	 * 
+	 *
 	 * @param type vm type
 	 * @param id unique id
 	 */
@@ -75,7 +75,7 @@
 		}
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.launching.StandardVM#getDebugArgs()
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMType.java
index c7883ca..8127345 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/EEVMType.java
@@ -27,11 +27,11 @@
 /**
  * Utility class for Standard VM type. Used to generate/retrieve information for
  * VMs defined by EE property file.
- * 
+ *
  * @since 3.4
  */
 public class EEVMType extends AbstractVMInstallType {
-	
+
 	/**
 	 * VM Type id
 	 */
@@ -42,22 +42,22 @@
 	 * to support absolute path names where needed.
 	 */
 	public static final String VAR_EE_HOME = "${ee.home}"; //$NON-NLS-1$
-	
+
 	private static final String[] REQUIRED_PROPERTIES = new String[]{
 		ExecutionEnvironmentDescription.EXECUTABLE,
 		ExecutionEnvironmentDescription.BOOT_CLASS_PATH,
 		ExecutionEnvironmentDescription.LANGUAGE_LEVEL,
 		ExecutionEnvironmentDescription.JAVA_HOME};
-		
+
 	/**
 	 * Returns the default javadoc location specified in the properties or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param properties properties map
 	 * @return javadoc location specified in the properties or <code>null</code> if none
 	 */
 	public static URL getJavadocLocation(Map<String, String> properties) {
-		String javadoc = getProperty(ExecutionEnvironmentDescription.JAVADOC_LOC, properties); 
+		String javadoc = getProperty(ExecutionEnvironmentDescription.JAVADOC_LOC, properties);
 		if (javadoc != null && javadoc.length() > 0){
 			try{
 				URL url = new URL(javadoc);
@@ -79,18 +79,18 @@
 			return StandardVMType.getDefaultJavadocLocation(version);
 		}
 		return null;
-	}	
+	}
 
 	/**
 	 * Returns the default index location specified in the properties or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param properties properties map
 	 * @return index location specified in the properties or <code>null</code> if none
 	 * @since 3.7.0
 	 */
 	public static URL getIndexLocation(Map<String, String> properties) {
-		String index = getProperty(ExecutionEnvironmentDescription.INDEX_LOC, properties); 
+		String index = getProperty(ExecutionEnvironmentDescription.INDEX_LOC, properties);
 		if (index != null && index.length() > 0){
 			try{
 				URL url = new URL(index);
@@ -109,10 +109,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a status indicating if the given definition file is valid.
-	 * 
+	 *
 	 * @param description definition file
 	 * @return status indicating if the given definition file is valid
 	 */
@@ -131,7 +131,7 @@
 	/**
 	 * Returns the specified property value from the given map, as a {@link String},
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param property the name of the property
 	 * @param properties property map
 	 * @return value or <code>null</code>
@@ -139,7 +139,7 @@
 	private static String getProperty(String property, Map<String, String> properties) {
 		return properties.get(property);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.AbstractVMInstallType#doCreateVMInstall(java.lang.String)
 	 */
@@ -182,5 +182,5 @@
 		}
 		return new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, NLS.bind(LaunchingMessages.EEVMType_3, new String[]{installLocation.getPath()}));
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java
index e1d780a..3c672af 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
@@ -36,7 +36,7 @@
 import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
 import org.eclipse.osgi.util.NLS;
 
-/** 
+/**
  * JRE Container - resolves a classpath container variable to a JRE
  */
 public class JREContainer implements IClasspathContainer {
@@ -45,32 +45,32 @@
 	 * Corresponding JRE
 	 */
 	private IVMInstall fVMInstall = null;
-	
+
 	/**
 	 * Container path used to resolve to this JRE
 	 */
 	private IPath fPath = null;
-	
+
 	/**
 	 * The project this container is for
 	 */
 	private IJavaProject fProject = null;
-	
+
 	/**
 	 * Cache of classpath entries per VM install. Cleared when a VM changes.
 	 */
-	private static Map<IVMInstall, IClasspathEntry[]> fgClasspathEntries = new HashMap<IVMInstall, IClasspathEntry[]>(10);
-	
+	private static Map<IVMInstall, IClasspathEntry[]> fgClasspathEntries = new HashMap<>(10);
+
 	/**
 	 * Variable to return an empty array of <code>IAccessRule</code>s
 	 */
 	private static IAccessRule[] EMPTY_RULES = new IAccessRule[0];
-	
+
 	/**
-	 * Map of {IVMInstall -> Map of {{IExeuctionEnvironment, IAccessRule[][]} -> {IClasspathEntry[]}} 
+	 * Map of {IVMInstall -> Map of {{IExeuctionEnvironment, IAccessRule[][]} -> {IClasspathEntry[]}}
 	 */
-	private static Map<RuleKey, RuleEntry> fgClasspathEntriesWithRules = new HashMap<RuleKey, RuleEntry>(10);
-	
+	private static Map<RuleKey, RuleEntry> fgClasspathEntriesWithRules = new HashMap<>(10);
+
 	/**
 	 * A single key entry for the cache of access rules and classpath entries
 	 * A rule key is made up of an <code>IVMInstall</code> and an execution environment id
@@ -79,7 +79,7 @@
 	static class RuleKey {
 		private String fEnvironmentId = null;
 		private IVMInstall fInstall = null;
-		
+
 		/**
 		 * Constructor
 		 * @param install the VM
@@ -89,7 +89,7 @@
 			fInstall = install;
 			fEnvironmentId = environmentId;
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see java.lang.Object#equals(java.lang.Object)
 		 */
@@ -101,7 +101,7 @@
 			}
 			return false;
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see java.lang.Object#hashCode()
 		 */
@@ -110,16 +110,16 @@
 			return fEnvironmentId.hashCode() + fInstall.hashCode();
 		}
 	}
-	
+
 	/**
 	 * Holds an entry for the cache of access rules/classpath entries.
-	 * An entry is made up of an array of classpath entries and the collection of access rules. 
+	 * An entry is made up of an array of classpath entries and the collection of access rules.
 	 * @since 3.3
 	 */
 	static class RuleEntry {
 		private IAccessRule[][] fRules = null;
 		private IClasspathEntry[] fEntries = null;
-		
+
 		/**
 		 * Constructor
 		 * @param rules the rules
@@ -129,7 +129,7 @@
 			fRules = rules;
 			fEntries = entries;
 		}
-		
+
 		/**
 		 * Returns the collection of classpath entries for this RuleEntry
 		 * @return the cached array of classpath entries
@@ -137,7 +137,7 @@
 		public IClasspathEntry[] getClasspathEntries() {
 			return fEntries;
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see java.lang.Object#equals(java.lang.Object)
 		 */
@@ -165,11 +165,11 @@
 			}
 			return false;
 		}
-		
+
 		/**
 		 * Checks if the two arrays of rules are equal (same rules in each position in the array)
-		 * 
-		 * @param a First list of rules to compare, must not be <code>null</code> 
+		 *
+		 * @param a First list of rules to compare, must not be <code>null</code>
 		 * @param b Second list of rules to compare, must not be <code>null</code>
 		 * @return <code>true</code> if the arrays are equal, <code>false</code> otherwise
 		 */
@@ -188,7 +188,7 @@
 			return true;
 		}
 	}
-	
+
 	/**
 	 * Add a VM changed listener to clear cached values when a VM changes or is removed
 	 */
@@ -200,7 +200,7 @@
 			 */
 			@Override
 			public void defaultVMInstallChanged(IVMInstall previous, IVMInstall current) {}
-			
+
 			/* (non-Javadoc)
 			 * @see org.eclipse.jdt.launching.IVMInstallChangedListener#vmAdded(org.eclipse.jdt.launching.IVMInstall)
 			 */
@@ -226,7 +226,7 @@
 				fgClasspathEntries.remove(removedVm);
 				removeRuleEntry(removedVm);
 			}
-			
+
 			/**
 			 * Removes all occurrences of the given VM found as part key members in the current
 			 * cache for classpath entries
@@ -236,7 +236,7 @@
 				if(obj instanceof IVMInstall) {
 					IVMInstall install = (IVMInstall) obj;
 					RuleKey key = null;
-					ArrayList<RuleKey> list = new ArrayList<RuleKey>();
+					ArrayList<RuleKey> list = new ArrayList<>();
 					for(Iterator<RuleKey> iter = fgClasspathEntriesWithRules.keySet().iterator(); iter.hasNext();) {
 						key  = iter.next();
 						if(key.fInstall.equals(install)) {
@@ -251,11 +251,11 @@
 		};
 		JavaRuntime.addVMInstallChangedListener(listener);
 	}
-	
+
 	/**
 	 * Returns the classpath entries associated with the given VM
 	 * in the context of the given path and project.
-	 * 
+	 *
 	 * @param vm the VM
 	 * @param containerPath the container path resolution is for
 	 * @param project project the resolution is for
@@ -280,11 +280,11 @@
 		}
 		return entries;
 	}
-	
+
 	/**
 	 * Computes the classpath entries associated with a VM - one entry per library
 	 * in the context of the given path and project.
-	 * 
+	 *
 	 * @param vm the VM
 	 * @param project the project the resolution is for
 	 * @param environmentId execution environment the resolution is for, or <code>null</code>
@@ -313,7 +313,7 @@
 				return entry.getClasspathEntries();
 			}
 		}
-		List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>(libs.length);
+		List<IClasspathEntry> entries = new ArrayList<>(libs.length);
 		for (int i = 0; i < libs.length; i++) {
 			if (!libs[i].getSystemLibraryPath().isEmpty()) {
 				IPath sourcePath = libs[i].getSystemLibrarySourcePath();
@@ -339,12 +339,12 @@
 		if (key != null && rules != null) {
 			fgClasspathEntriesWithRules.put(key, new RuleEntry(rules, cpEntries));
 		}
-		return cpEntries;		
+		return cpEntries;
 	}
 
 	private static IClasspathAttribute[] buildClasspathAttributes(final IVMInstall vm, final LibraryLocation lib, final boolean overrideJavaDoc) {
-	
-		List<IClasspathAttribute> classpathAttributes = new LinkedList<IClasspathAttribute>();
+
+		List<IClasspathAttribute> classpathAttributes = new LinkedList<>();
 		// process the javadoc location
 		URL javadocLocation = lib.getJavadocLocation();
 		if (overrideJavaDoc && javadocLocation == null) {
@@ -368,10 +368,10 @@
 
 		return classpathAttributes.toArray(new IClasspathAttribute[classpathAttributes.size()]);
 	}
-	
+
 	/**
 	 * Constructs a JRE classpath container on the given VM install
-	 * 
+	 *
 	 * @param vm VM install - cannot be <code>null</code>
 	 * @param path container path used to resolve this JRE
 	 * @param project the project context
@@ -381,7 +381,7 @@
 		fPath = path;
 		fProject = project;
 	}
-	
+
 	/**
 	 * @see IClasspathContainer#getClasspathEntries()
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainerInitializer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainerInitializer.java
index 6590850..e8bb817 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainerInitializer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainerInitializer.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
@@ -73,7 +73,7 @@
 			} else {
 				if (LaunchingPlugin.DEBUG_JRE_CONTAINER) {
 					LaunchingPlugin.trace("\t*** INVALID JRE CONTAINER PATH ***"); //$NON-NLS-1$
-				}	
+				}
 			}
 		} else {
 			if (LaunchingPlugin.DEBUG_JRE_CONTAINER) {
@@ -81,10 +81,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Sets the specified class path container for all of the given projects.
-	 *  
+	 *
 	 * @param containerPath JRE container path
 	 * @param projects projects set the container on
 	 * @throws CoreException on failure
@@ -112,7 +112,7 @@
 			} else {
 				if (LaunchingPlugin.DEBUG_JRE_CONTAINER) {
 					LaunchingPlugin.trace("\t*** INVALID JRE CONTAINER PATH ***"); //$NON-NLS-1$
-				}	
+				}
 			}
 		} else {
 			if (LaunchingPlugin.DEBUG_JRE_CONTAINER) {
@@ -120,7 +120,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the VM install associated with the container path, or <code>null</code>
 	 * if it does not exist.
@@ -157,14 +157,14 @@
 		} else {
 			// workspace default JRE
 			vm = JavaRuntime.getDefaultVMInstall();
-		}		
+		}
 		return vm;
 	}
-	
+
 	/**
 	 * Returns the VM install bound to the given execution environment
 	 * or <code>null</code>.
-	 * 
+	 *
 	 * @param environment the environment
 	 * @return VM install or <code>null</code>
 	 * @since 3.2
@@ -209,11 +209,11 @@
 		}
 		return vm;
 	}
-	
+
 	/**
 	 * Returns the segment from the path containing the execution environment id
 	 * or <code>null</code>
-	 * 
+	 *
 	 * @param path container path
 	 * @return EE id
 	 */
@@ -229,54 +229,54 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns whether the given path identifies a VM by execution environment.
-	 * 
+	 *
 	 * @param path the path
 	 * @return whether the given path identifies a VM by execution environment
 	 */
 	public static boolean isExecutionEnvironment(IPath path) {
 		return getExecutionEnvironmentId(path) != null;
 	}
-	
+
 	/**
 	 * Escapes forward slashes in environment id.
-	 * 
+	 *
 	 * @param id the environment id
 	 * @return escaped name
 	 */
 	public static String encodeEnvironmentId(String id) {
 		return id.replace('/', '%');
 	}
-	
+
 	public static String decodeEnvironmentId(String id) {
 		return id.replace('%', '/');
 	}
-	
+
 	/**
 	 * Returns the VM type identifier from the given container ID path.
-	 * 
+	 *
 	 * @param path the path
 	 * @return the VM type identifier from the given container ID path
 	 */
 	public static String getVMTypeId(IPath path) {
 		return path.segment(1);
 	}
-	
+
 	/**
 	 * Returns the VM name from the given container ID path.
-	 * 
+	 *
 	 * @param path the path
 	 * @return the VM name from the given container ID path
 	 */
 	public static String getVMName(IPath path) {
 		return path.segment(2);
-	}	
-	
+	}
+
 	/**
 	 * The container can be updated if it refers to an existing VM.
-	 * 
+	 *
 	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#canUpdateClasspathContainer(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
 	 */
 	@Override
@@ -288,10 +288,10 @@
 		}
 		return false;
 	}
-	
+
 	private static final IStatus READ_ONLY= new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, ClasspathContainerInitializer.ATTRIBUTE_READ_ONLY, new String(), null);
 	private static final IStatus NOT_SUPPORTED= new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, ClasspathContainerInitializer.ATTRIBUTE_NOT_SUPPORTED, new String(), null);
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getAccessRulesStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
 	 */
@@ -299,7 +299,7 @@
 	public IStatus getAccessRulesStatus(IPath containerPath, IJavaProject project) {
 		return READ_ONLY;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getSourceAttachmentStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
 	 */
@@ -307,7 +307,7 @@
 	public IStatus getSourceAttachmentStatus(IPath containerPath, IJavaProject project) {
 		return Status.OK_STATUS;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getAttributeStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject, java.lang.String)
 	 */
@@ -331,12 +331,12 @@
 	@Override
 	public void requestClasspathContainerUpdate(IPath containerPath, IJavaProject project, IClasspathContainer containerSuggestion) throws CoreException {
 		IVMInstall vm = resolveVM(containerPath);
-		if (vm == null) { 
-			IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST, NLS.bind(LaunchingMessages.JREContainerInitializer_JRE_referenced_by_classpath_container__0__does_not_exist__1, new String[]{containerPath.toString()}), null); 
+		if (vm == null) {
+			IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST, NLS.bind(LaunchingMessages.JREContainerInitializer_JRE_referenced_by_classpath_container__0__does_not_exist__1, new String[]{containerPath.toString()}), null);
 			throw new CoreException(status);
 		}
 		// update of the VM with new library locations
-		
+
 		IClasspathEntry[] entries = containerSuggestion.getClasspathEntries();
 		LibraryLocation[] libs = new LibraryLocation[entries.length];
 		for (int i = 0; i < entries.length; i++) {
@@ -380,11 +380,11 @@
 					}
 					libs[i] = new LibraryLocation(path, srcPath, rootPath, javadocLocation, null, externalAnnotations);
 				} else {
-					IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, NLS.bind(LaunchingMessages.JREContainerInitializer_Classpath_entry__0__does_not_refer_to_an_existing_library__2, new String[]{entry.getPath().toString()}), null); 
+					IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, NLS.bind(LaunchingMessages.JREContainerInitializer_Classpath_entry__0__does_not_refer_to_an_existing_library__2, new String[]{entry.getPath().toString()}), null);
 					throw new CoreException(status);
 				}
 			} else {
-				IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, NLS.bind(LaunchingMessages.JREContainerInitializer_Classpath_entry__0__does_not_refer_to_a_library__3, new String[]{entry.getPath().toString()}), null); 
+				IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, NLS.bind(LaunchingMessages.JREContainerInitializer_Classpath_entry__0__does_not_refer_to_a_library__3, new String[]{entry.getPath().toString()}), null);
 				throw new CoreException(status);
 			}
 		}
@@ -405,7 +405,7 @@
 		}
 		if (tag != null) {
 			return NLS.bind(LaunchingMessages.JREContainer_JRE_System_Library_1, new String[]{tag});
-		} 
-		return LaunchingMessages.JREContainerInitializer_Default_System_Library_1; 
+		}
+		return LaunchingMessages.JREContainerInitializer_Default_System_Library_1;
 	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREPreferenceModifyListener.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREPreferenceModifyListener.java
index 2ca2ed2..723a34c 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREPreferenceModifyListener.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREPreferenceModifyListener.java
@@ -31,11 +31,11 @@
 
 /**
  * Manages import of installed JREs. Merges valid imported JREs with existing JREs.
- * 
+ *
  * @since 3.1
  */
 public class JREPreferenceModifyListener extends PreferenceModifyListener {
-	
+
 	class Visitor implements IPreferenceNodeVisitor {
 
 		@Override
@@ -46,8 +46,8 @@
 					VMDefinitionsContainer vms = new VMDefinitionsContainer();
 					String pref = InstanceScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN).get(JavaRuntime.PREF_VM_XML, ""); //$NON-NLS-1$
 					// names -> existing vm's
-					Map<String, IVMInstall> names = new HashMap<String, IVMInstall>();
-					Set<String> ids = new HashSet<String>();
+					Map<String, IVMInstall> names = new HashMap<>();
+					Set<String> ids = new HashSet<>();
 					if (pref.length() > 0) {
 						try {
 							VMDefinitionsContainer container = VMDefinitionsContainer.parseXMLIntoContainer(new ByteArrayInputStream(pref.getBytes("UTF8"))); //$NON-NLS-1$
@@ -83,12 +83,12 @@
 							boolean collision = ids.contains(vm.getId());
 							if (collision) {
 								// conflicting id, create a new one with unique id
-								long unique = System.currentTimeMillis();	
+								long unique = System.currentTimeMillis();
 								while(ids.contains(String.valueOf(unique))){
 									unique++;
 								}
 								vm = new VMStandin(vm, String.valueOf(unique));
-								ids.add(vm.getId()); 
+								ids.add(vm.getId());
 							}
 							vms.addVM(vm);
 						}
@@ -119,7 +119,7 @@
 			}
 			return true;
 		}
-		
+
 	}
 
 	@Override
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JRERuntimeClasspathEntryResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JRERuntimeClasspathEntryResolver.java
index edc4767..381c0c9 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JRERuntimeClasspathEntryResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JRERuntimeClasspathEntryResolver.java
@@ -38,7 +38,7 @@
  * Resolves for JRELIB_VARIABLE and JRE_CONTAINER
  */
 public class JRERuntimeClasspathEntryResolver implements IRuntimeClasspathEntryResolver2 {
-	
+
 	private static IAccessRule[] EMPTY_RULES = new IAccessRule[0];
 
 	/**
@@ -49,7 +49,7 @@
 		IVMInstall jre = null;
 		if (entry.getType() == IRuntimeClasspathEntry.CONTAINER && entry.getPath().segmentCount() > 1) {
 			// a specific VM
-			jre = JREContainerInitializer.resolveVM(entry.getPath()); 
+			jre = JREContainerInitializer.resolveVM(entry.getPath());
 		} else {
 			// default VM for config
 			jre = JavaRuntime.computeVMInstall(configuration);
@@ -60,7 +60,7 @@
 		}
 		return resolveLibraryLocations(jre, entry.getClasspathProperty());
 	}
-	
+
 	/**
 	 * @see IRuntimeClasspathEntryResolver#resolveRuntimeClasspathEntry(IRuntimeClasspathEntry, IJavaProject)
 	 */
@@ -69,7 +69,7 @@
 		IVMInstall jre = null;
 		if (entry.getType() == IRuntimeClasspathEntry.CONTAINER && entry.getPath().segmentCount() > 1) {
 			// a specific VM
-			jre = JREContainerInitializer.resolveVM(entry.getPath()); 
+			jre = JREContainerInitializer.resolveVM(entry.getPath());
 		} else {
 			// default VM for project
 			jre = JavaRuntime.getVMInstall(project);
@@ -77,7 +77,7 @@
 		if (jre == null) {
 			// cannot resolve JRE
 			return new IRuntimeClasspathEntry[0];
-		}		
+		}
 		return resolveLibraryLocations(jre, entry.getClasspathProperty());
 	}
 
@@ -98,7 +98,7 @@
 		} else if (!isSameArchives(libs, defaultLibs)) {
 			// determine if bootpath should be explicit
 			kind = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
-		}		
+		}
 		if (kind == IRuntimeClasspathEntry.BOOTSTRAP_CLASSES) {
 			File vmInstallLocation= vm.getInstallLocation();
 			if (vmInstallLocation != null) {
@@ -107,11 +107,11 @@
 					// only return endorsed and bootstrap classpath entries if we have the info
 					// libraries in the 'ext' directories are not loaded by the boot class loader
 					String[] extensionDirsArray = libraryInfo.getExtensionDirs();
-					Set<String> extensionDirsSet = new HashSet<String>();
+					Set<String> extensionDirsSet = new HashSet<>();
 					for (int i = 0; i < extensionDirsArray.length; i++) {
 						extensionDirsSet.add(extensionDirsArray[i]);
 					}
-					List<IRuntimeClasspathEntry> resolvedEntries = new ArrayList<IRuntimeClasspathEntry>(libs.length);
+					List<IRuntimeClasspathEntry> resolvedEntries = new ArrayList<>(libs.length);
 					for (int i = 0; i < libs.length; i++) {
 						LibraryLocation location = libs[i];
 						IPath libraryPath = location.getSystemLibraryPath();
@@ -125,7 +125,7 @@
 				}
 			}
 		}
-		List<IRuntimeClasspathEntry> resolvedEntries = new ArrayList<IRuntimeClasspathEntry>(libs.length);
+		List<IRuntimeClasspathEntry> resolvedEntries = new ArrayList<>(libs.length);
 		for (int i = 0; i < libs.length; i++) {
 			IPath systemLibraryPath = libs[i].getSystemLibraryPath();
 			if (systemLibraryPath.toFile().exists()) {
@@ -134,11 +134,11 @@
 		}
 		return resolvedEntries.toArray(new IRuntimeClasspathEntry[resolvedEntries.size()]);
 	}
-		
+
 	/**
 	 * Return whether the given list of libraries refer to the same archives in the same
-	 * order. Only considers the binary archive (not source or javadoc locations). 
-	 *  
+	 * order. Only considers the binary archive (not source or javadoc locations).
+	 *
 	 * @param libs the locations
 	 * @param defaultLibs the default locations
 	 * @return whether the given list of libraries refer to the same archives in the same
@@ -207,10 +207,10 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Returns a runtime classpath entry for the given library in the specified VM.
-	 * 
+	 *
 	 * @param vm the VM
 	 * @param location the location
 	 * @param kind the classpath entry kind
@@ -223,7 +223,7 @@
 		URL javadocLocation = location.getJavadocLocation();
 		if (overrideJavaDoc && javadocLocation == null) {
 			javadocLocation = vm.getJavadocLocation();
-		}							
+		}
 		IClasspathAttribute[] attributes = null;
 		if (javadocLocation == null) {
 			attributes = new IClasspathAttribute[0];
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaAppletLaunchConfigurationDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaAppletLaunchConfigurationDelegate.java
index 936948a..9090022 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaAppletLaunchConfigurationDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaAppletLaunchConfigurationDelegate.java
@@ -43,19 +43,19 @@
 import org.eclipse.jdt.launching.JavaRuntime;
 
 public class JavaAppletLaunchConfigurationDelegate extends JavaLaunchDelegate implements IDebugEventSetListener {
-		
+
 	/**
 	 * Mapping of ILaunch objects to File objects that represent the HTML file
 	 * used to initiate the applet launch.  This is used to delete the HTML
 	 * file when the launch terminates.
 	 */
-	private static Map<ILaunch, File> fgLaunchToFileMap = new HashMap<ILaunch, File>();
-	
+	private static Map<ILaunch, File> fgLaunchToFileMap = new HashMap<>();
+
 	/**
 	 * Used to map temporary file to launch object.
 	 */
 	private ILaunch fLaunch;
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -73,12 +73,12 @@
 
 	/**
 	 * Returns the system property string for the policy file
-	 * 
+	 *
 	 * @param workingDir the working directory
 	 * @return system property for the policy file
 	 */
 	public String getJavaPolicyFile(File workingDir) {
-			File file = new File(workingDir, "java.policy.applet");//$NON-NLS-1$ 
+			File file = new File(workingDir, "java.policy.applet");//$NON-NLS-1$
 			if (!file.exists()) {
 				// copy it to the working directory
 				File test = LaunchingPlugin.getFileInPlugin(new Path("java.policy.applet")); //$NON-NLS-1$
@@ -94,7 +94,7 @@
 
 	/**
 	 * Using the specified launch configuration, build an HTML file that specifies the applet to launch. Return the name of the HTML file.
-	 * 
+	 *
 	 * @param configuration
 	 *            the launch config
 	 * @param dir
@@ -159,7 +159,7 @@
 			return '"' + convertToHTMLContent(string) + '"';
 		}
 	}
-	
+
 	private static int count(String string, char character) {
 		int count = 0;
 		for (int i = 0; i < string.length(); i++) {
@@ -206,7 +206,7 @@
 			DebugEvent event = events[i];
 			Object eventSource = event.getSource();
 			switch(event.getKind()) {
-				
+
 				// Delete the HTML file used for the launch
 				case DebugEvent.TERMINATE :
 					if (eventSource != null) {
@@ -226,10 +226,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Cleans up event listener and temporary file for the launch.
-	 * 
+	 *
 	 * @param launch the launch
 	 */
 	private void cleanup(ILaunch launch) {
@@ -243,7 +243,7 @@
 					DebugPlugin.getDefault().removeDebugEventListener(this);
 				}
 			}
-		}		
+		}
 	}
 
 	/**
@@ -257,7 +257,7 @@
 			return getInputStreamAsByteArray(stream, (int) file.length());
 		}
 	}
-	
+
 	/**
 	 * Returns the given input stream's contents as a byte array.
 	 * If a length is specified (ie. if length != -1), only length bytes
@@ -320,7 +320,7 @@
 
 		return contents;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getProgramArguments(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -330,15 +330,15 @@
 		// Construct the HTML file and set its name as a program argument
 		File htmlFile = buildHTMLFile(configuration, workingDir);
 		if (htmlFile == null) {
-			abort(LaunchingMessages.JavaAppletLaunchConfigurationDelegate_Could_not_build_HTML_file_for_applet_launch_1, null, IJavaLaunchConfigurationConstants.ERR_COULD_NOT_BUILD_HTML); 
-		}			
-		// Add a debug listener if necessary 
+			abort(LaunchingMessages.JavaAppletLaunchConfigurationDelegate_Could_not_build_HTML_file_for_applet_launch_1, null, IJavaLaunchConfigurationConstants.ERR_COULD_NOT_BUILD_HTML);
+		}
+		// Add a debug listener if necessary
 		if (fgLaunchToFileMap.isEmpty()) {
 			DebugPlugin.getDefault().addDebugEventListener(this);
 		}
-		// Add a mapping of the launch to the html file 
-		fgLaunchToFileMap.put(fLaunch, htmlFile);		
-		return htmlFile.getName();		
+		// Add a mapping of the launch to the html file
+		fgLaunchToFileMap.put(fLaunch, htmlFile);
+		return htmlFile.getName();
 	}
 
 	/* (non-Javadoc)
@@ -364,7 +364,7 @@
 
 	/**
 	 * Returns the applet's main type name.
-	 * 
+	 *
 	 * @param configuration the config
 	 * @return the main type name
 	 * @throws CoreException if a problem occurs
@@ -389,8 +389,8 @@
 			//default to eclipse directory
 			return new File(System.getProperty("user.dir"));  //$NON-NLS-1$
 		}
-		return resource.getLocation().toFile(); 
+		return resource.getLocation().toFile();
 	}
-	
-	
+
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaClasspathVariablesInitializer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaClasspathVariablesInitializer.java
index 7aacdbc..f40a8db 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaClasspathVariablesInitializer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaClasspathVariablesInitializer.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
 
- 
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -28,7 +28,7 @@
 	 * May be null
 	 */
 	private IProgressMonitor fMonitor;
-	
+
 	/**
 	 * @see ClasspathVariableInitializer#initialize(String)
 	 */
@@ -78,11 +78,11 @@
 			}
 		}
 	}
-	
+
 	private void setJREVariable(IPath newPath, String var) throws CoreException {
 		JavaCore.setClasspathVariable(var, newPath, getMonitor());
 	}
-	
+
 	protected IProgressMonitor getMonitor() {
 		if (fMonitor == null) {
 			return new NullProgressMonitor();
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaLaunchableTester.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaLaunchableTester.java
index e746988..b7b539c 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaLaunchableTester.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaLaunchableTester.java
@@ -51,7 +51,7 @@
 
 /**
  * Property tester for context launching menu.
- * 
+ *
  * @since 3.2
  */
 public class JavaLaunchableTester extends PropertyTester {
@@ -60,68 +60,68 @@
 	 * name for the "has main" property
 	 */
 	private static final String PROPERTY_HAS_MAIN = "hasMain"; //$NON-NLS-1$
-	
+
 	/**
 	 * name for the "has method" property
 	 */
-	private static final String PROPERTY_HAS_METHOD = "hasMethod"; //$NON-NLS-1$	
-	
+	private static final String PROPERTY_HAS_METHOD = "hasMethod"; //$NON-NLS-1$
+
 	/**
 	 * name for the "has method with annotation" property
 	 */
-	private static final String PROPERTY_HAS_METHOD_WITH_ANNOTATION = "hasMethodWithAnnotation"; //$NON-NLS-1$	
+	private static final String PROPERTY_HAS_METHOD_WITH_ANNOTATION = "hasMethodWithAnnotation"; //$NON-NLS-1$
 
 	/**
 	 * name for the "has type with annotation" property
 	 */
-	private static final String PROPERTY_HAS_TYPE_WITH_ANNOTATION = "hasTypeWithAnnotation"; //$NON-NLS-1$	
-	
+	private static final String PROPERTY_HAS_TYPE_WITH_ANNOTATION = "hasTypeWithAnnotation"; //$NON-NLS-1$
+
 	/**
 	 * name for the "extends class" property
 	 */
 	private static final String PROPERTY_EXTENDS_CLASS = "extendsClass"; //$NON-NLS-1$
-	
+
 	/**
 	 * "is container" property
 	 */
 	private static final String PROPERTY_IS_CONTAINER = "isContainer"; //$NON-NLS-1$
-	
+
 	/**
 	 * "is package fragment" property
 	 * @since 3.3
 	 */
 	private static final String PROPERTY_IS_PACKAGE_FRAGMENT = "isPackageFragment"; //$NON-NLS-1$
-	
+
 	/**
 	 * "is package fragment root" property
 	 * @since 3.3
 	 */
-	private static final String PROPERTY_IS_PACKAGE_FRAGMENT_ROOT = "isPackageFragmentRoot"; //$NON-NLS-1$	
-	
+	private static final String PROPERTY_IS_PACKAGE_FRAGMENT_ROOT = "isPackageFragmentRoot"; //$NON-NLS-1$
+
 	/**
 	 * name for the PROPERTY_PROJECT_NATURE property
 	 */
 	private static final String PROPERTY_PROJECT_NATURE = "hasProjectNature"; //$NON-NLS-1$
-	
+
 	/**
 	 * name for the "extends interface" property
 	 */
 	private static final String PROPERTY_EXTENDS_INTERFACE = "extendsInterface"; //$NON-NLS-1$
-	
+
 	/**
 	 * name for the PROPERTY_HAS_SWT_ON_PATH property
 	 */
 	private static final String PROPERTY_BUILDPATH_REFERENCE = "buildpathReference"; //$NON-NLS-1$
-	
+
     /**
      * Map of modifier text to corresponding flag (Integer)
      */
-    private static Map<String, Integer> fgModifiers = new HashMap<String, Integer>();
-    
+    private static Map<String, Integer> fgModifiers = new HashMap<>();
+
     private static final int FLAGS_MASK= Flags.AccPublic | Flags.AccProtected | Flags.AccPrivate | Flags.AccStatic
     	| Flags.AccFinal | Flags.AccSynchronized | Flags.AccAbstract | Flags.AccNative;
-    
-    
+
+
     static {
         fgModifiers.put("public",       new Integer(Flags.AccPublic)); //$NON-NLS-1$
         fgModifiers.put("protected",    new Integer(Flags.AccProtected)); //$NON-NLS-1$
@@ -132,7 +132,7 @@
         fgModifiers.put("abstract",     new Integer(Flags.AccAbstract)); //$NON-NLS-1$
         fgModifiers.put("native",       new Integer(Flags.AccNative)); //$NON-NLS-1$
     }
-    	
+
 	/**
 	 * gets the type of the IJavaElement
 	 * @param element the element to inspect
@@ -154,11 +154,11 @@
         }
         return type;
     }
-	
+
 	/**
 	 * Determines is the java element contains a main method.
-	 * 
-	 * @param element the element to check for the method 
+	 *
+	 * @param element the element to check for the method
 	 * @return true if the method is found in the element, false otherwise
 	 */
 	private boolean hasMain(IJavaElement element) {
@@ -181,7 +181,7 @@
 		catch (CoreException ce){}
 		return false;
 	}
-	
+
 	/**
 	 * Returns if the specified <code>IType</code> has a main method
 	 * @param type the type to inspect for a main type
@@ -198,10 +198,10 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * This method asks the specified <code>IType</code> if it has a main method, if not it recurses through all of its children
-	 * When recursing we only care about child <code>IType</code>s that are static. 
+	 * When recursing we only care about child <code>IType</code>s that are static.
 	 * @param type the <code>IType</code> to inspect for a main method
 	 * @return true if a main method was found in specified <code>IType</code>, false otherwise
 	 * @throws CoreException if there is an error
@@ -221,7 +221,7 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Determines is the java element contains a specific method.
      * <p>
@@ -236,7 +236,7 @@
      * <li>modifiers - optional space separated list of modifiers, for
      *  example, <code>public static</code>.</li>
      * </ol>
-	 * @param element the element to check for the method 
+	 * @param element the element to check for the method
 	 * @param args first arg is method name, secondary args are parameter types signatures
 	 * @return true if the method is found in the element, false otherwise
 	 */
@@ -277,7 +277,7 @@
 		catch (JavaModelException e) {}
 		return false;
 	}
-	
+
 	/**
 	 * Determines is the java element contains a type with a specific annotation.
      * <p>
@@ -285,12 +285,12 @@
      * <li>qualified or unqualified annotation name, required. For example,
      *  <code>org.junit.JUnit</code>.</li>
      * </ol>
-	 * @param element the element to check for the method 
+	 * @param element the element to check for the method
 	 * @param annotationType the qualified or unqualified name of the annotation kind to look for
 	 * @return true if the type is found in the element, false otherwise
 	 */
 	private boolean hasTypeWithAnnotation(IJavaElement element, String annotationType) {
-		try {			
+		try {
 			IType type= getType(element);
 			if (type == null || !type.exists()) {
 				return false;
@@ -306,7 +306,7 @@
 			if (buffer == null) {
 				return false;
 			}
-			
+
 			ISourceRange sourceRange= type.getSourceRange();
 			ISourceRange nameRange= type.getNameRange();
 			if (sourceRange != null && nameRange != null) {
@@ -317,13 +317,13 @@
 					return true;
 				}
 			}
-		} 
-		catch (JavaModelException e) {} 
+		}
+		catch (JavaModelException e) {}
 		catch (InvalidInputException e) {}
 		return false;
-	}	
+	}
 
-	
+
 	/**
 	 * Determines is the java element contains a method with a specific annotation.
      * <p>
@@ -333,7 +333,7 @@
      * <li>modifiers - optional space separated list of modifiers, for
      *  example, <code>public static</code>.</li>
      * </ol>
-	 * @param element the element to check for the method 
+	 * @param element the element to check for the method
 	 * @param args the arguments
 	 * @return true if the method is found in the element, false otherwise
 	 */
@@ -353,7 +353,7 @@
 			} else {
 				flags= -1;
 			}
-			
+
 			IType type= getType(element);
 			if (type == null || !type.exists()) {
 				return false;
@@ -374,14 +374,14 @@
 				return false;
 			}
 			IScanner scanner=null; // delay initialization
-			
+
 			for (int i= 0; i < methods.length; i++) {
 				IMethod curr= methods[i];
 				if (curr.isConstructor() || (flags != -1 && flags != (curr.getFlags() & FLAGS_MASK))) {
 					continue;
 				}
-				
-				
+
+
 				ISourceRange sourceRange= curr.getSourceRange();
 				ISourceRange nameRange= curr.getNameRange();
 				if (sourceRange != null && nameRange != null) {
@@ -399,8 +399,8 @@
 		} catch (InvalidInputException e) {
 		}
 		return false;
-	}	
-	
+	}
+
 	private boolean findAnnotation(IScanner scanner, String annotationName) throws InvalidInputException {
 		String simpleName= Signature.getSimpleName(annotationName);
 		StringBuffer buf= new StringBuffer();
@@ -453,7 +453,7 @@
         }
     	catch (CoreException e) {return false;}
     }
-	
+
 	/**
 	 * Determines if the element has qname as a parent class
 	 * @param element the element to check for the parent class definition
@@ -470,18 +470,18 @@
 						return true;
 					}
 				}
-			} 
+			}
 		}
 		catch(JavaModelException e) {}
-		return false; 
+		return false;
 	}
-	
+
 	/**
-	 * Determines if an item or list of items are found on the build path. 
-	 * Once any one single items matches though, the method returns true, this method is intended 
+	 * Determines if an item or list of items are found on the build path.
+	 * Once any one single items matches though, the method returns true, this method is intended
 	 * to be used in OR like situations, where we do not care if all of the items are on the build path, only that one
 	 * of them is.
-	 * 
+	 *
 	 * @param element the element whose build path should be checked
 	 * @param args the value(s) to search for on the build path
 	 * @return true if any one of the args is found on the build path
@@ -489,16 +489,16 @@
 	private boolean hasItemOnBuildPath(IJavaElement element, Object[] args) {
 		if(element != null && args != null) {
 			IJavaProject project = element.getJavaProject();
-			Set<IJavaProject> searched = new HashSet<IJavaProject>();
+			Set<IJavaProject> searched = new HashSet<>();
 			searched.add(project);
 			return hasItemsOnBuildPath(project, searched, args);
 		}
 		return false;
 	}
-	
+
 	private boolean hasItemsOnBuildPath(IJavaProject project, Set<IJavaProject> searched, Object[] args) {
 		try {
-			List<IJavaProject> projects = new ArrayList<IJavaProject>();
+			List<IJavaProject> projects = new ArrayList<>();
 	        if(project != null && project.exists()) {
 	            IClasspathEntry[] entries = project.getResolvedClasspath(true);
 	            for(int i = 0; i < entries.length; i++) {
@@ -532,7 +532,7 @@
 		} catch (JavaModelException e) {}
 		return false;
 	}
-	
+
 	/**
 	 * determines if the element implements a given interface
 	 * @param element the element to check for the interface
@@ -548,18 +548,18 @@
 					if(itypes[i].getFullyQualifiedName().equals(qname)) {
 						return true;
 					}
-				} 
+				}
 			}
 		}
 		catch(JavaModelException e) {}
 		return false;
 	}
-	
+
 	/**
 	 * Method runs the tests defined from extension points for Run As... and Debug As... menu items.
-	 * Currently this test optimistically considers everything not a source file. In this context we 
+	 * Currently this test optimistically considers everything not a source file. In this context we
 	 * consider an optimistic approach to mean that the test will always return true.
-	 * 
+	 *
 	 * There are many reasons for the optimistic choice some of them are outlined below.
 	 * <ul>
 	 * <li>Performance (in terms of time needed to display menu) cannot be preserved. To know what to allow
@@ -624,5 +624,5 @@
 		}
 		return false;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaMigrationDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaMigrationDelegate.java
index ea94e5b..eaaa423 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaMigrationDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaMigrationDelegate.java
@@ -28,7 +28,7 @@
  * Delegate for migrating Java launch configurations.
  * The migration process involves a resource mapping being created such that launch configurations
  * can be filtered from the launch configuration dialog based on resource availability
- * 
+ *
  * @since 3.2
  */
 public class JavaMigrationDelegate implements ILaunchConfigurationMigrationDelegate {
@@ -37,12 +37,12 @@
 	 * represents the empty string
 	 */
 	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	
+
 	/**
 	 * Constructor needed for reflection
 	 */
 	public JavaMigrationDelegate() {}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate#isCandidate()
 	 */
@@ -68,10 +68,10 @@
 		}
 		return !target.equals(mapped[0]);
 	}
-	
+
 	/**
 	 * Returns whether the given project is available.
-	 * 
+	 *
 	 * @param projectName project name
 	 * @return whether the project exists and is open
 	 */
@@ -83,12 +83,12 @@
 	/**
 	 * Returns the associated <code>IResource</code> for the specified launch configuration
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param candidate the candidate to get the backing resource for
 	 * @return associated <code>IResource</code> or <code>null</code>
-	 * 
+	 *
 	 * @since 3.3
-	 * 
+	 *
 	 * @throws CoreException if there is an error
 	 */
 	static IResource getResource(ILaunchConfiguration candidate) throws CoreException {
@@ -126,7 +126,7 @@
 		}
 		return resource;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate#migrate(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -136,10 +136,10 @@
 		updateResourceMapping(wc);
 		wc.doSave();
 	}
-	
+
 	/**
 	 * Updates the resource mapping for the given launch configuration.
-	 * 
+	 *
 	 * @param wc working copy
 	 * @throws CoreException if an exception occurs updating resource mapping.
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaProjectSourceContainerTypeDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaProjectSourceContainerTypeDelegate.java
index d6c441c..0d4f1c1 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaProjectSourceContainerTypeDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaProjectSourceContainerTypeDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -39,16 +39,16 @@
 			if ("javaProject".equals(element.getNodeName())) { //$NON-NLS-1$
 				String string = element.getAttribute("name"); //$NON-NLS-1$
 				if (string == null || string.length() == 0) {
-					abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_5, null); 
+					abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_5, null);
 				}
 				IWorkspace workspace = ResourcesPlugin.getWorkspace();
 				IProject project = workspace.getRoot().getProject(string);
 				IJavaProject javaProject = JavaCore.create(project);
 				return new JavaProjectSourceContainer(javaProject);
 			}
-			abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_6, null); 
+			abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_6, null);
 		}
-		abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_7, null); 
+		abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_7, null);
 		return null;
 	}
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaRemoteApplicationLaunchConfigurationDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaRemoteApplicationLaunchConfigurationDelegate.java
index 2176775..7269257 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaRemoteApplicationLaunchConfigurationDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaRemoteApplicationLaunchConfigurationDelegate.java
@@ -41,14 +41,14 @@
 			monitor = new NullProgressMonitor();
 		}
 
-		monitor.beginTask(NLS.bind(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Attaching_to__0_____1, new String[]{configuration.getName()}), 3); 
+		monitor.beginTask(NLS.bind(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Attaching_to__0_____1, new String[]{configuration.getName()}), 3);
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			return;
-		}						
-		try {			
-			monitor.subTask(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Verifying_launch_attributes____1); 
-							
+		}
+		try {
+			monitor.subTask(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Verifying_launch_attributes____1);
+
 			String connectorId = getVMConnectorId(configuration);
 			IVMConnector connector = null;
 			if (connectorId == null) {
@@ -57,33 +57,33 @@
 				connector = JavaRuntime.getVMConnector(connectorId);
 			}
 			if (connector == null) {
-				abort(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Connector_not_specified_2, null, IJavaLaunchConfigurationConstants.ERR_CONNECTOR_NOT_AVAILABLE); 
+				abort(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Connector_not_specified_2, null, IJavaLaunchConfigurationConstants.ERR_CONNECTOR_NOT_AVAILABLE);
 			}
-			
+
 			Map<String, String> argMap = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, (Map<String, String>)null);
-	        
+
 	        int connectTimeout = Platform.getPreferencesService().getInt(
-	        		LaunchingPlugin.ID_PLUGIN, 
-	        		JavaRuntime.PREF_CONNECT_TIMEOUT, 
-	        		JavaRuntime.DEF_CONNECT_TIMEOUT, 
+	        		LaunchingPlugin.ID_PLUGIN,
+	        		JavaRuntime.PREF_CONNECT_TIMEOUT,
+	        		JavaRuntime.DEF_CONNECT_TIMEOUT,
 	        		null);
 	        argMap.put("timeout", Integer.toString(connectTimeout));  //$NON-NLS-1$
-	
+
 			// check for cancellation
 			if (monitor.isCanceled()) {
 				return;
 			}
-			
+
 			monitor.worked(1);
-			
-			monitor.subTask(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Creating_source_locator____2); 
+
+			monitor.subTask(LaunchingMessages.JavaRemoteApplicationLaunchConfigurationDelegate_Creating_source_locator____2);
 			// set the default source locator if required
 			setDefaultSourceLocator(launch, configuration);
-			monitor.worked(1);		
-			
+			monitor.worked(1);
+
 			// connect to remote VM
 			connector.connect(argMap, monitor, launch);
-			
+
 			// check for cancellation
 			if (monitor.isCanceled()) {
 				IDebugTarget[] debugTargets = launch.getDebugTargets();
@@ -100,5 +100,5 @@
 			monitor.done();
 		}
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupDirector.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupDirector.java
index f539253..7ffdce2 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupDirector.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupDirector.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,21 +22,21 @@
 
 /**
  * Java source lookup director.
- * 
+ *
  * @since 3.0
  */
 public class JavaSourceLookupDirector extends AbstractSourceLookupDirector {
-	
+
 	private static Set<String> fFilteredTypes;
-	
+
 	static {
-		fFilteredTypes = new HashSet<String>();
+		fFilteredTypes = new HashSet<>();
 		fFilteredTypes.add(ProjectSourceContainer.TYPE_ID);
 		fFilteredTypes.add(WorkspaceSourceContainer.TYPE_ID);
 		// can't reference UI constant
 		fFilteredTypes.add("org.eclipse.debug.ui.containerType.workingSet"); //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupDirector#initializeParticipants()
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
index 9e61150..ea47cb0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
@@ -36,7 +36,7 @@
 /**
  * Private source lookup utilities. Translates runtime classpath entries
  * to source containers.
- * 
+ *
  * @since 3.0
  */
 public class JavaSourceLookupUtil {
@@ -44,12 +44,12 @@
 	/**
 	 * Translates the given runtime classpath entries into associated source
 	 * containers.
-	 * 
+	 *
 	 * @param entries entries to translate
 	 * @return source containers corresponding to the given runtime classpath entries
 	 */
 	public static ISourceContainer[] translate(IRuntimeClasspathEntry[] entries) {
-		List<ISourceContainer> containers = new ArrayList<ISourceContainer>(entries.length);
+		List<ISourceContainer> containers = new ArrayList<>(entries.length);
 		for (int i = 0; i < entries.length; i++) {
 			IRuntimeClasspathEntry entry = entries[i];
 			switch (entry.getType()) {
@@ -108,7 +108,7 @@
 		}
 		return containers.toArray(new ISourceContainer[containers.size()]);
 	}
-	
+
 	/**
 	 * Returns whether the source attachments of the given package fragment
 	 * root and runtime classpath entry are equal.
@@ -117,7 +117,7 @@
 	 * then it is considered equal. This way, the corresponding package fragment
 	 * root is used for source lookup if it has a source attachment or not.
 	 * </p>
-	 * 
+	 *
 	 * @param root package fragment root
 	 * @param entry runtime classpath entry
 	 * @return whether the source attachments of the given package fragment
@@ -135,14 +135,14 @@
 			return false;
 		}
 		return rootPath.equals(entryPath);
-		
+
 	}
-	
+
 	/**
 	 * Determines if the given archive runtime classpath entry exists
 	 * in the workspace as a package fragment root. Returns the associated
 	 * package fragment root or <code>null</code> if none.
-	 *  
+	 *
 	 * @param entry archive runtime classpath entry
 	 * @return package fragment root or <code>null</code>
 	 */
@@ -189,5 +189,5 @@
 			LaunchingPlugin.log(e);
 		}
 		return null;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPlugin.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPlugin.java
index 7ff6286..6711557 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPlugin.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPlugin.java
@@ -98,7 +98,7 @@
 	 */
 	public static boolean DEBUG = false;
 	public static boolean DEBUG_JRE_CONTAINER = false;
-	
+
 	public static final String DEBUG_JRE_CONTAINER_FLAG = "org.eclipse.jdt.launching/debug/classpath/jreContainer"; //$NON-NLS-1$
 	public static final String DEBUG_FLAG = "org.eclipse.jdt.launching/debug"; //$NON-NLS-1$
 
@@ -107,43 +107,43 @@
 	 * @since 3.8
 	 */
 	private static DebugTrace fgDebugTrace;
-	
+
 	/**
 	 * The id of the JDT launching plug-in (value <code>"org.eclipse.jdt.launching"</code>).
 	 */
 	public static final String ID_PLUGIN= "org.eclipse.jdt.launching"; //$NON-NLS-1$
-	
+
 	/**
 	 * Identifier for 'vmConnectors' extension point
 	 */
 	public static final String ID_EXTENSION_POINT_VM_CONNECTORS = "vmConnectors"; //$NON-NLS-1$
-	
+
 	/**
 	 * Identifier for 'runtimeClasspathEntries' extension point
 	 */
 	public static final String ID_EXTENSION_POINT_RUNTIME_CLASSPATH_ENTRIES = "runtimeClasspathEntries"; //$NON-NLS-1$
-	
+
 	private static LaunchingPlugin fgLaunchingPlugin;
-	
+
 	private HashMap<String, IVMConnector> fVMConnectors = null;
-	
+
 	/**
 	 * Runtime classpath extensions
 	 */
 	private HashMap<String, IConfigurationElement> fClasspathEntryExtensions = null;
 
 	private String fOldVMPrefString = EMPTY_STRING;
-	
+
 	private boolean fIgnoreVMDefPropertyChangeEvents = false;
-		
+
 	private static final String EMPTY_STRING = "";    //$NON-NLS-1$
-			
+
 	/**
 	 * Mapping of top-level VM installation directories to library info for that
 	 * VM.
 	 */
 	private static Map<String, LibraryInfo> fgLibraryInfoMap = null;
-	
+
 	/**
 	 * Mapping of the last time the directory of a given SDK was modified.
 	 * <br><br>
@@ -153,17 +153,17 @@
 	private static Map<String, Long> fgInstallTimeMap = null;
 	/**
 	 * List of install locations that have been detected to have changed
-	 * 
+	 *
 	 * @since 3.7
 	 */
-	private static HashSet<String> fgHasChanged = new HashSet<String>();
+	private static HashSet<String> fgHasChanged = new HashSet<>();
 	/**
 	 * Mutex for checking the time stamp of an install location
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	private static Object installLock = new Object();
-	
+
 	/**
 	 * Whether changes in VM preferences are being batched. When being batched
 	 * the plug-in can ignore processing and changes.
@@ -174,22 +174,22 @@
 	 * Shared XML parser
 	 */
 	private static DocumentBuilder fgXMLParser = null;
-	
+
 	/**
 	 * Stores VM changes resulting from a JRE preference change.
 	 */
 	class VMChanges implements IVMInstallChangedListener {
-		
+
 		// true if the default VM changes
 		private boolean fDefaultChanged = false;
-		
+
 		// old container ids to new
-		private HashMap<IPath, IPath> fRenamedContainerIds = new HashMap<IPath, IPath>();
-		
+		private HashMap<IPath, IPath> fRenamedContainerIds = new HashMap<>();
+
 		/**
 		 * Returns the JRE container id that the given VM would map to, or
 		 * <code>null</code> if none.
-		 * 
+		 *
 		 * @param vm the new path id of the {@link IVMInstall}
 		 * @return container id or <code>null</code>
 		 */
@@ -205,7 +205,7 @@
 			}
 			return null;
 		}
-		
+
 		/**
 		 * @see org.eclipse.jdt.launching.IVMInstallChangedListener#defaultVMInstallChanged(org.eclipse.jdt.launching.IVMInstall, org.eclipse.jdt.launching.IVMInstall)
 		 */
@@ -266,7 +266,7 @@
 		@Override
 		public void vmRemoved(IVMInstall vm) {
 		}
-	
+
 		/**
 		 * Re-bind classpath variables and containers affected by the JRE
 		 * changes.
@@ -275,7 +275,7 @@
 			JREUpdateJob job = new JREUpdateJob(this);
 			job.schedule();
 		}
-		
+
 		protected void doit(IProgressMonitor monitor) throws CoreException {
 			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
 				@Override
@@ -288,7 +288,7 @@
 			};
 			JavaCore.run(runnable, null, monitor);
 		}
-				
+
 		/**
 		 * Re-bind classpath variables and containers affected by the JRE
 		 * changes.
@@ -305,10 +305,10 @@
 				initializer.initialize(JavaRuntime.JRESRCROOT_VARIABLE);
 			}
 			monitor.worked(1);
-														
+
 			// re-bind all container entries
 			int length = projects.length;
-			Map<IPath, List<IJavaProject>> projectsMap = new HashMap<IPath, List<IJavaProject>>();
+			Map<IPath, List<IJavaProject>> projectsMap = new HashMap<>();
 			for (int i = 0; i < length; i++) {
 				IJavaProject project = projects[i];
 				IClasspathEntry[] entries = project.getRawClasspath();
@@ -334,7 +334,7 @@
 									// @see bug 310789 - batch updates by common container paths
 									List<IJavaProject> projectsList = projectsMap.get(reference);
 									if (projectsList == null) {
-										projectsMap.put(reference, projectsList = new ArrayList<IJavaProject>(length));
+										projectsMap.put(reference, projectsList = new ArrayList<>(length));
 									}
 									projectsList.add(project);
 								} else {
@@ -367,10 +367,10 @@
 		}
 
 	}
-	
+
 	class JREUpdateJob extends Job {
 		private VMChanges fChanges;
-		
+
 		public JREUpdateJob(VMChanges changes) {
 			super(LaunchingMessages.LaunchingPlugin_1);
 			fChanges = changes;
@@ -389,9 +389,9 @@
 			}
 			return Status.OK_STATUS;
 		}
-		
+
 	}
-	
+
 	/**
 	 * Constructor
 	 */
@@ -399,11 +399,11 @@
 		super();
 		fgLaunchingPlugin = this;
 	}
-	
+
 	/**
 	 * Returns the library info that corresponds to the specified JRE install
 	 * path, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param javaInstallPath the absolute path to the java executable
 	 * @return the library info that corresponds to the specified JRE install
 	 * path, or <code>null</code> if none
@@ -414,11 +414,11 @@
 		}
 		return fgLibraryInfoMap.get(javaInstallPath);
 	}
-	
+
 	/**
 	 * Sets the library info that corresponds to the specified JRE install
 	 * path.
-	 * 
+	 *
 	 * @param javaInstallPath home location for a JRE
 	 * @param info the library information, or <code>null</code> to remove
 	 */
@@ -432,7 +432,7 @@
 				fgInstallTimeMap.remove(javaInstallPath);
 				writeInstallInfo();
 			}
-			
+
 		} else {
 			fgLibraryInfoMap.put(javaInstallPath, info);
 		}
@@ -440,11 +440,11 @@
 		fgHasChanged.remove(javaInstallPath);
 		saveLibraryInfo();
 	}
-		
+
 	/**
 	 * Return a <code>java.io.File</code> object that corresponds to the specified
 	 * <code>IPath</code> in the plug-in directory.
-	 * 
+	 *
 	 * @param path the path to look for in the launching bundle
 	 * @return the {@link File} from the bundle or <code>null</code>
 	 */
@@ -458,10 +458,10 @@
 			return null;
 		}
 	}
-		
+
 	/**
 	 * Convenience method which returns the unique identifier of this plug-in.
-	 * 
+	 *
 	 * @return the id of the {@link LaunchingPlugin}
 	 */
 	public static String getUniqueIdentifier() {
@@ -475,7 +475,7 @@
 	public static LaunchingPlugin getDefault() {
 		return fgLaunchingPlugin;
 	}
-	
+
 	/**
 	 * Logs the specified status
 	 * @param status the status to log
@@ -483,7 +483,7 @@
 	public static void log(IStatus status) {
 		getDefault().getLog().log(status);
 	}
-	
+
 	/**
 	 * Logs the specified message, by creating a new <code>Status</code>
 	 * @param message the message to log as an error status
@@ -491,7 +491,7 @@
 	public static void log(String message) {
 		log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
 	}
-		
+
 	/**
 	 * Logs the specified exception by creating a new <code>Status</code>
 	 * @param e the {@link Throwable} to log as an error
@@ -499,11 +499,11 @@
 	public static void log(Throwable e) {
 		log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
 	}
-	
+
 	/**
 	 * Clears zip file cache.
 	 * Shutdown the launch configuration helper.
-	 * 
+	 *
 	 * @see Plugin#stop(BundleContext)
 	 */
 	@Override
@@ -522,14 +522,14 @@
 			super.stop(context);
 		}
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
 	 */
 	@Override
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
-		Hashtable<String, String> props = new Hashtable<String, String>(2);
+		Hashtable<String, String> props = new Hashtable<>(2);
 		props.put(org.eclipse.osgi.service.debug.DebugOptions.LISTENER_SYMBOLICNAME, getUniqueIdentifier());
 		context.registerService(DebugOptionsListener.class.getName(), this, props);
 		ResourcesPlugin.getWorkspace().addSaveParticipant(ID_PLUGIN, new ISaveParticipant() {
@@ -546,7 +546,7 @@
 				} catch (BackingStoreException e) {
 					log(e);
 				}
-				//catch in case any install times are still cached for removed JREs 
+				//catch in case any install times are still cached for removed JREs
 				writeInstallInfo();
 			}
 		});
@@ -557,11 +557,11 @@
 		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
 		DebugPlugin.getDefault().addDebugEventListener(this);
 	}
-	
+
 	/**
 	 * Returns the VM connector with the specified id, or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param id connector identifier
 	 * @return VM connector
 	 */
@@ -571,7 +571,7 @@
 		}
 		return fVMConnectors.get(id);
 	}
-	
+
 	/**
 	 * Returns all VM connector extensions.
 	 *
@@ -583,7 +583,7 @@
 		}
 		return fVMConnectors.values().toArray(new IVMConnector[fVMConnectors.size()]);
 	}
-	
+
 	/**
 	 * Loads VM connector extensions
 	 */
@@ -591,7 +591,7 @@
 		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(ID_PLUGIN, ID_EXTENSION_POINT_VM_CONNECTORS);
 		IConfigurationElement[] configs= extensionPoint.getConfigurationElements();
 		MultiStatus status= new MultiStatus(getUniqueIdentifier(), IStatus.OK, "Exception occurred reading vmConnectors extensions.", null);  //$NON-NLS-1$
-		fVMConnectors = new HashMap<String, IVMConnector>(configs.length);
+		fVMConnectors = new HashMap<>(configs.length);
 		for (int i= 0; i < configs.length; i++) {
 			try {
 				IVMConnector vmConnector= (IVMConnector)configs[i].createExecutableExtension("class"); //$NON-NLS-1$
@@ -604,10 +604,10 @@
 			LaunchingPlugin.log(status);
 		}
 	}
-	
+
 	/**
 	 * Returns a new runtime classpath entry of the specified type.
-	 * 
+	 *
 	 * @param id extension type id
 	 * @return new uninitialized runtime classpath entry
 	 * @throws CoreException if unable to create an entry
@@ -623,35 +623,35 @@
 		abort(NLS.bind(LaunchingMessages.LaunchingPlugin_32, new String[]{id}), null);
 		return null;
 	}
-	
+
 	/**
 	 * Loads runtime classpath extensions
 	 */
 	private void initializeRuntimeClasspathExtensions() {
 		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(LaunchingPlugin.ID_PLUGIN, ID_EXTENSION_POINT_RUNTIME_CLASSPATH_ENTRIES);
 		IConfigurationElement[] configs= extensionPoint.getConfigurationElements();
-		fClasspathEntryExtensions = new HashMap<String, IConfigurationElement>(configs.length);
+		fClasspathEntryExtensions = new HashMap<>(configs.length);
 		for (int i= 0; i < configs.length; i++) {
 			fClasspathEntryExtensions.put(configs[i].getAttribute("id"), configs[i]); //$NON-NLS-1$
 		}
 	}
-	
+
 	/**
 	 * Check for differences between the old & new sets of installed JREs.
 	 * Differences may include additions, deletions and changes.  Take
 	 * appropriate action for each type of difference.
-	 * 
+	 *
 	 * When importing preferences, TWO propertyChange events are fired.  The first
 	 * has an old value but an empty new value.  The second has a new value, but an empty
 	 * old value.  Normal user changes to the preferences result in a single propertyChange
 	 * event, with both old and new values populated.  This method handles both types
 	 * of notification.
-	 * 
+	 *
 	 * @param oldValue the old preference value
 	 * @param newValue the new preference value
 	 */
 	protected void processVMPrefsChanged(String oldValue, String newValue) {
-		
+
 		// batch changes
 		fBatchingChanges = true;
 		VMChanges vmChanges = null;
@@ -659,7 +659,7 @@
 
 			String oldPrefString;
 			String newPrefString;
-			
+
 			// If empty new value, save the old value and wait for 2nd propertyChange notification
 			if (newValue == null || newValue.equals(EMPTY_STRING)) {
 				fOldVMPrefString = oldValue;
@@ -676,21 +676,21 @@
 				oldPrefString = oldValue;
 				newPrefString = newValue;
 			}
-			
+
 			vmChanges = new VMChanges();
 			JavaRuntime.addVMInstallChangedListener(vmChanges);
-			
+
 			// Generate the previous VMs
 			VMDefinitionsContainer oldResults = getVMDefinitions(oldPrefString);
-			
+
 			// Generate the current
 			VMDefinitionsContainer newResults = getVMDefinitions(newPrefString);
-			
+
 			// Determine the deleted VMs
 			List<IVMInstall> deleted = oldResults.getVMList();
 			List<IVMInstall> current = newResults.getValidVMList();
 			deleted.removeAll(current);
-			
+
 			// Dispose deleted VMs.  The 'disposeVMInstall' method fires notification of the
 			// deletion.
 			Iterator<IVMInstall> deletedIterator = deleted.iterator();
@@ -698,7 +698,7 @@
 				VMStandin deletedVMStandin = (VMStandin) deletedIterator.next();
 				deletedVMStandin.getVMInstallType().disposeVMInstall(deletedVMStandin.getId());
 			}
-			
+
 			// Fire change notification for added and changed VMs. The 'convertToRealVM'
 			// fires the appropriate notification.
 			Iterator<IVMInstall> iter = current.iterator();
@@ -706,7 +706,7 @@
 				VMStandin standin = (VMStandin)iter.next();
 				standin.convertToRealVM();
 			}
-			
+
 			// set the new default VM install. This will fire a 'defaultVMChanged',
 			// if it in fact changed
 			String newDefaultId = newResults.getDefaultVMInstallCompositeID();
@@ -720,7 +720,7 @@
 					}
 				}
 			}
-			
+
 		} finally {
 			// stop batch changes
 			fBatchingChanges = false;
@@ -731,11 +731,11 @@
 		}
 
 	}
-	
+
 	/**
 	 * Parse the given XML into a VM definitions container, returning an empty
 	 * container if an exception occurs.
-	 * 
+	 *
 	 * @param xml the XML to parse for VM descriptions
 	 * @return VMDefinitionsContainer
 	 */
@@ -750,7 +750,7 @@
 		}
 		return new VMDefinitionsContainer();
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallChangedListener#defaultVMInstallChanged(org.eclipse.jdt.launching.IVMInstall, org.eclipse.jdt.launching.IVMInstall)
 	 */
@@ -830,11 +830,11 @@
 	 * </ul>
 	 */
 	private static String getLibraryInfoAsXML() throws CoreException {
-		
+
 		Document doc = DebugPlugin.newDocument();
 		Element config = doc.createElement("libraryInfos");    //$NON-NLS-1$
 		doc.appendChild(config);
-						
+
 		// Create a node for each info in the table
 		Iterator<String> locations = fgLibraryInfoMap.keySet().iterator();
 		while (locations.hasNext()) {
@@ -844,14 +844,14 @@
 			locationElemnet.setAttribute("home", home); //$NON-NLS-1$
 			config.appendChild(locationElemnet);
 		}
-		
+
 		// Serialize the Document and return the resulting String
 		return DebugPlugin.serializeDocument(doc);
 	}
-	
+
 	/**
 	 * Creates an XML element for the given info.
-	 * 
+	 *
 	 * @param doc the backing {@link Document}
 	 * @param info the {@link LibraryInfo} to add to the {@link Document}
 	 * @return Element
@@ -864,11 +864,11 @@
 		appendPathElements(doc, "endorsedDirs", libraryElement, info.getEndorsedDirs()); //$NON-NLS-1$
 		return libraryElement;
 	}
-	
+
 	/**
 	 * Appends path elements to the given library element, rooted by an
 	 * element of the given type.
-	 * 
+	 *
 	 * @param doc the backing {@link Document}
 	 * @param elementType the kind of {@link Element} to create
 	 * @param libraryElement the {@link Element} describing a given {@link LibraryInfo} object
@@ -886,7 +886,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Saves the library info in a local workspace state location
 	 */
@@ -908,12 +908,12 @@
 			log(e);
 		}
 	}
-	
+
 	/**
 	 * Restores library information for VMs
 	 */
 	private static void restoreLibraryInfo() {
-		fgLibraryInfoMap = new HashMap<String, LibraryInfo>(10);
+		fgLibraryInfoMap = new HashMap<>(10);
 		IPath libPath = getDefault().getStateLocation();
 		libPath = libPath.append("libraryInfos.xml"); //$NON-NLS-1$
 		File file = libPath.toFile();
@@ -926,7 +926,7 @@
 				if(!root.getNodeName().equals("libraryInfos")) { //$NON-NLS-1$
 					return;
 				}
-				
+
 				NodeList list = root.getChildNodes();
 				int length = list.getLength();
 				for (int i = 0; i < length; ++i) {
@@ -957,16 +957,16 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Checks to see if the time stamp of the file describe by the given location string
-	 * has been modified since the last recorded time stamp. If there is no last recorded 
+	 * has been modified since the last recorded time stamp. If there is no last recorded
 	 * time stamp we assume it has changed. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=266651 for more information
-	 * 
-	 * @param location the location of the SDK we want to check the time stamp for 
+	 *
+	 * @param location the location of the SDK we want to check the time stamp for
 	 * @return <code>true</code> if the time stamp has changed compared to the cached one or if there is
 	 * no recorded time stamp, <code>false</code> otherwise.
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	public static boolean timeStampChanged(String location) {
@@ -996,15 +996,15 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Reads the file of saved time stamps and populates the {@link #fgInstallTimeMap}.
 	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=266651 for more information
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	private static void readInstallInfo() {
-		fgInstallTimeMap = new HashMap<String, Long>();
+		fgInstallTimeMap = new HashMap<>();
 		IPath libPath = getDefault().getStateLocation();
 		libPath = libPath.append(".install.xml"); //$NON-NLS-1$
 		File file = libPath.toFile();
@@ -1030,7 +1030,7 @@
 									fgInstallTimeMap.put(loc, l);
 								}
 								catch(NumberFormatException nfe) {
-								//do nothing	
+								//do nothing
 								}
 							}
 						}
@@ -1045,11 +1045,11 @@
 			}
 		}
 	}
-	
+
 	/**
-	 * Writes out the mappings of SDK install time stamps to disk. See 
+	 * Writes out the mappings of SDK install time stamps to disk. See
 	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=266651 for more information.
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	private static void writeInstallInfo() {
@@ -1089,7 +1089,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns paths stored in XML
 	 * @param lib the library path in {@link Element} form
@@ -1097,7 +1097,7 @@
 	 * @return paths stored in XML
 	 */
 	private static String[] getPathsFromXML(Element lib, String pathType) {
-		List<String> paths = new ArrayList<String>();
+		List<String> paths = new ArrayList<>();
 		NodeList list = lib.getChildNodes();
 		int length = list.getLength();
 		for (int i = 0; i < length; ++i) {
@@ -1128,7 +1128,7 @@
 		}
 		return paths.toArray(new String[paths.size()]);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
 	 */
@@ -1136,21 +1136,21 @@
 	public void launchesRemoved(ILaunch[] launches) {
 		ArchiveSourceLocation.closeArchives();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
 	 */
 	@Override
 	public void launchesAdded(ILaunch[] launches) {
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
 	 */
 	@Override
 	public void launchesChanged(ILaunch[] launches) {
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
 	 */
@@ -1166,10 +1166,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns a shared XML parser.
-	 * 
+	 *
 	 * @return an XML parser
 	 * @throws CoreException if unable to create a parser
 	 * @since 3.0
@@ -1187,10 +1187,10 @@
 		}
 		return fgXMLParser;
 	}
-	
+
 	/**
 	 * Throws an exception with the given message and underlying exception.
-	 * 
+	 *
 	 * @param message error message
 	 * @param exception underlying exception or <code>null</code> if none
 	 * @throws CoreException if an exception occurs
@@ -1199,13 +1199,13 @@
 		IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), 0, message, exception);
 		throw new CoreException(status);
 	}
-	
+
 	/**
 	 * Compares two URL for equality, but do not connect to do DNS resolution
-	 * 
+	 *
 	 * @param url1 a given URL
 	 * @param url2 another given URL to compare to url1
-	 * 
+	 *
 	 * @since 3.5
 	 * @return <code>true</code> if the URLs are equal, <code>false</code> otherwise
 	 */
@@ -1233,7 +1233,7 @@
 	}
 
 	/**
-	 * Gets the external form of this URL. In particular, it trims any white space, 
+	 * Gets the external form of this URL. In particular, it trims any white space,
 	 * removes a trailing slash and creates a lower case string.
 	 * @param url the URL to get the {@link String} value of
 	 * @return the lower-case {@link String} form of the given URL
@@ -1274,7 +1274,7 @@
 		DEBUG = options.getBooleanOption(DEBUG_FLAG, false);
 		DEBUG_JRE_CONTAINER = DEBUG && options.getBooleanOption(DEBUG_JRE_CONTAINER_FLAG, false);
 	}
-	
+
 	/**
 	 * Prints the given message to System.out and to the OSGi tracing (if started)
 	 * @param option the option or <code>null</code>
@@ -1288,10 +1288,10 @@
 			fgDebugTrace.trace(option, message, throwable);
 		}
 	}
-	
+
 	/**
 	 * Prints the given message to System.out and to the OSGi tracing (if enabled)
-	 * 
+	 *
 	 * @param message the message or <code>null</code>
 	 * @since 3.8
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPreferenceInitializer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPreferenceInitializer.java
index 2e37837..70a7eb6 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPreferenceInitializer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LaunchingPreferenceInitializer.java
@@ -42,10 +42,10 @@
 		} catch (BackingStoreException e) {
 			LaunchingPlugin.log(e);
 		}
-				
+
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=255381
 		// NOTE: only the pref's default value is initialized to avoid deadlock (we don't set the
-		// associated JavaCore options, as this can trigger a job to touch the project (see 
+		// associated JavaCore options, as this can trigger a job to touch the project (see
 		// bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=260445)
 		String launchFilter = "*." + ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION; //$NON-NLS-1$
 		dnode = DefaultScope.INSTANCE.getNode(JavaCore.PLUGIN_ID);
@@ -78,7 +78,7 @@
 		else {
 			dnode.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, launchFilter);
 		}
-		
+
 		try {
 			dnode.flush();
 		} catch (BackingStoreException e) {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LibraryInfo.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LibraryInfo.java
index d9774cf..1cc463f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LibraryInfo.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/LibraryInfo.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,44 +20,44 @@
 	private String[] fBootpath;
 	private String[] fExtensionDirs;
 	private String[] fEndorsedDirs;
-	
+
 	public LibraryInfo(String version, String[] bootpath, String[] extDirs, String[] endDirs) {
 		fVersion = version;
 		fBootpath = bootpath;
 		fExtensionDirs = extDirs;
 		fEndorsedDirs = endDirs;
 	}
-	
+
 	/**
 	 * Returns the version of this VM install.
-	 * 
+	 *
 	 * @return version
 	 */
 	public String getVersion() {
-		return fVersion; 
+		return fVersion;
 	}
-	
+
 	/**
 	 * Returns a collection of extension directory paths for this VM install.
-	 * 
+	 *
 	 * @return a collection of absolute paths
 	 */
 	public String[] getExtensionDirs() {
 		return fExtensionDirs;
 	}
-	
+
 	/**
 	 * Returns a collection of bootpath entries for this VM install.
-	 * 
+	 *
 	 * @return a collection of absolute paths
 	 */
 	public String[] getBootpath() {
 		return fBootpath;
 	}
-	
+
 	/**
 	 * Returns a collection of endorsed directory paths for this VM install.
-	 * 
+	 *
 	 * @return a collection of absolute paths
 	 */
 	public String[] getEndorsedDirs() {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/MacInstalledJREs.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/MacInstalledJREs.java
index aaa7fc3..07a339c 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/MacInstalledJREs.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/MacInstalledJREs.java
@@ -37,7 +37,7 @@
  * Searches for installed JREs on the Mac.
  */
 public class MacInstalledJREs {
-	
+
 	/** The executable for 'java_home' */
 	private static final String JAVA_HOME_PLIST = "/usr/libexec/java_home"; //$NON-NLS-1$
 	/** The plist attribute describing the JRE home directory */
@@ -51,34 +51,34 @@
 	 * @since 3.8
 	 */
 	private static final String PLIST_JVM_BUNDLE_ID = "JVMBundleID"; //$NON-NLS-1$
-	
+
 	public static final VMStandin[] NO_VMS = new VMStandin[0];
-	
+
 	/**
 	 * Custom stand-in that allows us to provide a version
 	 * @since 3.7.0
 	 */
 	public static class MacVMStandin extends VMStandin {
-		
+
 		String version = null;
-		
+
 		public MacVMStandin(IVMInstallType type, File location, String name, String version, String id) {
 			super(type, id);
 			setInstallLocation(location);
 			setName(name);
 			this.version = version;
 		}
-		
+
 		@Override
 		public String getJavaVersion() {
 			return version;
 		}
 	}
-	
+
 	/**
 	 * Parses the XML output produced from "java_home -X" (see bug 325777), and return a collection
 	 * of descriptions of JRE installations.
-	 * 
+	 *
 	 * @param monitor the {@link IProgressMonitor} or <code>null</code>
 	 * @return array of {@link VMStandin}s installed in the OS
 	 * @exception CoreException if unable to parse the output or the executable does not exist
@@ -120,10 +120,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Parses the output from 'java_home -X'.
-	 * 
+	 *
 	 * @param process process with output from 'java_home -X'
 	 * @param the {@link IProgressMonitor} or <code>null</code>
 	 * @return array JRE descriptions installed in the OS
@@ -141,11 +141,11 @@
 		}
 		return NO_VMS;
 	}
-	
+
 	/**
-	 * Parse {@link JREDescriptor}s from the given input stream. The stream is expected to be in the 
+	 * Parse {@link JREDescriptor}s from the given input stream. The stream is expected to be in the
 	 * XML properties format.
-	 * 
+	 *
 	 * @param monitor the {@link IProgressMonitor} or <code>null</code>
 	 * @param stream
 	 * @return the array of {@link VMStandin}s or an empty array never <code>null</code>
@@ -158,7 +158,7 @@
 			if (result instanceof Object[]) {
 				Object[] maps = (Object[]) result;
 				smonitor.setWorkRemaining(maps.length);
-				List<VMStandin> jres= new ArrayList<VMStandin>();
+				List<VMStandin> jres= new ArrayList<>();
 				AbstractVMInstallType mactype = (AbstractVMInstallType) JavaRuntime.getVMInstallType("org.eclipse.jdt.internal.launching.macosx.MacOSXType"); //$NON-NLS-1$
 				if(mactype != null) {
 					for (int i = 0; i < maps.length; i++) {
@@ -185,9 +185,9 @@
 								vm.setLibraryLocations(mactype.getDefaultLibraryLocations(loc));
 								vm.setVMArgs(mactype.getDefaultVMArguments(loc));
 								if (!jres.contains(vm)) { // remove duplicates
-									jres.add(vm);	
+									jres.add(vm);
 								}
-							} 
+							}
 						}
 						smonitor.worked(1);
 					}
@@ -202,7 +202,7 @@
 		}
 		return NO_VMS;
 	}
-	
+
 	/**
 	 * Tries to compute the descriptor id using the {@link #PLIST_JVM_BUNDLE_ID}. If that is not defined
 	 * we fall back to using the version.
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PListParser.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PListParser.java
index 39f2cad..315574d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PListParser.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PListParser.java
@@ -38,7 +38,7 @@
  * Parses an XML property list into its associated objects.
  */
 public class PListParser {
-	
+
 	/**
 	 * Constants for XML element names and attributes
 	 */
@@ -50,11 +50,11 @@
 	private static final String FALSE_ELEMENT = "false"; //$NON-NLS-1$
 	private static final String INT_ELEMENT = "integer"; //$NON-NLS-1$
 	private static final String STRING_ELEMENT = "string"; //$NON-NLS-1$
-	
+
 	/**
 	 * Parses the given input stream which corresponds to an XML plist. See the DTD
 	 * here: http://www.apple.com/DTDs/PropertyList-1.0.dtd
-	 * 
+	 *
 	 * @param stream XML plist input stream
 	 * @return Object(s) in the stream
 	 * @throws CoreException if an error occurs
@@ -64,25 +64,25 @@
 			stream = new BufferedInputStream(stream);
 			return parseXML(stream);
 		} catch (FileNotFoundException e) {
-			abort(e);					
+			abort(e);
 		} catch (SAXException e) {
-			abort(e);					
+			abort(e);
 		} catch (ParserConfigurationException e) {
-			abort(e);					
+			abort(e);
 		} catch (IOException e) {
-			abort(e);					
+			abort(e);
 		} finally {
 			if (stream != null) {
 				try {
 					stream.close();
 				} catch (IOException e) {
-					abort(e);					
+					abort(e);
 				}
 			}
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Return a LaunchConfigurationInfo object initialized from XML contained in
 	 * the specified stream.  Simply pass out any exceptions encountered so that
@@ -108,7 +108,7 @@
 		DocumentBuilder parser = documentBuilderFactory.newDocumentBuilder();
 		parser.setErrorHandler(new DefaultHandler());
 		root = parser.parse(new InputSource(stream)).getDocumentElement();
-		if (!root.getNodeName().equalsIgnoreCase(PLIST_ELEMENT)) { 
+		if (!root.getNodeName().equalsIgnoreCase(PLIST_ELEMENT)) {
 			throw getInvalidFormatException();
 		}
 		NodeList list = root.getChildNodes();
@@ -124,35 +124,35 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns an invalid format exception
-	 * 
+	 *
 	 * @return an invalid format exception
 	 */
 	private CoreException getInvalidFormatException() {
 		return new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, "Invalid plist XML", null)); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Parses and returns an object from the given root element, possibly <code>null</code>.
-	 * 
+	 *
 	 * @param element the root node from the XML document
 	 * @return parsed object or <code>null</code>
 	 * @throws CoreException if an error occurs
 	 */
 	private Object parseObject(Element element) throws CoreException {
 		String nodeName = element.getNodeName();
-		if (nodeName.equalsIgnoreCase(ARRAY_ELEMENT)) { 
+		if (nodeName.equalsIgnoreCase(ARRAY_ELEMENT)) {
 			return parseArray(element);
-		} else if (nodeName.equalsIgnoreCase(DICT_ELEMENT)) { 
+		} else if (nodeName.equalsIgnoreCase(DICT_ELEMENT)) {
 			return parseDictionary(element);
-		} else if (nodeName.equalsIgnoreCase(KEY_ELEMENT))  { 
+		} else if (nodeName.equalsIgnoreCase(KEY_ELEMENT))  {
 			return getText(element);
-		} else if (nodeName.equalsIgnoreCase(TRUE_ELEMENT)) {   
-			return Boolean.TRUE;			
-		} else if (nodeName.equalsIgnoreCase(FALSE_ELEMENT)) {    
-			return Boolean.FALSE;								
+		} else if (nodeName.equalsIgnoreCase(TRUE_ELEMENT)) {
+			return Boolean.TRUE;
+		} else if (nodeName.equalsIgnoreCase(FALSE_ELEMENT)) {
+			return Boolean.FALSE;
 		} else if(nodeName.equalsIgnoreCase(INT_ELEMENT)) {
 			try {
 				return new Integer(Integer.parseInt(getText(element)));
@@ -163,17 +163,17 @@
 			return getText(element);
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Parses and returns an array from the given root element, possibly empty.
-	 * 
+	 *
 	 * @param root the root array node from the XML document
 	 * @return parsed array or <code>null</code>
 	 * @throws CoreException if an error occurs
 	 */
 	private Object[] parseArray(Element root) throws CoreException {
-		List<Object> collection = new ArrayList<Object>();
+		List<Object> collection = new ArrayList<>();
 		NodeList list = root.getChildNodes();
 		Node node = null;
 		Element element = null;
@@ -189,17 +189,17 @@
 			}
 		}
 		return collection.toArray();
-	}	
-	
+	}
+
 	/**
 	 * Parses and returns a map from the given dictionary element, possibly empty.
-	 * 
+	 *
 	 * @param root the root dictionary node from the XML document
 	 * @return parsed map or <code>null</code>
 	 * @throws CoreException if an error occurs
 	 */
 	private Map<String, Object> parseDictionary(Element root) throws CoreException {
-		Map<String, Object> dict = new HashMap<String, Object>();
+		Map<String, Object> dict = new HashMap<>();
 		NodeList list = root.getChildNodes();
 		Node node = null;
 		Element element = null;
@@ -211,7 +211,7 @@
 			if (nodeType == Node.ELEMENT_NODE) {
 				element = (Element) node;
 				nodeName = element.getNodeName();
-				if (nodeName.equalsIgnoreCase(KEY_ELEMENT)) { 
+				if (nodeName.equalsIgnoreCase(KEY_ELEMENT)) {
 					key = getText(element);
 				} else {
 					dict.put(key, parseObject(element));
@@ -219,12 +219,12 @@
 			}
 		}
 		return dict;
-	}		
-	
+	}
+
 	/**
 	 * Returns the value of the first child text node from the given element,
 	 * or <code>null</code>.
-	 * 
+	 *
 	 * @param root the root element
 	 * @return its text or <code>null</code> if none
 	 */
@@ -240,7 +240,7 @@
 		}
 		return null;
 	}
-	
+
 	private void abort(Throwable t) throws CoreException {
 		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, "Exception occurred parsing property list", t)); //$NON-NLS-1$
 	}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PackageFragmentRootSourceContainerTypeDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PackageFragmentRootSourceContainerTypeDelegate.java
index 880568b..570bcf8 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PackageFragmentRootSourceContainerTypeDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/PackageFragmentRootSourceContainerTypeDelegate.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
 
 /**
  * Package fragment root source container type.
- * 
+ *
  * @since 3.0
  */
 public class PackageFragmentRootSourceContainerTypeDelegate extends AbstractSourceContainerTypeDelegate {
@@ -39,18 +39,18 @@
 			if ("packageFragmentRoot".equals(element.getNodeName())) { //$NON-NLS-1$
 				String string = element.getAttribute("handle"); //$NON-NLS-1$
 				if (string == null || string.length() == 0) {
-					abort(LaunchingMessages.PackageFragmentRootSourceContainerTypeDelegate_6, null); 
+					abort(LaunchingMessages.PackageFragmentRootSourceContainerTypeDelegate_6, null);
 				}
 				IJavaElement root = JavaCore.create(string);
 				if (root != null && root instanceof IPackageFragmentRoot) {
 					return new PackageFragmentRootSourceContainer((IPackageFragmentRoot)root);
 				}
-				abort(LaunchingMessages.PackageFragmentRootSourceContainerTypeDelegate_7, null); 
+				abort(LaunchingMessages.PackageFragmentRootSourceContainerTypeDelegate_7, null);
 			} else {
-				abort(LaunchingMessages.PackageFragmentRootSourceContainerTypeDelegate_8, null); 
+				abort(LaunchingMessages.PackageFragmentRootSourceContainerTypeDelegate_8, null);
 			}
 		}
-		abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_7, null); 
+		abort(LaunchingMessages.JavaProjectSourceContainerTypeDelegate_7, null);
 		return null;
 	}
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ProjectClasspathVariableResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ProjectClasspathVariableResolver.java
index a23b7a9..9980ff9 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ProjectClasspathVariableResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ProjectClasspathVariableResolver.java
@@ -56,7 +56,7 @@
 		if (javaProject.exists()) {
 			IRuntimeClasspathEntry2 defClassPath = (IRuntimeClasspathEntry2) JavaRuntime.newDefaultProjectClasspathEntry(javaProject);
 			IRuntimeClasspathEntry[] entries = defClassPath.getRuntimeClasspathEntries(null);
-			List<IRuntimeClasspathEntry> collect = new ArrayList<IRuntimeClasspathEntry>();
+			List<IRuntimeClasspathEntry> collect = new ArrayList<>();
 			for (int i = 0; i < entries.length; i++) {
 				IRuntimeClasspathEntry[] children = JavaRuntime.resolveRuntimeClasspathEntry(entries[i], javaProject);
 				for (int j = 0; j < children.length; j++) {
@@ -75,13 +75,13 @@
 		}
 		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, NLS.bind(LaunchingMessages.ProjectClasspathVariableResolver_1, new String[]{argument})));
 	}
-	
+
 	/**
 	 * Returns the selected resource. Uses the ${selected_resource_path} variable
 	 * to determine the selected resource. This variable is provided by the debug.ui
 	 * plug-in. Selected resource resolution is only available when the debug.ui
 	 * plug-in is present.
-	 * 
+	 *
 	 * @return selected resource
 	 * @throws CoreException if there is no selection
 	 */
@@ -93,7 +93,7 @@
 		} catch (CoreException e) {
 			// unable to resolve a selection
 		}
-		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, LaunchingMessages.ProjectClasspathVariableResolver_3));	
+		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.ID_PLUGIN, LaunchingMessages.ProjectClasspathVariableResolver_3));
 	}
 
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java
index 66df845..df2e510 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     BEA - Daniel R Somerfield - Bug 88939
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
@@ -42,7 +42,7 @@
 /**
  * An entry on the runtime classpath that the user can manipulate
  * and share in a launch configuration.
- * 
+ *
  * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry
  * @since 2.0
  */
@@ -52,36 +52,36 @@
 	 * This entry's type - must be set on creation.
 	 */
 	private int fType = -1;
-	
+
 	/**
 	 * This entry's classpath property.
 	 */
 	private int fClasspathProperty = -1;
-	
+
 	/**
 	 * This entry's associated build path entry.
 	 */
 	private IClasspathEntry fClasspathEntry = null;
-	
+
 	/**
 	 * The entry's resolved entry (lazily initialized)
 	 */
 	private IClasspathEntry fResolvedEntry = null;
-	
+
 	/**
 	 * Associated Java project, or <code>null</code>
 	 */
 	private IJavaProject fJavaProject = null;
-	
+
 	/**
 	 * The path if the entry was invalid and fClasspathEntry is null
 	 */
 	private IPath fInvalidPath;
-	
+
 	/**
 	 * Constructs a new runtime classpath entry based on the
 	 * (build) classpath entry.
-	 * 
+	 *
 	 * @param entry the associated classpath entry
 	 */
 	public RuntimeClasspathEntry(IClasspathEntry entry) {
@@ -96,15 +96,15 @@
 				setType(VARIABLE);
 				break;
 			default:
-				throw new IllegalArgumentException(NLS.bind(LaunchingMessages.RuntimeClasspathEntry_Illegal_classpath_entry__0__1, new String[] {entry.toString()})); 
+				throw new IllegalArgumentException(NLS.bind(LaunchingMessages.RuntimeClasspathEntry_Illegal_classpath_entry__0__1, new String[] {entry.toString()}));
 		}
 		setClasspathEntry(entry);
 		initializeClasspathProperty();
 	}
-	
+
 	/**
 	 * Constructs a new container entry in the context of the given project
-	 * 
+	 *
 	 * @param entry classpath entry
 	 * @param classpathProperty this entry's classpath property
 	 */
@@ -114,30 +114,30 @@
 				setType(CONTAINER);
 				break;
 			default:
-				throw new IllegalArgumentException(NLS.bind(LaunchingMessages.RuntimeClasspathEntry_Illegal_classpath_entry__0__1, new String[] {entry.toString()})); 
+				throw new IllegalArgumentException(NLS.bind(LaunchingMessages.RuntimeClasspathEntry_Illegal_classpath_entry__0__1, new String[] {entry.toString()}));
 		}
 		setClasspathEntry(entry);
 		setClasspathProperty(classpathProperty);
-	}	
+	}
 
 	/**
 	 * Reconstructs a runtime classpath entry from the given
 	 * XML document root not.
-	 * 
+	 *
 	 * @param root a memento root doc element created by this class
 	 * @exception CoreException if unable to restore from the given memento
 	 */
-	public RuntimeClasspathEntry(Element root) throws CoreException {									
+	public RuntimeClasspathEntry(Element root) throws CoreException {
 		try {
 			setType(Integer.parseInt(root.getAttribute("type"))); //$NON-NLS-1$
 		} catch (NumberFormatException e) {
-			abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry_type_2, e); 
+			abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry_type_2, e);
 		}
 		try {
 			setClasspathProperty(Integer.parseInt(root.getAttribute("path"))); //$NON-NLS-1$
 		} catch (NumberFormatException e) {
-			abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry_location_3, e); 
-		}			
+			abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry_location_3, e);
+		}
 
 		// source attachment
 		IPath sourcePath = null;
@@ -149,13 +149,13 @@
 		path = root.getAttribute("sourceRootPath"); //$NON-NLS-1$
 		if (path != null && path.length() > 0) {
 			rootPath = new Path(path);
-		}			
+		}
 
 		switch (getType()) {
 			case PROJECT :
 				String name = root.getAttribute("projectName"); //$NON-NLS-1$
 				if (isEmpty(name)) {
-					abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_project_name_4, null); 
+					abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_project_name_4, null);
 				} else {
 					IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
 					setClasspathEntry(JavaCore.newProjectEntry(proj.getFullPath()));
@@ -167,7 +167,7 @@
 					// internal
 					path = root.getAttribute("internalArchive"); //$NON-NLS-1$
 					if (isEmpty(path)) {
-						abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_archive_path_5, null); 
+						abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_archive_path_5, null);
 					} else {
 						setClasspathEntry(createLibraryEntry(sourcePath, rootPath, path));
 					}
@@ -179,7 +179,7 @@
 			case VARIABLE :
 				String var = root.getAttribute("containerPath"); //$NON-NLS-1$
 				if (isEmpty(var)) {
-					abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_variable_name_6, null); 
+					abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_variable_name_6, null);
 				} else {
 					setClasspathEntry(JavaCore.newVariableEntry(new Path(var), sourcePath, rootPath));
 				}
@@ -187,13 +187,13 @@
 			case CONTAINER :
 				var = root.getAttribute("containerPath"); //$NON-NLS-1$
 				if (isEmpty(var)) {
-					abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_variable_name_6, null); 
+					abort(LaunchingMessages.RuntimeClasspathEntry_Unable_to_recover_runtime_class_path_entry___missing_variable_name_6, null);
 				} else {
 					setClasspathEntry(JavaCore.newContainerEntry(new Path(var)));
 				}
 				break;
-		}	
-		
+		}
+
 		String name = root.getAttribute("javaProject"); //$NON-NLS-1$
 		if (isEmpty(name)) {
 			fJavaProject = null;
@@ -209,11 +209,11 @@
 		{
 			fInvalidPath = p;
 			return null;
-			//abort("There was a problem with path \" " + path + "\": paths must be absolute.", null);			
+			//abort("There was a problem with path \" " + path + "\": paths must be absolute.", null);
 		}
 		return JavaCore.newLibraryEntry(p, sourcePath, rootPath);
 	}
-	
+
 	/**
 	 * Throws an internal error exception
 	 * @param message the message
@@ -222,7 +222,7 @@
 	 */
 	protected void abort(String message, Throwable e)	throws CoreException {
 		IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
-		throw new CoreException(s);		
+		throw new CoreException(s);
 	}
 
 	/**
@@ -235,7 +235,7 @@
 
 	/**
 	 * Sets this entry's type
-	 * 
+	 *
 	 * @param type this entry's type
 	 */
 	private void setType(int type) {
@@ -287,7 +287,7 @@
 			case CONTAINER :
 				node.setAttribute("containerPath", getPath().toString()); //$NON-NLS-1$
 				break;
-		}		
+		}
 		if (getSourceAttachmentPath() != null) {
 			node.setAttribute("sourceAttachmentPath", getSourceAttachmentPath().toString()); //$NON-NLS-1$
 		}
@@ -325,12 +325,12 @@
 				return getResource(getPath());
 		}
 	}
-	
+
 	/**
 	 * Returns the resource in the workspace associated with the given
 	 * absolute path, or <code>null</code> if none. The path may have
 	 * a device.
-	 * 
+	 *
 	 * @param path absolute path, or <code>null</code>
 	 * @return resource or <code>null</code>
 	 */
@@ -351,8 +351,8 @@
 			if (path.getDevice() == null) {
 				// search relative to the workspace if no device present
 				return root.findMember(path);
-			} 
-		}		
+			}
+		}
 		return null;
 	}
 
@@ -404,7 +404,7 @@
 		}
 		updateClasspathEntry(getPath(), getSourceAttachmentPath(), getSourceAttachmentRootPath(), path);
 	}
-	
+
 	/**
 	 * @see IRuntimeClasspathEntry#getSourceAttachmentRootPath()
 	 */
@@ -428,7 +428,7 @@
 		}
 		updateClasspathEntry(getPath(), getSourceAttachmentPath(), path, getExternalAnnotationsPath());
 	}
-	
+
 	/**
 	 * Initializes the classpath property based on this entry's type.
 	 */
@@ -449,8 +449,8 @@
 				break;
 		}
 	}
-	
-	
+
+
 	/**
 	 * @see IRuntimeClasspathEntry#setClasspathProperty(int)
 	 */
@@ -499,7 +499,7 @@
 		}
 		return resolveToOSPath(path);
 	}
-	
+
 	/**
 	 * Returns the OS path for the given absolute or workspace relative path
 	 * @param path the path
@@ -514,13 +514,13 @@
 			}
 			if (res == null) {
 				return path.toOSString();
-			} 
+			}
 			IPath location = res.getLocation();
 			if (location != null) {
 				return location.toOSString();
 			}
 		}
-		return null;		
+		return null;
 	}
 
 	/**
@@ -578,7 +578,7 @@
 		}
 		return one.equals(two);
 	}
-	
+
 	/**
 	 * @see Object#hashCode()
 	 */
@@ -657,10 +657,10 @@
 				break;
 			default:
 				return;
-		}		
-		setClasspathEntry(entry);		
+		}
+		setClasspathEntry(entry);
 	}
-	
+
 	private static IClasspathAttribute[] setClasspathAttribute(IClasspathAttribute[] attributes, String name, String value) {
 		for (int i = attributes.length; --i >= 0;) {
 			if (name.equals(attributes[i].getName())) {
@@ -687,18 +687,18 @@
 		}
 		return fResolvedEntry;
 	}
-		
+
 	protected boolean isEmpty(String string) {
 		return string == null || string.length() == 0;
 	}
-	
+
 	@Override
 	public String toString() {
 		if (fClasspathEntry != null) {
 			return fClasspathEntry.toString();
 		}
 		return super.toString();
-		
+
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getJavaProject()
@@ -707,10 +707,10 @@
 	public IJavaProject getJavaProject() {
 		return fJavaProject;
 	}
-	
+
 	/**
 	 * Sets the Java project associated with this classpath entry.
-	 * 
+	 *
 	 * @param project Java project
 	 */
 	public void setJavaProject(IJavaProject project) {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryListComparator.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryListComparator.java
index f975091..aeb451f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryListComparator.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryListComparator.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +26,7 @@
 	public int compare(Object o1, Object o2) {
 		List<?> list1 = (List<?>)o1;
 		List<?> list2 = (List<?>)o2;
-		
+
 		if (list1.size() == list2.size()) {
 			for (int i = 0; i < list1.size(); i++) {
 				String memento1 = (String)list1.get(i);
@@ -39,7 +39,7 @@
 		}
 		return -1;
 	}
-	
+
 	protected boolean equalsIgnoreWhitespace(String one, String two) {
 		int i1 = 0;
 		int i2 = 0;
@@ -59,7 +59,7 @@
 			}
 			if (ch1 != ch2) {
 				return false;
-			}			
+			}
 			i1++;
 			i2++;
 		}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryResolver.java
index cd1abdd..6906f1b 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntryResolver.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
 
- 
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.debug.core.ILaunchConfiguration;
@@ -27,9 +27,9 @@
 public class RuntimeClasspathEntryResolver implements IRuntimeClasspathEntryResolver2 {
 
 	private IConfigurationElement fConfigurationElement;
-	
+
 	private IRuntimeClasspathEntryResolver fDelegate;
-	
+
 	/**
 	 * Constructs a new resolver on the given configuration element
 	 * @param element the element
@@ -37,7 +37,7 @@
 	public RuntimeClasspathEntryResolver(IConfigurationElement element) {
 		fConfigurationElement = element;
 	}
-	
+
 	/**
 	 * @see IRuntimeClasspathEntryResolver#resolveRuntimeClasspathEntry(IRuntimeClasspathEntry, ILaunchConfiguration)
 	 */
@@ -45,11 +45,11 @@
 	public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, ILaunchConfiguration configuration) throws CoreException {
 		return getResolver().resolveRuntimeClasspathEntry(entry, configuration);
 	}
-	
+
 	/**
-	 * Returns the resolver delegate (and creates if required) 
+	 * Returns the resolver delegate (and creates if required)
 	 * @return the resolver
-	 * @throws CoreException if an error occurs 
+	 * @throws CoreException if an error occurs
 	 */
 	protected IRuntimeClasspathEntryResolver getResolver() throws CoreException {
 		if (fDelegate == null) {
@@ -57,7 +57,7 @@
 		}
 		return fDelegate;
 	}
-	
+
 	/**
 	 * Returns the variable name this resolver is registered for, or <code>null</code>
 	 * @return the variable name or <code>null</code>
@@ -65,15 +65,15 @@
 	public String getVariableName() {
 		return fConfigurationElement.getAttribute("variable"); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Returns the container id this resolver is registered for, or <code>null</code>
 	 * @return the id or <code>null</code>
 	 */
 	public String getContainerId() {
 		return fConfigurationElement.getAttribute("container"); //$NON-NLS-1$
-	}	
-	
+	}
+
 	/**
 	 * Returns the runtime classpath entry id this resolver is registered
 	 * for,or <code>null</code> if none.
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathProvider.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathProvider.java
index 4241fc9..571a474 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathProvider.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathProvider.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
 
- 
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.debug.core.ILaunchConfiguration;
@@ -23,9 +23,9 @@
 public class RuntimeClasspathProvider implements IRuntimeClasspathProvider {
 
 	private IConfigurationElement fConfigurationElement;
-	
+
 	private IRuntimeClasspathProvider fDelegate;
-	
+
 	/**
 	 * Constructs a new resolver on the given configuration element
 	 * @param element the element
@@ -33,9 +33,9 @@
 	public RuntimeClasspathProvider(IConfigurationElement element) {
 		fConfigurationElement = element;
 	}
-		
+
 	/**
-	 * Returns the resolver delegate (and creates if required) 
+	 * Returns the resolver delegate (and creates if required)
 	 * @return the provider
 	 * @throws CoreException if an error occurs
 	 */
@@ -45,7 +45,7 @@
 		}
 		return fDelegate;
 	}
-	
+
 	public String getIdentifier() {
 		return fConfigurationElement.getAttribute("id"); //$NON-NLS-1$
 	}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketAttachConnector.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketAttachConnector.java
index cabc0ad..2272091 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketAttachConnector.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketAttachConnector.java
@@ -45,10 +45,10 @@
  * A standard socket attaching connector
  */
 public class SocketAttachConnector implements IVMConnector {
-		
+
 	/**
 	 * Return the socket transport attaching connector
-	 * 
+	 *
 	 * @return the {@link AttachingConnector}
 	 * @exception CoreException if unable to locate the connector
 	 */
@@ -63,7 +63,7 @@
 			}
 		}
 		if (connector == null) {
-			abort(LaunchingMessages.SocketAttachConnector_Socket_attaching_connector_not_available_3, null, IJavaLaunchConfigurationConstants.ERR_SHARED_MEMORY_CONNECTOR_UNAVAILABLE); 
+			abort(LaunchingMessages.SocketAttachConnector_Socket_attaching_connector_not_available_3, null, IJavaLaunchConfigurationConstants.ERR_SHARED_MEMORY_CONNECTOR_UNAVAILABLE);
 		}
 		return connector;
 	}
@@ -81,13 +81,13 @@
 	 */
 	@Override
 	public String getName() {
-		return LaunchingMessages.SocketAttachConnector_Standard__Socket_Attach__4; 
+		return LaunchingMessages.SocketAttachConnector_Standard__Socket_Attach__4;
 	}
-	
+
 	/**
 	 * Throws a core exception with an error status object built from
 	 * the given message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the
 	 *  error, or <code>null</code> if none
@@ -96,7 +96,7 @@
 	 */
 	protected static void abort(String message, Throwable exception, int code) throws CoreException {
 		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), code, message, exception));
-	}		
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMConnector#connect(java.util.Map, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.debug.core.ILaunch)
@@ -106,40 +106,40 @@
 		if (monitor == null) {
 			monitor = new NullProgressMonitor();
 		}
-		
+
 		IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
-		subMonitor.beginTask(LaunchingMessages.SocketAttachConnector_Connecting____1, 2); 
-		subMonitor.subTask(LaunchingMessages.SocketAttachConnector_Configuring_connection____1); 
-		
+		subMonitor.beginTask(LaunchingMessages.SocketAttachConnector_Connecting____1, 2);
+		subMonitor.subTask(LaunchingMessages.SocketAttachConnector_Configuring_connection____1);
+
 		AttachingConnector connector= getAttachingConnector();
 		String portNumberString = arguments.get("port"); //$NON-NLS-1$
 		if (portNumberString == null) {
-			abort(LaunchingMessages.SocketAttachConnector_Port_unspecified_for_remote_connection__2, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_PORT); 
+			abort(LaunchingMessages.SocketAttachConnector_Port_unspecified_for_remote_connection__2, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_PORT);
 		}
 		String host = arguments.get("hostname"); //$NON-NLS-1$
 		if (host == null) {
-			abort(LaunchingMessages.SocketAttachConnector_Hostname_unspecified_for_remote_connection__4, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_HOSTNAME); 
+			abort(LaunchingMessages.SocketAttachConnector_Hostname_unspecified_for_remote_connection__4, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_HOSTNAME);
 		}
 		Map<String, Connector.Argument> map= connector.defaultArguments();
-		
+
         Connector.Argument param= map.get("hostname"); //$NON-NLS-1$
 		param.setValue(host);
 		param= map.get("port"); //$NON-NLS-1$
 		param.setValue(portNumberString);
-        
+
         String timeoutString = arguments.get("timeout"); //$NON-NLS-1$
         if (timeoutString != null) {
             param= map.get("timeout"); //$NON-NLS-1$
             param.setValue(timeoutString);
         }
-        
+
 		ILaunchConfiguration configuration = launch.getLaunchConfiguration();
 		boolean allowTerminate = false;
 		if (configuration != null) {
 			allowTerminate = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_ALLOW_TERMINATE, false);
 		}
 		subMonitor.worked(1);
-		subMonitor.subTask(LaunchingMessages.SocketAttachConnector_Establishing_connection____2); 
+		subMonitor.subTask(LaunchingMessages.SocketAttachConnector_Establishing_connection____2);
 		try {
 			VirtualMachine vm = connector.attach(map);
 			String vmLabel = constructVMLabel(vm, host, portNumberString, configuration);
@@ -150,13 +150,13 @@
         } catch (TimeoutException e) {
             abort(LaunchingMessages.SocketAttachConnector_0, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		} catch (UnknownHostException e) {
-			abort(NLS.bind(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_because_of_unknown_host____0___1, new String[]{host}), e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+			abort(NLS.bind(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_because_of_unknown_host____0___1, new String[]{host}), e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		} catch (ConnectException e) {
-			abort(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_as_connection_was_refused_2, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+			abort(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_as_connection_was_refused_2, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		} catch (IOException e) {
-			abort(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_1, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+			abort(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_1, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		} catch (IllegalConnectorArgumentsException e) {
-			abort(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_1, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+			abort(LaunchingMessages.SocketAttachConnector_Failed_to_connect_to_remote_VM_1, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		}
 	}
 
@@ -188,11 +188,11 @@
 		if(!"".equals(name)) { //$NON-NLS-1$
 			buffer.append(' ');
 		}
-		buffer.append('['); 
+		buffer.append('[');
 		buffer.append(host);
-		buffer.append(':'); 
+		buffer.append(':');
 		buffer.append(port);
-		buffer.append(']'); 
+		buffer.append(']');
 		return buffer.toString();
 	}
 
@@ -212,7 +212,7 @@
 	 */
 	@Override
 	public List<String> getArgumentOrder() {
-		List<String> list = new ArrayList<String>(2);
+		List<String> list = new ArrayList<>(2);
 		list.add("hostname"); //$NON-NLS-1$
 		list.add("port"); //$NON-NLS-1$
 		return list;
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnector.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnector.java
index 7ee5de3..967a56d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnector.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnector.java
@@ -39,10 +39,10 @@
  * @see SocketListenConnectorProcess
  */
 public class SocketListenConnector implements IVMConnector {
-		
+
 	/**
 	 * Return the socket transport listening connector
-	 * 
+	 *
 	 * @return the new {@link ListeningConnector}
 	 * @exception CoreException if unable to locate the connector
 	 */
@@ -57,7 +57,7 @@
 			}
 		}
 		if (connector == null) {
-			abort(LaunchingMessages.SocketListenConnector_0, null, IJavaLaunchConfigurationConstants.ERR_SHARED_MEMORY_CONNECTOR_UNAVAILABLE); 
+			abort(LaunchingMessages.SocketListenConnector_0, null, IJavaLaunchConfigurationConstants.ERR_SHARED_MEMORY_CONNECTOR_UNAVAILABLE);
 		}
 		return connector;
 	}
@@ -75,9 +75,9 @@
 	 */
 	@Override
 	public String getName() {
-		return LaunchingMessages.SocketListenConnector_1; 
+		return LaunchingMessages.SocketListenConnector_1;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMConnector#connect(java.util.Map, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.debug.core.ILaunch)
 	 */
@@ -86,21 +86,21 @@
 		if (monitor == null) {
 			monitor = new NullProgressMonitor();
 		}
-		
+
 		monitor.subTask(LaunchingMessages.SocketListenConnector_2);
-		
+
 		ListeningConnector connector= getListeningConnector();
-		
+
 		String portNumberString = arguments.get("port"); //$NON-NLS-1$
 		if (portNumberString == null) {
-			abort(LaunchingMessages.SocketAttachConnector_Port_unspecified_for_remote_connection__2, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_PORT); 
+			abort(LaunchingMessages.SocketAttachConnector_Port_unspecified_for_remote_connection__2, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_PORT);
 		}
-	
+
 		Map<String, Connector.Argument> acceptArguments = connector.defaultArguments();
-		
+
         Connector.Argument param= acceptArguments.get("port"); //$NON-NLS-1$
 		param.setValue(portNumberString);
-        
+
 		// retain default behaviour to accept 1 connection only
 		int connectionLimit = 1;
 		if (arguments.containsKey("connectionLimit")) { //$NON-NLS-1$
@@ -113,9 +113,9 @@
 			SocketListenConnectorProcess process = new SocketListenConnectorProcess(launch, portNumberString, connectionLimit);
 			process.waitForConnection(connector, acceptArguments);
 		} catch (IOException e) {
-			abort(LaunchingMessages.SocketListenConnector_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+			abort(LaunchingMessages.SocketListenConnector_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		} catch (IllegalConnectorArgumentsException e) {
-			abort(LaunchingMessages.SocketListenConnector_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+			abort(LaunchingMessages.SocketListenConnector_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 		}
 	}
 
@@ -137,7 +137,7 @@
 	 */
 	@Override
 	public List<String> getArgumentOrder() {
-		List<String> list = new ArrayList<String>(1);
+		List<String> list = new ArrayList<>(1);
 		list.add("port"); //$NON-NLS-1$
 		list.add("connectionLimit"); //$NON-NLS-1$
 		return list;
@@ -146,7 +146,7 @@
 	/**
 	 * Throws a core exception with an error status object built from
 	 * the given message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the
 	 *  error, or <code>null</code> if none
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnectorProcess.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnectorProcess.java
index 75c539c..622628e 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnectorProcess.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/SocketListenConnectorProcess.java
@@ -47,7 +47,7 @@
  * A process that represents a VM listening connector that is waiting for some VM(s) to remotely connect. Allows the user to see the status of the
  * connection and terminate it. If a successful connection occurs, the debug target is added to the launch and, if a configured number of connections
  * have been reached, then this process is removed.
- * 
+ *
  * @since 3.4
  * @see SocketListenConnector
  */
@@ -74,7 +74,7 @@
 	 * The system job that will wait for incoming VM connections.
 	 */
 	private WaitForConnectionJob fWaitForConnectionJob;
-	
+
 	/** Time when this instance was created (milliseconds) */
 	private long fStartTime;
 
@@ -90,14 +90,14 @@
 		fPort = port;
 		fConnectionLimit = connectionLimit;
 	}
-	
+
 	/**
-	 * Starts a job that will accept a VM remotely connecting to the 
+	 * Starts a job that will accept a VM remotely connecting to the
 	 * given connector.  The #startListening() method must have been
 	 * called on the connector with the same arguments before calling
 	 * this method.  The 'port' argument in the map should have the same
 	 * value as the port specified in this process' constructor.
-	 * 
+	 *
 	 * @param connector the connector that will accept incoming connections
 	 * @param arguments map of arguments that are used by the connector
 	 * @throws CoreException if a problem occurs trying to accept a connection
@@ -151,7 +151,7 @@
 
 	/**
 	 * Returns an error status using the passed parameters.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the
 	 *  error, or <code>null</code> if none
@@ -161,7 +161,7 @@
 	protected static IStatus getStatus(String message, Throwable exception, int code) {
 		return new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), code, message, exception);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IProcess#getExitValue()
 	 */
@@ -185,7 +185,7 @@
 	public ILaunch getLaunch() {
 		return fLaunch;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
 	 */
@@ -218,7 +218,7 @@
 			fireTerminateEvent();
 		}
 	}
-	
+
 	/**
 	 * Fires a terminate event.
 	 */
@@ -228,7 +228,7 @@
 			manager.fireDebugEventSet(new DebugEvent[]{new DebugEvent(this, DebugEvent.TERMINATE)});
 		}
 	}
-	
+
 	/**
 	 * Fires a custom model specific event when this connector is ready to accept incoming
 	 * connections from a remote VM.
@@ -255,7 +255,7 @@
 	public String getAttribute(String key) {
 		return null;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IProcess#setAttribute(java.lang.String, java.lang.String)
 	 */
@@ -299,13 +299,13 @@
 		 * to close the socket without generating an error.
 		 */
 		private boolean fListeningStopped = false;
-		
+
 		public WaitForConnectionJob(ListeningConnector connector, Map<String, Connector.Argument> arguments) {
 			super(getLabel());
 			fConnector = connector;
 			fArguments = arguments;
 		}
-		
+
 		@Override
 		protected IStatus run(IProgressMonitor monitor) {
 			try{
@@ -316,7 +316,7 @@
 				if (timeout != null){
 					timeout.setValue("3000"); //$NON-NLS-1$
 				}
-				
+
 				VirtualMachine vm = null;
 				while (vm == null && !monitor.isCanceled()){
 					try {
@@ -324,12 +324,12 @@
 					} catch (TransportTimeoutException e){
 					}
 				}
-				
+
 				if (monitor.isCanceled()){
 					fConnector.stopListening(fArguments);
 					return Status.CANCEL_STATUS;
 				}
-				
+
 				ILaunchConfiguration configuration = fLaunch.getLaunchConfiguration();
 				boolean allowTerminate = false;
 				if (configuration != null) {
@@ -351,10 +351,10 @@
 				}
 				return getStatus(LaunchingMessages.SocketListenConnectorProcess_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 			} catch (IllegalConnectorArgumentsException e) {
-				return getStatus(LaunchingMessages.SocketListenConnectorProcess_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED); 
+				return getStatus(LaunchingMessages.SocketListenConnectorProcess_4, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED);
 			}
 		}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.core.runtime.jobs.Job#canceling()
 		 */
@@ -362,7 +362,7 @@
 		protected void canceling() {
 			stopListening();
 		}
-			
+
 		/**
 		 * Tells the listening connector to stop listening.  Ensures
 		 * that the socket is closed and the port released.  Sets a flag
@@ -375,18 +375,18 @@
 					fListeningStopped = true;
 					fConnector.stopListening(fArguments);
 				} catch (IOException e) {
-					done(getStatus(LaunchingMessages.SocketListenConnectorProcess_5, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED)); 
+					done(getStatus(LaunchingMessages.SocketListenConnectorProcess_5, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED));
 				} catch (IllegalConnectorArgumentsException e) {
-					done(getStatus(LaunchingMessages.SocketListenConnectorProcess_5, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED)); 
+					done(getStatus(LaunchingMessages.SocketListenConnectorProcess_5, e, IJavaLaunchConfigurationConstants.ERR_REMOTE_VM_CONNECTION_FAILED));
 				}
 			}
 		}
-		
+
 		/**
 		 * Helper method that constructs a human-readable label for a remote VM.
 		 * @param vm the VM
 		 * @param port the port
-		 * @param configuration the configuration 
+		 * @param configuration the configuration
 		 * @return the new VM label
 		 */
 		protected String constructVMLabel(VirtualMachine vm, String port, ILaunchConfiguration configuration) {
@@ -411,11 +411,11 @@
 				// append the time when each connection was accepted
 				buffer.append('<').append(getRunningTime()).append('>');
 			}
-			buffer.append('['); 
+			buffer.append('[');
 			buffer.append(port);
-			buffer.append(']'); 
+			buffer.append(']');
 			return buffer.toString();
 		}
-		
+
 	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVM.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVM.java
index bbc4aef..0e70c84 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVM.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVM.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMRunner.java
index 3f7dfe4..fb9f643 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMRunner.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -48,22 +48,22 @@
 			monitor = new NullProgressMonitor();
 		}
 		IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
-		subMonitor.beginTask(LaunchingMessages.StandardVMRunner_Launching_VM____1, 2); 
-		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Constructing_command_line____2); //		
-		
+		subMonitor.beginTask(LaunchingMessages.StandardVMRunner_Launching_VM____1, 2);
+		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Constructing_command_line____2); //
+
 		String program= constructProgramString(config);
-		
-		List<String> arguments= new ArrayList<String>();
+
+		List<String> arguments= new ArrayList<>();
 		arguments.add(program);
-				
+
 		// VM arguments are the first thing after the java program so that users can specify
 		// options like '-client' & '-server' which are required to be the first option
 		String[] vmArgs= combineVmArgs(config, fVMInstance);
 		addArguments(vmArgs, arguments);
-				
-		String[] bootCP= config.getBootClassPath();		
+
+		String[] bootCP= config.getBootClassPath();
 		String[] classPath = config.getClassPath();
-		
+
 		String[] combinedPath = null;
 		if (bootCP == null) {
 			LibraryLocation[] locs = JavaRuntime.getLibraryLocations(fVMInstance);
@@ -90,9 +90,9 @@
 			arguments.add(convertClassPath(combinedPath));
 		}
 		arguments.add(config.getClassToLaunch());
-		
+
 		String[] programArgs= config.getProgramArguments();
-		
+
 		String[] envp = prependJREPath(config.getEnvironment());
 		String[] newenvp = checkClasspath(arguments, classPath, envp);
 		if(newenvp != null) {
@@ -101,7 +101,7 @@
 			arguments.remove(cpidx);
 		}
 		addArguments(programArgs, arguments);
-				
+
 		String[] cmdLine= new String[arguments.size()];
 		arguments.toArray(cmdLine);
 
@@ -109,10 +109,10 @@
 		if (monitor.isCanceled()) {
 			return;
 		}
-		
+
 		subMonitor.worked(1);
-		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Starting_virtual_machine____3); 
-		
+		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Starting_virtual_machine____3);
+
 		Process p= null;
 		File workingDir = getWorkingDir(config);
 		String[] newCmdLine = validateCommandLine(launch.getLaunchConfiguration(), cmdLine);
@@ -123,12 +123,12 @@
 		if (p == null) {
 			return;
 		}
-		
+
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			p.destroy();
 			return;
-		}		
+		}
 		String timestamp = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
 		IProcess process= DebugPlugin.newProcess(launch, p, renderProcessLabel(cmdLine, timestamp));
 		process.setAttribute(DebugPlugin.ATTR_PATH, cmdLine[0]);
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMType.java
index fffbd14..9841a34 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/Standard11xVMType.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,7 +23,7 @@
  * JDK installion layout, and command line options.
  */
 public class Standard11xVMType extends StandardVMType {
-		
+
 	/**
 	 * @see org.eclipse.jdt.internal.launching.StandardVMType#getDefaultSystemLibrary(java.io.File)
 	 */
@@ -39,7 +39,7 @@
 	protected IVMInstall doCreateVMInstall(String id) {
 		return new Standard11xVM(this, id);
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.internal.launching.StandardVMType#getDefaultSystemLibrarySource(java.io.File)
 	 */
@@ -48,25 +48,25 @@
 		setDefaultRootPath(""); //$NON-NLS-1$
 		return Path.EMPTY;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallType#getName()
 	 */
 	@Override
 	public String getName() {
-		return LaunchingMessages.Standard11xVMType_Standard_1_1_x_VM_1; 
-	}	
-	
+		return LaunchingMessages.Standard11xVMType_Standard_1_1_x_VM_1;
+	}
+
 	/**
 	 * Returns <code>null</code> - not supported.
-	 * 
+	 *
 	 * @see StandardVMType#getDefaultExtensionDirectory(File)
 	 */
 	@Override
 	protected File getDefaultExtensionDirectory(File installLocation) {
 		return null;
 	}
-	
+
 	/**
 	 * @see org.eclipse.jdt.internal.launching.StandardVMType#getDefaultEndorsedDirectory(java.io.File)
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVM.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVM.java
index 2d408df..4d29c40 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVM.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVM.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,7 +22,7 @@
 
 	/**
 	 * If a StandardVM returns a string for #getDebugArgs(), the string may contain
-	 * the variable ${port}.  This will be replaced with the port that the vm is 
+	 * the variable ${port}.  This will be replaced with the port that the vm is
 	 * using when launching.
 	 */
 	public static final String VAR_PORT = "${port}"; //$NON-NLS-1$
@@ -71,10 +71,10 @@
         }
         return null;
     }
-    
+
     /**
      * Returns the java executable for this VM or <code>null</code> if cannot be found
-     * 
+     *
      * @return executable for this VM or <code>null</code> if none
      */
     File getJavaExecutable() {
@@ -83,17 +83,17 @@
             return StandardVMType.findJavaExecutable(installLocation);
         }
         return null;
-    }    
-    
+    }
+
     /**
-     * Returns arguments used to start this VM in debug mode or 
+     * Returns arguments used to start this VM in debug mode or
      * <code>null</code> if default arguments should be used.
-     * 
+     *
      * @return arguments used to start this VM in debug mode
      * or <code>null</code> if default arguments should be used
      */
     public String getDebugArgs() {
     	return null;
     }
-    
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMDebugger.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMDebugger.java
index 3b811ab..ed11b38 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMDebugger.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMDebugger.java
@@ -53,51 +53,51 @@
 import com.sun.jdi.connect.ListeningConnector;
 
 /**
- * A launcher for debugging Java main classes. Uses JDI to launch a VM in debug 
+ * A launcher for debugging Java main classes. Uses JDI to launch a VM in debug
  * mode.
  */
 public class StandardVMDebugger extends StandardVMRunner {
-	
-	
+
+
 	/**
 	 * @since 3.3 OSX environment variable specifying JRE to use
 	 */
 	protected static final String JAVA_JVM_VERSION = "JAVA_JVM_VERSION"; //$NON-NLS-1$
-	
+
 	/**
 	 * JRE path segment descriptor
-	 * 
+	 *
 	 * String equals the word: <code>jre</code>
-	 * 
+	 *
 	 * @since 3.3.1
 	 */
 	protected static final String JRE = "jre"; //$NON-NLS-1$
 
 	/**
 	 * Bin path segment descriptor
-	 * 
+	 *
 	 * String equals the word: <code>bin</code>
-	 * 
+	 *
 	 * @since 3.3.1
 	 */
 	protected static final String BIN = "bin"; //$NON-NLS-1$
-	
+
 	/**
 	 * Used to attach to a VM in a separate thread, to allow for cancellation
 	 * and detect that the associated System process died before the connect
 	 * occurred.
 	 */
 	class ConnectRunnable implements Runnable {
-		
+
 		private VirtualMachine fVirtualMachine = null;
 		private ListeningConnector fConnector = null;
 		private Map<String, Connector.Argument> fConnectionMap = null;
 		private Exception fException = null;
-		
+
 		/**
 		 * Constructs a runnable to connect to a VM via the given connector
 		 * with the given connection arguments.
-		 * 
+		 *
 		 * @param connector the connector to use
 		 * @param map the argument map
 		 */
@@ -105,7 +105,7 @@
 			fConnector = connector;
 			fConnectionMap = map;
 		}
-		
+
 		@Override
 		public void run() {
 			try {
@@ -116,19 +116,19 @@
 				fException = e;
 			}
 		}
-		
+
 		/**
 		 * Returns the VM that was attached to, or <code>null</code> if none.
-		 * 
+		 *
 		 * @return the VM that was attached to, or <code>null</code> if none
 		 */
 		public VirtualMachine getVirtualMachine() {
 			return fVirtualMachine;
 		}
-		
+
 		/**
 		 * Returns any exception that occurred while attaching, or <code>null</code>.
-		 * 
+		 *
 		 * @return IOException or IllegalConnectorArgumentsException
 		 */
 		public Exception getException() {
@@ -153,31 +153,31 @@
 		if (monitor == null) {
 			monitor = new NullProgressMonitor();
 		}
-		
+
 		IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
-		subMonitor.beginTask(LaunchingMessages.StandardVMDebugger_Launching_VM____1, 4); 
-		subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Finding_free_socket____2); 
+		subMonitor.beginTask(LaunchingMessages.StandardVMDebugger_Launching_VM____1, 4);
+		subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Finding_free_socket____2);
 
 		int port= SocketUtil.findFreePort();
 		if (port == -1) {
-			abort(LaunchingMessages.StandardVMDebugger_Could_not_find_a_free_socket_for_the_debugger_1, null, IJavaLaunchConfigurationConstants.ERR_NO_SOCKET_AVAILABLE); 
+			abort(LaunchingMessages.StandardVMDebugger_Could_not_find_a_free_socket_for_the_debugger_1, null, IJavaLaunchConfigurationConstants.ERR_NO_SOCKET_AVAILABLE);
 		}
-		
+
 		subMonitor.worked(1);
-		
+
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			return;
-		}		
-		
-		subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Constructing_command_line____3); 
-				
+		}
+
+		subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Constructing_command_line____3);
+
 		String program= constructProgramString(config);
-		
-		List<String> arguments= new ArrayList<String>(12);
+
+		List<String> arguments= new ArrayList<>(12);
 
 		arguments.add(program);
-		
+
 		if (fVMInstance instanceof StandardVM && ((StandardVM)fVMInstance).getDebugArgs() != null){
 			String debugArgString = ((StandardVM)fVMInstance).getDebugArgs().replaceAll("\\Q" + StandardVM.VAR_PORT + "\\E", Integer.toString(port));  //$NON-NLS-1$ //$NON-NLS-2$
 			String[] debugArgs = DebugPlugin.parseArguments(debugArgString);
@@ -192,23 +192,23 @@
 				arguments.add("-Xdebug"); //$NON-NLS-1$
 				arguments.add("-Xnoagent"); //$NON-NLS-1$
 			}
-			
+
 			//check if java 1.4 or greater
 			if (version < 1.4) {
 				arguments.add("-Djava.compiler=NONE"); //$NON-NLS-1$
 			}
-			if (version < 1.5) { 
+			if (version < 1.5) {
 				arguments.add("-Xrunjdwp:transport=dt_socket,suspend=y,address=localhost:" + port); //$NON-NLS-1$
 			} else {
 				arguments.add("-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:" + port); //$NON-NLS-1$
 			}
-		
+
 		}
-		
+
 		String[] allVMArgs = combineVmArgs(config, fVMInstance);
 		addArguments(ensureEncoding(launch, allVMArgs), arguments);
 		addBootClassPathArguments(arguments, config);
-		
+
 		String[] cp= config.getClassPath();
 		int cpidx = -1;
 		if (cp.length > 0) {
@@ -216,39 +216,39 @@
 			arguments.add("-classpath"); //$NON-NLS-1$
 			arguments.add(convertClassPath(cp));
 		}
-		
+
 		arguments.add(config.getClassToLaunch());
 		addArguments(config.getProgramArguments(), arguments);
-		
+
 		//With the newer VMs and no backwards compatibility we have to always prepend the current env path (only the runtime one)
-		//with a 'corrected' path that points to the location to load the debug dlls from, this location is of the standard JDK installation 
+		//with a 'corrected' path that points to the location to load the debug dlls from, this location is of the standard JDK installation
 		//format: <jdk path>/jre/bin
 		String[] envp = prependJREPath(config.getEnvironment(), new Path(program));
-		
+
 		String[] newenvp = checkClasspath(arguments, cp, envp);
 		if(newenvp != null) {
 			envp = newenvp;
 			arguments.remove(cpidx);
 			arguments.remove(cpidx);
 		}
-		
+
 		String[] cmdLine= new String[arguments.size()];
 		arguments.toArray(cmdLine);
-		
+
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			return;
-		}		
-		
+		}
+
 		subMonitor.worked(1);
-		subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Starting_virtual_machine____4); 
+		subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Starting_virtual_machine____4);
 
 		ListeningConnector connector= getConnector();
 		if (connector == null) {
-			abort(LaunchingMessages.StandardVMDebugger_Couldn__t_find_an_appropriate_debug_connector_2, null, IJavaLaunchConfigurationConstants.ERR_CONNECTOR_NOT_AVAILABLE); 
+			abort(LaunchingMessages.StandardVMDebugger_Couldn__t_find_an_appropriate_debug_connector_2, null, IJavaLaunchConfigurationConstants.ERR_CONNECTOR_NOT_AVAILABLE);
 		}
 		Map<String, Connector.Argument> map= connector.defaultArguments();
-		
+
 		specifyArguments(map, port);
 		Process p= null;
 		try {
@@ -256,25 +256,25 @@
 				// check for cancellation
 				if (monitor.isCanceled()) {
 					return;
-				}				
-				
+				}
+
 				connector.startListening(map);
-				
+
 				File workingDir = getWorkingDir(config);
 				String[] newCmdLine = validateCommandLine(launch.getLaunchConfiguration(), cmdLine);
 				if(newCmdLine != null) {
 					cmdLine = newCmdLine;
 				}
-				p = exec(cmdLine, workingDir, envp);				
+				p = exec(cmdLine, workingDir, envp);
 				if (p == null) {
 					return;
 				}
-				
+
 				// check for cancellation
 				if (monitor.isCanceled()) {
 					p.destroy();
 					return;
-				}				
+				}
 				String timestamp = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
 				IProcess process= newProcess(launch, p, renderProcessLabel(cmdLine, timestamp), getDefaultProcessMap());
 				process.setAttribute(DebugPlugin.ATTR_PATH, cmdLine[0]);
@@ -296,12 +296,12 @@
 					process.setAttribute(DebugPlugin.ATTR_ENVIRONMENT, buff.toString());
 				}
 				subMonitor.worked(1);
-				subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Establishing_debug_connection____5); 
+				subMonitor.subTask(LaunchingMessages.StandardVMDebugger_Establishing_debug_connection____5);
 				int retryCount = 0;
 				boolean retry= false;
 				do  {
 					try {
-						
+
 						ConnectRunnable runnable = new ConnectRunnable(connector, map);
 						Thread connectThread = new Thread(runnable, "Listening Connector"); //$NON-NLS-1$
                         connectThread.setDaemon(true);
@@ -320,7 +320,7 @@
 								p.exitValue();
 								// process has terminated - stop waiting for a connection
 								try {
-									connector.stopListening(map); 
+									connector.stopListening(map);
 								} catch (IOException e) {
 									// expected
 								}
@@ -344,7 +344,7 @@
 						if (ex instanceof IOException) {
 							throw (IOException)ex;
 						}
-						
+
 						VirtualMachine vm= runnable.getVirtualMachine();
 						if (vm != null) {
 							createDebugTarget(config, launch, port, process, vm);
@@ -354,16 +354,16 @@
 						return;
 					} catch (InterruptedIOException e) {
 						checkErrorMessage(process);
-						
+
 						// timeout, consult status handler if there is one
 						IStatus status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_VM_CONNECT_TIMEOUT, "", e); //$NON-NLS-1$
 						IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status);
-						
+
 						retry= false;
 						if (handler == null) {
 							// if there is no handler, throw the exception
 							throw new CoreException(status);
-						} 
+						}
 						Object result = handler.handleStatus(status, this);
 						if (result instanceof Boolean) {
 							retry = ((Boolean)result).booleanValue();
@@ -380,9 +380,9 @@
 				connector.stopListening(map);
 			}
 		} catch (IOException e) {
-			abort(LaunchingMessages.StandardVMDebugger_Couldn__t_connect_to_VM_4, e, IJavaLaunchConfigurationConstants.ERR_CONNECTION_FAILED);  
+			abort(LaunchingMessages.StandardVMDebugger_Couldn__t_connect_to_VM_4, e, IJavaLaunchConfigurationConstants.ERR_CONNECTION_FAILED);
 		} catch (IllegalConnectorArgumentsException e) {
-			abort(LaunchingMessages.StandardVMDebugger_Couldn__t_connect_to_VM_5, e, IJavaLaunchConfigurationConstants.ERR_CONNECTION_FAILED);  
+			abort(LaunchingMessages.StandardVMDebugger_Couldn__t_connect_to_VM_5, e, IJavaLaunchConfigurationConstants.ERR_CONNECTION_FAILED);
 		}
 		if (p != null) {
 			p.destroy();
@@ -392,12 +392,12 @@
 	/**
 	 * This method performs platform specific operations to modify the runtime path for JREs prior to launching.
 	 * Nothing is written back to the original system path.
-	 * 
+	 *
 	 * <p>
 	 * For Windows:
 	 * Prepends the location of the JRE bin directory for the given JDK path to the PATH variable in Windows.
 	 * This method assumes that the JRE is located within the JDK install directory
-	 * in: <code><JDK install dir>/jre/bin/</code> where the JRE itself would be located 
+	 * in: <code><JDK install dir>/jre/bin/</code> where the JRE itself would be located
 	 * in: <code><JDK install dir>/bin/</code>  where the JDK itself is located
 	 * </p>
 	 * <p>
@@ -405,7 +405,7 @@
 	 * Searches for and sets the correct state of the JAVA_VM_VERSION environment variable to ensure it matches
 	 * the currently chosen VM of the launch config
 	 * </p>
-	 * 
+	 *
 	 * @param env the current array of environment variables to run with
 	 * @param jdkpath the path to the executable (javaw).
 	 * @return the altered JRE path
@@ -461,14 +461,14 @@
 					}
 				}
 			}
-		} 
+		}
 		return super.prependJREPath(env);
 	}
-	
+
 	/**
 	 * Creates a new debug target for the given virtual machine and system process
 	 * that is connected on the specified port for the given launch.
-	 * 
+	 *
 	 * @param config run configuration used to launch the VM
 	 * @param launch launch to add the target to
 	 * @param port port the VM is connected to
@@ -479,7 +479,7 @@
 	protected IDebugTarget createDebugTarget(VMRunnerConfiguration config, ILaunch launch, int port, IProcess process, VirtualMachine vm) {
 		return JDIDebugModel.newDebugTarget(launch, vm, renderDebugTarget(config.getClassToLaunch(), port), process, true, false, config.isResumeOnStartup());
 	}
-	
+
 	/**
 	 * Returns the version of the current VM in use
 	 * @return the VM version
@@ -504,7 +504,7 @@
 		try {
 			if (index > 0 && nextIndex>index) {
 				return Double.parseDouble(version.substring(0,nextIndex));
-			} 
+			}
 			return Double.parseDouble(version);
 		} catch (NumberFormatException e) {
 			return 0D;
@@ -527,9 +527,9 @@
 			if (errorMessage.length() != 0) {
 				abort(errorMessage, null, IJavaLaunchConfigurationConstants.ERR_VM_LAUNCH_ERROR);
 			}
-		}										
+		}
 	}
-		
+
 	/**
 	 * Allows arguments to be specified
 	 * @param map argument map
@@ -539,13 +539,13 @@
 		// XXX: Revisit - allows us to put a quote (") around the classpath
 		Connector.IntegerArgument port= (Connector.IntegerArgument) map.get("port"); //$NON-NLS-1$
 		port.setValue(portNumber);
-		
+
 		Connector.IntegerArgument timeoutArg= (Connector.IntegerArgument) map.get("timeout"); //$NON-NLS-1$
 		if (timeoutArg != null) {
 			int timeout = Platform.getPreferencesService().getInt(
-					LaunchingPlugin.ID_PLUGIN, 
-					JavaRuntime.PREF_CONNECT_TIMEOUT, 
-					JavaRuntime.DEF_CONNECT_TIMEOUT, 
+					LaunchingPlugin.ID_PLUGIN,
+					JavaRuntime.PREF_CONNECT_TIMEOUT,
+					JavaRuntime.DEF_CONNECT_TIMEOUT,
 					null);
 			timeoutArg.setValue(timeout);
 		}
@@ -566,5 +566,5 @@
 		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
index eaa1c40..b120007 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -44,14 +44,14 @@
  * A launcher for running Java main classes.
  */
 public class StandardVMRunner extends AbstractVMRunner {
-	
+
 	/**
 	 * Constant representing the <code>-XstartOnFirstThread</code> VM argument
-	 * 
+	 *
 	 * @since 3.2.200
 	 */
 	public static final String XSTART_ON_FIRST_THREAD = "-XstartOnFirstThread"; //$NON-NLS-1$
-	
+
 	/**
 	 * The VM install instance
 	 */
@@ -64,7 +64,7 @@
 	public StandardVMRunner(IVMInstall vmInstance) {
 		fVMInstance= vmInstance;
 	}
-	
+
 	/**
 	 * Returns the 'rendered' name for the current target
 	 * @param classToRun the class
@@ -72,7 +72,7 @@
 	 * @return the name for the current target
 	 */
 	protected String renderDebugTarget(String classToRun, int host) {
-		String format= LaunchingMessages.StandardVMRunner__0__at_localhost__1__1; 
+		String format= LaunchingMessages.StandardVMRunner__0__at_localhost__1__1;
 		return NLS.bind(format, new String[] { classToRun, String.valueOf(host) });
 	}
 
@@ -83,10 +83,10 @@
 	 * @return the name for the process
 	 */
 	public static String renderProcessLabel(String[] commandLine, String timestamp) {
-		String format= LaunchingMessages.StandardVMRunner__0____1___2; 
+		String format= LaunchingMessages.StandardVMRunner__0____1___2;
 		return NLS.bind(format, new String[] { commandLine[0], timestamp });
 	}
-	
+
 	/**
 	 * Prepares the command line from the specified array of strings
 	 * @param commandLine the command line
@@ -94,8 +94,8 @@
 	 */
 	protected String renderCommandLine(String[] commandLine) {
 		return DebugPlugin.renderArguments(commandLine, null);
-	}	
-	
+	}
+
 	/**
 	 * Adds the array of {@link String}s to the given {@link List}
 	 * @param args the strings
@@ -109,14 +109,14 @@
 			v.add(args[i]);
 		}
 	}
-	
+
 	/**
-	 * This method allows consumers to have a last look at the command line that will be used 
+	 * This method allows consumers to have a last look at the command line that will be used
 	 * to start the runner just prior to launching. This method returns the new array of commands
 	 * to use to start the runner with or <code>null</code> if the existing command line should be used.
 	 * <br><br>
 	 * By default this method returns <code>null</code> indicating that the existing command line should be used to launch
-	 * 
+	 *
 	 * @param configuration the backing {@link ILaunchConfiguration}
 	 * @param cmdLine the existing command line
 	 * @return the new command line to launch with or <code>null</code> if the existing one should be used
@@ -131,29 +131,29 @@
 		}
 		return cmdLine;
 	}
-	
+
 	/**
-	 * Adds in special command line arguments if SWT or the <code>-ws</code> directive 
+	 * Adds in special command line arguments if SWT or the <code>-ws</code> directive
 	 * are used
-	 * 
+	 *
 	 * @param config the backing {@link ILaunchConfiguration}
 	 * @param cmdLine the original VM arguments
 	 * @return the (possibly) modified command line to launch with
-	 * @throws CoreException 
+	 * @throws CoreException
 	 */
 	private String[] wrap(ILaunchConfiguration config, String[] cmdLine) throws CoreException {
 		if(config != null && Platform.OS_MACOSX.equals(Platform.getOS())) {
 			for (int i= 0; i < cmdLine.length; i++) {
 				if ("-ws".equals(cmdLine[i]) || cmdLine[i].indexOf("swt.jar") > -1 || cmdLine[i].indexOf("org.eclipse.swt") > -1) {   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-					return createSWTlauncher(cmdLine, 
-							cmdLine[0], 
+					return createSWTlauncher(cmdLine,
+							cmdLine[0],
 							config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_START_ON_FIRST_THREAD, true));
 				}
 			}
 		}
 		return cmdLine;
 	}
-	
+
 	/**
 	 * Returns path to executable.
 	 * @param cmdLine the old command line
@@ -164,10 +164,10 @@
 	private String[] createSWTlauncher(String[] cmdLine, String vmVersion, boolean startonfirstthread) {
 		// the following property is defined if Eclipse is started via java_swt
 		String java_swt= System.getProperty("org.eclipse.swtlauncher");	//$NON-NLS-1$
-		if (java_swt == null) {	
+		if (java_swt == null) {
 			// not started via java_swt -> now we require that the VM supports the "-XstartOnFirstThread" option
 			boolean found = false;
-			ArrayList<String> args = new ArrayList<String>();
+			ArrayList<String> args = new ArrayList<>();
 			for (int i = 0; i < cmdLine.length; i++) {
 				if(XSTART_ON_FIRST_THREAD.equals(cmdLine[i])) {
 					found = true;
@@ -201,17 +201,17 @@
 		}
 		return newCmdLine;
 	}
-	
+
 	/**
 	 * Returns the working directory to use for the launched VM,
 	 * or <code>null</code> if the working directory is to be inherited
 	 * from the current process.
-	 * 
+	 *
 	 * @param config the VM configuration
 	 * @return the working directory to use
 	 * @exception CoreException if the working directory specified by
 	 *  the configuration does not exist or is not a directory
-	 */	
+	 */
 	protected File getWorkingDir(VMRunnerConfiguration config) throws CoreException {
 		String path = config.getWorkingDirectory();
 		if (path == null) {
@@ -219,11 +219,11 @@
 		}
 		File dir = new File(path);
 		if (!dir.isDirectory()) {
-			abort(NLS.bind(LaunchingMessages.StandardVMRunner_Specified_working_directory_does_not_exist_or_is_not_a_directory___0__3, new String[] {path}), null, IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST); 
+			abort(NLS.bind(LaunchingMessages.StandardVMRunner_Specified_working_directory_does_not_exist_or_is_not_a_directory___0__3, new String[] {path}), null, IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
 		}
 		return dir;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.AbstractVMRunner#getPluginIdentifier()
 	 */
@@ -231,12 +231,12 @@
 	protected String getPluginIdentifier() {
 		return LaunchingPlugin.getUniqueIdentifier();
 	}
-	
+
 	/**
 	 * Construct and return a String containing the full path of a java executable
 	 * command such as 'java' or 'javaw.exe'.  If the configuration specifies an
 	 * explicit executable, that is used.
-	 * 
+	 *
 	 * @param config the runner configuration
 	 * @return full path to java executable
 	 * @exception CoreException if unable to locate an executable
@@ -249,7 +249,7 @@
 		if (map != null) {
 			command = (String) map.get(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND);
 		}
-		
+
 		// If no java command was specified, use default executable
 		if (command == null) {
 			File exe = null;
@@ -259,16 +259,16 @@
 				exe = StandardVMType.findJavaExecutable(fVMInstance.getInstallLocation());
 			}
 			if (exe == null) {
-				abort(NLS.bind(LaunchingMessages.StandardVMRunner_Unable_to_locate_executable_for__0__1, new String[]{fVMInstance.getName()}), null, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR); 
+				abort(NLS.bind(LaunchingMessages.StandardVMRunner_Unable_to_locate_executable_for__0__1, new String[]{fVMInstance.getName()}), null, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
 			} else {
 				return exe.getAbsolutePath();
 			}
 		}
-				
+
 		// Build the path to the java executable.  First try 'bin', and if that
 		// doesn't exist, try 'jre/bin'
 		String installLocation = fVMInstance.getInstallLocation().getAbsolutePath() + File.separatorChar;
-		File exe = new File(installLocation + "bin" + File.separatorChar + command); //$NON-NLS-1$ 		
+		File exe = new File(installLocation + "bin" + File.separatorChar + command); //$NON-NLS-1$
 		if (fileExists(exe)){
 			return exe.getAbsolutePath();
 		}
@@ -278,19 +278,19 @@
 		}
 		exe = new File(installLocation + "jre" + File.separatorChar + "bin" + File.separatorChar + command); //$NON-NLS-1$ //$NON-NLS-2$
 		if (fileExists(exe)) {
-			return exe.getAbsolutePath(); 
+			return exe.getAbsolutePath();
 		}
 		exe = new File(exe.getAbsolutePath() + ".exe"); //$NON-NLS-1$
 		if (fileExists(exe)) {
-			return exe.getAbsolutePath(); 
-		}		
-		
+			return exe.getAbsolutePath();
+		}
+
 		// not found
-		abort(NLS.bind(LaunchingMessages.StandardVMRunner_Specified_executable__0__does_not_exist_for__1__4, new String[]{command, fVMInstance.getName()}), null, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR); 
+		abort(NLS.bind(LaunchingMessages.StandardVMRunner_Specified_executable__0__does_not_exist_for__1__4, new String[]{command, fVMInstance.getName()}), null, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
 		// NOTE: an exception will be thrown - null cannot be returned
-		return null;		
-	}	
-	
+		return null;
+	}
+
 	/**
 	 * Convenience method to determine if the specified file exists or not
 	 * @param file the file to check
@@ -319,18 +319,18 @@
 	/**
 	 * This method is used to ensure that the JVM file encoding matches that of the console preference for file encoding.
 	 * If the user explicitly declares a file encoding in the launch configuration, then that file encoding is used.
-	 * 
+	 *
 	 * @param launch the {@link Launch}
 	 * @param vmargs the original listing of JVM arguments
 	 * @return the listing of JVM arguments including file encoding if one was not specified
-	 * 
+	 *
 	 * @since 3.4
 	 */
 	protected String[] ensureEncoding(ILaunch launch, String[] vmargs) {
 		boolean foundencoding = false;
 		for(int i = 0; i < vmargs.length; i++) {
 			if(vmargs[i].startsWith("-Dfile.encoding=")) { //$NON-NLS-1$
-				foundencoding = true; 
+				foundencoding = true;
 			}
 		}
 		if(!foundencoding) {
@@ -345,7 +345,7 @@
 		}
 		return vmargs;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMRunner#run(org.eclipse.jdt.launching.VMRunnerConfiguration, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -355,23 +355,23 @@
 		if (monitor == null) {
 			monitor = new NullProgressMonitor();
 		}
-		
+
 		IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
-		subMonitor.beginTask(LaunchingMessages.StandardVMRunner_Launching_VM____1, 2); 
+		subMonitor.beginTask(LaunchingMessages.StandardVMRunner_Launching_VM____1, 2);
 		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Constructing_command_line____2);
-		
+
 		String program= constructProgramString(config);
-		
-		List<String> arguments= new ArrayList<String>();
+
+		List<String> arguments= new ArrayList<>();
 		arguments.add(program);
-				
+
 		// VM args are the first thing after the java program so that users can specify
 		// options like '-client' & '-server' which are required to be the first option
 		String[] allVMArgs = combineVmArgs(config, fVMInstance);
 		addArguments(ensureEncoding(launch, allVMArgs), arguments);
-		
+
 		addBootClassPathArguments(arguments, config);
-		
+
 		String[] cp= config.getClassPath();
 		int cpidx = -1;
 		if (cp.length > 0) {
@@ -380,30 +380,30 @@
 			arguments.add(convertClassPath(cp));
 		}
 		arguments.add(config.getClassToLaunch());
-		
+
 		String[] programArgs= config.getProgramArguments();
 		addArguments(programArgs, arguments);
-				
+
 		String[] envp = prependJREPath(config.getEnvironment());
-		
+
 		String[] newenvp = checkClasspath(arguments, cp, envp);
 		if(newenvp != null) {
 			envp = newenvp;
 			arguments.remove(cpidx);
 			arguments.remove(cpidx);
 		}
-		
+
 		String[] cmdLine= new String[arguments.size()];
 		arguments.toArray(cmdLine);
-		
+
 		subMonitor.worked(1);
 
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			return;
 		}
-		
-		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Starting_virtual_machine____3); 
+
+		subMonitor.subTask(LaunchingMessages.StandardVMRunner_Starting_virtual_machine____3);
 		Process p= null;
 		File workingDir = getWorkingDir(config);
 		String[] newCmdLine = validateCommandLine(launch.getLaunchConfiguration(), cmdLine);
@@ -414,12 +414,12 @@
 		if (p == null) {
 			return;
 		}
-		
+
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			p.destroy();
 			return;
-		}		
+		}
 		String timestamp = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
 		IProcess process= newProcess(launch, p, renderProcessLabel(cmdLine, timestamp), getDefaultProcessMap());
 		process.setAttribute(DebugPlugin.ATTR_PATH, cmdLine[0]);
@@ -443,7 +443,7 @@
 		subMonitor.worked(1);
 		subMonitor.done();
 	}
-	
+
 	/**
 	 * Returns the index in the given array for the CLASSPATH variable
 	 * @param env the environment array or <code>null</code>
@@ -460,18 +460,18 @@
 		}
 		return -1;
 	}
-	
+
 	/**
 	 * Checks to see if the command / classpath needs to be shortened for Windows. Returns the modified
 	 * environment or <code>null</code> if no changes are needed.
-	 * 
+	 *
 	 * @param args the raw arguments from the runner
 	 * @param cp the raw classpath from the runner configuration
 	 * @param env the current environment
 	 * @return the modified environment or <code>null</code> if no changes were made
 	 * @sine 3.6.200
 	 */
-	String[] checkClasspath(List<String> args, String[] cp, String[] env) { 
+	String[] checkClasspath(List<String> args, String[] cp, String[] env) {
 		if(Platform.getOS().equals(Platform.OS_WIN32)) {
 			//count the complete command length
 			int size = 0;
@@ -525,10 +525,10 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Prepends the correct java version variable state to the environment path for Mac VMs
-	 * 
+	 *
 	 * @param env the current array of environment variables to run with
 	 * @return the new path segments
 	 * @since 3.3
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
index e2cd93b..ff2eec0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Michael Allman - Bug 211648, Bug 156343 - Standard VM not supported on MacOS
- *     Thomas Schindl - Bug 399798, StandardVMType should allow to contribute default source and Javadoc locations for ext libraries 
+ *     Thomas Schindl - Bug 399798, StandardVMType should allow to contribute default source and Javadoc locations for ext libraries
  *     Mikhail Kalkov - Bug 414285, On systems with large RAM, evaluateSystemProperties and generateLibraryInfo fail for 64-bit JREs
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
@@ -60,10 +60,10 @@
  * JDK installation layout.
  */
 public class StandardVMType extends AbstractVMInstallType {
-	
+
 	/**
 	 * Constants for common {@link String}s
-	 * @since 3.7 
+	 * @since 3.7
 	 */
 	private static final String RT_JAR = "rt.jar"; //$NON-NLS-1$
 	private static final String SRC = "src"; //$NON-NLS-1$
@@ -76,19 +76,19 @@
 	private static final String JAVA_VERSION = "JAVA_VERSION"; //$NON-NLS-1$
 
 	public static final String ID_STANDARD_VM_TYPE = "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType"; //$NON-NLS-1$
-	
+
 	/**
 	 * The minimal -Xmx size for launching a JVM. <br>
 	 * <b>Note:</b> Must be omitted for Standard11xVM! <br>
 	 * <b>Note:</b> Must be at least -Xmx16m for JRockit, see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=433455">bug 433455</a>.
-	 * 
+	 *
 	 * @since 3.7.100
 	 */
 	public static final String MIN_VM_SIZE = "-Xmx16m"; //$NON-NLS-1$
 
 	/**
 	 * Name filter for files ending in .jar or .zip
-	 * 
+	 *
 	 * @since 3.7.0
 	 */
 	private static FilenameFilter fgArchiveFilter = new FilenameFilter() {
@@ -97,36 +97,36 @@
 			return arg1.endsWith(".zip") || arg1.endsWith(".jar");  //$NON-NLS-1$//$NON-NLS-2$
 		}
 	};
-	
+
 	/**
 	 * The root path for the attached source
 	 */
 	private String fDefaultRootPath = ""; //$NON-NLS-1$
-	
+
 	/**
 	 * Map of the install path for which we were unable to generate
 	 * the library info during this session.
 	 */
-	private static Map<String, LibraryInfo> fgFailedInstallPath = new HashMap<String, LibraryInfo>();
+	private static Map<String, LibraryInfo> fgFailedInstallPath = new HashMap<>();
 
 	/**
 	 * Cache for default library locations. See {@link #getDefaultLibraryLocations(File)}
 	 * <br><br>
 	 * Map&lt;{@link String}, {@link LibraryLocation}&gt;
-	 * 
+	 *
 	 * @since 3.7
 	 */
-	private static Map<String, List<LibraryLocation>> fgDefaultLibLocs = new HashMap<String, List<LibraryLocation>>();
-	
+	private static Map<String, List<LibraryLocation>> fgDefaultLibLocs = new HashMap<>();
+
 	/**
 	 * The list of locations in which to look for the java executable in candidate
 	 * VM install locations, relative to the VM install location.
 	 */
 	private static final String[] fgCandidateJavaFiles = {"javaw", "javaw.exe", "java", "java.exe", "j9w", "j9w.exe", "j9", "j9.exe"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	private static final String[] fgCandidateJavaLocations = {"bin" + File.separatorChar, JRE + File.separatorChar + "bin" + File.separatorChar}; //$NON-NLS-1$ //$NON-NLS-2$ 
-	
+	private static final String[] fgCandidateJavaLocations = {"bin" + File.separatorChar, JRE + File.separatorChar + "bin" + File.separatorChar}; //$NON-NLS-1$ //$NON-NLS-2$
+
 	private static ILibraryLocationResolver[] fgLibraryLocationResolvers = null;
-	
+
 	/**
 	 * Starting in the specified VM install location, attempt to find the 'java' executable
 	 * file.  If found, return the corresponding <code>File</code> object, otherwise return
@@ -142,15 +142,15 @@
 				File javaFile = new File(vmInstallLocation, fgCandidateJavaLocations[j] + fgCandidateJavaFiles[i]);
 				if (javaFile.isFile()) {
 					return javaFile;
-				}				
+				}
 			}
-		}		
-		return null;							
+		}
+		return null;
 	}
-	
+
 	/**
 	 * Returns the listing of {@link ILibraryLocationResolver}s
-	 * 
+	 *
 	 * @return the known list of {@link ILibraryLocationResolver}s
 	 * @since 3.7.0
 	 */
@@ -166,7 +166,7 @@
 					return e1.getNamespaceIdentifier().compareTo(e2.getNamespaceIdentifier());
 				}
 			});
-			List<ILibraryLocationResolver> resolvers = new ArrayList<ILibraryLocationResolver>(configs.length);
+			List<ILibraryLocationResolver> resolvers = new ArrayList<>(configs.length);
 			for( int i = 0; i < configs.length; i++ ) {
 				IConfigurationElement e = configs[i];
 				try {
@@ -180,13 +180,13 @@
 		}
 		return fgLibraryLocationResolvers;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallType#getName()
 	 */
 	@Override
 	public String getName() {
-		return LaunchingMessages.StandardVMType_Standard_VM_3; 
+		return LaunchingMessages.StandardVMType_Standard_VM_3;
 	}
 
 	/* (non-Javadoc)
@@ -196,7 +196,7 @@
 	protected IVMInstall doCreateVMInstall(String id) {
 		return new StandardVM(this, id);
 	}
-	
+
 	/**
 	 * Return library information corresponding to the specified install
 	 * location. If the information does not exist, create it using the given Java
@@ -226,10 +226,10 @@
 					}
 				}
 			}
-		} 
+		}
 		return info;
-	}	
-	
+	}
+
 	/**
 	 * Return <code>true</code> if the appropriate system libraries can be found for the
 	 * specified java executable, <code>false</code> otherwise.
@@ -243,11 +243,11 @@
 		String version = getVMVersion(javaHome, javaExecutable);
 		return locations.length > 0 && !version.startsWith("1.1"); //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Returns the version of the VM at the given location, with the given
 	 * executable.
-	 * 
+	 *
 	 * @param javaHome the Java home folder
 	 * @param javaExecutable the Java executable file
 	 * @return String
@@ -256,7 +256,7 @@
 		LibraryInfo info = getLibraryInfo(javaHome, javaExecutable);
 		return info.getVersion();
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallType#detectInstallLocation()
 	 */
@@ -272,16 +272,16 @@
 	/**
 	 * Returns the VM install location using the <code>java.home</code> system
 	 * property or <code>null</code>.
-	 * 
+	 *
 	 * @return the install location of this type of VM based off of the
 	 *  <code>java.home</code> system property, or <code>null</code> if not found
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	protected File getJavaHomeLocation() {
-		// Retrieve the 'java.home' system property.  If that directory doesn't exist, 
+		// Retrieve the 'java.home' system property.  If that directory doesn't exist,
 		// return null.
-		File javaHome; 
+		File javaHome;
 		try {
 			javaHome= new File (System.getProperty("java.home")).getCanonicalFile(); //$NON-NLS-1$
 		} catch (IOException e) {
@@ -298,47 +298,47 @@
 		if (javaExecutable == null) {
 			return null;
 		}
-		
-		// If the reported java home directory terminates with 'jre', first see if 
+
+		// If the reported java home directory terminates with 'jre', first see if
 		// the parent directory contains the required libraries
 		boolean foundLibraries = false;
-		if (javaHome.getName().equalsIgnoreCase(JRE)) { 
-			File parent= new File(javaHome.getParent());			
+		if (javaHome.getName().equalsIgnoreCase(JRE)) {
+			File parent= new File(javaHome.getParent());
 			if (canDetectDefaultSystemLibraries(parent, javaExecutable)) {
 				javaHome = parent;
 				foundLibraries = true;
 			}
-		}	
-		
+		}
+
 		// If we haven't already found the libraries, look in the reported java home dir
 		if (!foundLibraries) {
 			if (!canDetectDefaultSystemLibraries(javaHome, javaExecutable)) {
 				return null;
-			}			
+			}
 		}
-		
+
 		return javaHome;
 	}
-	
+
 	/**
 	 * Return an <code>IPath</code> corresponding to the single library file containing the
 	 * standard Java classes for most VMs version 1.2 and above.
-	 * 
+	 *
 	 * @param javaHome the Java home folder
 	 * @return the {@link IPath} to the <code>rt.jar</code> file
 	 */
 	protected IPath getDefaultSystemLibrary(File javaHome) {
-		IPath jreLibPath= new Path(javaHome.getPath()).append(LIB).append(RT_JAR); 
+		IPath jreLibPath= new Path(javaHome.getPath()).append(LIB).append(RT_JAR);
 		if (jreLibPath.toFile().isFile()) {
 			return jreLibPath;
 		}
-		return new Path(javaHome.getPath()).append(JRE).append(LIB).append(RT_JAR); 
+		return new Path(javaHome.getPath()).append(JRE).append(LIB).append(RT_JAR);
 	}
-	
+
 	/**
 	 * Returns a path to the source attachment for the given library, or
 	 * an empty path if none.
-	 * 
+	 *
 	 * @param libLocation the {@link File} location of the library to find the source for
 	 * @return a path to the source attachment for the given library, or
 	 *  an empty path if none
@@ -380,7 +380,7 @@
 			}
 		}
 		setDefaultRootPath(""); //$NON-NLS-1$
-		return Path.EMPTY; 
+		return Path.EMPTY;
 	}
 
 	// J9 has a known/fixed structure for its libraries and source locations.  Here just
@@ -405,7 +405,7 @@
 
 	/**
 	 * Returns the package root path
-	 * 
+	 *
 	 * @return the package root path
 	 */
 	protected IPath getDefaultPackageRootPath() {
@@ -420,7 +420,7 @@
 		//NOTE: We do not add libraries from the "endorsed" directory explicitly, as
 		//the bootpath contains these entries already (if they exist).
 		// Determine the java executable that corresponds to the specified install location
-		// and use this to generate library information.  If no java executable was found, 
+		// and use this to generate library information.  If no java executable was found,
 		// the 'standard' libraries will be returned.
 		List<LibraryLocation> allLibs = fgDefaultLibLocs.get(installLocation.getAbsolutePath());
 		if(allLibs == null) {
@@ -431,9 +431,9 @@
 			} else {
 				libInfo = getLibraryInfo(installLocation, javaExecutable);
 			}
-			
+
 			// Add all endorsed libraries - they are first, as they replace
-			allLibs = new ArrayList<LibraryLocation>(gatherAllLibraries(libInfo.getEndorsedDirs()));
+			allLibs = new ArrayList<>(gatherAllLibraries(libInfo.getEndorsedDirs()));
 			URL url = getDefaultJavadocLocation(installLocation);
 			if (libInfo.getBootpath().length == 0) {
 				// TODO: Bug 489207: Temporary workaround for Jigsaw-previews that don't declare a bootpath.
@@ -458,20 +458,20 @@
 				if (!jrtfsJar.exists()) {
 					pathName = new Path(installLocation.getAbsolutePath()).append("jrt-fs.jar"); //$NON-NLS-1$
 				}
-				 
+
 				LibraryLocation libraryLocation = new LibraryLocation(pathName,
 						sourceRootPath, getDefaultPackageRootPath(),
 						getDefaultJavadocLocation(installLocation));
 				allLibs.add(libraryLocation);
 			}
-			
+
 			// next is the boot path libraries
 			String[] bootpath = libInfo.getBootpath();
-			List<LibraryLocation> boot = new ArrayList<LibraryLocation>(bootpath.length);
+			List<LibraryLocation> boot = new ArrayList<>(bootpath.length);
 
 			for (int i = 0; i < bootpath.length; i++) {
 				IPath path = new Path(bootpath[i]);
-				File lib = path.toFile(); 
+				File lib = path.toFile();
 				if (lib.exists() && lib.isFile()) {
 					LibraryLocation libraryLocation = new LibraryLocation(path,
 									getDefaultSystemLibrarySource(lib),
@@ -481,12 +481,12 @@
 				}
 			}
 			allLibs.addAll(boot);
-					
+
 			// Add all extension libraries
 			allLibs.addAll(gatherAllLibraries(libInfo.getExtensionDirs()));
-			
+
 			//remove duplicates
-			HashSet<String> set = new HashSet<String>();
+			HashSet<String> set = new HashSet<>();
 			LibraryLocation lib = null;
 			for(ListIterator<LibraryLocation> liter = allLibs.listIterator(); liter.hasNext();) {
 				lib = liter.next();
@@ -505,10 +505,10 @@
 		}
 		return allLibs.toArray(new LibraryLocation[allLibs.size()]);
 	}
-	
+
 	/**
 	 * Returns default library information for the given install location.
-	 * 
+	 *
 	 * @param installLocation the VM install location
 	 * @return LibraryInfo
 	 */
@@ -524,21 +524,21 @@
 		}
 		String[] endDirs = null;
 		if (endDir == null) {
-			endDirs = new String[0]; 
+			endDirs = new String[0];
 		} else {
 			endDirs = new String[] {endDir.getAbsolutePath()};
 		}
 		return new LibraryInfo("???", new String[] {rtjar.toOSString()}, dirs, endDirs);		 //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Returns a list of all zip's and jars contained in the given directories.
-	 * 
+	 *
 	 * @param dirPaths a list of absolute paths of directories to search
 	 * @return List of all zip's and jars
 	 */
 	public static List<LibraryLocation> gatherAllLibraries(String[] dirPaths) {
-		List<LibraryLocation> libraries = new ArrayList<LibraryLocation>();
+		List<LibraryLocation> libraries = new ArrayList<>();
 		for (int i = 0; i < dirPaths.length; i++) {
 			File extDir = new File(dirPaths[i]);
 			if (extDir.isDirectory()) {
@@ -574,27 +574,27 @@
 						}
 					}
 				}
-			}			
+			}
 		}
 		return libraries;
 	}
-		
+
 	/**
 	 * Returns the default location of the extension directory, based on the given
 	 * install location. The resulting file may not exist, or be <code>null</code>
 	 * if an extension directory is not supported.
-	 * 
+	 *
 	 * @param installLocation the VM install location
 	 * @return default extension directory or <code>null</code>
 	 */
 	protected File getDefaultExtensionDirectory(File installLocation) {
 		File jre = null;
-		if (installLocation.getName().equalsIgnoreCase(JRE)) { 
+		if (installLocation.getName().equalsIgnoreCase(JRE)) {
 			jre = installLocation;
 		} else {
-			jre = new File(installLocation, JRE); 
+			jre = new File(installLocation, JRE);
 		}
-		File lib = new File(jre, LIB); 
+		File lib = new File(jre, LIB);
 		File ext = new File(lib, "ext"); //$NON-NLS-1$
 		return ext;
 	}
@@ -603,12 +603,12 @@
 	 * Returns the default location of the endorsed directory, based on the
 	 * given install location. The resulting file may not exist, or be
 	 * <code>null</code> if an endorsed directory is not supported.
-	 * 
+	 *
 	 * @param installLocation the VM install location
 	 * @return default endorsed directory or <code>null</code>
 	 */
 	protected File getDefaultEndorsedDirectory(File installLocation) {
-		File lib = new File(installLocation, LIB); 
+		File lib = new File(installLocation, LIB);
 		File ext = new File(lib, "endorsed"); //$NON-NLS-1$
 		return ext;
 	}
@@ -620,7 +620,7 @@
 	protected void setDefaultRootPath(String defaultRootPath) {
 		fDefaultRootPath = defaultRootPath;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallType#validateInstallLocation(java.io.File)
 	 */
@@ -629,15 +629,15 @@
 		IStatus status = null;
 		File javaExecutable = findJavaExecutable(javaHome);
 		if (javaExecutable == null) {
-			status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), 0, LaunchingMessages.StandardVMType_Not_a_JDK_Root__Java_executable_was_not_found_1, null); //			
+			status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), 0, LaunchingMessages.StandardVMType_Not_a_JDK_Root__Java_executable_was_not_found_1, null); //
 		} else {
 			if (canDetectDefaultSystemLibraries(javaHome, javaExecutable)) {
-				status = new Status(IStatus.OK, LaunchingPlugin.getUniqueIdentifier(), 0, LaunchingMessages.StandardVMType_ok_2, null); 
+				status = new Status(IStatus.OK, LaunchingPlugin.getUniqueIdentifier(), 0, LaunchingMessages.StandardVMType_ok_2, null);
 			} else {
-				status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), 0, LaunchingMessages.StandardVMType_Not_a_JDK_root__System_library_was_not_found__1, null); 
+				status = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), 0, LaunchingMessages.StandardVMType_Not_a_JDK_root__System_library_was_not_found__1, null);
 			}
 		}
-		return status;		
+		return status;
 	}
 
 	/**
@@ -646,17 +646,17 @@
 	 * LibraryDetector</code>), that dumps the system properties for bootpath
 	 * and extension directories. This output is then parsed and cached for
 	 * future reference.
-	 * 
+	 *
 	 * @param javaHome the Java home folder
 	 * @param javaExecutable the Java executable file
-	 * 
+	 *
 	 * @return library info or <code>null</code> if none
-	 */	
+	 */
 	protected LibraryInfo generateLibraryInfo(File javaHome, File javaExecutable) {
 		LibraryInfo info = null;
-		
-		// if this is 1.1.X, the properties will not exist		
-		IPath classesZip = new Path(javaHome.getAbsolutePath()).append(LIB).append("classes.zip"); //$NON-NLS-1$ 
+
+		// if this is 1.1.X, the properties will not exist
+		IPath classesZip = new Path(javaHome.getAbsolutePath()).append(LIB).append("classes.zip"); //$NON-NLS-1$
 		if (classesZip.toFile().exists()) {
 			return new LibraryInfo("1.1.x", new String[] {classesZip.toOSString()}, new String[0], new String[0]); //$NON-NLS-1$
 		}
@@ -665,7 +665,7 @@
 		if (file != null && file.exists()) {
 			String javaExecutablePath = javaExecutable.getAbsolutePath();
 			String[] cmdLine = new String[] { javaExecutablePath, MIN_VM_SIZE,
-					"-classpath", file.getAbsolutePath(), "org.eclipse.jdt.internal.launching.support.LibraryDetector" }; //$NON-NLS-1$ //$NON-NLS-2$ 
+					"-classpath", file.getAbsolutePath(), "org.eclipse.jdt.internal.launching.support.LibraryDetector" }; //$NON-NLS-1$ //$NON-NLS-2$
 			Process p = null;
 			try {
 				String envp[] = null;
@@ -709,10 +709,10 @@
 		}
 		return info;
 	}
-	
+
 	/**
 	 * Parses the output from 'LibraryDetector'.
-	 * 
+	 *
 	 * @param process the backing {@link IProcess} that was run
 	 * @return the new {@link LibraryInfo} object or <code>null</code>
 	 */
@@ -723,39 +723,39 @@
 			text = streamsProxy.getOutputStreamMonitor().getContents();
 		}
 		if (text != null && text.length() > 0) {
-			int index = text.indexOf(BAR); 
-			if (index > 0) { 
+			int index = text.indexOf(BAR);
+			if (index > 0) {
 				String version = text.substring(0, index);
 				text = text.substring(index + 1);
-				index = text.indexOf(BAR); 
+				index = text.indexOf(BAR);
 				if (index > 0) {
 					String bootPaths = text.substring(0, index);
 					String[] bootPath = parsePaths(bootPaths);
-					 
+
 					text = text.substring(index + 1);
-					index = text.indexOf(BAR); 
-					
+					index = text.indexOf(BAR);
+
 					if (index > 0) {
 						String extDirPaths = text.substring(0, index);
 						String endorsedDirsPath = text.substring(index + 1);
 						String[] extDirs = parsePaths(extDirPaths);
 						String[] endDirs = parsePaths(endorsedDirsPath);
 						return new LibraryInfo(version, bootPath, extDirs, endDirs);
-					} 
+					}
 				}
 			}
-		} 
+		}
 		return null;
 	}
-	
+
 	protected String[] parsePaths(String paths) {
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		int pos = 0;
 		int index = paths.indexOf(File.pathSeparatorChar, pos);
 		while (index > 0) {
 			String path = paths.substring(pos, index);
 			list.add(path);
-			pos = index + 1;	
+			pos = index + 1;
 			index = paths.indexOf(File.pathSeparatorChar, pos);
 		}
 		String path = paths.substring(pos);
@@ -764,7 +764,7 @@
 		}
 		return list.toArray(new String[list.size()]);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallType#disposeVMInstall(java.lang.String)
 	 */
@@ -776,7 +776,7 @@
             LaunchingPlugin.setLibraryInfo(path, null);
             fgFailedInstallPath.remove(path);
             fgDefaultLibLocs.remove(path);
-		}		
+		}
 		super.disposeVMInstall(id);
 	}
 
@@ -798,7 +798,7 @@
 
 	/**
 	 * Returns a default Javadoc location for a language version, or <code>null</code>.
-	 * 
+	 *
 	 * @param version language version such as "1.4"
 	 * @return URL to default Javadoc location, or <code>null</code>
 	 */
@@ -838,8 +838,8 @@
 		}
 		catch (IOException e) {
 			e.printStackTrace();
-		} 
-		
+		}
+
 		return version;
 
 	}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMDefinitionsContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMDefinitionsContainer.java
index baaef1b..8f48cf3 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMDefinitionsContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMDefinitionsContainer.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
@@ -56,7 +56,7 @@
 
 /**
  * This is a container for VM definitions such as the VM definitions that are
- * stored in the workbench preferences.  
+ * stored in the workbench preferences.
  * <p>
  * An instance of this class may be obtained from an XML document by calling
  * <code>parseXMLIntoContainer</code>.
@@ -68,51 +68,51 @@
  * <p>
  * Clients may instantiate this class; it is not intended to be subclassed.
  * </p>
- * 
+ *
  * @since 2.1
  */
 public class VMDefinitionsContainer {
-		
+
 	/**
 	 * Map of VMInstallTypes to Lists of corresponding VMInstalls.
 	 */
 	private Map<IVMInstallType, List<IVMInstall>> fVMTypeToVMMap;
-	
+
 	/**
 	 * Cached list of VMs in this container
 	 */
 	private List<IVMInstall> fVMList;
-	
+
 	/**
 	 * VMs managed by this container whose install locations don't actually exist.
 	 */
 	private List<IVMInstall> fInvalidVMList;
-			
+
 	/**
 	 * The composite identifier of the default VM.  This consists of the install type ID
 	 * plus an ID for the VM.
 	 */
 	private String fDefaultVMInstallCompositeID;
-	
+
 	/**
 	 * The identifier of the connector to use for the default VM.
 	 */
 	private String fDefaultVMInstallConnectorTypeID;
-	
+
 	/**
 	 * Contains any error/information status of parsing XML
 	 */
 	private MultiStatus fStatus;
-	
+
 	/**
-	 * Constructs an empty VM container 
+	 * Constructs an empty VM container
 	 */
 	public VMDefinitionsContainer() {
-		fVMTypeToVMMap = new HashMap<IVMInstallType, List<IVMInstall>>(10);
-		fInvalidVMList = new ArrayList<IVMInstall>(10);	
-		fVMList = new ArrayList<IVMInstall>(10);		
+		fVMTypeToVMMap = new HashMap<>(10);
+		fInvalidVMList = new ArrayList<>(10);
+		fVMList = new ArrayList<>(10);
 	}
-		
+
 	/**
 	 * Add the specified VM to the VM definitions managed by this container.
 	 * <p>
@@ -120,16 +120,16 @@
 	 * have already had its install location set.  An invalid VM is one whose install
 	 * location doesn't exist.
 	 * </p>
-	 * 
+	 *
 	 * @param vm the VM to be added to this container
 	 */
 	public void addVM(IVMInstall vm) {
-		if (!fVMList.contains(vm)) {	
+		if (!fVMList.contains(vm)) {
 			IVMInstallType vmInstallType = vm.getVMInstallType();
 			List<IVMInstall> vmList = fVMTypeToVMMap.get(vmInstallType);
 			if (vmList == null) {
-				vmList = new ArrayList<IVMInstall>(3);
-				fVMTypeToVMMap.put(vmInstallType, vmList);			
+				vmList = new ArrayList<>(3);
+				fVMTypeToVMMap.put(vmInstallType, vmList);
 			}
 			vmList.add(vm);
 			File installLocation = vm.getInstallLocation();
@@ -139,7 +139,7 @@
 			fVMList.add(vm);
 		}
 	}
-	
+
 	/**
 	 * Add all VM's in the specified list to the VM definitions managed by this container.
 	 * <p>
@@ -147,7 +147,7 @@
 	 * have already had their install locations set.  An invalid VM is one whose install
 	 * location doesn't exist.
 	 * </p>
-	 * 
+	 *
 	 * @param vmList a list of VMs to be added to this container
 	 */
 	public void addVMList(List<IVMInstall> vmList) {
@@ -160,81 +160,81 @@
 	/**
 	 * Return a mapping of VM install types to lists of VMs.  The keys of this map are instances of
 	 * <code>IVMInstallType</code>.  The values are instances of <code>java.util.List</code>
-	 * which contain instances of <code>IVMInstall</code>.  
-	 * 
+	 * which contain instances of <code>IVMInstall</code>.
+	 *
 	 * @return Map the mapping of VM install types to lists of VMs
 	 */
 	public Map<IVMInstallType, List<IVMInstall>> getVMTypeToVMMap() {
 		return fVMTypeToVMMap;
 	}
-	
+
 	/**
 	 * Return a list of all VMs in this container, including any invalid VMs.  An invalid
 	 * VM is one whose install location does not exist on the file system.
 	 * The order of the list is not specified.
-	 * 
+	 *
 	 * @return List the data structure containing all VMs managed by this container
 	 */
 	public List<IVMInstall> getVMList() {
 		return fVMList;
 	}
-	
+
 	/**
 	 * Return a list of all valid VMs in this container.  A valid VM is one whose install
 	 * location exists on the file system.  The order of the list is not specified.
-	 * 
-	 * @return List 
+	 *
+	 * @return List
 	 */
 	public List<IVMInstall> getValidVMList() {
 		List<IVMInstall> vms = getVMList();
-		List<IVMInstall> resultList = new ArrayList<IVMInstall>(vms.size());
+		List<IVMInstall> resultList = new ArrayList<>(vms.size());
 		resultList.addAll(vms);
 		resultList.removeAll(fInvalidVMList);
 		return resultList;
 	}
-	
+
 	/**
 	 * Returns the composite ID for the default VM.  The composite ID consists
 	 * of an ID for the VM install type together with an ID for VM.  This is
 	 * necessary because VM ids by themselves are not necessarily unique across
 	 * VM install types.
-	 * 
+	 *
 	 * @return String returns the composite ID of the current default VM
 	 */
 	public String getDefaultVMInstallCompositeID(){
 		return fDefaultVMInstallCompositeID;
 	}
-	
+
 	/**
 	 * Sets the composite ID for the default VM.  The composite ID consists
 	 * of an ID for the VM install type together with an ID for VM.  This is
 	 * necessary because VM ids by themselves are not necessarily unique across
 	 * VM install types.
-	 * 
+	 *
 	 * @param id identifies the new default VM using a composite ID
 	 */
 	public void setDefaultVMInstallCompositeID(String id){
 		fDefaultVMInstallCompositeID = id;
 	}
-	
+
 	/**
 	 * Return the default VM's connector type ID.
-	 * 
+	 *
 	 * @return String the current value of the default VM's connector type ID
 	 */
 	public String getDefaultVMInstallConnectorTypeID() {
 		return fDefaultVMInstallConnectorTypeID;
 	}
-	
+
 	/**
 	 * Set the default VM's connector type ID.
-	 * 
+	 *
 	 * @param id the new value of the default VM's connector type ID
 	 */
 	public void  setDefaultVMInstallConnectorTypeID(String id){
 		fDefaultVMInstallConnectorTypeID = id;
 	}
-	
+
 	/**
 	 * Return the VM definitions contained in this object as a String of XML.  The String
 	 * is suitable for storing in the workbench preferences.
@@ -245,22 +245,22 @@
 	 * @throws CoreException if serialization of the XML document failed
 	 */
 	public String getAsXML() throws CoreException {
-		
+
 		// Create the Document and the top-level node
 		Document doc = DebugPlugin.newDocument();
 		Element config = doc.createElement("vmSettings");    //$NON-NLS-1$
 		doc.appendChild(config);
-		
+
 		// Set the defaultVM attribute on the top-level node
 		if (getDefaultVMInstallCompositeID() != null) {
 			config.setAttribute("defaultVM", getDefaultVMInstallCompositeID()); //$NON-NLS-1$
 		}
-		
+
 		// Set the defaultVMConnector attribute on the top-level node
 		if (getDefaultVMInstallConnectorTypeID() != null) {
 			config.setAttribute("defaultVMConnector", getDefaultVMInstallConnectorTypeID()); //$NON-NLS-1$
 		}
-				
+
 		// Create a node for each install type represented in this container
 		Set<IVMInstallType> vmInstallTypeSet = getVMTypeToVMMap().keySet();
 		Iterator<IVMInstallType> keyIterator = vmInstallTypeSet.iterator();
@@ -269,24 +269,24 @@
 			Element vmTypeElement = vmTypeAsElement(doc, vmInstallType);
 			config.appendChild(vmTypeElement);
 		}
-		
+
 		// Serialize the Document and return the resulting String
 		return DebugPlugin.serializeDocument(doc);
 	}
-	
+
 	/**
 	 * Create and return a node for the specified VM install type in the specified Document.
-	 * 
+	 *
 	 * @param doc the backing {@link Document}
 	 * @param vmType the {@link IVMInstallType} to create an {@link Element} for
 	 * @return the new {@link Element}
 	 */
 	private Element vmTypeAsElement(Document doc, IVMInstallType vmType) {
-		
+
 		// Create a node for the VM type and set its 'id' attribute
 		Element element= doc.createElement("vmType");   //$NON-NLS-1$
 		element.setAttribute("id", vmType.getId());     //$NON-NLS-1$
-		
+
 		// For each VM of the specified type, create a subordinate node for it
 		List<IVMInstall> vmList = getVMTypeToVMMap().get(vmType);
 		Iterator<IVMInstall> vmIterator = vmList.iterator();
@@ -295,24 +295,24 @@
 			Element vmElement = vmAsElement(doc, vm);
 			element.appendChild(vmElement);
 		}
-		
+
 		return element;
 	}
-	
+
 	/**
 	 * Create and return a node for the specified VM in the specified Document.
-	 * 
+	 *
 	 * @param doc the backing {@link Document}
 	 * @param vm the {@link IVMInstall} to create an {@link Element} for
 	 * @return the new {@link Element} representing the given {@link IVMInstall}
 	 */
 	private Element vmAsElement(Document doc, IVMInstall vm) {
-		
+
 		// Create the node for the VM and set its 'id' & 'name' attributes
 		Element element= doc.createElement("vm");        //$NON-NLS-1$
 		element.setAttribute("id", vm.getId());	         //$NON-NLS-1$
 		element.setAttribute("name", vm.getName());      //$NON-NLS-1$
-		
+
 		// Determine and set the 'path' attribute for the VM
 		String installPath= "";                          //$NON-NLS-1$
 		File installLocation= vm.getInstallLocation();
@@ -320,20 +320,20 @@
 			installPath= installLocation.getAbsolutePath();
 		}
 		element.setAttribute("path", installPath);       //$NON-NLS-1$
-		
-		// If the 'libraryLocations' attribute is specified, create a node for it 
+
+		// If the 'libraryLocations' attribute is specified, create a node for it
 		LibraryLocation[] libraryLocations= vm.getLibraryLocations();
 		if (libraryLocations != null) {
 			Element libLocationElement = libraryLocationsAsElement(doc, libraryLocations);
 			element.appendChild(libLocationElement);
 		}
-		
+
 		// Java doc location
 		URL url = vm.getJavadocLocation();
 		if (url != null) {
 			element.setAttribute("javadocURL", url.toExternalForm()); //$NON-NLS-1$
 		}
-		
+
 		if (vm instanceof IVMInstall2) {
 			String vmArgs = ((IVMInstall2)vm).getVMArgs();
 			if (vmArgs != null && vmArgs.length() > 0) {
@@ -349,7 +349,7 @@
 				element.setAttribute("vmargs", buffer.toString()); //$NON-NLS-1$
 			}
 		}
-		
+
 		// VM attributes
 		if (vm instanceof AbstractVMInstall) {
 			Map<String, String> attributes = ((AbstractVMInstall)vm).getAttributes();
@@ -366,14 +366,14 @@
 				element.appendChild(attrElement);
 			}
 		}
-		
+
 		return element;
 	}
-	
+
 	/**
 	 * Create and return a 'libraryLocations' node.  This node owns subordinate nodes that
 	 * list individual library locations.
-	 * 
+	 *
 	 * @param doc the backing {@link Document}
 	 * @param locations the array of {@link LibraryLocation}s to create an {@link Element} for
 	 * @return the new {@link Element} for the given {@link LibraryLocation}s
@@ -388,12 +388,12 @@
 			if (null != annotationsPath && !annotationsPath.isEmpty()) {
 				element.setAttribute("jreExternalAnns", annotationsPath.toString()); //$NON-NLS-1$
 			}
-			
+
 			IPath packageRootPath = locations[i].getPackageRootPath();
             if (packageRootPath != null) {
                 element.setAttribute("pkgRoot", packageRootPath.toString()); //$NON-NLS-1$
             }
-            
+
 			URL javadocURL= locations[i].getJavadocLocation();
 			if (javadocURL != null) {
 				element.setAttribute("jreJavadoc", javadocURL.toExternalForm()); //$NON-NLS-1$
@@ -406,13 +406,13 @@
 		}
 		return root;
 	}
-	
+
 	public static VMDefinitionsContainer parseXMLIntoContainer(InputStream inputStream) throws IOException {
 		VMDefinitionsContainer container = new VMDefinitionsContainer();
 		parseXMLIntoContainer(inputStream, container);
 		return container;
 	}
-			
+
 	/**
 	 * Parse the VM definitions contained in the specified InputStream into the
 	 * specified container.
@@ -440,27 +440,27 @@
 
 
 		// Do the parsing and obtain the top-level node
-		Element config= null;		
+		Element config= null;
 		// Wrapper the stream for efficient parsing
 		try (InputStream stream = new BufferedInputStream(inputStream)) {
 			DocumentBuilder parser= DocumentBuilderFactory.newInstance().newDocumentBuilder();
 			parser.setErrorHandler(new DefaultHandler());
 			config = parser.parse(new InputSource(stream)).getDocumentElement();
 		} catch (SAXException e) {
-			throw new IOException(LaunchingMessages.JavaRuntime_badFormat); 
+			throw new IOException(LaunchingMessages.JavaRuntime_badFormat);
 		} catch (ParserConfigurationException e) {
-			throw new IOException(LaunchingMessages.JavaRuntime_badFormat); 
+			throw new IOException(LaunchingMessages.JavaRuntime_badFormat);
 		}
-		
+
 		// If the top-level node wasn't what we expected, bail out
 		if (!config.getNodeName().equalsIgnoreCase("vmSettings")) { //$NON-NLS-1$
-			throw new IOException(LaunchingMessages.JavaRuntime_badFormat); 
+			throw new IOException(LaunchingMessages.JavaRuntime_badFormat);
 		}
-		
+
 		// Populate the default VM-related fields
 		container.setDefaultVMInstallCompositeID(config.getAttribute("defaultVM")); //$NON-NLS-1$
 		container.setDefaultVMInstallConnectorTypeID(config.getAttribute("defaultVMConnector")); //$NON-NLS-1$
-		
+
 		// Traverse the parsed structure and populate the VMType to VM Map
 		NodeList list = config.getChildNodes();
 		int length = list.getLength();
@@ -475,11 +475,11 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * For the specified VM type node, parse all subordinate VM definitions and add them
 	 * to the specified container.
-	 * 
+	 *
 	 * @param vmTypeElement the {@link Element} to populate the {@link VMDefinitionsContainer} from
 	 * @param container the {@link VMDefinitionsContainer} to populate from the {@link Element}
 	 */
@@ -517,9 +517,9 @@
 	}
 
 	/**
-	 * Parse the specified VM node, create a VMStandin for it, and add this to the 
+	 * Parse the specified VM node, create a VMStandin for it, and add this to the
 	 * specified container.
-	 * 
+	 *
 	 * @param vmType VM type
 	 * @param vmElement XML element
 	 * @param container container to add VM to
@@ -527,7 +527,7 @@
 	private static void populateVMForType(IVMInstallType vmType, Element vmElement, VMDefinitionsContainer container) {
 		String id= vmElement.getAttribute("id"); //$NON-NLS-1$
 		if (id != null) {
-			
+
 			// Retrieve the 'path' attribute.  If none, skip this node.
 			String installPath= vmElement.getAttribute("path"); //$NON-NLS-1$
 			String name = vmElement.getAttribute("name"); //$NON-NLS-1$
@@ -545,7 +545,7 @@
 						NLS.bind(LaunchingMessages.VMDefinitionsContainer_5, new String[]{name})));
 				return;
 			}
-						
+
 			// Create a VMStandin for the node and set its 'name' & 'installLocation' attributes
 			VMStandin vmStandin = new VMStandin(vmType, id);
 			vmStandin.setName(name);
@@ -553,10 +553,10 @@
 			vmStandin.setInstallLocation(installLocation);
 			String install = installLocation.getAbsolutePath();
 			//only consider a VM changed it is a standard VM
-			boolean changed = StandardVMType.ID_STANDARD_VM_TYPE.equals(vmType.getId()) && 
+			boolean changed = StandardVMType.ID_STANDARD_VM_TYPE.equals(vmType.getId()) &&
 										LaunchingPlugin.timeStampChanged(install);
 			container.addVM(vmStandin);
-			
+
 			// Look for subordinate nodes.  These may be 'libraryLocation',
 			// 'libraryLocations' or 'versionInfo'.
 			if(!changed) {
@@ -588,7 +588,7 @@
 							}
 						}
 					}
-					
+
 					// javadoc URL
 					String externalForm = vmElement.getAttribute("javadocURL"); //$NON-NLS-1$
 					if (externalForm != null && externalForm.length() > 0) {
@@ -620,12 +620,12 @@
 					NLS.bind(LaunchingMessages.VMDefinitionsContainer_9, new String[]{vmType.getName()})));
 			}
 		}
-	}	
-	
+	}
+
 	/**
 	 * Create & return a LibraryLocation object populated from the attribute values
 	 * in the specified node.
-	 * 
+	 *
 	 * @param libLocationElement the {@link Element} to parse the {@link LibraryLocation} from
 	 * @return the new {@link LibraryLocation} or <code>null</code> if the {@link Element} was malformed
 	 */
@@ -657,7 +657,7 @@
 			} catch (MalformedURLException e) {
 				LaunchingPlugin.log("Library location jre index element is specified incorrectly.");  //$NON-NLS-1$
 			}
-		}		
+		}
 		if (jreJar != null && jreSrc != null && pkgRoot != null) {
 			return new LibraryLocation(new Path(jreJar), new Path(jreSrc), new Path(pkgRoot), javadocURL, indexURL
 					, externalAnns == null ? null : new Path(externalAnns));
@@ -665,18 +665,18 @@
 		LaunchingPlugin.log("Library location element is specified incorrectly.");  //$NON-NLS-1$
 		return null;
 	}
-	
+
 	/**
 	 * Set the LibraryLocations on the specified VM, by extracting the subordinate
 	 * nodes from the specified 'lirbaryLocations' node.
-	 * 
+	 *
 	 * @param vm the {@link IVMInstall} to populate from the given {@link Element}
 	 * @param libLocationsElement the {@link Element} to populate the {@link IVMInstall} with
 	 */
 	private static void setLibraryLocations(IVMInstall vm, Element libLocationsElement) {
 		NodeList list = libLocationsElement.getChildNodes();
 		int length = list.getLength();
-		List<LibraryLocation> locations = new ArrayList<LibraryLocation>(length);
+		List<LibraryLocation> locations = new ArrayList<>(length);
 		for (int i = 0; i < length; ++i) {
 			Node node = list.item(i);
 			short type = node.getNodeType();
@@ -686,13 +686,13 @@
 					locations.add(getLibraryLocation(libraryLocationElement));
 				}
 			}
-		}	
+		}
 		vm.setLibraryLocations(locations.toArray(new LibraryLocation[locations.size()]));
 	}
-	
+
 	/**
 	 * Removes the VM from this container.
-	 * 
+	 *
 	 * @param vm VM install
 	 */
 	public void removeVM(IVMInstall vm) {
@@ -703,7 +703,7 @@
 			list.remove(vm);
 		}
 	}
-		
+
 	private void addStatus(IStatus status) {
 		if (fStatus == null) {
 			fStatus = new MultiStatus(LaunchingPlugin.ID_PLUGIN, 0, LaunchingMessages.VMDefinitionsContainer_10, null);
@@ -713,7 +713,7 @@
 
 	/**
 	 * Returns status from parsing VM installs or <code>null</code> if none.
-	 * 
+	 *
 	 * @return status or <code>null</code>
 	 */
 	public IStatus getStatus() {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMListener.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMListener.java
index 4ffad85..789bdc9 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMListener.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VMListener.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -16,12 +16,12 @@
 
 /**
  * Simple VM listener that reports whether VM settings have changed.
- * 
+ *
  * @since 3.2
  *
  */
 public class VMListener implements IVMInstallChangedListener {
-	
+
 	private boolean fChanged = false;
 
 	/* (non-Javadoc)
@@ -55,7 +55,7 @@
 	public void vmRemoved(IVMInstall vm) {
 		fChanged = true;
 	}
-	
+
 	public boolean isChanged() {
 		return fChanged;
 	}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathEntry.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathEntry.java
index 307a90e..273a69d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathEntry.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathEntry.java
@@ -24,12 +24,12 @@
 public class VariableClasspathEntry extends AbstractRuntimeClasspathEntry {
 	public static final String TYPE_ID = "org.eclipse.jdt.launching.classpathentry.variableClasspathEntry"; //$NON-NLS-1$
 	private String variableString;
-	
+
 	/**
 	 * Constructor
 	 */
 	public VariableClasspathEntry() {}
-	
+
 	/**
 	 * Constructor
 	 * @param variableString the string value
@@ -37,7 +37,7 @@
 	public VariableClasspathEntry(String variableString) {
 		this.variableString = variableString;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.internal.launching.AbstractRuntimeClasspathEntry#buildMemento(org.w3c.dom.Document, org.w3c.dom.Element)
 	 */
@@ -46,7 +46,7 @@
 		memento.setAttribute("variableString", variableString); //$NON-NLS-1$
 		memento.setAttribute("path", Integer.toString(getClasspathProperty())); //$NON-NLS-1$
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#initializeFrom(org.w3c.dom.Element)
 	 */
@@ -60,9 +60,9 @@
 			}
 			catch(NumberFormatException nfe) {/*do nothing, but don't throw an exception*/}
 		}
-		
+
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#getTypeId()
 	 */
@@ -70,7 +70,7 @@
 	public String getTypeId() {
 		return TYPE_ID;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#getRuntimeClasspathEntries(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -78,21 +78,21 @@
 	public IRuntimeClasspathEntry[] getRuntimeClasspathEntries(ILaunchConfiguration configuration) throws CoreException {
 		return new IRuntimeClasspathEntry[0];
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry2#getName()
 	 */
 	@Override
 	public String getName() {
-		return variableString; 
+		return variableString;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry#getType()
 	 */
 	@Override
 	public int getType() {
-		return OTHER; 
+		return OTHER;
 	}
 	/**
 	 * @return Returns the variableString.
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathResolver.java
index dd4ee98..53350df 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/VariableClasspathResolver.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -47,9 +47,9 @@
 		String strpath = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(variableString);
 		IPath path = new Path(strpath).makeAbsolute();
 		IRuntimeClasspathEntry archiveEntry = JavaRuntime.newArchiveRuntimeClasspathEntry(path);
-		return new IRuntimeClasspathEntry[] { archiveEntry };	
+		return new IRuntimeClasspathEntry[] { archiveEntry };
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathEntryResolver#resolveVMInstall(org.eclipse.jdt.core.IClasspathEntry)
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/AccessRuleParticipant.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/AccessRuleParticipant.java
index 1db8251..eff9aab 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/AccessRuleParticipant.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/AccessRuleParticipant.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,27 +22,27 @@
 
 /**
  * Proxy to an access rule participant for an execution environment.
- * 
+ *
  * @since 3.3
  */
 class AccessRuleParticipant implements IAccessRuleParticipant {
 
 	private IConfigurationElement fElement;
-	
+
 	private IAccessRuleParticipant fDelegate;
-	
+
 	/**
-	 * Constructs a proxy to a rule participant contributed with the 
+	 * Constructs a proxy to a rule participant contributed with the
 	 * given configuration element. The element may be an
 	 * <code>executionEnvironment</code> element or a <code>ruleParticipant</code>
 	 * extension.
-	 * 
+	 *
 	 * @param element the configuration element
 	 */
 	AccessRuleParticipant(IConfigurationElement element) {
 		fElement = element;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.environments.IAccessRuleParticipant#getAccessRules(org.eclipse.jdt.launching.environments.IExecutionEnvironment, org.eclipse.jdt.launching.IVMInstall, org.eclipse.jdt.launching.LibraryLocation[], org.eclipse.jdt.core.IJavaProject)
 	 */
@@ -59,7 +59,7 @@
 		}
 		return rules;
 	}
-	
+
 	private IAccessRuleParticipant getDelegate() throws CoreException {
 		if (fDelegate == null) {
 			if (fElement.getName().equals(EnvironmentsManager.ENVIRONMENT_ELEMENT)) {
@@ -70,10 +70,10 @@
 		}
 		return fDelegate;
 	}
-	
+
 	/**
 	 * Returns the id of this participant.
-	 * 
+	 *
 	 * @return participant id
 	 */
 	String getId() {
@@ -82,7 +82,7 @@
 		}
 		return fElement.getAttribute("id"); //$NON-NLS-1$
 	}
-	
+
 	private String getDelegateClassName() {
 		if (fElement.getName().equals(EnvironmentsManager.ENVIRONMENT_ELEMENT)) {
 			return fElement.getAttribute(EnvironmentsManager.RULE_PARTICIPANT_ELEMENT);
@@ -101,7 +101,7 @@
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#hashCode()
 	 */
@@ -109,7 +109,7 @@
 	public int hashCode() {
 		return getDelegateClassName().hashCode();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#toString()
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/Analyzer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/Analyzer.java
index 007fd3d..a584aeb 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/Analyzer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/Analyzer.java
@@ -19,16 +19,16 @@
 
 /**
  * Contributed analyzer.
- * 
+ *
  * @since 3.2
  *
  */
 class Analyzer implements IExecutionEnvironmentAnalyzerDelegate {
-	
+
 	private IConfigurationElement fElement;
-	
+
 	private IExecutionEnvironmentAnalyzerDelegate fDelegate;
-	
+
 	Analyzer(IConfigurationElement element) {
 		fElement = element;
 	}
@@ -43,7 +43,7 @@
 
 	/**
 	 * Instantiates and returns the contributed analyzer.
-	 * 
+	 *
 	 * @return analyzer
 	 * @throws CoreException if an error occurs
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/DefaultAccessRuleParticipant.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/DefaultAccessRuleParticipant.java
index d97cbf8..df824ae 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/DefaultAccessRuleParticipant.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/DefaultAccessRuleParticipant.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -29,15 +29,15 @@
 /**
  * Creates default access rules for standard execution environments
  * based on OSGi profiles.
- * 
+ *
  * @since 3.3
  */
 public class DefaultAccessRuleParticipant implements IAccessRuleParticipant {
-	
+
 	/**
 	 * Cache of access rules per environment. Re-use rules between projects.
 	 */
-	private static Map<String, IAccessRule[][]> fgRules = new HashMap<String, IAccessRule[][]>();
+	private static Map<String, IAccessRule[][]> fgRules = new HashMap<>();
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.environments.IAccessRuleParticipant#getAccessRules(org.eclipse.jdt.launching.environments.IExecutionEnvironment, org.eclipse.jdt.launching.IVMInstall, org.eclipse.jdt.launching.LibraryLocation[], org.eclipse.jdt.core.IJavaProject)
@@ -62,7 +62,7 @@
 			}
 			allRules = new IAccessRule[libraries.length][];
 			for (int i = 0; i < allRules.length; i++) {
-				allRules[i] = packageRules;	
+				allRules[i] = packageRules;
 			}
 			fgRules.put(environment.getId(), allRules);
 		}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/EnvironmentsManager.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/EnvironmentsManager.java
index fd00663..4e8dd20 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/EnvironmentsManager.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/EnvironmentsManager.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -52,7 +52,7 @@
 
 /**
  * Utility class for execution environments.
- * 
+ *
  * @since 3.2
  */
 public class EnvironmentsManager implements IExecutionEnvironmentsManager, IVMInstallChangedListener, IPreferenceChangeListener {
@@ -66,21 +66,21 @@
 	 * Extension configuration element name.
 	 */
 	static final String ENVIRONMENT_ELEMENT = "environment"; //$NON-NLS-1$
-	
+
 	/**
 	 * Extension configuration element name.
 	 */
-	static final String RULE_PARTICIPANT_ELEMENT = "ruleParticipant"; //$NON-NLS-1$	
+	static final String RULE_PARTICIPANT_ELEMENT = "ruleParticipant"; //$NON-NLS-1$
 
 	private static EnvironmentsManager fgManager = null;
-	
+
 	/**
 	 * Preference store key for XML storing default environments.
 	 */
 	private static final String PREF_DEFAULT_ENVIRONMENTS_XML = "org.eclipse.jdt.launching.PREF_DEFAULT_ENVIRONMENTS_XML"; //$NON-NLS-1$
-	
+
 	/**
-	 * List of environments 
+	 * List of environments
 	 */
 	private TreeSet<IExecutionEnvironment> fEnvironments = null;
 
@@ -88,22 +88,22 @@
 	 * List of access rule participants
 	 */
 	private Set<AccessRuleParticipant> fRuleParticipants = null;
-	
+
 	/**
 	 * Map of environments keyed by id
 	 */
 	private Map<String, IExecutionEnvironment> fEnvironmentsMap = null;
-	
+
 	/**
 	 * Map of analyzers keyed by id
 	 */
 	private Map<String, Analyzer> fAnalyzers = null;
-	
+
 	/**
 	 * <code>true</code> while updating the default settings preferences
 	 */
 	private boolean fIsUpdatingDefaults = false;
-	
+
 	/**
 	 * Whether compatible environments have been initialized
 	 */
@@ -128,10 +128,10 @@
 	 * XML document
 	 */
 	private static final String DEFAULT_ENVIRONMENTS = "defaultEnvironments"; //$NON-NLS-1$
-	
+
 	/**
 	 * Returns the singleton environments manager.
-	 * 
+	 *
 	 * @return environments manager
 	 */
 	public static EnvironmentsManager getDefault() {
@@ -140,7 +140,7 @@
 		}
 		return fgManager;
 	}
-	
+
 	/**
 	 * Constructs the new manager.
 	 */
@@ -157,10 +157,10 @@
 		initializeExtensions();
 		return fEnvironments.toArray(new IExecutionEnvironment[fEnvironments.size()]);
 	}
-	
+
 	/**
 	 * Returns all access rule participants that are not specific to an execution environment.
-	 * 
+	 *
 	 * @return all access rule participants that are not specific to an execution environment.
 	 * @since 3.3
 	 */
@@ -168,7 +168,7 @@
 		initializeExtensions();
 		return fRuleParticipants.toArray(new IAccessRuleParticipant[fRuleParticipants.size()]);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.environments.IExecutionEnvironmentsManager#getEnvironment(java.lang.String)
 	 */
@@ -177,31 +177,31 @@
 		initializeExtensions();
 		return fEnvironmentsMap.get(id);
 	}
-	
+
 	/**
-	 * Returns all registered analyzers 
-	 * 
+	 * Returns all registered analyzers
+	 *
 	 * @return all registered analyzers
 	 */
-	public synchronized Analyzer[] getAnalyzers() { 
+	public synchronized Analyzer[] getAnalyzers() {
 		initializeExtensions();
 		Collection<Analyzer> collection = fAnalyzers.values();
 		return collection.toArray(new Analyzer[collection.size()]);
-	}	
-	
+	}
+
 	private synchronized void initializeExtensions() {
 		if (fEnvironments == null) {
 			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(LaunchingPlugin.ID_PLUGIN, JavaRuntime.EXTENSION_POINT_EXECUTION_ENVIRONMENTS);
 			IConfigurationElement[] configs= extensionPoint.getConfigurationElements();
-			fEnvironments = new TreeSet<IExecutionEnvironment>(new Comparator<IExecutionEnvironment>() {
+			fEnvironments = new TreeSet<>(new Comparator<IExecutionEnvironment>() {
 				@Override
 				public int compare(IExecutionEnvironment o1, IExecutionEnvironment o2) {
 					return o1.getId().compareTo(o2.getId());
 				}
 			});
-			fRuleParticipants = new LinkedHashSet<AccessRuleParticipant>();
-			fEnvironmentsMap = new HashMap<String, IExecutionEnvironment>(configs.length);
-			fAnalyzers = new HashMap<String, Analyzer>(configs.length);
+			fRuleParticipants = new LinkedHashSet<>();
+			fEnvironmentsMap = new HashMap<>(configs.length);
+			fAnalyzers = new HashMap<>(configs.length);
 			for (int i = 0; i < configs.length; i++) {
 				IConfigurationElement element = configs[i];
 				String name = element.getName();
@@ -233,7 +233,7 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Initializes compatibility settings.
 	 */
@@ -255,7 +255,7 @@
         	}
         }
 	}
-	
+
 	/**
 	 * Reads persisted default VMs from the preference store
 	 */
@@ -264,7 +264,7 @@
 		try {
 			if (xml.length() > 0) {
 				DocumentBuilder parser = LaunchingPlugin.getParser();
-				
+
 				Document document = parser.parse(new ByteArrayInputStream(xml.getBytes()));
 				Element envs = document.getDocumentElement();
 				NodeList list = envs.getChildNodes();
@@ -286,7 +286,7 @@
 							}
 						}
 					}
-				}			
+				}
 			}
 		} catch (CoreException e) {
 			LaunchingPlugin.log(e);
@@ -299,7 +299,7 @@
 
 	/**
 	 * Returns an XML description of default VMs per environment. Returns
-	 * an empty string when there are none. 
+	 * an empty string when there are none.
 	 * @return an XML description of default VMs per environment. Returns
 	 * an empty string when there are none.
 	 */
@@ -329,10 +329,10 @@
 		}
 		return ""; //$NON-NLS-1$
 	}
-	
+
 	/**
 	 * Analyzes compatible execution environments for the given VM install.
-	 * 
+	 *
 	 * @param vm the {@link IVMInstall} to find environments for
 	 * @param monitor a progress monitor or <code>null</code>
 	 */
@@ -345,12 +345,12 @@
 				for (int j = 0; j < environments.length; j++) {
 					CompatibleEnvironment compatibleEnvironment = environments[j];
 					ExecutionEnvironment environment = (ExecutionEnvironment) compatibleEnvironment.getCompatibleEnvironment();
-					environment.add(vm, compatibleEnvironment.isStrictlyCompatbile());					
+					environment.add(vm, compatibleEnvironment.isStrictlyCompatbile());
 				}
 			} catch (CoreException e) {
 				LaunchingPlugin.log(e);
 			}
-		}	
+		}
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironment.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironment.java
index 6b0b998..06c30c6 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironment.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironment.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- *  Copyright (c) 2005, 2016 IBM Corporation and others.
+ *  Copyright (c) 2005, 2017 IBM Corporation and others.
  *  All rights reserved. This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
@@ -55,11 +51,11 @@
 
 /**
  * A contributed execution environment.
- * 
+ *
  * @since 3.2
  */
 class ExecutionEnvironment implements IExecutionEnvironment {
-	
+
 	/**
 	 * Add a VM changed listener to clear cached values when a VM changes or is removed
 	 */
@@ -70,7 +66,7 @@
 		 */
 		@Override
 		public void defaultVMInstallChanged(IVMInstall previous, IVMInstall current) {}
-		
+
 		/* (non-Javadoc)
 		 * @see org.eclipse.jdt.launching.IVMInstallChangedListener#vmAdded(org.eclipse.jdt.launching.IVMInstall)
 		 */
@@ -97,73 +93,73 @@
 			fRuleCache.remove(removedVm);
 		}
 	};
-		
-	
+
+
 	/**
 	 * The backing <code>IConfigurationElement</code>
 	 */
 	private IConfigurationElement fElement;
-	
+
 	/**
 	 * Environment specific rule participant or <code>null</code> if none.
 	 */
 	private IAccessRuleParticipant fRuleParticipant;
-	
+
 	/**
 	 * OSGi profile properties or <code>null</code> if none.
 	 */
 	private Properties fProfileProperties;
-	
+
 	/**
 	 * Whether profile properties have been initialized
 	 */
 	private boolean fPropertiesInitialized;
-	
+
 	/**
 	 * Set of compatible vm's - just the strictly compatible ones
 	 */
-	private Set<IVMInstall> fStrictlyCompatible = new HashSet<IVMInstall>();
-	
-	/** 
+	private Set<IVMInstall> fStrictlyCompatible = new HashSet<>();
+
+	/**
 	 * All compatible vm's
 	 */
-	private List<IVMInstall> fCompatibleVMs = new ArrayList<IVMInstall>();
-	
+	private List<IVMInstall> fCompatibleVMs = new ArrayList<>();
+
 	/**
 	 * default VM install or <code>null</code> if none
 	 */
 	private IVMInstall fDefault = null;
-	
+
 	/**
 	 * Cache of access rule participants to consider for this environment.
 	 */
 	private IAccessRuleParticipant[] fParticipants = null;
-	
+
 	/**
 	 * Map of {IVMInstall -> Map of {participant -> IAccessRule[][]}}.
 	 * Caches access rules returned by each participant for a given VM.
 	 * @since 3.3
 	 */
-	private Map<IVMInstall, Map<IAccessRuleParticipant, IAccessRule[][]>> fParticipantMap = new HashMap<IVMInstall, Map<IAccessRuleParticipant, IAccessRule[][]>>();
-	
+	private Map<IVMInstall, Map<IAccessRuleParticipant, IAccessRule[][]>> fParticipantMap = new HashMap<>();
+
 	/**
 	 * Cache of VM -> IAccessRule[][] based on the current state of the participant
 	 * map. These are the union of the latest rules generated by the participants
-	 * for a specific VM. 
+	 * for a specific VM.
 	 * @since 3.3
 	 */
-	private Map<IVMInstall, IAccessRule[][]> fRuleCache = new HashMap<IVMInstall, IAccessRule[][]>();
-	
+	private Map<IVMInstall, IAccessRule[][]> fRuleCache = new HashMap<>();
+
 	/**
 	 * Wild card pattern matching all files
 	 */
 	private static final IPath ALL_PATTERN = new Path("**/*"); //$NON-NLS-1$
-	
+
 	/**
 	 * Prefix of compiler settings in properties file
 	 */
 	private static final String COMPILER_SETTING_PREFIX = JavaCore.PLUGIN_ID + ".compiler"; //$NON-NLS-1$
-	
+
 	/**
 	 * Constructor
 	 * @param element the backing {@link IConfigurationElement}
@@ -177,7 +173,7 @@
 		}
 		JavaRuntime.addVMInstallChangedListener(fListener);
 	}
-	
+
 	/**
 	 * Initializes the <code>EnvironmentsManager</code>
 	 */
@@ -246,14 +242,14 @@
 		rebindClasspathContainers();
 	}
 
-	/** 
+	/**
 	 * Updates Java projects referencing this environment, if any.
 	 */
 	private void rebindClasspathContainers() {
 		IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
 		if (model != null) {
 			try {
-				List<IJavaProject> updates = new ArrayList<IJavaProject>();
+				List<IJavaProject> updates = new ArrayList<>();
 				IJavaProject[] javaProjects = model.getJavaProjects();
 				IPath path = JavaRuntime.newJREContainerPath(this);
 				for (int i = 0; i < javaProjects.length; i++) {
@@ -269,7 +265,7 @@
 					}
 				}
 				if (!updates.isEmpty()) {
-					JavaCore.setClasspathContainer(path, 
+					JavaCore.setClasspathContainer(path,
 							updates.toArray(new IJavaProject[updates.size()]),
 							new IClasspathContainer[updates.size()],
 							new NullProgressMonitor());
@@ -296,7 +292,7 @@
 			fStrictlyCompatible.add(vm);
 		}
 	}
-	
+
 	/**
 	 * Removes the specified VM from the listings of VMs
 	 * @param vm the VM to remove
@@ -305,7 +301,7 @@
 		fCompatibleVMs.remove(vm);
 		fStrictlyCompatible.remove(vm);
 	}
-	
+
 	/**
 	 * Sets the default VM to be the one specified
 	 * @param vm the VM to set as the default
@@ -324,7 +320,7 @@
 		synchronized (this) {
 			Map<IAccessRuleParticipant, IAccessRule[][]> cachedRules = fParticipantMap.get(vm);
 			if (cachedRules == null || !cachedRules.equals(rulesByParticipant)) {
-				ArrayList<List<IAccessRule>> libLists = new ArrayList<List<IAccessRule>>(); // array of lists of access rules
+				ArrayList<List<IAccessRule>> libLists = new ArrayList<>(); // array of lists of access rules
 				for (int i = 0; i < libraries.length; i++) {
 					libLists.add(new ArrayList<IAccessRule>());
 				}
@@ -344,12 +340,12 @@
 			return fRuleCache.get(vm);
 		}
 	}
-	
+
 	/**
 	 * Returns all access rule participants to consider for this environment.
 	 * Includes any participant contributed with this environment and all other
 	 * stand alone participants.
-	 * 
+	 *
 	 * @return access rule participants to consider for this environment
 	 */
 	private synchronized IAccessRuleParticipant[] getParticipants() {
@@ -358,7 +354,7 @@
 			IAccessRuleParticipant[] participants = EnvironmentsManager.getDefault().getAccessRuleParticipants();
 			if (fRuleParticipant != null) {
 				// ensure environment specific provider is last and not duplicated
-				LinkedHashSet<IAccessRuleParticipant> set = new LinkedHashSet<IAccessRuleParticipant>();
+				LinkedHashSet<IAccessRuleParticipant> set = new LinkedHashSet<>();
 				for (int i = 0; i < participants.length; i++) {
 					set.add(participants[i]);
 				}
@@ -371,30 +367,30 @@
 		}
 		return fParticipants;
 	}
-	
+
 	/**
 	 * Returns a map of participant to the access rules for that participant for the given
 	 * VM, libraries, and project.
-	 * 
+	 *
 	 * @param participants access rule participants
 	 * @param vm the VM
-	 * @param libraries the {@link LibraryLocation}s 
+	 * @param libraries the {@link LibraryLocation}s
 	 * @param project the {@link IJavaProject} context
 	 * @return the mapping of {@link IAccessRuleParticipant} to {@link IAccessRule}s
 	 */
 	private Map<IAccessRuleParticipant, IAccessRule[][]> collectRulesByParticipant(IAccessRuleParticipant[] participants, IVMInstall vm, LibraryLocation[] libraries, IJavaProject project) {
-		Map<IAccessRuleParticipant, IAccessRule[][]> map = new HashMap<IAccessRuleParticipant, IAccessRule[][]>();
+		Map<IAccessRuleParticipant, IAccessRule[][]> map = new HashMap<>();
 		for (int i = 0; i < participants.length; i++) {
 			// TODO: use safe runnable
 			map.put(participants[i], participants[i].getAccessRules(this, vm, libraries, project));
 		}
 		return map;
 	}
-	
+
 	/**
-	 * Adds the access rules to each list in the given collection. If the last rule in a 
+	 * Adds the access rules to each list in the given collection. If the last rule in a
 	 * given collection is the wild card pattern then no more rules are added to that collection.
-	 * 
+	 *
 	 * @param accessRules the list of {@link IAccessRule}s
 	 * @param collect the array of lists to collect the {@link IAccessRule}s in
 	 */
@@ -438,11 +434,11 @@
 		}
 		return fProfileProperties;
 	}
-	
+
 	/**
 	 * Returns properties file contained in the specified bundle at the given
 	 * bundle relative path, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param bundle bundle to locate file in
 	 * @param path bundle relative path to properties file
 	 * @return properties or <code>null</code> if none
@@ -484,7 +480,7 @@
 	@Override
 	public IExecutionEnvironment[] getSubEnvironments() {
 		Properties properties = getProfileProperties();
-		Set<IExecutionEnvironment> subenv = new LinkedHashSet<IExecutionEnvironment>();
+		Set<IExecutionEnvironment> subenv = new LinkedHashSet<>();
 		if (properties != null) {
 			@SuppressWarnings("deprecation")
 			String subsets = properties.getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT);
@@ -508,7 +504,7 @@
 	public Map<String, String> getComplianceOptions() {
 		Properties properties = getProfileProperties();
 		if (properties != null) {
-			Map<String, String> map = new HashMap<String, String>();
+			Map<String, String> map = new HashMap<>();
 			Iterator<?> iterator = properties.keySet().iterator();
 			while (iterator.hasNext()) {
 				String key = (String) iterator.next();
@@ -521,5 +517,5 @@
 			}
 		}
 		return null;
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java
index 86ee5d3..980a141 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java
@@ -34,11 +34,11 @@
 import org.eclipse.jdt.launching.environments.IExecutionEnvironmentsManager;
 /**
  * Environment analyzer for standard execution environments.
- * 
+ *
  * @since 3.3
  */
 public class ExecutionEnvironmentAnalyzer implements IExecutionEnvironmentAnalyzerDelegate {
-	
+
 	// XXX: Note that this string is not yet standardized by OSGi, see http://wiki.osgi.org/wiki/Execution_Environment
 	static final String JavaSE_9 = "JavaSE-9"; //$NON-NLS-1$
 	private static final String JavaSE_1_8 = "JavaSE-1.8"; //$NON-NLS-1$
@@ -50,21 +50,21 @@
 	private static final String J2SE_1_3 = "J2SE-1.3"; //$NON-NLS-1$
 	private static final String J2SE_1_2 = "J2SE-1.2"; //$NON-NLS-1$
 	private static final String JRE_1_1 = "JRE-1.1"; //$NON-NLS-1$
-	
+
 	private static final String CDC_FOUNDATION_1_1 = "CDC-1.1/Foundation-1.1"; //$NON-NLS-1$
 	private static final String CDC_FOUNDATION_1_0 = "CDC-1.0/Foundation-1.0"; //$NON-NLS-1$
-	
+
 	private static final String OSGI_MINIMUM_1_0 = "OSGi/Minimum-1.0"; //$NON-NLS-1$
 	private static final String OSGI_MINIMUM_1_1 = "OSGi/Minimum-1.1"; //$NON-NLS-1$
 	private static final String OSGI_MINIMUM_1_2 = "OSGi/Minimum-1.2"; //$NON-NLS-1$
-	
+
 	private static final String JAVA_SPEC_VERSION = "java.specification.version"; //$NON-NLS-1$
 	private static final String JAVA_SPEC_NAME = "java.specification.name"; //$NON-NLS-1$
 	private static final String JAVA_VERSION = "java.version"; //$NON-NLS-1$
-	
+
 	private static final String[] VM_PROPERTIES = {JAVA_SPEC_NAME, JAVA_SPEC_VERSION, JAVA_VERSION};
 	private static final String FOUNDATION = "foundation"; //$NON-NLS-1$
-	private static final Map<String, String[]> mappings = new HashMap<String, String[]>();
+	private static final Map<String, String[]> mappings = new HashMap<>();
 
 	static {
 		// table where the key is the EE and the value is an array of EEs that it is a super-set of
@@ -83,7 +83,7 @@
 	}
 	@Override
 	public CompatibleEnvironment[] analyze(IVMInstall vm, IProgressMonitor monitor) throws CoreException {
-		ArrayList<CompatibleEnvironment> result = new ArrayList<CompatibleEnvironment>();
+		ArrayList<CompatibleEnvironment> result = new ArrayList<>();
 		if (!(vm instanceof IVMInstall2)) {
 			return new CompatibleEnvironment[0];
 		}
@@ -178,10 +178,10 @@
 			result.add(new CompatibleEnvironment(env, strict));
 		}
 	}
-	
+
 	// first entry in the list is the perfect match
 	private List<String> getTypes(String type) {
-		List<String> result = new ArrayList<String>();
+		List<String> result = new ArrayList<>();
 		result.add(type);
 		String[] values = mappings.get(type);
 		if (values != null) {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractJavaLaunchConfigurationDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractJavaLaunchConfigurationDelegate.java
index aea799c..d46cb52 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractJavaLaunchConfigurationDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractJavaLaunchConfigurationDelegate.java
@@ -58,7 +58,7 @@
  * Clients implementing Java launch configuration delegates should subclass this
  * class.
  * </p>
- * 
+ *
  * @since 2.0
  */
 public abstract class AbstractJavaLaunchConfigurationDelegate extends LaunchConfigurationDelegate implements IDebugEventSetListener {
@@ -68,7 +68,7 @@
 	private IProject[] fOrderedProjects;
 	/**
 	 * Convenience method to get the launch manager.
-	 * 
+	 *
 	 * @return the launch manager
 	 */
 	protected ILaunchManager getLaunchManager() {
@@ -77,7 +77,7 @@
 	/**
 	 * Throws a core exception with an error status object built from the given
 	 * message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message
 	 *            the status message
 	 * @param exception
@@ -96,7 +96,7 @@
 	/**
 	 * Returns the VM install specified by the given launch configuration, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM install specified by the given launch configuration, or
@@ -111,7 +111,7 @@
 	/**
 	 * Returns the VM install name specified by the given launch configuration,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM install name specified by the given launch configuration,
@@ -129,7 +129,7 @@
 	/**
 	 * Returns the VM install type specified by the given launch configuration,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM install type specified by the given launch configuration,
@@ -151,7 +151,7 @@
 	/**
 	 * Returns the VM install type identifier specified by the given launch
 	 * configuration, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM install type identifier specified by the given launch
@@ -169,7 +169,7 @@
 	/**
 	 * Verifies the VM install specified by the given launch configuration
 	 * exists and returns the VM install.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM install specified by the given launch configuration
@@ -183,31 +183,31 @@
 		IVMInstall vm = getVMInstall(configuration);
 		if (vm == null) {
 			abort(
-					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_The_specified_JRE_installation_does_not_exist_4, 
+					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_The_specified_JRE_installation_does_not_exist_4,
 					null,
-					IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST); 
+					IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST);
 		}
 		File location = vm.getInstallLocation();
 		if (location == null) {
 			abort(
 					NLS.bind(LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_JRE_home_directory_not_specified_for__0__5, new String[]{vm.getName()}),
 					null,
-					IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST); 
+					IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST);
 		}
 		if (!location.exists()) {
 			abort(
-					NLS.bind(LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_JRE_home_directory_for__0__does_not_exist___1__6, 
+					NLS.bind(LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_JRE_home_directory_for__0__does_not_exist___1__6,
 									new String[]{vm.getName(),
 											location.getAbsolutePath()}),
 					null,
-					IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST); 
+					IJavaLaunchConfigurationConstants.ERR_VM_INSTALL_DOES_NOT_EXIST);
 		}
 		return vm;
 	}
 	/**
 	 * Returns the VM connector identifier specified by the given launch
 	 * configuration, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM connector identifier specified by the given launch
@@ -227,7 +227,7 @@
 	 * resolved strings. The returned array is <code>null</code> if all
 	 * entries are standard (i.e. appear by default), or empty to represent an
 	 * empty bootpath.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the bootpath specified by the given launch configuration. An
@@ -249,7 +249,7 @@
 		IRuntimeClasspathEntry[] entries = JavaRuntime
 				.computeUnresolvedRuntimeClasspath(configuration);
 		entries = JavaRuntime.resolveRuntimeClasspath(entries, configuration);
-		List<String> bootEntries = new ArrayList<String>(entries.length);
+		List<String> bootEntries = new ArrayList<>(entries.length);
 		boolean empty = true;
 		boolean allStandard = true;
 		for (int i = 0; i < entries.length; i++) {
@@ -280,7 +280,7 @@
 	 * part of the boot classpath -<code>null</code> represents the default
 	 * bootclasspath. The third array represents the classpath that should be
 	 * appended to the boot classpath.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return a description of the boot classpath specified by the given launch
@@ -294,7 +294,7 @@
 		String[][] bootpathInfo = new String[3][];
 		IRuntimeClasspathEntry[] entries = JavaRuntime
 				.computeUnresolvedRuntimeClasspath(configuration);
-		List<IRuntimeClasspathEntry> bootEntriesPrepend = new ArrayList<IRuntimeClasspathEntry>();
+		List<IRuntimeClasspathEntry> bootEntriesPrepend = new ArrayList<>();
 		int index = 0;
 		IRuntimeClasspathEntry jreEntry = null;
 		while (jreEntry == null && index < entries.length) {
@@ -321,7 +321,7 @@
 			}
 		}
 		if (jreEntry != null) {
-			List<IRuntimeClasspathEntry> bootEntriesAppend = new ArrayList<IRuntimeClasspathEntry>();
+			List<IRuntimeClasspathEntry> bootEntriesAppend = new ArrayList<>();
 			for (; index < entries.length; index++) {
 				IRuntimeClasspathEntry entry = entries[index];
 				if (entry.getClasspathProperty() == IRuntimeClasspathEntry.BOOTSTRAP_CLASSES) {
@@ -347,11 +347,11 @@
 				// TODO: this test does not tell us if the bootpath entries are different (could still be
 				// the same, as a non-bootpath entry on the JRE may have been removed/added)
 				// We really need a way to ask a VM type for its default bootpath library locations and
-				// compare that to the resolved entries for the "jreEntry" to see if they 
+				// compare that to the resolved entries for the "jreEntry" to see if they
 				// are different (requires explicit bootpath)
 				if (!JRERuntimeClasspathEntryResolver.isSameArchives(libraryLocations, install.getVMInstallType().getDefaultLibraryLocations(install.getInstallLocation()))) {
 					// resolve bootpath entries in JRE entry
-					IRuntimeClasspathEntry[] bootEntries = null; 
+					IRuntimeClasspathEntry[] bootEntries = null;
 					if (jreEntry.getType() == IRuntimeClasspathEntry.CONTAINER) {
 						IRuntimeClasspathEntry bootEntry = JavaRuntime.newRuntimeContainerClasspathEntry(
 								jreEntry.getPath(),
@@ -361,7 +361,7 @@
 					} else {
 						bootEntries = JavaRuntime.resolveRuntimeClasspathEntry(jreEntry, configuration);
 					}
-					
+
 					// non-default JRE libraries - use explicit bootpath only
 					String[] bootpath = new String[bootEntriesPrep.length
 							+ bootEntries.length + bootEntriesApp.length];
@@ -397,7 +397,7 @@
 	 * classpath as specified by the given launch configuration, as an array of
 	 * resolved strings. The returned array is empty if no classpath is
 	 * specified.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the classpath specified by the given launch configuration,
@@ -410,8 +410,8 @@
 		IRuntimeClasspathEntry[] entries = JavaRuntime
 				.computeUnresolvedRuntimeClasspath(configuration);
 		entries = JavaRuntime.resolveRuntimeClasspath(entries, configuration);
-		List<String> userEntries = new ArrayList<String>(entries.length);
-		Set<String> set = new HashSet<String>(entries.length);
+		List<String> userEntries = new ArrayList<>(entries.length);
+		Set<String> set = new HashSet<>(entries.length);
 		for (int i = 0; i < entries.length; i++) {
 			if (entries[i].getClasspathProperty() == IRuntimeClasspathEntry.USER_CLASSES) {
 				String location = entries[i].getLocation();
@@ -428,7 +428,7 @@
 	/**
 	 * Returns the Java project specified by the given launch configuration, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the Java project specified by the given launch configuration, or
@@ -455,7 +455,7 @@
 	/**
 	 * Returns the Java project name specified by the given launch
 	 * configuration, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the Java project name specified by the given launch
@@ -472,7 +472,7 @@
 	/**
 	 * Returns the main type name specified by the given launch configuration,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the main type name specified by the given launch configuration,
@@ -495,7 +495,7 @@
 	 * Returns the program arguments specified by the given launch
 	 * configuration, as a string. The returned string is empty if no program
 	 * arguments are specified.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the program arguments specified by the given launch
@@ -513,7 +513,7 @@
 	/**
 	 * Returns the VM arguments specified by the given launch configuration, as
 	 * a string. The returned string is empty if no VM arguments are specified.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the VM arguments specified by the given launch configuration,
@@ -547,7 +547,7 @@
 	/**
 	 * Returns the Map of VM-specific attributes specified by the given launch
 	 * configuration, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the <code>Map</code> of VM-specific attributes
@@ -556,7 +556,7 @@
 	 */
 	public Map<String, Object> getVMSpecificAttributesMap(ILaunchConfiguration configuration) throws CoreException {
 		Map<String, String> map = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP,(Map<String, String>) null);
-		Map<String, Object> attributes = new HashMap<String, Object>();
+		Map<String, Object> attributes = new HashMap<>();
 		if(map != null) {
 			attributes.putAll(map);
 		}
@@ -578,7 +578,7 @@
 	/**
 	 * Returns the working directory specified by the given launch
 	 * configuration, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the working directory specified by the given launch
@@ -593,7 +593,7 @@
 	/**
 	 * Returns the working directory path specified by the given launch
 	 * configuration, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the working directory path specified by the given launch
@@ -616,7 +616,7 @@
 	/**
 	 * Verifies a Java project is specified by the given launch configuration,
 	 * and returns the Java project.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the Java project specified by the given launch configuration
@@ -629,23 +629,23 @@
 		String name = getJavaProjectName(configuration);
 		if (name == null) {
 			abort(
-					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Java_project_not_specified_9, 
+					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Java_project_not_specified_9,
 					null,
-					IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT); 
+					IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT);
 		}
 		IJavaProject project = getJavaProject(configuration);
 		if (project == null) {
 			abort(
-					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Project_does_not_exist_or_is_not_a_Java_project_10, 
+					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Project_does_not_exist_or_is_not_a_Java_project_10,
 					null,
-					IJavaLaunchConfigurationConstants.ERR_NOT_A_JAVA_PROJECT); 
+					IJavaLaunchConfigurationConstants.ERR_NOT_A_JAVA_PROJECT);
 		}
 		return project;
 	}
 	/**
 	 * Verifies a main type name is specified by the given launch configuration,
 	 * and returns the main type name.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the main type name specified by the given launch configuration
@@ -658,9 +658,9 @@
 		String name = getMainTypeName(configuration);
 		if (name == null) {
 			abort(
-					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Main_type_not_specified_11, 
+					LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Main_type_not_specified_11,
 					null,
-					IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); 
+					IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE);
 		}
 		return name;
 	}
@@ -668,7 +668,7 @@
 	 * Verifies the working directory specified by the given launch
 	 * configuration exists, and returns the working directory, or
 	 * <code>null</code> if none is specified.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return the working directory specified by the given launch
@@ -685,10 +685,10 @@
 				if (!dir.isDirectory()) {
 					abort(
 							NLS.bind(
-									LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Working_directory_does_not_exist___0__12, 
+									LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Working_directory_does_not_exist___0__12,
 									new String[]{dir.toString()}),
 									null,
-									IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST); 
+									IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
 				}
 				return dir;
 			}
@@ -707,10 +707,10 @@
 				}
 				abort(
 					NLS.bind(
-									LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Working_directory_does_not_exist___0__12, 
+									LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Working_directory_does_not_exist___0__12,
 									new String[]{path.toString()}),
 					null,
-					IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST); 
+					IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
 			} else {
 				IResource res = ResourcesPlugin.getWorkspace().getRoot()
 						.findMember(path);
@@ -719,10 +719,10 @@
 				}
 				abort(
 					NLS.bind(
-									LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Working_directory_does_not_exist___0__12, 
+									LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_Working_directory_does_not_exist___0__12,
 									new String[]{path.toString()}),
 					null,
-					IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST); 
+					IJavaLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
 			}
 		}
 		return null;
@@ -730,7 +730,7 @@
 	/**
 	 * Returns whether the given launch configuration specifies that termination
 	 * is allowed.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return whether termination is allowed
@@ -745,7 +745,7 @@
 	/**
 	 * Returns whether the given launch configuration specifies that execution
 	 * should suspend on entry of the main method.
-	 * 
+	 *
 	 * @param configuration
 	 *            launch configuration
 	 * @return whether execution should suspend in main
@@ -762,7 +762,7 @@
 	 * Assigns a default source locator to the given launch if a source locator
 	 * has not yet been assigned to it, and the associated launch configuration
 	 * does not specify a source locator.
-	 * 
+	 *
 	 * @param launch
 	 *            launch object
 	 * @param configuration
@@ -787,7 +787,7 @@
 	 * Determines if the given launch configuration specifies the "stop-in-main"
 	 * attribute, and sets up an event listener to handle the option if
 	 * required.
-	 * 
+	 *
 	 * @param configuration
 	 *            configuration being launched
 	 * @exception CoreException
@@ -806,7 +806,7 @@
 	}
 	/**
 	 * Handles the "stop-in-main" option.
-	 * 
+	 *
 	 * @param events
 	 *            the debug events.
 	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(DebugEvent[])
@@ -827,7 +827,7 @@
 							if (isStopInMain(configuration)) {
 								String mainType = getMainTypeName(configuration);
 								if (mainType != null) {
-									Map<String, Object> map = new HashMap<String, Object>();
+									Map<String, Object> map = new HashMap<>();
 									map
 											.put(
 													IJavaLaunchConfigurationConstants.ATTR_STOP_IN_MAIN,
@@ -840,7 +840,7 @@
 													mainType, "main", //$NON-NLS-1$
 													"([Ljava/lang/String;)V", //$NON-NLS-1$
 													true, false, false, -1, -1,
-													-1, 1, false, map); 
+													-1, 1, false, map);
 									bp.setPersisted(false);
 									target.breakpointAdded(bp);
 									DebugPlugin.getDefault()
@@ -855,10 +855,10 @@
 			}
 		}
 	}
-	
+
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getBuildOrder(org.eclipse.debug.core.ILaunchConfiguration,
 	 *      java.lang.String)
 	 */
@@ -869,7 +869,7 @@
 	}
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getProjectsForProblemSearch(org.eclipse.debug.core.ILaunchConfiguration,
 	 *      java.lang.String)
 	 */
@@ -879,7 +879,7 @@
 			throws CoreException {
 		return fOrderedProjects;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#isLaunchProblem(org.eclipse.core.resources.IMarker)
 	 */
@@ -889,7 +889,7 @@
 	}
 	/*
 	 * (non-Javadoc)
-	 * 
+	 *
 	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#preLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration,
 	 *      java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -898,7 +898,7 @@
 			String mode, IProgressMonitor monitor) throws CoreException {
 		// build project list
 		if (monitor != null) {
-			monitor.subTask(LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_20); 
+			monitor.subTask(LaunchingMessages.AbstractJavaLaunchConfigurationDelegate_20);
 		}
 		fOrderedProjects = null;
 		IJavaProject javaProject = JavaRuntime.getJavaProject(configuration);
@@ -909,7 +909,7 @@
 		// do generic launch checks
 		return super.preLaunchCheck(configuration, mode, monitor);
 	}
-    
+
      /* (non-Javadoc)
      * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getBreakpoints(org.eclipse.debug.core.ILaunchConfiguration)
      */
@@ -922,11 +922,11 @@
          }
          return breakpointManager.getBreakpoints(JDIDebugModel.getPluginIdentifier());
      }
-	
+
 	/**
 	 * Returns the VM runner for the given launch mode to use when launching the
 	 * given configuration.
-	 *  
+	 *
 	 * @param configuration launch configuration
 	 * @param mode launch node
 	 * @return VM runner to use when launching the given configuration in the given mode
@@ -937,29 +937,29 @@
 		IVMInstall vm = verifyVMInstall(configuration);
 		IVMRunner runner = vm.getVMRunner(mode);
 		if (runner == null) {
-			abort(NLS.bind(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_0, new String[]{vm.getName(), mode}), null, IJavaLaunchConfigurationConstants.ERR_VM_RUNNER_DOES_NOT_EXIST); 
+			abort(NLS.bind(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_0, new String[]{vm.getName(), mode}), null, IJavaLaunchConfigurationConstants.ERR_VM_RUNNER_DOES_NOT_EXIST);
 		}
 		return runner;
 	}
-	
-	/** 
+
+	/**
 	 * Returns an array of environment variables to be used when
 	 * launching the given configuration or <code>null</code> if unspecified.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return an array of environment variables to use when launching the given configuration or null if unspecified
 	 * @throws CoreException if unable to access associated attribute or if
 	 * unable to resolve a variable in an environment variable's value
 	 * @since 3.1
-	 */	
+	 */
 	public String[] getEnvironment(ILaunchConfiguration configuration) throws CoreException {
 		return DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration);
 	}
-	
+
 	/**
 	 * Returns an array of paths to be used for the <code>java.library.path</code>
 	 * system property, or <code>null</code> if unspecified.
-	 * 
+	 *
 	 * @param configuration the config
 	 * @return an array of paths to be used for the <code>java.library.path</code>
 	 * system property, or <code>null</code>
@@ -976,11 +976,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the default working directory for the given launch configuration,
 	 * or <code>null</code> if none. Subclasses may override as necessary.
-	 * 
+	 *
 	 * @param configuration the config
 	 * @return default working directory or <code>null</code> if none
 	 * @throws CoreException if an exception occurs computing the default working
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstall.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstall.java
index d90f55a..ddaa77a 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstall.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstall.java
@@ -64,17 +64,17 @@
 	 * Map VM specific attributes that are persisted restored with a VM install.
 	 * @since 3.4
 	 */
-	private Map<String, String> fAttributeMap = new HashMap<String, String>();
-	
+	private Map<String, String> fAttributeMap = new HashMap<>();
+
 	// system properties are cached in user preferences prefixed with this key, followed
 	// by VM type, VM id, and system property name
 	private static final String PREF_VM_INSTALL_SYSTEM_PROPERTY = "PREF_VM_INSTALL_SYSTEM_PROPERTY"; //$NON-NLS-1$
 	// whether change events should be fired
 	private boolean fNotify = true;
-	
+
 	/**
 	 * Constructs a new VM install.
-	 * 
+	 *
 	 * @param	type	The type of this VM install.
 	 * 					Must not be <code>null</code>
 	 * @param	id		The unique identifier of this VM instance
@@ -85,10 +85,10 @@
 	public AbstractVMInstall(IVMInstallType type, String id) {
 		if (type == null) {
 			throw new IllegalArgumentException(LaunchingMessages.vmInstall_assert_typeNotNull);
-		} 
+		}
 		if (id == null) {
 			throw new IllegalArgumentException(LaunchingMessages.vmInstall_assert_idNotNull);
-		} 
+		}
 		fType= type;
 		fId= id;
 	}
@@ -185,13 +185,13 @@
 		}
 		LibraryLocation[] newLocations = locations;
 		if (newLocations == null) {
-			newLocations = getVMInstallType().getDefaultLibraryLocations(getInstallLocation()); 
+			newLocations = getVMInstallType().getDefaultLibraryLocations(getInstallLocation());
 		}
 		LibraryLocation[] prevLocations = fSystemLibraryDescriptions;
 		if (prevLocations == null) {
-			prevLocations = getVMInstallType().getDefaultLibraryLocations(getInstallLocation()); 
+			prevLocations = getVMInstallType().getDefaultLibraryLocations(getInstallLocation());
 		}
-		
+
 		if (newLocations.length == prevLocations.length) {
 			int i = 0;
 			boolean equal = true;
@@ -208,7 +208,7 @@
 		PropertyChangeEvent event = new PropertyChangeEvent(this, IVMInstallChangedListener.PROPERTY_LIBRARY_LOCATIONS, prevLocations, newLocations);
 		fSystemLibraryDescriptions = locations;
 		if (fNotify) {
-			JavaRuntime.fireVMChanged(event);		
+			JavaRuntime.fireVMChanged(event);
 		}
 	}
 
@@ -234,8 +234,8 @@
 				return;
 			}
 		}
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, IVMInstallChangedListener.PROPERTY_JAVADOC_LOCATION, fJavadocLocation, url);		
+
+		PropertyChangeEvent event = new PropertyChangeEvent(this, IVMInstallChangedListener.PROPERTY_JAVADOC_LOCATION, fJavadocLocation, url);
 		fJavadocLocation = url;
 		if (fNotify) {
 			JavaRuntime.fireVMChanged(event);
@@ -244,7 +244,7 @@
 
 	/**
 	 * Whether this VM should fire property change notifications.
-	 * 
+	 *
 	 * @param notify if this VM should fire property change notifications.
 	 * @since 2.1
 	 */
@@ -274,7 +274,7 @@
 	public int hashCode() {
 		return getVMInstallType().hashCode() + getId().hashCode();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstall#getDefaultVMArguments()
 	 * @since 3.0
@@ -288,7 +288,7 @@
 		ExecutionArguments ex = new ExecutionArguments(args, ""); //$NON-NLS-1$
 		return ex.getVMArgumentsArray();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstall#setDefaultVMArguments(java.lang.String[])
 	 * @since 3.0
@@ -307,7 +307,7 @@
 			setVMArgs(buf.toString().trim());
 		}
 	}
-	
+
     /* (non-Javadoc)
      * @see org.eclipse.jdt.launching.IVMInstall2#getVMArgs()
      */
@@ -315,7 +315,7 @@
 	public String getVMArgs() {
         return fVMArgs;
     }
-    
+
     /* (non-Javadoc)
      * @see org.eclipse.jdt.launching.IVMInstall2#setVMArgs(java.lang.String)
      */
@@ -333,10 +333,10 @@
         PropertyChangeEvent event = new PropertyChangeEvent(this, IVMInstallChangedListener.PROPERTY_VM_ARGUMENTS, fVMArgs, vmArgs);
         fVMArgs = vmArgs;
 		if (fNotify) {
-			JavaRuntime.fireVMChanged(event);		
+			JavaRuntime.fireVMChanged(event);
 		}
-    }	
-    
+    }
+
     /* (non-Javadoc)
      * Subclasses should override.
      * @see org.eclipse.jdt.launching.IVMInstall2#getJavaVersion()
@@ -345,7 +345,7 @@
 	public String getJavaVersion() {
         return null;
     }
-    
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstall3#evaluateSystemProperties(java.lang.String[], org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -355,10 +355,10 @@
 		if (monitor == null) {
 			monitor = new NullProgressMonitor();
 		}
-		Map<String, String> map = new HashMap<String, String>();
-		
+		Map<String, String> map = new HashMap<>();
+
 		// first check cache (preference store) to avoid launching VM
-		boolean cached = true; 
+		boolean cached = true;
 		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN);
 		if(prefs != null) {
 			for (int i = 0; i < properties.length; i++) {
@@ -374,7 +374,7 @@
 				}
 			}
 		}
-		if (!cached) {		
+		if (!cached) {
 			// launch VM to evaluate properties
 			File file = LaunchingPlugin.getFileInPlugin(new Path("lib/launchingsupport.jar")); //$NON-NLS-1$
 			if (file != null && file.exists()) {
@@ -401,9 +401,9 @@
 				try {
 					int total = 0;
 					int max = Platform.getPreferencesService().getInt(
-							LaunchingPlugin.ID_PLUGIN, 
-							JavaRuntime.PREF_CONNECT_TIMEOUT, 
-							JavaRuntime.DEF_CONNECT_TIMEOUT, 
+							LaunchingPlugin.ID_PLUGIN,
+							JavaRuntime.PREF_CONNECT_TIMEOUT,
+							JavaRuntime.DEF_CONNECT_TIMEOUT,
 							null);
 					while (!process.isTerminated()) {
 						try {
@@ -424,7 +424,7 @@
 				if (monitor.isCanceled()) {
 					return map;
 				}
-				
+
 				monitor.subTask(LaunchingMessages.AbstractVMInstall_3);
 				IStreamsProxy streamsProxy = process.getStreamsProxy();
 				String text = null;
@@ -449,7 +449,7 @@
 									map.put(name, value);
 								}
 							}
-						}			
+						}
 					} catch (SAXException e) {
 						String commandLine = process.getAttribute(IProcess.ATTR_CMDLINE);
 						abort(NLS.bind(LaunchingMessages.AbstractVMInstall_4, commandLine), e, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
@@ -481,7 +481,7 @@
 	/**
 	 * Generates a key used to cache system property for this VM in this plug-ins
 	 * preference store.
-	 * 
+	 *
 	 * @param property system property name
 	 * @return preference store key
 	 */
@@ -496,11 +496,11 @@
 		buffer.append(property);
 		return buffer.toString();
 	}
-	
+
 	/**
 	 * Throws a core exception with an error status object built from the given
 	 * message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the error, or
 	 *            <code>null</code> if none
@@ -511,13 +511,13 @@
 	protected void abort(String message, Throwable exception, int code) throws CoreException {
 		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin
 				.getUniqueIdentifier(), code, message, exception));
-	}	
-	
+	}
+
 	/**
 	 * Sets a VM specific attribute. Attributes are persisted and restored with VM installs.
 	 * Specifying a value of <code>null</code> as a value removes the attribute. Change
 	 * notification is provided to {@link IVMInstallChangedListener} for VM attributes.
-	 * 
+	 *
 	 * @param key attribute key, cannot be <code>null</code>
 	 * @param value attribute value or <code>null</code> to remove the attribute
 	 * @since 3.4
@@ -540,11 +540,11 @@
 			JavaRuntime.fireVMChanged(event);
 		}
 	}
-    
+
 	/**
-	 * Returns a VM specific attribute associated with the given key or <code>null</code> 
+	 * Returns a VM specific attribute associated with the given key or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param key attribute key, cannot be <code>null</code>
 	 * @return attribute value, or <code>null</code> if none
 	 * @since 3.4
@@ -552,16 +552,16 @@
 	public String getAttribute(String key) {
 		return fAttributeMap.get(key);
 	}
-	
+
 	/**
 	 * Returns a map of VM specific attributes stored with this VM install. Keys
 	 * and values are strings. Modifying the map does not modify the attributes
 	 * associated with this VM install.
-	 * 
+	 *
 	 * @return map of VM attributes
 	 * @since 3.4
 	 */
 	public Map<String, String> getAttributes() {
-		return new HashMap<String, String>(fAttributeMap);
+		return new HashMap<>(fAttributeMap);
 	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstallType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstallType.java
index aba3884..15b90a1 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstallType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMInstallType.java
@@ -38,7 +38,7 @@
 public abstract class AbstractVMInstallType implements IVMInstallType, IExecutableExtension {
 	private List<IVMInstall> fVMs;
 	private String fId;
-	
+
 	/**
 	 * Constructs a new VM install type.
 	 */
@@ -100,14 +100,14 @@
 	@Override
 	public synchronized IVMInstall createVMInstall(String id) throws IllegalArgumentException {
 		if (findVMInstall(id) != null) {
-			String format= LaunchingMessages.vmInstallType_duplicateVM; 
+			String format= LaunchingMessages.vmInstallType_duplicateVM;
 			throw new IllegalArgumentException(NLS.bind(format, new String[] { id }));
 		}
 		IVMInstall vm = doCreateVMInstall(id);
 		fVMs.add(vm);
 		return vm;
 	}
-	
+
 	/**
 	 * Subclasses should return a new instance of the appropriate
 	 * <code>IVMInstall</code> subclass from this method.
@@ -122,14 +122,14 @@
 	 * Initializes the id parameter from the "id" attribute
 	 * in the configuration markup.
 	 * Subclasses should not override this method.
-	 * @param config the configuration element used to trigger this execution. 
+	 * @param config the configuration element used to trigger this execution.
 	 *		It can be queried by the executable extension for specific
 	 *		configuration properties
 	 * @param propertyName the name of an attribute of the configuration element
 	 *		used on the <code>createExecutableExtension(String)</code> call. This
 	 *		argument can be used in the cases where a single configuration element
 	 *		is used to define multiple executable extensions.
-	 * @param data adapter data in the form of a <code>String</code>, 
+	 * @param data adapter data in the form of a <code>String</code>,
 	 *		a <code>Hashtable</code>, or <code>null</code>.
 	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
 	 */
@@ -174,15 +174,15 @@
 	 * it has been added to the abstract base class that VM install types should
 	 * subclass.
 	 * </p>
-	 * 
+	 *
 	 * @param installLocation home location
 	 * @return default javadoc location or <code>null</code>
 	 * @since 2.1
 	 */
 	public URL getDefaultJavadocLocation(File installLocation) {
-		return null;		
+		return null;
 	}
-	
+
 	/**
 	 * Returns a string of default VM arguments for a VM installed at the
 	 * given home location, or <code>null</code> if none.
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java
index de1dc8a..3c7dfff 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java
@@ -42,7 +42,7 @@
 	/**
 	 * Throws a core exception with an error status object built from
 	 * the given message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the
 	 *  error, or <code>null</code> if none
@@ -52,18 +52,18 @@
 	protected void abort(String message, Throwable exception, int code) throws CoreException {
 		throw new CoreException(new Status(IStatus.ERROR, getPluginIdentifier(), code, message, exception));
 	}
-	
+
 	/**
-	 * Returns the identifier of the plug-in this VM runner 
+	 * Returns the identifier of the plug-in this VM runner
 	 * originated from.
-	 * 
+	 *
 	 * @return plug-in identifier
 	 */
 	protected abstract String getPluginIdentifier();
-	
+
 	/**
 	 * Executes the given command line using the given working directory
-	 * 
+	 *
 	 * @param cmdLine the command line
 	 * @param workingDirectory the working directory
 	 * @return the {@link Process}
@@ -74,10 +74,10 @@
 		cmdLine = quoteWindowsArgs(cmdLine);
 		return DebugPlugin.exec(cmdLine, workingDirectory);
 	}
-	
+
 	/**
 	 * Executes the given command line using the given working directory and environment
-	 * 
+	 *
 	 * @param cmdLine the command line
 	 * @param workingDirectory the working directory
 	 * @param envp the environment
@@ -89,7 +89,7 @@
 	protected Process exec(String[] cmdLine, File workingDirectory, String[] envp) throws CoreException {
 		cmdLine = quoteWindowsArgs(cmdLine);
 		return DebugPlugin.exec(cmdLine, workingDirectory, envp);
-	}	
+	}
 
 	private static String[] quoteWindowsArgs(String[] cmdLine) {
 		// see https://bugs.eclipse.org/387504 , workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002
@@ -105,8 +105,8 @@
 		}
 		return cmdLine;
 	}
-	
-	
+
+
 	private static boolean needsQuoting(String s) {
 		int len = s.length();
 		if (len == 0) // empty string has to be quoted
@@ -129,10 +129,10 @@
 		s = s.replaceAll("([\\\\]*)\\z", "$1$1"); //$NON-NLS-1$ //$NON-NLS-2$
 		return "\"" + s + "\""; //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	
+
 	/**
 	 * Returns the given array of strings as a single space-delimited string.
-	 * 
+	 *
 	 * @param cmdLine array of strings
 	 * @return a single space-delimited string
 	 */
@@ -140,22 +140,22 @@
 		StringBuffer buff= new StringBuffer();
 		for (int i = 0, numStrings= cmdLine.length; i < numStrings; i++) {
 			buff.append(cmdLine[i]);
-			buff.append(' ');	
-		} 
+			buff.append(' ');
+		}
 		return buff.toString().trim();
 	}
-	
+
 	/**
 	 * Returns the default process attribute map for Java processes.
-	 * 
+	 *
 	 * @return default process attribute map for Java processes
 	 */
 	protected Map<String, String> getDefaultProcessMap() {
-		Map<String, String> map = new HashMap<String, String>();
+		Map<String, String> map = new HashMap<>();
 		map.put(IProcess.ATTR_PROCESS_TYPE, IJavaLaunchConfigurationConstants.ID_JAVA_PROCESS_TYPE);
 		return map;
 	}
-	
+
 	/**
 	 * Returns a new process aborting if the process could not be created.
 	 * @param launch the launch the process is contained in
@@ -170,15 +170,15 @@
 		IProcess process= DebugPlugin.newProcess(launch, p, label, attributes);
 		if (process == null) {
 			p.destroy();
-			abort(LaunchingMessages.AbstractVMRunner_0, null, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR); 
+			abort(LaunchingMessages.AbstractVMRunner_0, null, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
 		}
 		return process;
 	}
-	
+
 	/**
 	 * Combines and returns VM arguments specified by the runner configuration,
 	 * with those specified by the VM install, if any.
-	 * 
+	 *
 	 * @param configuration runner configuration
 	 * @param vmInstall VM install
 	 * @return combined VM arguments specified by the runner configuration
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ExecutionArguments.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ExecutionArguments.java
index 0a5100f..1363ab3 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ExecutionArguments.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ExecutionArguments.java
@@ -15,7 +15,7 @@
 
 /**
  * The execution arguments for running a Java VM. The execution arguments are
- * separated into two parts: arguments to the VM itself, and arguments to the Java 
+ * separated into two parts: arguments to the VM itself, and arguments to the Java
  * main program. This class provides convenience methods for parsing a string
  * of arguments into separate components.
  * <p>
@@ -26,7 +26,7 @@
 public class ExecutionArguments {
 	private String fVMArgs;
 	private String fProgramArgs;
-		
+
 	/**
 	 * Creates a new execution arguments object.
 	 *
@@ -39,7 +39,7 @@
 		fVMArgs= vmArgs;
 		fProgramArgs= programArgs;
 	}
-	
+
 	/**
 	 * Returns the VM arguments as one string.
 	 *
@@ -48,7 +48,7 @@
 	public String getVMArguments() {
 		return fVMArgs;
 	}
-	
+
 	/**
 	 * Returns the program arguments as one string.
 	 *
@@ -57,7 +57,7 @@
 	public String getProgramArguments() {
 		return fProgramArgs;
 	}
-	
+
 	/**
 	 * Returns the VM arguments as an array of individual arguments.
 	 *
@@ -66,7 +66,7 @@
 	public String[] getVMArgumentsArray() {
 		return DebugPlugin.parseArguments(fVMArgs);
 	}
-	
+
 	/**
 	 * Returns the program arguments as an array of individual arguments.
 	 *
@@ -74,6 +74,6 @@
 	 */
 	public String[] getProgramArgumentsArray() {
 		return DebugPlugin.parseArguments(fProgramArgs);
-	}	
-			
+	}
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java
index bc8e121..e471ffc 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java
@@ -12,7 +12,7 @@
 
 import org.eclipse.jdt.internal.launching.LaunchingPlugin;
 
- 
+
 /**
  * Constant definitions for Java launch configurations.
  * <p>
@@ -29,40 +29,40 @@
 	 * (value <code>"org.eclipse.jdt.launching.localJavaApplication"</code>).
 	 */
 	public static final String ID_JAVA_APPLICATION = LaunchingPlugin.getUniqueIdentifier() + ".localJavaApplication"; //$NON-NLS-1$
-	
+
 	/**
 	 * Identifier for the Remote Java Application launch configuration type
 	 * (value <code>"org.eclipse.jdt.launching.remoteJavaApplication"</code>).
 	 */
-	public static final String ID_REMOTE_JAVA_APPLICATION = LaunchingPlugin.getUniqueIdentifier() + ".remoteJavaApplication"; //$NON-NLS-1$	
+	public static final String ID_REMOTE_JAVA_APPLICATION = LaunchingPlugin.getUniqueIdentifier() + ".remoteJavaApplication"; //$NON-NLS-1$
 
 	/**
 	 * Identifier for the Java Applet launch configuration type
 	 * (value <code>"org.eclipse.jdt.launching.javaApplet"</code>).
 	 */
-	public static final String ID_JAVA_APPLET = LaunchingPlugin.getUniqueIdentifier() + ".javaApplet"; //$NON-NLS-1$	
+	public static final String ID_JAVA_APPLET = LaunchingPlugin.getUniqueIdentifier() + ".javaApplet"; //$NON-NLS-1$
 
 	/**
 	 * Identifier for the standard Socket Attaching VM connector
 	 * (value <code>"org.eclipse.jdt.launching.socketAttachConnector"</code>).
 	 */
-	public static final String ID_SOCKET_ATTACH_VM_CONNECTOR = LaunchingPlugin.getUniqueIdentifier() + ".socketAttachConnector"; //$NON-NLS-1$	
-	
+	public static final String ID_SOCKET_ATTACH_VM_CONNECTOR = LaunchingPlugin.getUniqueIdentifier() + ".socketAttachConnector"; //$NON-NLS-1$
+
 	/**
 	 * Identifier for the standard Socket Listening VM connector
 	 * (value <code>"org.eclipse.jdt.launching.socketListenConnector"</code>).
 	 * @since 3.4
 	 */
 	public static final String ID_SOCKET_LISTEN_VM_CONNECTOR = LaunchingPlugin.getUniqueIdentifier() + ".socketListenConnector"; //$NON-NLS-1$
-	
+
 	/**
 	 * Identifier for the java process type, which is annotated on processes created
 	 * by the local java application launch delegate.
-	 * 
+	 *
 	 * (value <code>"java"</code>).
 	 */
-	public static final String ID_JAVA_PROCESS_TYPE = "java"; //$NON-NLS-1$ 
-			
+	public static final String ID_JAVA_PROCESS_TYPE = "java"; //$NON-NLS-1$
+
 	/**
 	 * Launch configuration attribute key. The value is a name of
 	 * a Java project associated with a Java launch configuration.
@@ -72,36 +72,36 @@
 	 * @see org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget#prepareBreakpointsSearchScope()
 	 */
 	public static final String ATTR_PROJECT_NAME = LaunchingPlugin.getUniqueIdentifier() + ".PROJECT_ATTR"; //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a fully qualified name
 	 * of a main type to launch.
 	 */
 	public static final String ATTR_MAIN_TYPE_NAME = LaunchingPlugin.getUniqueIdentifier() + ".MAIN_TYPE";	 //$NON-NLS-1$
-		
+
 	/**
 	 * Launch configuration attribute key. The value is a boolean specifying
 	 * whether execution should stop when main is entered. The default value
 	 * is <code>false</code>.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_STOP_IN_MAIN = LaunchingPlugin.getUniqueIdentifier() + ".STOP_IN_MAIN";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a string specifying
 	 * program arguments for a Java launch configuration, as they should appear
 	 * on the command line.
 	 */
 	public static final String ATTR_PROGRAM_ARGUMENTS = LaunchingPlugin.getUniqueIdentifier() + ".PROGRAM_ARGUMENTS"; //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a string specifying
 	 * VM arguments for a Java launch configuration, as they should appear
 	 * on the command line.
 	 */
 	public static final String ATTR_VM_ARGUMENTS = LaunchingPlugin.getUniqueIdentifier() + ".VM_ARGUMENTS";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a string specifying a
 	 * path to the working directory to use when launching a local VM.
@@ -113,7 +113,7 @@
 	 * process.
 	 */
 	public static final String ATTR_WORKING_DIRECTORY = LaunchingPlugin.getUniqueIdentifier() + ".WORKING_DIRECTORY";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a path identifying the JRE used
 	 * when launching a local VM. The path is a classpath container corresponding
@@ -127,30 +127,30 @@
 	 * @since 3.2
 	 */
 	public static final String ATTR_JRE_CONTAINER_PATH = JavaRuntime.JRE_CONTAINER;
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a name of a VM install
 	 * to use when launching a local VM. This attribute must be qualified
 	 * by a VM install type, via the <code>ATTR_VM_INSTALL_TYPE</code>
 	 * attribute. When unspecified, the default VM is used.
-	 * 
+	 *
 	 * @deprecated use <code>ATTR_JRE_CONTAINER_PATH</code>
 	 */
 	@Deprecated
 	public static final String ATTR_VM_INSTALL_NAME = LaunchingPlugin.getUniqueIdentifier() + ".VM_INSTALL_NAME"; //$NON-NLS-1$
-		
+
 	/**
 	 * Launch configuration attribute key. The value is an identifier of
-	 * a VM install type. Used in conjunction with a VM install name, to 
+	 * a VM install type. Used in conjunction with a VM install name, to
 	 * specify the VM to use when launching a local Java application.
 	 * The associated VM install name is specified via the attribute
 	 * <code>ATTR_VM_INSTALL_NAME</code>.
-	 * 
+	 *
 	 * @deprecated use <code>ATTR_JRE_CONTAINER_PATH</code>
 	 */
 	@Deprecated
 	public static final String ATTR_VM_INSTALL_TYPE = LaunchingPlugin.getUniqueIdentifier() + ".VM_INSTALL_TYPE_ID"; //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a Map of attributes specific
 	 * to a particular VM install type, used when launching a local Java
@@ -159,14 +159,14 @@
 	 * and are limited to String keys and values.
 	 */
 	public static final String ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP = LaunchingPlugin.getUniqueIdentifier() + "VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP"; //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is an identifier of
 	 * a VM connector, specifying a connector to use when attaching to
 	 * a remote VM.
 	 */
 	public static final String ATTR_VM_CONNECTOR= LaunchingPlugin.getUniqueIdentifier() + ".VM_CONNECTOR_ID"; //$NON-NLS-1$
-		
+
 	/**
 	 * Launch configuration attribute key. The attribute value is an ordered list of strings
 	 * which are mementos for runtime class path entries. When unspecified, a default
@@ -174,7 +174,7 @@
 	 * configuration (via the <code>ATTR_CLASSPATH_PROVIDER</code> attribute).
 	 */
 	public static final String ATTR_CLASSPATH = LaunchingPlugin.getUniqueIdentifier() + ".CLASSPATH";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is a boolean specifying
 	 * whether a default classpath should be used when launching a local
@@ -196,7 +196,7 @@
 	 * provider is used - <code>StandardClasspathProvider</code>.
 	 */
 	public static final String ATTR_CLASSPATH_PROVIDER = LaunchingPlugin.getUniqueIdentifier() + ".CLASSPATH_PROVIDER";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is an ordered list of
 	 * strings which are mementos for associated runtime classpath entries
@@ -206,7 +206,7 @@
 	 * <code>ATTR_SOURCE_PATH_PROVIDER</code> attribute).
 	 */
 	public static final String ATTR_SOURCE_PATH = LaunchingPlugin.getUniqueIdentifier() + ".SOURCE_PATH";	 //$NON-NLS-1$
-		
+
 	/**
 	 * Launch configuration attribute key. The value is a boolean specifying
 	 * whether a default source lookup path should be used. When
@@ -224,14 +224,14 @@
 	 * path provider is used - <code>StandardSourcePathProvider</code>.
 	 */
 	public static final String ATTR_SOURCE_PATH_PROVIDER = LaunchingPlugin.getUniqueIdentifier() + ".SOURCE_PATH_PROVIDER";	 //$NON-NLS-1$
-			
+
 	/**
 	 * Launch configuration attribute key. The value is a boolean, indicating
 	 * whether a VM will support/allow the terminate action.
 	 * This attribute is used for remote debugging.
 	 */
 	public static final String ATTR_ALLOW_TERMINATE = LaunchingPlugin.getUniqueIdentifier() + ".ALLOW_TERMINATE";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for VM specific attributes found in the
 	 * <code>ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP</code>. The value is a String,
@@ -240,18 +240,18 @@
 	public static final String ATTR_JAVA_COMMAND = LaunchingPlugin.getUniqueIdentifier() + ".JAVA_COMMAND";	 //$NON-NLS-1$
 
 	/**
-	 * Launch configuration attribute key. The value is 
+	 * Launch configuration attribute key. The value is
 	 * a map. Keys in the map correspond to arguments names
 	 * returned by <code>IVMConnector#getDefaultArguments()</code>.
 	 * Values are strings corresponding to the values to use when
 	 * establishing a connection to a remote VM.
 	 */
 	public static final String ATTR_CONNECT_MAP = LaunchingPlugin.getUniqueIdentifier() + ".CONNECT_MAP";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Launch configuration attribute key. The value is an integer
 	 * indicating the width of the applet viewing area.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_APPLET_WIDTH = LaunchingPlugin.getUniqueIdentifier() + ".APPLET_WIDTH";	 //$NON-NLS-1$
@@ -259,7 +259,7 @@
 	/**
 	 * Launch configuration attribute key. The value is an integer
 	 * indicating the height of the applet viewing area.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_APPLET_HEIGHT = LaunchingPlugin.getUniqueIdentifier() + ".APPLET_HEIGHT";	 //$NON-NLS-1$
@@ -267,7 +267,7 @@
 	/**
 	 * Launch configuration attribute key. The value is a String indicating the
 	 * HTML name of the applet.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_APPLET_NAME = LaunchingPlugin.getUniqueIdentifier() + ".APPLET_NAME";	 //$NON-NLS-1$
@@ -276,7 +276,7 @@
 	 * Launch configuration attribute key. The value is a Map. Keys in the map
 	 * represent applet parameter names and the values in the map are the
 	 * corresponding parameter values
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_APPLET_PARAMETERS = LaunchingPlugin.getUniqueIdentifier() + ".APPLET_PARAMETERS";	 //$NON-NLS-1$
@@ -284,19 +284,19 @@
 	/**
 	 * Launch configuration attribute key. The value is a String indicating the
 	 * fully qualified name of the applet viewer utility class to use.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String ATTR_APPLET_APPLETVIEWER_CLASS = LaunchingPlugin.getUniqueIdentifier() + ".APPLET_APPLETVIEWER_CLASS";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for a VM specific argument. Value is an array
 	 * of strings describing paths in the local file system that
 	 * should be prepended to the bootpath, or <code>null</code>
 	 * if none. The value is computed dynamically at launch time
-	 * and placed in the VM specific arguments map by the Java 
+	 * and placed in the VM specific arguments map by the Java
 	 * application launch delegate.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static final String ATTR_BOOTPATH_PREPEND = LaunchingPlugin.getUniqueIdentifier() + ".-Xbootclasspath/p:";	 //$NON-NLS-1$
@@ -306,30 +306,30 @@
 	 * of strings describing paths in the local file system that
 	 * should be placed on the bootpath explicitly, or <code>null</code>
 	 * if none. The value is computed dynamically at launch time
-	 * and placed in the VM specific arguments map by the Java 
+	 * and placed in the VM specific arguments map by the Java
 	 * application launch delegate.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static final String ATTR_BOOTPATH = LaunchingPlugin.getUniqueIdentifier() + ".-Xbootclasspath:";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for a VM specific argument. Value is an array
 	 * of strings describing paths in the local file system that
 	 * should be appended to the bootpath, or <code>null</code>
 	 * if none. The value is computed dynamically at launch time
-	 * and placed in the VM specific arguments map by the Java 
+	 * and placed in the VM specific arguments map by the Java
 	 * application launch delegate.
-	 * 
+	 *
 	 * @since 3.0
-	 */	
+	 */
 	public static final String ATTR_BOOTPATH_APPEND = LaunchingPlugin.getUniqueIdentifier() + ".-Xbootclasspath/a:";	 //$NON-NLS-1$
 
 	/**
 	 * Attribute key for a Mac OSX VM-specific argument. Value is a boolean
-	 * indicating if the <code>-XStartOnFirstThread</code> argument should be used 
+	 * indicating if the <code>-XStartOnFirstThread</code> argument should be used
 	 * when launching.
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	public static final String ATTR_USE_START_ON_FIRST_THREAD = LaunchingPlugin.getUniqueIdentifier() + ".ATTR_USE_START_ON_FIRST_THREAD"; //$NON-NLS-1$
@@ -337,20 +337,20 @@
 	 * Status code indicating a launch configuration does not
 	 * specify a project when a project is required.
 	 */
-	public static final int ERR_UNSPECIFIED_PROJECT = 100;	
-		
+	public static final int ERR_UNSPECIFIED_PROJECT = 100;
+
 	/**
 	 * Status code indicating a launch configuration does not
 	 * specify a main type to launch.
 	 */
-	public static final int ERR_UNSPECIFIED_MAIN_TYPE = 101;	
-		
+	public static final int ERR_UNSPECIFIED_MAIN_TYPE = 101;
+
 	/**
 	 * Status code indicating a launch configuration does not
 	 * specify a VM Install Type.
 	 */
 	public static final int ERR_UNSPECIFIED_VM_INSTALL_TYPE = 102;
-	
+
 	/**
 	 * Status code indicating a launch configuration does not
 	 * specify a VM Install
@@ -362,31 +362,31 @@
 	 * type could not be found.
 	 */
 	public static final int ERR_VM_INSTALL_TYPE_DOES_NOT_EXIST = 104;
-		
+
 	/**
 	 * Status code indicating a launch configuration's VM install
 	 * could not be found.
 	 */
 	public static final int ERR_VM_INSTALL_DOES_NOT_EXIST = 105;
-	
+
 	/**
 	 * Status code indicating a VM runner could not be located
 	 * for the VM install specified by a launch configuration.
 	 */
-	public static final int ERR_VM_RUNNER_DOES_NOT_EXIST = 106;	
-	
+	public static final int ERR_VM_RUNNER_DOES_NOT_EXIST = 106;
+
 	/**
 	 * Status code indicating the project associated with
 	 * a launch configuration is not a Java project.
 	 */
-	public static final int ERR_NOT_A_JAVA_PROJECT = 107;	
-	
+	public static final int ERR_NOT_A_JAVA_PROJECT = 107;
+
 	/**
 	 * Status code indicating the specified working directory
 	 * does not exist.
 	 */
-	public static final int ERR_WORKING_DIRECTORY_DOES_NOT_EXIST = 108;	
-		
+	public static final int ERR_WORKING_DIRECTORY_DOES_NOT_EXIST = 108;
+
 	/**
 	 * Status code indicating a launch configuration does not
 	 * specify a host name value
@@ -423,7 +423,7 @@
 	 * connector could not be found.
 	 */
 	public static final int ERR_SHARED_MEMORY_CONNECTOR_UNAVAILABLE = 114;
-	
+
 	/**
 	 * Status code indicating that the Eclipse runtime does not support
 	 * launching a program with a working directory. This feature is only
@@ -434,15 +434,15 @@
 	 * should be relaunched with the default working directory.
 	 * </p>
 	 */
-	public static final int ERR_WORKING_DIRECTORY_NOT_SUPPORTED = 115;	
-	
+	public static final int ERR_WORKING_DIRECTORY_NOT_SUPPORTED = 115;
+
 	/**
 	 * Status code indicating that an error occurred launching a VM.
 	 * The status error message is the text that
 	 * the VM wrote to standard error before exiting.
 	 */
-	public static final int ERR_VM_LAUNCH_ERROR = 116;	
-	
+	public static final int ERR_VM_LAUNCH_ERROR = 116;
+
 	/**
 	 * Status code indicating that a timeout has occurred waiting for
 	 * the VM to connect with the debugger.
@@ -453,74 +453,74 @@
 	 * timeout period.
 	 * </p>
 	 */
-	public static final int ERR_VM_CONNECT_TIMEOUT = 117;	
-	
+	public static final int ERR_VM_CONNECT_TIMEOUT = 117;
+
 	/**
 	 * Status code indicating that a free socket was not available to
 	 * communicate with the VM.
 	 */
-	public static final int ERR_NO_SOCKET_AVAILABLE = 118;		
-	
+	public static final int ERR_NO_SOCKET_AVAILABLE = 118;
+
 	/**
 	 * Status code indicating that the JDI connector required for a
 	 * debug launch was not available.
 	 */
-	public static final int ERR_CONNECTOR_NOT_AVAILABLE = 119;	
-	
+	public static final int ERR_CONNECTOR_NOT_AVAILABLE = 119;
+
 	/**
 	 * Status code indicating that the debugger failed to connect
 	 * to the VM.
 	 */
-	public static final int ERR_CONNECTION_FAILED = 120;		
+	public static final int ERR_CONNECTION_FAILED = 120;
 
 	/**
 	 * Status code indicating that the applet launcher was asked to
 	 * launch a resource that did not extend <code>java.applet.Applet</code>.
-	 * 
+	 *
 	 * @since 2.1
 	 */
-	public static final int ERR_NOT_AN_APPLET = 121;		
+	public static final int ERR_NOT_AN_APPLET = 121;
 
 	/**
 	 * Status code indicating that no launch configuration was specified.
-	 * 
+	 *
 	 * @since 2.1
 	 */
-	public static final int ERR_UNSPECIFIED_LAUNCH_CONFIG = 122;		
+	public static final int ERR_UNSPECIFIED_LAUNCH_CONFIG = 122;
 
 	/**
 	 * Status code indicating that the .html file used to initiate an applet
 	 * launch could not be built.
-	 * 
+	 *
 	 * @since 2.1
 	 */
-	public static final int ERR_COULD_NOT_BUILD_HTML = 123;		
-	
+	public static final int ERR_COULD_NOT_BUILD_HTML = 123;
+
 	/**
 	 * Status code indicating that the project referenced by a launch configuration
 	 * is closed.
-	 * 
+	 *
 	 * @since 3.0
 	 */
-	public static final int ERR_PROJECT_CLOSED = 124;			
+	public static final int ERR_PROJECT_CLOSED = 124;
 
 	/**
 	 * Status code indicating an unexpected internal error.
 	 */
-	public static final int ERR_INTERNAL_ERROR = 150;		
+	public static final int ERR_INTERNAL_ERROR = 150;
 
 	/**
 	 * Default value for the 'ATTR_APPLET_APPLETVIEWER' attribute.
-	 * 
+	 *
 	 * @since 2.1
-	 */	
+	 */
 	public static final String DEFAULT_APPLETVIEWER_CLASS = "sun.applet.AppletViewer";	 //$NON-NLS-1$
-	
-	
+
+
 	/**
 	 * Detail code for a custom debug event that is fired when a remote debug configuration with
 	 * a standard socket listen connector is ready to accept connections from a remote VM.
-	 * 
+	 *
 	 * @since 3.4
 	 * @see org.eclipse.jdt.internal.launching.SocketListenConnector
 	 * @see org.eclipse.jdt.internal.launching.SocketListenConnectorProcess
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java
index 5dc75cf..92f7f56 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java
@@ -17,51 +17,51 @@
 import org.eclipse.core.runtime.Path;
 
 /**
- * This resolver allows contributors to provide {@link LibraryLocation} information for 
- * non-standard JRE / JDK libraries. 
+ * This resolver allows contributors to provide {@link LibraryLocation} information for
+ * non-standard JRE / JDK libraries.
  * <br><br>
- * For example this resolver could be used to provide 
+ * For example this resolver could be used to provide
  * Javadoc and source locations for jars in the <code>/ext</code> location of a JRE / JDK
- * 
+ *
  * @see JavaRuntime#EXTENSION_POINT_LIBRARY_LOCATION_RESOLVERS
- * 
+ *
  * @since 3.7
  */
 public interface ILibraryLocationResolver {
 
 	/**
-	 * Returns the path inside the <code>source</code> zip file where packages names begin, must not be 
+	 * Returns the path inside the <code>source</code> zip file where packages names begin, must not be
 	 * <code>null</code> - use {@link Path#EMPTY}
 	 * <br><br>
-	 * For example, if the source for <code>java.lang.Object</code> source is found at <code>src/java/lang/Object.java</code> in the zip file, the package root 
+	 * For example, if the source for <code>java.lang.Object</code> source is found at <code>src/java/lang/Object.java</code> in the zip file, the package root
 	 * would be <code>src</code>.
-	 * 
+	 *
 	 * @param libraryPath the path to the library
 	 * @return the {@link IPath} to the root of the source or the empty path, never <code>null</code>
 	 */
 	public IPath getPackageRoot(IPath libraryPath);
-	
+
 	/**
 	 * Returns the {@link IPath} of the <code>zip</code> or <code>jar</code> file containing the sources for <code>library</code>.
 	 * <br><br>
 	 * Must not be <code>null</code> - use {@link Path#EMPTY}
-	 * 
+	 *
 	 * @param libraryPath the path to the library, must not be <code>null</code>
 	 * @return the {@link IPath} to the source or the empty path, never <code>null</code>
 	 */
 	public IPath getSourcePath(IPath libraryPath);
-	
+
 	/**
 	 * Returns the {@link URL} of the Javadoc for this library or <code>null</code>
-	 * 
+	 *
 	 * @param libraryPath the path to the library, must not be <code>null</code>
 	 * @return the Javadoc {@link URL} or <code>null</code>
 	 */
 	public URL getJavadocLocation(IPath libraryPath);
-	
+
 	/**
 	 * Returns the {@link URL} of the index for the given library or <code>null</code>.
-	 * 
+	 *
 	 * @param libraryPath the path to the library, must not be <code>null</code>
 	 * @return the index {@link URL} or <code>null</code>
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry.java
index 498d76a..165632b 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.launching;
@@ -29,7 +29,7 @@
  * 	<li>An archive (type <code>ARCHIVE</code>) - an archive refers to a jar, zip, or
  * 		folder in the workspace or in the local file system containing class
  * 		files. An archive may have attached source.</li>
- * 	<li>A variable (type <code>VARIABLE</code>) - a variable refers to a 
+ * 	<li>A variable (type <code>VARIABLE</code>) - a variable refers to a
  * 		classpath variable, which may refer to a jar.</li>
  * 	<li>A library (type <code>CONTAINER</code>) - a container refers to classpath
  * 		container variable which refers to a collection of archives derived
@@ -50,51 +50,51 @@
  * @noextend This interface is not intended to be extended by clients.
  */
 public interface IRuntimeClasspathEntry {
-	
+
 	/**
 	 * Type identifier for project entries.
 	 */
 	public static final int PROJECT = 1;
-	
+
 	/**
 	 * Type identifier for archive entries.
 	 */
-	public static final int ARCHIVE = 2;	
-		
+	public static final int ARCHIVE = 2;
+
 	/**
 	 * Type identifier for variable entries.
 	 */
 	public static final int VARIABLE = 3;
-	
+
 	/**
 	 * Type identifier for container entries.
 	 */
 	public static final int CONTAINER = 4;
-	
+
 	/**
 	 * Type identifier for contributed entries.
 	 * @since 3.0
 	 */
-	public static final int OTHER = 5;	
+	public static final int OTHER = 5;
 
 	/**
 	 * Classpath property identifier for entries that appear on the
 	 * bootstrap path by default.
 	 */
-	public static final int STANDARD_CLASSES = 1;	
-	
+	public static final int STANDARD_CLASSES = 1;
+
 	/**
 	 * Classpath property identifier for entries that should appear on the
 	 * bootstrap path explicitly.
 	 */
-	public static final int BOOTSTRAP_CLASSES = 2;	
-		
+	public static final int BOOTSTRAP_CLASSES = 2;
+
 	/**
 	 * Classpath property identifier for entries that should appear on the
 	 * user classpath.
 	 */
-	public static final int USER_CLASSES = 3;	
-	
+	public static final int USER_CLASSES = 3;
+
 	/**
 	 * Returns this classpath entry's type. The type of a runtime classpath entry is
 	 * identified by one of the following constants:
@@ -111,7 +111,7 @@
 	 * @return this classpath entry's type
 	 */
 	public int getType();
-	
+
 	/**
 	 * Returns a memento for this classpath entry.
 	 * <p>
@@ -131,15 +131,15 @@
 	 * point <code>org.eclipse.jdt.launching.runtimeClasspathEntries</code>.
 	 * The <code>memento</code> element will be used to initialize a
 	 * restored runtime classpath entry, via the method
-	 * <code>IRuntimeClasspathEntry2.initializeFrom(Element memento)</code>. The 
+	 * <code>IRuntimeClasspathEntry2.initializeFrom(Element memento)</code>. The
 	 * attributes of the <code>memento</code> element are client defined.
 	 * </p>
-	 * 
+	 *
 	 * @return a memento for this classpath entry
 	 * @exception CoreException if an exception occurs generating a memento
 	 */
 	public String getMemento() throws CoreException;
-	
+
 	/**
 	 * Returns the path associated with this entry, or <code>null</code>
 	 * if none. The format of the
@@ -162,16 +162,16 @@
 	 * @see org.eclipse.jdt.core.IClasspathEntry#getPath()
 	 */
 	public IPath getPath();
-		
+
 	/**
 	 * Returns the resource associated with this entry, or <code>null</code>
 	 * if none. A project, archive, or folder entry may be associated
 	 * with a resource.
-	 * 
+	 *
 	 * @return the resource associated with this entry, or <code>null</code>
-	 */ 
+	 */
 	public IResource getResource();
-	
+
 	/**
 	 * Returns the path to the source archive associated with this
 	 * entry, or <code>null</code> if this classpath entry has no
@@ -180,7 +180,7 @@
 	 * Only archive and variable entries may have source attachments.
 	 * For archive entries, the path (if present) locates a source
 	 * archive. For variable entries, the path (if present) has
-	 * an analogous form and meaning as the variable path, namely the first segment 
+	 * an analogous form and meaning as the variable path, namely the first segment
 	 * is the name of a classpath variable.
 	 * </p>
 	 *
@@ -207,19 +207,19 @@
 	 * @param path the path to the source archive, or <code>null</code> if none
 	 */
 	public void setSourceAttachmentPath(IPath path);
-	
+
 	/**
 	 * Returns the path within the source archive where package fragments
 	 * are located. An empty path indicates that packages are located at
 	 * the root of the source archive. Returns a non-<code>null</code> value
-	 * if and only if <code>getSourceAttachmentPath</code> returns 
+	 * if and only if <code>getSourceAttachmentPath</code> returns
 	 * a non-<code>null</code> value.
 	 *
 	 * @return root path within the source archive, or <code>null</code> if
 	 *    not applicable
 	 */
 	public IPath getSourceAttachmentRootPath();
-	
+
 	/**
 	 * Sets the path within the source archive where package fragments
 	 * are located. A root path indicates that packages are located at
@@ -229,32 +229,32 @@
 	 * Note that an empty path (<code>Path.EMPTY</code>) is considered
 	 * <code>null</code>.
 	 * </p>
-	 * 
+	 *
 	 * @param path root path within the source archive, or <code>null</code>
-	 */	
+	 */
 	public void setSourceAttachmentRootPath(IPath path);
-	
+
 	/**
-	 * Returns the path to the external annotations file or directory, or <code>null</code> 
+	 * Returns the path to the external annotations file or directory, or <code>null</code>
 	 * if no external annotations are associated with this classpath entry.
-	 * 
+	 *
 	 * @since 3.8
-	 * @return The path to the external annotations file or directory, or <code>null</code> 
+	 * @return The path to the external annotations file or directory, or <code>null</code>
 	 * 		if not present.
 	 */
 	public IPath getExternalAnnotationsPath();
 
 	/**
 	 * Sets the path to the external annotations file or directory. It should be set to
-	 * <code>null</code> if no annotations are associated with this entry. 
-	 * 
+	 * <code>null</code> if no annotations are associated with this entry.
+	 *
 	 * @since 3.8
 	 * @param path The file or directory holding external annotations.
 	 */
 	public void setExternalAnnotationsPath(IPath path);
 
 	/**
-	 * Returns a constant indicating where this entry should appear on the 
+	 * Returns a constant indicating where this entry should appear on the
 	 * runtime classpath by default.
 	 * The value returned is one of the following:
 	 * <ul>
@@ -265,11 +265,11 @@
 	 * <li><code>USER_CLASSES</code> - a user entry should appear on the path
 	 * 		containing user or application classes</li>
 	 * </ul>
-	 * 
+	 *
 	 * @return where this entry should appear on the runtime classpath
 	 */
 	public int getClasspathProperty();
-	
+
 	/**
 	 * Sets whether this entry should appear on the bootstrap classpath,
 	 * the user classpath, or whether this entry is a standard bootstrap entry
@@ -283,47 +283,47 @@
 	 * <li><code>USER_CLASSES</code> - a user entry should appear on the path
 	 * 		conatining user or application classes</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param location a classpat property constant
 	 */
-	public void setClasspathProperty(int location);	
-	
+	public void setClasspathProperty(int location);
+
 	/**
 	 * Returns an absolute path in the local file system for this entry,
 	 * or <code>null</code> if none, or if this entry is of type <code>CONTAINER</code>.
-	 * 
+	 *
 	 * @return an absolute path in the local file system for this entry,
 	 *  or <code>null</code> if none
 	 */
 	public String getLocation();
-		
+
 	/**
 	 * Returns an absolute path in the local file system for the source
 	 * attachment associated with this entry entry, or <code>null</code> if none.
-	 * 
+	 *
 	 * @return an absolute path in the local file system for the source
 	 *  attachment associated with this entry entry, or <code>null</code> if none
 	 */
-	public String getSourceAttachmentLocation();	
-	
+	public String getSourceAttachmentLocation();
+
 	/**
 	 * Returns a path relative to this entry's source attachment path for the
 	 * root location containing source, or <code>null</code> if none.
-	 * 
+	 *
 	 * @return a path relative to this entry's source attachment path for the
 	 *  root location containing source, or <code>null</code> if none
 	 */
-	public String getSourceAttachmentRootLocation();		
-	
+	public String getSourceAttachmentRootLocation();
+
 	/**
 	 * Returns the first segment of the path associated with this entry, or <code>null</code>
 	 * if this entry is not of type <code>VARIABLE</code> or <code>CONTAINER</code>.
-	 * 
+	 *
 	 * @return the first segment of the path associated with this entry, or <code>null</code>
 	 *  if this entry is not of type <code>VARIABLE</code> or <code>CONTAINER</code>
 	 */
 	public String getVariableName();
-	
+
 	/**
 	 * Returns a classpath entry equivalent to this runtime classpath entry,
 	 * or <code>null</code> if none.
@@ -335,13 +335,13 @@
 	 * @since 2.1
 	 */
 	public IClasspathEntry getClasspathEntry();
-	
+
 	/**
 	 * Returns the Java project associated with this runtime classpath entry
 	 * or <code>null</code> if none. Runtime classpath entries of type
 	 * <code>CONTAINER</code> may be associated with a project for the
-	 * purposes of resolving the entries in a container. 
-	 * 
+	 * purposes of resolving the entries in a container.
+	 *
 	 * @return the Java project associated with this runtime classpath entry
 	 * or <code>null</code> if none
 	 * @since 3.0
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry2.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry2.java
index 5592c5b..ad33f57 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry2.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntry2.java
@@ -23,55 +23,55 @@
  * New types of runtime classpath entries are only intended to be contributed
  * by the Java debugger.
  * </p>
- * @since 3.0 
+ * @since 3.0
  * @see org.eclipse.jdt.launching.IRuntimeClasspathEntry
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
  */
 public interface IRuntimeClasspathEntry2 extends IRuntimeClasspathEntry {
-	
+
 	/**
 	 * Initializes this runtime classpath entry from the given memento.
-	 * 
+	 *
 	 * @param memento memento created by a classpath entry of the same type
 	 * @throws CoreException if unable to initialize from the given memento
 	 */
 	public void initializeFrom(Element memento) throws CoreException;
-	
+
 	/**
 	 * Returns the unique identifier of the extension that contributed
 	 * this classpath entry type, or <code>null</code> if this classpath
 	 * entry type was not contributed.
-	 * 
+	 *
 	 * @return the unique identifier of the extension that contributed
 	 *  this classpath entry type, or <code>null</code> if this classpath
 	 *  entry type was not contributed
 	 */
 	public String getTypeId();
-	
+
 	/**
 	 * Returns whether this classpath entry is composed of other entries.
-	 * 
+	 *
 	 * @return whether this classpath entry is composed of other entries
 	 */
 	public boolean isComposite();
-	
+
 	/**
 	 * Returns the classpath entries this entry is composed of, or an
 	 * empty collection if this entry is not a composite entry.
-	 * 
+	 *
 	 * @param configuration the context (launch configuration) in which
 	 *  this runtime classpath entry is being queried for contained
-	 * 	entries, possibly <code>null</code> 
+	 * 	entries, possibly <code>null</code>
 	 * @return the classpath entries this entry is composed of, or an
 	 * empty collection if this entry is not a composite entry
 	 * @throws CoreException if unable to retrieve contained entries
 	 */
 	public IRuntimeClasspathEntry[] getRuntimeClasspathEntries(ILaunchConfiguration configuration) throws CoreException;
-	
+
 	/**
 	 * Returns a human readable name for this classpath entry.
-	 * 
+	 *
 	 * @return a human readable name for this classpath entry
 	 */
 	public String getName();
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver.java
index cb86a99..95a86f9 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver.java
@@ -31,7 +31,7 @@
  * resolver extension.
  * <pre>
  * &lt;extension point="org.eclipse.jdt.launching.runtimeClasspathEntryResolvers"&gt;
- *   &lt;runtimeClasspathEntryResolver 
+ *   &lt;runtimeClasspathEntryResolver
  *      id="com.example.ExampleResolver"
  *      class="com.example.ExampleResolverImpl"
  *      variable="VAR_NAME"
@@ -58,37 +58,37 @@
  * @since 2.0
  */
 public interface IRuntimeClasspathEntryResolver {
-	
+
 	/**
 	 * Returns resolved runtime classpath entries for the given runtime classpath entry,
 	 * in the context of the given launch configuration.
-	 * 
+	 *
 	 * @param entry runtime classpath entry to resolve, of type
 	 * 	<code>VARIABLE</code> or <code>CONTAINTER</code>
 	 * @param configuration the context in which the runtime classpath entry
 	 * 	needs to be resolved
 	 * @return resolved entries (zero or more)
-	 * @exception CoreException if unable to resolve the entry  
+	 * @exception CoreException if unable to resolve the entry
 	 */
 	public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, ILaunchConfiguration configuration) throws CoreException;
-	
+
 	/**
 	 * Returns resolved runtime classpath entries for the given runtime classpath entry,
 	 * in the context of the given Java project.
-	 * 
+	 *
 	 * @param entry runtime classpath entry to resolve, of type
 	 * 	<code>VARIABLE</code> or <code>CONTAINTER</code>
 	 * @param project context in which the runtime classpath entry
 	 * 	needs to be resolved
 	 * @return resolved entries (zero or more)
-	 * @exception CoreException if unable to resolve the entry  
+	 * @exception CoreException if unable to resolve the entry
 	 */
-	public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, IJavaProject project) throws CoreException;	
-	
+	public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, IJavaProject project) throws CoreException;
+
 	/**
 	 * Returns a VM install associated with the given classpath entry,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param entry classpath entry
 	 * @return vm install associated with entry or <code>null</code> if none
 	 * @exception CoreException if unable to resolve a VM
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver2.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver2.java
index 6e2b65f..4b5a486 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver2.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathEntryResolver2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,10 +21,10 @@
  * @since 3.2
  */
 public interface IRuntimeClasspathEntryResolver2 extends IRuntimeClasspathEntryResolver {
-	
+
 	/**
 	 * Returns whether the given classpath entry references a VM install.
-	 * 
+	 *
 	 * @param entry classpath entry
 	 * @return whether the given classpath entry references a VM install
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathProvider.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathProvider.java
index cf65c70..e416023 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathProvider.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeClasspathProvider.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,7 +17,7 @@
 /**
  * A classpath provider computes an unresolved classpath for a launch
  * configuration, and resolves classpath entries for a launch configuration.
- * A classpath provider is defined as an extension of type 
+ * A classpath provider is defined as an extension of type
  * <code>org.eclipse.jdt.launching.classpathProviders</code>.
  * <p>
  * A provider is registered with an identifier that can be
@@ -34,7 +34,7 @@
  * extension.
  * <pre>
  * &lt;extension point="org.eclipse.jdt.launching.classpathProviders"&gt;
- *   &lt;classpathProvider&gt; 
+ *   &lt;classpathProvider&gt;
  *      id="com.example.ExampleClasspathProvider"
  *      class="com.example.ExampleClasspathProviderImpl"
  *   &lt;/classpathProvider&gt;
@@ -42,7 +42,7 @@
  * </pre>
  * The attributes are specified as follows:
  * <ul>
- * <li><code>id</code> specifies a unique identifier for this extension. This 
+ * <li><code>id</code> specifies a unique identifier for this extension. This
  * 	identifier may be used to reference a provider on one of the launch
  *  configuration attributes mentioned above.</li>
  * <li><code>class</code> specifies the fully qualified name of the Java class
@@ -52,27 +52,27 @@
  * <p>
  * Clients may implement this interface.
  * </p>
- * 
+ *
  * @since 2.0
  */
 public interface IRuntimeClasspathProvider {
-	
+
 	/**
 	 * Computes and returns an unresolved classpath for the given launch configuration.
 	 * Variable and container entries are not resolved.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return unresolved path
 	 * @exception CoreException if unable to compute a path
 	 */
 	public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration configuration) throws CoreException;
-	
+
 	/**
 	 * Returns the resolved path corresponding to the given path, in the context of the
 	 * given launch configuration. Variable and container entries are resolved. The returned
 	 * (resolved) path need not have the same number of entries as the given (unresolved)
 	 * path.
-	 * 
+	 *
 	 * @param entries entries to resolve
 	 * @param configuration launch configuration context to resolve in
 	 * @return resolved path
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeContainerComparator.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeContainerComparator.java
index b181bbf..1da291f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeContainerComparator.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IRuntimeContainerComparator.java
@@ -18,23 +18,23 @@
  * classpath. If an <code>IClasspathContianer</code> implements this interface,
  * the <code>isDuplicate</code> method is used to determine if containers are
  * duplicates/redundant. Otherwise, containers with the same identifier are
- * considered duplicates. 
- * 
+ * considered duplicates.
+ *
  * @since 2.0.1
  * @deprecated support has been added to <code>ClasspathContainerInitializer</code>
  *  to handle comparison of classpath containers. Use
  *  <code>ClasspathContainerInitializer.getComparisonID(IPath,IJavaProject)</code>.
  *  When a classpath container implements this interface, this interface is
  *  used to determine equality before using the support defined in
- *  <code>ClasspathContainerInitializer</code>. 
+ *  <code>ClasspathContainerInitializer</code>.
  */
 @Deprecated
 public interface IRuntimeContainerComparator {
-	
+
 	/**
 	 * Returns whether this container is a duplicate of the container
 	 * identified by the given path.
-	 * 
+	 *
 	 * @param containerPath the container to compare against
 	 * @return whether this container is a duplicate of the container
 	 * identified by the given path
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMConnector.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMConnector.java
index 2e12867..7042cfe 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMConnector.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMConnector.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.launching;
 
- 
+
 import java.util.List;
 import java.util.Map;
 
@@ -29,7 +29,7 @@
  * Following is an example definition of a VM connector extension.
  * <pre>
  * &lt;extension point="org.eclipse.jdt.launching.vmConnectors"&gt;
- *   &lt;vmConnector 
+ *   &lt;vmConnector
  *      id="com.example.VMConnector"
  *      class="com.example.VMConnectorClass"
  *   &lt;/vmConnector&gt;
@@ -46,12 +46,12 @@
  */
 
 public interface IVMConnector {
-	
+
 	/**
 	 * Establishes a JDI connection with a debuggable VM using the arguments
 	 * specified in the given map, contributing results (debug targets and processes),
 	 * to the given launch.
-	 * 
+	 *
 	 * @param arguments Argument map to use in establishing a connection. The keys of
 	 * 	the map are strings corresponding to the names of arguments returned by this
 	 * 	connector's <code>getDefaultAgruments()</code> method. The values of the map
@@ -62,40 +62,40 @@
 	 * @exception CoreException if unable to establish a connection with the target VM
 	 */
 	public void connect(Map<String, String> arguments, IProgressMonitor monitor, ILaunch launch) throws CoreException;
-		
+
 	/**
 	 * Returns the name of this connector.
-	 * 
+	 *
 	 * @return the name of this connector
 	 */
 	public String getName();
-	
+
 	/**
 	 * Returns a unique identifier for this kind of connector.
-	 * 
+	 *
 	 * @return a unique identifier for this kind of connector
 	 */
 	public String getIdentifier();
-	
+
 	/**
-	 * Returns a map of default arguments used by this connector. 
+	 * Returns a map of default arguments used by this connector.
 	 * The keys of the map are names of arguments used by this
 	 * connector, and the values are of type
 	 * <code>com.sun.jdi.connect.Connector.Argument</code>.
-	 * 
+	 *
 	 * @return argument map with default values
 	 * @exception CoreException if unable to retrieve a default argument map
 	 */
 	public Map<String, Connector.Argument> getDefaultArguments() throws CoreException;
-	
+
 	/**
 	 * Returns a list of argument names found in this connector's
 	 * default argument map, defining the order in which arguments
 	 * should be presented to the user. Since a map is not ordered,
-	 * this provides control on how arguments will be presented to 
+	 * this provides control on how arguments will be presented to
 	 * the user.
-	 * 
+	 *
 	 * @return list of argument names
 	 */
-	public List<String> getArgumentOrder();	
+	public List<String> getArgumentOrder();
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall.java
index 8de1eb9..f5a4c82 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall.java
@@ -17,7 +17,7 @@
 /**
  * Represents a particular installation of a VM. A VM instance holds all parameters
  * specific to a VM installation. Unlike VM types, VM instances can be created and
- * configured dynamically at run-time. This is typically done by the user 
+ * configured dynamically at run-time. This is typically done by the user
  * interactively in the UI.
  * <p>
  * A VM install is responsible for creating VM runners to launch a Java program
@@ -37,7 +37,7 @@
 public interface IVMInstall {
 	/**
 	 * Returns a VM runner that runs this installed VM in the given mode.
-	 * 
+	 *
 	 * @param mode the mode the VM should be launched in; one of the constants
 	 *   declared in <code>org.eclipse.debug.core.ILaunchManager</code>
 	 * @return 	a VMRunner for a given mode May return <code>null</code> if the given mode
@@ -46,60 +46,60 @@
 	 */
 	IVMRunner getVMRunner(String mode);
 	/**
-	 * Returns the id for this VM. VM IDs are unique within the VMs 
+	 * Returns the id for this VM. VM IDs are unique within the VMs
 	 * of a given VM type. The VM id is not intended to be presented to users.
-	 * 
+	 *
 	 * @return the VM identifier. Must not return <code>null</code>.
 	 */
 	String getId();
 	/**
 	 * Returns the display name of this VM.
 	 * The VM name is intended to be presented to users.
-	 * 
+	 *
 	 * @return the display name of this VM. May return <code>null</code>.
 	 */
 	String getName();
 	/**
 	 * Sets the display name of this VM.
 	 * The VM name is intended to be presented to users.
-	 * 
+	 *
 	 * @param name the display name of this VM
 	 */
 	void setName(String name);
 	/**
 	 * Returns the root directory of the install location of this VM.
-	 * 
+	 *
 	 * @return the root directory of this VM installation. May
 	 * 			return <code>null</code>.
 	 */
 	File getInstallLocation();
 	/**
 	 * Sets the root directory of the install location of this VM.
-	 * 
+	 *
 	 * @param installLocation the root directory of this VM installation
 	 */
 	void setInstallLocation(File installLocation);
-		
+
 	/**
 	 * Returns the VM type of this VM.
-	 * 
+	 *
 	 * @return the VM type that created this IVMInstall instance
 	 */
 	IVMInstallType getVMInstallType();
-	
+
 	/**
 	 * Returns the library locations of this IVMInstall. Generally,
 	 * clients should use <code>JavaRuntime.getLibraryLocations(IVMInstall)</code>
 	 * to determine the libraries associated with this VM install.
-	 * 
+	 *
 	 * @see IVMInstall#setLibraryLocations(LibraryLocation[])
 	 * @return 	The library locations of this IVMInstall.
 	 * 			Returns <code>null</code> to indicate that this VM install uses
 	 * 			the default library locations associated with this VM's install type.
 	 * @since 2.0
 	 */
-	LibraryLocation[] getLibraryLocations();	
-	
+	LibraryLocation[] getLibraryLocations();
+
 	/**
 	 * Sets the library locations of this IVMInstall.
 	 * @param	locations The <code>LibraryLocation</code>s to associate
@@ -108,44 +108,44 @@
 	 * 			the default library locations associated with this VM's install type.
 	 * @since 2.0
 	 */
-	void setLibraryLocations(LibraryLocation[] locations);	
-	
+	void setLibraryLocations(LibraryLocation[] locations);
+
 	/**
 	 * Sets the Javadoc location associated with this VM install.
-	 * 
+	 *
 	 * @param url a url pointing to the Javadoc location associated with
 	 * 	this VM install
 	 * @since 2.0
 	 */
 	public void setJavadocLocation(URL url);
-	
+
 	/**
 	 * Returns the Javadoc location associated with this VM install.
-	 * 
+	 *
 	 * @return a url pointing to the Javadoc location associated with
 	 * 	this VM install, or <code>null</code> if none
 	 * @since 2.0
 	 */
 	public URL getJavadocLocation();
-	
+
 	/**
 	 * Returns VM arguments to be used with this vm install whenever this
 	 * VM is launched as they should be passed to the command line, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @return VM arguments to be used with this vm install whenever this
 	 * VM is launched as they should be passed to the command line, or
 	 * <code>null</code> if none
 	 * @since 3.0
 	 */
 	public String[] getVMArguments();
-	
+
 	/**
 	 * Sets VM arguments to be used with this vm install whenever this
 	 * VM is launched, possibly <code>null</code>. This is equivalent
 	 * to <code>setVMArgs(String)</code> with whitespace character delimited
-	 * arguments.  
-	 * 
+	 * arguments.
+	 *
 	 * @param vmArgs VM arguments to be used with this vm install whenever this
 	 * VM is launched, possibly <code>null</code>
 	 * @since 3.0
@@ -154,5 +154,5 @@
 	 */
 	@Deprecated
 	public void setVMArguments(String[] vmArgs);
-	    
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall2.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall2.java
index b9d68a2..25dff4d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall2.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall2.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,14 +17,14 @@
  * {@link org.eclipse.jdt.launching.IVMInstall}.
  * <p>
  * When an <code>IVMInstall</code> implements this interface,
- * clients must call <code>getVMArgs()</code> in place of 
+ * clients must call <code>getVMArgs()</code> in place of
  * <code>getVMArguments()</code> and <code>setVMArgs(String)</code> in place of
  * <code>setVMArguments(String[])</code>. This avoids the problem noted
  * in bug 73493.
  * </p>
  * <p>
  * Additionally, this interface optionally provides the Java version
- * associated with a VM install. 
+ * associated with a VM install.
  * </p>
  * <p>
  * Clients that implement {@link org.eclipse.jdt.launching.IVMInstall} may additionally
@@ -35,29 +35,29 @@
  * @since 3.1
  */
 public interface IVMInstall2 {
-	
+
 	/**
 	 * Returns VM arguments to be used with this vm install whenever this
 	 * VM is launched as a raw string, or <code>null</code> if none.
-	 * 
+	 *
 	 * @return VM arguments to be used with this vm install whenever this
 	 * VM is launched as a raw string, or <code>null</code> if none
-	 */	
+	 */
 	public String getVMArgs();
-	
+
 	/**
 	 * Sets VM arguments to be used with this vm install whenever this
 	 * VM is launched as a raw string, possibly <code>null</code>.
-	 * 
+	 *
 	 * @param vmArgs VM arguments to be used with this vm install whenever this
 	 * VM is launched as a raw string, possibly <code>null</code>
 	 */
 	public void setVMArgs(String vmArgs);
-    
+
     /**
      * Returns a string representing the <code>java.version</code> system property
      * of this VM install, or <code>null</code> if unknown.
-     * 
+     *
      * @return a string representing the <code>java.version</code> system property
      * of this VM install, or <code>null</code> if unknown.
      */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall3.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall3.java
index aa5cec1..696fa36 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall3.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstall3.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -32,7 +32,7 @@
 	/**
 	 * Evaluates the specified system properties in this VM, returning the result
 	 * as a map of property names to property values.
-	 * 
+	 *
 	 * @param properties the property names to evaluate, for example <code>{"user.home"}</code>
 	 * @param monitor progress monitor or <code>null</code>
 	 * @return map of system property names to associated property values
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallChangedListener.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallChangedListener.java
index 0fad3d9..b93c119 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallChangedListener.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallChangedListener.java
@@ -4,13 +4,13 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.jdt.launching;
 
- 
+
 import org.eclipse.jdt.internal.launching.LaunchingPlugin;
 
 /**
@@ -24,7 +24,7 @@
  * @since 2.0
  */
 public interface IVMInstallChangedListener {
-	
+
 	/**
 	 * Property constant indicating the library locations associated
 	 * with a VM install have changed.
@@ -36,13 +36,13 @@
 	 * with a VM install has changed.
 	 */
 	public static final String PROPERTY_NAME = LaunchingPlugin.getUniqueIdentifier() + ".PROPERTY_NAME"; //$NON-NLS-1$
-	
+
 	/**
 	 * Property constant indicating the install location of
 	 * a VM install has changed.
 	 */
 	public static final String PROPERTY_INSTALL_LOCATION = LaunchingPlugin.getUniqueIdentifier() + ".PROPERTY_INSTALL_LOCATION";	 //$NON-NLS-1$
-			
+
 	/**
 	 * Property constant indicating the Javadoc location associated
 	 * with a VM install has changed.
@@ -52,7 +52,7 @@
 	/**
 	 * Property constant indicating the VM arguments associated
 	 * with a VM install has changed.
-     * 
+     *
      * @since 3.2
 	 */
 	public static final String PROPERTY_VM_ARGUMENTS = LaunchingPlugin.getUniqueIdentifier() + ".PROPERTY_VM_ARGUMENTS"; //$NON-NLS-1$
@@ -60,34 +60,34 @@
 	/**
 	 * Notification that the workspace default VM install
 	 * has changed.
-	 * 
+	 *
 	 * @param previous the VM install that was previously assigned
 	 * 	to the workspace, possibly <code>null</code>
 	 * @param current the VM install that is currently assigned to the
 	 * 	workspace, possibly <code>null</code>
 	 */
 	public void defaultVMInstallChanged(IVMInstall previous, IVMInstall current);
-	
+
 	/**
 	 * Notification that a property of a VM install has changed.
-	 * 
+	 *
 	 * @param event event describing the change. The VM that has changed
 	 * 	is the source object associated with the event.
 	 */
-	public void vmChanged(PropertyChangeEvent event);	
-	
+	public void vmChanged(PropertyChangeEvent event);
+
 	/**
 	 * Notification that a VM has been created.
-	 * 
+	 *
 	 * @param vm the vm that has been created
 	 */
-	public void vmAdded(IVMInstall vm);		
-	
+	public void vmAdded(IVMInstall vm);
+
 	/**
 	 * Notification that a VM has been disposed.
-	 * 
+	 *
 	 * @param vm the vm that has been disposed
 	 */
-	public void vmRemoved(IVMInstall vm);			
-	
+	public void vmRemoved(IVMInstall vm);
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallType.java
index 78794f3..f158b70 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMInstallType.java
@@ -18,86 +18,86 @@
 /**
  * Represents a particular type of VM for which there may be
  * any number of VM installations. An example of a VM type
- * is the standard JRE which might have instances corresponding 
+ * is the standard JRE which might have instances corresponding
  * to different installed versions such as JRE 1.2.2 and
  * JRE 1.3.
  * <p>
  * This interface is intended to be implemented by clients that contribute
  * to the <code>"org.eclipse.jdt.launching.vmInstallTypes"</code> extension point.
  * </p>
- * 
+ *
  * @see	IVMInstall
  */
 public interface IVMInstallType {
 	/**
 	 * Creates a new instance of this VM Install type.
 	 * The newly created IVMInstall is managed by this IVMInstallType.
-	 * 
+	 *
 	 * @param	id	An id String that must be unique within this IVMInstallType.
-	 * 
+	 *
 	 * @return the newly created VM instance
-	 * 
+	 *
 	 * @throws	IllegalArgumentException	If the id exists already.
 	 */
 	IVMInstall createVMInstall(String id);
 	/**
 	 * Finds the VM with the given id.
-	 * 
+	 *
 	 * @param id the VM id
 	 * @return a VM instance, or <code>null</code> if not found
 	 */
 	IVMInstall findVMInstall(String id);
 	/**
 	 * Finds the VM with the given name.
-	 * 
+	 *
 	 * @param name the VM name
 	 * @return a VM instance, or <code>null</code> if not found
 	 * @since 2.0
 	 */
-	IVMInstall findVMInstallByName(String name);	
-	
+	IVMInstall findVMInstallByName(String name);
+
 	/**
 	 * Remove the VM associated with the given id from the set of VMs managed by
 	 * this VM type. Has no effect if a VM with the given id is not currently managed
 	 * by this type.
 	 * A VM install that is disposed may not be used anymore.
-	 * 
+	 *
 	 * @param id the id of the VM to be disposed.
 	 */
 	void disposeVMInstall(String id);
 	/**
 	 * Returns all VM instances managed by this VM type.
-	 * 
+	 *
 	 * @return the list of VM instances managed by this VM type
 	 */
 	IVMInstall[] getVMInstalls();
 	/**
 	 * Returns the display name of this VM type.
-	 * 
+	 *
 	 * @return the name of this IVMInstallType
-	 */ 
+	 */
 	String getName();
-	
+
 	/**
 	 * Returns the globally unique id of this VM type.
 	 * Clients are responsible for providing a unique id.
-	 * 
+	 *
 	 * @return the id of this IVMInstallType
-	 */ 
+	 */
 	String getId();
 	/**
 	 * Validates the given location of a VM installation.
 	 * <p>
-	 * For example, an implementation might check whether the VM executable 
+	 * For example, an implementation might check whether the VM executable
 	 * is present.
 	 * </p>
-	 * 
+	 *
 	 * @param installLocation the root directory of a potential installation for
 	 *   this type of VM
 	 * @return a status object describing whether the install location is valid
 	 */
 	IStatus validateInstallLocation(File installLocation);
-	
+
 	/**
 	 * Tries to detect an installed VM that matches this VM install type.
 	 * Typically, this method will detect the VM installation the
@@ -108,20 +108,20 @@
 	 * 			to locate an installed VM.
 	 */
 	File detectInstallLocation();
-		
+
 	/**
 	 * Returns a collection of <code>LibraryLocation</code>s that represent the
 	 * default system libraries of this VM install type, if a VM was installed
 	 * at the given <code>installLocation</code>.
 	 * The returned <code>LibraryLocation</code>s may not exist if the
 	 * <code>installLocation</code> is not a valid install location.
-	 * 
+	 *
 	 * @param installLocation home location
 	 * @see LibraryLocation
 	 * @see IVMInstallType#validateInstallLocation(File)
-	 * 
+	 *
 	 * @return default library locations based on the given <code>installLocation</code>.
 	 * @since 2.0
 	 */
-	LibraryLocation[] getDefaultLibraryLocations(File installLocation);	
+	LibraryLocation[] getDefaultLibraryLocations(File installLocation);
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMRunner.java
index b892165..0bb24ee 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IVMRunner.java
@@ -24,7 +24,7 @@
  * </p>
  */
 public interface IVMRunner {
-		
+
 	/**
 	 * Launches a Java VM as specified in the given configuration,
 	 * contributing results (debug targets and processes), to the
@@ -34,11 +34,11 @@
 	 * @param launch the launch to contribute to
 	 * @param monitor progress monitor or <code>null</code> A cancelable progress monitor is provided by the Job
 	 *  framework. It should be noted that the setCanceled(boolean) method should never be called on the provided
-	 *  monitor or the monitor passed to any delegates from this method; due to a limitation in the progress monitor 
-	 *  framework using the setCanceled method can cause entire workspace batch jobs to be canceled, as the canceled flag 
-	 *  is propagated up the top-level parent monitor. The provided monitor is not guaranteed to have been started. 
+	 *  monitor or the monitor passed to any delegates from this method; due to a limitation in the progress monitor
+	 *  framework using the setCanceled method can cause entire workspace batch jobs to be canceled, as the canceled flag
+	 *  is propagated up the top-level parent monitor. The provided monitor is not guaranteed to have been started.
 	 * @exception CoreException if an exception occurs while launching
 	 */
-	public void run(VMRunnerConfiguration configuration, ILaunch launch, IProgressMonitor monitor) throws CoreException;	
-	
+	public void run(VMRunnerConfiguration configuration, ILaunch launch, IProgressMonitor monitor) throws CoreException;
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaLaunchDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaLaunchDelegate.java
index f3782f0..089ed83 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaLaunchDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaLaunchDelegate.java
@@ -35,42 +35,42 @@
 	 */
 	@Override
 	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
-		
+
 		if (monitor == null) {
 			monitor = new NullProgressMonitor();
 		}
-		
+
 		monitor.beginTask(NLS.bind("{0}...", new String[]{configuration.getName()}), 3); //$NON-NLS-1$
 		// check for cancellation
 		if (monitor.isCanceled()) {
 			return;
 		}
 		try {
-			monitor.subTask(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_Verifying_launch_attributes____1); 
-							
+			monitor.subTask(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_Verifying_launch_attributes____1);
+
 			String mainTypeName = verifyMainTypeName(configuration);
 			IVMRunner runner = getVMRunner(configuration, mode);
-	
+
 			File workingDir = verifyWorkingDirectory(configuration);
 			String workingDirName = null;
 			if (workingDir != null) {
 				workingDirName = workingDir.getAbsolutePath();
 			}
-			
+
 			// Environment variables
 			String[] envp= getEnvironment(configuration);
-			
+
 			// Program & VM arguments
 			String pgmArgs = getProgramArguments(configuration);
 			String vmArgs = getVMArguments(configuration);
 			ExecutionArguments execArgs = new ExecutionArguments(vmArgs, pgmArgs);
-			
+
 			// VM-specific attributes
 			Map<String, Object> vmAttributesMap = getVMSpecificAttributesMap(configuration);
-			
+
 			// Classpath
 			String[] classpath = getClasspath(configuration);
-			
+
 			// Create VM config
 			VMRunnerConfiguration runConfig = new VMRunnerConfiguration(mainTypeName, classpath);
 			runConfig.setProgramArguments(execArgs.getProgramArgumentsArray());
@@ -78,33 +78,33 @@
 			runConfig.setVMArguments(execArgs.getVMArgumentsArray());
 			runConfig.setWorkingDirectory(workingDirName);
 			runConfig.setVMSpecificAttributesMap(vmAttributesMap);
-	
+
 			// Bootpath
 			runConfig.setBootClassPath(getBootpath(configuration));
-			
+
 			// check for cancellation
 			if (monitor.isCanceled()) {
 				return;
-			}		
-			
+			}
+
 			// stop in main
 			prepareStopInMain(configuration);
-			
+
 			// done the verification phase
 			monitor.worked(1);
-			
-			monitor.subTask(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_Creating_source_locator____2); 
+
+			monitor.subTask(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_Creating_source_locator____2);
 			// set the default source locator if required
 			setDefaultSourceLocator(launch, configuration);
-			monitor.worked(1);		
-			
+			monitor.worked(1);
+
 			// Launch the configuration - 1 unit of work
 			runner.run(runConfig, launch, monitor);
-			
+
 			// check for cancellation
 			if (monitor.isCanceled()) {
 				return;
-			}	
+			}
 		}
 		finally {
 			monitor.done();
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
index 508a51c..660a104 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
@@ -6,8 +6,8 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *     IBM Corporation - initial API and implementation 
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.launching;
@@ -104,7 +104,7 @@
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
 public final class JavaRuntime {
-	
+
 	/**
 	 * Classpath variable name used for the default JRE's library
 	 * (value <code>"JRE_LIB"</code>).
@@ -116,53 +116,53 @@
 	 * (value <code>"JRE_SRC"</code>).
 	 */
 	public static final String JRESRC_VARIABLE= "JRE_SRC"; //$NON-NLS-1$
-	
+
 	/**
 	 * Classpath variable name used for the default JRE's library source root
 	 * (value <code>"JRE_SRCROOT"</code>).
 	 */
 	public static final String JRESRCROOT_VARIABLE= "JRE_SRCROOT"; //$NON-NLS-1$
-	
+
 	/**
 	 * Simple identifier constant (value <code>"runtimeClasspathEntryResolvers"</code>) for the
 	 * runtime classpath entry resolvers extension point.
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static final String EXTENSION_POINT_RUNTIME_CLASSPATH_ENTRY_RESOLVERS= "runtimeClasspathEntryResolvers";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Simple identifier constant (value <code>"classpathProviders"</code>) for the
 	 * runtime classpath providers extension point.
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static final String EXTENSION_POINT_RUNTIME_CLASSPATH_PROVIDERS= "classpathProviders";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Simple identifier constant (value <code>"executionEnvironments"</code>) for the
 	 * execution environments extension point.
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	public static final String EXTENSION_POINT_EXECUTION_ENVIRONMENTS= "executionEnvironments";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Simple identifier constant (value <code>"vmInstalls"</code>) for the
 	 * VM installs extension point.
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	public static final String EXTENSION_POINT_VM_INSTALLS = "vmInstalls";	 //$NON-NLS-1$
-	
+
 	/**
 	 * Simple identifier constant (value <code>"libraryLocationResolvers"</code>) for the
 	 * Library Resolvers extension point
-	 * 
+	 *
 	 * @since 3.7
 	 */
 	public static final String EXTENSION_POINT_LIBRARY_LOCATION_RESOLVERS = "libraryLocationResolvers"; //$NON-NLS-1$
-	
+
 	/**
 	 * Classpath container used for a project's JRE
 	 * (value <code>"org.eclipse.jdt.launching.JRE_CONTAINER"</code>). A
@@ -191,14 +191,14 @@
 	 * @since 2.0
 	 */
 	public static final String JRE_CONTAINER = LaunchingPlugin.getUniqueIdentifier() + ".JRE_CONTAINER"; //$NON-NLS-1$
-	
+
 	/**
 	 * Marker type identifier for JRE container problems.
-	 * 
+	 *
 	 * @since 3.6
 	 */
 	public static final String JRE_CONTAINER_MARKER = LaunchingPlugin.getUniqueIdentifier() + ".jreContainerMarker"; //$NON-NLS-1$
-	
+
 	/**
 	 * A status code indicating that a JRE could not be resolved for a project.
 	 * When a JRE cannot be resolved for a project by this plug-in's container
@@ -207,52 +207,52 @@
 	 * to the status handler is the Java project for which the path could not be
 	 * resolved. The status handler must return an <code>IVMInstall</code> or <code>null</code>.
 	 * The container resolver will re-set the project's classpath if required.
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static final int ERR_UNABLE_TO_RESOLVE_JRE = 160;
-	
+
 	/**
 	 * Preference key for launch/connect timeout. VM Runners should honor this timeout
 	 * value when attempting to launch and connect to a debuggable VM. The value is
 	 * an int, indicating a number of milliseconds.
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static final String PREF_CONNECT_TIMEOUT = LaunchingPlugin.getUniqueIdentifier() + ".PREF_CONNECT_TIMEOUT"; //$NON-NLS-1$
-	
+
 	/**
 	 * Preference key for the String of XML that defines all installed VMs.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static final String PREF_VM_XML = LaunchingPlugin.getUniqueIdentifier() + ".PREF_VM_XML"; //$NON-NLS-1$
-	
+
 	/**
 	 * Preference key for the default problem severity when an execution environment is bound
 	 * to a project's build path for which there is no strictly compatible JRE available in the
 	 * workspace. Value is one of {@link JavaCore#ERROR}, {@link JavaCore#WARNING}, or
 	 * {@link JavaCore#IGNORE}
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	public static final String PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE = LaunchingPlugin.getUniqueIdentifier() + ".PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE"; //$NON-NLS-1$
-	
+
 	/**
 	 * Unique identifier constant (value <code>"org.eclipse.jdt.launching"</code>)
 	 * for the Java launching plug-in.
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	public static final String ID_PLUGIN = LaunchingPlugin.ID_PLUGIN;
-	
+
 	/**
 	 * Default launch/connect timeout (milliseconds).
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static final int DEF_CONNECT_TIMEOUT = 20000;
-	
+
 	/**
 	 * Attribute key for a process property. The class
 	 * <code>org.eclipse.debug.core.model.IProcess</code> allows attaching
@@ -260,18 +260,18 @@
 	 * The value of this attribute is the command line a process
 	 * was launched with. Implementers of <code>IVMRunner</code> should use
 	 * this attribute key to attach the command lines to the processes they create.
-	 * 
+	 *
 	 * @deprecated - use <code>IProcess.ATTR_CMDLINE</code>
 	 */
 	@Deprecated
 	public final static String ATTR_CMDLINE= LaunchingPlugin.getUniqueIdentifier() + ".launcher.cmdLine"; //$NON-NLS-1$
-	
+
 	/**
 	 * Boolean preference controlling whether only exported entries should even be included when the runtime classpath is computed
 	 * @since 3.7
 	 */
 	public static final String PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES = ID_PLUGIN + ".only_include_exported_classpath_entries"; //$NON-NLS-1$
-	
+
 	/**
 	 * Attribute key for a classpath attribute referencing a
 	 * list of shared libraries that should appear on the
@@ -294,15 +294,15 @@
 	 * @see org.eclipse.jdt.core.IClasspathAttribute
 	 */
 	public static final String CLASSPATH_ATTR_LIBRARY_PATH_ENTRY =  LaunchingPlugin.getUniqueIdentifier() + ".CLASSPATH_ATTR_LIBRARY_PATH_ENTRY"; //$NON-NLS-1$
-	
+
 	// lock for VM initialization
 	private static Object fgVMLock = new Object();
 	private static boolean fgInitializingVMs = false;
-	
+
 	private static HashSet<Object> fgVMTypes = null;
 	private static String fgDefaultVMId = null;
 	private static String fgDefaultVMConnectorId = null;
-	
+
 	/**
 	 * Resolvers keyed by variable name, container id,
 	 * and runtime classpath entry id.
@@ -310,35 +310,35 @@
 	private static Map<String, IRuntimeClasspathEntryResolver> fgVariableResolvers = null;
 	private static Map<String, IRuntimeClasspathEntryResolver> fgContainerResolvers = null;
 	private static Map<String, RuntimeClasspathEntryResolver> fgRuntimeClasspathEntryResolvers = null;
-	
+
 	/**
 	 * Path providers keyed by id
 	 */
 	private static Map<String, RuntimeClasspathProvider> fgPathProviders = null;
-	
+
 	/**
 	 * Default classpath and source path providers.
 	 */
 	private static IRuntimeClasspathProvider fgDefaultClasspathProvider = new StandardClasspathProvider();
 	private static IRuntimeClasspathProvider fgDefaultSourcePathProvider = new StandardSourcePathProvider();
-	
+
 	/**
 	 * VM change listeners
 	 */
 	private static ListenerList<IVMInstallChangedListener> fgVMListeners = new ListenerList<>();
-	
+
 	/**
 	 * Cache of already resolved projects in container entries. Used to avoid
 	 * cycles in project dependencies when resolving classpath container entries.
 	 * Counters used to know when entering/exiting to clear cache
 	 */
-	private static ThreadLocal<List<IJavaProject>> fgProjects = new ThreadLocal<List<IJavaProject>>(); // Lists
-	private static ThreadLocal<Integer> fgEntryCount = new ThreadLocal<Integer>(); // Integers
-	
+	private static ThreadLocal<List<IJavaProject>> fgProjects = new ThreadLocal<>(); // Lists
+	private static ThreadLocal<Integer> fgEntryCount = new ThreadLocal<>(); // Integers
+
     /**
      *  Set of IDs of VMs contributed via vmInstalls extension point.
      */
-    private static Set<String> fgContributedVMs = new HashSet<String>();
+    private static Set<String> fgContributedVMs = new HashSet<>();
 
 	/**
 	 * This class contains only static methods, and is not intended
@@ -355,7 +355,7 @@
 		if(extensionPoint != null) {
 			IConfigurationElement[] configs = extensionPoint.getConfigurationElements();
 			MultiStatus status = new MultiStatus(LaunchingPlugin.getUniqueIdentifier(), IStatus.OK, "Exceptions occurred", null);  //$NON-NLS-1$
-			fgVMTypes = new HashSet<Object>();
+			fgVMTypes = new HashSet<>();
 			for (int i= 0; i < configs.length; i++) {
 				try {
 					fgVMTypes.add(configs[i].createExecutableExtension("class")); //$NON-NLS-1$
@@ -376,7 +376,7 @@
 	 * Returns the VM assigned to build the given Java project.
 	 * The project must exist. The VM assigned to a project is
 	 * determined from its build path.
-	 * 
+	 *
 	 * @param project the project to retrieve the VM from
 	 * @return the VM instance that is assigned to build the given Java project
 	 * 		   Returns <code>null</code> if no VM is referenced on the project's build path.
@@ -410,7 +410,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the VM install type with the given unique id.
 	 * @param id the VM install type unique id
@@ -426,11 +426,11 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Sets a VM as the system-wide default VM, and notifies registered VM install
 	 * change listeners of the change.
-	 * 
+	 *
 	 * @param vm	The VM to make the default. May be <code>null</code> to clear
 	 * 				the default.
 	 * @param monitor progress monitor or <code>null</code>
@@ -439,11 +439,11 @@
 	public static void setDefaultVMInstall(IVMInstall vm, IProgressMonitor monitor) throws CoreException {
 		setDefaultVMInstall(vm, monitor, true);
 	}
-	
+
 	/**
 	 * Sets a VM as the system-wide default VM, and notifies registered VM install
 	 * change listeners of the change.
-	 * 
+	 *
 	 * @param vm	The VM to make the default. May be <code>null</code> to clear
 	 * 				the default.
 	 * @param monitor progress monitor or <code>null</code>
@@ -469,7 +469,7 @@
 			notifyDefaultVMChanged(previous, current);
 		}
 	}
-	
+
 	/**
 	 * Sets a VM connector as the system-wide default VM. This setting is persisted when
 	 * saveVMConfiguration is called.
@@ -483,7 +483,7 @@
 		fgDefaultVMConnectorId= connector.getIdentifier();
 		saveVMConfiguration();
 	}
-	
+
 	/**
 	 * Return the default VM set with <code>setDefaultVM()</code>.
 	 * @return	Returns the default VM. May return <code>null</code> when no default
@@ -510,7 +510,7 @@
 		}
 		return getVMFromCompositeId(getDefaultVMId());
 	}
-	
+
 	/**
 	 * Return the default VM connector.
 	 * @return	Returns the default VM connector.
@@ -527,19 +527,19 @@
 		}
 		return connector;
 	}
-	
+
 	/**
 	 * Returns the list of registered VM types. VM types are registered via
 	 * <code>"org.eclipse.jdt.launching.vmTypes"</code> extension point.
 	 * Returns an empty list if there are no registered VM types.
-	 * 
+	 *
 	 * @return the list of registered VM types
 	 */
 	public static IVMInstallType[] getVMInstallTypes() {
 		initializeVMs();
 		return fgVMTypes.toArray(new IVMInstallType[fgVMTypes.size()]);
 	}
-	
+
 	/**
 	 * Returns the default VM id determined during the initialization of the VM types
 	 * @return the id of the default VM
@@ -548,7 +548,7 @@
 		initializeVMs();
 		return fgDefaultVMId;
 	}
-	
+
 	/**
 	 * Returns the default VM connector id determined during the initialization of the VM types
 	 * @return the id of the default VM connector
@@ -557,13 +557,13 @@
 		initializeVMs();
 		return fgDefaultVMConnectorId;
 	}
-	
+
 	/**
 	 * Returns a String that uniquely identifies the specified VM across all VM types.
-	 * 
+	 *
 	 * @param vm the instance of IVMInstallType to be identified
 	 * @return the unique identifier for the specified VM
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static String getCompositeIdFromVM(IVMInstall vm) {
@@ -575,14 +575,14 @@
 		CompositeId id = new CompositeId(new String[] { typeID, vm.getId() });
 		return id.toString();
 	}
-	
+
 	/**
 	 * Return the VM corresponding to the specified composite Id.  The id uniquely
 	 * identifies a VM across all VM types.
-	 * 
+	 *
 	 * @param idString the composite id that specifies an instance of IVMInstall
 	 * @return the VM corresponding to the specified composite Id.
-	 * 
+	 *
 	 * @since 2.1
 	 */
 	public static IVMInstall getVMFromCompositeId(String idString) {
@@ -603,7 +603,7 @@
 	 * Returns a new runtime classpath entry for the given expression that
 	 * may contain string substitution variable references. The resulting expression
 	 * refers to an archive (jar or directory) containing class files.
-	 * 
+	 *
 	 * @param expression an expression that resolves to the location of an archive
 	 * @return runtime classpath entry
 	 * @since 3.0
@@ -611,11 +611,11 @@
 	public static IRuntimeClasspathEntry newStringVariableClasspathEntry(String expression) {
 		return new VariableClasspathEntry(expression);
 	}
-	
+
 	/**
 	 * Returns a new runtime classpath entry containing the default classpath
 	 * for the specified Java project.
-	 * 
+	 *
 	 * @param project Java project
 	 * @return runtime classpath entry
 	 * @since 3.0
@@ -623,10 +623,10 @@
 	public static IRuntimeClasspathEntry newDefaultProjectClasspathEntry(IJavaProject project) {
 		return new DefaultProjectClasspathEntry(project);
 	}
-	
+
 	/**
 	 * Returns a new runtime classpath entry for the given project.
-	 * 
+	 *
 	 * @param project Java project
 	 * @return runtime classpath entry
 	 * @since 2.0
@@ -634,11 +634,11 @@
 	public static IRuntimeClasspathEntry newProjectRuntimeClasspathEntry(IJavaProject project) {
 		return newRuntimeClasspathEntry(JavaCore.newProjectEntry(project.getProject().getFullPath()));
 	}
-	
-	
+
+
 	/**
 	 * Returns a new runtime classpath entry for the given archive.
-	 * 
+	 *
 	 * @param resource archive resource
 	 * @return runtime classpath entry
 	 * @since 2.0
@@ -646,11 +646,11 @@
 	public static IRuntimeClasspathEntry newArchiveRuntimeClasspathEntry(IResource resource) {
 		return newRuntimeClasspathEntry(JavaCore.newLibraryEntry(resource.getFullPath(), null, null));
 	}
-	
+
 	/**
 	 * Returns a new runtime classpath entry for the given archive (possibly
 	 * external).
-	 * 
+	 *
 	 * @param path absolute path to an archive
 	 * @return runtime classpath entry
 	 * @since 2.0
@@ -662,7 +662,7 @@
 	/**
 	 * Returns a new runtime classpath entry for the classpath
 	 * variable with the given path.
-	 * 
+	 *
 	 * @param path variable path; first segment is the name of the variable;
 	 * 	trailing segments are appended to the resolved variable value
 	 * @return runtime classpath entry
@@ -675,7 +675,7 @@
 	/**
 	 * Returns a runtime classpath entry for the given container path with the given
 	 * classpath property.
-	 * 
+	 *
 	 * @param path container path
 	 * @param classpathProperty the type of entry - one of <code>USER_CLASSES</code>,
 	 * 	<code>BOOTSTRAP_CLASSES</code>, or <code>STANDARD_CLASSES</code>
@@ -686,11 +686,11 @@
 	public static IRuntimeClasspathEntry newRuntimeContainerClasspathEntry(IPath path, int classpathProperty) throws CoreException {
 		return newRuntimeContainerClasspathEntry(path, classpathProperty, null);
 	}
-	
+
 	/**
 	 * Returns a runtime classpath entry for the given container path with the given
 	 * classpath property to be resolved in the context of the given Java project.
-	 * 
+	 *
 	 * @param path container path
 	 * @param classpathProperty the type of entry - one of <code>USER_CLASSES</code>,
 	 * 	<code>BOOTSTRAP_CLASSES</code>, or <code>STANDARD_CLASSES</code>
@@ -706,10 +706,10 @@
 		entry.setJavaProject(project);
 		return entry;
 	}
-		
+
 	/**
 	 * Returns a runtime classpath entry constructed from the given memento.
-	 * 
+	 *
 	 * @param memento a memento for a runtime classpath entry
 	 * @return runtime classpath entry
 	 * @exception CoreException if unable to construct a runtime classpath entry
@@ -722,7 +722,7 @@
 			StringReader reader = new StringReader(memento);
 			InputSource source = new InputSource(reader);
 			root = parser.parse(source).getDocumentElement();
-												
+
 			String id = root.getAttribute("id"); //$NON-NLS-1$
 			if (id == null || id.length() == 0) {
 				// assume an old format
@@ -750,12 +750,12 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a runtime classpath entry that corresponds to the given
 	 * classpath entry. The classpath entry may not be of type <code>CPE_SOURCE</code>
 	 * or <code>CPE_CONTAINER</code>.
-	 * 
+	 *
 	 * @param entry a classpath entry
 	 * @return runtime classpath entry
 	 * @since 2.0
@@ -763,11 +763,11 @@
 	private static IRuntimeClasspathEntry newRuntimeClasspathEntry(IClasspathEntry entry) {
 		return new RuntimeClasspathEntry(entry);
 	}
-			
+
 	/**
 	 * Computes and returns the default unresolved runtime classpath for the
 	 * given project.
-	 * 
+	 *
 	 * @param project the {@link IJavaProject} to compute the unresolved runtime classpath for
 	 * @return runtime classpath entries
 	 * @exception CoreException if unable to compute the runtime classpath
@@ -776,7 +776,7 @@
 	 */
 	public static IRuntimeClasspathEntry[] computeUnresolvedRuntimeClasspath(IJavaProject project) throws CoreException {
 		IClasspathEntry[] entries = project.getRawClasspath();
-		List<IRuntimeClasspathEntry> classpathEntries = new ArrayList<IRuntimeClasspathEntry>(3);
+		List<IRuntimeClasspathEntry> classpathEntries = new ArrayList<>(3);
 		for (int i = 0; i < entries.length; i++) {
 			IClasspathEntry entry = entries[i];
 			switch (entry.getEntryKind()) {
@@ -810,11 +810,11 @@
 		classpathEntries.add(newDefaultProjectClasspathEntry(project));
 		return classpathEntries.toArray(new IRuntimeClasspathEntry[classpathEntries.size()]);
 	}
-	
+
 	/**
 	 * Computes and returns the unresolved source lookup path for the given launch
 	 * configuration.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return runtime classpath entries
 	 * @exception CoreException if unable to compute the source lookup path
@@ -823,11 +823,11 @@
 	public static IRuntimeClasspathEntry[] computeUnresolvedSourceLookupPath(ILaunchConfiguration configuration) throws CoreException {
 		return getSourceLookupPathProvider(configuration).computeUnresolvedClasspath(configuration);
 	}
-	
+
 	/**
 	 * Resolves the given source lookup path, returning the resolved source lookup path
 	 * in the context of the given launch configuration.
-	 * 
+	 *
 	 * @param entries unresolved entries
 	 * @param configuration launch configuration
 	 * @return resolved entries
@@ -837,10 +837,10 @@
 	public static IRuntimeClasspathEntry[] resolveSourceLookupPath(IRuntimeClasspathEntry[] entries, ILaunchConfiguration configuration) throws CoreException {
 		return getSourceLookupPathProvider(configuration).resolveClasspath(entries, configuration);
 	}
-	
+
 	/**
 	 * Returns the classpath provider for the given launch configuration.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return classpath provider
 	 * @exception CoreException if unable to resolve the path provider
@@ -859,10 +859,10 @@
 		}
 		return provider;
 	}
-		
+
 	/**
 	 * Returns the source lookup path provider for the given launch configuration.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return source lookup path provider
 	 * @exception CoreException if unable to resolve the path provider
@@ -881,7 +881,7 @@
 		}
 		return provider;
 	}
-		
+
 	/**
 	 * Returns resolved entries for the given entry in the context of the given
 	 * launch configuration. If the entry is of kind
@@ -978,7 +978,7 @@
 	/**
 	 * Default resolution for a classpath variable - resolve to an archive. Only
 	 * one of project/configuration can be non-null.
-	 * 
+	 *
 	 * @param entry the {@link IRuntimeClasspathEntry} to try and resolve
 	 * @param project the project context or <code>null</code>
 	 * @param configuration configuration context or <code>null</code>
@@ -1025,19 +1025,19 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns runtime classpath entries corresponding to the output locations
 	 * of the given project, or null if the project only uses the default
 	 * output location.
-	 * 
+	 *
 	 * @param project the {@link IJavaProject} to resolve the output locations for
 	 * @param classpathProperty the type of classpath entries to create
 	 * @return IRuntimeClasspathEntry[] or <code>null</code>
 	 * @throws CoreException if output resolution encounters a problem
 	 */
 	private static IRuntimeClasspathEntry[] resolveOutputLocations(IJavaProject project, int classpathProperty) throws CoreException {
-		List<IPath> nonDefault = new ArrayList<IPath>();
+		List<IPath> nonDefault = new ArrayList<>();
 		if (project.exists() && project.getProject().isOpen()) {
 			IClasspathEntry entries[] = project.getRawClasspath();
 			for (int i = 0; i < entries.length; i++) {
@@ -1066,7 +1066,7 @@
 		}
 		return locations;
 	}
-	
+
 	/**
 	 * Returns resolved entries for the given entry in the context of the given
 	 * Java project. If the entry is of kind
@@ -1131,7 +1131,7 @@
 		}
 		return new IRuntimeClasspathEntry[] {entry};
 	}
-		
+
 	/**
 	 * Performs default resolution for a container entry.
 	 * Delegates to the Java model.
@@ -1147,7 +1147,7 @@
 		}
 		return computeDefaultContainerEntries(entry, project);
 	}
-	
+
 	/**
 	 * Performs default resolution for a container entry.
 	 * Delegates to the Java model.
@@ -1180,11 +1180,11 @@
 				property = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
 				break;
 		}
-		List<IRuntimeClasspathEntry> resolved = new ArrayList<IRuntimeClasspathEntry>(cpes.length);
+		List<IRuntimeClasspathEntry> resolved = new ArrayList<>(cpes.length);
 		List<IJavaProject> projects = fgProjects.get();
 		Integer count = fgEntryCount.get();
 		if (projects == null) {
-			projects = new ArrayList<IJavaProject>();
+			projects = new ArrayList<>();
 			fgProjects.set(projects);
 			count = new Integer(0);
 		}
@@ -1232,11 +1232,11 @@
 		}
 		return result;
 	}
-			
+
 	/**
 	 * Computes and returns the unresolved class path for the given launch configuration.
 	 * Variable and container entries are unresolved.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return unresolved runtime classpath entries
 	 * @exception CoreException if unable to compute the classpath
@@ -1245,7 +1245,7 @@
 	public static IRuntimeClasspathEntry[] computeUnresolvedRuntimeClasspath(ILaunchConfiguration configuration) throws CoreException {
 		return getClasspathProvider(configuration).computeUnresolvedClasspath(configuration);
 	}
-	
+
 	/**
 	 * Resolves the given classpath, returning the resolved classpath
 	 * in the context of the given launch configuration.
@@ -1259,12 +1259,12 @@
 	public static IRuntimeClasspathEntry[] resolveRuntimeClasspath(IRuntimeClasspathEntry[] entries, ILaunchConfiguration configuration) throws CoreException {
 		return getClasspathProvider(configuration).resolveClasspath(entries, configuration);
 	}
-	
+
 	/**
 	 * Return the <code>IJavaProject</code> referenced in the specified configuration or
 	 * <code>null</code> if none. This method looks for the existence of the {@link IJavaLaunchConfigurationConstants#ATTR_PROJECT_NAME}
 	 * attribute in the given configuration.
-	 * 
+	 *
 	 * @param configuration the {@link ILaunchConfiguration} to try and compute the {@link IJavaProject} from
 	 * @return the referenced {@link IJavaProject} or <code>null</code>
 	 * @exception CoreException if the referenced Java project does not exist
@@ -1284,7 +1284,7 @@
 		}
 		return javaProject;
 	}
-				
+
 	/**
 	 * Convenience method to get the java model.
 	 * @return the {@link IJavaModel} made against the {@link IWorkspaceRoot}
@@ -1292,7 +1292,7 @@
 	private static IJavaModel getJavaModel() {
 		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
 	}
-	
+
 	/**
 	 * Returns the VM install for the given launch configuration.
 	 * The VM install is determined in the following prioritized way:
@@ -1307,7 +1307,7 @@
 	 * <li>If no project is specified, or the project does not specify a custom
 	 * 	VM install, the workspace default VM install is returned.</li>
 	 * </ol>
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @return VM install
 	 * @exception CoreException if unable to compute a VM install
@@ -1343,12 +1343,12 @@
 				return resolver.resolveVMInstall(entry);
 			}
 		}
-		
+
 		return getDefaultVMInstall();
 	}
 	/**
 	 * Returns the VM of the given type with the specified name.
-	 * 
+	 *
 	 * @param type VM type identifier
 	 * @param name VM name
 	 * @param configuration the backing {@link ILaunchConfiguration}
@@ -1380,10 +1380,10 @@
 		// won't reach here
 		return null;
 	}
-	
+
 	/**
 	 * Throws a core exception with an internal error status.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param exception lower level exception associated with the
 	 *  error, or <code>null</code> if none
@@ -1392,26 +1392,26 @@
 	private static void abort(String message, Throwable exception) throws CoreException {
 		abort(message, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, exception);
 	}
-		
-		
+
+
 	/**
 	 * Throws a core exception with an internal error status.
-	 * 
+	 *
 	 * @param message the status message
 	 * @param code status code
 	 * @param exception lower level exception associated with the
-	 * 
+	 *
 	 *  error, or <code>null</code> if none
 	 * @throws CoreException a {@link CoreException} wrapper
 	 */
 	private static void abort(String message, int code, Throwable exception) throws CoreException {
 		throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), code, message, exception));
 	}
-		
+
 	/**
 	 * Computes the default application classpath entries for the given
 	 * project.
-	 * 
+	 *
 	 * @param	jproject The project to compute the classpath for
 	 * @return	The computed classpath. May be empty, but not null.
 	 * @throws	CoreException if unable to compute the default classpath
@@ -1420,7 +1420,7 @@
 		IRuntimeClasspathEntry[] unresolved = computeUnresolvedRuntimeClasspath(jproject);
 		// 1. remove bootpath entries
 		// 2. resolve & translate to local file system paths
-		List<String> resolved = new ArrayList<String>(unresolved.length);
+		List<String> resolved = new ArrayList<>(unresolved.length);
 		for (int i = 0; i < unresolved.length; i++) {
 			IRuntimeClasspathEntry entry = unresolved[i];
 			if (entry.getClasspathProperty() == IRuntimeClasspathEntry.USER_CLASSES) {
@@ -1435,7 +1435,7 @@
 		}
 		return resolved.toArray(new String[resolved.size()]);
 	}
-		
+
 	/**
 	 * Saves the VM configuration information to the preferences. This includes
 	 * the following information:
@@ -1456,7 +1456,7 @@
 		InstanceScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN).put(PREF_VM_XML, xml);
 		savePreferences();
 	}
-	
+
 	/**
 	 * Returns the listing of currently installed VMs as a single XML file
 	 * @return an XML representation of all of the currently installed VMs
@@ -1476,12 +1476,12 @@
 		}
 		return container.getAsXML();
 	}
-	
+
 	/**
 	 * This method loads installed JREs based an existing user preference
 	 * or old VM configurations file. The VMs found in the preference
 	 * or VM configurations file are added to the given VM definitions container.
-	 * 
+	 *
 	 * Returns whether the user preferences should be set - i.e. if it was
 	 * not already set when initialized.
 	 * @param vmDefs the container to add persisted VM information to
@@ -1491,7 +1491,7 @@
 	private static boolean addPersistedVMs(VMDefinitionsContainer vmDefs) throws IOException {
 		// Try retrieving the VM preferences from the preference store
 		String vmXMLString = InstanceScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN).get(PREF_VM_XML, ""); //$NON-NLS-1$
-		
+
 		// If the preference was found, load VMs from it into memory
 		if (vmXMLString.length() > 0) {
 			try {
@@ -1506,7 +1506,7 @@
 			IPath stateLocation= LaunchingPlugin.getDefault().getStateLocation();
 			IPath stateFile= stateLocation.append("vmConfiguration.xml"); //$NON-NLS-1$
 			File file = new File(stateFile.toOSString());
-			
+
 			if (file.exists()) {
 				// If file exists, load VM definitions from it into memory and write the definitions to
 				// the preference store WITHOUT triggering any processing of the new value
@@ -1516,7 +1516,7 @@
 		}
 		return true;
 	}
-	
+
 	/**
 	 * Loads contributed VM installs
 	 * @param vmDefs the container to add contributed VM install information to
@@ -1651,10 +1651,10 @@
 			}
 		}
 	}
-    
+
     /**
      * Performs string substitution on the given expression.
-     * 
+     *
      * @param expression the expression to evaluate
      * @return expression after string substitution
      * @throws CoreException if the substitution encounters a problem
@@ -1663,11 +1663,11 @@
     private static String substitute(String expression) throws CoreException {
         return VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(expression);
     }
-    
+
     /**
      * Returns whether the VM install with the specified id was contributed via
      * the vmInstalls extension point.
-     * 
+     *
      * @param id VM id
      * @return whether the VM install was contributed via extension point
      * @since 3.2
@@ -1676,7 +1676,7 @@
         getVMInstallTypes(); // ensure VMs are initialized
         return fgContributedVMs.contains(id);
     }
-	
+
 	/**
 	 * Evaluates library locations for a IVMInstall. If no library locations are set on the install, a default
 	 * location is evaluated and checked if it exists.
@@ -1716,7 +1716,7 @@
 				if (!libraryPaths[i].toFile().isFile()) {
 					libraryPaths[i]= Path.EMPTY;
 				}
-				
+
 				annotationPaths[i] = Path.EMPTY;
 
 				sourcePaths[i]= dflts[i].getSystemLibrarySourcePath();
@@ -1749,10 +1749,10 @@
 		}
 		return locations;
 	}
-	
+
 	/**
 	 * Detect the VM that Eclipse is running on.
-	 * 
+	 *
 	 * @return a VM stand-in representing the VM that Eclipse is running on, or
 	 * <code>null</code> if unable to detect the runtime VM
 	 */
@@ -1791,7 +1791,7 @@
 		for (int i = 0; i < vmTypes.length; i++) {
 			File detectedLocation= vmTypes[i].detectInstallLocation();
 			if (detectedLocation != null) {
-				
+
 				// Make sure the VM id is unique
 				long unique = System.currentTimeMillis();
 				IVMInstallType vmType = vmTypes[i];
@@ -1818,19 +1818,19 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns whether the specified option is the same in the given
 	 * map and preference store.
-	 * 
+	 *
 	 * <p>
 	 * Notes:
 	 * <ul>
 	 * <li>Returns <code>false</code> if the option is only contained in one map</li>
 	 * <li>Returns <code>true</code> if the option is not contained in either map</li>
-	 * </ul> 
+	 * </ul>
 	 * </p>
-	 * 
+	 *
 	 * @param optionName name of option to test
 	 * @param options map of options
 	 * @param prefStore preferences node
@@ -1845,10 +1845,10 @@
 		}
 		return !options.containsKey(optionName);
 	}
-	
+
 	/**
 	 * Returns whether the objects are equal or both <code>null</code>
-	 * 
+	 *
 	 * @param o1 an object
 	 * @param o2 an object
 	 * @return whether the objects are equal or both <code>null</code>
@@ -1859,7 +1859,7 @@
 		}
 		return o1.equals(o2);
 	}
-	
+
 	/**
 	 * Make the name of a detected VM stand out.
 	 * @param vm the VM to generate a name for
@@ -1873,11 +1873,11 @@
 		}
 		return name;
 	}
-	
+
 	/**
 	 * Creates and returns a classpath entry describing
 	 * the JRE_LIB classpath variable.
-	 * 
+	 *
 	 * @return a new IClasspathEntry that describes the JRE_LIB classpath variable
 	 */
 	public static IClasspathEntry getJREVariableEntry() {
@@ -1887,33 +1887,33 @@
 			new Path(JRESRCROOT_VARIABLE)
 		);
 	}
-	
+
 	/**
 	 * Creates and returns a classpath entry describing
 	 * the default JRE container entry.
-	 * 
+	 *
 	 * @return a new IClasspathEntry that describes the default JRE container entry
 	 * @since 2.0
 	 */
 	public static IClasspathEntry getDefaultJREContainerEntry() {
 		return JavaCore.newContainerEntry(newDefaultJREContainerPath());
 	}
-	
+
 	/**
 	 * Returns a path for the JRE classpath container identifying the
 	 * default VM install.
-	 * 
+	 *
 	 * @return classpath container path
 	 * @since 3.2
 	 */
 	public static IPath newDefaultJREContainerPath() {
 		return new Path(JRE_CONTAINER);
 	}
-	
+
 	/**
 	 * Returns a path for the JRE classpath container identifying the
 	 * specified VM install by type and name.
-	 * 
+	 *
 	 * @param vm VM install
 	 * @return classpath container path
 	 * @since 3.2
@@ -1921,11 +1921,11 @@
 	public static IPath newJREContainerPath(IVMInstall vm) {
 		return newJREContainerPath(vm.getVMInstallType().getId(), vm.getName());
 	}
-	
+
 	/**
 	 * Returns a path for the JRE classpath container identifying the
 	 * specified VM install by type and name.
-	 * 
+	 *
 	 * @param typeId VM install type identifier
 	 * @param name VM install name
 	 * @return classpath container path
@@ -1937,11 +1937,11 @@
 		path = path.append(name);
 		return path;
 	}
-	
+
 	/**
 	 * Returns a path for the JRE classpath container identifying the
 	 * specified execution environment.
-	 * 
+	 *
 	 * @param environment execution environment
 	 * @return classpath container path
 	 * @since 3.2
@@ -1952,11 +1952,11 @@
 		path = path.append(JREContainerInitializer.encodeEnvironmentId(environment.getId()));
 		return path;
 	}
-	
+
 	/**
 	 * Returns the JRE referenced by the specified JRE classpath container
 	 * path or <code>null</code> if none.
-	 * 
+	 *
 	 * @param jreContainerPath the path to the container to try and resolve the {@link IVMInstall} from
 	 * @return JRE referenced by the specified JRE classpath container
 	 *  path or <code>null</code>
@@ -1965,11 +1965,11 @@
 	public static IVMInstall getVMInstall(IPath jreContainerPath) {
 		return JREContainerInitializer.resolveVM(jreContainerPath);
 	}
-	
+
 	/**
 	 * Returns the identifier of the VM install type referenced by the
 	 * given JRE classpath container path, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param jreContainerPath the path to the container to try and resolve the {@link IVMInstallType} id from
 	 * @return VM install type identifier or <code>null</code>
 	 * @since 3.2
@@ -1984,7 +1984,7 @@
 	/**
 	 * Returns the name of the VM install referenced by the
 	 * given JRE classpath container path, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param jreContainerPath the path to the container to try an resolve the {@link IVMInstall} name from
 	 * @return VM name or <code>null</code>
 	 * @since 3.2
@@ -1995,11 +1995,11 @@
 		}
 		return JREContainerInitializer.getVMName(jreContainerPath);
 	}
-	
+
 	/**
 	 * Returns the execution environment identifier in the following JRE
 	 * classpath container path, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param jreContainerPath classpath container path
 	 * @return execution environment identifier or <code>null</code>
 	 * @since 3.2
@@ -2007,7 +2007,7 @@
 	public static String getExecutionEnvironmentId(IPath jreContainerPath) {
 		return JREContainerInitializer.getExecutionEnvironmentId(jreContainerPath);
 	}
-	
+
 	/**
 	 * Returns a runtime classpath entry identifying the JRE to use when launching the specified
 	 * configuration or <code>null</code> if none is specified. The entry returned represents a
@@ -2061,12 +2061,12 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a runtime classpath entry identifying the JRE referenced by the specified
 	 * project, or <code>null</code> if none. The entry returned represents a either a
 	 * classpath variable or classpath container that resolves to a JRE.
-	 * 
+	 *
 	 * @param project Java project
 	 * @return JRE runtime classpath entry or <code>null</code>
 	 * @exception org.eclipse.core.runtime.CoreException if an exception occurs
@@ -2106,14 +2106,14 @@
 					}
 					break;
 			}
-			
+
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns whether the given runtime classpath entry refers to a VM install.
-	 * 
+	 *
 	 * @param entry the entry to check
 	 * @return whether the given runtime classpath entry refers to a VM install
 	 * @since 3.2
@@ -2138,11 +2138,11 @@
 		}
 		return false;
 	}
-	
+
 	/**
 	 * Returns the VM connector defined with the specified identifier,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @param id VM connector identifier
 	 * @return VM connector or <code>null</code> if none
 	 * @since 2.0
@@ -2150,7 +2150,7 @@
 	public static IVMConnector getVMConnector(String id) {
 		return LaunchingPlugin.getDefault().getVMConnector(id);
 	}
-	
+
 	/**
 	 * Returns all VM connector extensions.
 	 *
@@ -2160,10 +2160,10 @@
 	public static IVMConnector[] getVMConnectors() {
 		return LaunchingPlugin.getDefault().getVMConnectors();
 	}
-	
+
 	/**
 	 * Returns the preference store for the launching plug-in.
-	 * 
+	 *
 	 * @return the preference store for the launching plug-in
 	 * @since 2.0
 	 */
@@ -2171,10 +2171,10 @@
 	public static Preferences getPreferences() {
 		return LaunchingPlugin.getDefault().getPluginPreferences();
 	}
-	
+
 	/**
 	 * Saves the preferences for the launching plug-in.
-	 * 
+	 *
 	 * @since 2.0
 	 */
 	public static void savePreferences() {
@@ -2185,10 +2185,10 @@
 			LaunchingPlugin.log(e);
 		}
 	}
-	
+
 	/**
 	 * Registers the given resolver for the specified variable.
-	 * 
+	 *
 	 * @param resolver runtime classpath entry resolver
 	 * @param variableName variable name to register for
 	 * @since 2.0
@@ -2197,10 +2197,10 @@
 		Map<String, IRuntimeClasspathEntryResolver> map = getVariableResolvers();
 		map.put(variableName, resolver);
 	}
-	
+
 	/**
 	 * Registers the given resolver for the specified container.
-	 * 
+	 *
 	 * @param resolver runtime classpath entry resolver
 	 * @param containerIdentifier identifier of the classpath container to register for
 	 * @since 2.0
@@ -2209,7 +2209,7 @@
 		Map<String, IRuntimeClasspathEntryResolver> map = getContainerResolvers();
 		map.put(containerIdentifier, resolver);
 	}
-	
+
 	/**
 	 * Returns all registered variable resolvers.
 	 * @return the initialized map of {@link RuntimeClasspathEntryResolver}s for variables
@@ -2220,7 +2220,7 @@
 		}
 		return fgVariableResolvers;
 	}
-	
+
 	/**
 	 * Returns all registered container resolvers.
 	 * @return the initialized map of {@link RuntimeClasspathEntryResolver}s for containers
@@ -2231,7 +2231,7 @@
 		}
 		return fgContainerResolvers;
 	}
-	
+
 	/**
 	 * Returns all registered runtime classpath entry resolvers.
 	 * @return the initialized map of {@link RuntimeClasspathEntryResolver}s for classpath entries
@@ -2249,9 +2249,9 @@
 	private static void initializeResolvers() {
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(LaunchingPlugin.ID_PLUGIN, EXTENSION_POINT_RUNTIME_CLASSPATH_ENTRY_RESOLVERS);
 		IConfigurationElement[] extensions = point.getConfigurationElements();
-		fgVariableResolvers = new HashMap<String, IRuntimeClasspathEntryResolver>(extensions.length);
-		fgContainerResolvers = new HashMap<String, IRuntimeClasspathEntryResolver>(extensions.length);
-		fgRuntimeClasspathEntryResolvers = new HashMap<String, RuntimeClasspathEntryResolver>(extensions.length);
+		fgVariableResolvers = new HashMap<>(extensions.length);
+		fgContainerResolvers = new HashMap<>(extensions.length);
+		fgRuntimeClasspathEntryResolvers = new HashMap<>(extensions.length);
 		for (int i = 0; i < extensions.length; i++) {
 			RuntimeClasspathEntryResolver res = new RuntimeClasspathEntryResolver(extensions[i]);
 			String variable = res.getVariableName();
@@ -2279,24 +2279,24 @@
 		}
 		return fgPathProviders;
 	}
-		
+
 	/**
 	 * Initializes the listing of classpath providers
 	 */
 	private static void initializeProviders() {
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(LaunchingPlugin.ID_PLUGIN, EXTENSION_POINT_RUNTIME_CLASSPATH_PROVIDERS);
 		IConfigurationElement[] extensions = point.getConfigurationElements();
-		fgPathProviders = new HashMap<String, RuntimeClasspathProvider>(extensions.length);
+		fgPathProviders = new HashMap<>(extensions.length);
 		for (int i = 0; i < extensions.length; i++) {
 			RuntimeClasspathProvider res = new RuntimeClasspathProvider(extensions[i]);
 			fgPathProviders.put(res.getIdentifier(), res);
 		}
 	}
-		
+
 	/**
 	 * Returns the resolver registered for the given variable, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param variableName the variable to determine the resolver for
 	 * @return the resolver registered for the given variable, or
 	 * <code>null</code> if none
@@ -2304,11 +2304,11 @@
 	private static IRuntimeClasspathEntryResolver2 getVariableResolver(String variableName) {
 		return (IRuntimeClasspathEntryResolver2)getVariableResolvers().get(variableName);
 	}
-	
+
 	/**
 	 * Returns the resolver registered for the given container id, or
 	 * <code>null</code> if none.
-	 * 
+	 *
 	 * @param containerId the container to determine the resolver for
 	 * @return the resolver registered for the given container id, or
 	 * <code>null</code> if none
@@ -2316,11 +2316,11 @@
 	private static IRuntimeClasspathEntryResolver2 getContainerResolver(String containerId) {
 		return (IRuntimeClasspathEntryResolver2)getContainerResolvers().get(containerId);
 	}
-	
+
 	/**
 	 * Returns the resolver registered for the given contributed classpath
 	 * entry type.
-	 * 
+	 *
 	 * @param typeId the id of the contributed classpath entry
 	 * @return the resolver registered for the given classpath entry
 	 */
@@ -2331,29 +2331,29 @@
 		}
 		return resolver;
 	}
-	
+
 	/**
 	 * Adds the given listener to the list of registered VM install changed
 	 * listeners. Has no effect if an identical listener is already registered.
-	 * 
+	 *
 	 * @param listener the listener to add
 	 * @since 2.0
 	 */
 	public static void addVMInstallChangedListener(IVMInstallChangedListener listener) {
 		fgVMListeners.add(listener);
 	}
-	
+
 	/**
 	 * Removes the given listener from the list of registered VM install changed
 	 * listeners. Has no effect if an identical listener is not already registered.
-	 * 
+	 *
 	 * @param listener the listener to remove
 	 * @since 2.0
 	 */
 	public static void removeVMInstallChangedListener(IVMInstallChangedListener listener) {
 		fgVMListeners.remove(listener);
 	}
-	
+
 	/**
 	 * Notifies registered listeners that the default VM has changed
 	 * @param previous the previous VM
@@ -2364,10 +2364,10 @@
 			listener.defaultVMInstallChanged(previous, current);
 		}
 	}
-	
+
 	/**
 	 * Notifies all VM install changed listeners of the given property change.
-	 * 
+	 *
 	 * @param event event describing the change.
 	 * @since 2.0
 	 */
@@ -2376,10 +2376,10 @@
 			listener.vmChanged(event);
 		}
 	}
-	
+
 	/**
 	 * Notifies all VM install changed listeners of the VM addition
-	 * 
+	 *
 	 * @param vm the VM that has been added
 	 * @since 2.0
 	 */
@@ -2390,10 +2390,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Notifies all VM install changed listeners of the VM removal
-	 * 
+	 *
 	 * @param vm the VM that has been removed
 	 * @since 2.0
 	 */
@@ -2402,13 +2402,13 @@
 			listener.vmRemoved(vm);
 		}
 	}
-	
+
 	/**
 	 * Return the String representation of the default output directory of the
 	 * launch config's project or <code>null</code> if there is no configuration, no
 	 * project or some sort of problem.
 	 * @param config the {@link ILaunchConfiguration}
-	 * 
+	 *
 	 * @return the default output directory for the specified launch
 	 * configuration's project
 	 * @since 2.1
@@ -2433,7 +2433,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns a collection of source containers corresponding to the given
 	 * resolved runtime classpath entries.
@@ -2448,7 +2448,7 @@
 	public static ISourceContainer[] getSourceContainers(IRuntimeClasspathEntry[] entries) {
 		return JavaSourceLookupUtil.translate(entries);
 	}
-	
+
 	/**
 	 * Returns a collection of paths that should be appended to the given project's
 	 * <code>java.library.path</code> system property when launched. Entries are
@@ -2465,10 +2465,10 @@
 	 * @see JavaRuntime#CLASSPATH_ATTR_LIBRARY_PATH_ENTRY
 	 */
 	public static String[] computeJavaLibraryPath(IJavaProject project, boolean requiredProjects) throws CoreException {
-		Set<IJavaProject> visited = new HashSet<IJavaProject>();
-		List<String> entries = new ArrayList<String>();
+		Set<IJavaProject> visited = new HashSet<>();
+		List<String> entries = new ArrayList<>();
 		gatherJavaLibraryPathEntries(project, requiredProjects, visited, entries);
-		List<String> resolved = new ArrayList<String>(entries.size());
+		List<String> resolved = new ArrayList<>(entries.size());
 		Iterator<String> iterator = entries.iterator();
 		IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
 		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
@@ -2495,7 +2495,7 @@
 	/**
 	 * Gathers all Java library entries for the given project and optionally its required
 	 * projects.
-	 * 
+	 *
 	 * @param project project to gather entries for
 	 * @param requiredProjects whether to consider required projects
 	 * @param visited projects already considered
@@ -2528,12 +2528,12 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Adds all java library path extra classpath entry values to the given entries collection
 	 * specified on the given project's classpath, and returns a collection of required
 	 * projects, or <code>null</code>.
-	 * 
+	 *
 	 * @param project project being processed
 	 * @param collectRequired whether to collect required projects
 	 * @param classpathEntries the project's raw classpath
@@ -2561,7 +2561,7 @@
 					IClasspathEntry[] requiredProjects = processJavaLibraryPathEntries(project, collectRequired, container.getClasspathEntries(), entries);
 					if (requiredProjects != null) {
 						if (req == null) {
-							req = new ArrayList<IClasspathEntry>();
+							req = new ArrayList<>();
 						}
 						for (int j = 0; j < requiredProjects.length; j++) {
 							req.add(requiredProjects[j]);
@@ -2570,7 +2570,7 @@
 				}
 			} else if (collectRequired && entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
 				if (req == null) {
-					req = new ArrayList<IClasspathEntry>();
+					req = new ArrayList<>();
 				}
 				req.add(entry);
 			}
@@ -2580,7 +2580,7 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Creates a new classpath attribute referencing a list of shared libraries that should
 	 * appear on the <code>-Djava.library.path</code> system property at runtime
@@ -2609,7 +2609,7 @@
 		}
 		return JavaCore.newClasspathAttribute(CLASSPATH_ATTR_LIBRARY_PATH_ENTRY, value.toString());
 	}
-	
+
 	/**
 	 * Returns an array of strings referencing shared libraries that should
 	 * appear on the <code>-Djava.library.path</code> system property at runtime
@@ -2638,21 +2638,21 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Returns the execution environments manager.
-	 * 
+	 *
 	 * @return execution environments manager
 	 * @since 3.2
 	 */
 	public static IExecutionEnvironmentsManager getExecutionEnvironmentsManager() {
 		return EnvironmentsManager.getDefault();
 	}
-	
+
 	/**
 	 * Perform VM type and VM install initialization. Does not hold locks
 	 * while performing change notification.
-	 * 
+	 *
 	 * @since 3.2
 	 */
 	private static void initializeVMs() {
@@ -2684,7 +2684,7 @@
 								LaunchingPlugin.log(status);
 							}
 						}
-						
+
 						// 3. if there are none, detect the eclipse runtime
 						if (vmDefs.getValidVMList().isEmpty()) {
 							// calling out to detectEclipseRuntime() could allow clients to change
@@ -2733,7 +2733,7 @@
 						}
 						fgDefaultVMId = vmDefs.getDefaultVMInstallCompositeID();
 						fgDefaultVMConnectorId = vmDefs.getDefaultVMInstallConnectorTypeID();
-						
+
 						// Create the underlying VMs for each valid VM
 						List<IVMInstall> vmList = vmDefs.getValidVMList();
 						Iterator<IVMInstall> vmListIterator = vmList.iterator();
@@ -2741,7 +2741,7 @@
 							VMStandin vmStandin = (VMStandin) vmListIterator.next();
 							vmStandin.convertToRealVM();
 						}
-						
+
 
 					} catch (IOException e) {
 						LaunchingPlugin.log(e);
@@ -2761,7 +2761,7 @@
 					fireVMAdded(installs[j]);
 				}
 			}
-			
+
 			// save settings if required
 			if (setPref) {
 				try {
@@ -2777,10 +2777,10 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Update compiler compliance settings based on the given VM.
-	 * 
+	 *
 	 * @param vm the backing {@link IVMInstall}
 	 */
 	private static void updateCompliance(IVMInstall vm) {
@@ -2823,12 +2823,12 @@
             }
         }
 	}
-	
+
 	/**
 	 * Creates a new VM based on the attributes specified in the given execution
 	 * environment description file. The format of the file is defined by
 	 * <code>http://wiki.eclipse.org/Execution_Environment_Descriptions</code>.
-	 * 
+	 *
 	 * @param eeFile VM definition file
 	 * @param name name for the VM, or <code>null</code> if a default name should be assigned
 	 * @param id id to assign to the new VM
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/LibraryLocation.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/LibraryLocation.java
index 6e0850a..7afabad 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/LibraryLocation.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/LibraryLocation.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
+ *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching
  *     	external annotations to a JRE container
  *******************************************************************************/
 package org.eclipse.jdt.launching;
@@ -33,55 +33,55 @@
 	private IPath fPackageRootPath;
 	private URL fJavadocLocation;
 	private URL fIndexLocation;
-	
+
 	/**
 	 * Creates a new library location.
-	 * 
+	 *
 	 * @param libraryPath	The location of the JAR containing java.lang.Object
 	 * 					Must not be <code>null</code>.
 	 * @param sourcePath	The location of the zip file containing the sources for <code>library</code>
 	 * 					Must not be <code>null</code> (Use Path.EMPTY instead)
 	 * @param packageRoot The path inside the <code>source</code> zip file where packages names
-	 * 					  begin. If the source for java.lang.Object source is found at 
-	 * 					  "src/java/lang/Object.java" in the zip file, the 
+	 * 					  begin. If the source for java.lang.Object source is found at
+	 * 					  "src/java/lang/Object.java" in the zip file, the
 	 * 					  packageRoot should be "src"
 	 * 					  Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT)
 	 * @throws	IllegalArgumentException	If the library path is <code>null</code>.
-	 */	
+	 */
 	public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot) {
 		this(libraryPath, sourcePath, packageRoot, null);
 	}
 
 	/**
 	 * Creates a new library location.
-	 * 
+	 *
 	 * @param libraryPath	The location of the JAR containing java.lang.Object
 	 * 					Must not be <code>null</code>.
 	 * @param sourcePath	The location of the zip file containing the sources for <code>library</code>
 	 * 					Must not be <code>null</code> (Use Path.EMPTY instead)
 	 * @param packageRoot The path inside the <code>source</code> zip file where packages names
-	 * 					  begin. If the source for java.lang.Object source is found at 
-	 * 					  "src/java/lang/Object.java" in the zip file, the 
+	 * 					  begin. If the source for java.lang.Object source is found at
+	 * 					  "src/java/lang/Object.java" in the zip file, the
 	 * 					  packageRoot should be "src"
 	 * 					  Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT)
 	 * @param javadocLocation The location of the javadoc for <code>library</code>
 	 * @throws	IllegalArgumentException	If the library path is <code>null</code>.
 	 * @since 3.1
-	 */	
+	 */
 	public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot, URL javadocLocation) {
 		this(libraryPath, sourcePath, packageRoot, javadocLocation, null, null);
 	}
 
 	/**
 	 * Creates a new library location.
-	 * 
+	 *
 	 * @param libraryPath	The location of the JAR containing java.lang.Object
 	 * 					Must not be <code>null</code>.
 	 * @param sourcePath	The location of the zip file containing the sources for <code>library</code>
 	 * 					Must not be <code>null</code> (Use Path.EMPTY instead)
 	 * @param packageRoot The path inside the <code>source</code> zip file where packages names
-	 * 					  begin. If the source for java.lang.Object source is found at 
-	 * 					  "src/java/lang/Object.java" in the zip file, the 
+	 * 					  begin. If the source for java.lang.Object source is found at
+	 * 					  "src/java/lang/Object.java" in the zip file, the
 	 * 					  packageRoot should be "src"
 	 * 					  Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT)
 	 * @param javadocLocation The location of the javadoc for <code>library</code>
@@ -91,18 +91,18 @@
 	 */
 	public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot, URL javadocLocation, URL indexLocation) {
 		this(libraryPath, sourcePath, packageRoot, javadocLocation, indexLocation, null);
-	}		
+	}
 
 	/**
 	 * Creates a new library location.
-	 * 
+	 *
 	 * @param libraryPath	The location of the JAR containing java.lang.Object
 	 * 					Must not be <code>null</code>.
 	 * @param sourcePath	The location of the zip file containing the sources for <code>library</code>
 	 * 					Must not be <code>null</code> (Use Path.EMPTY instead)
 	 * @param packageRoot The path inside the <code>source</code> zip file where packages names
-	 * 					  begin. If the source for java.lang.Object source is found at 
-	 * 					  "src/java/lang/Object.java" in the zip file, the 
+	 * 					  begin. If the source for java.lang.Object source is found at
+	 * 					  "src/java/lang/Object.java" in the zip file, the
 	 * 					  packageRoot should be "src"
 	 * 					  Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT)
 	 * @param javadocLocation The location of the javadoc for <code>library</code>
@@ -113,7 +113,7 @@
 	 */
 	public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot, URL javadocLocation, URL indexLocation, IPath externalAnnotations) {
 		if (libraryPath == null) {
-			throw new IllegalArgumentException(LaunchingMessages.libraryLocation_assert_libraryNotNull); 
+			throw new IllegalArgumentException(LaunchingMessages.libraryLocation_assert_libraryNotNull);
 		}
 		fSystemLibrary= libraryPath;
 		fSystemLibrarySource= sourcePath;
@@ -122,28 +122,28 @@
 		fIndexLocation = indexLocation;
 		fExternalAnnotations = externalAnnotations == null ? Path.EMPTY : externalAnnotations;
 	}
-	
+
 	/**
 	 * Returns the JRE library jar location.
-	 * 
+	 *
 	 * @return The JRE library jar location.
 	 */
 	public IPath getSystemLibraryPath() {
 		return fSystemLibrary;
 	}
-	
+
 	/**
 	 * Returns the JRE library source zip location.
-	 * 
+	 *
 	 * @return The JRE library source zip location.
 	 */
 	public IPath getSystemLibrarySourcePath() {
 		return fSystemLibrarySource;
-	}	
-	
+	}
+
 	/**
 	 * Return the JRE library external annotations location.
-	 * 
+	 *
 	 * @since 3.8
 	 * @return The file or directory holding external annotations, or Path.EMPTY if not applicable. This will never be null.
 	 */
@@ -153,16 +153,16 @@
 
 	/**
 	 * Returns the path to the default package in the sources zip file
-	 * 
+	 *
 	 * @return The path to the default package in the sources zip file.
 	 */
 	public IPath getPackageRootPath() {
 		return fPackageRootPath;
 	}
-	
+
 	/**
 	 * Returns the Javadoc location associated with this Library location.
-	 * 
+	 *
 	 * @return a {@link URL} pointing to the Javadoc location associated with
 	 * 	this Library location, or <code>null</code> if none
 	 * @since 3.1
@@ -170,10 +170,10 @@
 	public URL getJavadocLocation() {
 		return fJavadocLocation;
 	}
-	
+
 	/**
 	 * Returns the index location associated with this library location.
-	 * 
+	 *
 	 * @return a {@link URL} pointing to the index location associated with
 	 * 	this Library location, or <code>null</code> if none
 	 * @since 3.7
@@ -181,7 +181,7 @@
 	public URL getIndexLocation() {
 		return fIndexLocation;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
@@ -189,15 +189,15 @@
 	public boolean equals(Object obj) {
 		if (obj instanceof LibraryLocation) {
 			LibraryLocation lib = (LibraryLocation)obj;
-			return getSystemLibraryPath().equals(lib.getSystemLibraryPath()) 
+			return getSystemLibraryPath().equals(lib.getSystemLibraryPath())
 				&& equals(getSystemLibrarySourcePath(), lib.getSystemLibrarySourcePath())
 				&& equals(getExternalAnnotationsPath(), lib.getExternalAnnotationsPath())
 				&& equals(getPackageRootPath(), lib.getPackageRootPath())
 				&& LaunchingPlugin.sameURL(getJavadocLocation(), lib.getJavadocLocation());
-		} 
+		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#hashCode()
 	 */
@@ -205,7 +205,7 @@
 	public int hashCode() {
 		return getSystemLibraryPath().hashCode();
 	}
-	
+
 	/**
 	 * Returns whether the given paths are equal - either may be <code>null</code>.
 	 * @param path1 path to be compared
@@ -215,14 +215,14 @@
 	protected boolean equals(IPath path1, IPath path2) {
 		return equalsOrNull(path1, path2);
 	}
-	
+
 	/**
 	 * Returns whether the given objects are equal - either may be <code>null</code>.
 	 * @param o1 object to be compared
 	 * @param o2 object to be compared
 	 * @return whether the given objects are equal or both null
 	 * @since 3.1
-	 */	
+	 */
 	private boolean equalsOrNull(Object o1, Object o2) {
 		if (o1 == null) {
 			return o2 == null;
@@ -235,7 +235,7 @@
 
 	/**
 	 * Sets the JRE library source zip location.
-	 * 
+	 *
 	 * @param source the source to set
 	 * @since 3.4
 	 */
@@ -245,7 +245,7 @@
 
 	/**
 	 * Sets the index location to the given {@link URL}.
-	 * 
+	 *
 	 * @param indexLoc
 	 * @since 3.7
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/PropertyChangeEvent.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/PropertyChangeEvent.java
index 996e1c8..f69f1bc 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/PropertyChangeEvent.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/PropertyChangeEvent.java
@@ -24,7 +24,7 @@
  * @noextend This class is not intended to be subclassed by clients.
  */
 public class PropertyChangeEvent extends EventObject {
-    
+
     /**
      * All serializable objects should have a stable serialVersionUID
      */
@@ -34,28 +34,28 @@
 	 * The name of the changed property.
 	 */
 	private String propertyName;
-	
+
 	/**
 	 * The old value of the changed property, or <code>null</code> if
 	 * not known or not relevant.
 	 */
 	private Object oldValue;
-	
+
 	/**
 	 * The new value of the changed property, or <code>null</code> if
 	 * not known or not relevant.
 	 */
 	private Object newValue;
-	
+
 	/**
 	 * Creates a new property change event.
 	 *
 	 * @param source the object whose property has changed
-	 * @param property the property that has changed (must not be 
+	 * @param property the property that has changed (must not be
 	 *    <code>null</code>)
-	 * @param oldValue the old value of the property, or 
+	 * @param oldValue the old value of the property, or
 	 *    <code>null</code> if none
-	 * @param newValue the new value of the property, or 
+	 * @param newValue the new value of the property, or
 	 *    <code>null</code> if none
 	 */
 	public PropertyChangeEvent(
@@ -63,7 +63,7 @@
 		String property,
 		Object oldValue,
 		Object newValue) {
-	
+
 		super(source);
 		if (property == null) {
 			throw new IllegalArgumentException();
@@ -72,7 +72,7 @@
 		this.oldValue = oldValue;
 		this.newValue = newValue;
 	}
-	
+
 	/**
 	 * Returns the name of the property that changed.
 	 *
@@ -81,7 +81,7 @@
 	public String getProperty() {
 		return propertyName;
 	}
-	
+
 	/**
 	 * Returns the new value of the property.
 	 *
@@ -91,7 +91,7 @@
 	public Object getNewValue() {
 		return newValue;
 	}
-	
+
 	/**
 	 * Returns the old value of the property.
 	 *
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/SocketUtil.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/SocketUtil.java
index 3e9a4ea..46b0ce4 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/SocketUtil.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/SocketUtil.java
@@ -24,13 +24,13 @@
  */
 public class SocketUtil {
 	private static final Random fgRandom= new Random(System.currentTimeMillis());
-	
+
 	/**
 	 * Returns a free port number on the specified host within the given range,
 	 * or -1 if none found.
-	 * 
+	 *
 	 * @param host name or IP address of host on which to find a free port
-	 * @param searchFrom the port number from which to start searching 
+	 * @param searchFrom the port number from which to start searching
 	 * @param searchTo the port number at which to stop searching
 	 * @return a free port in the specified range, or -1 of none found
 	 * @deprecated Use <code>findFreePort()</code> instead. It is possible that this
@@ -46,26 +46,26 @@
 			} catch (ConnectException e) {
 				return port;
 			} catch (IOException e) {
-			} 
+			}
 		}
 		return -1;
 	}
-	
+
 	private static int getRandomPort(int low, int high) {
 		return (int)(fgRandom.nextFloat() * (high-low)) + low;
 	}
-	
+
 	/**
 	 * Returns a free port number on localhost, or -1 if unable to find a free port.
-	 * 
+	 *
 	 * @return a free port number on localhost, or -1 if unable to find a free port
 	 * @since 3.0
 	 */
 	public static int findFreePort() {
 		try (ServerSocket socket = new ServerSocket(0)) {
 			return socket.getLocalPort();
-		} catch (IOException e) { 
+		} catch (IOException e) {
 		}
-		return -1;		
-	}	
+		return -1;
+	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardClasspathProvider.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardClasspathProvider.java
index b1cd757..dbf7779 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardClasspathProvider.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardClasspathProvider.java
@@ -44,7 +44,7 @@
 				if (jreEntry == null) {
 					return new IRuntimeClasspathEntry[0];
 				}
-				return new IRuntimeClasspathEntry[]{jreEntry};				
+				return new IRuntimeClasspathEntry[]{jreEntry};
 			}
 			IRuntimeClasspathEntry[] entries = JavaRuntime.computeUnresolvedRuntimeClasspath(proj);
 			// replace project JRE with config's JRE
@@ -72,7 +72,7 @@
 	@Override
 	public IRuntimeClasspathEntry[] resolveClasspath(IRuntimeClasspathEntry[] entries, ILaunchConfiguration configuration) throws CoreException {
 		// use an ordered set to avoid duplicates
-		Set<IRuntimeClasspathEntry> all = new LinkedHashSet<IRuntimeClasspathEntry>(entries.length);
+		Set<IRuntimeClasspathEntry> all = new LinkedHashSet<>(entries.length);
 		for (int i = 0; i < entries.length; i++) {
 			IRuntimeClasspathEntry[] resolved =JavaRuntime.resolveRuntimeClasspathEntry(entries[i], configuration);
 			for (int j = 0; j < resolved.length; j++) {
@@ -81,12 +81,12 @@
 		}
 		return all.toArray(new IRuntimeClasspathEntry[all.size()]);
 	}
-	
+
 	/**
 	 * Returns a collection of runtime classpath entries that are defined in the
 	 * specified attribute of the given launch configuration. When present,
 	 * the attribute must contain a list of runtime classpath entry mementos.
-	 * 
+	 *
 	 * @param configuration launch configuration
 	 * @param attribute attribute name containing the list of entries
 	 * @return collection of runtime classpath entries that are defined in the
@@ -102,7 +102,7 @@
 			rtes[i] = JavaRuntime.newRuntimeClasspathEntry(iter.next());
 			i++;
 		}
-		return rtes;		
-	}	
+		return rtes;
+	}
 
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardSourcePathProvider.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardSourcePathProvider.java
index 77c96aa..0d32cfb 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardSourcePathProvider.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/StandardSourcePathProvider.java
@@ -35,7 +35,7 @@
  * @since 2.0
  */
 public class StandardSourcePathProvider extends StandardClasspathProvider {
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IRuntimeClasspathProvider#computeUnresolvedClasspath(org.eclipse.debug.core.ILaunchConfiguration)
 	 */
@@ -101,7 +101,7 @@
 
     /**
      * If the given entry is an archive, adds any archives referenced by the associated manifest.
-     * 
+     *
      * @param entry runtime classpath entry
      * @param all list to add references to
      */
@@ -144,10 +144,10 @@
     class UniqueList extends ArrayList<IRuntimeClasspathEntry> {
         private static final long serialVersionUID = -7402160651027036270L;
         HashSet<IRuntimeClasspathEntry> set;
-        
+
         public UniqueList(int length) {
             super(length);
-            set = new HashSet<IRuntimeClasspathEntry>(length);
+            set = new HashSet<>(length);
         }
 
         @Override
@@ -218,7 +218,7 @@
 				return super.set(index, element);
 			}
             return null; //should not happen.
-        }        
+        }
     }
 
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMRunnerConfiguration.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMRunnerConfiguration.java
index d749324..86037ae 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMRunnerConfiguration.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMRunnerConfiguration.java
@@ -11,7 +11,7 @@
 
 package org.eclipse.jdt.launching;
 
- 
+
 import java.util.Map;
 
 import org.eclipse.jdt.internal.launching.LaunchingMessages;
@@ -34,9 +34,9 @@
 	private String fWorkingDirectory;
 	private Map<String, Object> fVMSpecificAttributesMap;
 	private boolean fResume = true;
-	
+
 	private static final String[] fgEmpty= new String[0];
-	
+
 	/**
 	 * Creates a new configuration for launching a VM to run the given main class
 	 * using the given class path.
@@ -46,10 +46,10 @@
 	 */
 	public VMRunnerConfiguration(String classToLaunch, String[] classPath) {
 		if (classToLaunch == null) {
-			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_classNotNull); 
+			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_classNotNull);
 		}
 		if (classPath == null) {
-			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_classPathNotNull); 
+			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_classPathNotNull);
 		}
 		fClassToLaunch= classToLaunch;
 		fClassPath= classPath;
@@ -58,7 +58,7 @@
 	/**
 	 * Sets the <code>Map</code> that contains String name/value pairs that represent
 	 * VM-specific attributes.
-	 * 
+	 *
 	 * @param map the <code>Map</code> of VM-specific attributes.
 	 * @since 2.0
 	 */
@@ -67,7 +67,7 @@
 	}
 
 	/**
-	 * Sets the custom VM arguments. These arguments will be appended to the list of 
+	 * Sets the custom VM arguments. These arguments will be appended to the list of
 	 * VM arguments that a VM runner uses when launching a VM. Typically, these VM arguments
 	 * are set by the user.
 	 * These arguments will not be interpreted by a VM runner, the client is responsible for
@@ -77,31 +77,31 @@
 	 */
 	public void setVMArguments(String[] args) {
 		if (args == null) {
-			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_vmArgsNotNull); 
+			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_vmArgsNotNull);
 		}
 		fVMArgs= args;
 	}
-	
+
 	/**
-	 * Sets the custom program arguments. These arguments will be appended to the list of 
-	 * program arguments that a VM runner uses when launching a VM (in general: none). 
+	 * Sets the custom program arguments. These arguments will be appended to the list of
+	 * program arguments that a VM runner uses when launching a VM (in general: none).
 	 * Typically, these VM arguments are set by the user.
 	 * These arguments will not be interpreted by a VM runner, the client is responsible for
 	 * passing arguments compatible with a particular VM runner.
 	 *
-	 * @param args the list of arguments	
+	 * @param args the list of arguments
 	 */
 	public void setProgramArguments(String[] args) {
 		if (args == null) {
-			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_programArgsNotNull); 
+			throw new IllegalArgumentException(LaunchingMessages.vmRunnerConfig_assert_programArgsNotNull);
 		}
 		fProgramArgs= args;
 	}
-	
+
 	/**
 	 * Sets the environment for the Java program. The Java VM will be
 	 * launched in the given environment.
-	 * 
+	 *
 	 * @param environment the environment for the Java program specified as an array
 	 *  of strings, each element specifying an environment variable setting in the
 	 *  format <i>name</i>=<i>value</i>
@@ -110,9 +110,9 @@
 	public void setEnvironment(String[] environment) {
 		fEnvironment= environment;
 	}
-		
+
 	/**
-	 * Sets the boot classpath. Note that the boot classpath will be passed to the 
+	 * Sets the boot classpath. Note that the boot classpath will be passed to the
 	 * VM "as is". This means it has to be complete. Interpretation of the boot class path
 	 * is up to the VM runner this object is passed to.
 	 * <p>
@@ -128,18 +128,18 @@
 	public void setBootClassPath(String[] bootClassPath) {
 		fBootClassPath= bootClassPath;
 	}
-	
+
 	/**
 	 * Returns the <code>Map</code> that contains String name/value pairs that represent
 	 * VM-specific attributes.
-	 * 
+	 *
 	 * @return The <code>Map</code> of VM-specific attributes or <code>null</code>.
 	 * @since 2.0
 	 */
 	public Map<String, Object> getVMSpecificAttributesMap() {
 		return fVMSpecificAttributesMap;
 	}
-	
+
 	/**
 	 * Returns the name of the class to launch.
 	 *
@@ -148,7 +148,7 @@
 	public String getClassToLaunch() {
 		return fClassToLaunch;
 	}
-	
+
 	/**
 	 * Returns the classpath.
 	 *
@@ -157,14 +157,14 @@
 	public String[] getClassPath() {
 		return fClassPath;
 	}
-	
+
 	/**
 	 * Returns the boot classpath. An empty array indicates an empty
 	 * bootpath and <code>null</code> indicates a default bootpath.
 	 * <p>
 	 * In 3.0, support has been added for prepending and appending to the
 	 * boot classpath. The new attributes are stored in the VM specific
-	 * attributes map using the following keys defined in 
+	 * attributes map using the following keys defined in
 	 * <code>IJavaLaunchConfigurationConstants</code>:
 	 * <ul>
 	 * <li>ATTR_BOOTPATH_PREPEND</li>
@@ -193,7 +193,7 @@
 		}
 		return fVMArgs;
 	}
-	
+
 	/**
 	 * Returns the arguments to the Java program.
 	 *
@@ -206,20 +206,20 @@
 		}
 		return fProgramArgs;
 	}
-	
+
 	/**
 	 * Returns the environment for the Java program or <code>null</code>
-	 * 
+	 *
 	 * @return The Java program environment. Default is <code>null</code>
 	 * @since 3.0
 	 */
 	public String[] getEnvironment() {
 		return fEnvironment;
 	}
-	
+
 	/**
 	 * Sets the working directory for a launched VM.
-	 * 
+	 *
 	 * @param path the absolute path to the working directory
 	 *  to be used by a launched VM, or <code>null</code> if
 	 *  the default working directory is to be inherited from the
@@ -229,10 +229,10 @@
 	public void setWorkingDirectory(String path) {
 		fWorkingDirectory = path;
 	}
-	
+
 	/**
 	 * Returns the working directory of a launched VM.
-	 * 
+	 *
 	 * @return the absolute path to the working directory
 	 *  of a launched VM, or <code>null</code> if the working
 	 *  directory is inherited from the current process
@@ -240,24 +240,24 @@
 	 */
 	public String getWorkingDirectory() {
 		return fWorkingDirectory;
-	}	
-	
+	}
+
 	/**
 	 * Sets whether the VM is resumed on startup when launched in
 	 * debug mode. Has no effect when not in debug mode.
-	 *  
+	 *
 	 * @param resume whether to resume the VM on startup
 	 * @since 3.0
 	 */
 	public void setResumeOnStartup(boolean resume) {
 		fResume = resume;
 	}
-	
+
 	/**
 	 * Returns whether the VM is resumed on startup when launched
 	 * in debug mode. Has no effect when no in debug mode. Default
 	 * value is <code>true</code> for backwards compatibility.
-	 * 
+	 *
 	 * @return whether to resume the VM on startup
 	 * @since 3.0
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMStandin.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMStandin.java
index 407f3eb..12bc05d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMStandin.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/VMStandin.java
@@ -15,10 +15,10 @@
 import java.util.Map.Entry;
 
 /**
- * An implementation of IVMInstall that is used for manipulating VMs without necessarily 
+ * An implementation of IVMInstall that is used for manipulating VMs without necessarily
  * committing changes.
  * <p>
- * Instances of this class act like wrappers.  All other instances of IVMInstall represent 
+ * Instances of this class act like wrappers.  All other instances of IVMInstall represent
  * 'real live' VMs that may be used for building or launching.  Instances of this class
  * behave like 'temporary' VMs that are not visible and not available for building or launching.
  * </p>
@@ -32,12 +32,12 @@
  * <p>
  * Clients may instantiate this class.
  * </p>
- * 
+ *
  * @since 2.1
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class VMStandin extends AbstractVMInstall {
-    
+
     /**
      * <code>java.version</code> system property, or <code>null</code>
      * @since 3.1
@@ -51,11 +51,11 @@
 		super(type, id);
 		setNotify(false);
 	}
-	
+
 	/**
 	 * Constructs a copy of the specified VM with the given identifier.
-	 * 
-	 * @param sourceVM the original VM 
+	 *
+	 * @param sourceVM the original VM
 	 * @param id the new ID to use
 	 * @since 3.2
 	 */
@@ -64,12 +64,12 @@
 		setNotify(false);
 		init(sourceVM);
 	}
-	
+
 	/**
 	 * Construct a <code>VMStandin</code> instance based on the specified <code>IVMInstall</code>.
 	 * Changes to this stand-in will not be reflected in the 'real' VM until <code>convertToRealVM</code>
 	 * is called.
-	 * 
+	 *
 	 * @param realVM the 'real' VM from which to construct this stand-in VM
 	 */
 	public VMStandin(IVMInstall realVM) {
@@ -80,7 +80,7 @@
 	/**
 	 * Initializes the settings of this stand-in based on the settings in the given
 	 * VM install.
-	 * 
+	 *
 	 * @param realVM VM to copy settings from
 	 */
 	private void init(IVMInstall realVM) {
@@ -91,7 +91,7 @@
 		if (realVM instanceof IVMInstall2) {
 			IVMInstall2 vm2 = (IVMInstall2) realVM;
 			setVMArgs(vm2.getVMArgs());
-	        fJavaVersion = vm2.getJavaVersion();			
+	        fJavaVersion = vm2.getJavaVersion();
 		} else {
 			setVMArguments(realVM.getVMArguments());
 			fJavaVersion = null;
@@ -106,11 +106,11 @@
 			}
 		}
 	}
-	
+
 	/**
-	 * If no corresponding 'real' VM exists, create one and populate it from this stand-in instance. 
+	 * If no corresponding 'real' VM exists, create one and populate it from this stand-in instance.
 	 * If a corresponding VM exists, update its attributes from this stand-in instance.
-	 * 
+	 *
 	 * @return IVMInstall the 'real' corresponding to this stand-in VM
 	 */
 	@SuppressWarnings("deprecation")
@@ -118,7 +118,7 @@
 		IVMInstallType vmType= getVMInstallType();
 		IVMInstall realVM= vmType.findVMInstall(getId());
 		boolean notify = true;
-		
+
 		if (realVM == null) {
 			realVM= vmType.createVMInstall(getId());
 			notify = false;
@@ -137,7 +137,7 @@
 		} else {
 			realVM.setVMArguments(getVMArguments());
 		}
-		
+
 		if (realVM instanceof AbstractVMInstall) {
 			AbstractVMInstall avm = (AbstractVMInstall) realVM;
 			Iterator<Entry<String, String>> iterator = getAttributes().entrySet().iterator();
@@ -146,13 +146,13 @@
 				avm.setAttribute(entry.getKey(), entry.getValue());
 			}
 			avm.setNotify(true);
-		}		
+		}
 		if (!notify) {
 			JavaRuntime.fireVMAdded(realVM);
 		}
 		return realVM;
 	}
-		
+
     /* (non-Javadoc)
      * @see org.eclipse.jdt.launching.IVMInstall#getJavaVersion()
      */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/CompatibleEnvironment.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/CompatibleEnvironment.java
index 9ec8920..ecfb182 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/CompatibleEnvironment.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/CompatibleEnvironment.java
@@ -32,11 +32,11 @@
 
 	private IExecutionEnvironment fEnvironment;
 	private boolean fIsStrictlyCompatible;
-	
+
 	/**
 	 * Constructs a new compatible environment result from an execution environment
 	 * analysis.
-	 * 
+	 *
 	 * @param environment the environment a vm install is compatible with
 	 * @param strict whether the vm install is strictly compatible with the
 	 *  environment or represents a superset of the environment
@@ -45,23 +45,23 @@
 		fEnvironment = environment;
 		fIsStrictlyCompatible = strict;
 	}
-	
+
 	/**
 	 * Returns an environment compatible with the vm being analyzed.
-	 *  
+	 *
 	 * @return compatible execution environment
 	 */
 	public IExecutionEnvironment getCompatibleEnvironment() {
 		return fEnvironment;
 	}
-	
+
 	/**
 	 * Returns whether the analyzed vm install is strictly compatible with the compatible
 	 * environment or represents a superset of the environment. Returning <code>true</code>
 	 * indicates the analyzed vm install is strictly contained within the environment. Returning
 	 * <code>false</code> indicates that the analyzed vm install represents more a superset of
 	 * the environment.
-	 * 
+	 *
 	 * @return whether the analyzed vm install is strictly contained within the environment
 	 */
 	public boolean isStrictlyCompatbile() {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/ExecutionEnvironmentDescription.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/ExecutionEnvironmentDescription.java
index 1786f17..eb08641 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/ExecutionEnvironmentDescription.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/ExecutionEnvironmentDescription.java
@@ -46,7 +46,7 @@
  * files. An execution environment description file can be used to define attributes relevant
  * the launching of a specific JRE configuration. The format of the file is defined by
  * code>http://wiki.eclipse.org/Execution_Environment_Descriptions</code>.
- * 
+ *
  * @since 3.5
  */
 public final class ExecutionEnvironmentDescription {
@@ -57,13 +57,13 @@
 	public static final String ENDORSED_DIRS = "-Dee.endorsed.dirs";  //$NON-NLS-1$
 	/**
 	 * Boot class path property name in an execution environment description file.
-	 */	
+	 */
 	public static final String BOOT_CLASS_PATH = "-Dee.bootclasspath";  //$NON-NLS-1$
 	/**
 	 * Source archive property name in an execution environment description file.
 	 * Value is a path. When present, the source attachment for each library in the boot
 	 * class path will be the file specified by this property.
-	 */	
+	 */
 	public static final String SOURCE_DEFAULT = "-Dee.src";  //$NON-NLS-1$
 	/**
 	 * Source map property name in an execution environment description file.
@@ -76,7 +76,7 @@
 	 * wild card replacement in the <code>libPath</code>. In this case the wild card characters in the
 	 * <code>sourcePath</code> must exist in the same order as the <code>libPath</code>.
 	 * For example, <code>lib/foo*.???=source/src*foo.???</code>.
-	 * </p> 
+	 * </p>
 	 */
 	public static final String SOURCE_MAP = "-Dee.src.map";  //$NON-NLS-1$
 	/**
@@ -93,10 +93,10 @@
 	 * Pre-built index location property in an execution environment description file.
 	 * <p>
 	 * Specifies the location for a pre-built search index. Must be a valid {@link URL}.
-	 * 
+	 *
 	 * You can use <code>${ee.home}</code> and <code>'..'</code> segments to specify a file location
 	 * relative to the ee file.
-	 * 
+	 *
 	 * If this property is not specified the default value of <code>null</code> will be used.
 	 * </p>
 	 * @since 3.7
@@ -143,10 +143,10 @@
 	/**
 	 * Debug arguments property name in an execution environment description file.
 	 * <p>
-	 * The arguments to use to launch the VM in debug mode. For example 
+	 * The arguments to use to launch the VM in debug mode. For example
 	 * <code>"-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:${port}"</code>.
 	 * The <code>${port}</code> variable will be substituted with a free port at launch time.
-	 * When unspecified, default arguments are constructed based on the language level of the VM. 
+	 * When unspecified, default arguments are constructed based on the language level of the VM.
 	 * </p>
 	 */
 	public static final String DEBUG_ARGS = "-Dee.debug.args";  //$NON-NLS-1$
@@ -156,101 +156,101 @@
 	 * The name is used as the JRE name when installing an EE JRE into Eclipse.
 	 * </p>
 	 */
-	public static final String EE_NAME = "-Dee.name";  //$NON-NLS-1$	
+	public static final String EE_NAME = "-Dee.name";  //$NON-NLS-1$
 	/**
 	 * The directory containing the execution environment description file. Relative paths are resolved
 	 * relative to this location. This property will be set if not present, it does not need to be
 	 * specified in the file.
 	 */
 	public static final String EE_HOME = "-Dee.home"; //$NON-NLS-1$
-	
+
 	/**
 	 * Substitution in EE file - replaced with directory of EE file,
 	 * to support absolute path names where needed. If the value is not in the
 	 * file, it is set when properties are created.
 	 */
-	private static final String VAR_EE_HOME = "${ee.home}"; //$NON-NLS-1$	
-	
+	private static final String VAR_EE_HOME = "${ee.home}"; //$NON-NLS-1$
+
 	/**
 	 * Any line found in the description starting with this string will not be added to the
 	 * VM argument list
 	 */
-	private static final String EE_ARG_FILTER = "-Dee."; //$NON-NLS-1$	
-	
+	private static final String EE_ARG_FILTER = "-Dee."; //$NON-NLS-1$
+
 	// Regex constants for handling the source mapping
 	private static final Character WILDCARD_SINGLE_CHAR = new Character('?');
 	private static final Character WILDCARD_MULTI_CHAR = new Character('*');
-	private static final String REGEX_SPECIAL_CHARS = "+()^$.{}[]|\\"; //$NON-NLS-1$	
-	
+	private static final String REGEX_SPECIAL_CHARS = "+()^$.{}[]|\\"; //$NON-NLS-1$
+
 	/**
 	 * Execution environment description properties
 	 */
 	private Map<String, String> fProperties = null;
-	
+
 	/**
 	 * Creates an execution environment description based on the properties defined in the given
 	 * execution environment description file. The format of the file is defined by
 	 * <code>http://wiki.eclipse.org/Execution_Environment_Descriptions</code>.
-	 * 
+	 *
 	 * @param eeFile execution environment description file
 	 * @throws CoreException if unable to read or parse the file
 	 */
 	public ExecutionEnvironmentDescription(File eeFile) throws CoreException {
 		initProperties(eeFile);
 	}
-	
+
 	/**
 	 * Returns a map of properties defined in this execution environment description.
 	 * Properties in the file that do not have a value assigned to them are returned in the keys
 	 * with an empty string as the value. Variable substitutions for <code>${ee.home}</code>
 	 * have already been performed when resolving property values.
-	 * 
+	 *
 	 * @return properties as a map of {@link String} keys and values
 	 */
 	public Map<String, String> getProperties() {
 		return fProperties;
 	}
-	
+
 	/**
 	 * Returns the specified property from this description, or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param property property name
 	 * @return property value or <code>null</code>
 	 */
 	public String getProperty(String property) {
 		return fProperties.get(property);
 	}
-	
+
 	/**
 	 * Returns the location of the system libraries defined in this execution environment.
 	 * Libraries are generated from the endorsed directories, boot class path, additional
 	 * directories, and extension directories specified by this description and are returned
 	 * in that order. Source attachments are configured based on <code>src</code> and
 	 * <code>src.map</code> properties.
-	 * 
+	 *
 	 * @return library locations, possibly empty
-	 */	
+	 */
 	public LibraryLocation[] getLibraryLocations() {
-		List<LibraryLocation> allLibs = new ArrayList<LibraryLocation>(); 
-		
+		List<LibraryLocation> allLibs = new ArrayList<>();
+
 		String dirs = getProperty(ENDORSED_DIRS);
 		if (dirs != null) {
 			// Add all endorsed libraries - they are first, as they replace
 			allLibs.addAll(StandardVMType.gatherAllLibraries(resolvePaths(dirs)));
 		}
-		
+
 		// next is the boot path libraries
 		dirs = getProperty(BOOT_CLASS_PATH);
 		if (dirs != null) {
 			String[] bootpath = resolvePaths(dirs);
-			List<LibraryLocation> boot = new ArrayList<LibraryLocation>(bootpath.length);
+			List<LibraryLocation> boot = new ArrayList<>(bootpath.length);
 			IPath src = getSourceLocation();
 			URL url = getJavadocLocation();
 			URL indexurl = getIndexLocation();
 			for (int i = 0; i < bootpath.length; i++) {
 				IPath path = new Path(bootpath[i]);
-				File lib = path.toFile(); 
+				File lib = path.toFile();
 				if (lib.exists() && lib.isFile()) {
 					LibraryLocation libraryLocation = new LibraryLocation(path,	src, Path.EMPTY, url, indexurl);
 					boot.add(libraryLocation);
@@ -258,22 +258,22 @@
 			}
 			allLibs.addAll(boot);
 		}
-		
+
 		// Add all additional libraries
 		dirs = getProperty(ADDITIONAL_DIRS);
 		if (dirs != null) {
 			allLibs.addAll(StandardVMType.gatherAllLibraries(resolvePaths(dirs)));
 		}
-				
+
 		// Add all extension libraries
 		dirs = getProperty(EXTENSION_DIRS);
 		if (dirs != null) {
 			allLibs.addAll(StandardVMType.gatherAllLibraries(resolvePaths(dirs)));
 		}
-		
-		
+
+
 		//remove duplicates
-		HashSet<String> set = new HashSet<String>();
+		HashSet<String> set = new HashSet<>();
 		LibraryLocation lib = null;
 		for(ListIterator<LibraryLocation> liter = allLibs.listIterator(); liter.hasNext();) {
 			lib = liter.next();
@@ -282,19 +282,19 @@
 				liter.remove();
 			}
 		}
-		
+
 		// If the ee.src.map property is specified, use it to associate source locations with the libraries
 		addSourceLocationsToLibraries(getSourceMap(), allLibs);
-		
+
 		return allLibs.toArray(new LibraryLocation[allLibs.size()]);
 	}
-	
+
 	/**
 	 * Returns VM arguments in this description or <code>null</code> if none. VM arguments
 	 * correspond to all properties in this description that do not begin with "-Dee."
 	 * concatenated together with spaces. Any single VM argument that contains spaces
 	 * itself is surrounded with quotes.
-	 * 
+	 *
 	 * @return VM arguments or <code>null</code> if none
 	 */
 	public String getVMArguments() {
@@ -324,14 +324,14 @@
 		}
 		return arguments.toString();
 	}
-	
+
 	/**
 	 * Returns the executable for this description as a file or <code>null</code> if
 	 * not specified.
-	 * 
+	 *
 	 * @return standard (non-console) executable or <code>null</code> if none
 	 */
-	public File getExecutable() { 
+	public File getExecutable() {
 		String property = getProperty(ExecutionEnvironmentDescription.EXECUTABLE);
 		if (property != null) {
 			String[] paths = resolvePaths(property);
@@ -340,15 +340,15 @@
 			}
 		}
 		return null;
-	}	
-	
+	}
+
 	/**
 	 * Returns the console executable for this description as a file or <code>null</code> if
 	 * not specified.
-	 * 
+	 *
 	 * @return console executable or <code>null</code> if none
 	 */
-	public File getConsoleExecutable() { 
+	public File getConsoleExecutable() {
 		String property = getProperty(ExecutionEnvironmentDescription.EXECUTABLE_CONSOLE);
 		if (property != null) {
 			String[] paths = resolvePaths(property);
@@ -358,16 +358,16 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Initializes the properties in the given execution environment
 	 * description file.
-	 * 
+	 *
 	 * @param eeFile the EE file
 	 * @exception CoreException if unable to read the file
 	 */
 	private void initProperties(File eeFile) throws CoreException {
-		Map<String, String> properties = new LinkedHashMap<String, String>();
+		Map<String, String> properties = new LinkedHashMap<>();
 		String eeHome = eeFile.getParentFile().getAbsolutePath();
 		try (FileReader reader = new FileReader(eeFile); BufferedReader bufferedReader = new BufferedReader(reader);) {
 			String line = bufferedReader.readLine();
@@ -402,7 +402,7 @@
 		// resolve things with ${ee.home} in them
 		fProperties = properties; // needs to be done to resolve
 		Iterator<Entry<String, String>> entries = properties.entrySet().iterator();
-		Map<String, String> resolved = new LinkedHashMap<String, String>(properties.size()); 
+		Map<String, String> resolved = new LinkedHashMap<>(properties.size());
 		while (entries.hasNext()) {
 			Entry<String, String> entry = entries.next();
 			String key = entry.getKey();
@@ -415,12 +415,12 @@
 			}
 		}
 		fProperties = resolved;
-	}	
-	
+	}
+
 	/**
 	 * Replaces and returns a string with all occurrences of
 	 * "${ee.home} replaced with its value.
-	 * 
+	 *
 	 * @param value string to process
 	 * @return resolved string
 	 */
@@ -443,12 +443,12 @@
 			return replaced.toString();
 		}
 		return value;
-	}	
-	
+	}
+
 	/**
 	 * Returns all path strings contained in the given string based on system
 	 * path delimiter, resolved relative to the <code>${ee.home}</code> property.
-	 * 
+	 *
 	 * @param paths the paths to resolve
 	 * @return array of individual paths
 	 */
@@ -461,12 +461,12 @@
 		}
 		return strings;
 	}
-	
+
 	/**
 	 * Returns a string representing the absolute form of the given path.  If the
 	 * given path is not absolute, it is appended to the given root path.  The returned
 	 * path will always be the OS specific string form of the path.
-	 * 
+	 *
 	 * @param pathString string representing the path to make absolute
 	 * @param root root to append non-absolute paths to
 	 * @return absolute, OS specific path
@@ -478,13 +478,13 @@
 			return filePath.toOSString();
 		}
 		return path.toOSString();
-	}	
-	
+	}
+
 	/**
 	 * Creates a map (regex string to regex string) mapping library locations to their
 	 * source locations.  This is done by taking the ee.src.map property from the ee file
 	 * which allows a list of mappings that can use the wildcards ? (any one char) and *
-	 * (any series of chars).  The property is converted to a map of regex strings used by 
+	 * (any series of chars).  The property is converted to a map of regex strings used by
 	 * {@link #addSourceLocationsToLibraries(Map, List)}.
 	 * <pre>
 	 * Example property, separated onto separate lines for easier reading
@@ -493,13 +493,13 @@
 	 *              ${ee.home}\lib\jclDEE\*.zip=lib\jclDEE\source\*-src.zip;
 	 *              ${ee.home}\lib\jclDEE\ext\*.???=lib\jclDEE\source\*-src.???;
 	 * </pre>
-	 * 
-	 * 
+	 *
+	 *
 	 * @return map containing regexs mapping library locations to their source locations
 	 */
 	private Map<String, String> getSourceMap(){
 		String srcMapString = getProperty(SOURCE_MAP);
-		Map<String, String> srcMap = new HashMap<String, String>();
+		Map<String, String> srcMap = new HashMap<>();
 		if (srcMapString != null){
 			// Entries must be separated by the file separator and have an equals splitting the lib location from the src location
 			String[] entries = srcMapString.split(File.pathSeparator);
@@ -511,8 +511,8 @@
 					String value = entries[i].substring(index+1);
 					key = makePathAbsolute(key, root);
 					value = makePathAbsolute(value, root);
-					
-					List<Character> wildcards = new ArrayList<Character>();
+
+					List<Character> wildcards = new ArrayList<>();
 					StringBuffer keyBuffer = new StringBuffer();
 				    char [] chars = key.toCharArray();
 				    // Convert lib location to a regex, replace wildcards with grouped equivalents, keep track of used wildcards, allow '\' and '/' to be used, escape special chars
@@ -529,7 +529,7 @@
 						    keyBuffer.append(chars[j]);
 						}
 					}
-					
+
 					int currentWild = 0;
 					StringBuffer valueBuffer = new StringBuffer();
 					chars = value.toCharArray();
@@ -555,22 +555,22 @@
 							valueBuffer.append(chars[j]);
 						}
 					}
-					
+
 					srcMap.put(keyBuffer.toString(), valueBuffer.toString());
-					
+
 				} else {
 					LaunchingPlugin.log(NLS.bind(LaunchingMessages.EEVMType_6, new String[]{entries[i]}));
 				}
 			}
 		}
 		return srcMap;
-	}	
+	}
 
 	/**
 	 * Uses the given src map to find source libraries that are associated with the
 	 * library locations in the list.  The library locations are updated with the
 	 * found source path.
-	 * 
+	 *
 	 * @param srcMap mapping of library location regexs to source location regexs
 	 * @param libraries list of {@link LibraryLocation} objects to update with source locations
 	 * @see #getSourceMap()
@@ -592,16 +592,16 @@
 					if (sourcePath.toFile().exists()){
 						currentLibrary.setSystemLibrarySource(sourcePath);
 					}
-					
+
 				}
 			}
 		}
-	}	
-	
+	}
+
 	/**
 	 * Returns the location of the default source archive for this description or the empty
 	 * path if none.
-	 * 
+	 *
 	 * @return default source archive location or Path.EMPTY if none
 	 */
 	private IPath getSourceLocation() {
@@ -612,21 +612,21 @@
 			return new Path(src);
 		}
 		return Path.EMPTY;
-	}		
-	
+	}
+
 	/**
 	 * Returns the javadoc location or <code>null</code> if unable to determine one.
 	 * A default one is generated if not present, based on language level.
-	 * 
+	 *
 	 * @return javadoc location or <code>null</code> if none
 	 */
 	private URL getJavadocLocation() {
 		return EEVMType.getJavadocLocation(fProperties);
-	}		
-	
+	}
+
 	/**
 	 * Returns the {@link URL} for the index location or <code>null</code> if one has not been set.
-	 * 
+	 *
 	 * @return the index {@link URL} or <code>null</code>
 	 * @since 3.7.0
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IAccessRuleParticipant.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IAccessRuleParticipant.java
index 6ffe8e6..b43037b 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IAccessRuleParticipant.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IAccessRuleParticipant.java
@@ -17,7 +17,7 @@
 
 /**
  * Contributes access rules for an execution environment. Contributed with
- * an execution environments extension. 
+ * an execution environments extension.
  * <p>
  * Clients contributing an access rule participant may implement this interface.
  * </p>
@@ -30,10 +30,10 @@
 	 * libraries and execution environment in the context of the given project.
 	 * An array of access rules is returned for each library specified by
 	 * <code>libraries</code>, possibly empty.
-	 * 
+	 *
 	 * @param environment the environment that access rules are requested for
 	 * @param vm the vm that access rules are requested for
-	 * @param libraries the libraries that access rules are requested for 
+	 * @param libraries the libraries that access rules are requested for
 	 * @param project the project the access rules are requested for or <code>null</code> if none
 	 * @return a collection of arrays of access rules - one array per library, possibly empty
 	 * @since 3.3
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironment.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironment.java
index a35befa..cfbdb50 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironment.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironment.java
@@ -36,60 +36,60 @@
  * @noextend This interface is not intended to be extended by clients.
  */
 public interface IExecutionEnvironment {
-	
+
 	/**
 	 * Returns a unique identifier for this execution environment.
 	 * Corresponds to the <code>id</code> attribute in plug-in XML.
-	 * 
+	 *
 	 * @return unique identifier of this execution environment
 	 */
 	public String getId();
-	
+
 	/**
 	 * Returns a brief human-readable description of this environment.
-	 * 
+	 *
 	 * @return brief human-readable description of this environment.
 	 */
 	public String getDescription();
-	
+
 	/**
 	 * Returns a collection of VM installs compatible with this environment,
 	 * possibly empty.
-	 * 
+	 *
 	 * @return a collection of VM installs compatible with this environment,
 	 *  possibly empty.
 	 */
 	public IVMInstall[] getCompatibleVMs();
-	
+
 	/**
-	 * Returns whether the specified VM install is strictly compatible with 
+	 * Returns whether the specified VM install is strictly compatible with
 	 * this environment. Returns <code>true</code> to indicate the VM install
 	 * is strictly compatible with this environment and <code>false</code> to indicate
 	 * the VM install represents a superset of this environment.
-	 * 
+	 *
 	 * @param vm VM install
 	 * @return whether the VM install is strictly compatible with this environment
 	 */
 	public boolean isStrictlyCompatible(IVMInstall vm);
-	
+
 	/**
 	 * Returns the VM that is used by default for this execution environment,
 	 * or <code>null</code> if none.
-	 * 
+	 *
 	 * @return default VM for this environment or <code>null</code> if none
 	 */
 	public IVMInstall getDefaultVM();
-	
+
 	/**
 	 * Sets the VM to use by default for this execution environment.
-	 * 
+	 *
 	 * @param vm VM to use by default for this execution environment,
 	 *  or <code>null</code> to clear the default setting
 	 * @exception IllegalArgumentException if the given VM is not compatible with
 	 *  this environment
 	 */
 	public void setDefaultVM(IVMInstall vm);
-	
+
 	/**
 	 * Returns a collection of access rules to be applied to the specified VM
 	 * libraries for this execution environment in the context of the given project.
@@ -101,37 +101,37 @@
 	 * extension.
 	 * </p>
 	 * @param vm the VM that access rules are requested for
-	 * @param libraries the libraries that access rules are requested for 
+	 * @param libraries the libraries that access rules are requested for
 	 * @param project the project the access rules are requested for or <code>null</code> if none
 	 * @return a collection of arrays of access rules - one array per library
 	 * @since 3.3
 	 */
 	public IAccessRule[][] getAccessRules(IVMInstall vm, LibraryLocation[] libraries, IJavaProject project);
-	
+
 	/**
 	 * Returns the OSGi profile properties associated with this execution environment
 	 * or <code>null</code> if none. Profile properties specify attributes such as
 	 * {@link org.osgi.framework.Constants#FRAMEWORK_SYSTEMPACKAGES}. Profile properties
-	 * can be optionally contributed with an execution environment extension.  
-	 * 
+	 * can be optionally contributed with an execution environment extension.
+	 *
 	 * @return associated profile properties or <code>null</code> if none
 	 * @since 3.5
 	 */
 	public Properties getProfileProperties();
-	
+
 	/**
 	 * Returns a collection of execution environments that are subsets of this environment.
-	 * 
+	 *
 	 * @return a collection of execution environments that are subsets of this environment
 	 * @since 3.5
 	 */
 	public IExecutionEnvironment[] getSubEnvironments();
-	
+
 	/**
 	 * Returns a map of Eclipse Java compiler options specified as default settings to
 	 * use when building with this profile, or <code>null</code> if unspecified.
-	 * 
-	 * @return a map of Eclipse Java compiler options associated with this profile or 
+	 *
+	 * @return a map of Eclipse Java compiler options associated with this profile or
 	 * 	<code>null</code>
 	 * @since 3.5
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentAnalyzerDelegate.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentAnalyzerDelegate.java
index b02e09e..7908b8b 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentAnalyzerDelegate.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentAnalyzerDelegate.java
@@ -18,7 +18,7 @@
  * Analyzes vm installs for compatibility with execution environments.
  * <p>
  * An execution environment analyzer delegate is contributed in plug-in XML via
- * the <code>org.eclipse.jdt.launching.executionEnvironments</code> 
+ * the <code>org.eclipse.jdt.launching.executionEnvironments</code>
  * extension point.
  * </p>
  * <p>
@@ -27,11 +27,11 @@
  * @since 3.2
  */
 public interface IExecutionEnvironmentAnalyzerDelegate {
-	
+
 	/**
 	 * Analyzes the given vm install and returns a collection of compatible
 	 * execution environments, possibly empty.
-	 * 
+	 *
 	 * @param vm vm install to analyze
 	 * @param monitor progress monitor
 	 * @return compatible execution environments, possibly empty
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentsManager.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentsManager.java
index d3ff4cf..01f5011 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentsManager.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/environments/IExecutionEnvironmentsManager.java
@@ -21,21 +21,21 @@
 public interface IExecutionEnvironmentsManager {
 
 	/**
-	 * Returns all registered execution environments sorted by their id. 
-	 * 
+	 * Returns all registered execution environments sorted by their id.
+	 *
 	 * @see IExecutionEnvironment#getId()
-	 * 
+	 *
 	 * @return all registered execution environments sorted by their id
 	 */
 	public IExecutionEnvironment[] getExecutionEnvironments();
-	
+
 	/**
 	 * Returns the execution environment associated with the given
 	 * identifier or <code>null</code> if none.
-	 * 
-	 * @param id execution environment identifier 
+	 *
+	 * @param id execution environment identifier
 	 * @return execution environment or <code>null</code>
 	 */
 	public IExecutionEnvironment getEnvironment(String id);
-		
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ArchiveSourceLocation.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ArchiveSourceLocation.java
index 58139f9..d244b93 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ArchiveSourceLocation.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ArchiveSourceLocation.java
@@ -39,7 +39,7 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
- 
+
 /**
  * Locates source elements in an archive (zip) in the local file system. Returns
  * instances of <code>ZipEntryStorage</code>.
@@ -61,16 +61,16 @@
  */
 @Deprecated
 public class ArchiveSourceLocation extends PlatformObject implements IJavaSourceLocation {
-	
+
 	/**
 	 * Cache of shared zip files. Zip files are closed
 	 * when the launching plug-in is shutdown.
 	 */
-	private static HashMap<String, ZipFile> fZipFileCache = new HashMap<String, ZipFile>(5);
+	private static HashMap<String, ZipFile> fZipFileCache = new HashMap<>(5);
 
 	/**
 	 * Returns a zip file with the given name
-	 * 
+	 *
 	 * @param name zip file name
 	 * @return The zip file with the given name
 	 * @exception IOException if unable to create the specified zip
@@ -86,7 +86,7 @@
 			return zip;
 		}
 	}
-	
+
 	/**
 	 * Closes all zip files that have been opened,
 	 * and removes them from the zip file cache.
@@ -109,33 +109,33 @@
 			fZipFileCache.clear();
 		}
 	}
-	
+
 	/**
 	 * The root source folder in the archive
 	 */
 	private IPath fRootPath;
-	
+
 	/**
 	 * Whether the root path has been detected (or set)
 	 */
 	private boolean fRootDetected = false;
-	
+
 	/**
 	 * The name of the archive
 	 */
 	private String fName;
 
 	/**
-	 * Constructs a new empty source location to be initialized with 
+	 * Constructs a new empty source location to be initialized with
 	 * a memento.
 	 */
 	public ArchiveSourceLocation() {
 	}
-		
+
 	/**
 	 * Constructs a new source location that will retrieve source
 	 * elements from the zip file with the given name.
-	 * 
+	 *
 	 * @param archiveName zip file
 	 * @param sourceRoot a path to the root source folder in the
 	 *  specified archive, or <code>null</code> if the root source folder
@@ -146,7 +146,7 @@
 		setName(archiveName);
 		setRootPath(sourceRoot);
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#findSourceElement(java.lang.String)
 	 */
@@ -156,7 +156,7 @@
 			if (getArchive() == null) {
 				return null;
 			}
-			
+
 			boolean possibleInnerType = false;
 			String pathStr= name.replace('.', '/');
 			int lastSlash = pathStr.lastIndexOf('/');
@@ -166,7 +166,7 @@
 				autoDetectRoot(entryPath);
 				if (getRootPath() != null) {
 					entryPath = getRootPath().append(entryPath);
-				}				
+				}
 				ZipEntry entry = getArchive().getEntry(entryPath.toString());
 				if (entry != null) {
 					return new ZipEntryStorage(getArchive(), entry);
@@ -177,18 +177,18 @@
 					possibleInnerType = true;
 				} else {
 					possibleInnerType = false;
-				}						
-			} while (possibleInnerType);						
+				}
+			} while (possibleInnerType);
 			return null;
 		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, 
-				NLS.bind(LaunchingMessages.ArchiveSourceLocation_Unable_to_locate_source_element_in_archive__0__1, new String[] {getName()}), e)); 
+			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR,
+				NLS.bind(LaunchingMessages.ArchiveSourceLocation_Unable_to_locate_source_element_in_archive__0__1, new String[] {getName()}), e));
 		}
 	}
-	
+
 	/**
 	 * Automatically detect the root path, if required.
-	 * 
+	 *
 	 * @param path source file name, excluding root path
 	 * @throws CoreException  if unable to detect the root path for this source archive
 	 */
@@ -198,8 +198,8 @@
 			try {
 				zip = getArchive();
 			} catch (IOException e) {
-				throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, 
-					NLS.bind(LaunchingMessages.ArchiveSourceLocation_Exception_occurred_while_detecting_root_source_directory_in_archive__0__1, new String[] {getName()}), e)); 
+				throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR,
+					NLS.bind(LaunchingMessages.ArchiveSourceLocation_Exception_occurred_while_detecting_root_source_directory_in_archive__0__1, new String[] {getName()}), e));
 			}
 			synchronized (zip) {
 				Enumeration<? extends ZipEntry> entries = zip.entries();
@@ -219,8 +219,8 @@
 						}
 					}
 				} catch (IllegalStateException e) {
-					throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, 
-						NLS.bind(LaunchingMessages.ArchiveSourceLocation_Exception_occurred_while_detecting_root_source_directory_in_archive__0__2, new String[] {getName()}), e)); 
+					throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR,
+						NLS.bind(LaunchingMessages.ArchiveSourceLocation_Exception_occurred_while_detecting_root_source_directory_in_archive__0__2, new String[] {getName()}), e));
 				}
 			}
 		}
@@ -229,7 +229,7 @@
 	/**
 	 * Returns the archive associated with this source
 	 * location.
-	 * 
+	 *
 	 * @return zip file
 	 * @throws IOException if unable to create the zip
 	 * 	file associated with this location
@@ -237,12 +237,12 @@
 	protected ZipFile getArchive() throws IOException {
 		return getZipFile(getName());
 	}
-	
+
 	/**
 	 * Sets the location of the root source folder within
 	 * the archive, or <code>null</code> if the root source
 	 * folder is the root of the archive
-	 * 
+	 *
 	 * @param path the location of the root source folder within
 	 * the archive, or <code>null</code> if the root source
 	 * folder is the root of the archive
@@ -255,59 +255,59 @@
 			fRootDetected = true;
 		}
 	}
-	
+
 	/**
 	 * Returns the location of the root source folder within
 	 * the archive, or <code>null</code> if the root source
 	 * folder is the root of the archive
-	 * 
+	 *
 	 * @return the location of the root source folder within
 	 * the archive, or <code>null</code> if the root source
 	 * folder is the root of the archive
 	 */
 	public IPath getRootPath() {
 		return fRootPath;
-	}	
-	
+	}
+
 	/**
-	 * Returns the name of the archive associated with this 
+	 * Returns the name of the archive associated with this
 	 * source location
-	 * 
+	 *
 	 * @return the name of the archive associated with this
 	 *  source location
 	 */
 	public String getName() {
 		return fName;
 	}
-	
+
 	/**
-	 * Sets the name of the archive associated with this 
+	 * Sets the name of the archive associated with this
 	 * source location
-	 * 
+	 *
 	 * @param name the name of the archive associated with this
 	 *  source location
 	 */
 	private void setName(String name) {
 		fName = name;
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
-	public boolean equals(Object object) {		
+	public boolean equals(Object object) {
 		return object instanceof ArchiveSourceLocation &&
 			 getName().equals(((ArchiveSourceLocation)object).getName());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#hashCode()
 	 */
 	@Override
 	public int hashCode() {
 		return getName().hashCode();
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#getMemento()
 	 */
@@ -320,8 +320,8 @@
 		if (getRootPath() != null) {
 			node.setAttribute("rootPath", getRootPath().toString()); //$NON-NLS-1$
 		}
-	
-		return DebugPlugin.serializeDocument(doc); 
+
+		return DebugPlugin.serializeDocument(doc);
 	}
 
 	/* (non-Javadoc)
@@ -337,35 +337,35 @@
 			StringReader reader = new StringReader(memento);
 			InputSource source = new InputSource(reader);
 			root = parser.parse(source).getDocumentElement();
-												
+
 			String path = root.getAttribute("archivePath"); //$NON-NLS-1$
 			if (isEmpty(path)) {
-				abort(LaunchingMessages.ArchiveSourceLocation_Unable_to_initialize_source_location___missing_archive_path__3, null); 
+				abort(LaunchingMessages.ArchiveSourceLocation_Unable_to_initialize_source_location___missing_archive_path__3, null);
 			}
 			String rootPath = root.getAttribute("rootPath"); //$NON-NLS-1$
-			
+
 			setName(path);
 			setRootPath(rootPath);
 			return;
 		} catch (ParserConfigurationException e) {
-			ex = e;			
+			ex = e;
 		} catch (SAXException e) {
 			ex = e;
 		} catch (IOException e) {
 			ex = e;
 		}
-		abort(LaunchingMessages.ArchiveSourceLocation_Exception_occurred_initializing_source_location__5, ex);		 
+		abort(LaunchingMessages.ArchiveSourceLocation_Exception_occurred_initializing_source_location__5, ex);
 	}
 
 	private boolean isEmpty(String string) {
 		return string == null || string.length() == 0;
 	}
-	
+
 	/*
 	 * Throws an internal error exception
 	 */
 	private void abort(String message, Throwable e)	throws CoreException {
 		IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
-		throw new CoreException(s);		
-	}	
+		throw new CoreException(s);
+	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/DirectorySourceLocation.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/DirectorySourceLocation.java
index a489f89..bd8ce5d 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/DirectorySourceLocation.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/DirectorySourceLocation.java
@@ -34,7 +34,7 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
- 
+
 /**
  * Locates source elements in a directory in the local
  * file system. Returns instances of <code>LocalFileStorage</code>.
@@ -60,24 +60,24 @@
 	 * The directory associated with this source location
 	 */
 	private File fDirectory;
-	
+
 	/**
 	 * Constructs a new empty source location to be initialized from
 	 * a memento.
 	 */
 	public DirectorySourceLocation() {
 	}
-		
+
 	/**
 	 * Constructs a new source location that will retrieve source
 	 * elements from the given directory.
-	 * 
+	 *
 	 * @param directory a directory
 	 */
 	public DirectorySourceLocation(File directory) {
 		setDirectory(directory);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#findSourceElement(java.lang.String)
 	 */
@@ -86,7 +86,7 @@
 		if (getDirectory() == null) {
 			return null;
 		}
-		
+
 		String pathStr= name.replace('.', '/');
 		int lastSlash = pathStr.lastIndexOf('/');
 		try {
@@ -105,8 +105,8 @@
 					possibleInnerType = true;
 				} else {
 					possibleInnerType = false;
-				}						
-			} while (possibleInnerType);			
+				}
+			} while (possibleInnerType);
 		} catch (IOException e) {
 			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), e.getMessage(), e));
 		}
@@ -116,40 +116,40 @@
 	/**
 	 * Sets the directory in which source elements will
 	 * be searched for.
-	 * 
+	 *
 	 * @param directory a directory
 	 */
 	private void setDirectory(File directory) {
 		fDirectory = directory;
 	}
-	
+
 	/**
 	 * Returns the directory associated with this source
 	 * location.
-	 * 
+	 *
 	 * @return directory
 	 */
 	public File getDirectory() {
 		return fDirectory;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
-	public boolean equals(Object object) {		
+	public boolean equals(Object object) {
 		return object instanceof DirectorySourceLocation &&
 			 getDirectory().equals(((DirectorySourceLocation)object).getDirectory());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#hashCode()
 	 */
 	@Override
 	public int hashCode() {
 		return getDirectory().hashCode();
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#getMemento()
 	 */
@@ -176,38 +176,38 @@
 			StringReader reader = new StringReader(memento);
 			InputSource source = new InputSource(reader);
 			root = parser.parse(source).getDocumentElement();
-												
+
 			String path = root.getAttribute("path"); //$NON-NLS-1$
 			if (isEmpty(path)) {
-				abort(LaunchingMessages.DirectorySourceLocation_Unable_to_initialize_source_location___missing_directory_path_3, null); 
+				abort(LaunchingMessages.DirectorySourceLocation_Unable_to_initialize_source_location___missing_directory_path_3, null);
 			} else {
 				File dir = new File(path);
 				if (dir.exists() && dir.isDirectory()) {
 					setDirectory(dir);
 				} else {
-					abort(NLS.bind(LaunchingMessages.DirectorySourceLocation_Unable_to_initialize_source_location___directory_does_not_exist___0__4, new String[] {path}), null); 
+					abort(NLS.bind(LaunchingMessages.DirectorySourceLocation_Unable_to_initialize_source_location___directory_does_not_exist___0__4, new String[] {path}), null);
 				}
 			}
 			return;
 		} catch (ParserConfigurationException e) {
-			ex = e;			
+			ex = e;
 		} catch (SAXException e) {
 			ex = e;
 		} catch (IOException e) {
 			ex = e;
 		}
-		abort(LaunchingMessages.DirectorySourceLocation_Exception_occurred_initializing_source_location__5, ex);		 
+		abort(LaunchingMessages.DirectorySourceLocation_Exception_occurred_initializing_source_location__5, ex);
 	}
 
 	private boolean isEmpty(String string) {
 		return string == null || string.length() == 0;
 	}
-	
+
 	/*
 	 * Throws an internal error exception
 	 */
 	private void abort(String message, Throwable e)	throws CoreException {
 		IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
-		throw new CoreException(s);		
+		throw new CoreException(s);
 	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/IJavaSourceLocation.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/IJavaSourceLocation.java
index 348eccb..0cc7ab5 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/IJavaSourceLocation.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/IJavaSourceLocation.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,7 +13,7 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
- 
+
 /**
  * A repository of source code. A source location is capable of retrieving
  * source elements.
@@ -36,17 +36,17 @@
  */
 @Deprecated
 public interface IJavaSourceLocation extends IAdaptable {
-	
+
 	/**
 	 * Returns an object representing the source code
 	 * for a type with the specified name, or <code>null</code>
 	 * if none could be found. The name is
 	 * a fully qualified type name, and may contain the '$'
 	 * character when referring to inner types. For example,
-	 * <code>java.lang.String</code>. The source element 
+	 * <code>java.lang.String</code>. The source element
 	 * returned is implementation specific - for example, a
 	 * resource, a local file, a zip file entry, etc.
-	 * 
+	 *
 	 * @param name fully qualified name of the type for which
 	 * 		source is being searched for
 	 * @return source element
@@ -54,19 +54,19 @@
 	 *  for the specified source element
 	 */
 	public Object findSourceElement(String name) throws CoreException;
-	
+
 	/**
 	 * Returns a memento for this source location from which this
 	 * source location can be reconstructed.
-	 * 
+	 *
 	 * @return a memento for this source location
 	 * @exception CoreException if unable to create a memento
 	 */
 	public String getMemento() throws CoreException;
-	
+
 	/**
 	 * Initializes this source location from the given memento.
-	 * 
+	 *
 	 * @param memento a memento generated by this source location
 	 * @exception CoreException if unable to initialize this source
 	 * 	location
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaProjectSourceLocation.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaProjectSourceLocation.java
index 0c09de3..9ad9b51 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaProjectSourceLocation.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaProjectSourceLocation.java
@@ -38,7 +38,7 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
- 
+
 /**
  * Locates source elements in all source folders of the
  * given Java project. Returns instances of <code>ICompilationUnit</code>
@@ -55,7 +55,7 @@
  *  See the following packages: <code>org.eclipse.debug.core.sourcelookup</code>
  *  and <code>org.eclipse.debug.core.sourcelookup.containers</code>. This class
  *  has been replaced by
- *  <code>org.eclipse.jdt.launching.sourcelookup.containers.JavaProjectSourceContainer</code>. 
+ *  <code>org.eclipse.jdt.launching.sourcelookup.containers.JavaProjectSourceContainer</code>.
  * @noextend This class is not intended to be sub-classed by clients.
  */
 @Deprecated
@@ -65,29 +65,29 @@
 	 * The project associated with this source location
 	 */
 	private IJavaProject fProject;
-	
+
 	/**
 	 * Corresponding package fragment root locations.
 	 */
 	private IJavaSourceLocation[] fRootLocations = null;
-	
+
 	/**
 	 * Constructs a new empty source location to be initialized
 	 * by a memento.
 	 */
 	public JavaProjectSourceLocation() {
 	}
-	
+
 	/**
 	 * Constructs a new source location that will retrieve source
 	 * elements from the given Java project.
-	 * 
+	 *
 	 * @param project Java project
 	 */
 	public JavaProjectSourceLocation(IJavaProject project) {
 		setJavaProject(project);
-	}	
-	
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#findSourceElement(java.lang.String)
 	 */
@@ -107,7 +107,7 @@
 	/**
 	 * Sets the Java project in which source elements will
 	 * be searched for.
-	 * 
+	 *
 	 * @param project Java project
 	 */
 	private void setJavaProject(IJavaProject project) {
@@ -116,8 +116,8 @@
 		if (fProject != null) {
 			try {
 				IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();
-				ArrayList<PackageFragmentRootSourceLocation> list = new ArrayList<PackageFragmentRootSourceLocation>(roots.length);
-				
+				ArrayList<PackageFragmentRootSourceLocation> list = new ArrayList<>(roots.length);
+
 				for (int i = 0; i < roots.length; i++) {
 					if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
 						list.add(new PackageFragmentRootSourceLocation(roots[i]));
@@ -129,26 +129,26 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Returns the Java project associated with this source
 	 * location.
-	 * 
+	 *
 	 * @return Java project
 	 */
 	public IJavaProject getJavaProject() {
 		return fProject;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
-	public boolean equals(Object object) {		
+	public boolean equals(Object object) {
 		return object instanceof JavaProjectSourceLocation &&
 			 getJavaProject().equals(((JavaProjectSourceLocation)object).getJavaProject());
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#hashCode()
 	 */
@@ -156,7 +156,7 @@
 	public int hashCode() {
 		return getJavaProject().hashCode();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#getMemento()
 	 */
@@ -166,7 +166,7 @@
 		Element node = doc.createElement("javaProjectSourceLocation"); //$NON-NLS-1$
 		doc.appendChild(node);
 		node.setAttribute("name", getJavaProject().getElementName()); //$NON-NLS-1$
-		return DebugPlugin.serializeDocument(doc);  
+		return DebugPlugin.serializeDocument(doc);
 	}
 
 	/* (non-Javadoc)
@@ -182,35 +182,35 @@
 			StringReader reader = new StringReader(memento);
 			InputSource source = new InputSource(reader);
 			root = parser.parse(source).getDocumentElement();
-												
+
 			String name = root.getAttribute("name"); //$NON-NLS-1$
 			if (isEmpty(name)) {
-				abort(LaunchingMessages.JavaProjectSourceLocation_Unable_to_initialize_source_location___missing_project_name_3, null); 
+				abort(LaunchingMessages.JavaProjectSourceLocation_Unable_to_initialize_source_location___missing_project_name_3, null);
 			} else {
 				IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
 				setJavaProject(JavaCore.create(proj));
 			}
 			return;
 		} catch (ParserConfigurationException e) {
-			ex = e;			
+			ex = e;
 		} catch (SAXException e) {
 			ex = e;
 		} catch (IOException e) {
 			ex = e;
 		}
-		abort(LaunchingMessages.JavaProjectSourceLocation_Exception_occurred_initializing_source_location__4, ex); 
+		abort(LaunchingMessages.JavaProjectSourceLocation_Exception_occurred_initializing_source_location__4, ex);
 	}
 
 	private boolean isEmpty(String string) {
 		return string == null || string.length() == 0;
 	}
-	
+
 	/*
 	 * Throws an internal error exception
 	 */
 	private void abort(String message, Throwable e)	throws CoreException {
 		IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
-		throw new CoreException(s);		
+		throw new CoreException(s);
 	}
 
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaSourceLocator.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaSourceLocator.java
index 6e533d8..692a3d9 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaSourceLocator.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/JavaSourceLocator.java
@@ -92,12 +92,12 @@
  *  attribute (if present), or a default source lookup path based on a configuration's
  *  runtime classpath. This class has been replaced by the Java source lookup
  *  director which is an internal class, but can be used via the
- *  <code>sourceLocatorId</code> attribute on a launch configuration type extension.  
+ *  <code>sourceLocatorId</code> attribute on a launch configuration type extension.
  * @noextend This class is not intended to be sub-classed by clients.
  */
 @Deprecated
 public class JavaSourceLocator implements IPersistableSourceLocator {
-	
+
 	/**
 	 * Identifier for the 'Java Source Locator' extension
 	 * (value <code>"org.eclipse.jdt.launching.javaSourceLocator"</code>).
@@ -115,19 +115,19 @@
 	public JavaSourceLocator() {
 		setSourceLocations(new IJavaSourceLocation[0]);
 	}
-	
+
 	/**
 	 * Constructs a new Java source locator that looks in the
 	 * specified project for source, and required projects, if
 	 * <code>includeRequired</code> is <code>true</code>.
-	 * 
+	 *
 	 * @param projects the projects in which to look for source
 	 * @param includeRequired whether to look in required projects
 	 * 	as well
 	 * @throws CoreException if a new locator fails to be created
 	 */
 	public JavaSourceLocator(IJavaProject[] projects, boolean includeRequired) throws CoreException {
-		ArrayList<IJavaProject> requiredProjects = new ArrayList<IJavaProject>();
+		ArrayList<IJavaProject> requiredProjects = new ArrayList<>();
 		for (int i= 0; i < projects.length; i++) {
 			if (includeRequired) {
 				collectRequiredProjects(projects[i], requiredProjects);
@@ -137,10 +137,10 @@
 				}
 			}
 		}
-		
+
 		// only add external entries with the same location once
-		HashMap<IPath, IPath> external = new HashMap<IPath, IPath>();
-		ArrayList<PackageFragmentRootSourceLocation> list = new ArrayList<PackageFragmentRootSourceLocation>();
+		HashMap<IPath, IPath> external = new HashMap<>();
+		ArrayList<PackageFragmentRootSourceLocation> list = new ArrayList<>();
 		// compute the default locations for each project, and add unique ones
 		Iterator<IJavaProject> iter = requiredProjects.iterator();
 		while (iter.hasNext()) {
@@ -160,57 +160,57 @@
 		}
 		IJavaSourceLocation[] locations = list.toArray(new IJavaSourceLocation[list.size()]);
 		setSourceLocations(locations);
-	}	
-	
+	}
+
 	/**
 	 * Constructs a new JavaSourceLocator that searches the
 	 * specified set of source locations for source elements.
-	 * 
+	 *
 	 * @param locations the source locations to search for
 	 *  source, in the order they should be searched
 	 */
 	public JavaSourceLocator(IJavaSourceLocation[] locations) {
 		setSourceLocations(locations);
 	}
-	
+
 	/**
 	 * Constructs a new JavaSourceLocator that searches the
 	 * default set of source locations for the given Java project.
-	 * 
+	 *
 	 * @param project Java project
 	 * @exception CoreException if an exception occurs reading
 	 *  the classpath of the given or any required project
 	 */
 	public JavaSourceLocator(IJavaProject project) throws CoreException {
 		setSourceLocations(getDefaultSourceLocations(project));
-	}	
-	
+	}
+
 	/**
 	 * Sets the locations that will be searched, in the order
 	 * to be searched.
-	 * 
+	 *
 	 * @param locations the locations that will be searched, in the order
 	 *  to be searched
 	 */
 	public void setSourceLocations(IJavaSourceLocation[] locations) {
 		fLocations = locations;
 	}
-	
+
 	/**
 	 * Returns the locations that this source locator is currently
 	 * searching, in the order that they are searched.
-	 * 
+	 *
 	 * @return the locations that this source locator is currently
 	 * searching, in the order that they are searched
 	 */
 	public IJavaSourceLocation[] getSourceLocations() {
 		return fLocations;
 	}
-	
+
 	/**
 	 * Returns all source elements that correspond to the type associated with
 	 * the given stack frame, or <code>null</code> if none.
-	 * 
+	 *
 	 * @param stackFrame stack frame
 	 * @return all source elements that correspond to the type associated with
 	 * the given stack frame, or <code>null</code> if none
@@ -232,7 +232,7 @@
 				}
 				return null;
 			}
-			List<Object> list = new ArrayList<Object>();
+			List<Object> list = new ArrayList<>();
 			IJavaSourceLocation[] locations = getSourceLocations();
 			for (int i = 0; i < locations.length; i++) {
 				try {
@@ -248,8 +248,8 @@
 			return list.toArray();
 		}
 		return null;
-	}	
-			
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
 	 */
@@ -285,7 +285,7 @@
 		}
 		return null;
 	}
-	
+
 	private String getFullyQualfiedName(IJavaStackFrame frame) throws CoreException {
 		String name = null;
 		if (frame.isObsolete()) {
@@ -299,7 +299,7 @@
 			// build source name from debug attributes using
 			// the source file name and the package of the declaring
 			// type
-					
+
 			// @see bug# 21518 - remove absolute path prefix
 			int index = sourceName.lastIndexOf('\\');
 			if (index == -1) {
@@ -308,7 +308,7 @@
 			if (index >= 0) {
 				sourceName = sourceName.substring(index + 1);
 			}
-					
+
 			String declName= frame.getDeclaringTypeName();
 			index = declName.lastIndexOf('.');
 			if (index >= 0) {
@@ -319,15 +319,15 @@
 			index = sourceName.lastIndexOf('.');
 			if (index >= 0) {
 				name += sourceName.substring(0, index) ;
-			}					
+			}
 		}
-		return name;		
+		return name;
 	}
-	
+
 	/**
 	 * Adds all projects required by <code>proj</code> to the list
 	 * <code>res</code>
-	 * 
+	 *
 	 * @param proj the project for which to compute required
 	 *  projects
 	 * @param res the list to add all required projects too
@@ -336,9 +336,9 @@
 	protected static void collectRequiredProjects(IJavaProject proj, ArrayList<IJavaProject> res) throws JavaModelException {
 		if (!res.contains(proj)) {
 			res.add(proj);
-			
+
 			IJavaModel model= proj.getJavaModel();
-			
+
 			IClasspathEntry[] entries= proj.getRawClasspath();
 			for (int i= 0; i < entries.length; i++) {
 				IClasspathEntry curr= entries[i];
@@ -350,13 +350,13 @@
 				}
 			}
 		}
-	}	
-	
+	}
+
 	/**
 	 * Returns a default collection of source locations for
 	 * the given Java project. Default source locations consist
 	 * of the given project and all of its required projects .
-	 * 
+	 *
 	 * @param project Java project
 	 * @return a collection of source locations for all required
 	 *  projects
@@ -372,7 +372,7 @@
 		locator.initializeDefaults(config);
 		return locator.getSourceLocations();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
 	 */
@@ -381,7 +381,7 @@
 		Document doc = DebugPlugin.newDocument();
 		Element node = doc.createElement("javaSourceLocator"); //$NON-NLS-1$
 		doc.appendChild(node);
-		
+
 		IJavaSourceLocation[] locations = getSourceLocations();
 		for (int i = 0; i < locations.length; i++) {
 			Element child = doc.createElement("javaSourceLocation"); //$NON-NLS-1$
@@ -389,7 +389,7 @@
 			child.setAttribute("memento", locations[i].getMemento()); //$NON-NLS-1$
 			node.appendChild(child);
 		}
-		return DebugPlugin.serializeDocument(doc); 
+		return DebugPlugin.serializeDocument(doc);
 	}
 
 	/* (non-Javadoc)
@@ -416,14 +416,14 @@
 			StringReader reader = new StringReader(memento);
 			InputSource source = new InputSource(reader);
 			root = parser.parse(source).getDocumentElement();
-												
+
 			if (!root.getNodeName().equalsIgnoreCase("javaSourceLocator")) {  //$NON-NLS-1$
-				abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_Java_source_locator___invalid_format__6, null); 
+				abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_Java_source_locator___invalid_format__6, null);
 			}
-	
-			List<IJavaSourceLocation> sourceLocations = new ArrayList<IJavaSourceLocation>();
-			Bundle bundle = LaunchingPlugin.getDefault().getBundle(); 
-			
+
+			List<IJavaSourceLocation> sourceLocations = new ArrayList<>();
+			Bundle bundle = LaunchingPlugin.getDefault().getBundle();
+
 			NodeList list = root.getChildNodes();
 			int length = list.getLength();
 			for (int i = 0; i < length; ++i) {
@@ -435,42 +435,42 @@
 						String className = entry.getAttribute("class"); //$NON-NLS-1$
 						String data = entry.getAttribute("memento"); //$NON-NLS-1$
 						if (isEmpty(className)) {
-							abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_Java_source_locator___invalid_format__10, null); 
+							abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_Java_source_locator___invalid_format__10, null);
 						}
 						Class<?> clazz  = null;
 						try {
 							clazz = bundle.loadClass(className);
 						} catch (ClassNotFoundException e) {
-							abort(NLS.bind(LaunchingMessages.JavaSourceLocator_Unable_to_restore_source_location___class_not_found___0__11, new String[] {className}), e); 
+							abort(NLS.bind(LaunchingMessages.JavaSourceLocator_Unable_to_restore_source_location___class_not_found___0__11, new String[] {className}), e);
 						}
-						
+
 						IJavaSourceLocation location = null;
 						try {
 							location = (IJavaSourceLocation)clazz.newInstance();
 						} catch (IllegalAccessException e) {
-							abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_source_location__12, e); 
+							abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_source_location__12, e);
 						} catch (InstantiationException e) {
-							abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_source_location__12, e); 
+							abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_source_location__12, e);
 						}
 						location.initializeFrom(data);
 						sourceLocations.add(location);
 					} else {
-						abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_Java_source_locator___invalid_format__14, null); 
+						abort(LaunchingMessages.JavaSourceLocator_Unable_to_restore_Java_source_locator___invalid_format__14, null);
 					}
 				}
 			}
 			setSourceLocations(sourceLocations.toArray(new IJavaSourceLocation[sourceLocations.size()]));
 			return;
 		} catch (ParserConfigurationException e) {
-			ex = e;			
+			ex = e;
 		} catch (SAXException e) {
 			ex = e;
 		} catch (IOException e) {
 			ex = e;
 		}
-		abort(LaunchingMessages.JavaSourceLocator_Exception_occurred_initializing_source_locator__15, ex); 
+		abort(LaunchingMessages.JavaSourceLocator_Exception_occurred_initializing_source_locator__15, ex);
 	}
-	
+
 	/**
 	 * Returns source locations that are associated with the given runtime classpath
 	 * entries.
@@ -478,7 +478,7 @@
 	 * @return the array of {@link IJavaSourceLocation}
 	 */
 	private static IJavaSourceLocation[] getSourceLocations(IRuntimeClasspathEntry[] entries) {
-		List<IJavaSourceLocation> locations = new ArrayList<IJavaSourceLocation>(entries.length);
+		List<IJavaSourceLocation> locations = new ArrayList<>(entries.length);
 		for (int i = 0; i < entries.length; i++) {
 			IRuntimeClasspathEntry entry = entries[i];
 			IJavaSourceLocation location = null;
@@ -517,34 +517,34 @@
 					}
 					break;
 				case IRuntimeClasspathEntry.CONTAINER:
-					throw new IllegalArgumentException(LaunchingMessages.JavaSourceLocator_Illegal_to_have_a_container_resolved_to_a_container_1); 
+					throw new IllegalArgumentException(LaunchingMessages.JavaSourceLocator_Illegal_to_have_a_container_resolved_to_a_container_1);
 			}
 			if (location != null) {
 				locations.add(location);
 			}
 		}
-		return locations.toArray(new IJavaSourceLocation[locations.size()]);		
+		return locations.toArray(new IJavaSourceLocation[locations.size()]);
 	}
-	
+
 	private boolean isEmpty(String string) {
 		return string == null || string.length() == 0;
 	}
-	
+
 	/**
 	 * Throws an internal error exception
 	 * @param message the message
 	 * @param e the error
-	 * @throws CoreException the new {@link CoreException} 
+	 * @throws CoreException the new {@link CoreException}
 	 */
 	private void abort(String message, Throwable e)	throws CoreException {
 		IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
-		throw new CoreException(s);		
-	}	
-	
+		throw new CoreException(s);
+	}
+
 	/**
 	 * Returns whether the given objects are equal, allowing
 	 * for <code>null</code>.
-	 * 
+	 *
 	 * @param a the first item
 	 * @param b the item to compare
 	 * @return whether the given objects are equal, allowing
@@ -559,11 +559,11 @@
 		}
 		return a.equals(b);
 	}
-	
+
 	/**
 	 * Returns whether the source attachments of the given package fragment
 	 * root and runtime classpath entry are equal.
-	 * 
+	 *
 	 * @param root package fragment root
 	 * @param entry runtime classpath entry
 	 * @return whether the source attachments of the given package fragment
@@ -573,19 +573,19 @@
 	private static boolean isSourceAttachmentEqual(IPackageFragmentRoot root, IRuntimeClasspathEntry entry) throws JavaModelException {
 		return equalOrNull(root.getSourceAttachmentPath(), entry.getSourceAttachmentPath());
 	}
-	
+
 	/**
 	 * Determines if the given archive runtime classpath entry exists
 	 * in the workspace as a package fragment root. Returns the associated
 	 * package fragment root source location if possible, otherwise
 	 * <code>null</code>.
-	 *  
+	 *
 	 * @param entry archive runtime classpath entry
 	 * @return IJavaSourceLocation or <code>null</code>
 	 */
 	private static IJavaSourceLocation getArchiveSourceLocation(IRuntimeClasspathEntry entry) {
 		IResource resource = entry.getResource();
-		if (resource == null) { 
+		if (resource == null) {
 			// Check all package fragment roots for case of external archive.
 			// External jars are shared, so it does not matter which project it
 			// originates from
@@ -600,7 +600,7 @@
 							if (isSourceAttachmentEqual(root, entry)) {
 								// use package fragment root
 								return new PackageFragmentRootSourceLocation(root);
-							}							
+							}
 						}
 					}
 				}
@@ -638,15 +638,15 @@
 							if (isSourceAttachmentEqual(root, entry)) {
 								// use package fragment root
 								return new PackageFragmentRootSourceLocation(root);
-							}							
+							}
 						}
 					}
 				}
 			} catch (JavaModelException e) {
 				LaunchingPlugin.log(e);
-			}		
-		}		
+			}
+		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/LocalFileStorage.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/LocalFileStorage.java
index 6ade9f0..fa20dac 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/LocalFileStorage.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/LocalFileStorage.java
@@ -28,14 +28,14 @@
  */
 @Deprecated
 public class LocalFileStorage extends org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage {
-	
+
 	/**
 	 * Constructs and returns storage for the given file.
-	 * 
+	 *
 	 * @param file a local file
 	 */
 	public LocalFileStorage(File file){
 		super(file);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/PackageFragmentRootSourceLocation.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/PackageFragmentRootSourceLocation.java
index ffb2bbb..1eabc9c 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/PackageFragmentRootSourceLocation.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/PackageFragmentRootSourceLocation.java
@@ -59,21 +59,21 @@
  */
 @Deprecated
 public class PackageFragmentRootSourceLocation extends PlatformObject implements IJavaSourceLocation {
-	
+
 	/**
-	 * Associated package fragment root 
+	 * Associated package fragment root
 	 */
 	private IPackageFragmentRoot fRoot = null;
-	
+
 	/**
 	 * Creates an empty source location.
 	 */
 	public PackageFragmentRootSourceLocation() {
-	}	
-	
+	}
+
 	/**
 	 * Creates a source location on the given package fragment root.
-	 * 
+	 *
 	 * @param root package fragment root
 	 */
 	public PackageFragmentRootSourceLocation(IPackageFragmentRoot root) {
@@ -102,18 +102,18 @@
 					ICompilationUnit cu = pkg.getCompilationUnit(typeName + ".java"); //$NON-NLS-1$
 					if (cu.exists()) {
 						return cu;
-					} 
+					}
 					IClassFile cf = pkg.getClassFile(typeName + ".class"); //$NON-NLS-1$
 					if (cf.exists()) {
 						return cf;
-					}				
+					}
 					index = typeName.lastIndexOf('$');
 					if (index >= 0) {
 						typeName = typeName.substring(0, index);
 						possibleInnerType = true;
 					} else {
 						possibleInnerType = false;
-					}						
+					}
 				} while (possibleInnerType);
 			}
 		}
@@ -133,7 +133,7 @@
 			handle = getPackageFragmentRoot().getHandleIdentifier();
 		}
 		node.setAttribute("handleId", handle); //$NON-NLS-1$
-		return DebugPlugin.serializeDocument(doc); 
+		return DebugPlugin.serializeDocument(doc);
 	}
 
 	/* (non-Javadoc)
@@ -150,10 +150,10 @@
 			StringReader reader = new StringReader(memento);
 			InputSource source = new InputSource(reader);
 			root = parser.parse(source).getDocumentElement();
-												
+
 			String handle = root.getAttribute("handleId"); //$NON-NLS-1$
 			if (handle == null) {
-				abort(LaunchingMessages.PackageFragmentRootSourceLocation_Unable_to_initialize_source_location___missing_handle_identifier_for_package_fragment_root__6, null); 
+				abort(LaunchingMessages.PackageFragmentRootSourceLocation_Unable_to_initialize_source_location___missing_handle_identifier_for_package_fragment_root__6, null);
 			} else {
 				if (handle.length() == 0) {
 					// empty package fragment
@@ -163,25 +163,25 @@
 					if (element instanceof IPackageFragmentRoot) {
 						setPackageFragmentRoot((IPackageFragmentRoot)element);
 					} else {
-						abort(LaunchingMessages.PackageFragmentRootSourceLocation_Unable_to_initialize_source_location___package_fragment_root_does_not_exist__7, null); 
+						abort(LaunchingMessages.PackageFragmentRootSourceLocation_Unable_to_initialize_source_location___package_fragment_root_does_not_exist__7, null);
 					}
 				}
 			}
 			return;
 		} catch (ParserConfigurationException e) {
-			ex = e;			
+			ex = e;
 		} catch (SAXException e) {
 			ex = e;
 		} catch (IOException e) {
 			ex = e;
 		}
-		abort(LaunchingMessages.PackageFragmentRootSourceLocation_Exception_occurred_initializing_source_location__8, ex); 
+		abort(LaunchingMessages.PackageFragmentRootSourceLocation_Exception_occurred_initializing_source_location__8, ex);
 	}
 
 	/**
 	 * Returns the package fragment root associated with this
 	 * source location, or <code>null</code> if none
-	 * 
+	 *
 	 * @return the package fragment root associated with this
 	 *  source location, or <code>null</code> if none
 	 */
@@ -192,36 +192,36 @@
 	/**
 	 * Sets the package fragment root associated with this
 	 * source location.
-	 * 
+	 *
 	 * @param root package fragment root
 	 */
 	private void setPackageFragmentRoot(IPackageFragmentRoot root) {
 		fRoot = root;
 	}
-	
+
 	/*
 	 * Throws an internal error exception
 	 */
 	private void abort(String message, Throwable e)	throws CoreException {
 		IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
-		throw new CoreException(s);		
-	}	
-	
+		throw new CoreException(s);
+	}
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
-	public boolean equals(Object object) {		
+	public boolean equals(Object object) {
 		if (object instanceof PackageFragmentRootSourceLocation) {
 			 PackageFragmentRootSourceLocation root = (PackageFragmentRootSourceLocation)object;
 			 if (getPackageFragmentRoot() == null) {
 			 	return root.getPackageFragmentRoot() == null;
-			 } 
+			 }
 			 return getPackageFragmentRoot().equals(root.getPackageFragmentRoot());
 		}
 		return false;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#hashCode()
 	 */
@@ -229,7 +229,7 @@
 	public int hashCode() {
 		if (getPackageFragmentRoot() == null) {
 			return getClass().hashCode();
-		} 
+		}
 		return getPackageFragmentRoot().hashCode();
-	}	
+	}
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ZipEntryStorage.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ZipEntryStorage.java
index b6eca6e..5c61ee7 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ZipEntryStorage.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/ZipEntryStorage.java
@@ -13,7 +13,7 @@
 
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
- 
+
 /**
  * Storage implementation for zip entries.
  * <p>
@@ -29,11 +29,11 @@
  */
 @Deprecated
 public class ZipEntryStorage extends org.eclipse.debug.core.sourcelookup.containers.ZipEntryStorage {
-		
+
 	/**
 	 * Constructs a new storage implementation for the
 	 * given zip entry in the specified zip file
-	 * 
+	 *
 	 * @param archive zip file
 	 * @param entry zip entry
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathContainerSourceContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathContainerSourceContainer.java
index 00bf659..935381f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathContainerSourceContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathContainerSourceContainer.java
@@ -29,13 +29,13 @@
  * <p>
  * This class may be instantiated.
  * </p>
- * 
+ *
  * @since 3.0
  * @noextend This class is not intended to be subclassed by clients.
  */
 
 public class ClasspathContainerSourceContainer extends CompositeSourceContainer {
-	
+
 	/**
 	 * Associated classpath container path.
 	 */
@@ -45,16 +45,16 @@
 	 * (value <code>org.eclipse.jdt.launching.sourceContainer.classpathContainer</code>).
 	 */
 	public static final String TYPE_ID = LaunchingPlugin.getUniqueIdentifier() + ".sourceContainer.classpathContainer";   //$NON-NLS-1$
-		
+
 	/**
 	 * Constructs a new source container for the given classpath container.
-	 * 
+	 *
 	 * @param containerPath classpath container path
 	 */
 	public ClasspathContainerSourceContainer(IPath containerPath) {
 		fContainerPath = containerPath;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getName()
 	 */
@@ -67,7 +67,7 @@
 		}
 		if (container == null) {
 			return getPath().lastSegment();
-		} 
+		}
 		return container.getDescription();
 	}
 	/* (non-Javadoc)
@@ -87,10 +87,10 @@
 		IRuntimeClasspathEntry[] entries = JavaRuntime.resolveSourceLookupPath(new IRuntimeClasspathEntry[]{entry}, getDirector().getLaunchConfiguration());
 		return JavaRuntime.getSourceContainers(entries);
 	}
-	
+
 	/**
 	 * Returns the classpath container's path
-	 * 
+	 *
 	 * @return classpath container's path
 	 */
 	public IPath getPath() {
@@ -114,10 +114,10 @@
 	public int hashCode() {
 		return getPath().hashCode();
 	}
-	
+
 	/**
 	 * Returns the associated container or <code>null</code> if unavailable.
-	 * 
+	 *
 	 * @return classpath container or <code>null</code>
 	 * @throws CoreException if unable to retrieve container
 	 */
@@ -134,5 +134,5 @@
 		}
 		return null;
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathVariableSourceContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathVariableSourceContainer.java
index 8a56db0..d1fbe9f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathVariableSourceContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/ClasspathVariableSourceContainer.java
@@ -30,17 +30,17 @@
  * @noextend This class is not intended to be subclassed by clients.
  */
 public class ClasspathVariableSourceContainer extends CompositeSourceContainer {
-	
+
 	private IPath fVariable;
 	/**
 	 * Unique identifier for Java project source container type
 	 * (value <code>org.eclipse.jdt.launching.sourceContainer.classpathVariable</code>).
 	 */
 	public static final String TYPE_ID = LaunchingPlugin.getUniqueIdentifier() + ".sourceContainer.classpathVariable";   //$NON-NLS-1$
-	
+
 	/**
 	 * Constructs a new source container on the given variable and suffix.
-	 * 
+	 *
 	 * @param variablePath path representing a Java classpath variable.
 	 *  The first segment is the variable name, and the following segments
 	 *  (if any) are appended to the variable.
@@ -48,7 +48,7 @@
 	public ClasspathVariableSourceContainer(IPath variablePath) {
 		fVariable = variablePath;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
 	 */
@@ -59,7 +59,7 @@
 			return new ISourceContainer[0];
 		}
 		if (fVariable.segmentCount() > 1) {
-			path = path.append(fVariable.removeFirstSegments(1));			
+			path = path.append(fVariable.removeFirstSegments(1));
 		}
 		IRuntimeClasspathEntry entry = JavaRuntime.newArchiveRuntimeClasspathEntry(path);
 		return JavaRuntime.getSourceContainers(new IRuntimeClasspathEntry[]{entry});
@@ -71,18 +71,18 @@
 	public String getName() {
 		return fVariable.toOSString();
 	}
-	
+
 	/**
 	 * Returns the variable this container references as a path. The
 	 * first segment is the variable name, and the following segments
 	 * are appended to the variable's value.
-	 * 
+	 *
 	 * @return path representing the variable and suffix
 	 */
 	public IPath getPath() {
 		return fVariable;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getType()
 	 */
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaProjectSourceContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaProjectSourceContainer.java
index 6bddb08..7d05946 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaProjectSourceContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaProjectSourceContainer.java
@@ -35,21 +35,21 @@
  * <p>
  * This class may be instantiated.
  * </p>
- * 
+ *
  * @since 3.0
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class JavaProjectSourceContainer extends CompositeSourceContainer {
-		
+
 	// Java project
 	private IJavaProject fProject;
 	// Source folders
 	private ISourceContainer[] fSourceFolders;
 	// Generic project container
 	private ISourceContainer[] fOthers;
-	
+
 	private static String[] fgJavaExtensions = null;
-	
+
 	/**
 	 * initialize java file extensions
 	 */
@@ -61,16 +61,16 @@
 			fgJavaExtensions[i] = '.' + ext;
 		}
 	}
-	
+
 	/**
 	 * Unique identifier for Java project source container type
 	 * (value <code>org.eclipse.jdt.launching.sourceContainer.javaProject</code>).
 	 */
 	public static final String TYPE_ID = LaunchingPlugin.getUniqueIdentifier() + ".sourceContainer.javaProject";   //$NON-NLS-1$
-	
+
 	/**
 	 * Constructs a source container on the given Java project.
-	 * 
+	 *
 	 * @param project project to look for source in
 	 */
 	public JavaProjectSourceContainer(IJavaProject project) {
@@ -91,10 +91,10 @@
 	public ISourceContainerType getType() {
 		return getSourceContainerType(TYPE_ID);
 	}
-	
+
 	/**
 	 * Returns the Java project associated with this source container.
-	 * 
+	 *
 	 * @return Java project
 	 */
 	public IJavaProject getJavaProject() {
@@ -105,7 +105,7 @@
 	 */
 	@Override
 	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		List<ISourceContainer> containers = new ArrayList<ISourceContainer>();
+		List<ISourceContainer> containers = new ArrayList<>();
 		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
 		if (fProject.getProject().isOpen()) {
 			IClasspathEntry[] entries = fProject.getRawClasspath();
@@ -153,7 +153,7 @@
 	public Object[] findSourceElements(String name) throws CoreException {
 		// force container initialization
 		getSourceContainers();
-		
+
 		if (isJavaLikeFileName(name)) {
 			// only look in source folders
 			Object[] objects = findSourceElements(name, fSourceFolders);
@@ -163,7 +163,7 @@
 				if (object instanceof IResource) {
 					if (!getJavaProject().isOnClasspath((IResource)object)) {
 						if (filtered == null) {
-							filtered = new ArrayList<Object>(objects.length);
+							filtered = new ArrayList<>(objects.length);
 							for (int j = 0; j < objects.length; j++) {
 								filtered.add(objects[j]);
 							}
@@ -175,8 +175,8 @@
 			if (filtered == null) {
 				return objects;
 			}
-			return filtered.toArray();			
-		} 
+			return filtered.toArray();
+		}
 		// look elsewhere if not a java like file
 		return findSourceElements(name, fOthers);
 	}
@@ -186,7 +186,7 @@
 		fOthers = null;
 		super.dispose();
 	}
-	
+
 	private boolean isJavaLikeFileName(String name) {
 		for (int i = 0; i < fgJavaExtensions.length; i++) {
 			String ext = fgJavaExtensions[i];
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourceLookupParticipant.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourceLookupParticipant.java
index b230a37..3a0104f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourceLookupParticipant.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourceLookupParticipant.java
@@ -38,28 +38,28 @@
  * @noextend This class is not intended to be sub-classed by clients.
  */
 public class JavaSourceLookupParticipant extends AbstractSourceLookupParticipant {
-	
+
 	/**
 	 * Map of delegate source containers for internal jars.
 	 * Internal jars are translated to package fragment roots
 	 * if possible.
 	 */
 	private Map<ISourceContainer, PackageFragmentRootSourceContainer> fDelegateContainers;
-	
+
 	/**
 	 * Returns the source name associated with the given object, or <code>null</code>
 	 * if none.
-	 * 
+	 *
 	 * @param object an object with an <code>IJavaStackFrame</code> adapter, an IJavaValue
-	 *  or an IJavaType 
+	 *  or an IJavaType
 	 * @return the source name associated with the given object, or <code>null</code>
 	 * if none
 	 * @exception CoreException if unable to retrieve the source name
 	 */
 	@Override
 	public String getSourceName(Object object) throws CoreException {
-		return JavaDebugUtils.getSourceName(object); 
-	}	
+		return JavaDebugUtils.getSourceName(object);
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupParticipant#dispose()
@@ -73,7 +73,7 @@
 		}
 		fDelegateContainers = null;
 		super.dispose();
-		
+
 	}
 
 	/* (non-Javadoc)
@@ -84,8 +84,8 @@
 		ISourceContainer delegate = fDelegateContainers.get(container);
 		if (delegate == null) {
 			return container;
-		} 
-		return delegate; 
+		}
+		return delegate;
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupParticipant#init(org.eclipse.debug.internal.core.sourcelookup.ISourceLookupDirector)
@@ -93,7 +93,7 @@
 	@Override
 	public void init(ISourceLookupDirector director) {
 		super.init(director);
-		fDelegateContainers = new HashMap<ISourceContainer, PackageFragmentRootSourceContainer>();
+		fDelegateContainers = new HashMap<>();
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupParticipant#sourceContainersChanged(org.eclipse.debug.internal.core.sourcelookup.ISourceLookupDirector)
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourcePathComputer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourcePathComputer.java
index b3a0fb7..a9ca595 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourcePathComputer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/JavaSourcePathComputer.java
@@ -27,28 +27,28 @@
  * The source path provider computes a collection of <code>IRuntimeClasspathEntry</code>'s
  * which are translated to source containers (<code>ISourceContainer</code>).
  * <p>
- * Clients may subclass this class. 
+ * Clients may subclass this class.
  * </p>
  * @since 3.0
- * 
+ *
  */
 public class JavaSourcePathComputer implements ISourcePathComputerDelegate {
-	
+
 	/**
 	 * Unique identifier for the local Java source path computer
 	 * (value <code>org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer</code>).
 	 */
 	public static final String ID = "org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer"; //$NON-NLS-1$
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputer#getId()
-	 * 
+	 *
      * No longer used.
 	 */
 	public String getId() {
 		return ID;
 	}
-    
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -58,5 +58,5 @@
 		IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveSourceLookupPath(entries, configuration);
 		return JavaRuntime.getSourceContainers(resolved);
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/PackageFragmentRootSourceContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/PackageFragmentRootSourceContainer.java
index 710263e..d1314dc 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/PackageFragmentRootSourceContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/sourcelookup/containers/PackageFragmentRootSourceContainer.java
@@ -28,29 +28,29 @@
  * <p>
  * This class may be instantiated.
  * </p>
- * 
+ *
  * @since 3.0
  * @noextend This class is not intended to be subclassed by clients.
  */
 public class PackageFragmentRootSourceContainer extends AbstractSourceContainer {
-	
+
 	private IPackageFragmentRoot fRoot;
 	/**
 	 * Unique identifier for Java project source container type
 	 * (value <code>org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot</code>).
 	 */
 	public static final String TYPE_ID = LaunchingPlugin.getUniqueIdentifier() + ".sourceContainer.packageFragmentRoot";   //$NON-NLS-1$
-	
+
 	/**
 	 * Constructs a new package fragment root source container on the
 	 * given root. The root must be of kind <code>K_BINARY</code>.
-	 * 
+	 *
 	 * @param root package fragment root
 	 */
 	public PackageFragmentRootSourceContainer(IPackageFragmentRoot root) {
 		fRoot = root;
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
 	 */
@@ -87,7 +87,7 @@
 						ICompilationUnit unit = fragment.getCompilationUnit(typeName + '.' + ext);
 						if (unit.exists()) {
 							return new Object[]{unit};
-						}	
+						}
 					}
 					break;
 			}
@@ -109,7 +109,7 @@
 	public ISourceContainerType getType() {
 		return getSourceContainerType(TYPE_ID);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
@@ -118,10 +118,10 @@
 		return obj instanceof PackageFragmentRootSourceContainer &&
 		 ((PackageFragmentRootSourceContainer)obj).getPackageFragmentRoot().equals(getPackageFragmentRoot());
 	}
-	
+
 	/**
 	 * Returns the package fragment root this container searches for source.
-	 * 
+	 *
 	 * @return the package fragment root this container searches for source
 	 */
 	public IPackageFragmentRoot getPackageFragmentRoot() {
diff --git a/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LegacySystemProperties.java b/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LegacySystemProperties.java
index a2eef54..2f03ffa 100644
--- a/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LegacySystemProperties.java
+++ b/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LegacySystemProperties.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -13,12 +13,12 @@
 
 /**
  * Evaluates system properties passed as program arguments for pre 1.4 VMs.
- * 
+ *
  * @since 3.2
  */
 public class LegacySystemProperties {
 
-	public static void main(String[] args) { 
+	public static void main(String[] args) {
 		StringBuffer buffer = new StringBuffer();
 		buffer.append("<systemProperties>\n");    //$NON-NLS-1$
 		for (int i = 0; i < args.length; i++) {
@@ -36,5 +36,5 @@
 		buffer.append("</systemProperties>");  //$NON-NLS-1$
 		System.out.print(buffer.toString());
 	}
-	
+
 }
diff --git a/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LibraryDetector.java b/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LibraryDetector.java
index 960caf4..1b76bd1 100644
--- a/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LibraryDetector.java
+++ b/org.eclipse.jdt.launching/support/org/eclipse/jdt/internal/launching/support/LibraryDetector.java
@@ -26,13 +26,13 @@
 	 * <li>java.ext.dirs</li>
 	 * <li>java.endorsed.dirs</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param args the command line arguments
 	 */
 	public static void main(String[] args) {
 		// if we are running raw j9
 		if ("j9".equalsIgnoreCase(System.getProperty("java.vm.name"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			// Map class lib versions onto things that the launch infrastructure understands.  J9 
+			// Map class lib versions onto things that the launch infrastructure understands.  J9
 			// behaves like 1.4 with-respect-to launch/debug
 			String configuration = System.getProperty("com.ibm.oti.configuration"); //$NON-NLS-1$
 			if ("found10".equals(configuration)) //$NON-NLS-1$
