diff --git a/org.eclipse.jdt.debug.tests/java8/Bug562056.java b/org.eclipse.jdt.debug.tests/java8/Bug562056.java
new file mode 100644
index 0000000..3473703
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/java8/Bug562056.java
@@ -0,0 +1,16 @@
+public class Bug562056 {
+	Object handler = "Hello bug 562056";
+
+	public static void main(String[] args) {
+		(new Bug562056()).run();
+	}
+
+	private Runnable r = () -> {
+		String string = handler.toString(); // breakpoint here, inspect handler.toString()
+		System.out.println(string);
+	};
+
+	public void run() {
+		r.run();
+	}
+}
diff --git a/org.eclipse.jdt.debug.tests/java8/RemoteEvaluator.java b/org.eclipse.jdt.debug.tests/java8/RemoteEvaluator.java
new file mode 100644
index 0000000..fe4c53c
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/java8/RemoteEvaluator.java
@@ -0,0 +1,23 @@
+import java.util.Arrays;
+import java.util.function.Predicate;
+
+public class RemoteEvaluator {
+	public static final Predicate<String> P_EMPTY = s -> s.isEmpty();
+	
+	public static void main(String[] args) {
+		(new RemoteEvaluator()).exec();
+	}
+
+	public void exec() {
+		(new Inner()).run();
+	}
+	
+	class Inner {
+		private final Predicate<String> Q_EMPTY = s -> s.isEmpty();
+
+		public void run() {
+			String y = "111";
+			Arrays.asList("111", "222", "aaa").stream().filter(a -> a.equals(y)).count();
+		}
+	}
+}
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 08c87d2..45a356c 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
@@ -474,6 +474,8 @@
 				cfgs.add(createLaunchConfiguration(jp, "Bug404097BreakpointUsingLocalClass"));
 				cfgs.add(createLaunchConfiguration(jp, "Bug560392"));
 				cfgs.add(createLaunchConfiguration(jp, "Bug561715"));
+				cfgs.add(createLaunchConfiguration(jp, "Bug562056"));
+				cfgs.add(createLaunchConfiguration(jp, "RemoteEvaluator"));
 	    		loaded18 = true;
 	    		waitForBuild();
 	        }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java
index e40b9da..621b316 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java
@@ -30,7 +30,7 @@
 		super(name);
 	}
 
-	public void testEvaluate_LambdaFieldVariable() throws Exception {
+	public void testEvaluate_LambdaCapturedParameter() throws Exception {
 		debugWithBreakpoint("Bug560392", 9);
 		String snippet = "key";
 		IValue value = doEval(javaThread, snippet);
@@ -39,6 +39,15 @@
 		assertEquals("wrong result : ", "a", value.getValueString());
 	}
 
+	public void testEvaluate_LambdaCapturedField() throws Exception {
+		debugWithBreakpoint("Bug562056", 9);
+		String snippet = "handler.toString()";
+		IValue value = doEval(javaThread, snippet);
+
+		assertEquals("wrong type : ", "java.lang.String", value.getReferenceTypeName());
+		assertEquals("wrong result : ", "Hello bug 562056", value.getValueString());
+	}
+
 	private void debugWithBreakpoint(String testClass, int lineNumber) throws Exception {
 		createLineBreakpoint(lineNumber, testClass);
 		javaThread = launchToBreakpoint(testClass);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/RemoteEvaluatorTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/RemoteEvaluatorTests.java
new file mode 100644
index 0000000..4c9c93f
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/RemoteEvaluatorTests.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Gayan Perera and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Gayan Perera - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.eval;
+
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.debug.core.IJavaThread;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+
+public class RemoteEvaluatorTests extends AbstractDebugTest {
+	private IJavaThread javaThread;
+
+	public RemoteEvaluatorTests(String name) {
+		super(name);
+	}
+
+	public void testEvaluate_InInnerScope_FieldInOuterScope() throws Exception {
+		debugWithBreakpoint("RemoteEvaluator", 20);
+
+		String code = "java.util.Arrays.asList(\"a\", \"b\", \"ac\").stream().filter(v -> RemoteEvaluator.P_EMPTY.test(v)).count()";
+		IValue value = evaluate(code);
+
+		assertNotNull("result is null", value);
+		assertEquals("count is not 0", "0", value.getValueString());
+	}
+
+
+	public void testEvaluate_InOuterScope_FieldInSameScope() throws Exception {
+		debugWithBreakpoint("RemoteEvaluator", 12);
+		IValue value = evaluate("java.util.Arrays.asList(\"a\", \"b\", \"ac\").stream().filter(v -> RemoteEvaluator.P_EMPTY.test(v)).count()");
+
+		assertNotNull("result is null", value);
+		assertEquals("count is not 0", "0", value.getValueString());
+	}
+
+	public void testEvaluate_InInnerScope_PrivateFieldInSameScope() throws Exception {
+		debugWithBreakpoint("RemoteEvaluator", 20);
+		IValue value = evaluate("java.util.Arrays.asList(\"a\", \"b\", \"ac\").stream().filter(v -> this.Q_EMPTY.test(v)).count()");
+
+		assertNotNull("result is null", value);
+		assertEquals("count is not 0", "0", value.getValueString());
+	}
+
+	public void testEvaluate_InInnerScope_PrivateFieldInSameScope_WithoutThis() throws Exception {
+		debugWithBreakpoint("RemoteEvaluator", 20);
+		IValue value = evaluate("java.util.Arrays.asList(\"a\", \"b\", \"ac\").stream().filter(v -> Q_EMPTY.test(v)).count()");
+
+		assertNotNull("result is null", value);
+		assertEquals("count is not 0", "0", value.getValueString());
+	}
+
+	@Override
+	protected IJavaProject getProjectContext() {
+		return get18Project();
+	}
+
+	private void debugWithBreakpoint(String testClass, int lineNumber) throws Exception {
+		createLineBreakpoint(lineNumber, testClass);
+		javaThread = launchToBreakpoint(testClass);
+		assertNotNull("The program did not suspend", javaThread);
+	}
+
+	private IValue evaluate(String snippet) throws Exception {
+		return doEval(javaThread, snippet);
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		try {
+			terminateAndRemove(javaThread);
+		} finally {
+			super.tearDown();
+			removeAllBreakpoints();
+		}
+	}
+}
diff --git a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF
index d2742d7..3c160ea 100644
--- a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.debug.ui; singleton:=true
-Bundle-Version: 3.10.700.qualifier
+Bundle-Version: 3.11.0.qualifier
 Bundle-Activator: org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.debug.ui/doc/.cvsignore b/org.eclipse.jdt.debug.ui/doc/.cvsignore
deleted file mode 100644
index 5807f61..0000000
--- a/org.eclipse.jdt.debug.ui/doc/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-book.css
-org_eclipse_jdt_debug_ui_vmInstallTypePage.html
-schema.css
diff --git a/org.eclipse.jdt.debug.ui/pom.xml b/org.eclipse.jdt.debug.ui/pom.xml
index d732ea9..3d33a98 100644
--- a/org.eclipse.jdt.debug.ui/pom.xml
+++ b/org.eclipse.jdt.debug.ui/pom.xml
@@ -18,7 +18,7 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.debug.ui</artifactId>
-  <version>3.10.700-SNAPSHOT</version>
+  <version>3.11.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <code.ignoredWarnings>-warn:+resource,-deprecation,unavoidableGenericProblems</code.ignoredWarnings>
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 94fda72..e1196e3 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2019 IBM Corporation and others.
+ * Copyright (c) 2007, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -118,14 +118,35 @@
 	}
 
 	/**
-	 * Updates the name status based on the new name. This method should be called
-	 * by the page each time the VM name changes.
+	 * 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
+	 * Use nameChanged(String newName, boolean init)
+	 *
+	 * @param newName
+	 *            new name of VM
+	 *
 	 */
+	@Deprecated
 	protected void nameChanged(String newName) {
+		nameChanged(newName, false);
+	}
+
+	/**
+	 * 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
+	 * @param init
+	 *            <code>true</code> if page is getting initialized else <code>false</code>
+	 *
+	 * @since 3.11
+	 */
+	protected void nameChanged(String newName, boolean init) {
 		fNameStatus = Status.OK_STATUS;
 		if (newName == null || newName.trim().length() == 0) {
+			if (init) {
+				return;
+			}
 			int sev = IStatus.ERROR;
 			if (fOriginalName == null || fOriginalName.length() == 0) {
 				sev = IStatus.WARNING;
@@ -152,8 +173,8 @@
 	 */
 	private boolean isDuplicateName(String name) {
 		if (fExistingNames != null) {
-			for (int i = 0; i < fExistingNames.length; i++) {
-				if (name.equals(fExistingNames[i])) {
+			for (String n : fExistingNames) {
+				if (name.equals(n)) {
 					return true;
 				}
 			}
@@ -219,9 +240,7 @@
 	 */
 	protected void updatePageStatus() {
 		IStatus max = Status.OK_STATUS;
-		IStatus[] vmStatus = getVMStatus();
-		for (int i = 0; i < vmStatus.length; i++) {
-			IStatus status = vmStatus[i];
+		for (IStatus status : getVMStatus()) {
 			if (status.getSeverity() > max.getSeverity()) {
 				max = status;
 			}
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 61f09ae..93c83ca 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
@@ -296,9 +296,8 @@
 
 	private void handleParametersRemoveButtonSelected() {
 		IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
-		Object[] keys = selection.toArray();
-		for (int i = 0; i < keys.length; i++) {
-			String key = (String) keys[i];
+		for (Object k : selection.toArray()) {
+			String key = (String) k;
 			Map<String, String> params = getViewerInput();
 			params.remove(key);
 		}
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 f6c042b..134c358 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
@@ -86,12 +86,12 @@
 	 */
 	protected void apply(IJavaBreakpoint breakpoint) throws CoreException {
 		breakpoint.setHitCount(fHitCount);
-		for (int i = 0; i < fInstanceFilters.length; i++) {
-			breakpoint.addInstanceFilter(fInstanceFilters[i]);
+		for (IJavaObject filter : fInstanceFilters) {
+			breakpoint.addInstanceFilter(filter);
 		}
 		breakpoint.setSuspendPolicy(fSuspendPolicy);
-		for (int i = 0; i < fThreadFilters.length; i++) {
-			breakpoint.setThreadFilter(fThreadFilters[i]);
+		for (IJavaThread filter : fThreadFilters) {
+			breakpoint.setThreadFilter(filter);
 		}
 		breakpoint.setEnabled(fEnabled);
 	}
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 7faf607..a550d52 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
@@ -49,8 +49,7 @@
 	@Override
 	protected void gatherChanges(IMarker[] markers, List<Change> changes) throws CoreException, OperationCanceledException {
 		IPackageFragmentRoot destRoot = (IPackageFragmentRoot)getDestination();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
+		for (IMarker marker : markers) {
 			IBreakpoint breakpoint = getBreakpoint(marker);
 			if (breakpoint instanceof IJavaBreakpoint) {
 				IJavaBreakpoint javaBreakpoint = (IJavaBreakpoint) breakpoint;
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 5ec6e5c..5d2159e 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
@@ -49,8 +49,7 @@
 	protected void gatherChanges(IMarker[] markers, List<Change> changes) throws CoreException, OperationCanceledException {
 		IType originalType = (IType) getOriginalElement();
 		IPackageFragment destPackage = (IPackageFragment) getDestination();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
+		for (IMarker marker : markers) {
 			IBreakpoint breakpoint = getBreakpoint(marker);
 			if (breakpoint instanceof IJavaBreakpoint) {
 				IJavaBreakpoint javaBreakpoint = (IJavaBreakpoint) breakpoint;
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 edb2a46..ce7835e 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
@@ -69,8 +69,7 @@
 	@Override
 	protected void gatherChanges(IMarker[] markers, List<Change> changes, String destFieldName) throws CoreException, OperationCanceledException {
 		IField originalField = (IField) getOriginalElement();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
+		for (IMarker marker : markers) {
 			IBreakpoint breakpoint = getBreakpoint(marker);
 			if (breakpoint instanceof IJavaWatchpoint) {
 				IJavaWatchpoint watchpoint = (IJavaWatchpoint) breakpoint;
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 2f2b03e..d192589 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
@@ -48,15 +48,14 @@
 	@Override
 	protected void gatherChanges(IMarker[] markers, List<Change> changes, String destMethodName) throws CoreException, OperationCanceledException {
 		IMethod originalMethod = (IMethod) getOriginalElement();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
+		for (IMarker marker : markers) {
 			IBreakpoint breakpoint = getBreakpoint(marker);
 			if (breakpoint instanceof IJavaMethodBreakpoint) {
 				IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoint;
 				//ensure we only update the marker that corresponds to the method being renamed
 				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=280518
 				if(methodBreakpoint.getMethodName().equals(originalMethod.getElementName()) &&
-						methodBreakpoint.getMethodSignature().equals(originalMethod.getSignature())) {
+					methodBreakpoint.getMethodSignature().equals(originalMethod.getSignature())) {
 					IType breakpointType = BreakpointUtils.getType(methodBreakpoint);
 					if (breakpointType != null && originalMethod.getDeclaringType().equals(breakpointType)) {
 						IMethod destMethod = originalMethod.getDeclaringType().getMethod(destMethodName, originalMethod.getParameterTypes());
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 847729a..41c6d0e 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
@@ -51,8 +51,7 @@
 		IPackageFragment originalPackage = (IPackageFragment) getOriginalElement();
 		String originalPackageName = originalPackage.getElementName();
 		IPackageFragmentRoot root = (IPackageFragmentRoot)originalPackage.getParent();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
+		for (IMarker marker : markers) {
 			IBreakpoint breakpoint = getBreakpoint(marker);
 			if (breakpoint instanceof IJavaBreakpoint) {
 				IJavaBreakpoint javaBreakpoint = (IJavaBreakpoint) breakpoint;
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 c3f6a13..4e0e575 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
@@ -56,8 +56,7 @@
 	protected void gatherChanges(IMarker[] markers, List<Change> changes, String destProjectName) throws CoreException, OperationCanceledException {
 		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(destProjectName);
 		IJavaProject destProject = JavaCore.create(project);
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
+		for (IMarker marker : markers) {
 			IBreakpoint breakpoint = getBreakpoint(marker);
 			if (breakpoint instanceof IJavaBreakpoint) {
 				IJavaBreakpoint javaBreakpoint = (IJavaBreakpoint) breakpoint;
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 e701b72..0848ca7 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
@@ -84,29 +84,28 @@
         newType = (IType) BreakpointChange.findElement(destCU, newType);
 
 
-        for (int i = 0; i < markers.length; i++) {
-            IMarker marker = markers[i];
-            IBreakpoint breakpoint = getBreakpoint(marker);
-            if (breakpoint instanceof IJavaBreakpoint) {
-                IJavaBreakpoint javaBreakpoint = (IJavaBreakpoint) breakpoint;
-                IType breakpointType = BreakpointUtils.getType(javaBreakpoint);
-                IType destType = null;
-                if (breakpointType != null) {
-                	IJavaElement element = null;
-                	if (isContained(originalType, breakpointType)) {
-                		element = BreakpointChange.findElement(newType, breakpointType);
-                	} else if (isContained(originalCU, breakpointType)) {
-                		// non public, or other type in the CU
-                		element = BreakpointChange.findElement(destCU, breakpointType);
-                	}
-                	if (element instanceof IType) {
-                		destType = (IType) element;
-                		changes.add(createTypeChange(javaBreakpoint, destType, breakpointType));
-                	}
-                }
-
-            }
-        }
+		for (IMarker marker : markers) {
+			IBreakpoint breakpoint = getBreakpoint(marker);
+			if (breakpoint instanceof IJavaBreakpoint) {
+				IJavaBreakpoint javaBreakpoint = (IJavaBreakpoint) breakpoint;
+				IType breakpointType = BreakpointUtils.getType(javaBreakpoint);
+				IType destType = null;
+				if (breakpointType != null) {
+					IJavaElement element = null;
+					if (isContained(originalType, breakpointType)) {
+						element = BreakpointChange.findElement(newType, breakpointType);
+					} else if (isContained(originalCU, breakpointType)) {
+						// non public, or other type in the CU
+						element = BreakpointChange.findElement(destCU, breakpointType);
+					}
+					if (element instanceof IType) {
+						destType = (IType) element;
+						changes.add(createTypeChange(javaBreakpoint, destType, breakpointType));
+					}
+				}
+				
+			}
+		}
 
     }
 
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 fface6e..afb621c 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
@@ -193,18 +193,17 @@
 		String modelId = JDIDebugPlugin.getUniqueIdentifier();
 		String markerType= JavaLineBreakpoint.getMarkerType();
 		IBreakpointManager manager= DebugPlugin.getDefault().getBreakpointManager();
-		IBreakpoint[] breakpoints= manager.getBreakpoints(modelId);
-		for (int i = 0; i < breakpoints.length; i++) {
-			if (!(breakpoints[i] instanceof IJavaLineBreakpoint)) {
+		for (IBreakpoint b : manager.getBreakpoints(modelId)) {
+			if (!(b instanceof IJavaLineBreakpoint)) {
 				continue;
 			}
-			IJavaLineBreakpoint breakpoint = (IJavaLineBreakpoint) breakpoints[i];
+			IJavaLineBreakpoint breakpoint = (IJavaLineBreakpoint) b;
 			IMarker marker = breakpoint.getMarker();
 			if (marker != null && marker.exists() && marker.getType().equals(markerType) && currentmarker.getId() != marker.getId()) {
 				String breakpointTypeName = breakpoint.getTypeName();
 				if ((JavaDebugUtils.typeNamesEqual(breakpointTypeName, typeName) || (breakpointTypeName != null && breakpointTypeName.startsWith(typeName + '$')))
-						&& breakpoint.getLineNumber() == lineNumber && resource.equals(marker.getResource())) {
-						return breakpoint;
+					&& breakpoint.getLineNumber() == lineNumber && resource.equals(marker.getResource())) {
+					return breakpoint;
 				}
 			}
 		}
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 50cd85e..03e069c 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
@@ -134,8 +134,8 @@
 	}
 
 	private boolean isDuplicateFilter(String trimmedValue) {
-		for (int i=0; i<existingFilters.length; i++) {
-			if(existingFilters[i].getName().equals(trimmedValue)) {
+		for (Filter existingFilter : existingFilters) {
+			if (existingFilter.getName().equals(trimmedValue)) {
 				return true;
 			}
 		}
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 ac3aed6..abbb0fa 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
@@ -14,7 +14,6 @@
 package org.eclipse.jdt.internal.debug.ui;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.core.commands.AbstractHandler;
@@ -95,10 +94,10 @@
 
 		public AttributesContentProvider(String[][] variables) {
 			fVariables= new ArrayList<>();
-			for (int i= 0; i < variables.length; i++) {
+			for (String[] v : variables) {
 				String[] variable= new String[2];
-				variable[0]= variables[i][0];
-				variable[1]= variables[i][1];
+				variable[0] = v[0];
+				variable[1] = v[1];
 				fVariables.add(variable);
 			}
 		}
@@ -154,8 +153,7 @@
 		 * @param list the list
 		 */
 		public void up(List<String[]> list) {
-			for (Iterator<String[]> iter= list.iterator(); iter.hasNext();) {
-				String[] variable= iter.next();
+			for (String[] variable : list) {
 				int index= fVariables.indexOf(variable);
 				fVariables.remove(variable);
 				fVariables.add(index - 1, variable);
@@ -167,8 +165,7 @@
 		 * @param list the list
 		 */
 		public void down(List<String[]> list) {
-			for (Iterator<String[]> iter= list.iterator(); iter.hasNext();) {
-				String[] variable= iter.next();
+			for (String[] variable : list) {
 				int index= fVariables.indexOf(variable);
 				fVariables.remove(variable);
 				fVariables.add(index + 1, variable);
@@ -442,11 +439,10 @@
 		IStructuredSelection selection= (IStructuredSelection)fAttributeListViewer.getSelection();
 		if (selection.size() > 0) {
 			List<String[]> selectedElements= selection.toList();
-			Object[] elements= fAttributesContentProvider.getElements();
 			Object newSelectedElement= null;
-			for (int i= 0; i < elements.length; i++) {
-				if (!selectedElements.contains(elements[i])) {
-					newSelectedElement= elements[i];
+			for (Object element : fAttributesContentProvider.getElements()) {
+				if (!selectedElements.contains(element)) {
+					newSelectedElement = element;
 				} else {
 					break;
 				}
@@ -505,16 +501,14 @@
 		} else if (isValue) {
 			// dispose the attribute list
 			saveAttributeValue();
-			Control[] children= fAttributesContainer.getChildren();
-			for (int i= 0; i < children.length; i++) {
-				children[i].dispose();
+			for (Control child : fAttributesContainer.getChildren()) {
+				child.dispose();
 			}
 		}
 
 		// dispose and recreate the code snippet editor group
-		Control[] children= fCodeGroup.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			children[i].dispose();
+		for (Control child : fCodeGroup.getChildren()) {
+			child.dispose();
 		}
 		fSnippetViewer.dispose();
 		createCodeGroupWidgets(isValue);
@@ -598,8 +592,8 @@
 			} else if (oneElementSelected && fSnippetDocument.get().trim().length() == 0) {
 				status.setError(DebugUIMessages.EditLogicalStructureDialog_21);
 			} else {
-				for (int i= 0; i < elements.length; i++) {
-					String[] variable= (String[]) elements[i];
+				for (Object element : elements) {
+					String[] variable = (String[]) element;
 					if (variable[0].trim().length() == 0) {
 						status.setError(DebugUIMessages.EditLogicalStructureDialog_22);
 						break;
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 c09f994..9868c61 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
@@ -79,9 +79,8 @@
 				if (fgManager == null) {
 					fgManager = new EvaluationContextManager();
 					IWorkbench workbench = PlatformUI.getWorkbench();
-					IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-					for (int i = 0; i < windows.length; i++) {
-						fgManager.windowOpened(windows[i]);
+					for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
+						fgManager.windowOpened(window);
 					}
 					workbench.addWindowListener(fgManager);
 					fgManager.fActiveWindow = workbench.getActiveWorkbenchWindow();
@@ -231,10 +230,9 @@
 			frame = getContext(activePage);
 		}
 		if (frame == null) {
-			IWorkbenchPage[] pages = window.getPages();
-			for (int i = 0; i < pages.length; i++) {
-				if (activePage != pages[i]) {
-					frame = getContext(pages[i]);
+			for (IWorkbenchPage page : window.getPages()) {
+				if (activePage != page) {
+					frame = getContext(page);
 					if (frame != null) {
 						return frame;
 					}
@@ -243,10 +241,9 @@
 
 			alreadyVisited.add(window);
 
-			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-			for (int i = 0; i < windows.length; i++) {
-				if (!alreadyVisited.contains(windows[i])) {
-					frame = getEvaluationContext(windows[i], alreadyVisited);
+			for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {
+				if (!alreadyVisited.contains(w)) {
+					frame = getEvaluationContext(w, alreadyVisited);
 					if (frame != null) {
 						return frame;
 					}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractThreadsViewFilterAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractThreadsViewFilterAction.java
index d511cbf..8bbd01c 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractThreadsViewFilterAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/AbstractThreadsViewFilterAction.java
@@ -103,8 +103,7 @@
 			// if showing all threads, no need to worry about displaying/hiding
 			return;
 		}
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
+		for (DebugEvent event : events) {
 			switch (event.getKind()) {
 				case DebugEvent.RESUME:
 					if (event.getDetail() == DebugEvent.CLIENT_REQUEST) {
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 42e6984..1e98d6c 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
@@ -50,9 +50,9 @@
 	public void setViewer(IClasspathViewer viewer) {
 		super.setViewer(viewer);
 		if (fActions != null) {
-			for (int i = 0; i < fActions.length; i++) {
-				if (fActions[i] instanceof RuntimeClasspathAction) {
-					((RuntimeClasspathAction)fActions[i]).setViewer(viewer);
+			for (IAction action : fActions) {
+				if (action instanceof RuntimeClasspathAction) {
+					((RuntimeClasspathAction) action).setViewer(viewer);
 				}
 			}
 		}
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 ee59566..c45a163 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
@@ -83,10 +83,10 @@
 			List<IResource> fAlreadySelected = getSelectedFolders();
 			@Override
 			public IStatus validate(Object[] selection) {
-				for (int i= 0; i < selection.length; i++) {
-					if (!(selection[i] instanceof IContainer)) {
+				for (Object s : selection) {
+					if (!(s instanceof IContainer)) {
 						return new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Selection must be a folder", null);  //$NON-NLS-1$
-					} else if (fAlreadySelected.contains(selection[i])) {
+					} else if (fAlreadySelected.contains(s)) {
 						return new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "Classpath already includes selected folder(s).", null);  //$NON-NLS-1$
 					}
 
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 042fee0..b6118fc 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
@@ -68,8 +68,8 @@
 
 			List<IJavaProject> additions = new ArrayList<>(selections.length);
 			try {
-				for (int i = 0; i < selections.length; i++) {
-					IJavaProject jp = (IJavaProject)selections[i];
+				for (Object selection : selections) {
+					IJavaProject jp = (IJavaProject) selection;
 					if (dialog.isAddRequiredProjects()) {
 						collectRequiredProjects(jp, additions);
 					} else {
@@ -129,14 +129,13 @@
 			projects= new IJavaProject[0];
 		}
 		List<IJavaProject> remaining = new ArrayList<>();
-		for (int i = 0; i < projects.length; i++) {
-			remaining.add(projects[i]);
+		for (IJavaProject project : projects) {
+			remaining.add(project);
 		}
 		List<IJavaProject> alreadySelected = new ArrayList<>();
-		IRuntimeClasspathEntry[] entries = getViewer().getEntries();
-		for (int i = 0; i < entries.length; i++) {
-			if (entries[i].getType() == IRuntimeClasspathEntry.PROJECT) {
-				IResource res = root.findMember(entries[i].getPath());
+		for (IRuntimeClasspathEntry entry : getViewer().getEntries()) {
+			if (entry.getType() == IRuntimeClasspathEntry.PROJECT) {
+				IResource res = root.findMember(entry.getPath());
 				IJavaProject jp = (IJavaProject)JavaCore.create(res);
 				alreadySelected.add(jp);
 			}
@@ -160,9 +159,7 @@
 
 			IJavaModel model= proj.getJavaModel();
 
-			IClasspathEntry[] entries= proj.getRawClasspath();
-			for (int i= 0; i < entries.length; i++) {
-				IClasspathEntry curr= entries[i];
+			for (IClasspathEntry curr : proj.getRawClasspath()) {
 				if (curr.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
 					IJavaProject ref= model.getJavaProject(curr.getPath().segment(0));
 					if (ref.exists()) {
@@ -182,48 +179,46 @@
 	 * @throws CoreException if an exception occurs
 	 */
 	protected void collectExportedEntries(IJavaProject proj, List<IRuntimeClasspathEntry> runtimeEntries) throws CoreException {
-		IClasspathEntry[] entries = proj.getRawClasspath();
-		for (int i = 0; i < entries.length; i++) {
-			IClasspathEntry entry = entries[i];
+		for (IClasspathEntry entry : proj.getRawClasspath()) {
 			if (entry.isExported()) {
 				IRuntimeClasspathEntry rte = null;
 				switch (entry.getEntryKind()) {
-					case IClasspathEntry.CPE_CONTAINER:
-						IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), proj);
-						int kind = 0;
-						switch (container.getKind()) {
-							case IClasspathContainer.K_APPLICATION:
-								kind = IRuntimeClasspathEntry.USER_CLASSES;
-								break;
-							case IClasspathContainer.K_SYSTEM:
-								kind = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
-								break;
-							case IClasspathContainer.K_DEFAULT_SYSTEM:
-								kind = IRuntimeClasspathEntry.STANDARD_CLASSES;
-								break;
+				case IClasspathEntry.CPE_CONTAINER:
+					IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), proj);
+					int kind = 0;
+					switch (container.getKind()) {
+					case IClasspathContainer.K_APPLICATION:
+						kind = IRuntimeClasspathEntry.USER_CLASSES;
+						break;
+					case IClasspathContainer.K_SYSTEM:
+						kind = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
+						break;
+					case IClasspathContainer.K_DEFAULT_SYSTEM:
+						kind = IRuntimeClasspathEntry.STANDARD_CLASSES;
+						break;
+					}
+					rte = JavaRuntime.newRuntimeContainerClasspathEntry(entry.getPath(), kind, proj);
+					break;
+				case IClasspathEntry.CPE_LIBRARY:
+					rte = JavaRuntime.newArchiveRuntimeClasspathEntry(entry.getPath());
+					rte.setSourceAttachmentPath(entry.getSourceAttachmentPath());
+					rte.setSourceAttachmentRootPath(entry.getSourceAttachmentRootPath());
+					break;
+				case IClasspathEntry.CPE_PROJECT:
+					String name = entry.getPath().segment(0);
+					IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+					if (p.exists()) {
+						IJavaProject jp = JavaCore.create(p);
+						if (jp.exists()) {
+							rte = JavaRuntime.newProjectRuntimeClasspathEntry(jp);
 						}
-						rte = JavaRuntime.newRuntimeContainerClasspathEntry(entry.getPath(), kind, proj);
-						break;
-					case IClasspathEntry.CPE_LIBRARY:
-						rte = JavaRuntime.newArchiveRuntimeClasspathEntry(entry.getPath());
-						rte.setSourceAttachmentPath(entry.getSourceAttachmentPath());
-						rte.setSourceAttachmentRootPath(entry.getSourceAttachmentRootPath());
-						break;
-					case IClasspathEntry.CPE_PROJECT:
-						String name = entry.getPath().segment(0);
-						IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-						if (p.exists()) {
-							IJavaProject jp = JavaCore.create(p);
-							if (jp.exists()) {
-								rte = JavaRuntime.newProjectRuntimeClasspathEntry(jp);
-							}
-						}
-						break;
-					case IClasspathEntry.CPE_VARIABLE:
-						rte = JavaRuntime.newVariableRuntimeClasspathEntry(entry.getPath());
-						break;
-					default:
-						break;
+					}
+					break;
+				case IClasspathEntry.CPE_VARIABLE:
+					rte = JavaRuntime.newVariableRuntimeClasspathEntry(entry.getPath());
+					break;
+				default:
+					break;
 				}
 				if (rte != null) {
 					if (!runtimeEntries.contains(rte)) {
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 b602b0b..be9134f 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
@@ -49,8 +49,7 @@
 	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];
+			for (IRuntimeClasspathEntry entry : fEntries) {
 				entry.setSourceAttachmentPath(classpathEntry.getSourceAttachmentPath());
 				entry.setSourceAttachmentRootPath(classpathEntry.getSourceAttachmentRootPath());
 				getViewer().refresh(entry);
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 615ee7b..4afc2e4 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
@@ -177,8 +177,7 @@
 			IStructuredSelection selection= getStructuredSelection();
 			if (selection != null) {
 				IBreakpoint selectedBreakpoint= (IBreakpoint)selection.getFirstElement();
-				for (int i = 0; i < breakpoints.length; i++) {
-					IBreakpoint breakpoint = breakpoints[i];
+				for (IBreakpoint breakpoint : breakpoints) {
 					if (selectedBreakpoint.equals(breakpoint)) {
 						selectionChanged(getAction(), selection);
 						return;
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 448dfcc..9844f68 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
@@ -31,10 +31,9 @@
 
 	public static void addListener(Control comp, String name) {
 		//strip mnemonic
-		String[] strs = name.split("&"); //$NON-NLS-1$
 		StringBuilder stripped = new StringBuilder();
-		for (int i = 0; i < strs.length; i++) {
-			stripped.append(strs[i]);
+		for (String str : name.split("&")) { //$NON-NLS-1$
+			stripped.append(str);
 		}
 		comp.getAccessible().addAccessibleListener(new ControlAccessibleListener(stripped.toString()));
 	}
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 8bd13d4..73de762 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
@@ -74,8 +74,8 @@
 					}
 				}
 				setEntries(list);
-				for (int i = 0; i < wrappers.length; i++) {
-					getViewer().refresh(wrappers[i]);
+				for (IRuntimeClasspathEntry wrapper : wrappers) {
+					getViewer().refresh(wrapper);
 				}
 			}
 		}
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 7b5dfd1..60641c0 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
@@ -289,6 +289,9 @@
         			}
         		}
         	}
+			String error = NLS.bind(ActionMessages.EvaluateAction__evaluation_failed__Reason, message);
+			Status status = new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), error, e);
+			JDIDebugUIPlugin.log(status);
             reportError(message);
         } catch (InterruptedException e) {
         }
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 adde917..9292b24 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
@@ -147,8 +147,8 @@
 	 * @param autosave the auto-save properties
 	 */
 	protected void addAutosaveProperties(int[] autosave) {
-		for (int i = 0; i < autosave.length; i++) {
-			fAutoSaveProperties.add(new Integer(autosave[i]));
+		for (int element : autosave) {
+			fAutoSaveProperties.add(new Integer(element));
 		}
 	}
 
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 f6359b7..94e5110 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,52 +59,51 @@
      */
     private void createBreakpoints(final Object[] selection) {
     	try {
-	        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<>(10);
-	            BreakpointUtils.addJavaBreakpointAttributes(map, type);
-	            int kind = IJavaClassPrepareBreakpoint.TYPE_CLASS;
-	            if (!type.isClass()) {
-	                kind = IJavaClassPrepareBreakpoint.TYPE_INTERFACE;
-	            }
-	            IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(JDIDebugModel.getPluginIdentifier());
-	            boolean exists = false;
-	            for (int j = 0; j < breakpoints.length; j++) {
-	                IJavaBreakpoint breakpoint = (IJavaBreakpoint) breakpoints[j];
-	                if (breakpoint instanceof IJavaClassPrepareBreakpoint) {
+			for (Object a : selection) {
+				final IType type = (IType) a;
+				final IResource resource = BreakpointUtils.getBreakpointResource(type);
+				final Map<String, Object> map = new HashMap<>(10);
+				BreakpointUtils.addJavaBreakpointAttributes(map, type);
+				int kind = IJavaClassPrepareBreakpoint.TYPE_CLASS;
+				if (!type.isClass()) {
+					kind = IJavaClassPrepareBreakpoint.TYPE_INTERFACE;
+				}
+				boolean exists = false;
+				for (IBreakpoint b : DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(JDIDebugModel.getPluginIdentifier())) {
+					IJavaBreakpoint breakpoint = (IJavaBreakpoint) b;
+					if (breakpoint instanceof IJavaClassPrepareBreakpoint) {
 						String typeName = breakpoint.getTypeName();
 						if (typeName != null && typeName.equals(type.getFullyQualifiedName())) {
-	                        exists = true;
-	                        break;
-	                    }
-	                }
-	            }
-	            if (!exists) {
-	                ISourceRange range = type.getNameRange();
-	                int start = -1;
-	                int end = -1;
-	                if (range != null) {
-	                    start = range.getOffset();
-	                    end = start + range.getLength();
-	                }
-	                final int finalKind = kind;
-	                final int finalStart = start;
-	                final int finalEnd = end;
-	                new Job(BreakpointMessages.AddClassPrepareBreakpointAction_2) {
-	                    @Override
+							exists = true;
+							break;
+						}
+					}
+				}
+				if (!exists) {
+					ISourceRange range = type.getNameRange();
+					int start = -1;
+					int end = -1;
+					if (range != null) {
+						start = range.getOffset();
+						end = start + range.getLength();
+					}
+					final int finalKind = kind;
+					final int finalStart = start;
+					final int finalEnd = end;
+					new Job(BreakpointMessages.AddClassPrepareBreakpointAction_2) {
+						@Override
 						protected IStatus run(IProgressMonitor monitor) {
-	                        try {
-	                            JDIDebugModel.createClassPrepareBreakpoint(resource, type.getFullyQualifiedName(), finalKind, finalStart, finalEnd, true, map);
-	                            return Status.OK_STATUS;
-	                        } catch (CoreException e) {
-	                            return e.getStatus();
-	                        }
-	                    }
+							try {
+								JDIDebugModel.createClassPrepareBreakpoint(resource, type.getFullyQualifiedName(), finalKind, finalStart, finalEnd, true, map);
+								return Status.OK_STATUS;
+							} catch (CoreException e) {
+								return e.getStatus();
+							}
+						}
 
-	                }.schedule();
-	            }
-	        }
+					}.schedule();
+				}
+			}
 	    } catch(CoreException e) {
 	    	JDIDebugUIPlugin.statusDialog(e.getStatus());
 	    }
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 3a0bea7..1b148a2 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
@@ -129,9 +129,9 @@
 						JDIDebugModel.getPluginIdentifier());
 		IJavaExceptionBreakpoint breakpoint = null;
 		boolean exists = false;
-		for (int j = 0; j < breakpoints.length; j++) {
-			if (breakpoints[j] instanceof IJavaExceptionBreakpoint) {
-				breakpoint = (IJavaExceptionBreakpoint) breakpoints[j];
+		for (IBreakpoint b : breakpoints) {
+			if (b instanceof IJavaExceptionBreakpoint) {
+				breakpoint = (IJavaExceptionBreakpoint) b;
 				String typeName = breakpoint.getTypeName();
 				if (typeName != null && typeName.equals(type.getFullyQualifiedName())) {
 					exists = true;
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 94ded24..25e78c8 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
@@ -40,8 +40,8 @@
 	 */
 	@Override
 	public void addPropertyListener(IPropertyListener listener) {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].addPropertyListener(listener);
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.addPropertyListener(listener);
 		}
 	}
 
@@ -50,8 +50,8 @@
 	 */
 	@Override
 	public void removePropertyListener(IPropertyListener listener) {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].removePropertyListener(listener);
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.removePropertyListener(listener);
 		}
 	}
 
@@ -60,8 +60,8 @@
 	 */
 	@Override
 	protected void dispose() {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].dispose();
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.dispose();
 		}
 		fEditors = null;
 	}
@@ -72,8 +72,8 @@
 	@Override
 	public Control createControl(Composite parent) {
 		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH, 0, 0);
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].createControl(comp);
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.createControl(comp);
 		}
 		return comp;
 	}
@@ -91,8 +91,8 @@
 	 */
 	@Override
 	public void doSave() throws CoreException {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].doSave();
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.doSave();
 		}
 	}
 
@@ -101,8 +101,8 @@
 	 */
 	@Override
 	public boolean isDirty() {
-		for (int i = 0; i < fEditors.length; i++) {
-			if (fEditors[i].isDirty()) {
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			if (editor.isDirty()) {
 				return true;
 			}
 		}
@@ -114,8 +114,8 @@
 	 */
 	@Override
 	public IStatus getStatus() {
-		for (int i = 0; i < fEditors.length; i++) {
-			IStatus status = fEditors[i].getStatus();
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			IStatus status = editor.getStatus();
 			if (!status.isOK()) {
 				return status;
 			}
@@ -136,8 +136,8 @@
 	 */
 	@Override
 	public void setInput(Object breakpoint) throws CoreException {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].setInput(breakpoint);
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.setInput(breakpoint);
 		}
 	}
 
@@ -147,8 +147,8 @@
 	@Override
 	public void setMnemonics(boolean mnemonics) {
 		super.setMnemonics(mnemonics);
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].setMnemonics(mnemonics);
+		for (AbstractJavaBreakpointEditor editor : fEditors) {
+			editor.setMnemonics(mnemonics);
 		}
 	}
 
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 b189413..321b765 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
@@ -170,9 +170,7 @@
 		}
 		if (parentElement == null) {
 			List<Object> all= new ArrayList<>();
-			Object[] topEntries= model.getEntries();
-			for (int i = 0; i < topEntries.length; i++) {
-				Object object = topEntries[i];
+			for (Object object : model.getEntries()) {
 				if (object instanceof ClasspathEntry) {
 					all.add(object);
 				} else if (object instanceof ClasspathGroup) {
@@ -219,16 +217,14 @@
 
 	public void setEntries(IRuntimeClasspathEntry[] entries) {
 		model.removeAll();
-		IRuntimeClasspathEntry entry;
-		for (int i = 0; i < entries.length; i++) {
-			entry= entries[i];
+		for (IRuntimeClasspathEntry entry : entries) {
 			switch (entry.getClasspathProperty()) {
-				case IRuntimeClasspathEntry.USER_CLASSES:
-					model.addEntry(ClasspathModel.USER, entry);
-					break;
-				default:
-					model.addEntry(ClasspathModel.BOOTSTRAP, entry);
-					break;
+			case IRuntimeClasspathEntry.USER_CLASSES:
+				model.addEntry(ClasspathModel.USER, entry);
+				break;
+			default:
+				model.addEntry(ClasspathModel.BOOTSTRAP, entry);
+				break;
 			}
 		}
 		refresh();
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 ee97b2f..09ec096 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
@@ -145,8 +145,7 @@
 
 	public void removeAll(Object[] entries) {
 
-		for (int i = 0; i < entries.length; i++) {
-			Object object = entries[i];
+		for (Object object : entries) {
 			if (object instanceof ClasspathEntry) {
 				IClasspathEntry entryParent= ((ClasspathEntry)object).getParent();
 				if (entryParent instanceof ClasspathGroup) {
@@ -165,8 +164,8 @@
 			getBootstrapEntry();
 		}
 		bootstrapEntries.removeAll();
-		for (int i = 0; i < entries.length; i++) {
-			bootstrapEntries.addEntry(new ClasspathEntry(entries[i], bootstrapEntries), null);
+		for (IRuntimeClasspathEntry entry : entries) {
+			bootstrapEntries.addEntry(new ClasspathEntry(entry, bootstrapEntries), null);
 		}
 	}
 
@@ -174,8 +173,8 @@
 
 		ClasspathGroup group= new ClasspathGroup(name, entryParent, canBeRemoved);
 
-		for (int i = 0; i < entries.length; i++) {
-			group.addEntry(new ClasspathEntry(entries[i], group), null);
+		for (IRuntimeClasspathEntry entry : entries) {
+			group.addEntry(new ClasspathEntry(entry, group), null);
 		}
 
 		if (addEntry) {
@@ -189,8 +188,8 @@
 			getUserEntry();
 		}
 		userEntries.removeAll();
-		for (int i = 0; i < entries.length; i++) {
-			userEntries.addEntry(new ClasspathEntry(entries[i], userEntries), null);
+		for (IRuntimeClasspathEntry entry : entries) {
+			userEntries.addEntry(new ClasspathEntry(entry, userEntries), null);
 		}
 	}
 
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DependenciesContentProvider.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DependenciesContentProvider.java
index a50f491..aceb4d9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DependenciesContentProvider.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/classpath/DependenciesContentProvider.java
@@ -44,16 +44,14 @@
 	@Override
 	public void setEntries(IRuntimeClasspathEntry[] entries) {
 		model.removeAll();
-		IRuntimeClasspathEntry entry;
-		for (int i = 0; i < entries.length; i++) {
-			entry= entries[i];
+		for (IRuntimeClasspathEntry entry : entries) {
 			switch (entry.getClasspathProperty()) {
-				case IRuntimeClasspathEntry.MODULE_PATH:
-					model.addEntry(DependencyModel.MODULE_PATH, entry);
-					break;
-				default:
-					model.addEntry(DependencyModel.CLASS_PATH, entry);
-					break;
+			case IRuntimeClasspathEntry.MODULE_PATH:
+				model.addEntry(DependencyModel.MODULE_PATH, entry);
+				break;
+			default:
+				model.addEntry(DependencyModel.CLASS_PATH, entry);
+				break;
 			}
 		}
 		refresh();
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 c5c41b7..614eb2f 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2018 IBM Corporation and others.
+ * Copyright (c) 2007, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -132,7 +132,7 @@
 			@Override
 			public void modifyText(ModifyEvent e) {
 				if (!fIgnoreCallbacks) {
-					validateVMName();
+					validateVMName(false);
 				}
 			}
 		});
@@ -228,8 +228,8 @@
 	/**
 	 * Validates the entered name of the VM
 	 */
-	private void validateVMName() {
-		nameChanged(fVMName.getText());
+	private void validateVMName(boolean init) {
+		nameChanged(fVMName.getText(), init);
 	}
 
 	/* (non-Javadoc)
@@ -309,8 +309,15 @@
 		try {
 			fIgnoreCallbacks = true;
 			fLibraryBlock.setSelection(fVM);
-			fVMName.setText(fVM.getName());
-			fVMName.setSelection(fVM.getName().length());
+			if (fVMName.getText() != null && fVMName.getText().length() == 0) {
+				if (fVM.getName().length() != 0) {
+					fVMName.setText(fVM.getName());
+					fVMName.setSelection(fVM.getName().length());
+				}
+			} else {
+				fVMName.setText(fVM.getName());
+				fVMName.setSelection(fVM.getName().length());
+			}
 			String eePath = fVM.getAttribute(EEVMInstall.ATTR_DEFINITION_FILE);
 			if (eePath != null) {
 				fEEFile.setText(eePath);
@@ -320,7 +327,7 @@
 			if (vmArgs != null) {
 				fVMArgs.setText(vmArgs);
 			}
-			validateVMName();
+			validateVMName(true);
 		} finally {
 			fIgnoreCallbacks = false;
 		}
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 0a6ba6c..0dd221c 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -338,7 +338,9 @@
 	@Override
 	public void dispose() {
 		super.dispose();
-		fJREBlock.dispose();
+		if (fJREBlock != null) {
+			fJREBlock.dispose();
+		}
 	}
 
 	/*
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 8af7ce7..058a897 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2018 IBM Corporation and others.
+ * Copyright (c) 2007, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -130,13 +130,13 @@
 		fVMName.addModifyListener(new ModifyListener() {
 			@Override
 			public void modifyText(ModifyEvent e) {
-				validateVMName();
+				validateVMName(false);
 			}
 		});
 		fJRERoot.addModifyListener(new ModifyListener() {
 			@Override
 			public void modifyText(ModifyEvent e) {
-				validateJRELocation();
+				validateJRELocation(false);
 			}
 		});
 		folders.addSelectionListener(new SelectionListener() {
@@ -178,12 +178,17 @@
 
 	/**
 	 * Validates the JRE location
+	 * @param init <code>true</code> if page is getting initialized else <code>false</code>
 	 * @return the status after validating the JRE location
 	 */
-	private void validateJRELocation() {
+	private void validateJRELocation(boolean init) {
 		String locationName = fJRERoot.getText();
 		IStatus s = null;
 		File file = null;
+		if (locationName.length() == 0 && init) {
+			return;
+		}
+
 		if (locationName.length() == 0) {
 			s = new StatusInfo(IStatus.WARNING, JREMessages.addVMDialog_enterLocation);
 		}
@@ -289,10 +294,11 @@
 
 	/**
 	 * Validates the entered name of the VM
+	 * @param init <code>true</code> if page is getting initialized else <code>false</code>
 	 * @return the status of the name validation
 	 */
-	private void validateVMName() {
-		nameChanged(fVMName.getText());
+	private void validateVMName(boolean init) {
+		nameChanged(fVMName.getText(), init);
 	}
 
 	/* (non-Javadoc)
@@ -371,7 +377,13 @@
 	 */
 	private void initializeFields() {
 		fLibraryBlock.setSelection(fVM);
-		fVMName.setText(fVM.getName());
+		if (fVMName.getText() != null && fVMName.getText().length() == 0) {
+			if (fVM.getName().length() != 0) {
+				fVMName.setText(fVM.getName());
+			}
+		} else {
+			fVMName.setText(fVM.getName());
+		}
 		File installLocation = fVM.getInstallLocation();
 		if (installLocation != null) {
 			fJRERoot.setText(installLocation.getAbsolutePath());
@@ -380,8 +392,8 @@
 		if (vmArgs != null) {
 			fVMArgs.setText(vmArgs);
 		}
-		validateVMName();
-		validateJRELocation();
+		validateVMName(true);
+		validateJRELocation(true);
 	}
 
 	/**
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 bea23dc..aa81d95 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
@@ -145,10 +145,9 @@
 		}
 		if (element instanceof ICompilationUnit) {
 			ICompilationUnit cu= (ICompilationUnit)element;
-			IType[] types= cu.getAllTypes();
-			for (int i= 0; i < types.length; i++) {
-				if (isSubclassOfApplet(monitor, types[i])) {
-					result.add(types[i]);
+			for (IType type : cu.getAllTypes()) {
+				if (isSubclassOfApplet(monitor, type)) {
+					result.add(type);
 				}
 			}
 		} else if (element instanceof IOrdinaryClassFile) {
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 da61bf0..57a7afb 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
@@ -60,10 +60,9 @@
 			return isArchivePath(((IFile)element).getFullPath());
 		} else if (element instanceof IContainer) { // IProject, IFolder
 			try {
-				IResource[] resources= ((IContainer)element).members();
-				for (int i= 0; i < resources.length; i++) {
+				for (IResource resource : ((IContainer) element).members()) {
 					// recursive! Only show containers that contain an archive
-					if (select(viewer, parent, resources[i])) {
+					if (select(viewer, parent, resource)) {
 						return true;
 					}
 				}
@@ -77,8 +76,8 @@
 	public static boolean isArchivePath(IPath path) {
 		String ext= path.getFileExtension();
 		if (ext != null && ext.length() != 0) {
-			for (int i= 0; i < fgArchiveExtensions.length; i++) {
-				if (ext.equalsIgnoreCase(fgArchiveExtensions[i])) {
+			for (String archiveExtension : fgArchiveExtensions) {
+				if (ext.equalsIgnoreCase(archiveExtension)) {
 					return true;
 				}
 			}
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 11a002a..224cab5 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
@@ -288,9 +288,9 @@
 	@Override
 	protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException {
 		if(fTypes != null && fTypes.length > 0) {
-			for(int i = 0; i < fTypes.length; i++) {
-				if(itemsFilter.isConsistentItem(fTypes[i])) {
-					contentProvider.add(fTypes[i], itemsFilter);
+			for (IType type : fTypes) {
+				if (itemsFilter.isConsistentItem(type)) {
+					contentProvider.add(type, itemsFilter);
 				}
 			}
 		}
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 0849d31..0aad2b2 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
@@ -183,8 +183,8 @@
 		Object[] filters = fFilterContentProvider.getElements(null);
 		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];
+		for (Object f : filters) {
+			Filter filter = (Filter) f;
 			String name = filter.getName();
 			if (name.equals(DEFAULT_PACKAGE)) {
 				name = ""; //$NON-NLS-1$
@@ -350,9 +350,8 @@
 			return;
 			// otherwise, commit the new value if not a duplicate
 		} else {
-			Object[] filters = fFilterContentProvider.getElements(null);
-			for (int i = 0; i < filters.length; i++) {
-				Filter filter = (Filter) filters[i];
+			for (Object f : fFilterContentProvider.getElements(null)) {
+				Filter filter = (Filter) f;
 				if (filter.getName().equals(trimmedValue)) {
 					removeNewFilter();
 					cleanupEditor();
@@ -446,8 +445,8 @@
 		}
 		Object[] packages = dialog.getResult();
 		if (packages != null) {
-			for (int i = 0; i < packages.length; i++) {
-				IJavaElement pkg = (IJavaElement) packages[i];
+			for (Object p : packages) {
+				IJavaElement pkg = (IJavaElement) p;
 				String filter = pkg.getElementName();
 				if (filter.length() < 1) {
 					filter = DEFAULT_PACKAGE;
@@ -479,10 +478,9 @@
 		}
 
 		Object[] types = dialog.getResult();
-		IType type;
 		if (types != null) {
-			for (int i = 0; i < types.length; i++) {
-				type = (IType) types[i];
+			for (Object t : types) {
+				IType type = (IType) t;
 				Filter f = fFilterContentProvider.addFilter(type.getFullyQualifiedName());
 				fFilterContentProvider.checkFilter(f, true);
 			}
@@ -522,8 +520,7 @@
 		}
 
 		protected void populateFilters(String[] filters, boolean checked) {
-			for (int i = 0; i < filters.length; i++) {
-				String name = filters[i];
+			for (String name : filters) {
 				if (name.length() == 0) {
 					name = DEFAULT_PACKAGE;
 				}
@@ -542,8 +539,8 @@
 		}
 
 		public void removeFilters(Object[] filters) {
-			for (int i = 0; i < filters.length; i++) {
-				Filter filter = (Filter) filters[i];
+			for (Object f : filters) {
+				Filter filter = (Filter) f;
 				fFilters.remove(filter);
 			}
 			fViewer.remove(filters);
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 60d8b90..8d504be 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
@@ -93,9 +93,8 @@
 	 */
 	protected void setInitialCheckedState() {
 		try {
-			IJavaObject[] objects = fBreakpoint.getInstanceFilters();
-			for (int i= 0; i < objects.length; i++) {
-				fCheckHandler.checkObject(objects[i], true);
+			for (IJavaObject object : fBreakpoint.getInstanceFilters()) {
+				fCheckHandler.checkObject(object, true);
 			}
 		} catch (CoreException e) {
 			JDIDebugUIPlugin.log(e);
@@ -104,10 +103,9 @@
 
 	protected void doStore() {
 		try {
-			IJavaObject[] objects = fBreakpoint.getInstanceFilters();
-			for (int i= 0; i < objects.length; i++) {
-				if (!fInstanceViewer.getChecked(objects[i])) {
-					fBreakpoint.removeInstanceFilter(objects[i]);
+			for (IJavaObject object : fBreakpoint.getInstanceFilters()) {
+				if (!fInstanceViewer.getChecked(object)) {
+					fBreakpoint.removeInstanceFilter(object);
 				}
 			}
 		}  catch (CoreException e) {
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 a983da5..395406c 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
@@ -79,18 +79,15 @@
 	}
 
 	protected void doStore() {
-		IDebugTarget[] targets= getDebugTargets();
 		IJavaDebugTarget target;
-		IThread[] threads;
 		IJavaThread thread;
-		for (int i= 0, numTargets= targets.length; i < numTargets; i++) {
-			target = targets[i].getAdapter(IJavaDebugTarget.class);
+		for (IDebugTarget debugTarget : getDebugTargets()) {
+			target = debugTarget.getAdapter(IJavaDebugTarget.class);
 			if (target != null) {
 				try {
 					if (fThreadViewer.getChecked(target)) {
-						threads= target.getThreads();
-						for (int j=0, numThreads= threads.length; j < numThreads; j++) {
-							thread= (IJavaThread)threads[j];
+						for (IThread targetThread : target.getThreads()) {
+							thread= (IJavaThread)targetThread;
 							if (fThreadViewer.getChecked(thread)) {
 								// thread selected for filtering
 								fPage.getBreakpoint().setThreadFilter(thread);
@@ -116,9 +113,8 @@
 	 */
 	protected void setInitialCheckedState() {
 		try {
-			IDebugTarget[] targets= getDebugTargets();
-			for (int i= 0, numTargets= targets.length; i < numTargets; i++) {
-				IJavaDebugTarget target = targets[i].getAdapter(IJavaDebugTarget.class);
+			for (IDebugTarget debugTarget : getDebugTargets()) {
+				IJavaDebugTarget target = debugTarget.getAdapter(IJavaDebugTarget.class);
 				if (target != null) {
 					IJavaThread filteredThread= fPage.getBreakpoint().getThreadFilter(target);
 					if (filteredThread != null) {
@@ -176,8 +172,8 @@
 				IThread thread;
 				boolean checkedThread= false;
 				// Try to check the "main" thread by default
-				for (int i= 0, numThreads= threads.length; i < numThreads; i++) {
-					thread= threads[i];
+				for (IThread targetThread : threads) {
+					thread= targetThread;
 					String name= null;
 					try {
 						name= thread.getName();
@@ -191,8 +187,8 @@
 				// If the main thread couldn't be checked, check the first
 				// available thread
 				if (!checkedThread) {
-					for (int i= 0, numThreads= threads.length; i < numThreads; i++) {
-						if (fThreadViewer.setChecked(threads[i], true)) {
+					for (IThread targetThread : threads) {
+						if (fThreadViewer.setChecked(targetThread, true)) {
 							break;
 						}
 					}
@@ -205,8 +201,8 @@
 					JDIDebugUIPlugin.log(exception);
 					return;
 				}
-				for (int i= 0, numThreads= threads.length; i < numThreads; i++) {
-					fThreadViewer.setChecked(threads[i], false);
+				for (IThread thread : threads) {
+					fThreadViewer.setChecked(thread, false);
 				}
 			}
 		}
@@ -235,10 +231,10 @@
 					JDIDebugUIPlugin.log(exception);
 					return;
 				}
-				for (int i= 0, numThreads= threads.length; i < numThreads; i++) {
-					if (threads[i] != thread) {
+				for (IThread targetThread : threads) {
+					if (targetThread != thread) {
 						// Uncheck all threads other than the selected thread
-						fThreadViewer.setChecked(threads[i], false);
+						fThreadViewer.setChecked(targetThread, false);
 					}
 				}
 			} else {
@@ -257,8 +253,8 @@
 			IDebugTarget target;
 			IThread[] threads;
 			boolean checkedThread;
-			for (int i= 0, numTargets= targets.length; i < numTargets; i++) {
-				target= targets[i];
+			for (IDebugTarget debugTarget : targets) {
+				target= debugTarget;
 				if (!fThreadViewer.getChecked(target)) {
 					continue;
 				}
@@ -269,8 +265,8 @@
 					continue;
 				}
 				checkedThread= false;
-				for (int j= 0, numThreads= threads.length; j < numThreads; j++) {
-					if (fThreadViewer.getChecked(threads[j])) {
+				for (IThread thread : threads) {
+					if (fThreadViewer.getChecked(thread)) {
 						checkedThread= true;
 						break;
 					}
@@ -306,10 +302,10 @@
 				ILaunch[] launches= ((ILaunchManager) parent).getLaunches();
 				IDebugTarget[] targets;
 				IJavaDebugTarget target;
-				for (int i= 0, numLaunches= launches.length; i < numLaunches; i++) {
-					targets= launches[i].getDebugTargets();
-					for (int j= 0, numTargets= targets.length; j < numTargets; j++) {
-						target= targets[j].getAdapter(IJavaDebugTarget.class);
+				for (ILaunch launch : launches) {
+					targets= launch.getDebugTargets();
+					for (IDebugTarget debugTarget : targets) {
+						target= debugTarget.getAdapter(IJavaDebugTarget.class);
 						if (target != null && !target.isDisconnected() && !target.isTerminated()) {
 							children.add(target);
 						}
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 19f9134..c6fe60f 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
@@ -243,8 +243,8 @@
 		}
 		IResource[] resources = config.getMappedResources();
 		if (resources != null) {
-			for (int i = 0; i < resources.length; i++) {
-				if (scope.encloses(resources[i].getFullPath().toString())) {
+			for (IResource resource : resources) {
+				if (scope.encloses(resource.getFullPath().toString())) {
 					return true;
 				}
 			}
@@ -264,13 +264,13 @@
 		ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
 		monitor.beginTask("Searching for launch configurations", configs.length); //$NON-NLS-1$
 		try {
-			for (int i = 0; i < configs.length; ++i) {
+			for (ILaunchConfiguration config : configs) {
 				if (monitor.isCanceled()) {
 					return;
 				}
 				monitor.worked(1);
-				if (matches(scope, configs[i], pattern)) {
-					requestor.reportMatch(new Match(configs[i], 0, 0));
+				if (matches(scope, config, pattern)) {
+					requestor.reportMatch(new Match(config, 0, 0));
 				}
 			}
 		} finally {
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 507281d..9ed9c13 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
@@ -506,11 +506,9 @@
 		if (fVM != null) {
 			DebugPlugin.getDefault().addDebugEventFilter(this);
 			try {
-				IThread[] threads= fVM.getThreads();
-				for (int i = 0; i < threads.length; i++) {
-					IThread iThread = threads[i];
-					if (iThread.isSuspended()) {
-						iThread.resume();
+				for (IThread thread : fVM.getThreads()) {
+					if (thread.isSuspended()) {
+						thread.resume();
 					}
 				}
 			} catch (DebugException de) {
@@ -630,10 +628,8 @@
 			public void run() {
 				Shell shell= getShell();
 				if (fSnippetStateListeners != null && shell != null && !shell.isDisposed()) {
-					List<ISnippetStateChangedListener> v = new ArrayList<>(fSnippetStateListeners);
-					for (int i= 0; i < v.size(); i++) {
-						ISnippetStateChangedListener l= v.get(i);
-						l.snippetStateChanged(JavaSnippetEditor.this);
+					for (ISnippetStateChangedListener listener : new ArrayList<>(fSnippetStateListeners)) {
+						listener.snippetStateChanged(JavaSnippetEditor.this);
 					}
 				}
 			}
@@ -844,8 +840,8 @@
 		String delimiter = document.getLegalLineDelimiters()[0];
 
 		final StringBuilder errorString = new StringBuilder();
-		for (int i = 0; i < errors.length; i++) {
-			errorString.append(errors[i] + delimiter);
+		for (String error : errors) {
+			errorString.append(error + delimiter);
 		}
 
 		Runnable r = new Runnable() {
@@ -1083,8 +1079,7 @@
 	 */
 	@Override
 	public DebugEvent[] filterDebugEvents(DebugEvent[] events) {
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent e = events[i];
+		for (DebugEvent e : events) {
 			Object source = e.getSource();
 			if (source instanceof IDebugElement) {
 				IDebugElement de = (IDebugElement)source;
@@ -1117,19 +1112,18 @@
 								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) {
-								    // restore step filters
-								    target.setStepFiltersEnabled(fStepFiltersSetting);
+									// restore step filters
+									target.setStepFiltersEnabled(fStepFiltersSetting);
 									setThread(jt);
 									return null;
 								} else if (e.getDetail() == DebugEvent.BREAKPOINT &&  bps.length > 0 && bps[0].equals(ScrapbookLauncher.getDefault().getMagicBreakpoint(jt.getDebugTarget()))) {
 									// locate the 'eval' method and step over
-									IStackFrame[] frames = jt.getStackFrames();
-									for (int j = 0; j < frames.length; j++) {
-										IJavaStackFrame frame = (IJavaStackFrame)frames[j];
+									for (IStackFrame stackframe :  jt.getStackFrames()) {
+										IJavaStackFrame frame = (IJavaStackFrame) stackframe;
 										if (frame.getReceivingTypeName().equals("org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain1") && frame.getName().equals("eval")) { //$NON-NLS-1$ //$NON-NLS-2$
-										    // ignore step filters for this step
-										    fStepFiltersSetting = target.isStepFiltersEnabled();
-										    target.setStepFiltersEnabled(false);
+											// ignore step filters for this step
+											fStepFiltersSetting = target.isStepFiltersEnabled();
+											target.setStepFiltersEnabled(false);
 											frame.stepOver();
 											return null;
 										}
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 0eea33f..3ebf6e3 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
@@ -146,10 +146,9 @@
 		cp.add(supportEntry);
 		// get bootpath entries
 		try {
-			IRuntimeClasspathEntry[] entries = JavaRuntime.computeUnresolvedRuntimeClasspath(javaProject);
-			for (int i = 0; i < entries.length; i++) {
-				if (entries[i].getClasspathProperty() != IRuntimeClasspathEntry.USER_CLASSES) {
-					cp.add(entries[i]);
+			for (IRuntimeClasspathEntry entry : JavaRuntime.computeUnresolvedRuntimeClasspath(javaProject)) {
+				if (entry.getClasspathProperty() != IRuntimeClasspathEntry.USER_CLASSES) {
+					cp.add(entry);
 				}
 			}
 			IRuntimeClasspathEntry[] classPath = cp.toArray(new IRuntimeClasspathEntry[cp.size()]);
@@ -216,8 +215,8 @@
 
 			// convert to mementos
 			List<String> classpathList= new ArrayList<>(classPath.length);
-			for (int i = 0; i < classPath.length; i++) {
-				classpathList.add(classPath[i].getMemento());
+			for (IRuntimeClasspathEntry cp : classPath) {
+				classpathList.add(cp.getMemento());
 			}
 			if(wc == null) {
 				wc = config.getWorkingCopy();
@@ -230,9 +229,9 @@
 			}
 
 			StringBuilder urlsString = new StringBuilder();
-			for (int i = 0; i < urls.length; i++) {
+			for (String url : urls) {
 				urlsString.append(' ');
-				urlsString.append(urls[i]);
+				urlsString.append(url);
 			}
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, urlsString.toString());
 			wc.setAttribute(SCRAPBOOK_LAUNCH, SCRAPBOOK_LAUNCH);
@@ -293,8 +292,7 @@
 	 */
 	@Override
 	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
+		for (DebugEvent event : events) {
 			if (event.getSource() instanceof IDebugTarget && event.getKind() == DebugEvent.TERMINATE) {
 				cleanup((IDebugTarget)event.getSource());
 			}
@@ -506,16 +504,15 @@
 	public void cleanupLaunchConfigurations() {
 		try {
 			ILaunchConfigurationType lcType = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
-			ILaunchConfiguration[] configs = getLaunchManager().getLaunchConfigurations(lcType);
 			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-			for (int i = 0; i < configs.length; i++) {
-				String path = configs[i].getAttribute(SCRAPBOOK_FILE_PATH, (String)null);
+			for (ILaunchConfiguration config : getLaunchManager().getLaunchConfigurations(lcType)) {
+				String path = config.getAttribute(SCRAPBOOK_FILE_PATH, (String)null);
 				if (path != null) {
 					IPath pagePath = new Path(path);
 					IResource res = root.findMember(pagePath);
 					if (res == null) {
 						// config without a page - delete it
-						configs[i].delete();
+						config.delete();
 					}
 				}
 			}
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 798725e..869ffb6 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
@@ -84,8 +84,7 @@
 		protected void populateImports() {
 			fImportNames= new ArrayList<>(1);
 			if (fImports != null) {
-				for (int i = 0; i < fImports.length; i++) {
-					String name = fImports[i];
+				for (String name : fImports) {
 					addImport(name);
 				}
 			}
@@ -101,8 +100,8 @@
 
 
 		protected void removeImports(Object[] imports) {
-			for (int i = 0; i < imports.length; i++) {
-				Filter imprt = (Filter)imports[i];
+			for (Object i : imports) {
+				Filter imprt = (Filter) i;
 				fImportNames.remove(imprt);
 			}
 			fViewer.remove(imports);
@@ -201,9 +200,7 @@
 			IJavaProject project= fEditor.getJavaProject();
 			List<IJavaElement> projects= new ArrayList<>();
 			projects.add(project);
-			IPackageFragmentRoot[] roots= project.getAllPackageFragmentRoots();
-			for (int i = 0; i < roots.length; i++) {
-				IPackageFragmentRoot root = roots[i];
+			for (IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) {
 				projects.add(root.getParent());
 			}
 			dialog = JDIDebugUIPlugin.createAllPackagesDialog(shell, projects.toArray(new IJavaProject[projects.size()]), false);
@@ -224,8 +221,8 @@
 		}
 		Object[] packages= dialog.getResult();
 		if (packages != null) {
-			for (int i = 0; i < packages.length; i++) {
-				IJavaElement pkg = (IJavaElement)packages[i];
+			for (Object p : packages) {
+				IJavaElement pkg = (IJavaElement) p;
 				String filter = pkg.getElementName();
 				filter += ".*"; //$NON-NLS-1$
 				fImportContentProvider.addImport(filter);
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 6c9cb8d..3c82081 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
@@ -97,8 +97,8 @@
 			Object[] selections = dialog.getResult();
 			List<IJavaProject> additions = new ArrayList<>(selections.length);
 			try {
-				for (int i = 0; i < selections.length; i++) {
-					IJavaProject jp = (IJavaProject)selections[i];
+				for (Object selection : selections) {
+					IJavaProject jp = (IJavaProject) selection;
 					if (dialog.isAddRequiredProjects()) {
 						collectRequiredProjects(jp, additions);
 					} else {
@@ -145,13 +145,11 @@
 			projects= new IJavaProject[0];
 		}
 		List<IJavaProject> remaining = new ArrayList<>();
-		for (int i = 0; i < projects.length; i++) {
-			remaining.add(projects[i]);
+		for (IJavaProject project : projects) {
+			remaining.add(project);
 		}
 		List<IJavaProject> alreadySelected = new ArrayList<>();
-		ISourceContainer[] containers = director.getSourceContainers();
-		for (int i = 0; i < containers.length; i++) {
-			ISourceContainer container = containers[i];
+		for (ISourceContainer container : director.getSourceContainers()) {
 			if (container.getType().getId().equals(JavaProjectSourceContainer.TYPE_ID)) {
 				alreadySelected.add(((JavaProjectSourceContainer)container).getJavaProject());
 			}
@@ -175,9 +173,7 @@
 
 			IJavaModel model= proj.getJavaModel();
 
-			IClasspathEntry[] entries= proj.getRawClasspath();
-			for (int i= 0; i < entries.length; i++) {
-				IClasspathEntry curr= entries[i];
+			for (IClasspathEntry curr : proj.getRawClasspath()) {
 				if (curr.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
 					IJavaProject ref= model.getJavaProject(curr.getPath().segment(0));
 					if (ref.exists()) {
@@ -197,9 +193,7 @@
 	 * @throws CoreException if an exception occurs
 	 */
 	protected void collectExportedEntries(IJavaProject proj, List<ISourceContainer> list) throws CoreException {
-		IClasspathEntry[] entries = proj.getRawClasspath();
-		for (int i = 0; i < entries.length; i++) {
-			IClasspathEntry entry = entries[i];
+		for (IClasspathEntry entry : proj.getRawClasspath()) {
 			ISourceContainer sourceContainer = null;
 			if (entry.isExported()) {
 				switch (entry.getEntryKind()) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaModelProxyFactory.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaModelProxyFactory.java
index 8526f23..09c6eb0 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaModelProxyFactory.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/threadgroups/JavaModelProxyFactory.java
@@ -35,9 +35,8 @@
 		if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {
 			if (element instanceof IJavaDebugTarget) {
 				ILaunch launch = ((IDebugTarget) element).getLaunch();
-				Object[] children = launch.getChildren();
-				for (int i = 0; i < children.length; i++) {
-					if (children[i] == element) {
+				for (Object child : launch.getChildren()) {
+					if (child == element) {
 						// ensure the target is a visible child of the launch
 						return new JavaDebugTargetProxy((IDebugTarget) element);
 					}
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 f7c6ad3..66b02a2 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
@@ -59,12 +59,12 @@
 			IJavaThread[] threads = group.getThreads();
 			Object[] kids = new Object[threadGroups.length + threads.length];
 			int index = 0;
-			for (int i = 0; i < threads.length; i++) {
-				kids[index]= threads[i];
+			for (IJavaThread thread : threads) {
+				kids[index]= thread;
 				index++;
 			}
-			for (int i = 0; i < threadGroups.length; i++) {
-				kids[index] = threadGroups[i];
+			for (IJavaThreadGroup threadGroup : threadGroups) {
+				kids[index] = threadGroup;
 				index++;
 			}
 			return kids;
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 8217702..376cc9f 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
@@ -49,10 +49,10 @@
 
 		if (filterStatics || filterConstants) {
 			List<Object> keep = new ArrayList<>(variables.length);
-			for (int i = 0; i < variables.length; i++) {
+			for (Object variable : variables) {
 				boolean filter = false;
-				if (variables[i] instanceof IJavaVariable){
-					IJavaVariable var = (IJavaVariable)variables[i];
+				if (variable instanceof IJavaVariable) {
+					IJavaVariable var = (IJavaVariable) variable;
 					if (var.isStatic()){
 						if (var.isFinal()){
 							filter = filterConstants;
@@ -61,8 +61,8 @@
 						}
 					}
 				}
-				if (!filter){
-					keep.add(variables[i]);
+				if (!filter) {
+					keep.add(variable);
 				}
 			}
 			return keep.toArray(new Object[keep.size()]);
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java
index 03a05fa..34d5aa8 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2019 Jesper Steen Møller and others.
+ * Copyright (c) 2019, 2020 Jesper Steen Møller and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -118,10 +118,14 @@
 				@Override
 				public void acceptProblem(IMarker problemMarker, String fragmentSource, int fragmentKind) {
 					if (problemMarker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO) >= IMarker.SEVERITY_ERROR) {
-						errors.add(problemMarker.toString());
+						errors.add(toString(problemMarker));
 					}
 				}
 
+				private String toString(IMarker marker) {
+					return marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
+				}
+
 				@Override
 				public boolean acceptClassFiles(byte[][] classFileBytes, String[][] classFileCompoundNames, String mainCodeSnippetClassName) {
 					for (int i = 0; i < classFileCompoundNames.length; ++i) {
@@ -1483,6 +1487,12 @@
 			return false;
 		}
 
+		private boolean needToQualify(SimpleName node) {
+			if (node.getParent() instanceof QualifiedName || node.getParent() instanceof QualifiedType) {
+				return false;
+			}
+			return true;
+		}
 		@Override
 		public boolean visit(SimpleName node) {
 			IBinding binding = node.resolveBinding();
@@ -1492,15 +1502,18 @@
 					// For future optimization: Check for duplicates, so same value is only bound once
 					if (vb.isField()) {
 						if (Modifier.isStatic(vb.getModifiers())) {
-							ITypeBinding declaringClass = vb.getDeclaringClass();
-							buffer.append(declaringClass.getQualifiedName());
-							buffer.append("."); //$NON-NLS-1$
+							if (needToQualify(node)) {
+								ITypeBinding declaringClass = vb.getDeclaringClass();
+								buffer.append(declaringClass.getQualifiedName());
+								buffer.append("."); //$NON-NLS-1$
+							}
+
 							buffer.append(node.getIdentifier());
 
 						} else {
 							// TODO: Fix this to use same method as visit(FieldAccess)
 							ITypeBinding declaringClass = vb.getDeclaringClass();
-							String newVarName = new String(LOCAL_VAR_PREFIX) + allocateNewVariable(declaringClass, "this"); //$NON-NLS-1$
+							String newVarName = allocateNewVariable(declaringClass, LOCAL_VAR_PREFIX.concat("this")); //$NON-NLS-1$
 							binder.bindThis(declaringClass, newVarName);
 							// buffer.append("this."); //$NON-NLS-1$
 							buffer.append(newVarName);
@@ -1786,7 +1799,7 @@
 		public boolean visit(ThisExpression node) {
 			ITypeBinding thisType = node.resolveTypeBinding();
 
-			String newVarName = new String(LOCAL_VAR_PREFIX) + allocateNewVariable(thisType, "this"); //$NON-NLS-1$
+			String newVarName = allocateNewVariable(thisType, LOCAL_VAR_PREFIX.concat("this")); //$NON-NLS-1$
 			binder.bindThis(thisType, newVarName);
 			// buffer.append("this."); //$NON-NLS-1$
 			buffer.append(newVarName);
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 fa25001..fc682b1 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
@@ -331,7 +331,8 @@
 				if (variable instanceof IJavaVariable && !isLambdaOrImplicitVariable(variable)) {
 					IJavaVariable javaVariable = (IJavaVariable) variable;
 					final boolean lambdaField = LambdaUtils.isLambdaField(variable);
-					String variableName = (lambdaField) ? variable.getName().substring(ANONYMOUS_VAR_PREFIX.length()) : variable.getName();
+					String name = variable.getName();
+					String variableName = (lambdaField && name.startsWith(ANONYMOUS_VAR_PREFIX)) ? name.substring(ANONYMOUS_VAR_PREFIX.length()) : name;
 					if (variableName != null && (!variableName.contains("$") || lambdaField)) { //$NON-NLS-1$
 						if (!isLocalType(javaVariable.getSignature()) && !names.contains(variableName)) {
 							locals[numLocals] = javaVariable;
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 4deac01..f7b5255 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
@@ -384,7 +384,7 @@
 						IJavaStackFrame previousFrame = frames.get(previousIndex);
 						ObjectReference underlyingThisObject = ((JDIStackFrame) previousFrame).getUnderlyingThisObject();
 						IJavaValue closureValue = JDIValue.createValue((JDIDebugTarget) getDebugTarget(), underlyingThisObject);
-						setLambdaVariableNames(closureValue, underlyingThisObject);
+						tryToResolveLambdaVariableNames(closureValue, underlyingThisObject);
 						fVariables.add(new JDILambdaVariable(closureValue));
 					}
 				}
@@ -404,7 +404,15 @@
 		}
 	}
 
-	private void setLambdaVariableNames(IJavaValue value, ObjectReference underlyingThisObject) {
+	/**
+	 * Tries to resolve "real" captured variable names by inspecting corresponding Java source code (if available)
+	 */
+	protected void tryToResolveLambdaVariableNames(IJavaValue value, ObjectReference underlyingThisObject) {
+		if (!isProbablyJavaCode()) {
+			// See bug 562056: we won't parse Java code if the current frame doesn't belong to Java, because
+			// we will most likely have different source line numbers and will produce garbage or errors
+			return;
+		}
 		try {
 			IType type = JavaDebugUtils.resolveType(value.getJavaType());
 			if (type == null) {
@@ -427,6 +435,27 @@
 		}
 	}
 
+	/**
+	 * @return {@code true} if the current frame relates to the class generated from Java source file (and not from some different language)
+	 */
+	protected boolean isProbablyJavaCode() {
+		try {
+			String sourceName = getSourceName();
+			// Note: JavaCore.isJavaLikeFileName(sourceName) is too generic to be used here
+			// because it allows files that aren't using Java syntax, like groovy
+			// See https://github.com/groovy/groovy-eclipse/blob/master/base/org.eclipse.jdt.groovy.core/plugin.xml
+			if (sourceName == null || sourceName.endsWith(".java")) { //$NON-NLS-1$
+				// if nothing is defined (no source attributes), assume Java
+				return true;
+			}
+		} catch (DebugException e) {
+			// If we fail, assume Java
+			return true;
+		}
+		// Underlined source code is most likely not written in Java
+		return false;
+	}
+
 	private final static class LambdaASTVisitor extends ASTVisitor {
 		private final ObjectReference underlyingThisObject;
 		private boolean methodIsStatic;
diff --git a/org.eclipse.jdt.launching.javaagent/META-INF/MANIFEST.MF b/org.eclipse.jdt.launching.javaagent/META-INF/MANIFEST.MF
index 318829c..d1eadd1 100644
--- a/org.eclipse.jdt.launching.javaagent/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.launching.javaagent/META-INF/MANIFEST.MF
@@ -2,10 +2,10 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.launching.javaagent;singleton:=true
-Bundle-Version: 3.9.200.qualifier
+Bundle-Version: 3.9.300.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Require-Bundle: org.objectweb.asm;bundle-version="[7.2.0,8.0.0)"
+Require-Bundle: org.objectweb.asm;bundle-version="[8.0.1,9.0.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Automatic-Module-Name: org.eclipse.jdt.launching.javaagent
diff --git a/org.eclipse.jdt.launching.javaagent/pom.xml b/org.eclipse.jdt.launching.javaagent/pom.xml
index 8d32e4f..900fbcc 100644
--- a/org.eclipse.jdt.launching.javaagent/pom.xml
+++ b/org.eclipse.jdt.launching.javaagent/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2011, 2019 Igor Fedorenko
+  Copyright (c) 2011, 2020 Igor Fedorenko
   All rights reserved. This program and the accompanying materials
   are made available under the terms of the Eclipse Public License 2.0
   which accompanies this distribution, and is available at
@@ -24,7 +24,7 @@
     <dependency>
       <groupId>org.ow2.asm</groupId>
       <artifactId>asm</artifactId>
-      <version>7.2</version>
+      <version>8.0.1</version>
     </dependency>
   </dependencies>
 
diff --git a/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/weaving/ClassfileTransformer.java b/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/weaving/ClassfileTransformer.java
index e14b845..16cbb3a 100644
--- a/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/weaving/ClassfileTransformer.java
+++ b/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/weaving/ClassfileTransformer.java
@@ -25,10 +25,10 @@
 	private static final String STRATA_ID = "jdt"; //$NON-NLS-1$
 
 	/** max supported java class format major version, must match {@link #ASM_API} below **/
-	public static final int MAX_CLASS_MAJOR = Opcodes.V14;
+	public static final int MAX_CLASS_MAJOR = Opcodes.V15;
 
 	/** supported ASM API version, must match {@link #MAX_CLASS_MAJOR} above */
-	private static final int ASM_API = Opcodes.ASM7;
+	private static final int ASM_API = Opcodes.ASM8;
 
 	public byte[] transform(byte[] classfileBuffer, final String location) {
 
diff --git a/org.eclipse.jdt.launching/doc/.cvsignore b/org.eclipse.jdt.launching/doc/.cvsignore
deleted file mode 100644
index 731cc1f..0000000
--- a/org.eclipse.jdt.launching/doc/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-book.css
-org_eclipse_jdt_launching_classpathProviders.html
-org_eclipse_jdt_launching_runtimeClasspathEntryResolvers.html
-org_eclipse_jdt_launching_vmConnectors.html
-org_eclipse_jdt_launching_vmInstallTypes.html
-schema.css
diff --git a/org.eclipse.jdt.launching/lib/javaagent-shaded.jar b/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
index 0705a1c..80690a9 100644
--- a/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
+++ b/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
Binary files differ
