Bug 528717 - Format code, adopt for-each loops and lambda expressions.

Change-Id: If08548b8fe2605e13c19067e3d923b43049d1639
Signed-off-by: Mickael Istria <mistria@redhat.com>
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java
index ad395a0..1a25b47 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java
@@ -263,13 +263,13 @@
 	 */
 	AbstractDataTreeNode childAtIgnoreCase(String localName) {
 		AbstractDataTreeNode result = null;
-		for (int i = 0; i < children.length; i++) {
-			if (children[i].getName().equalsIgnoreCase(localName)) {
+		for (AbstractDataTreeNode element : children) {
+			if (element.getName().equalsIgnoreCase(localName)) {
 				//if we find a deleted child, keep looking for a real child
-				if (children[i].isDeleted())
-					result = children[i];
+				if (element.isDeleted())
+					result = element;
 				else
-					return children[i];
+					return element;
 			}
 		}
 		return result;
@@ -350,8 +350,7 @@
 
 		AbstractDataTreeNode[] comparedNodes = new AbstractDataTreeNode[nodes.length];
 		int count = 0;
-		for (int i = 0; i < nodes.length; ++i) {
-			AbstractDataTreeNode node = nodes[i];
+		for (AbstractDataTreeNode node : nodes) {
 			AbstractDataTreeNode comparedNode = node.compareWithParent(key.append(node.getName()), parent, comparator);
 			NodeComparison comparison = (NodeComparison) comparedNode.getData();
 			// Skip it if it's an empty comparison (and no children).
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeReader.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeReader.java
index 502a5c7..d7a0c91 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeReader.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeReader.java
@@ -70,8 +70,7 @@
 
 		/* if not the root node */
 		if (parentPath != null) {
-			if (parentPath.equals(Path.ROOT) &&
-					newProjectName.length() > 0 && name.length() > 0) {
+			if (parentPath.equals(Path.ROOT) && newProjectName.length() > 0 && name.length() > 0) {
 				/* use the supplied name for the project node */
 				name = newProjectName;
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeWriter.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeWriter.java
index 7f08ebf..eeb7465 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeWriter.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeWriter.java
@@ -85,8 +85,8 @@
 
 			/* write the children */
 			int newDepth = (depth == D_INFINITE) ? D_INFINITE : depth - 1;
-			for (int i = 0, imax = children.length; i < imax; i++) {
-				writeNode(children[i], path.append(children[i].getName()), newDepth);
+			for (AbstractDataTreeNode element : children) {
+				writeNode(element, path.append(element.getName()), newDepth);
 			}
 		} else {
 			/* write the number of children */
@@ -157,9 +157,7 @@
 		AbstractDataTreeNode node = tree.getRootNode();
 		IPath currentPath = Path.ROOT;
 		String[] segments = path.segments();
-		for (int i = 0; i < segments.length; i++) {
-			String nextSegment = segments[i];
-
+		for (String nextSegment : segments) {
 			/* write this node to the output */
 			writeSingleNode(node, currentPath);
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java
index c741428..30f30da 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java
@@ -354,11 +354,11 @@
 		for (int iter = 0; rebuildRequested && iter < maxIterations; iter++) {
 			rebuildRequested = false;
 			builtProjects.clear();
-			for (int i = 0; i < configs.length; i++) {
-				if (configs[i].getProject().isAccessible()) {
-					IBuildContext context = new BuildContext(configs[i], requestedConfigs, configs);
-					basicBuild(configs[i], trigger, context, status, Policy.subMonitorFor(monitor, projectWork));
-					builtProjects.add(configs[i].getProject());
+			for (IBuildConfiguration config : configs) {
+				if (config.getProject().isAccessible()) {
+					IBuildContext context = new BuildContext(config, requestedConfigs, configs);
+					basicBuild(config, trigger, context, status, Policy.subMonitorFor(monitor, projectWork));
+					builtProjects.add(config.getProject());
 				}
 			}
 			//subsequent builds should always be incremental
@@ -599,8 +599,7 @@
 		//try to match on builder index, but if not match is found, use the builder name and config name
 		//this is because older workspace versions did not store builder infos in build spec order
 		BuilderPersistentInfo nameMatch = null;
-		for (Iterator<BuilderPersistentInfo> it = infos.iterator(); it.hasNext();) {
-			BuilderPersistentInfo info = it.next();
+		for (BuilderPersistentInfo info : infos) {
 			// match on name, config name and build spec index if known
 			// Note: the config name may be null for builders that don't support configurations, or old workspaces
 			if (info.getBuilderName().equals(builderName) && (info.getConfigName() == null || info.getConfigName().equals(configName))) {
@@ -635,9 +634,9 @@
 	 */
 	private ICommand getCommand(IProject project, String builderName, Map<String, String> args) {
 		ICommand[] buildSpec = ((Project) project).internalGetDescription().getBuildSpec(false);
-		for (int i = 0; i < buildSpec.length; i++)
-			if (buildSpec[i].getBuilderName().equals(builderName))
-				return buildSpec[i];
+		for (ICommand element : buildSpec)
+			if (element.getBuilderName().equals(builderName))
+				return element;
 		//none found, so create a new command
 		BuildCommand result = new BuildCommand();
 		result.setBuilderName(builderName);
@@ -843,8 +842,8 @@
 		if (Policy.DEBUG_BUILD_INVOKING) {
 			overallTimeStamp = System.currentTimeMillis();
 			StringBuilder sb = new StringBuilder("Top-level build-start of: "); //$NON-NLS-1$
-			for (int i = 0; i < configs.length; i++)
-				sb.append(configs[i]).append(", "); //$NON-NLS-1$
+			for (IBuildConfiguration config : configs)
+				sb.append(config).append(", "); //$NON-NLS-1$
 			sb.append(debugTrigger(trigger));
 			Policy.debug(sb.toString());
 		}
@@ -940,8 +939,8 @@
 		if (project.equals(currentBuilder.getProject()))
 			return true;
 		IProject[] interestingProjects = currentBuilder.getInterestingProjects();
-		for (int i = 0; i < interestingProjects.length; i++) {
-			if (interestingProjects[i].equals(project)) {
+		for (IProject interestingProject : interestingProjects) {
+			if (interestingProject.equals(project)) {
 				return true;
 			}
 		}
@@ -997,10 +996,10 @@
 
 		//search for builder's interesting projects
 		IProject[] projects = builder.getInterestingProjects();
-		for (int i = 0; i < projects.length; i++) {
-			if (currentDelta.findNodeAt(projects[i].getFullPath()) != null) {
+		for (IProject project : projects) {
+			if (currentDelta.findNodeAt(project.getFullPath()) != null) {
 				if (Policy.DEBUG_BUILD_NEEDED)
-					Policy.debug(toString(builder) + " needs building because of changes in: " + projects[i].getName()); //$NON-NLS-1$
+					Policy.debug(toString(builder) + " needs building because of changes in: " + project.getName()); //$NON-NLS-1$
 				return true;
 			}
 		}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/NotificationManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/NotificationManager.java
index af79811..8588d51 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/NotificationManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/NotificationManager.java
@@ -12,6 +12,7 @@
 package org.eclipse.core.internal.events;
 
 import java.util.*;
+import org.eclipse.core.internal.events.ResourceChangeListenerList.ListenerEntry;
 import org.eclipse.core.internal.resources.*;
 import org.eclipse.core.internal.utils.Messages;
 import org.eclipse.core.internal.utils.Policy;
@@ -22,11 +23,8 @@
 
 public class NotificationManager implements IManager, ILifecycleListener {
 	class NotifyJob extends Job {
-		private final ICoreRunnable noop = new ICoreRunnable() {
-			@Override
-			public void run(IProgressMonitor monitor) {
-				// do nothing
-			}
+		private final ICoreRunnable noop = monitor -> {
+			// do nothing
 		};
 
 		public NotifyJob() {
@@ -281,9 +279,9 @@
 		if (lockTree)
 			workspace.setTreeLocked(true);
 		try {
-			for (int i = 0; i < resourceListeners.length; i++) {
-				if ((type & resourceListeners[i].eventMask) != 0) {
-					final IResourceChangeListener listener = resourceListeners[i].listener;
+			for (ListenerEntry resourceListener : resourceListeners) {
+				if ((type & resourceListener.eventMask) != 0) {
+					final IResourceChangeListener listener = resourceListener.listener;
 					if (ResourceStats.TRACE_LISTENERS)
 						ResourceStats.startNotify(listener);
 					SafeRunner.run(new ISafeRunnable() {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceChangeEvent.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceChangeEvent.java
index 6632b54..fe08d57 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceChangeEvent.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceChangeEvent.java
@@ -61,8 +61,8 @@
 		while (deltaSets.hasNext()) {
 			MarkerSet deltas = deltaSets.next();
 			IMarkerSetElement[] elements = deltas.elements();
-			for (int i = 0; i < elements.length; i++) {
-				MarkerDelta markerDelta = (MarkerDelta) elements[i];
+			for (IMarkerSetElement element : elements) {
+				MarkerDelta markerDelta = (MarkerDelta) element;
 				//our inclusion test depends on whether we are considering subtypes
 				if (findType == null || (includeSubtypes ? markerDelta.isSubtypeOf(findType) : markerDelta.getType().equals(findType)))
 					matching.add(markerDelta);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDelta.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDelta.java
index f2f4b44..a876ff6 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDelta.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDelta.java
@@ -63,8 +63,7 @@
 			return;
 		if (!visitor.visit(this))
 			return;
-		for (int i = 0; i < children.length; i++) {
-			ResourceDelta childDelta = children[i];
+		for (ResourceDelta childDelta : children) {
 			// quietly exclude team-private, hidden and phantom members unless explicitly included
 			if (!includeTeamPrivate && childDelta.isTeamPrivate())
 				continue;
@@ -167,8 +166,8 @@
 		checkForMarkerDeltas();
 
 		//recurse on children
-		for (int i = 0; i < children.length; i++)
-			children[i].fixMovesAndMarkers(oldTree);
+		for (ResourceDelta element : children)
+			element.fixMovesAndMarkers(oldTree);
 	}
 
 	@Override
@@ -381,8 +380,8 @@
 	public String toDeepDebugString() {
 		final StringBuilder buffer = new StringBuilder("\n"); //$NON-NLS-1$
 		writeDebugString(buffer);
-		for (int i = 0; i < children.length; ++i)
-			buffer.append(children[i].toDeepDebugString());
+		for (ResourceDelta element : children)
+			buffer.append(element.toDeepDebugString());
 		return buffer.toString();
 	}
 
@@ -527,8 +526,8 @@
 				MarkerSet set = entry.getValue();
 				IMarkerSetElement[] deltas = set.elements();
 				boolean addComma = false;
-				for (int i = 0; i < deltas.length; i++) {
-					IMarkerDelta delta = (IMarkerDelta) deltas[i];
+				for (IMarkerSetElement delta2 : deltas) {
+					IMarkerDelta delta = (IMarkerDelta) delta2;
 					if (addComma)
 						buffer.append(',');
 					switch (delta.getKind()) {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDeltaFactory.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDeltaFactory.java
index 58b1c2d..7c1a6a1 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDeltaFactory.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/ResourceDeltaFactory.java
@@ -86,8 +86,8 @@
 			return;
 		// recurse for ROOT
 		IResourceDelta[] children = delta.children;
-		for (int i = 0; i < children.length; i++)
-			checkForOpen((ResourceDelta) children[i], 1);
+		for (IResourceDelta element : children)
+			checkForOpen((ResourceDelta) element, 1);
 	}
 
 	/**
@@ -96,8 +96,8 @@
 	 */
 	protected static NodeIDMap computeNodeIDMap(ResourceDelta delta, NodeIDMap nodeIDMap) {
 		IResourceDelta[] children = delta.children;
-		for (int i = 0; i < children.length; i++) {
-			ResourceDelta child = (ResourceDelta) children[i];
+		for (IResourceDelta element : children) {
+			ResourceDelta child = (ResourceDelta) element;
 			IPath path = child.getFullPath();
 			switch (child.getKind()) {
 				case IResourceDelta.ADDED :
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BlobStore.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BlobStore.java
index 7a9d16b..51870bc 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BlobStore.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BlobStore.java
@@ -79,8 +79,8 @@
 	 */
 	private String bytesToHexString(byte[] b) {
 		StringBuilder buffer = new StringBuilder();
-		for (int i = 0; i < b.length; i++)
-			appendByteString(buffer, b[i]);
+		for (byte element : b)
+			appendByteString(buffer, element);
 		return buffer.toString();
 	}
 
@@ -131,8 +131,8 @@
 	protected byte hashUUIDbytes(UniversalUniqueIdentifier uuid) {
 		byte[] bytes = uuid.toBytes();
 		byte hash = 0;
-		for (int i = 0; i < bytes.length; i++)
-			hash ^= randomArray[bytes[i] + 128]; // +128 makes sure the index is >0
+		for (byte b : bytes)
+			hash ^= randomArray[b + 128]; // +128 makes sure the index is >0
 		return hash;
 	}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/Bucket.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/Bucket.java
index 82bd8bb..85d56c0 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/Bucket.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/Bucket.java
@@ -348,8 +348,7 @@
 			try {
 				destination.write(getVersion());
 				destination.writeInt(entries.size());
-				for (Iterator<Map.Entry<String, Object>> i = entries.entrySet().iterator(); i.hasNext();) {
-					Map.Entry<String, Object> entry = i.next();
+				for (java.util.Map.Entry<String, Object> entry : entries.entrySet()) {
 					writeEntryKey(destination, entry.getKey());
 					writeEntryValue(destination, entry.getValue());
 				}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BucketTree.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BucketTree.java
index 6fdf857..f1c22cb 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BucketTree.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/BucketTree.java
@@ -21,7 +21,6 @@
 import org.eclipse.core.runtime.*;
 import org.eclipse.osgi.util.NLS;
 
-
 /**
  * @since 3,1
  */
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java
index 284d651..50e4d54 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java
@@ -81,9 +81,7 @@
 			results.add(Path.ROOT);
 			return results;
 		}
-		IProject[] projects = root.getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++) {
-			IProject project = projects[i];
+		for (IProject project : root.getProjects(IContainer.INCLUDE_HIDDEN)) {
 			if (!project.exists())
 				continue;
 			//check the project location
@@ -154,9 +152,9 @@
 		IFileStore fileStore = EFS.getStore(inputLocation);
 		while (fileStore != null) {
 			IResource[] resources = workspace.getAliasManager().findResources(fileStore);
-			for (int i = 0; i < resources.length; i++) {
-				if (resources[i].isLinked()) {
-					IPath path = resources[i].getFullPath();
+			for (IResource resource : resources) {
+				if (resource.isLinked()) {
+					IPath path = resource.getFullPath();
 					if (suffix != null)
 						path = path.append(suffix);
 					if (!results.contains(path))
@@ -301,8 +299,7 @@
 		int resultProjectPathSegments = 0;
 		IResource result = null;
 		IProject[] projects = getWorkspace().getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++) {
-			IProject project = projects[i];
+		for (IProject project : projects) {
 			IPath projectLocation = project.getLocation();
 			if (projectLocation != null && projectLocation.isPrefixOf(location)) {
 				int segmentsToRemove = projectLocation.segmentCount();
@@ -1001,8 +998,8 @@
 		boolean changed = false;
 		// drop the depth by one level since processing the root counts as one level.
 		depth = depth == IResource.DEPTH_ONE ? IResource.DEPTH_ZERO : depth;
-		for (int i = 0; i < projects.length; i++) {
-			changed |= refresh(projects[i], depth, updateAliases, subMonitor.newChild(1));
+		for (IProject project : projects) {
+			changed |= refresh(project, depth, updateAliases, subMonitor.newChild(1));
 		}
 		return changed;
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/HistoryBucket.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/HistoryBucket.java
index 4694732..a8d7485 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/HistoryBucket.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/HistoryBucket.java
@@ -31,12 +31,7 @@
 	 */
 	public static final class HistoryEntry extends Bucket.Entry {
 
-		final static Comparator<byte[]> COMPARATOR = new Comparator<byte[]>() {
-			@Override
-			public int compare(byte[] state1, byte[] state2) {
-				return compareStates(state1, state2);
-			}
-		};
+		final static Comparator<byte[]> COMPARATOR = (state1, state2) -> compareStates(state1, state2);
 
 		// the length of each component of the data array
 		private final static byte[][] EMPTY_DATA = new byte[0][];
@@ -311,8 +306,8 @@
 	protected Object readEntryValue(DataInputStream source) throws IOException {
 		int length = source.readUnsignedShort();
 		byte[][] uuids = new byte[length][HistoryEntry.DATA_LENGTH];
-		for (int j = 0; j < uuids.length; j++)
-			source.read(uuids[j]);
+		for (byte[] uuid : uuids)
+			source.read(uuid);
 		return uuids;
 	}
 
@@ -320,7 +315,7 @@
 	protected void writeEntryValue(DataOutputStream destination, Object entryValue) throws IOException {
 		byte[][] uuids = (byte[][]) entryValue;
 		destination.writeShort(uuids.length);
-		for (int j = 0; j < uuids.length; j++)
-			destination.write(uuids[j]);
+		for (byte[] uuid : uuids)
+			destination.write(uuid);
 	}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/IsSynchronizedVisitor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/IsSynchronizedVisitor.java
index 6c59391..1d315e2 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/IsSynchronizedVisitor.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/IsSynchronizedVisitor.java
@@ -26,6 +26,7 @@
 	static class ResourceChangedException extends RuntimeException {
 		private static final long serialVersionUID = 1L;
 		public final IResource target;
+
 		public ResourceChangedException(IResource target) {
 			this.target = target;
 		}
@@ -48,12 +49,12 @@
 
 	@Override
 	protected void fileToFolder(UnifiedTreeNode node, Resource target) {
-		changed((Resource)workspace.getRoot().getFolder(target.getFullPath()));
+		changed((Resource) workspace.getRoot().getFolder(target.getFullPath()));
 	}
 
 	@Override
 	protected void folderToFile(UnifiedTreeNode node, Resource target) {
 		// Pass correct gender to changed for notification and async-refresh
-		changed((Resource)workspace.getRoot().getFile(target.getFullPath()));
+		changed((Resource) workspace.getRoot().getFile(target.getFullPath()));
 	}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalAliasVisitor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalAliasVisitor.java
index ff482f2..649874c 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalAliasVisitor.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalAliasVisitor.java
@@ -51,14 +51,13 @@
 			boolean wasFilteredOut = false;
 			if (store.fetchInfo() != null && store.fetchInfo().exists())
 				wasFilteredOut = target.isFiltered();
-			for (int i = 0; i < aliases.length; i++) {
-				if (aliases[i].getProject().isOpen()) {
+			for (IResource aliase : aliases) {
+				if (aliase.getProject().isOpen()) {
 					if (wasFilteredOut) {
-						if (((Resource) aliases[i]).isFiltered())
-							super.deleteResource(node, (Resource) aliases[i]);
-					}
-					else
-						super.deleteResource(node, (Resource) aliases[i]);
+						if (((Resource) aliase).isFiltered())
+							super.deleteResource(node, (Resource) aliase);
+					} else
+						super.deleteResource(node, (Resource) aliase);
 				}
 			}
 		}
@@ -72,9 +71,9 @@
 			return;
 		IResource[] aliases = workspace.getAliasManager().computeAliases(target, store);
 		if (aliases != null)
-			for (int i = 0; i < aliases.length; i++) {
-				if (aliases[i].getProject().isOpen())
-					super.resourceChanged(node, (Resource) aliases[i]);
+			for (IResource aliase : aliases) {
+				if (aliase.getProject().isOpen())
+					super.resourceChanged(node, (Resource) aliase);
 			}
 	}
 
@@ -86,8 +85,8 @@
 			return;
 		IResource[] aliases = workspace.getAliasManager().computeAliases(target, store);
 		if (aliases != null)
-			for (int i = 0; i < aliases.length; i++)
-				super.fileToFolder(node, (Resource) aliases[i]);
+			for (IResource aliase : aliases)
+				super.fileToFolder(node, (Resource) aliase);
 	}
 
 	@Override
@@ -98,8 +97,8 @@
 			return;
 		IResource[] aliases = workspace.getAliasManager().computeAliases(target, store);
 		if (aliases != null)
-			for (int i = 0; i < aliases.length; i++)
-				super.folderToFile(node, (Resource) aliases[i]);
+			for (IResource aliase : aliases)
+				super.folderToFile(node, (Resource) aliase);
 	}
 
 	@Override
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/SafeChunkyInputStream.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/SafeChunkyInputStream.java
index f9fcb9d..439f719 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/SafeChunkyInputStream.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/SafeChunkyInputStream.java
@@ -15,7 +15,6 @@
 /**
  * @see SafeChunkyOutputStream
  */
-
 public class SafeChunkyInputStream extends InputStream {
 	protected static final int BUFFER_SIZE = 8192;
 	protected byte[] buffer;
@@ -76,8 +75,8 @@
 	}
 
 	protected boolean compare(byte[] source, byte[] target, int startIndex) {
-		for (int i = 0; i < target.length; i++) {
-			if (source[startIndex] != target[i])
+		for (byte element : target) {
+			if (source[startIndex] != element)
 				return false;
 			startIndex++;
 		}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyBucket.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyBucket.java
index 762e74e..b5f738a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyBucket.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyBucket.java
@@ -23,12 +23,9 @@
 public class PropertyBucket extends Bucket {
 	public static class PropertyEntry extends Entry {
 
-		private final static Comparator<String[]> COMPARATOR = new Comparator<String[]>() {
-			@Override
-			public int compare(String[] o1, String[] o2) {
-				int qualifierComparison = o1[0].compareTo(o2[0]);
-				return qualifierComparison != 0 ? qualifierComparison : o1[1].compareTo(o2[1]);
-			}
+		private final static Comparator<String[]> COMPARATOR = (o1, o2) -> {
+			int qualifierComparison = o1[0].compareTo(o2[0]);
+			return qualifierComparison != 0 ? qualifierComparison : o1[1].compareTo(o2[1]);
 		};
 		private static final String[][] EMPTY_DATA = new String[0][];
 		/**
@@ -330,21 +327,21 @@
 	protected void writeEntryValue(DataOutputStream destination, Object entryValue) throws IOException {
 		String[][] properties = (String[][]) entryValue;
 		destination.writeShort(properties.length);
-		for (int j = 0; j < properties.length; j++) {
+		for (String[] propertie : properties) {
 			// writes the property key qualifier
-			int index = qualifierIndex.indexOf(properties[j][0]);
+			int index = qualifierIndex.indexOf(propertie[0]);
 			if (index == -1) {
 				destination.writeByte(QNAME);
-				destination.writeUTF(properties[j][0]);
-				qualifierIndex.add(properties[j][0]);
+				destination.writeUTF(propertie[0]);
+				qualifierIndex.add(propertie[0]);
 			} else {
 				destination.writeByte(INDEX);
 				destination.writeInt(index);
 			}
 			// then the local name
-			destination.writeUTF(properties[j][1]);
+			destination.writeUTF(propertie[1]);
 			// then the property value
-			destination.writeUTF(properties[j][2]);
+			destination.writeUTF(propertie[2]);
 		}
 	}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/FilePropertyTester.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/FilePropertyTester.java
index 56695af..7841210 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/FilePropertyTester.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/FilePropertyTester.java
@@ -55,8 +55,8 @@
 	}
 
 	private boolean isArgumentUsed(Object[] args, String value) {
-		for (int i = 0; i < args.length; i++)
-			if (value.equals(args[i]))
+		for (Object arg : args)
+			if (value.equals(arg))
 				return true;
 		return false;
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/ResourceMappingPropertyTester.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/ResourceMappingPropertyTester.java
index 4dad575..1fb1cf7 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/ResourceMappingPropertyTester.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/propertytester/ResourceMappingPropertyTester.java
@@ -46,9 +46,9 @@
 		}
 		QualifiedName key = toQualifedName(propertyName);
 		boolean found = false;
-		for (int i = 0; i < projects.length; i++) {
+		for (IProject project : projects) {
 			try {
-				Object actualVal = projects[i].getPersistentProperty(key);
+				Object actualVal = project.getPersistentProperty(key);
 				//the value is not set, so keep looking on other projects
 				if (actualVal == null)
 					continue;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java
index 2a31a12..d96fb80 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java
@@ -75,8 +75,7 @@
 		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_REFRESH_PROVIDERS);
 		IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
 		List<RefreshProvider> providerList = new ArrayList<>(infos.length);
-		for (int i = 0; i < infos.length; i++) {
-			IConfigurationElement configurationElement = infos[i];
+		for (IConfigurationElement configurationElement : infos) {
 			RefreshProvider provider = null;
 			try {
 				provider = (RefreshProvider) configurationElement.createExecutableExtension("class"); //$NON-NLS-1$
@@ -105,9 +104,9 @@
 			resourcesToMonitor.add(projects[i]);
 			try {
 				IResource[] members = projects[i].members();
-				for (int j = 0; j < members.length; j++) {
-					if (members[j].isLinked())
-						resourcesToMonitor.add(members[j]);
+				for (IResource member : members) {
+					if (member.isLinked())
+						resourcesToMonitor.add(member);
 				}
 			} catch (CoreException e) {
 				Policy.log(IStatus.WARNING, Messages.refresh_refreshErr, e);
@@ -147,8 +146,8 @@
 		boolean pollingMonitorNeeded = true;
 		RefreshProvider[] refreshProviders = getRefreshProviders();
 		SubMonitor subMonitor = SubMonitor.convert(progressMonitor, refreshProviders.length);
-		for (int i = 0; i < refreshProviders.length; i++) {
-			IRefreshMonitor monitor = safeInstallMonitor(refreshProviders[i], resource, subMonitor.split(1));
+		for (RefreshProvider refreshProvider : refreshProviders) {
+			IRefreshMonitor monitor = safeInstallMonitor(refreshProvider, resource, subMonitor.split(1));
 			if (monitor != null) {
 				registerMonitor(monitor, resource);
 				pollingMonitorNeeded = false;
@@ -210,17 +209,14 @@
 			}
 		}
 		if (!invalidResources.isEmpty()) {
-			MonitorJob.createSystem(Messages.refresh_restoreOnInvalid, invalidResources, new ICoreRunnable() {
-				@Override
-				public void run(IProgressMonitor monitor) {
-					SubMonitor subMonitor = SubMonitor.convert(monitor, invalidResources.size() * 2);
-					for (IResource resource : invalidResources) {
-						unmonitor(resource, subMonitor.split(1));
-						monitor(resource, subMonitor.split(1));
-						// Because the monitor is installed asynchronously we
-						// may have missed some changes, we need to refresh it.
-						refreshManager.refresh(resource);
-					}
+			MonitorJob.createSystem(Messages.refresh_restoreOnInvalid, invalidResources, (ICoreRunnable) monitor -> {
+				SubMonitor subMonitor = SubMonitor.convert(monitor, invalidResources.size() * 2);
+				for (IResource resource : invalidResources) {
+					unmonitor(resource, subMonitor.split(1));
+					monitor(resource, subMonitor.split(1));
+					// Because the monitor is installed asynchronously we
+					// may have missed some changes, we need to refresh it.
+					refreshManager.refresh(resource);
 				}
 			}).schedule();
 		}
@@ -340,9 +336,9 @@
 		}
 		if (children != null && children.length > 0) {
 			SubMonitor subMonitor = SubMonitor.convert(progressMonitor, children.length);
-			for (int i = 0; i < children.length; i++) {
-				if (children[i].isLinked()) {
-					unmonitor(children[i], subMonitor.split(1));
+			for (IResource child : children) {
+				if (child.isLinked()) {
+					unmonitor(child, subMonitor.split(1));
 				}
 			}
 		}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/PollingMonitor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/PollingMonitor.java
index 72a03fa..9f59a93 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/PollingMonitor.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/PollingMonitor.java
@@ -167,8 +167,8 @@
 			//this will cause the job to never run again once it has exhausted
 			//the set of roots to refresh
 			IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-			for (int i = 0; i < projects.length; i++)
-				toRefresh.add(projects[i]);
+			for (IProject project : projects)
+				toRefresh.add(project);
 		}
 		schedule(MIN_FREQUENCY);
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshJob.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshJob.java
index 0b534f4..5a29b20 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshJob.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshJob.java
@@ -91,13 +91,13 @@
 			//resource is not accessible - just return what we have
 			return children;
 		}
-		for (int i = 0; i < members.length; i++) {
-			if (members[i].getType() == IResource.FILE)
+		for (IResource member : members) {
+			if (member.getType() == IResource.FILE)
 				continue;
 			if (depth <= 1)
-				children.add(members[i]);
+				children.add(member);
 			else
-				collectChildrenToDepth(members[i], children, depth - 1);
+				collectChildrenToDepth(member, children, depth - 1);
 		}
 		return children;
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshManager.java
index a7c8963..0032f1f 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/RefreshManager.java
@@ -74,12 +74,7 @@
 			Preferences preferences = ResourcesPlugin.getPlugin().getPluginPreferences();
 			final boolean autoRefresh = preferences.getBoolean(ResourcesPlugin.PREF_AUTO_REFRESH);
 			String jobName = autoRefresh ? Messages.refresh_installMonitorsOnWorkspace : Messages.refresh_uninstallMonitorsOnWorkspace;
-			MonitorJob.createSystem(jobName, ResourcesPlugin.getWorkspace().getRoot(), new ICoreRunnable() {
-				@Override
-				public void run(IProgressMonitor monitor) {
-					manageAutoRefresh(autoRefresh, monitor);
-				}
-			}).schedule();
+			MonitorJob.createSystem(jobName, ResourcesPlugin.getWorkspace().getRoot(), (ICoreRunnable) monitor -> manageAutoRefresh(autoRefresh, monitor)).schedule();
 		}
 	}
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/AliasManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/AliasManager.java
index 0c5c42c..1300904 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/AliasManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/AliasManager.java
@@ -176,8 +176,7 @@
 			} else {
 				matching = map;
 			}
-			for (Iterator<Object> it = matching.values().iterator(); it.hasNext();) {
-				Object value = it.next();
+			for (Object value : matching.values()) {
 				if (value == null)
 					return;
 				if (value instanceof List) {
@@ -398,9 +397,9 @@
 		nonDefaultResourceCount = 0;
 		//build table of IPath (file system location) -> IResource (project or linked resource)
 		IProject[] projects = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++)
-			if (projects[i].isAccessible())
-				addToLocationsMap(projects[i]);
+		for (IProject project : projects)
+			if (project.isAccessible())
+				addToLocationsMap(project);
 	}
 
 	/**
@@ -447,12 +446,7 @@
 	 */
 	public IResource[] findResources(IFileStore location) {
 		final ArrayList<IResource> resources = new ArrayList<>();
-		locationsMap.matchingResourcesDo(location, new Doit() {
-			@Override
-			public void doit(IResource resource) {
-				resources.add(resource);
-			}
-		});
+		locationsMap.matchingResourcesDo(location, resource -> resources.add(resource));
 		return resources.toArray(new IResource[0]);
 	}
 
@@ -474,9 +468,9 @@
 			try {
 				IResource[] members = ((IProject) resource).members();
 				final FileSystemResourceManager localManager = workspace.getFileSystemManager();
-				for (int i = 0; i < members.length; i++) {
-					if (members[i].isLinked()) {
-						IFileStore linkLocation = localManager.getStore(members[i]);
+				for (IResource member : members) {
+					if (member.isLinked()) {
+						IFileStore linkLocation = localManager.getStore(member);
 						if (linkLocation != null)
 							locationsMap.matchingPrefixDo(linkLocation, addToCollection);
 					}
@@ -672,8 +666,8 @@
 		// invalidate location map if any project has the description changed
 		// or was closed/opened
 		IResourceDelta[] changed = delta.getAffectedChildren(IResourceDelta.CHANGED, IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < changed.length; i++) {
-			if ((changed[i].getFlags() & IResourceDelta.DESCRIPTION) == IResourceDelta.DESCRIPTION || (changed[i].getFlags() & IResourceDelta.OPEN) == IResourceDelta.OPEN) {
+		for (IResourceDelta element : changed) {
+			if ((element.getFlags() & IResourceDelta.DESCRIPTION) == IResourceDelta.DESCRIPTION || (element.getFlags() & IResourceDelta.OPEN) == IResourceDelta.OPEN) {
 				changedProjects = true;
 				break;
 			}
@@ -719,8 +713,7 @@
 			return;
 		FileSystemResourceManager localManager = workspace.getFileSystemManager();
 		HashSet<IResource> aliasesCopy = (HashSet<IResource>) aliases.clone();
-		for (Iterator<IResource> it = aliasesCopy.iterator(); it.hasNext();) {
-			IResource alias = it.next();
+		for (IResource alias : aliasesCopy) {
 			monitor.subTask(NLS.bind(Messages.links_updatingDuplicate, alias.getFullPath()));
 			if (alias.getType() == IResource.PROJECT) {
 				if (checkDeletion((Project) alias, location))
@@ -745,8 +738,7 @@
 			buildLocationsMap();
 		} else {
 			//incrementally update location map for changed links
-			for (Iterator<IResource> it = changedLinks.iterator(); it.hasNext();) {
-				IResource resource = it.next();
+			for (IResource resource : changedLinks) {
 				hadChanges = true;
 				if (!resource.isAccessible())
 					continue;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetDeltaJob.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetDeltaJob.java
index 67cf247..1ebbaa4 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetDeltaJob.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetDeltaJob.java
@@ -135,18 +135,15 @@
 	}
 
 	private void processNextEvent(final ICharsetListenerFilter filter, IProgressMonitor monitor) throws CoreException {
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object elementContents) {
-				ResourceInfo info = (ResourceInfo) elementContents;
-				if (!filter.isAffected(info, requestor))
-					return true;
-				info = workspace.getResourceInfo(requestor.requestPath(), false, true);
-				if (info == null)
-					return false;
-				info.incrementCharsetGenerationCount();
+		IElementContentVisitor visitor = (tree, requestor, elementContents) -> {
+			ResourceInfo info = (ResourceInfo) elementContents;
+			if (!filter.isAffected(info, requestor))
 				return true;
-			}
+			info = workspace.getResourceInfo(requestor.requestPath(), false, true);
+			if (info == null)
+				return false;
+			info.incrementCharsetGenerationCount();
+			return true;
 		};
 		try {
 			IPath root = filter.getRoot();
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetManager.java
index cd60ff9..84b2c69 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CharsetManager.java
@@ -126,8 +126,8 @@
 			if ((parent.getFlags() & IResourceDelta.DERIVED_CHANGED) != 0) {
 				// if derived changed, move encoding to correct preferences
 				IPath parentPath = parent.getResource().getProjectRelativePath();
-				for (int i = 0; i < affectedResources.length; i++) {
-					IPath affectedPath = new Path(affectedResources[i]);
+				for (String affectedResource : affectedResources) {
+					IPath affectedPath = new Path(affectedResource);
 					// if parentPath is an ancestor of affectedPath
 					if (parentPath.isPrefixOf(affectedPath)) {
 						IResource member = currentProject.findMember(affectedPath);
@@ -136,9 +136,9 @@
 							// if new preferences are different than current
 							if (!projectPrefs.absolutePath().equals(targetPrefs.absolutePath())) {
 								// remove encoding from old preferences and save in correct preferences
-								String currentValue = projectPrefs.get(affectedResources[i], null);
-								projectPrefs.remove(affectedResources[i]);
-								targetPrefs.put(affectedResources[i], currentValue);
+								String currentValue = projectPrefs.get(affectedResource, null);
+								projectPrefs.remove(affectedResource);
+								targetPrefs.put(affectedResource, currentValue);
 								resourceChanges = true;
 							}
 						}
@@ -146,9 +146,8 @@
 				}
 			}
 
-			IResourceDelta[] children = parent.getAffectedChildren();
-			for (int i = 0; i < children.length; i++) {
-				resourceChanges = moveSettingsIfDerivedChanged(children[i], currentProject, projectPrefs, affectedResources) || resourceChanges;
+			for (IResourceDelta child : parent.getAffectedChildren()) {
+				resourceChanges = moveSettingsIfDerivedChanged(child, currentProject, projectPrefs, affectedResources) || resourceChanges;
 			}
 			return resourceChanges;
 		}
@@ -181,16 +180,16 @@
 				Boolean isDerived = entry.getKey();
 				String[] affectedResources = entry.getValue();
 				Preferences projectPrefs = isDerived.booleanValue() ? projectDerivedPrefs : projectRegularPrefs;
-				for (int i = 0; i < affectedResources.length; i++) {
-					IResourceDelta memberDelta = projectDelta.findMember(new Path(affectedResources[i]));
+				for (String affectedResource : affectedResources) {
+					IResourceDelta memberDelta = projectDelta.findMember(new Path(affectedResource));
 					// no changes for the given resource
 					if (memberDelta == null)
 						continue;
 					if (memberDelta.getKind() == IResourceDelta.REMOVED) {
 						boolean shouldDisableCharsetDeltaJobForCurrentProject = false;
 						// remove the setting for the original location - save its value though
-						String currentValue = projectPrefs.get(affectedResources[i], null);
-						projectPrefs.remove(affectedResources[i]);
+						String currentValue = projectPrefs.get(affectedResource, null);
+						projectPrefs.remove(affectedResource);
 						if ((memberDelta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
 							IPath movedToPath = memberDelta.getMovedToPath();
 							IResource resource = workspace.getRoot().findMember(movedToPath);
@@ -230,10 +229,10 @@
 			IResourceDelta[] projectDeltas = delta.getAffectedChildren();
 			// process each project in the delta
 			Map<IProject, Boolean> projectsToSave = new HashMap<>();
-			for (int i = 0; i < projectDeltas.length; i++)
+			for (IResourceDelta projectDelta : projectDeltas)
 				//nothing to do if a project has been added/removed/moved
-				if (projectDeltas[i].getKind() == IResourceDelta.CHANGED && (projectDeltas[i].getFlags() & IResourceDelta.OPEN) == 0)
-					processEntryChanges(projectDeltas[i], projectsToSave);
+				if (projectDelta.getKind() == IResourceDelta.CHANGED && (projectDelta.getFlags() & IResourceDelta.OPEN) == 0)
+					processEntryChanges(projectDelta, projectsToSave);
 			job.addChanges(projectsToSave);
 		}
 	}
@@ -384,8 +383,7 @@
 			boolean prefsChanged = false;
 			String[] affectedResources;
 			affectedResources = projectDerivedPrefs.keys();
-			for (int i = 0; i < affectedResources.length; i++) {
-				String path = affectedResources[i];
+			for (String path : affectedResources) {
 				String value = projectDerivedPrefs.get(path, null);
 				projectDerivedPrefs.remove(path);
 				// lazy creation of non-derived preferences
@@ -463,8 +461,7 @@
 			boolean prefsChanged = false;
 			String[] affectedResources;
 			affectedResources = projectRegularPrefs.keys();
-			for (int i = 0; i < affectedResources.length; i++) {
-				String path = affectedResources[i];
+			for (String path : affectedResources) {
 				IResource resource = project.findMember(path);
 				if (resource != null) {
 					if (resource.isDerived(IResource.CHECK_ANCESTORS)) {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ComputeProjectOrder.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ComputeProjectOrder.java
index be7a269..1289011 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ComputeProjectOrder.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ComputeProjectOrder.java
@@ -233,8 +233,7 @@
 			}
 			int len = vertexList.size();
 			Object[] r = new Object[len];
-			for (Iterator<Vertex> allV = vertexList.iterator(); allV.hasNext();) {
-				Vertex vertex = allV.next();
+			for (Vertex vertex : vertexList) {
 				int f = vertex.finishTime;
 				// note that finish times start at 1, not 0
 				if (increasing) {
@@ -277,8 +276,7 @@
 			// find the roots of each component
 			// Map<Vertex,List<Object>> components
 			Map<Vertex, List<Object>> components = new HashMap<>();
-			for (Iterator<Vertex> it = vertexList.iterator(); it.hasNext();) {
-				Vertex vertex = it.next();
+			for (Vertex vertex : vertexList) {
 				if (vertex.predecessor == null) {
 					// this vertex is the root of a component
 					// if component is non-trivial we will hit a child
@@ -298,8 +296,7 @@
 				}
 			}
 			List<Object[]> result = new ArrayList<>(components.size());
-			for (Iterator<List<Object>> it = components.values().iterator(); it.hasNext();) {
-				List<Object> component = it.next();
+			for (List<Object> component : components.values()) {
 				if (component.size() > 1) {
 					result.add(component.toArray());
 				}
@@ -512,12 +509,11 @@
 		// Step 1: Create the graph object.
 		final Digraph g1 = new Digraph();
 		// add vertexes
-		for (Iterator<?> it = vertexes.iterator(); it.hasNext();) {
-			g1.addVertex(it.next());
+		for (Object name : vertexes) {
+			g1.addVertex(name);
 		}
 		// add edges
-		for (Iterator<? extends Object[]> it = references.iterator(); it.hasNext();) {
-			Object[] ref = it.next();
+		for (Object[] ref : references) {
 			Object p = ref[0];
 			Object q = ref[1];
 			// p has a reference to q
@@ -533,12 +529,11 @@
 		final Digraph g2 = new Digraph();
 		// add vertexes
 		List<Object> resortedVertexes = g1.idsByDFSFinishTime(false);
-		for (Iterator<Object> it = resortedVertexes.iterator(); it.hasNext();) {
-			g2.addVertex(it.next());
+		for (Object object : resortedVertexes) {
+			g2.addVertex(object);
 		}
 		// add edges
-		for (Iterator<? extends Object[]> it = references.iterator(); it.hasNext();) {
-			Object[] ref = it.next();
+		for (Object[] ref : references) {
 			Object p = ref[0];
 			Object q = ref[1];
 			// p has a reference to q
@@ -601,11 +596,10 @@
 
 		// and from the knots list
 		List<Object[]> reducedKnots = new ArrayList<>(order.knots.length);
-		for (int i = 0; i < order.knots.length; i++) {
-			Object[] knot = order.knots[i];
+		for (Object[] knot : order.knots) {
 			List<Object> knotList = new ArrayList<>(knot.length);
-			for (int j = 0; j < knot.length; j++) {
-				Object vertex = knot[j];
+			for (Object element : knot) {
+				Object vertex = element;
 				if (!filter.matches(vertex)) {
 					knotList.add(vertex);
 				}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Container.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Container.java
index 7055bab..50059a5 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Container.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Container.java
@@ -37,8 +37,8 @@
 			return;
 		super.convertToPhantom();
 		IResource[] members = members(IContainer.INCLUDE_PHANTOMS | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < members.length; i++)
-			((Resource) members[i]).convertToPhantom();
+		for (IResource member : members)
+			((Resource) member).convertToPhantom();
 	}
 
 	@Override
@@ -124,8 +124,8 @@
 		if (!synchronizing(getResourceInfo(true, false)))
 			return;
 		IResource[] members = members(IContainer.INCLUDE_PHANTOMS | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < members.length; i++)
-			((Resource) members[i]).fixupAfterMoveSource();
+		for (IResource member : members)
+			((Resource) member).fixupAfterMoveSource();
 	}
 
 	protected IResource[] getChildren(int memberFlags) {
@@ -140,10 +140,10 @@
 			return ICoreConstants.EMPTY_RESOURCE_ARRAY;
 		Resource[] result = new Resource[children.length];
 		int found = 0;
-		for (int i = 0; i < children.length; i++) {
-			ResourceInfo info = workspace.getResourceInfo(children[i], true, false);
+		for (IPath child : children) {
+			ResourceInfo info = workspace.getResourceInfo(child, true, false);
 			if (info != null && isMember(info.getFlags(), memberFlags))
-				result[found++] = workspace.newResource(children[i], info.getType());
+				result[found++] = workspace.newResource(child, info.getType());
 		}
 		if (found == result.length)
 			return result;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ContentDescriptionManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ContentDescriptionManager.java
index ee4d86e..837247a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ContentDescriptionManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ContentDescriptionManager.java
@@ -21,7 +21,8 @@
 import org.eclipse.core.internal.events.ILifecycleListener;
 import org.eclipse.core.internal.events.LifecycleEvent;
 import org.eclipse.core.internal.utils.*;
-import org.eclipse.core.internal.watson.*;
+import org.eclipse.core.internal.watson.ElementTreeIterator;
+import org.eclipse.core.internal.watson.IElementContentVisitor;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.content.*;
@@ -233,8 +234,8 @@
 				clearContentFlags(Path.ROOT, monitor);
 			else {
 				// flush a project at a time
-				for (int i = 0; i < toClean.length; i++)
-					clearContentFlags(toClean[i], monitor);
+				for (IPath element : toClean)
+					clearContentFlags(element, monitor);
 			}
 		} catch (CoreException ce) {
 			setCacheState(INVALID_CACHE);
@@ -252,22 +253,19 @@
 		if (Policy.DEBUG_CONTENT_TYPE_CACHE)
 			Policy.debug("Flushing content type cache for " + root); //$NON-NLS-1$
 		// discard content type related flags for all files in the tree
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object elementContents) {
-				if (monitor.isCanceled())
-					throw new OperationCanceledException();
-				if (elementContents == null)
-					return false;
-				ResourceInfo info = (ResourceInfo) elementContents;
-				if (info.getType() != IResource.FILE)
-					return true;
-				info = workspace.getResourceInfo(requestor.requestPath(), false, true);
-				if (info == null)
-					return false;
-				info.clear(ICoreConstants.M_CONTENT_CACHE);
+		IElementContentVisitor visitor = (tree, requestor, elementContents) -> {
+			if (monitor.isCanceled())
+				throw new OperationCanceledException();
+			if (elementContents == null)
+				return false;
+			ResourceInfo info = (ResourceInfo) elementContents;
+			if (info.getType() != IResource.FILE)
 				return true;
-			}
+			info = workspace.getResourceInfo(requestor.requestPath(), false, true);
+			if (info == null)
+				return false;
+			info.clear(ICoreConstants.M_CONTENT_CACHE);
+			return true;
 		};
 		new ElementTreeIterator(workspace.getElementTree(), root).iterate(visitor);
 		if (Policy.DEBUG_CONTENT_TYPE_CACHE)
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Filter.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Filter.java
index da46b1f..b2e8001 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Filter.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Filter.java
@@ -117,8 +117,7 @@
 			IFileInfo[] result = new IFileInfo[list.length];
 			int outputIndex = 0;
 
-			for (int i = 0; i < list.length; i++) {
-				IFileInfo info = list[i];
+			for (IFileInfo info : list) {
 				Iterator<Filter> objIt = filters.iterator();
 				boolean filtersWereApplicable = false;
 				while (objIt.hasNext()) {
@@ -149,8 +148,7 @@
 			IFileInfo[] result = new IFileInfo[list.length];
 			int outputIndex = 0;
 
-			for (int i = 0; i < list.length; i++) {
-				IFileInfo info = list[i];
+			for (IFileInfo info : list) {
 				Iterator<Filter> objIt = filters.iterator();
 				boolean shouldBeExcluded = false;
 				while (objIt.hasNext()) {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/FilterTypeManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/FilterTypeManager.java
index 78ba4d5..44e3555 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/FilterTypeManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/FilterTypeManager.java
@@ -32,17 +32,15 @@
 	public FilterTypeManager() {
 		IExtensionPoint point = RegistryFactory.getRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_FILTER_MATCHERS);
 		if (point != null) {
-			IExtension[] ext = point.getExtensions();
 			// initial population
-			for (int i = 0; i < ext.length; i++) {
-				IExtension extension = ext[i];
+			for (IExtension extension : point.getExtensions()) {
 				processExtension(extension);
 			}
 			RegistryFactory.getRegistry().addListener(new IRegistryEventListener() {
 				@Override
 				public void added(IExtension[] extensions) {
-					for (int i = 0; i < extensions.length; i++)
-						processExtension(extensions[i]);
+					for (IExtension extension : extensions)
+						processExtension(extension);
 				}
 
 				@Override
@@ -52,8 +50,8 @@
 
 				@Override
 				public void removed(IExtension[] extensions) {
-					for (int i = 0; i < extensions.length; i++)
-						processRemovedExtension(extensions[i]);
+					for (IExtension extension : extensions)
+						processRemovedExtension(extension);
 				}
 
 				@Override
@@ -74,8 +72,7 @@
 
 	protected void processExtension(IExtension extension) {
 		IConfigurationElement[] elements = extension.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
+		for (IConfigurationElement element : elements) {
 			if (element.getName().equalsIgnoreCase(FILTER_ELEMENT)) {
 				IFilterMatcherDescriptor desc = new FilterDescriptor(element);
 				factories.put(desc.getId(), desc);
@@ -85,8 +82,7 @@
 
 	protected void processRemovedExtension(IExtension extension) {
 		IConfigurationElement[] elements = extension.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
+		for (IConfigurationElement element : elements) {
 			if (element.getName().equalsIgnoreCase(FILTER_ELEMENT)) {
 				IFilterMatcherDescriptor desc = new FilterDescriptor(element, false);
 				factories.remove(desc.getId());
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocalMetaArea.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocalMetaArea.java
index 2ec5c47..7fc7c70 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocalMetaArea.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocalMetaArea.java
@@ -472,14 +472,14 @@
 				else
 					dataOut.writeUTF(URI_PREFIX + projectLocation.toString());
 				dataOut.writeInt(prjRefs.length);
-				for (int i = 0; i < prjRefs.length; i++)
-					dataOut.writeUTF(prjRefs[i].getName());
+				for (IProject prjRef : prjRefs)
+					dataOut.writeUTF(prjRef.getName());
 
 				// Since 3.7 - build configurations + references
 				// Write out the build configurations
 				dataOut.writeInt(buildConfigs.length);
-				for (int i = 0; i < buildConfigs.length; i++) {
-					dataOut.writeUTF(buildConfigs[i]);
+				for (String buildConfig : buildConfigs) {
+					dataOut.writeUTF(buildConfig);
 				}
 				// Write active configuration name
 				dataOut.writeUTF(desc.getActiveBuildConfig());
@@ -491,13 +491,13 @@
 
 					dataOut.writeUTF(refdName);
 					dataOut.writeInt(refs.length);
-					for (int j = 0; j < refs.length; j++) {
-						dataOut.writeUTF(refs[j].getProject().getName());
-						if (refs[j].getName() == null) {
+					for (IBuildConfiguration ref : refs) {
+						dataOut.writeUTF(ref.getProject().getName());
+						if (ref.getName() == null) {
 							dataOut.writeBoolean(false);
 						} else {
 							dataOut.writeBoolean(true);
-							dataOut.writeUTF(refs[j].getName());
+							dataOut.writeUTF(ref.getName());
 						}
 					}
 				}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocationValidator.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocationValidator.java
index 0a3a68a..087d519 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocationValidator.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/LocationValidator.java
@@ -141,9 +141,7 @@
 
 		// Iterate over each known project and ensure that the location does not
 		// conflict with any project locations or linked resource locations
-		IProject[] projects = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++) {
-			IProject project = projects[i];
+		for (IProject project : workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN)) {
 			// since we are iterating over the project in the workspace, we
 			// know that they have been created before and must have a description
 			IProjectDescription desc = ((Project) project).internalGetDescription();
@@ -163,9 +161,9 @@
 			}
 			if (children == null)
 				continue;
-			for (int j = 0; j < children.length; j++) {
-				if (children[j].isLinked()) {
-					testLocation = children[j].getLocationURI();
+			for (IResource child : children) {
+				if (child.isLinked()) {
+					testLocation = child.getLocationURI();
 					if (testLocation != null && FileUtil.isOverlapping(location, testLocation)) {
 						message = NLS.bind(Messages.links_overlappingResource, toString(location));
 						return new ResourceStatus(IResourceStatus.OVERLAPPING_LOCATION, resource.getFullPath(), message);
@@ -196,9 +194,9 @@
 
 		/* test invalid characters */
 		char[] chars = OS.INVALID_RESOURCE_CHARACTERS;
-		for (int i = 0; i < chars.length; i++)
-			if (segment.indexOf(chars[i]) != -1) {
-				message = NLS.bind(Messages.resources_invalidCharInName, String.valueOf(chars[i]), segment);
+		for (char c : chars)
+			if (segment.indexOf(c) != -1) {
+				message = NLS.bind(Messages.resources_invalidCharInName, String.valueOf(c), segment);
 				return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, message);
 			}
 
@@ -376,8 +374,7 @@
 		// Iterate over each known project and ensure that the location does not
 		// conflict with any of their already defined locations.
 		IProject[] projects = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int j = 0; j < projects.length; j++) {
-			IProject project = projects[j];
+		for (IProject project : projects) {
 			URI testLocation = project.getLocationURI();
 			if (context != null && project.equals(context)) {
 				//tolerate locations being the same if this is the project being tested
@@ -404,9 +401,9 @@
 				//ignore projects that cannot be accessed
 			}
 			if (children != null) {
-				for (int i = 0; i < children.length; i++) {
-					if (children[i].isLinked()) {
-						URI testLocation = children[i].getLocationURI();
+				for (IResource child : children) {
+					if (child.isLinked()) {
+						URI testLocation = child.getLocationURI();
 						if (testLocation != null && FileUtil.isPrefixOf(testLocation, location)) {
 							message = NLS.bind(Messages.links_locationOverlapsLink, toString(location));
 							return new ResourceStatus(IResourceStatus.OVERLAPPING_LOCATION, context.getFullPath(), message);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerDelta.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerDelta.java
index 606788d..f08d013 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerDelta.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerDelta.java
@@ -140,15 +140,15 @@
 	protected static MarkerSet merge(MarkerSet oldChanges, IMarkerSetElement[] newChanges) {
 		if (oldChanges == null) {
 			MarkerSet result = new MarkerSet(newChanges.length);
-			for (int i = 0; i < newChanges.length; i++)
-				result.add(newChanges[i]);
+			for (IMarkerSetElement newChange : newChanges)
+				result.add(newChange);
 			return result;
 		}
 		if (newChanges == null)
 			return oldChanges;
 
-		for (int i = 0; i < newChanges.length; i++) {
-			MarkerDelta newDelta = (MarkerDelta) newChanges[i];
+		for (IMarkerSetElement newChange : newChanges) {
+			MarkerDelta newDelta = (MarkerDelta) newChange;
 			MarkerDelta oldDelta = (MarkerDelta) oldChanges.get(newDelta.getId());
 			if (oldDelta == null) {
 				oldChanges.add(newDelta);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerManager.java
index 59f823a..7baded7 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerManager.java
@@ -99,8 +99,8 @@
 			return NO_MARKER_INFO;
 		List<MarkerInfo> result = new ArrayList<>(size);
 		IMarkerSetElement[] elements = markers.elements();
-		for (int i = 0; i < elements.length; i++) {
-			MarkerInfo marker = (MarkerInfo) elements[i];
+		for (IMarkerSetElement element : elements) {
+			MarkerInfo marker = (MarkerInfo) element;
 			// if the type is null then we are looking for all types of markers
 			if (type == null)
 				result.add(marker);
@@ -126,8 +126,8 @@
 		if (size <= 0)
 			return max;
 		IMarkerSetElement[] elements = markers.elements();
-		for (int i = 0; i < elements.length; i++) {
-			MarkerInfo marker = (MarkerInfo) elements[i];
+		for (IMarkerSetElement element : elements) {
+			MarkerInfo marker = (MarkerInfo) element;
 			// if the type is null then we are looking for all types of markers
 			if (type == null)
 				max = Math.max(max, getSeverity(marker));
@@ -210,8 +210,8 @@
 			return;
 		IResource resource = workspace.newResource(path, type);
 		list.ensureCapacity(list.size() + markers.length);
-		for (int i = 0; i < markers.length; i++) {
-			list.add(new Marker(resource, ((MarkerInfo) markers[i]).getId()));
+		for (IMarkerSetElement marker : markers) {
+			list.add(new Marker(resource, ((MarkerInfo) marker).getId()));
 		}
 	}
 
@@ -350,34 +350,31 @@
 		final int count = destination.getFullPath().segmentCount();
 
 		// we removed from the source and added to the destination
-		IResourceVisitor visitor = new IResourceVisitor() {
-			@Override
-			public boolean visit(IResource resource) {
-				Resource r = (Resource) resource;
-				ResourceInfo info = r.getResourceInfo(false, true);
-				MarkerSet markers = info.getMarkers(false);
-				if (markers == null)
-					return true;
-				info.set(ICoreConstants.M_MARKERS_SNAP_DIRTY);
-				IMarkerSetElement[] removed = new IMarkerSetElement[markers.size()];
-				IMarkerSetElement[] added = new IMarkerSetElement[markers.size()];
-				IPath path = resource.getFullPath().removeFirstSegments(count);
-				path = source.getFullPath().append(path);
-				IResource sourceChild = workspace.newResource(path, resource.getType());
-				IMarkerSetElement[] elements = markers.elements();
-				for (int i = 0; i < elements.length; i++) {
-					// calculate the ADDED delta
-					MarkerInfo markerInfo = (MarkerInfo) elements[i];
-					MarkerDelta delta = new MarkerDelta(IResourceDelta.ADDED, resource, markerInfo);
-					added[i] = delta;
-					// calculate the REMOVED delta
-					delta = new MarkerDelta(IResourceDelta.REMOVED, sourceChild, markerInfo);
-					removed[i] = delta;
-				}
-				changedMarkers(resource, added);
-				changedMarkers(sourceChild, removed);
+		IResourceVisitor visitor = resource -> {
+			Resource r = (Resource) resource;
+			ResourceInfo info = r.getResourceInfo(false, true);
+			MarkerSet markers = info.getMarkers(false);
+			if (markers == null)
 				return true;
+			info.set(ICoreConstants.M_MARKERS_SNAP_DIRTY);
+			IMarkerSetElement[] removed = new IMarkerSetElement[markers.size()];
+			IMarkerSetElement[] added = new IMarkerSetElement[markers.size()];
+			IPath path = resource.getFullPath().removeFirstSegments(count);
+			path = source.getFullPath().append(path);
+			IResource sourceChild = workspace.newResource(path, resource.getType());
+			IMarkerSetElement[] elements = markers.elements();
+			for (int i = 0; i < elements.length; i++) {
+				// calculate the ADDED delta
+				MarkerInfo markerInfo = (MarkerInfo) elements[i];
+				MarkerDelta delta = new MarkerDelta(IResourceDelta.ADDED, resource, markerInfo);
+				added[i] = delta;
+				// calculate the REMOVED delta
+				delta = new MarkerDelta(IResourceDelta.REMOVED, sourceChild, markerInfo);
+				removed[i] = delta;
 			}
+			changedMarkers(resource, added);
+			changedMarkers(sourceChild, removed);
+			return true;
 		};
 		destination.accept(visitor, depth, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
 	}
@@ -406,9 +403,8 @@
 			return;
 		if (depth == IResource.DEPTH_ONE)
 			depth = IResource.DEPTH_ZERO;
-		IPath[] children = workspace.getElementTree().getChildren(path);
-		for (int i = 0; i < children.length; i++) {
-			recursiveFindMarkers(children[i], list, type, includeSubtypes, depth);
+		for (IPath child : workspace.getElementTree().getChildren(path)) {
+			recursiveFindMarkers(child, list, type, includeSubtypes, depth);
 		}
 	}
 
@@ -435,9 +431,8 @@
 			return max;
 		if (depth == IResource.DEPTH_ONE)
 			depth = IResource.DEPTH_ZERO;
-		IPath[] children = workspace.getElementTree().getChildren(path);
-		for (int i = 0; i < children.length; i++) {
-			max = Math.max(max, recursiveFindMaxSeverity(children[i], type, includeSubtypes, depth));
+		for (IPath child : workspace.getElementTree().getChildren(path)) {
+			max = Math.max(max, recursiveFindMaxSeverity(child, type, includeSubtypes, depth));
 			if (max >= IMarker.SEVERITY_ERROR) {
 				break;
 			}
@@ -469,9 +464,8 @@
 			return;
 		if (depth == IResource.DEPTH_ONE)
 			depth = IResource.DEPTH_ZERO;
-		IPath[] children = workspace.getElementTree().getChildren(path);
-		for (int i = 0; i < children.length; i++) {
-			recursiveRemoveMarkers(children[i], type, includeSubtypes, depth);
+		for (IPath child : workspace.getElementTree().getChildren(path)) {
+			recursiveRemoveMarkers(child, type, includeSubtypes, depth);
 		}
 	}
 
@@ -597,25 +591,22 @@
 	 * Adds the markers for a subtree of resources to the list.
 	 */
 	private void visitorFindMarkers(IPath path, final ArrayList<IMarker> list, final String type, final boolean includeSubtypes) {
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object elementContents) {
-				ResourceInfo info = (ResourceInfo) elementContents;
-				if (info == null)
-					return false;
-				MarkerSet markers = info.getMarkers(false);
+		IElementContentVisitor visitor = (tree, requestor, elementContents) -> {
+			ResourceInfo info = (ResourceInfo) elementContents;
+			if (info == null)
+				return false;
+			MarkerSet markers = info.getMarkers(false);
 
-				//add the matching markers for this resource
-				if (markers != null) {
-					IMarkerSetElement[] matching;
-					if (type == null)
-						matching = markers.elements();
-					else
-						matching = basicFindMatching(markers, type, includeSubtypes);
-					buildMarkers(matching, requestor.requestPath(), info.getType(), list);
-				}
-				return true;
+			//add the matching markers for this resource
+			if (markers != null) {
+				IMarkerSetElement[] matching;
+				if (type == null)
+					matching = markers.elements();
+				else
+					matching = basicFindMatching(markers, type, includeSubtypes);
+				buildMarkers(matching, requestor.requestPath(), info.getType(), list);
 			}
+			return true;
 		};
 		new ElementTreeIterator(workspace.getElementTree(), path).iterate(visitor);
 	}
@@ -654,15 +645,12 @@
 	 * Adds the markers for a subtree of resources to the list.
 	 */
 	private void visitorRemoveMarkers(IPath path, final String type, final boolean includeSubtypes) {
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object elementContents) {
-				ResourceInfo info = (ResourceInfo) elementContents;
-				if (info == null)
-					return false;
-				basicRemoveMarkers(info, requestor, type, includeSubtypes);
-				return true;
-			}
+		IElementContentVisitor visitor = (tree, requestor, elementContents) -> {
+			ResourceInfo info = (ResourceInfo) elementContents;
+			if (info == null)
+				return false;
+			basicRemoveMarkers(info, requestor, type, includeSubtypes);
+			return true;
 		};
 		new ElementTreeIterator(workspace.getElementTree(), path).iterate(visitor);
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_1.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_1.java
index 775f2ac..780ad72 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_1.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_1.java
@@ -82,9 +82,9 @@
 					// and shrinking the array.
 					IMarkerSetElement[] infos = markers.elements;
 					ArrayList<MarkerDelta> deltas = new ArrayList<>(infos.length);
-					for (int i = 0; i < infos.length; i++)
-						if (infos[i] != null)
-							deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) infos[i]));
+					for (IMarkerSetElement info2 : infos)
+						if (info2 != null)
+							deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) info2));
 					workspace.getMarkerManager().changedMarkers(resource, deltas.toArray(new IMarkerSetElement[deltas.size()]));
 				}
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_2.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_2.java
index 755da7b..f29abf6 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_2.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_2.java
@@ -83,9 +83,9 @@
 					Resource resource = workspace.newResource(path, info.getType());
 					IMarkerSetElement[] infos = markers.elements;
 					ArrayList<MarkerDelta> deltas = new ArrayList<>(infos.length);
-					for (int i = 0; i < infos.length; i++)
-						if (infos[i] != null)
-							deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) infos[i]));
+					for (IMarkerSetElement info2 : infos)
+						if (info2 != null)
+							deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) info2));
 					workspace.getMarkerManager().changedMarkers(resource, deltas.toArray(new IMarkerSetElement[deltas.size()]));
 				}
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_3.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_3.java
index 0400cf8..5b37137 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_3.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerReader_3.java
@@ -84,9 +84,9 @@
 					Resource resource = workspace.newResource(path, info.getType());
 					IMarkerSetElement[] infos = markers.elements;
 					ArrayList<MarkerDelta> deltas = new ArrayList<>(infos.length);
-					for (int i = 0; i < infos.length; i++)
-						if (infos[i] != null)
-							deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) infos[i]));
+					for (IMarkerSetElement info2 : infos)
+						if (info2 != null)
+							deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) info2));
 					workspace.getMarkerManager().changedMarkers(resource, deltas.toArray(new IMarkerSetElement[deltas.size()]));
 				}
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerSet.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerSet.java
index 66cfec3..f522452 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerSet.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerSet.java
@@ -63,8 +63,8 @@
 	}
 
 	public void addAll(IMarkerSetElement[] toAdd) {
-		for (int i = 0; i < toAdd.length; i++)
-			add(toAdd[i]);
+		for (IMarkerSetElement element : toAdd)
+			add(element);
 	}
 
 	@Override
@@ -87,8 +87,7 @@
 	public IMarkerSetElement[] elements() {
 		IMarkerSetElement[] result = new IMarkerSetElement[elementCount];
 		int j = 0;
-		for (int i = 0; i < elements.length; i++) {
-			IMarkerSetElement element = elements[i];
+		for (IMarkerSetElement element : elements) {
 			if (element != null)
 				result[j++] = element;
 		}
@@ -102,8 +101,7 @@
 	protected void expand() {
 		IMarkerSetElement[] array = new IMarkerSetElement[elements.length * 2];
 		int maxArrayIndex = array.length - 1;
-		for (int i = 0; i < elements.length; i++) {
-			IMarkerSetElement element = elements[i];
+		for (IMarkerSetElement element : elements) {
 			if (element != null) {
 				int hash = hashFor(element.getId()) % array.length;
 				while (array[hash] != null) {
@@ -215,8 +213,8 @@
 	}
 
 	public void removeAll(IMarkerSetElement[] toRemove) {
-		for (int i = 0; i < toRemove.length; i++)
-			remove(toRemove[i]);
+		for (IMarkerSetElement element : toRemove)
+			remove(element);
 	}
 
 	private boolean shouldGrow() {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerTypeDefinitionCache.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerTypeDefinitionCache.java
index 6a981c9..a7bb506 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerTypeDefinitionCache.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/MarkerTypeDefinitionCache.java
@@ -24,8 +24,7 @@
 
 		MarkerTypeDefinition(IExtension ext) {
 			IConfigurationElement[] elements = ext.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
+			for (IConfigurationElement element : elements) {
 				// supertype
 				final String elementName = element.getName();
 				if (elementName.equalsIgnoreCase("super")) { //$NON-NLS-1$
@@ -65,8 +64,7 @@
 	public MarkerTypeDefinitionCache() {
 		loadDefinitions();
 		HashSet<String> toCompute = new HashSet<>(definitions.keySet());
-		for (Iterator<String> i = definitions.keySet().iterator(); i.hasNext();) {
-			String markerId = i.next();
+		for (String markerId : definitions.keySet()) {
 			if (toCompute.contains(markerId))
 				computeSuperTypes(markerId, toCompute);
 		}
@@ -88,8 +86,7 @@
 			return null;
 		}
 		Set<String> transitiveSuperTypes = new HashSet<>(def.superTypes);
-		for (Iterator<String> it = def.superTypes.iterator(); it.hasNext();) {
-			String superId = it.next();
+		for (String superId : def.superTypes) {
 			Set<String> toAdd = null;
 			if (toCompute.contains(superId)) {
 				//this type's super types have not been compute yet. Do recursive call
@@ -131,12 +128,12 @@
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_MARKERS);
 		IExtension[] types = point.getExtensions();
 		definitions = new HashMap<>(types.length);
-		for (int i = 0; i < types.length; i++) {
-			String markerId = types[i].getUniqueIdentifier();
+		for (IExtension type : types) {
+			String markerId = type.getUniqueIdentifier();
 			if (markerId != null)
-				definitions.put(markerId.intern(), new MarkerTypeDefinition(types[i]));
+				definitions.put(markerId.intern(), new MarkerTypeDefinition(type));
 			else
-				Policy.log(IStatus.WARNING, "Missing marker id from plugin: " + types[i].getContributor().getName(), null); //$NON-NLS-1$
+				Policy.log(IStatus.WARNING, "Missing marker id from plugin: " + type.getContributor().getName(), null); //$NON-NLS-1$
 		}
 	}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ModelObjectWriter.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ModelObjectWriter.java
index 2939ff4..5c02b25 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ModelObjectWriter.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ModelObjectWriter.java
@@ -114,8 +114,8 @@
 			} else if (description.getArguments() instanceof FileInfoMatcherDescription[]) {
 				writer.startTag(ARGUMENTS, null);
 				FileInfoMatcherDescription[] array = (FileInfoMatcherDescription[]) description.getArguments();
-				for (int i = 0; i < array.length; i++) {
-					write(array[i], writer);
+				for (FileInfoMatcherDescription element : array) {
+					write(element, writer);
 				}
 				writer.endTag(ARGUMENTS);
 			} else
@@ -232,8 +232,8 @@
 			HashMap<IPath, LinkedList<FilterDescription>> filters = description.getFilters();
 			if (filters != null) {
 				List<FilterDescription> sorted = new ArrayList<>();
-				for (Iterator<LinkedList<FilterDescription>> it = filters.values().iterator(); it.hasNext();) {
-					List<FilterDescription> list = it.next();
+				for (LinkedList<FilterDescription> linkedList : filters.values()) {
+					List<FilterDescription> list = linkedList;
 					sorted.addAll(list);
 				}
 				Collections.sort(sorted);
@@ -266,8 +266,7 @@
 			List<String> sorted = new ArrayList<>(table.keySet());
 			Collections.sort(sorted);
 
-			for (Iterator<String> it = sorted.iterator(); it.hasNext();) {
-				String key = it.next();
+			for (String key : sorted) {
 				Object value = table.get(key);
 				writer.startTag(DICTIONARY, null);
 				{
@@ -282,8 +281,8 @@
 
 	protected void write(String name, String elementTagName, String[] array, XMLWriter writer) {
 		writer.startTag(name, null);
-		for (int i = 0; i < array.length; i++)
-			writer.printSimpleTag(elementTagName, array[i]);
+		for (String element : array)
+			writer.printSimpleTag(elementTagName, element);
 		writer.endTag(name);
 	}
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
index d14a368..45d4f8a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
@@ -70,8 +70,7 @@
 				candidates.add(id);
 			//build set to nature map
 			String[] setIds = desc.getNatureSetIds();
-			for (int j = 0; j < setIds.length; j++) {
-				String set = setIds[j];
+			for (String set : setIds) {
 				ArrayList<String> current = setsToNatures.get(set);
 				if (current == null) {
 					current = new ArrayList<>(5);
@@ -81,8 +80,7 @@
 			}
 		}
 		//now remove all natures that belong to sets with more than one member
-		for (Iterator<ArrayList<String>> it = setsToNatures.values().iterator(); it.hasNext();) {
-			ArrayList<String> setMembers = it.next();
+		for (ArrayList<String> setMembers : setsToNatures.values()) {
 			if (setMembers.size() > 1) {
 				candidates.removeAll(setMembers);
 			}
@@ -92,8 +90,7 @@
 		//disabled for some other reason, we must ensure both A and B are disabled
 		String[] orderedCandidates = candidates.toArray(new String[candidates.size()]);
 		orderedCandidates = sortNatureSet(orderedCandidates);
-		for (int i = 0; i < orderedCandidates.length; i++) {
-			String id = orderedCandidates[i];
+		for (String id : orderedCandidates) {
 			IProjectNatureDescriptor desc = getNatureDescriptor(id);
 			String[] required = desc.getRequiredNatureIds();
 			for (int j = 0; j < required.length; j++) {
@@ -205,8 +202,8 @@
 		}
 		if (additions.size() > 0) {
 			ordered = sortNatureSet(additions.toArray(new String[additions.size()]));
-			for (int i = 0; i < ordered.length; i++)
-				configureNature(project, ordered[i], status);
+			for (String element : ordered)
+				configureNature(project, element, status);
 		}
 	}
 
@@ -286,9 +283,9 @@
 	private void detectCycles() {
 		Collection<IProjectNatureDescriptor> values = descriptors.values();
 		ProjectNatureDescriptor[] natures = values.toArray(new ProjectNatureDescriptor[values.size()]);
-		for (int i = 0; i < natures.length; i++)
-			if (natures[i].colour == WHITE)
-				hasCycles(natures[i]);
+		for (ProjectNatureDescriptor nature : natures)
+			if (nature.colour == WHITE)
+				hasCycles(nature);
 	}
 
 	/**
@@ -306,12 +303,12 @@
 		if (buildersToNatures == null) {
 			buildersToNatures = new HashMap<>(10);
 			IProjectNatureDescriptor[] descs = getNatureDescriptors();
-			for (int i = 0; i < descs.length; i++) {
-				String natureId = descs[i].getNatureId();
-				String[] builders = ((ProjectNatureDescriptor) descs[i]).getBuilderIds();
-				for (int j = 0; j < builders.length; j++) {
+			for (IProjectNatureDescriptor desc : descs) {
+				String natureId = desc.getNatureId();
+				String[] builders = ((ProjectNatureDescriptor) desc).getBuilderIds();
+				for (String builder : builders) {
 					//FIXME: how to handle multiple natures specifying same builder
-					buildersToNatures.put(builders[j], natureId);
+					buildersToNatures.put(builder, natureId);
 				}
 			}
 		}
@@ -356,8 +353,8 @@
 
 		//visit all dependents of nature i
 		String[] required = desc.getRequiredNatureIds();
-		for (int i = 0; i < required.length; i++) {
-			ProjectNatureDescriptor dependency = (ProjectNatureDescriptor) getNatureDescriptor(required[i]);
+		for (String element : required) {
+			ProjectNatureDescriptor dependency = (ProjectNatureDescriptor) getNatureDescriptor(element);
 			//missing dependencies cannot create cycles
 			if (dependency != null && hasCycles(dependency)) {
 				desc.hasCycle = true;
@@ -376,8 +373,8 @@
 	protected boolean hasLinks(IProject project) {
 		try {
 			IResource[] children = project.members();
-			for (int i = 0; i < children.length; i++)
-				if (children[i].isLinked())
+			for (IResource element : children)
+				if (element.isLinked())
 					return true;
 		} catch (CoreException e) {
 			//not possible for project to be inaccessible
@@ -398,10 +395,10 @@
 		//efficiency not so important because these sets are very small
 		String[] setsOne = one.getNatureSetIds();
 		String[] setsTwo = two.getNatureSetIds();
-		for (int iOne = 0; iOne < setsOne.length; iOne++) {
-			for (int iTwo = 0; iTwo < setsTwo.length; iTwo++) {
-				if (setsOne[iOne].equals(setsTwo[iTwo])) {
-					return setsOne[iOne];
+		for (String element : setsOne) {
+			for (String element2 : setsTwo) {
+				if (element.equals(element2)) {
+					return element;
 				}
 			}
 		}
@@ -419,8 +416,8 @@
 		IProjectNatureDescriptor desc = getNatureDescriptor(id);
 		if (desc != null) {
 			String[] prereqs = desc.getRequiredNatureIds();
-			for (int i = 0; i < prereqs.length; i++)
-				insert(list, seen, prereqs[i]);
+			for (String prereq : prereqs)
+				insert(list, seen, prereq);
 		}
 		list.add(id);
 	}
@@ -432,8 +429,8 @@
 	 */
 	public boolean isNatureEnabled(Project project, String id) {
 		String[] enabled = getEnabledNatures(project);
-		for (int i = 0; i < enabled.length; i++) {
-			if (enabled[i].equals(id))
+		for (String element : enabled) {
+			if (element.equals(id))
 				return true;
 		}
 		return false;
@@ -449,10 +446,10 @@
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_NATURES);
 		IExtension[] extensions = point.getExtensions();
 		descriptors = new HashMap<>(extensions.length * 2 + 1);
-		for (int i = 0, imax = extensions.length; i < imax; i++) {
+		for (IExtension extension : extensions) {
 			IProjectNatureDescriptor desc = null;
 			try {
-				desc = new ProjectNatureDescriptor(extensions[i]);
+				desc = new ProjectNatureDescriptor(extension);
 			} catch (CoreException e) {
 				Policy.log(e.getStatus());
 			}
@@ -509,8 +506,7 @@
 	protected IStatus validateAdditions(HashSet<String> newNatures, HashSet<String> additions, IProject project) {
 		Boolean hasLinks = null;//three states: true, false, null (not yet computed)
 		//perform checks in order from least expensive to most expensive
-		for (Iterator<String> added = additions.iterator(); added.hasNext();) {
-			String id = added.next();
+		for (String id : additions) {
 			// check for adding a nature that is not available.
 			IProjectNatureDescriptor desc = getNatureDescriptor(id);
 			if (desc == null) {
@@ -528,8 +524,7 @@
 				}
 			}
 			// check for adding a nature that creates a duplicated set member.
-			for (Iterator<String> all = newNatures.iterator(); all.hasNext();) {
-				String current = all.next();
+			for (String current : newNatures) {
 				if (!current.equals(id)) {
 					String overlap = hasSetOverlap(desc, getNatureDescriptor(current));
 					if (overlap != null) {
@@ -558,8 +553,8 @@
 	 * a corresponding nature definition will be ignored).
 	 */
 	public IStatus validateLinkCreation(String[] natureIds) {
-		for (int i = 0; i < natureIds.length; i++) {
-			IProjectNatureDescriptor desc = getNatureDescriptor(natureIds[i]);
+		for (String natureId : natureIds) {
+			IProjectNatureDescriptor desc = getNatureDescriptor(natureId);
 			if (desc != null && !desc.isLinkingAllowed()) {
 				String msg = NLS.bind(Messages.links_natureVeto, desc.getLabel());
 				return new ResourceStatus(IResourceStatus.LINKING_NOT_ALLOWED, msg);
@@ -580,14 +575,13 @@
 	 */
 	protected IStatus validateRemovals(HashSet<String> newNatures, HashSet<String> deletions) {
 		//iterate over new nature set, and ensure that none of their prerequisites are being deleted
-		for (Iterator<String> it = newNatures.iterator(); it.hasNext();) {
-			String currentID = it.next();
+		for (String currentID : newNatures) {
 			IProjectNatureDescriptor desc = getNatureDescriptor(currentID);
 			if (desc != null) {
 				String[] required = desc.getRequiredNatureIds();
-				for (int i = 0; i < required.length; i++) {
-					if (deletions.contains(required[i])) {
-						return failure(NLS.bind(Messages.natures_invalidRemoval, required[i], currentID));
+				for (String element : required) {
+					if (deletions.contains(element)) {
+						return failure(NLS.bind(Messages.natures_invalidRemoval, element, currentID));
 					}
 				}
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/OS.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/OS.java
index 193ca34..6c070af 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/OS.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/OS.java
@@ -59,7 +59,7 @@
 			final int length = name.length();
 			if (length == 0)
 				return false;
-			final char lastChar = name.charAt(length-1);
+			final char lastChar = name.charAt(length - 1);
 			// filenames ending in dot are not valid
 			if (lastChar == '.')
 				return false;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableManager.java
index bdafd8b..f857781 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableManager.java
@@ -104,10 +104,9 @@
 		if (list.size() == 0)
 			return;
 		// use a separate collection to avoid interference of simultaneous additions/removals
-		Object[] listenerArray = list.toArray();
+		IPathVariableChangeListener[] listenerArray = list.toArray(new IPathVariableChangeListener[list.size()]);
 		final PathVariableChangeEvent pve = new PathVariableChangeEvent(this, name, value, type);
-		for (int i = 0; i < listenerArray.length; ++i) {
-			final IPathVariableChangeListener l = (IPathVariableChangeListener) listenerArray[i];
+		for (final IPathVariableChangeListener listener : listenerArray) {
 			ISafeRunnable job = new ISafeRunnable() {
 				@Override
 				public void handleException(Throwable exception) {
@@ -116,7 +115,7 @@
 
 				@Override
 				public void run() throws Exception {
-					l.pathVariableChanged(pve);
+					listener.pathVariableChanged(pve);
 				}
 			};
 			SafeRunner.run(job);
@@ -143,9 +142,9 @@
 	public String[] getPathVariableNames() {
 		List<String> result = new LinkedList<>();
 		String[] names = preferences.propertyNames();
-		for (int i = 0; i < names.length; i++) {
-			if (names[i].startsWith(VARIABLE_PREFIX)) {
-				String key = names[i].substring(VARIABLE_PREFIX.length());
+		for (String name : names) {
+			if (name.startsWith(VARIABLE_PREFIX)) {
+				String key = name.substring(VARIABLE_PREFIX.length());
 				// filter out names for preferences which might be valid in the
 				// preference store but does not have valid path variable names
 				// and/or values. We can get in this state if the user has
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableUtil.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableUtil.java
index 013dc3e..5133b58 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableUtil.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PathVariableUtil.java
@@ -88,8 +88,7 @@
 		IPath newPath = null;
 		int maxMatchLength = -1;
 		String[] existingVariables = pathVariableManager.getPathVariableNames();
-		for (int i = 0; i < existingVariables.length; i++) {
-			String variable = existingVariables[i];
+		for (String variable : existingVariables) {
 			if (skipWorkspace) {
 				// Variables relative to the workspace are not portable, and defeat the purpose of having linked resource locations,
 				// so they should not automatically be created relative to the workspace.
@@ -121,8 +120,7 @@
 			for (int j = 0; j <= originalSegmentCount; j++) {
 				IPath matchingPath = path.removeLastSegments(j);
 				int minDifference = Integer.MAX_VALUE;
-				for (int k = 0; k < existingVariables.length; k++) {
-					String variable = existingVariables[k];
+				for (String variable : existingVariables) {
 					if (skipWorkspace) {
 						if (variable.equals(WorkspaceLocationVariableResolver.NAME))
 							continue;
@@ -383,9 +381,9 @@
 				buffer.append(value.substring(index));
 		} else {
 			String components[] = splitVariablesAndContent(value);
-			for (int i = 0; i < components.length; i++) {
-				String variable = extractVariable(components[i]);
-				convertVariableToUserFormat(buffer, components[i], variable, true);
+			for (String component : components) {
+				String variable = extractVariable(component);
+				convertVariableToUserFormat(buffer, component, variable, true);
 			}
 		}
 		return buffer.toString();
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
index cfe6f7a..a0727b9 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
@@ -355,9 +355,9 @@
 		ProjectInfo info = (ProjectInfo) getResourceInfo(false, false);
 		checkAccessible(getFlags(info));
 		IBuildConfiguration[] configs = internalGetBuildConfigs(false);
-		for (int i = 0; i < configs.length; i++) {
-			if (configs[i].getName().equals(configName)) {
-				return configs[i];
+		for (IBuildConfiguration config : configs) {
+			if (config.getName().equals(configName)) {
+				return config;
 			}
 		}
 		throw new ResourceException(IResourceStatus.BUILD_CONFIGURATION_NOT_FOUND, getFullPath(), null, null);
@@ -488,17 +488,17 @@
 	public IProject[] getReferencingProjects() {
 		IProject[] projects = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
 		List<IProject> result = new ArrayList<>(projects.length);
-		for (int i = 0; i < projects.length; i++) {
-			Project project = (Project) projects[i];
+		for (IProject p : projects) {
+			Project project = (Project) p;
 			if (!project.isAccessible())
 				continue;
 			ProjectDescription description = project.internalGetDescription();
 			if (description == null)
 				continue;
 			IProject[] references = description.getAllReferences(false);
-			for (int j = 0; j < references.length; j++)
-				if (references[j].equals(this)) {
-					result.add(projects[i]);
+			for (IProject reference : references)
+				if (reference.equals(this)) {
+					result.add(project);
 					break;
 				}
 		}
@@ -614,8 +614,8 @@
 		// DO NOT use resource.delete() as this will delete it from disk as well.
 		IResource[] members = members(IContainer.INCLUDE_PHANTOMS | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
 		subMonitor.setWorkRemaining(members.length);
-		for (int i = 0; i < members.length; i++) {
-			Resource member = (Resource) members[i];
+		for (IResource member2 : members) {
+			Resource member = (Resource) member2;
 			workspace.deleteResource(member);
 			subMonitor.worked(1);
 		}
@@ -786,15 +786,15 @@
 		ProjectDescription description = internalGetDescription();
 		IBuildConfiguration[] refs = description.getAllBuildConfigReferences(configName, false);
 		Collection<IBuildConfiguration> configs = new LinkedHashSet<>(refs.length);
-		for (int i = 0; i < refs.length; i++) {
+		for (IBuildConfiguration ref : refs) {
 			try {
-				configs.add((((BuildConfiguration) refs[i]).getBuildConfig()));
+				configs.add((((BuildConfiguration) ref).getBuildConfig()));
 			} catch (CoreException e) {
 				// The project isn't accessible, or the build configuration doesn't exist
 				// on the project.  If requested return the full set of build references which may
 				// be useful to API consumers
 				if (includeMissing)
-					configs.add(refs[i]);
+					configs.add(ref);
 			}
 		}
 		return configs.toArray(new IBuildConfiguration[configs.size()]);
@@ -834,8 +834,8 @@
 		// get the children via the workspace since we know that this
 		// resource exists (it is local).
 		IResource[] children = getChildren(IResource.NONE);
-		for (int i = 0; i < children.length; i++)
-			((Resource) children[i]).internalSetLocal(flag, depth);
+		for (IResource element : children)
+			((Resource) element).internalSetLocal(flag, depth);
 	}
 
 	@Override
@@ -1120,8 +1120,7 @@
 		if (oldDescription != null) {
 			HashMap<IPath, LinkDescription> oldLinks = oldDescription.getLinks();
 			if (oldLinks != null) {
-				for (Iterator<LinkDescription> it = oldLinks.values().iterator(); it.hasNext();) {
-					LinkDescription oldLink = it.next();
+				for (LinkDescription oldLink : oldLinks.values()) {
 					Resource oldLinkResource = (Resource) findMember(oldLink.getProjectRelativePath());
 					if (oldLinkResource == null || !oldLinkResource.isLinked())
 						continue;
@@ -1149,26 +1148,20 @@
 		if (newLinks == null)
 			return status;
 		//sort links to avoid creating nested links before their parents
-		TreeSet<LinkDescription> newLinksAndGroups = new TreeSet<>(new Comparator<LinkDescription>() {
-			@Override
-			public int compare(LinkDescription arg0, LinkDescription arg1) {
-				int numberOfSegments0 = arg0.getProjectRelativePath().segmentCount();
-				int numberOfSegments1 = arg1.getProjectRelativePath().segmentCount();
-				if (numberOfSegments0 != numberOfSegments1)
-					return numberOfSegments0 - numberOfSegments1;
-				else if (arg0.equals(arg1))
-					return 0;
+		TreeSet<LinkDescription> newLinksAndGroups = new TreeSet<>((arg0, arg1) -> {
+			int numberOfSegments0 = arg0.getProjectRelativePath().segmentCount();
+			int numberOfSegments1 = arg1.getProjectRelativePath().segmentCount();
+			if (numberOfSegments0 != numberOfSegments1)
+				return numberOfSegments0 - numberOfSegments1;
+			else if (arg0.equals(arg1))
+				return 0;
 
-				return -1;
-			}
-
+			return -1;
 		});
 		if (newLinks != null)
 			newLinksAndGroups.addAll(newLinks.values());
 
-		for (Iterator<LinkDescription> it = newLinksAndGroups.iterator(); it.hasNext();) {
-			Object description = it.next();
-			LinkDescription newLink = (LinkDescription) description;
+		for (LinkDescription newLink : newLinksAndGroups) {
 			try {
 				Resource toLink = workspace.newResource(getFullPath().append(newLink.getProjectRelativePath()), newLink.getType());
 				IContainer parent = toLink.getParent();
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectContentTypes.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectContentTypes.java
index 8965515..f41c13d 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectContentTypes.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectContentTypes.java
@@ -138,15 +138,15 @@
 		if (enabledNatures.length == 0)
 			return Collections.EMPTY_SET;
 		Set<String> related = new HashSet<>(enabledNatures.length);
-		for (int i = 0; i < enabledNatures.length; i++) {
-			ProjectNatureDescriptor descriptor = (ProjectNatureDescriptor) workspace.getNatureDescriptor(enabledNatures[i]);
+		for (String enabledNature : enabledNatures) {
+			ProjectNatureDescriptor descriptor = (ProjectNatureDescriptor) workspace.getNatureDescriptor(enabledNature);
 			if (descriptor == null)
 				// no descriptor found for the nature, skip it
 				continue;
 			String[] natureContentTypes = descriptor.getContentTypeIds();
-			for (int j = 0; j < natureContentTypes.length; j++)
+			for (String natureContentType : natureContentTypes)
 				// collect associate content types
-				related.add(natureContentTypes[j]);
+				related.add(natureContentType);
 		}
 		return related;
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java
index 1af05fa..24492e8 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java
@@ -177,8 +177,8 @@
 	 */
 	private Collection<BuildConfiguration> getBuildConfigReferencesFromProjects(IProject[] projects) {
 		List<BuildConfiguration> refs = new ArrayList<>(projects.length);
-		for (int i = 0; i < projects.length; i++)
-			refs.add(new BuildConfiguration(projects[i], null));
+		for (IProject project : projects)
+			refs.add(new BuildConfiguration(project, null));
 		return refs;
 	}
 
@@ -189,8 +189,8 @@
 	 */
 	private Collection<IProject> getProjectsFromBuildConfigRefs(IBuildConfiguration[] refs) {
 		LinkedHashSet<IProject> projects = new LinkedHashSet<>(refs.length);
-		for (int i = 0; i < refs.length; i++)
-			projects.add(refs[i].getProject());
+		for (IBuildConfiguration ref : refs)
+			projects.add(ref.getProject());
 		return projects;
 	}
 
@@ -466,8 +466,8 @@
 	@Override
 	public boolean hasNature(String natureID) {
 		String[] natureIDs = getNatureIds(false);
-		for (int i = 0; i < natureIDs.length; ++i)
-			if (natureIDs[i].equals(natureID))
+		for (String natureID2 : natureIDs)
+			if (natureID2.equals(natureID))
 				return true;
 		return false;
 	}
@@ -479,8 +479,7 @@
 	private static boolean configRefsHaveChanges(Map<String, IBuildConfiguration[]> m1, Map<String, IBuildConfiguration[]> m2) {
 		if (m1.size() != m2.size())
 			return true;
-		for (Iterator<Entry<String, IBuildConfiguration[]>> it = m1.entrySet().iterator(); it.hasNext();) {
-			Entry<String, IBuildConfiguration[]> e = it.next();
+		for (Entry<String, IBuildConfiguration[]> e : m1.entrySet()) {
 			if (!m2.containsKey(e.getKey()))
 				return true;
 			if (!Arrays.equals(e.getValue(), m2.get(e.getKey())))
@@ -496,8 +495,8 @@
 		Assert.isNotNull(buildConfigName);
 		if (configNames.length == 0)
 			return IBuildConfiguration.DEFAULT_CONFIG_NAME.equals(buildConfigName);
-		for (int i = 0; i < configNames.length; i++)
-			if (configNames[i].equals(buildConfigName))
+		for (String configName : configNames)
+			if (configName.equals(buildConfigName))
 				return true;
 		return false;
 	}
@@ -595,9 +594,9 @@
 			result[i] = (ICommand) ((BuildCommand) value[i]).clone();
 			//copy the reference to any builder instance from the old build spec
 			//to preserve builder states if possible.
-			for (int j = 0; j < buildSpec.length; j++) {
-				if (result[i].equals(buildSpec[j])) {
-					((BuildCommand) result[i]).setBuilders(((BuildCommand) buildSpec[j]).getBuilders());
+			for (ICommand element : buildSpec) {
+				if (result[i].equals(element)) {
+					((BuildCommand) result[i]).setBuilders(((BuildCommand) element).getBuilders());
 					break;
 				}
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectInfo.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectInfo.java
index 7b7151e..57b35d8 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectInfo.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectInfo.java
@@ -50,8 +50,8 @@
 		propertyStore = null;
 		if (description != null) {
 			ICommand[] buildSpec = description.getBuildSpec(false);
-			for (int i = 0; i < buildSpec.length; i++)
-				((BuildCommand) buildSpec[i]).setBuilders(null);
+			for (ICommand element : buildSpec)
+				((BuildCommand) element).setBuilders(null);
 		}
 	}
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPathVariableManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPathVariableManager.java
index 448478b..aa85ec1 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPathVariableManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPathVariableManager.java
@@ -17,6 +17,7 @@
 import java.net.URISyntaxException;
 import java.util.*;
 import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.internal.resources.ProjectVariableProviderManager.Descriptor;
 import org.eclipse.core.internal.utils.Messages;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
@@ -76,11 +77,11 @@
 		} catch (CoreException e) {
 			return new String[0];
 		}
-		for (int i = 0; i < variableProviders.length; i++) {
-			String[] variableHints = variableProviders[i].getVariableNames(variableProviders[i].getName(), resource);
+		for (Descriptor variableProvider : variableProviders) {
+			String[] variableHints = variableProvider.getVariableNames(variableProvider.getName(), resource);
 			if (variableHints != null && variableHints.length > 0)
 				for (int k = 0; k < variableHints.length; k++)
-					result.add(variableProviders[i].getVariableNames(variableProviders[i].getName(), resource)[k]);
+					result.add(variableProvider.getVariableNames(variableProvider.getName(), resource)[k]);
 		}
 		if (map != null)
 			result.addAll(map.keySet());
@@ -147,13 +148,13 @@
 			name = varName.substring(0, index);
 		else
 			name = varName;
-		for (int i = 0; i < variableProviders.length; i++) {
-			if (variableProviders[i].getName().equals(name))
-				return variableProviders[i].getValue(varName, resource);
+		for (Descriptor variableProvider : variableProviders) {
+			if (variableProvider.getName().equals(name))
+				return variableProvider.getValue(varName, resource);
 		}
-		for (int i = 0; i < variableProviders.length; i++) {
-			if (name.startsWith(variableProviders[i].getName()))
-				return variableProviders[i].getValue(varName, resource);
+		for (Descriptor variableProvider : variableProviders) {
+			if (name.startsWith(variableProvider.getName()))
+				return variableProvider.getValue(varName, resource);
 		}
 		return null;
 	}
@@ -163,11 +164,11 @@
 	 */
 	@Override
 	public boolean isDefined(String varName) {
-		for (int i = 0; i < variableProviders.length; i++) {
+		for (Descriptor variableProvider : variableProviders) {
 			//			if (variableProviders[i].getName().equals(varName))
 			//				return true;
 
-			if (varName.startsWith(variableProviders[i].getName()))
+			if (varName.startsWith(variableProvider.getName()))
 				return true;
 		}
 
@@ -340,11 +341,11 @@
 			if (variableExists && currentValue.equals(newValue))
 				return;
 
-			for (int i = 0; i < variableProviders.length; i++) {
+			for (Descriptor variableProvider : variableProviders) {
 				//				if (variableProviders[i].getName().equals(varName))
 				//					return;
 
-				if (varName.startsWith(variableProviders[i].getName()))
+				if (varName.startsWith(variableProvider.getName()))
 					return;
 			}
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java
index 69bcd6c..00054eb 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java
@@ -241,8 +241,8 @@
 	private static void clearAll(Preferences node) throws BackingStoreException {
 		node.clear();
 		String[] names = node.childrenNames();
-		for (int i = 0; i < names.length; i++) {
-			clearAll(node.node(names[i]));
+		for (String name2 : names) {
+			clearAll(node.node(name2));
 		}
 	}
 
@@ -353,8 +353,7 @@
 			return EMPTY_STRING_ARRAY;
 		}
 		ArrayList<String> result = new ArrayList<>();
-		for (int i = 0; i < members.length; i++) {
-			IResource resource = members[i];
+		for (IResource resource : members) {
 			if (resource.getType() == IResource.FILE && PREFS_FILE_EXTENSION.equals(resource.getFullPath().getFileExtension()))
 				result.add(resource.getFullPath().removeFileExtension().lastSegment());
 		}
@@ -592,74 +591,71 @@
 		final String finalQualifier = qualifier;
 		final BackingStoreException[] bse = new BackingStoreException[1];
 		try {
-			ICoreRunnable operation = new ICoreRunnable() {
-				@Override
-				public void run(IProgressMonitor monitor) throws CoreException {
-					try {
-						Properties table = convertToProperties(new SortedProperties(), ""); //$NON-NLS-1$
-						// nothing to save. delete existing file if one exists.
-						if (table.isEmpty()) {
-							if (fileInWorkspace.exists()) {
-								if (Policy.DEBUG_PREFERENCES)
-									Policy.debug("Deleting preference file: " + fileInWorkspace.getFullPath()); //$NON-NLS-1$
-								if (fileInWorkspace.isReadOnly()) {
-									IStatus status = fileInWorkspace.getWorkspace().validateEdit(new IFile[] {fileInWorkspace}, IWorkspace.VALIDATE_PROMPT);
-									if (!status.isOK())
-										throw new CoreException(status);
-								}
-								try {
-									fileInWorkspace.delete(true, null);
-								} catch (CoreException e) {
-									String message = NLS.bind(Messages.preferences_deleteException, fileInWorkspace.getFullPath());
-									log(new Status(IStatus.WARNING, ResourcesPlugin.PI_RESOURCES, IStatus.WARNING, message, null));
-								}
-							}
-							return;
-						}
-						table.put(VERSION_KEY, VERSION_VALUE);
-						// print the table to a string and remove the timestamp that Properties#store always adds
-						String s = removeTimestampFromTable(table);
-						String systemLineSeparator = System.getProperty("line.separator"); //$NON-NLS-1$
-						String fileLineSeparator = FileUtil.getLineSeparator(fileInWorkspace);
-						if (!systemLineSeparator.equals(fileLineSeparator))
-							s = s.replaceAll(systemLineSeparator, fileLineSeparator);
-						InputStream input = new BufferedInputStream(new ByteArrayInputStream(s.getBytes("UTF-8"))); //$NON-NLS-1$
-						// make sure that preference folder and file are in sync
-						fileInWorkspace.getParent().refreshLocal(IResource.DEPTH_ZERO, null);
-						fileInWorkspace.refreshLocal(IResource.DEPTH_ZERO, null);
+			ICoreRunnable operation = monitor -> {
+				try {
+					Properties table = convertToProperties(new SortedProperties(), ""); //$NON-NLS-1$
+					// nothing to save. delete existing file if one exists.
+					if (table.isEmpty()) {
 						if (fileInWorkspace.exists()) {
 							if (Policy.DEBUG_PREFERENCES)
-								Policy.debug("Setting preference file contents for: " + fileInWorkspace.getFullPath()); //$NON-NLS-1$
+								Policy.debug("Deleting preference file: " + fileInWorkspace.getFullPath()); //$NON-NLS-1$
 							if (fileInWorkspace.isReadOnly()) {
-								IStatus status = fileInWorkspace.getWorkspace().validateEdit(new IFile[] {fileInWorkspace}, IWorkspace.VALIDATE_PROMPT);
-								if (!status.isOK()) {
-									input.close();
-									throw new CoreException(status);
-								}
+								IStatus status1 = fileInWorkspace.getWorkspace().validateEdit(new IFile[] {fileInWorkspace}, IWorkspace.VALIDATE_PROMPT);
+								if (!status1.isOK())
+									throw new CoreException(status1);
 							}
-							// set the contents
-							fileInWorkspace.setContents(input, IResource.KEEP_HISTORY, null);
-						} else {
-							// create the file
-							IFolder folder = (IFolder) fileInWorkspace.getParent();
-							if (!folder.exists()) {
-								if (Policy.DEBUG_PREFERENCES)
-									Policy.debug("Creating parent preference directory: " + folder.getFullPath()); //$NON-NLS-1$
-								folder.create(IResource.NONE, true, null);
+							try {
+								fileInWorkspace.delete(true, null);
+							} catch (CoreException e1) {
+								String message1 = NLS.bind(Messages.preferences_deleteException, fileInWorkspace.getFullPath());
+								log(new Status(IStatus.WARNING, ResourcesPlugin.PI_RESOURCES, IStatus.WARNING, message1, null));
 							}
-							if (Policy.DEBUG_PREFERENCES)
-								Policy.debug("Creating preference file: " + fileInWorkspace.getLocation()); //$NON-NLS-1$
-							fileInWorkspace.create(input, IResource.NONE, null);
 						}
-						if (PREFS_DERIVED_QUALIFIER.equals(finalQualifier))
-							fileInWorkspace.setDerived(true, null);
-					} catch (BackingStoreException e) {
-						bse[0] = e;
-					} catch (IOException e) {
-						String message = NLS.bind(Messages.preferences_saveProblems, fileInWorkspace.getFullPath());
-						log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, IStatus.ERROR, message, e));
-						bse[0] = new BackingStoreException(message);
+						return;
 					}
+					table.put(VERSION_KEY, VERSION_VALUE);
+					// print the table to a string and remove the timestamp that Properties#store always adds
+					String s = removeTimestampFromTable(table);
+					String systemLineSeparator = System.getProperty("line.separator"); //$NON-NLS-1$
+					String fileLineSeparator = FileUtil.getLineSeparator(fileInWorkspace);
+					if (!systemLineSeparator.equals(fileLineSeparator))
+						s = s.replaceAll(systemLineSeparator, fileLineSeparator);
+					InputStream input = new BufferedInputStream(new ByteArrayInputStream(s.getBytes("UTF-8"))); //$NON-NLS-1$
+					// make sure that preference folder and file are in sync
+					fileInWorkspace.getParent().refreshLocal(IResource.DEPTH_ZERO, null);
+					fileInWorkspace.refreshLocal(IResource.DEPTH_ZERO, null);
+					if (fileInWorkspace.exists()) {
+						if (Policy.DEBUG_PREFERENCES)
+							Policy.debug("Setting preference file contents for: " + fileInWorkspace.getFullPath()); //$NON-NLS-1$
+						if (fileInWorkspace.isReadOnly()) {
+							IStatus status2 = fileInWorkspace.getWorkspace().validateEdit(new IFile[] {fileInWorkspace}, IWorkspace.VALIDATE_PROMPT);
+							if (!status2.isOK()) {
+								input.close();
+								throw new CoreException(status2);
+							}
+						}
+						// set the contents
+						fileInWorkspace.setContents(input, IResource.KEEP_HISTORY, null);
+					} else {
+						// create the file
+						IFolder folder = (IFolder) fileInWorkspace.getParent();
+						if (!folder.exists()) {
+							if (Policy.DEBUG_PREFERENCES)
+								Policy.debug("Creating parent preference directory: " + folder.getFullPath()); //$NON-NLS-1$
+							folder.create(IResource.NONE, true, null);
+						}
+						if (Policy.DEBUG_PREFERENCES)
+							Policy.debug("Creating preference file: " + fileInWorkspace.getLocation()); //$NON-NLS-1$
+						fileInWorkspace.create(input, IResource.NONE, null);
+					}
+					if (PREFS_DERIVED_QUALIFIER.equals(finalQualifier))
+						fileInWorkspace.setDerived(true, null);
+				} catch (BackingStoreException e2) {
+					bse[0] = e2;
+				} catch (IOException e3) {
+					String message2 = NLS.bind(Messages.preferences_saveProblems, fileInWorkspace.getFullPath());
+					log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, IStatus.ERROR, message2, e3));
+					bse[0] = new BackingStoreException(message2);
 				}
 			};
 			//don't bother with scheduling rules if we are already inside an operation
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectVariableProviderManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectVariableProviderManager.java
index c4951f6..d8a6c5f 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectVariableProviderManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectVariableProviderManager.java
@@ -90,8 +90,8 @@
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_VARIABLE_PROVIDERS);
 		IExtension[] extensions = point.getExtensions();
 		descriptors = new HashMap<>(extensions.length * 2 + 1);
-		for (int i = 0, imax = extensions.length; i < imax; i++) {
-			IConfigurationElement[] elements = extensions[i].getConfigurationElements();
+		for (IExtension extension : extensions) {
+			IConfigurationElement[] elements = extension.getConfigurationElements();
 			int count = elements.length;
 			for (int j = 0; j < count; j++) {
 				IConfigurationElement element = elements[j];
@@ -99,7 +99,7 @@
 				if (elementName.equalsIgnoreCase("variableResolver")) { //$NON-NLS-1$
 					Descriptor desc = null;
 					try {
-						desc = new Descriptor(extensions[i], element);
+						desc = new Descriptor(extension, element);
 					} catch (CoreException e) {
 						Policy.log(e);
 					}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
index e3bd02d..3adbd45 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
@@ -60,34 +60,31 @@
 			checkAccessible(getFlags(getResourceInfo(includePhantoms, false)));
 
 		final ResourceProxy proxy = new ResourceProxy();
-		IElementContentVisitor elementVisitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object contents) {
-				ResourceInfo info = (ResourceInfo) contents;
-				if (!isMember(getFlags(info), memberFlags))
-					return false;
-				proxy.requestor = requestor;
-				proxy.info = info;
-				try {
-					boolean shouldContinue = true;
-					switch (depth) {
-						case DEPTH_ZERO :
-							shouldContinue = false;
-							break;
-						case DEPTH_ONE :
-							shouldContinue = !path.equals(requestor.requestPath().removeLastSegments(1));
-							break;
-						case DEPTH_INFINITE :
-							shouldContinue = true;
-							break;
-					}
-					return visitor.visit(proxy) && shouldContinue;
-				} catch (CoreException e) {
-					// Throw an exception to bail out of the traversal.
-					throw new WrappedRuntimeException(e);
-				} finally {
-					proxy.reset();
+		IElementContentVisitor elementVisitor = (tree, requestor, contents) -> {
+			ResourceInfo info = (ResourceInfo) contents;
+			if (!isMember(getFlags(info), memberFlags))
+				return false;
+			proxy.requestor = requestor;
+			proxy.info = info;
+			try {
+				boolean shouldContinue = true;
+				switch (depth) {
+					case DEPTH_ZERO :
+						shouldContinue = false;
+						break;
+					case DEPTH_ONE :
+						shouldContinue = !path.equals(requestor.requestPath().removeLastSegments(1));
+						break;
+					case DEPTH_INFINITE :
+						shouldContinue = true;
+						break;
 				}
+				return visitor.visit(proxy) && shouldContinue;
+			} catch (CoreException e) {
+				// Throw an exception to bail out of the traversal.
+				throw new WrappedRuntimeException(e);
+			} finally {
+				proxy.reset();
 			}
 		};
 		try {
@@ -114,12 +111,7 @@
 	public void accept(final IResourceVisitor visitor, int depth, int memberFlags) throws CoreException {
 		// Use the fast visitor if visiting to infinite depth.
 		if (depth == IResource.DEPTH_INFINITE) {
-			accept(new IResourceProxyVisitor() {
-				@Override
-				public boolean visit(IResourceProxy proxy) throws CoreException {
-					return visitor.visit(proxy.requestResource());
-				}
-			}, memberFlags);
+			accept(proxy -> visitor.visit(proxy.requestResource()), memberFlags);
 			return;
 		}
 		// It is invalid to call accept on a phantom when INCLUDE_PHANTOMS is not specified.
@@ -146,8 +138,8 @@
 		// If we had a gender change we need to fix up the resource before asking for its members.
 		IContainer resource = getType() != type ? (IContainer) workspace.newResource(getFullPath(), type) : (IContainer) this;
 		IResource[] members = resource.members(memberFlags);
-		for (int i = 0; i < members.length; i++)
-			members[i].accept(visitor, DEPTH_ZERO, memberFlags | IContainer.DO_NOT_CHECK_EXISTENCE);
+		for (IResource member : members)
+			member.accept(visitor, DEPTH_ZERO, memberFlags | IContainer.DO_NOT_CHECK_EXISTENCE);
 	}
 
 	protected void assertCopyRequirements(IPath destination, int destinationType, int updateFlags) throws CoreException {
@@ -579,8 +571,8 @@
 			// Copy the children.
 			IResource[] children = ((IContainer) this).members(IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
 			SubMonitor loopProgress = SubMonitor.convert(progress.split(70), children.length);
-			for (int i = 0; i < children.length; i++) {
-				Resource child = (Resource) children[i];
+			for (IResource element : children) {
+				Resource child = (Resource) element;
 				child.copy(destPath.append(child.getName()), updateFlags, loopProgress.split(1));
 			}
 
@@ -815,8 +807,8 @@
 		List<Resource> links = findLinks();
 		// Pre-delete notification to internal infrastructure
 		if (links != null)
-			for (Iterator<Resource> it = links.iterator(); it.hasNext();)
-				workspace.broadcastEvent(LifecycleEvent.newEvent(LifecycleEvent.PRE_LINK_DELETE, it.next()));
+			for (Resource resource : links)
+				workspace.broadcastEvent(LifecycleEvent.newEvent(LifecycleEvent.PRE_LINK_DELETE, resource));
 
 		// Check if we deleted a preferences file.
 		ProjectPreferences.deleted(this);
@@ -827,8 +819,8 @@
 			ProjectDescription description = project.internalGetDescription();
 			if (description != null) {
 				boolean wasChanged = false;
-				for (Iterator<Resource> it = links.iterator(); it.hasNext();)
-					wasChanged |= description.setLinkLocation(it.next().getProjectRelativePath(), null);
+				for (Resource resource : links)
+					wasChanged |= description.setLinkLocation(resource.getProjectRelativePath(), null);
 				if (wasChanged) {
 					project.internalSetDescription(description, true);
 					try {
@@ -856,8 +848,8 @@
 			Project project = (Project) getProject();
 			ProjectDescription description = project.internalGetDescription();
 			if (description != null) {
-				for (Iterator<Resource> it = filters.iterator(); it.hasNext();)
-					description.setFilters(it.next().getProjectRelativePath(), null);
+				for (Resource resource : filters)
+					description.setFilters(resource.getProjectRelativePath(), null);
 				project.internalSetDescription(description, true);
 				project.writeDescription(IResource.FORCE);
 			}
@@ -889,8 +881,7 @@
 			return null;
 		List<Resource> links = null;
 		IPath myPath = getProjectRelativePath();
-		for (Iterator<LinkDescription> it = linkMap.values().iterator(); it.hasNext();) {
-			LinkDescription link = it.next();
+		for (LinkDescription link : linkMap.values()) {
 			IPath linkPath = link.getProjectRelativePath();
 			if (myPath.isPrefixOf(linkPath)) {
 				if (links == null)
@@ -912,8 +903,7 @@
 			HashMap<IPath, LinkedList<FilterDescription>> filterMap = description.getFilters();
 			if (filterMap != null) {
 				IPath myPath = getProjectRelativePath();
-				for (Iterator<IPath> it = filterMap.keySet().iterator(); it.hasNext();) {
-					IPath filterPath = it.next();
+				for (IPath filterPath : filterMap.keySet()) {
 					if (myPath.isPrefixOf(filterPath)) {
 						if (filters == null)
 							filters = new ArrayList<>();
@@ -999,9 +989,9 @@
 	 * the list if one is found, otherwise returns null.
 	 */
 	private String findVariant(String target, String[] list) {
-		for (int i = 0; i < list.length; i++) {
-			if (target.toUpperCase().equals(list[i].toUpperCase()))
-				return list[i];
+		for (String element : list) {
+			if (target.toUpperCase().equals(element.toUpperCase()))
+				return element;
 		}
 		return null;
 	}
@@ -1020,8 +1010,8 @@
 			// Delete resource filters.
 			Project project = (Project) getProject();
 			ProjectDescription description = project.internalGetDescription();
-			for (Iterator<Resource> it = filters.iterator(); it.hasNext();)
-				description.setFilters(it.next().getProjectRelativePath(), null);
+			for (Resource resource : filters)
+				description.setFilters(resource.getProjectRelativePath(), null);
 			project.writeDescription(IResource.NONE);
 		}
 
@@ -1239,8 +1229,8 @@
 		if (depth == IResource.DEPTH_ONE)
 			depth = IResource.DEPTH_ZERO;
 		IResource[] children = ((IContainer) this).members();
-		for (int i = 0; i < children.length; i++)
-			((Resource) children[i]).internalSetLocal(flag, depth);
+		for (IResource element : children)
+			((Resource) element).internalSetLocal(flag, depth);
 	}
 
 	@Override
@@ -1258,8 +1248,8 @@
 		if (rule instanceof MultiRule) {
 			MultiRule multi = (MultiRule) rule;
 			ISchedulingRule[] children = multi.getChildren();
-			for (int i = 0; i < children.length; i++)
-				if (isConflicting(children[i]))
+			for (ISchedulingRule element : children)
+				if (isConflicting(element))
 					return true;
 			return false;
 		}
@@ -1326,8 +1316,8 @@
 			if (links == null)
 				return false;
 			IPath myPath = getProjectRelativePath();
-			for (Iterator<LinkDescription> it = links.values().iterator(); it.hasNext();) {
-				if (it.next().getProjectRelativePath().isPrefixOf(myPath))
+			for (LinkDescription linkDescription : links.values()) {
+				if (linkDescription.getProjectRelativePath().isPrefixOf(myPath))
 					return true;
 			}
 			return false;
@@ -1835,8 +1825,8 @@
 			case IResource.ROOT :
 				// All root children including hidden projects will be deleted so notify.
 				IResource[] projects = ((Container) this).getChildren(IContainer.INCLUDE_HIDDEN);
-				for (int i = 0; i < projects.length; i++) {
-					workspace.broadcastEvent(LifecycleEvent.newEvent(LifecycleEvent.PRE_PROJECT_DELETE, projects[i]));
+				for (IResource project2 : projects) {
+					workspace.broadcastEvent(LifecycleEvent.newEvent(LifecycleEvent.PRE_PROJECT_DELETE, project2));
 				}
 				break;
 		}
@@ -1942,8 +1932,7 @@
 				relativePath = relativePath.removeLastSegments(1);
 			filters = description.getFilter(relativePath);
 			if (filters != null) {
-				for (Iterator<FilterDescription> it = filters.iterator(); it.hasNext();) {
-					FilterDescription desc = it.next();
+				for (FilterDescription desc : filters) {
 					if (firstSegment || desc.isInheritable()) {
 						Filter filter = new Filter(project, desc);
 						if (filter.isIncludeOnly()) {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceTree.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceTree.java
index bba0106..8ffe720 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceTree.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceTree.java
@@ -381,8 +381,8 @@
 			return false;
 		}
 		boolean deletedChildren = true;
-		for (int i = 0; i < members.length; i++) {
-			IResource child = members[i];
+		for (IResource member : members) {
+			IResource child = member;
 			switch (child.getType()) {
 				case IResource.FILE :
 					// ignore the .project file for now and delete it last
@@ -765,13 +765,13 @@
 			//if this is a deep move, move the contents of any linked resources
 			if ((flags & IResource.SHALLOW) == 0) {
 				IResource[] children = source.members();
-				for (int i = 0; i < children.length; i++) {
-					if (children[i].isLinked()) {
-						message = NLS.bind(Messages.resources_moving, children[i].getFullPath());
+				for (IResource element : children) {
+					if (element.isLinked()) {
+						message = NLS.bind(Messages.resources_moving, element.getFullPath());
 						monitor.subTask(message);
-						IFileStore linkDestination = destStore.getChild(children[i].getName());
+						IFileStore linkDestination = destStore.getChild(element.getName());
 						try {
-							localManager.move(children[i], linkDestination, flags, Policy.monitorFor(null));
+							localManager.move(element, linkDestination, flags, Policy.monitorFor(null));
 						} catch (CoreException ce) {
 							//log the failure, but keep trying on remaining links
 							failed(ce.getStatus());
@@ -1137,24 +1137,21 @@
 	 * those in the file system. Used after a #move.
 	 */
 	private void updateTimestamps(IResource root, final boolean isDeep) {
-		IResourceVisitor visitor = new IResourceVisitor() {
-			@Override
-			public boolean visit(IResource resource) {
-				if (resource.isLinked()) {
-					if (isDeep && !((Resource) resource).isUnderVirtual()) {
-						//clear the linked resource bit, if any
-						ResourceInfo info = ((Resource) resource).getResourceInfo(false, true);
-						info.clear(ICoreConstants.M_LINK);
-					}
-					return true;
+		IResourceVisitor visitor = resource -> {
+			if (resource.isLinked()) {
+				if (isDeep && !((Resource) resource).isUnderVirtual()) {
+					//clear the linked resource bit, if any
+					ResourceInfo info = ((Resource) resource).getResourceInfo(false, true);
+					info.clear(ICoreConstants.M_LINK);
 				}
-				//only needed if underlying file system does not preserve timestamps
-				//				if (resource.getType() == IResource.FILE) {
-				//					IFile file = (IFile) resource;
-				//					updateMovedFileTimestamp(file, computeTimestamp(file));
-				//				}
 				return true;
 			}
+			//only needed if underlying file system does not preserve timestamps
+			//				if (resource.getType() == IResource.FILE) {
+			//					IFile file = (IFile) resource;
+			//					updateMovedFileTimestamp(file, computeTimestamp(file));
+			//				}
+			return true;
 		};
 		try {
 			root.accept(visitor, IResource.DEPTH_INFINITE, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Rules.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Rules.java
index 4ec1808..19bb2ce 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Rules.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Rules.java
@@ -202,11 +202,11 @@
 		//gather rules for each resource from appropriate factory
 		HashSet<ISchedulingRule> rules = new HashSet<>();
 		IResource[] oneResource = new IResource[1];
-		for (int i = 0; i < resources.length; i++) {
-			if (resources[i].getType() == IResource.ROOT)
+		for (IResource resource : resources) {
+			if (resource.getType() == IResource.ROOT)
 				return root;
-			oneResource[0] = resources[i];
-			ISchedulingRule rule = factoryFor(resources[i]).validateEditRule(oneResource);
+			oneResource[0] = resource;
+			ISchedulingRule rule = factoryFor(resource).validateEditRule(oneResource);
 			if (rule != null)
 				rules.add(rule);
 		}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
index f611fbd..a4eff88 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
@@ -256,8 +256,7 @@
 	 */
 	protected void clearSavedDelta() {
 		synchronized (saveParticipants) {
-			for (Iterator<String> i = saveParticipants.keySet().iterator(); i.hasNext();) {
-				String pluginId = i.next();
+			for (String pluginId : saveParticipants.keySet()) {
 				masterTable.setProperty(CLEAR_DELTA_PREFIX + pluginId, "true"); //$NON-NLS-1$
 			}
 		}
@@ -272,8 +271,7 @@
 
 		//forget saved trees, if they are not used by registered participants
 		synchronized (savedStates) {
-			for (Iterator<SaveContext> i = contexts.values().iterator(); i.hasNext();) {
-				SaveContext context = i.next();
+			for (SaveContext context : contexts.values()) {
 				forgetSavedTree(context.getPluginId());
 			}
 		}
@@ -281,8 +279,7 @@
 		//trees for plugin saved states
 		ArrayList<ElementTree> trees = new ArrayList<>();
 		synchronized (savedStates) {
-			for (Iterator<SavedState> i = savedStates.values().iterator(); i.hasNext();) {
-				SavedState state = i.next();
+			for (SavedState state : savedStates.values()) {
 				if (state.oldTree != null) {
 					trees.add(state.oldTree);
 				}
@@ -291,13 +288,11 @@
 
 		//trees for builders
 		IProject[] projects = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++) {
-			IProject project = projects[i];
+		for (IProject project : projects) {
 			if (project.isOpen()) {
 				ArrayList<BuilderPersistentInfo> builderInfos = workspace.getBuildManager().createBuildersPersistentInfo(project);
 				if (builderInfos != null) {
-					for (Iterator<BuilderPersistentInfo> it = builderInfos.iterator(); it.hasNext();) {
-						BuilderPersistentInfo info = it.next();
+					for (BuilderPersistentInfo info : builderInfos) {
 						trees.add(info.getLastBuiltTree());
 					}
 				}
@@ -326,8 +321,8 @@
 	}
 
 	protected void commit(Map<String, SaveContext> contexts) throws CoreException {
-		for (Iterator<SaveContext> i = contexts.values().iterator(); i.hasNext();)
-			i.next().commit();
+		for (SaveContext saveContext : contexts.values())
+			saveContext.commit();
 	}
 
 	/**
@@ -337,8 +332,7 @@
 	 */
 	protected Map<String, SaveContext> computeSaveContexts(String[] pluginIds, int kind, IProject project) {
 		HashMap<String, SaveContext> result = new HashMap<>(pluginIds.length);
-		for (int i = 0; i < pluginIds.length; i++) {
-			String pluginId = pluginIds[i];
+		for (String pluginId : pluginIds) {
 			try {
 				SaveContext context = new SaveContext(pluginId, kind, project);
 				result.put(pluginId, context);
@@ -361,14 +355,12 @@
 	protected Map<String, ElementTree> computeStatesToSave(Map<String, SaveContext> contexts, ElementTree current) {
 		HashMap<String, ElementTree> result = new HashMap<>(savedStates.size() * 2);
 		synchronized (savedStates) {
-			for (Iterator<SavedState> i = savedStates.values().iterator(); i.hasNext();) {
-				SavedState state = i.next();
+			for (SavedState state : savedStates.values()) {
 				if (state.oldTree != null)
 					result.put(state.pluginId, state.oldTree);
 			}
 		}
-		for (Iterator<SaveContext> i = contexts.values().iterator(); i.hasNext();) {
-			SaveContext context = i.next();
+		for (SaveContext context : contexts.values()) {
 			if (!context.isDeltaNeeded())
 				continue;
 			String pluginId = context.getPluginId();
@@ -406,8 +398,8 @@
 	public void forgetSavedTree(String pluginId) {
 		if (pluginId == null) {
 			synchronized (savedStates) {
-				for (Iterator<SavedState> i = savedStates.values().iterator(); i.hasNext();)
-					i.next().forgetTrees();
+				for (SavedState savedState : savedStates.values())
+					savedState.forgetTrees();
 			}
 		} else {
 			SavedState state = savedStates.get(pluginId);
@@ -501,18 +493,15 @@
 		// Delete the snapshot files, if any.
 		IPath location = workspace.getMetaArea().getSnapshotLocationFor(workspace.getRoot());
 		java.io.File target = location.toFile().getParentFile();
-		FilenameFilter filter = new FilenameFilter() {
-			@Override
-			public boolean accept(java.io.File dir, String name) {
-				if (!name.endsWith(LocalMetaArea.F_SNAP))
+		FilenameFilter filter = (dir, name) -> {
+			if (!name.endsWith(LocalMetaArea.F_SNAP))
+				return false;
+			for (int i = 0; i < name.length() - LocalMetaArea.F_SNAP.length(); i++) {
+				char c = name.charAt(i);
+				if (c < '0' || c > '9')
 					return false;
-				for (int i = 0; i < name.length() - LocalMetaArea.F_SNAP.length(); i++) {
-					char c = name.charAt(i);
-					if (c < '0' || c > '9')
-						return false;
-				}
-				return true;
 			}
+			return true;
 		};
 		String[] candidates = target.list(filter);
 		if (candidates != null)
@@ -567,8 +556,7 @@
 	 */
 	protected void removeClearDeltaMarks() {
 		synchronized (saveParticipants) {
-			for (Iterator<String> i = saveParticipants.keySet().iterator(); i.hasNext();) {
-				String pluginId = i.next();
+			for (String pluginId : saveParticipants.keySet()) {
 				removeClearDeltaMarks(pluginId);
 			}
 		}
@@ -579,18 +567,18 @@
 	}
 
 	protected void removeFiles(java.io.File root, String[] candidates, List<String> exclude) {
-		for (int i = 0; i < candidates.length; i++) {
+		for (String candidate : candidates) {
 			boolean delete = true;
 			for (ListIterator<String> it = exclude.listIterator(); it.hasNext();) {
 				String s = it.next();
-				if (s.equals(candidates[i])) {
+				if (s.equals(candidate)) {
 					it.remove();
 					delete = false;
 					break;
 				}
 			}
 			if (delete)
-				new java.io.File(root, candidates[i]).delete();
+				new java.io.File(root, candidate).delete();
 		}
 	}
 
@@ -630,20 +618,15 @@
 		IPath location = workspace.getMetaArea().getTreeLocationFor(workspace.getRoot(), false);
 		valuables.add(location.lastSegment());
 		java.io.File target = location.toFile().getParentFile();
-		FilenameFilter filter = new FilenameFilter() {
-			@Override
-			public boolean accept(java.io.File dir, String name) {
-				return name.endsWith(LocalMetaArea.F_TREE);
-			}
-		};
+		FilenameFilter filter = (dir, name) -> name.endsWith(LocalMetaArea.F_TREE);
 		String[] candidates = target.list(filter);
 		if (candidates != null)
 			removeFiles(target, candidates, valuables);
 
 		// projects
 		IProject[] projects = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++) {
-			location = workspace.getMetaArea().getTreeLocationFor(projects[i], false);
+		for (IProject project : projects) {
+			location = workspace.getMetaArea().getTreeLocationFor(project, false);
 			valuables.add(location.lastSegment());
 			target = location.toFile().getParentFile();
 			candidates = target.list(filter);
@@ -692,8 +675,8 @@
 		if (resource.getType() == IResource.PROJECT)
 			return;
 		IProject[] projects = ((IWorkspaceRoot) resource).getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++)
-			resetSnapshots(projects[i]);
+		for (IProject project : projects)
+			resetSnapshots(project);
 	}
 
 	/**
@@ -734,8 +717,8 @@
 				// restore meta info last because it might close a project if its description is not readable
 				restoreMetaInfo(problems, Policy.subMonitorFor(monitor, 10));
 				IProject[] roots = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-				for (int i = 0; i < roots.length; i++)
-					((Project) roots[i]).startup();
+				for (IProject root : roots)
+					((Project) root).startup();
 				if (!problems.isOK())
 					Policy.log(problems);
 			} finally {
@@ -835,9 +818,9 @@
 			return;
 		}
 		IProject[] projects = ((IWorkspaceRoot) resource).getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++)
-			if (projects[i].isAccessible())
-				markerManager.restore(projects[i], generateDeltas, monitor);
+		for (IProject project : projects)
+			if (project.isAccessible())
+				markerManager.restore(project, generateDeltas, monitor);
 		if (Policy.DEBUG_RESTORE_MARKERS) {
 			Policy.debug("Restore Markers for workspace: " + (System.currentTimeMillis() - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
@@ -878,13 +861,13 @@
 			Policy.debug("Restore workspace metainfo: starting..."); //$NON-NLS-1$
 		long start = System.currentTimeMillis();
 		IProject[] roots = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < roots.length; i++) {
+		for (IProject root : roots) {
 			//fatal to throw exceptions during startup
 			try {
-				restoreMetaInfo((Project) roots[i], monitor);
+				restoreMetaInfo((Project) root, monitor);
 			} catch (CoreException e) {
-				String message = NLS.bind(Messages.resources_readMeta, roots[i].getName());
-				problems.merge(new ResourceStatus(IResourceStatus.FAILED_READ_METADATA, roots[i].getFullPath(), message, e));
+				String message = NLS.bind(Messages.resources_readMeta, root.getName());
+				problems.merge(new ResourceStatus(IResourceStatus.FAILED_READ_METADATA, root.getFullPath(), message, e));
 			}
 		}
 		if (Policy.DEBUG_RESTORE_METAINFO)
@@ -1028,9 +1011,9 @@
 			return;
 		}
 		IProject[] projects = ((IWorkspaceRoot) resource).getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++)
-			if (projects[i].isAccessible())
-				synchronizer.restore(projects[i], monitor);
+		for (IProject project : projects)
+			if (project.isAccessible())
+				synchronizer.restore(project, monitor);
 		if (Policy.DEBUG_RESTORE_SYNCINFO) {
 			Policy.debug("Restore SyncInfo for workspace: " + (System.currentTimeMillis() - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
@@ -1310,9 +1293,9 @@
 		ResourcesPlugin.getPlugin().savePluginPreferences();
 		// save projects' meta info
 		IProject[] roots = workspace.getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < roots.length; i++)
-			if (roots[i].isAccessible()) {
-				IStatus result = saveMetaInfo((Project) roots[i], null);
+		for (IProject root : roots)
+			if (root.isAccessible()) {
+				IStatus result = saveMetaInfo((Project) root, null);
 				if (!result.isOK())
 					problems.merge(result);
 			}
@@ -1675,33 +1658,30 @@
 		final long[] saveTimes = new long[2];
 
 		// Create the visitor
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object elementContents) {
-				ResourceInfo info = (ResourceInfo) elementContents;
-				if (info != null) {
-					try {
-						// save the markers
-						long start = System.currentTimeMillis();
-						markerManager.save(info, requestor, markersOutput, writtenTypes);
-						long markerSaveTime = System.currentTimeMillis() - start;
-						saveTimes[0] += markerSaveTime;
-						persistMarkers += markerSaveTime;
-						// save the sync info - if we have the workspace root then the output stream will be null
-						if (syncInfoOutput != null) {
-							start = System.currentTimeMillis();
-							synchronizer.saveSyncInfo(info, requestor, syncInfoOutput, writtenPartners);
-							long syncInfoSaveTime = System.currentTimeMillis() - start;
-							saveTimes[1] += syncInfoSaveTime;
-							persistSyncInfo += syncInfoSaveTime;
-						}
-					} catch (IOException e) {
-						throw new WrappedRuntimeException(e);
+		IElementContentVisitor visitor = (tree, requestor, elementContents) -> {
+			ResourceInfo info = (ResourceInfo) elementContents;
+			if (info != null) {
+				try {
+					// save the markers
+					long start = System.currentTimeMillis();
+					markerManager.save(info, requestor, markersOutput, writtenTypes);
+					long markerSaveTime = System.currentTimeMillis() - start;
+					saveTimes[0] += markerSaveTime;
+					persistMarkers += markerSaveTime;
+					// save the sync info - if we have the workspace root then the output stream will be null
+					if (syncInfoOutput != null) {
+						start = System.currentTimeMillis();
+						synchronizer.saveSyncInfo(info, requestor, syncInfoOutput, writtenPartners);
+						long syncInfoSaveTime = System.currentTimeMillis() - start;
+						saveTimes[1] += syncInfoSaveTime;
+						persistSyncInfo += syncInfoSaveTime;
 					}
+				} catch (IOException e) {
+					throw new WrappedRuntimeException(e);
 				}
-				// don't continue if the current resource is the workspace root, only continue for projects
-				return root.getType() != IResource.ROOT;
 			}
+			// don't continue if the current resource is the workspace root, only continue for projects
+			return root.getType() != IResource.ROOT;
 		};
 
 		// Call the visitor
@@ -1735,8 +1715,8 @@
 		if (root.getType() == IResource.PROJECT)
 			return;
 		IProject[] projects = ((IWorkspaceRoot) root).getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++)
-			visitAndSave(projects[i]);
+		for (IProject project : projects)
+			visitAndSave(project);
 	}
 
 	/**
@@ -1789,33 +1769,30 @@
 		// for each resource otherwise.
 		final long[] snapTimes = new long[2];
 
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree tree, IPathRequestor requestor, Object elementContents) {
-				ResourceInfo info = (ResourceInfo) elementContents;
-				if (info != null) {
-					try {
-						// save the markers
-						long start = System.currentTimeMillis();
-						markerManager.snap(info, requestor, markersOutput);
-						long markerSnapTime = System.currentTimeMillis() - start;
-						snapTimes[0] += markerSnapTime;
-						persistMarkers += markerSnapTime;
-						// save the sync info - if we have the workspace root then the output stream will be null
-						if (syncInfoOutput != null) {
-							start = System.currentTimeMillis();
-							synchronizer.snapSyncInfo(info, requestor, syncInfoOutput);
-							long syncInfoSnapTime = System.currentTimeMillis() - start;
-							snapTimes[1] += syncInfoSnapTime;
-							persistSyncInfo += syncInfoSnapTime;
-						}
-					} catch (IOException e) {
-						throw new WrappedRuntimeException(e);
+		IElementContentVisitor visitor = (tree, requestor, elementContents) -> {
+			ResourceInfo info = (ResourceInfo) elementContents;
+			if (info != null) {
+				try {
+					// save the markers
+					long start = System.currentTimeMillis();
+					markerManager.snap(info, requestor, markersOutput);
+					long markerSnapTime = System.currentTimeMillis() - start;
+					snapTimes[0] += markerSnapTime;
+					persistMarkers += markerSnapTime;
+					// save the sync info - if we have the workspace root then the output stream will be null
+					if (syncInfoOutput != null) {
+						start = System.currentTimeMillis();
+						synchronizer.snapSyncInfo(info, requestor, syncInfoOutput);
+						long syncInfoSnapTime = System.currentTimeMillis() - start;
+						snapTimes[1] += syncInfoSnapTime;
+						persistSyncInfo += syncInfoSnapTime;
 					}
+				} catch (IOException e) {
+					throw new WrappedRuntimeException(e);
 				}
-				// don't continue if the current resource is the workspace root, only continue for projects
-				return root.getType() != IResource.ROOT;
 			}
+			// don't continue if the current resource is the workspace root, only continue for projects
+			return root.getType() != IResource.ROOT;
 		};
 
 		try {
@@ -1848,8 +1825,8 @@
 		if (root.getType() == IResource.PROJECT)
 			return;
 		IProject[] projects = ((IWorkspaceRoot) root).getProjects(IContainer.INCLUDE_HIDDEN);
-		for (int i = 0; i < projects.length; i++)
-			visitAndSnap(projects[i]);
+		for (IProject project : projects)
+			visitAndSnap(project);
 	}
 
 	/**
@@ -1876,8 +1853,8 @@
 				// write interesting projects
 				IProject[] interestingProjects = info.getInterestingProjects();
 				output.writeInt(interestingProjects.length);
-				for (int j = 0; j < interestingProjects.length; j++)
-					output.writeUTF(interestingProjects[j].getName());
+				for (IProject interestingProject : interestingProjects)
+					output.writeUTF(interestingProject.getName());
 			}
 		} finally {
 			monitor.done();
@@ -1915,8 +1892,7 @@
 			String activeConfigName = project.getActiveBuildConfig().getName();
 			List<BuilderPersistentInfo> infos = workspace.getBuildManager().createBuildersPersistentInfo(project);
 			if (infos != null) {
-				for (Iterator<BuilderPersistentInfo> it = infos.iterator(); it.hasNext();) {
-					BuilderPersistentInfo info = it.next();
+				for (BuilderPersistentInfo info : infos) {
 					// Nothing to persist if there isn't a previous delta tree.
 					// There used to be code which serialized the current workspace tree
 					// but this will result in the next build of the builder getting an empty delta...
@@ -1992,8 +1968,8 @@
 				List<ElementTree> additionalTrees = new ArrayList<>(projects.length * 2);
 				List<BuilderPersistentInfo> additionalBuilderInfos = new ArrayList<>(projects.length * 2);
 				List<String> additionalConfigNames = new ArrayList<>(projects.length);
-				for (int i = 0; i < projects.length; i++)
-					getTreesToSave(projects[i], trees, builderInfos, configNames, additionalTrees, additionalBuilderInfos, additionalConfigNames);
+				for (IProject project : projects)
+					getTreesToSave(project, trees, builderInfos, configNames, additionalTrees, additionalBuilderInfos, additionalConfigNames);
 
 				// Save the version 2 builders info
 				writeBuilderPersistentInfo(output, builderInfos, Policy.subMonitorFor(monitor, Policy.totalWork * 10 / 100));
@@ -2015,10 +1991,10 @@
 				writeBuilderPersistentInfo(output, additionalBuilderInfos, Policy.subMonitorFor(monitor, Policy.totalWork * 10 / 100));
 
 				// Save the configuration names for the builders in the order they were saved
-				for (Iterator<String> it = configNames.iterator(); it.hasNext();)
-					output.writeUTF(it.next());
-				for (Iterator<String> it = additionalConfigNames.iterator(); it.hasNext();)
-					output.writeUTF(it.next());
+				for (String string : configNames)
+					output.writeUTF(string);
+				for (String string : additionalConfigNames)
+					output.writeUTF(string);
 			} finally {
 				if (!wasImmutable)
 					workspace.newWorkingTree();
@@ -2086,10 +2062,10 @@
 				writeBuilderPersistentInfo(output, additionalBuilderInfos, Policy.subMonitorFor(monitor, Policy.totalWork * 20 / 100));
 
 				// Save configuration names for the builders in the order they were saved
-				for (Iterator<String> it = configNames.iterator(); it.hasNext();)
-					output.writeUTF(it.next());
-				for (Iterator<String> it = additionalConfigNames.iterator(); it.hasNext();)
-					output.writeUTF(it.next());
+				for (String string : configNames)
+					output.writeUTF(string);
+				for (String string : additionalConfigNames)
+					output.writeUTF(string);
 			} finally {
 				if (!wasImmutable)
 					workspace.newWorkingTree();
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java
index 5579283..a26dc58 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java
@@ -38,8 +38,7 @@
 	public void savePartners(DataOutputStream output) throws IOException {
 		Set<QualifiedName> registry = synchronizer.getRegistry();
 		output.writeInt(registry.size());
-		for (Iterator<QualifiedName> i = registry.iterator(); i.hasNext();) {
-			QualifiedName qname = i.next();
+		for (QualifiedName qname : registry) {
 			output.writeUTF(qname.getQualifier());
 			output.writeUTF(qname.getLocalName());
 		}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Synchronizer.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Synchronizer.java
index 4f223a1..274a1d7 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Synchronizer.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Synchronizer.java
@@ -61,8 +61,8 @@
 
 		// otherwise recurse over the children
 		IResource[] children = ((IContainer) resource).members();
-		for (int i = 0; i < children.length; i++)
-			accept(partner, children[i], visitor, depth);
+		for (IResource element : children)
+			accept(partner, element, visitor, depth);
 	}
 
 	/**
@@ -82,20 +82,14 @@
 		Assert.isLegal(partner != null);
 		Assert.isLegal(root != null);
 
-		ICoreRunnable body = new ICoreRunnable() {
-			@Override
-			public void run(IProgressMonitor monitor) throws CoreException {
-				IResourceVisitor visitor = new IResourceVisitor() {
-					@Override
-					public boolean visit(IResource resource) throws CoreException {
-						//only need to flush sync info if there is sync info
-						if (getSyncInfo(partner, resource) != null)
-							setSyncInfo(partner, resource, null);
-						return true;
-					}
-				};
-				root.accept(visitor, depth, true);
-			}
+		ICoreRunnable body = monitor -> {
+			IResourceVisitor visitor = resource -> {
+				//only need to flush sync info if there is sync info
+				if (getSyncInfo(partner, resource) != null)
+					setSyncInfo(partner, resource, null);
+				return true;
+			};
+			root.accept(visitor, depth, true);
 		};
 		workspace.run(body, root, IResource.NONE, null);
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
index 85f43b5..99c1729 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
@@ -382,11 +382,11 @@
 	private void recursivelyAddBuildConfigs(Collection/*<IBuildConfiguration>*/<IBuildConfiguration> configs, IBuildConfiguration config) {
 		try {
 			IBuildConfiguration[] referenced = config.getProject().getReferencedBuildConfigs(config.getName(), false);
-			for (int i = 0; i < referenced.length; i++) {
-				if (configs.contains(referenced[i]))
+			for (IBuildConfiguration element : referenced) {
+				if (configs.contains(element))
 					continue;
-				configs.add(referenced[i]);
-				recursivelyAddBuildConfigs(configs, referenced[i]);
+				configs.add(element);
+				recursivelyAddBuildConfigs(configs, element);
 			}
 		} catch (CoreException e) {
 			// Not possible, we've checked that the project + configuration are accessible.
@@ -461,9 +461,9 @@
 							// clean all accessible configurations
 							List<IBuildConfiguration> configArr = new ArrayList<>();
 							IProject[] prjs = getRoot().getProjects();
-							for (int i = 0; i < prjs.length; i++)
-								if (prjs[i].isAccessible())
-									configArr.addAll(Arrays.asList(prjs[i].getBuildConfigs()));
+							for (IProject prj : prjs)
+								if (prj.isAccessible())
+									configArr.addAll(Arrays.asList(prj.getBuildConfigs()));
 							configs = configArr.toArray(new IBuildConfiguration[configArr.size()]);
 						}
 					} else {
@@ -579,9 +579,9 @@
 				beginOperation(true);
 				IProject[] projects = getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
 				subMonitor.setWorkRemaining(projects.length + 2);
-				for (int i = 0; i < projects.length; i++) {
+				for (IProject project : projects) {
 					//notify managers of closing so they can cleanup
-					broadcastEvent(LifecycleEvent.newEvent(LifecycleEvent.PRE_PROJECT_CLOSE, projects[i]));
+					broadcastEvent(LifecycleEvent.newEvent(LifecycleEvent.PRE_PROJECT_CLOSE, project));
 					subMonitor.worked(1);
 				}
 				//empty the workspace tree so we leave in a clean state
@@ -627,17 +627,12 @@
 	private VertexOrder computeFullProjectOrder() {
 		// determine the full set of accessible projects in the workspace
 		// order the set in descending alphabetical order of project name
-		SortedSet<IProject> allAccessibleProjects = new TreeSet<>(new Comparator<IProject>() {
-			@Override
-			public int compare(IProject px, IProject py) {
-				return py.getName().compareTo(px.getName());
-			}
-		});
+		SortedSet<IProject> allAccessibleProjects = new TreeSet<>((px, py) -> py.getName().compareTo(px.getName()));
 		IProject[] allProjects = getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
 		// List<IProject[]> edges
 		List<IProject[]> edges = new ArrayList<>(allProjects.length);
-		for (int i = 0; i < allProjects.length; i++) {
-			Project project = (Project) allProjects[i];
+		for (IProject p : allProjects) {
+			Project project = (Project) p;
 			// ignore projects that are not accessible
 			if (!project.isAccessible())
 				continue;
@@ -647,8 +642,7 @@
 			//obtain both static and dynamic project references
 			IProject[] refs = desc.getAllReferences(false);
 			allAccessibleProjects.add(project);
-			for (int j = 0; j < refs.length; j++) {
-				IProject ref = refs[j];
+			for (IProject ref : refs) {
 				// ignore self references and references to projects that are not accessible
 				if (ref.isAccessible() && !ref.equals(project))
 					edges.add(new IProject[] {project, ref});
@@ -698,8 +692,8 @@
 		IProject[] allProjects = getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
 		List<IBuildConfiguration[]> edges = new ArrayList<>(allProjects.length);
 
-		for (int i = 0; i < allProjects.length; i++) {
-			Project project = (Project) allProjects[i];
+		for (IProject allProject : allProjects) {
+			Project project = (Project) allProject;
 			// Ignore projects that are not accessible
 			if (!project.isAccessible())
 				continue;
@@ -718,9 +712,7 @@
 					// (it is guaranteed to be accessible as it was pushed onto the stack)
 					Project subProject = (Project) buildConfiguration.getProject();
 					IBuildConfiguration[] refs = subProject.internalGetReferencedBuildConfigs(buildConfiguration.getName(), false);
-					for (int j = 0; j < refs.length; j++) {
-						IBuildConfiguration ref = refs[j];
-
+					for (IBuildConfiguration ref : refs) {
 						// Ignore self references and references to projects that are not accessible
 						if (ref.equals(buildConfiguration))
 							continue;
@@ -774,20 +766,17 @@
 		IProject[] allProjects = getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
 		List<IBuildConfiguration[]> edges = new ArrayList<>(allProjects.length);
 
-		for (int i = 0; i < allProjects.length; i++) {
-			Project project = (Project) allProjects[i];
+		for (IProject p : allProjects) {
+			Project project = (Project) p;
 			// Ignore projects that are not accessible
 			if (!project.isAccessible())
 				continue;
 
 			IBuildConfiguration[] configs = project.internalGetBuildConfigs(false);
-			for (int j = 0; j < configs.length; j++) {
-				IBuildConfiguration config = configs[j];
+			for (IBuildConfiguration config : configs) {
 				allAccessibleBuildConfigurations.add(config);
 				IBuildConfiguration[] refs = project.internalGetReferencedBuildConfigs(config.getName(), false);
-				for (int k = 0; k < refs.length; k++) {
-					IBuildConfiguration ref = refs[k];
-
+				for (IBuildConfiguration ref : refs) {
 					// Ignore self references
 					if (ref.equals(config))
 						continue;
@@ -847,10 +836,8 @@
 		Set<IProject> bad = new HashSet<>();
 		// Set<IProject> bad
 		Set<IProject> keepers = new HashSet<>(Arrays.asList(r.projects));
-		for (int i = 0; i < r.knots.length; i++) {
-			IProject[] knot = r.knots[i];
-			for (int j = 0; j < knot.length; j++) {
-				IProject project = knot[j];
+		for (IProject[] knot : r.knots) {
+			for (IProject project : knot) {
 				// keep only selected projects in knot
 				if (keepers.contains(project)) {
 					bad.add(project);
@@ -882,12 +869,7 @@
 		// Create a filter to remove all projects that are not in the list asked for
 		final Set<IProject> projectSet = new HashSet<>(projects.length);
 		projectSet.addAll(Arrays.asList(projects));
-		VertexFilter filter = new VertexFilter() {
-			@Override
-			public boolean matches(Object vertex) {
-				return !projectSet.contains(vertex);
-			}
-		};
+		VertexFilter filter = vertex -> !projectSet.contains(vertex);
 
 		// Filter the order and return it
 		return vertexOrderToProjectOrder(ComputeProjectOrder.filterVertexOrder(fullProjectOrder, filter));
@@ -934,12 +916,7 @@
 		// Create a filter to remove all project buildConfigs that are not in the list asked for
 		final Set<IBuildConfiguration> projectConfigSet = new HashSet<>(buildConfigs.length);
 		projectConfigSet.addAll(Arrays.asList(buildConfigs));
-		VertexFilter filter = new VertexFilter() {
-			@Override
-			public boolean matches(Object vertex) {
-				return !projectConfigSet.contains(vertex);
-			}
-		};
+		VertexFilter filter = vertex -> !projectConfigSet.contains(vertex);
 
 		// Filter the order and return it
 		return vertexOrderToProjectBuildConfigOrder(ComputeProjectOrder.filterVertexOrder(fullBuildConfigOrder, filter));
@@ -1111,11 +1088,11 @@
 				copyTree(dotProject, destination.append(dotProject.getName()), depth, updateFlags, keepSyncInfo, moveResources, movingProject);
 		}
 		IResource[] children = ((IContainer) source).members(IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
-		for (int i = 0, imax = children.length; i < imax; i++) {
-			String childName = children[i].getName();
+		for (IResource element : children) {
+			String childName = element.getName();
 			if (!projectCopy || !childName.equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
 				IPath childPath = destination.append(childName);
-				copyTree(children[i], childPath, depth, updateFlags, keepSyncInfo, moveResources, movingProject);
+				copyTree(element, childPath, depth, updateFlags, keepSyncInfo, moveResources, movingProject);
 			}
 		}
 	}
@@ -1153,7 +1130,7 @@
 
 		IPath srcValue = URIUtil.toPath(srcPathVariableManager.getURIValue(variable));
 		if (srcValue == null) // if the variable doesn't exist, return another
-									// variable that doesn't exist either
+								// variable that doesn't exist either
 			return PathVariableUtil.getUniqueVariableName(variable, dest);
 		IPath resolvedSrcValue = URIUtil.toPath(srcPathVariableManager.resolveURI(URIUtil.toURI(srcValue)));
 
@@ -1196,20 +1173,20 @@
 			if (!shouldConvertToRelative) {
 				String[] segments = PathVariableUtil.splitVariablesAndContent(srcValue.toPortableString());
 				StringBuilder result = new StringBuilder();
-				for (int i = 0; i < segments.length; i++) {
-					String var = PathVariableUtil.extractVariable(segments[i]);
+				for (String segment : segments) {
+					String var = PathVariableUtil.extractVariable(segment);
 					if (var.length() > 0) {
 						String copiedVariable = copyVariable(source, dest, var);
-						int index = segments[i].indexOf(var);
+						int index = segment.indexOf(var);
 						if (index != -1) {
-							result.append(segments[i].substring(0, index));
+							result.append(segment.substring(0, index));
 							result.append(copiedVariable);
 							int start = index + var.length();
-							int end = segments[i].length();
-							result.append(segments[i].substring(start, end));
+							int end = segment.length();
+							result.append(segment.substring(start, end));
 						}
 					} else
-						result.append(segments[i]);
+						result.append(segment);
 				}
 				srcValue = Path.fromPortableString(result.toString());
 			}
@@ -1240,13 +1217,10 @@
 				return 1 + tree.getChildCount(root);
 			case IResource.DEPTH_INFINITE :
 				final int[] count = new int[1];
-				IElementContentVisitor visitor = new IElementContentVisitor() {
-					@Override
-					public boolean visitElement(ElementTree aTree, IPathRequestor requestor, Object elementContents) {
-						if (phantom || !((ResourceInfo) elementContents).isSet(M_PHANTOM))
-							count[0]++;
-						return true;
-					}
+				IElementContentVisitor visitor = (aTree, requestor, elementContents) -> {
+					if (phantom || !((ResourceInfo) elementContents).isSet(M_PHANTOM))
+						count[0]++;
+					return true;
 				};
 				new ElementTreeIterator(tree, root).iterate(visitor);
 				return count[0];
@@ -1358,9 +1332,9 @@
 			try {
 				prepareOperation(getRoot(), monitor);
 				beginOperation(true);
-				for (int i = 0; i < resources.length; i++) {
+				for (IResource r : resources) {
 					Policy.checkCanceled(monitor);
-					Resource resource = (Resource) resources[i];
+					Resource resource = (Resource) r;
 					if (resource == null) {
 						monitor.worked(1);
 						continue;
@@ -1401,9 +1375,9 @@
 		try {
 			prepareOperation(null, null);
 			beginOperation(true);
-			for (int i = 0; i < markers.length; ++i)
-				if (markers[i] != null && markers[i].getResource() != null)
-					markerManager.removeMarker(markers[i].getResource(), markers[i].getId());
+			for (IMarker marker : markers)
+				if (marker != null && marker.getResource() != null)
+					markerManager.removeMarker(marker.getResource(), marker.getId());
 		} finally {
 			endOperation(null, false);
 		}
@@ -1420,8 +1394,8 @@
 		IPath path = resource.getFullPath();
 		if (path.equals(Path.ROOT)) {
 			IProject[] children = getRoot().getProjects(IContainer.INCLUDE_HIDDEN);
-			for (int i = 0; i < children.length; i++)
-				tree.deleteElement(children[i].getFullPath());
+			for (IProject element : children)
+				tree.deleteElement(element.getFullPath());
 		} else
 			tree.deleteElement(path);
 	}
@@ -1548,8 +1522,8 @@
 
 			// convert from project names to active project buildConfigs
 			// and eliminate non-existent and closed projects
-			for (int i = 0; i < order.length; i++) {
-				IProject project = getRoot().getProject(order[i]);
+			for (String element : order) {
+				IProject project = getRoot().getProject(element);
 				if (project.isAccessible())
 					configs.add(((Project) project).internalGetActiveBuildConfig());
 			}
@@ -2195,8 +2169,8 @@
 
 	protected boolean refreshRequested() {
 		String[] args = Platform.getCommandLineArgs();
-		for (int i = 0; i < args.length; i++)
-			if (args[i].equalsIgnoreCase(REFRESH_ON_STARTUP))
+		for (String arg : args)
+			if (arg.equalsIgnoreCase(REFRESH_ON_STARTUP))
 				return true;
 		return false;
 	}
@@ -2334,8 +2308,7 @@
 			String message = Messages.resources_shutdownProblems;
 			MultiStatus status = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IResourceStatus.INTERNAL_ERROR, message, null);
 			// best effort to shutdown every object and free resources
-			for (int i = 0; i < managers.length; i++) {
-				IManager manager = managers[i];
+			for (IManager manager : managers) {
 				if (manager == null)
 					monitor.worked(1);
 				else {
@@ -2425,12 +2398,9 @@
 	public String toDebugString() {
 		final StringBuilder buffer = new StringBuilder("\nDump of " + toString() + ":\n"); //$NON-NLS-1$ //$NON-NLS-2$
 		buffer.append("  parent: " + tree.getParent()); //$NON-NLS-1$
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree aTree, IPathRequestor requestor, Object elementContents) {
-				buffer.append("\n  " + requestor.requestPath() + ": " + elementContents); //$NON-NLS-1$ //$NON-NLS-2$
-				return true;
-			}
+		IElementContentVisitor visitor = (aTree, requestor, elementContents) -> {
+			buffer.append("\n  " + requestor.requestPath() + ": " + elementContents); //$NON-NLS-1$ //$NON-NLS-2$
+			return true;
 		};
 		new ElementTreeIterator(tree, Path.ROOT).iterate(visitor);
 		return buffer.toString();
@@ -2446,9 +2416,9 @@
 		if (!shouldValidate) {
 			String message = Messages.resources_readOnly2;
 			MultiStatus result = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IResourceStatus.READ_ONLY_LOCAL, message, null);
-			for (int i = 0; i < files.length; i++) {
-				if (files[i].isReadOnly()) {
-					IPath filePath = files[i].getFullPath();
+			for (IFile file : files) {
+				if (file.isReadOnly()) {
+					IPath filePath = file.getFullPath();
 					message = NLS.bind(Messages.resources_readOnly, filePath);
 					result.add(new ResourceStatus(IResourceStatus.READ_ONLY_LOCAL, filePath, message));
 				}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspacePreferences.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspacePreferences.java
index 3690963..35668b9 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspacePreferences.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspacePreferences.java
@@ -15,7 +15,6 @@
 import java.util.*;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
 
 /**
  * This class provides the same interface as <code>WorkspaceDescription</code>
@@ -42,8 +41,8 @@
 		if (array == null || array.length == 0)
 			return ""; //$NON-NLS-1$
 		StringBuilder sb = new StringBuilder();
-		for (int i = 0; i < array.length; i++) {
-			sb.append(array[i]);
+		for (String element : array) {
+			sb.append(element);
 			sb.append(PROJECT_SEPARATOR);
 		}
 		sb.deleteCharAt(sb.length() - 1);
@@ -99,12 +98,7 @@
 
 		// This property listener ensures we are being updated properly when changes
 		// are done directly to the preference store.
-		preferences.addPropertyChangeListener(new Preferences.IPropertyChangeListener() {
-			@Override
-			public void propertyChange(PropertyChangeEvent event) {
-				synchronizeWithPreferences(event.getProperty());
-			}
-		});
+		preferences.addPropertyChangeListener(event -> synchronizeWithPreferences(event.getProperty()));
 	}
 
 	@Override
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java
index 7007b33..77a4aa2 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java
@@ -174,10 +174,10 @@
 			System.arraycopy(roots, 0, result, 0, roots.length);
 		} catch (ArrayStoreException ex) {
 			// Shouldn't happen since only projects should be children of the workspace root
-			for (int i = 0; i < roots.length; i++) {
-				if (roots[i].getType() != IResource.PROJECT)
+			for (IResource root2 : roots) {
+				if (root2.getType() != IResource.PROJECT)
 					Policy.log(IStatus.ERROR, NLS.bind("{0} is an invalid child of the workspace root.", //$NON-NLS-1$
-							roots[i]), null);
+							root2), null);
 
 			}
 			throw ex;
@@ -200,8 +200,8 @@
 		// get the children via the workspace since we know that this
 		// resource exists (it is local).
 		IResource[] children = getChildren(IResource.NONE);
-		for (int i = 0; i < children.length; i++)
-			((Resource) children[i]).internalSetLocal(flag, depth);
+		for (IResource element : children)
+			((Resource) element).internalSetLocal(flag, depth);
 	}
 
 	@Override
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceTreeReader_2.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceTreeReader_2.java
index b0e0236..a448ff0 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceTreeReader_2.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceTreeReader_2.java
@@ -117,8 +117,8 @@
 				readBuildersPersistentInfo(null, input, buildersToBeLinked, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100));
 				linkBuildersToTrees(buildersToBeLinked, trees, treeIndex, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100));
 
-				for (Iterator<BuilderPersistentInfo> it = builderInfos.iterator(); it.hasNext();)
-					it.next().setConfigName(input.readUTF());
+				for (BuilderPersistentInfo builderPersistentInfo : builderInfos)
+					builderPersistentInfo.setConfigName(input.readUTF());
 			}
 
 			// Set the builder infos on the projects
@@ -165,8 +165,8 @@
 				readBuildersPersistentInfo(project, input, infos, Policy.subMonitorFor(monitor, 1));
 				linkBuildersToTrees(infos, trees, treeIndex, Policy.subMonitorFor(monitor, 1));
 
-				for (Iterator<BuilderPersistentInfo> it = builderInfos.iterator(); it.hasNext();)
-					it.next().setConfigName(input.readUTF());
+				for (BuilderPersistentInfo builderPersistentInfo : builderInfos)
+					builderPersistentInfo.setConfigName(input.readUTF());
 			}
 
 			// Set the builder info on the projects
@@ -204,8 +204,7 @@
 	 */
 	private void setBuilderInfos(List<BuilderPersistentInfo> infos) {
 		Map<String, List<BuilderPersistentInfo>> groupedInfos = new HashMap<>();
-		for (Iterator<BuilderPersistentInfo> it = infos.iterator(); it.hasNext();) {
-			BuilderPersistentInfo info = it.next();
+		for (BuilderPersistentInfo info : infos) {
 			if (!groupedInfos.containsKey(info.getProjectName()))
 				groupedInfos.put(info.getProjectName(), new ArrayList<BuilderPersistentInfo>());
 			groupedInfos.get(info.getProjectName()).add(info);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ChangeDescription.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ChangeDescription.java
index f62736c..8727e74 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ChangeDescription.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ChangeDescription.java
@@ -45,8 +45,7 @@
 
 	private void ensureResourceCovered(IResource resource, List<IResource> list) {
 		IPath path = resource.getFullPath();
-		for (Iterator<IResource> iter = list.iterator(); iter.hasNext();) {
-			IResource root = iter.next();
+		for (IResource root : list) {
 			if (root.getFullPath().isPrefixOf(path)) {
 				return;
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderDescriptor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderDescriptor.java
index 7f5577f..2a6f22a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderDescriptor.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderDescriptor.java
@@ -67,8 +67,7 @@
 	@Override
 	public IResource[] getMatchingResources(IResource[] resources) throws CoreException {
 		Set<IResource> result = new HashSet<>();
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			EvaluationContext evalContext = createEvaluationContext(resource);
 			if (matches(evalContext)) {
 				result.add(resource);
@@ -82,8 +81,7 @@
 		if (provider == null) {
 			IExtension extension = Platform.getExtensionRegistry().getExtension(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_MODEL_PROVIDERS, id);
 			IConfigurationElement[] elements = extension.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
+			for (IConfigurationElement element : elements) {
 				if (element.getName().equalsIgnoreCase("modelProvider")) { //$NON-NLS-1$
 					try {
 						provider = (ModelProvider) element.createExecutableExtension("class"); //$NON-NLS-1$
@@ -134,8 +132,7 @@
 	@Override
 	public ResourceTraversal[] getMatchingTraversals(ResourceTraversal[] traversals) throws CoreException {
 		List<ResourceTraversal> result = new ArrayList<>();
-		for (int i = 0; i < traversals.length; i++) {
-			ResourceTraversal traversal = traversals[i];
+		for (ResourceTraversal traversal : traversals) {
 			if (getMatchingResources(traversal.getResources()).length > 0) {
 				result.add(traversal);
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderManager.java
index 01403a8..1169a94 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ModelProviderManager.java
@@ -60,10 +60,10 @@
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_MODEL_PROVIDERS);
 		IExtension[] extensions = point.getExtensions();
 		descriptors = new HashMap<>(extensions.length * 2 + 1);
-		for (int i = 0, imax = extensions.length; i < imax; i++) {
+		for (IExtension extension : extensions) {
 			IModelProviderDescriptor desc = null;
 			try {
-				desc = new ModelProviderDescriptor(extensions[i]);
+				desc = new ModelProviderDescriptor(extension);
 			} catch (CoreException e) {
 				Policy.log(e);
 			}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ProposedResourceDelta.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ProposedResourceDelta.java
index e3e3bc4..18a73a0 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ProposedResourceDelta.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ProposedResourceDelta.java
@@ -46,8 +46,7 @@
 	public void accept(IResourceDeltaVisitor visitor, int memberFlags) throws CoreException {
 		if (!visitor.visit(this))
 			return;
-		for (Iterator<ProposedResourceDelta> iter = children.values().iterator(); iter.hasNext();) {
-			ProposedResourceDelta childDelta = iter.next();
+		for (ProposedResourceDelta childDelta : children.values()) {
 			childDelta.accept(visitor, memberFlags);
 		}
 	}
@@ -100,8 +99,7 @@
 	@Override
 	public IResourceDelta[] getAffectedChildren(int kindMask, int memberFlags) {
 		List<ProposedResourceDelta> result = new ArrayList<>();
-		for (Iterator<ProposedResourceDelta> iter = children.values().iterator(); iter.hasNext();) {
-			ProposedResourceDelta child = iter.next();
+		for (ProposedResourceDelta child : children.values()) {
 			if ((child.getKind() & kindMask) != 0)
 				result.add(child);
 		}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceChangeDescriptionFactory.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceChangeDescriptionFactory.java
index bbdfa5e..a347c73 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceChangeDescriptionFactory.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceChangeDescriptionFactory.java
@@ -85,8 +85,8 @@
 		if (resource.getType() == IResource.ROOT) {
 			//the root itself cannot be deleted, so create deletions for each project
 			IProject[] projects = ((IWorkspaceRoot) resource).getProjects(IContainer.INCLUDE_HIDDEN);
-			for (int i = 0; i < projects.length; i++)
-				buildDeleteDelta(root, projects[i]);
+			for (IProject project : projects)
+				buildDeleteDelta(root, project);
 		} else {
 			buildDeleteDelta(getDelta(resource.getParent()), resource);
 		}
@@ -223,12 +223,7 @@
 		try {
 			//build delta for the entire sub-tree if available
 			if (resource.isAccessible()) {
-				resource.accept(new IResourceVisitor() {
-					@Override
-					public boolean visit(IResource child) {
-						return moveOrCopy(child, sourcePrefix, destinationPrefix, move);
-					}
-				});
+				resource.accept(child -> moveOrCopy(child, sourcePrefix, destinationPrefix, move));
 			} else {
 				//just build a delta for the single resource
 				moveOrCopy(resource, sourcePrefix, destination, move);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java
index 771e9f5..6375581 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java
@@ -12,7 +12,8 @@
  *******************************************************************************/
 package org.eclipse.core.internal.resources.mapping;
 
-import java.util.*;
+import java.util.HashSet;
+import java.util.Set;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.mapping.*;
@@ -34,12 +35,10 @@
 	@Override
 	public ResourceMapping[] getMappings(ResourceTraversal[] traversals, ResourceMappingContext context, IProgressMonitor monitor) {
 		Set<IAdaptable> result = new HashSet<>();
-		for (int i = 0; i < traversals.length; i++) {
-			ResourceTraversal traversal = traversals[i];
+		for (ResourceTraversal traversal : traversals) {
 			IResource[] resources = traversal.getResources();
 			int depth = traversal.getDepth();
-			for (int j = 0; j < resources.length; j++) {
-				IResource resource = resources[j];
+			for (IResource resource : resources) {
 				switch (depth) {
 					case IResource.DEPTH_INFINITE :
 						result.add(resource);
@@ -60,8 +59,7 @@
 		}
 		ResourceMapping[] mappings = new ResourceMapping[result.size()];
 		int i = 0;
-		for (Iterator<?> iter = result.iterator(); iter.hasNext();) {
-			Object element = iter.next();
+		for (Object element : result) {
 			if (element instanceof IResource) {
 				mappings[i++] = new SimpleResourceMapping((IResource) element);
 			} else {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java
index 54421f0..05b77cf 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java
@@ -38,12 +38,12 @@
 
 	@Override
 	public IProject[] getProjects() {
-		return new IProject[] { container.getResource().getProject() };
+		return new IProject[] {container.getResource().getProject()};
 	}
 
 	@Override
 	public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) {
-		return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { container.getResource() }, IResource.DEPTH_ONE, IResource.NONE)};
+		return new ResourceTraversal[] {new ResourceTraversal(new IResource[] {container.getResource()}, IResource.DEPTH_ONE, IResource.NONE)};
 	}
 
 	@Override
@@ -58,8 +58,7 @@
 			}
 			if (object instanceof IResource) {
 				IResource other = (IResource) object;
-				return other.getType() == IResource.FILE
-					&& resource.getFullPath().equals(other.getFullPath().removeLastSegments(1));
+				return other.getType() == IResource.FILE && resource.getFullPath().equals(other.getFullPath().removeLastSegments(1));
 			}
 		}
 		return false;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java
index 94fa38b..5de1894 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java
@@ -57,14 +57,14 @@
 	@Override
 	public IProject[] getProjects() {
 		if (resource.getType() == IResource.ROOT)
-			return ((IWorkspaceRoot)resource).getProjects();
+			return ((IWorkspaceRoot) resource).getProjects();
 		return new IProject[] {resource.getProject()};
 	}
 
 	@Override
 	public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) {
 		if (resource.getType() == IResource.ROOT) {
-			return new ResourceTraversal[] {new ResourceTraversal(((IWorkspaceRoot)resource).getProjects(), IResource.DEPTH_INFINITE, IResource.NONE)};
+			return new ResourceTraversal[] {new ResourceTraversal(((IWorkspaceRoot) resource).getProjects(), IResource.DEPTH_INFINITE, IResource.NONE)};
 		}
 		return new ResourceTraversal[] {new ResourceTraversal(new IResource[] {resource}, IResource.DEPTH_INFINITE, IResource.NONE)};
 	}
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/projectvariables/ParentVariableResolver.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/projectvariables/ParentVariableResolver.java
index 6ebb96a..4ef9138 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/projectvariables/ParentVariableResolver.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/projectvariables/ParentVariableResolver.java
@@ -34,12 +34,12 @@
 	@Override
 	public String getValue(String variable, IResource resource) {
 		int index = variable.indexOf('-');
-		if (index == -1 || index == (variable.length() -1))
+		if (index == -1 || index == (variable.length() - 1))
 			return null;
 
 		String countRemaining = variable.substring(index + 1);
 		index = countRemaining.indexOf('-');
-		if (index == -1 || index == (variable.length() -1))
+		if (index == -1 || index == (variable.length() - 1))
 			return null;
 
 		String countString = countRemaining.substring(0, index);
@@ -48,7 +48,7 @@
 			count = Integer.parseInt(countString);
 			if (count < 0)
 				return null;
-		}catch (NumberFormatException e) {
+		} catch (NumberFormatException e) {
 			return null;
 		}
 		String argument = countRemaining.substring(index + 1);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Convert.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Convert.java
index 8455458..e9b783c 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Convert.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Convert.java
@@ -21,8 +21,7 @@
 	/*
 	 * Obtains the default encoding on this platform
 	 */
-	private static String defaultEncoding=
-		new InputStreamReader(new ByteArrayInputStream(new byte[0])).getEncoding();
+	private static String defaultEncoding = new InputStreamReader(new ByteArrayInputStream(new byte[0])).getEncoding();
 
 	/**
 	 * Converts the given String to bytes using the platforms default
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Monitor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Monitor.java
index 26bf4aa..1dfe52a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Monitor.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Monitor.java
@@ -256,8 +256,8 @@
 		@Override
 		public void destroy() {
 			super.destroy();
-			for (Iterator<FileHandle> i = fileHandleChain.iterator(); i.hasNext();) {
-				Handle handle = i.next();
+			for (FileHandle fileHandle : fileHandleChain) {
+				Handle handle = fileHandle;
 				handle.destroy();
 			}
 		}
@@ -424,8 +424,8 @@
 			}
 			handles = new long[size];
 			int count = 0;
-			for (Iterator<Long> i = keys.iterator(); i.hasNext();) {
-				handles[count++] = i.next().longValue();
+			for (Long long2 : keys) {
+				handles[count++] = long2.longValue();
 			}
 		}
 		return balancedSplit(handles, Win32Natives.MAXIMUM_WAIT_OBJECTS);
@@ -437,8 +437,7 @@
 		}
 		// synchronized: in order to protect the map during iteration
 		synchronized (fHandleValueToHandle) {
-			for (Iterator<Handle> i = fHandleValueToHandle.values().iterator(); i.hasNext();) {
-				Handle handle = i.next();
+			for (Handle handle : fHandleValueToHandle.values()) {
 				if (handle instanceof ResourceHandle) {
 					ResourceHandle resourceHandle = (ResourceHandle) handle;
 					if (resourceHandle.getResource().equals(resource)) {
@@ -510,8 +509,7 @@
 	private void removeHandles(Collection<Handle> handles) {
 		// synchronized: protect the array, removal must be atomic
 		synchronized (this) {
-			for (Iterator<Handle> i = handles.iterator(); i.hasNext();) {
-				Handle handle = i.next();
+			for (Handle handle : handles) {
 				fHandleValueToHandle.remove(handle.getHandleValue());
 				handle.destroy();
 			}
@@ -532,10 +530,10 @@
 			monitor.beginTask(Messages.WM_beginTask, handleArrays.length);
 			// If changes occur to the list of handles,
 			// ignore them until the next time through the loop.
-			for (int i = 0, length = handleArrays.length; i < length; i++) {
+			for (long[] handleArray : handleArrays) {
 				if (monitor.isCanceled())
 					return Status.CANCEL_STATUS;
-				waitForNotification(handleArrays[i]);
+				waitForNotification(handleArray);
 				monitor.worked(1);
 			}
 		} finally {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java
index b868b27..c7fed1e 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java
@@ -11,7 +11,6 @@
  *******************************************************************************/
 package org.eclipse.core.internal.resources.refresh.win32;
 
-
 /**
  * Hooks for native methods involved with win32 auto-refresh callbacks.
  */
@@ -108,33 +107,27 @@
 	 */
 	static {
 		System.loadLibrary("win32refresh"); //$NON-NLS-1$
-		UNICODE= IsUnicode();
-		INVALID_HANDLE_VALUE= INVALID_HANDLE_VALUE();
-		ERROR_SUCCESS= ERROR_SUCCESS();
-		ERROR_INVALID_HANDLE= ERROR_INVALID_HANDLE();
+		UNICODE = IsUnicode();
+		INVALID_HANDLE_VALUE = INVALID_HANDLE_VALUE();
+		ERROR_SUCCESS = ERROR_SUCCESS();
+		ERROR_INVALID_HANDLE = ERROR_INVALID_HANDLE();
 
-		MAXIMUM_WAIT_OBJECTS= MAXIMUM_WAIT_OBJECTS();
-		MAX_PATH= MAX_PATH();
-		INFINITE= INFINITE();
+		MAXIMUM_WAIT_OBJECTS = MAXIMUM_WAIT_OBJECTS();
+		MAX_PATH = MAX_PATH();
+		INFINITE = INFINITE();
 
-		WAIT_TIMEOUT= WAIT_TIMEOUT();
-		WAIT_OBJECT_0= WAIT_OBJECT_0();
-		WAIT_ABANDONED_0= WAIT_ABANDONED_0();
-		WAIT_FAILED= WAIT_FAILED();
+		WAIT_TIMEOUT = WAIT_TIMEOUT();
+		WAIT_OBJECT_0 = WAIT_OBJECT_0();
+		WAIT_ABANDONED_0 = WAIT_ABANDONED_0();
+		WAIT_FAILED = WAIT_FAILED();
 
-		FILE_NOTIFY_CHANGE_FILE_NAME= FILE_NOTIFY_CHANGE_FILE_NAME();
-		FILE_NOTIFY_CHANGE_DIR_NAME= FILE_NOTIFY_CHANGE_DIR_NAME();
-		FILE_NOTIFY_CHANGE_ATTRIBUTES= FILE_NOTIFY_CHANGE_ATTRIBUTES();
-		FILE_NOTIFY_CHANGE_SIZE= FILE_NOTIFY_CHANGE_SIZE();
-		FILE_NOTIFY_CHANGE_LAST_WRITE= FILE_NOTIFY_CHANGE_LAST_WRITE();
-		FILE_NOTIFY_CHANGE_SECURITY= FILE_NOTIFY_CHANGE_SECURITY();
-		FILE_NOTIFY_ALL=
-			FILE_NOTIFY_CHANGE_FILE_NAME |
-			FILE_NOTIFY_CHANGE_DIR_NAME |
-			FILE_NOTIFY_CHANGE_ATTRIBUTES |
-			FILE_NOTIFY_CHANGE_SIZE |
-			FILE_NOTIFY_CHANGE_LAST_WRITE |
-			FILE_NOTIFY_CHANGE_SECURITY;
+		FILE_NOTIFY_CHANGE_FILE_NAME = FILE_NOTIFY_CHANGE_FILE_NAME();
+		FILE_NOTIFY_CHANGE_DIR_NAME = FILE_NOTIFY_CHANGE_DIR_NAME();
+		FILE_NOTIFY_CHANGE_ATTRIBUTES = FILE_NOTIFY_CHANGE_ATTRIBUTES();
+		FILE_NOTIFY_CHANGE_SIZE = FILE_NOTIFY_CHANGE_SIZE();
+		FILE_NOTIFY_CHANGE_LAST_WRITE = FILE_NOTIFY_CHANGE_LAST_WRITE();
+		FILE_NOTIFY_CHANGE_SECURITY = FILE_NOTIFY_CHANGE_SECURITY();
+		FILE_NOTIFY_ALL = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY;
 	}
 
 	/**
@@ -163,6 +156,7 @@
 			return FindFirstChangeNotificationW(lpPathName, bWatchSubtree, dwNotifyFilter);
 		return FindFirstChangeNotificationA(Convert.toPlatformBytes(lpPathName), bWatchSubtree, dwNotifyFilter);
 	}
+
 	/**
 	 * Creates a change notification object for the given path. This notification object
 	 * allows the client to monitor changes to the directory and the subtree
@@ -204,7 +198,6 @@
 	 */
 	private static native long FindFirstChangeNotificationA(byte[] lpPathName, boolean bWatchSubtree, int dwNotifyFilter);
 
-
 	/**
 	 * Stops and disposes of the change notification object that corresponds to the given
 	 * handle.  The handle cannot be used in future calls to FindNextChangeNotification or
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/Convert.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/Convert.java
index 930b016..8f8695f 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/Convert.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/Convert.java
@@ -63,10 +63,10 @@
 		long longValue = 0L;
 
 		// See method convertLongToBytes(long) for algorithm details.
-		for (int i = 0; i < value.length; i++) {
+		for (byte element : value) {
 			// Left shift has no effect thru first iteration of loop.
 			longValue <<= 8;
-			longValue ^= value[i] & 0xFF;
+			longValue ^= element & 0xFF;
 		}
 
 		return longValue;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/FileUtil.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/FileUtil.java
index 450bec6..faf48bb 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/FileUtil.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/FileUtil.java
@@ -104,12 +104,7 @@
 				if (MACOSX) {
 					// IFileInfo.getName() may not return the real name of the file on Mac OS X.
 					// Obtain the real name of the file from a listing of its parent directory.
-					String[] names = realPath.toFile().list(new FilenameFilter() {
-						@Override
-						public boolean accept(File dir, String n) {
-							return n.equalsIgnoreCase(segment);
-						}
-					});
+					String[] names = realPath.toFile().list((dir, n) -> n.equalsIgnoreCase(segment));
 					String realName;
 					if (names == null || names.length == 0) {
 						// The remainder of the path doesn't exist on the file system - copy from
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/KeyedHashSet.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/KeyedHashSet.java
index 4346f34..e150e72 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/KeyedHashSet.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/KeyedHashSet.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.core.internal.utils;
 
-
 /** Adapted from a homonym class in org.eclipse.osgi. A hash table of
  * <code>KeyedElement</code>s.
  */
@@ -102,8 +101,7 @@
 		elements = new KeyedElement[elements.length * 2];
 
 		int maxArrayIndex = elements.length - 1;
-		for (int i = 0; i < oldElements.length; i++) {
-			KeyedElement element = oldElements[i];
+		for (KeyedElement element : oldElements) {
 			if (element != null) {
 				int hash = hash(element);
 				while (elements[hash] != null) {
@@ -228,13 +226,13 @@
 		StringBuilder result = new StringBuilder(100);
 		result.append('{');
 		boolean first = true;
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i] != null) {
+		for (KeyedElement element : elements) {
+			if (element != null) {
 				if (first)
 					first = false;
 				else
 					result.append(", "); //$NON-NLS-1$
-				result.append(elements[i]);
+				result.append(element);
 			}
 		}
 		result.append('}');
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/StringPoolJob.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/StringPoolJob.java
index a743542..174d4b6 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/StringPoolJob.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/StringPoolJob.java
@@ -116,10 +116,9 @@
 
 	private int shareStrings(IStringPoolParticipant[] toRun, IProgressMonitor monitor) {
 		final StringPool pool = new StringPool();
-		for (int i = 0; i < toRun.length; i++) {
+		for (final IStringPoolParticipant current : toRun) {
 			if (monitor.isCanceled())
 				break;
-			final IStringPoolParticipant current = toRun[i];
 			SafeRunner.run(new ISafeRunnable() {
 				@Override
 				public void handleException(Throwable exception) {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/UniversalUniqueIdentifier.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/UniversalUniqueIdentifier.java
index 2213745..53ed4ae 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/UniversalUniqueIdentifier.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/UniversalUniqueIdentifier.java
@@ -340,8 +340,8 @@
 	@Override
 	public String toString() {
 		StringBuilder buffer = new StringBuilder();
-		for (int i = 0; i < fBits.length; i++)
-			appendByteString(buffer, fBits[i]);
+		for (byte bit : fBits)
+			appendByteString(buffer, bit);
 		return buffer.toString();
 	}
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java
index a997f59..cf8b8eb 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java
@@ -269,8 +269,8 @@
 
 		/* first put all the trees in a hashtable */
 		HashMap<ElementTree, ElementTree> candidates = new HashMap<>((int) (trees.length * 1.5 + 1));
-		for (int i = 0; i < trees.length; i++) {
-			candidates.put(trees[i], trees[i]);
+		for (ElementTree tree2 : trees) {
+			candidates.put(tree2, tree2);
 		}
 
 		/* keep removing parents until only one tree remains */
@@ -597,8 +597,8 @@
 				if (path.isRoot()) {
 					//copy all the children
 					IPath[] children = toMerge.getChildren(Path.ROOT);
-					for (int i = 0; i < children.length; i++) {
-						current.createSubtree(children[i], toMerge.getSubtree(children[i]));
+					for (IPath element : children) {
+						current.createSubtree(element, toMerge.getSubtree(element));
 					}
 				} else {
 					//just copy the specified node
@@ -714,12 +714,9 @@
 	 */
 	public String toDebugString() {
 		final StringBuilder buffer = new StringBuilder("\n"); //$NON-NLS-1$
-		IElementContentVisitor visitor = new IElementContentVisitor() {
-			@Override
-			public boolean visitElement(ElementTree aTree, IPathRequestor elementID, Object elementContents) {
-				buffer.append(elementID.requestPath() + " " + elementContents + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-				return true;
-			}
+		IElementContentVisitor visitor = (aTree, elementID, elementContents) -> {
+			buffer.append(elementID.requestPath() + " " + elementContents + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+			return true;
 		};
 		new ElementTreeIterator(this, Path.ROOT).iterate(visitor);
 		return buffer.toString();
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTreeWriter.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTreeWriter.java
index a9352f2..23f272b 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTreeWriter.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTreeWriter.java
@@ -174,7 +174,7 @@
 	 * @param depth The depth of the subtree to write.  A depth of zero writes a
 	 *  single node, and a depth of D_INFINITE writes the whole subtree.
 	 * @param output The stream to write the subtree to.
-
+	
 	 */
 	public void writeDeltaChain(ElementTree[] trees, IPath path, int depth, DataOutput output, IElementComparator comparator) throws IOException {
 		/* Write the format version number */
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/CompositeResourceMapping.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/CompositeResourceMapping.java
index 98c3dd1..d124405 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/CompositeResourceMapping.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/CompositeResourceMapping.java
@@ -43,8 +43,7 @@
 
 	@Override
 	public boolean contains(ResourceMapping mapping) {
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping childMapping = mappings[i];
+		for (ResourceMapping childMapping : mappings) {
 			if (childMapping.contains(mapping)) {
 				return true;
 			}
@@ -74,8 +73,7 @@
 	public IProject[] getProjects() {
 		if (projects == null) {
 			Set<IProject> result = new HashSet<>();
-			for (int i = 0; i < mappings.length; i++) {
-				ResourceMapping mapping = mappings[i];
+			for (ResourceMapping mapping : mappings) {
 				result.addAll(Arrays.asList(mapping.getProjects()));
 			}
 			projects = result.toArray(new IProject[result.size()]);
@@ -87,8 +85,7 @@
 	public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
 		SubMonitor subMonitor = SubMonitor.convert(monitor, mappings.length);
 		List<ResourceTraversal> result = new ArrayList<>();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping mapping = mappings[i];
+		for (ResourceMapping mapping : mappings) {
 			Collections.addAll(result, mapping.getTraversals(context, subMonitor.newChild(1)));
 		}
 		return result.toArray(new ResourceTraversal[result.size()]);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ModelProvider.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ModelProvider.java
index 48b97c5..445db64 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ModelProvider.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ModelProvider.java
@@ -45,8 +45,7 @@
 	 */
 	public static IModelProviderDescriptor getModelProviderDescriptor(String id) {
 		IModelProviderDescriptor[] descs = ModelProviderManager.getDefault().getDescriptors();
-		for (int i = 0; i < descs.length; i++) {
-			IModelProviderDescriptor descriptor = descs[i];
+		for (IModelProviderDescriptor descriptor : descs) {
 			if (descriptor.getId().equals(id)) {
 				return descriptor;
 			}
@@ -135,8 +134,7 @@
 	 */
 	public ResourceMapping[] getMappings(IResource[] resources, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
 		Set<ResourceMapping> mappings = new HashSet<>();
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			ResourceMapping[] resourceMappings = getMappings(resource, context, monitor);
 			if (resourceMappings.length > 0)
 				mappings.addAll(Arrays.asList(resourceMappings));
@@ -162,11 +160,10 @@
 	 */
 	public ResourceMapping[] getMappings(ResourceTraversal[] traversals, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
 		Set<ResourceMapping> result = new HashSet<>();
-		for (int i = 0; i < traversals.length; i++) {
-			ResourceTraversal traversal = traversals[i];
+		for (ResourceTraversal traversal : traversals) {
 			ResourceMapping[] mappings = getMappings(traversal.getResources(), context, monitor);
-			for (int j = 0; j < mappings.length; j++)
-				result.add(mappings[j]);
+			for (ResourceMapping mapping : mappings)
+				result.add(mapping);
 		}
 		return result.toArray(new ResourceMapping[result.size()]);
 	}
@@ -192,8 +189,7 @@
 	public ResourceTraversal[] getTraversals(ResourceMapping[] mappings, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
 		SubMonitor subMonitor = SubMonitor.convert(monitor, mappings.length);
 		List<ResourceTraversal> traversals = new ArrayList<>();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping mapping = mappings[i];
+		for (ResourceMapping mapping : mappings) {
 			Collections.addAll(traversals, mapping.getTraversals(context, subMonitor.newChild(1)));
 		}
 		return traversals.toArray(new ResourceTraversal[traversals.size()]);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceChangeValidator.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceChangeValidator.java
index 6278a8b..a4684cb 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceChangeValidator.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceChangeValidator.java
@@ -69,8 +69,7 @@
 
 	private IStatus combineResults(IStatus[] result) {
 		List<IStatus> notOK = new ArrayList<>();
-		for (int i = 0; i < result.length; i++) {
-			IStatus status = result[i];
+		for (IStatus status : result) {
 			if (!status.isOK()) {
 				notOK.add(status);
 			}
@@ -97,8 +96,7 @@
 	private ModelProvider[] getProviders(IResource[] resources) {
 		IModelProviderDescriptor[] descriptors = ModelProvider.getModelProviderDescriptors();
 		List<ModelProvider> result = new ArrayList<>();
-		for (int i = 0; i < descriptors.length; i++) {
-			IModelProviderDescriptor descriptor = descriptors[i];
+		for (IModelProviderDescriptor descriptor : descriptors) {
 			try {
 				IResource[] matchingResources = descriptor.getMatchingResources(resources);
 				if (matchingResources.length > 0) {
@@ -117,12 +115,7 @@
 	private IResource[] getRootResources(IResourceDelta root) {
 		final ChangeDescription changeDescription = new ChangeDescription();
 		try {
-			root.accept(new IResourceDeltaVisitor() {
-				@Override
-				public boolean visit(IResourceDelta delta) {
-					return changeDescription.recordChange(delta);
-				}
-			});
+			root.accept(delta -> changeDescription.recordChange(delta));
 		} catch (CoreException e) {
 			// Shouldn't happen since the ProposedResourceDelta accept doesn't throw an
 			// exception and our visitor doesn't either
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceMapping.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceMapping.java
index 7254860..5017e2c 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceMapping.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceMapping.java
@@ -58,8 +58,8 @@
 	 */
 	public void accept(ResourceMappingContext context, IResourceVisitor visitor, IProgressMonitor monitor) throws CoreException {
 		ResourceTraversal[] traversals = getTraversals(context, monitor);
-		for (int i = 0; i < traversals.length; i++)
-			traversals[i].accept(visitor);
+		for (ResourceTraversal traversal : traversals)
+			traversal.accept(visitor);
 	}
 
 	/**
@@ -112,8 +112,8 @@
 	public IMarker[] findMarkers(String type, boolean includeSubtypes, IProgressMonitor monitor) throws CoreException {
 		final ResourceTraversal[] traversals = getTraversals(ResourceMappingContext.LOCAL_CONTEXT, monitor);
 		ArrayList<IMarker> result = new ArrayList<>();
-		for (int i = 0; i < traversals.length; i++)
-			traversals[i].doFindMarkers(result, type, includeSubtypes);
+		for (ResourceTraversal traversal : traversals)
+			traversal.doFindMarkers(result, type, includeSubtypes);
 		return result.toArray(new IMarker[result.size()]);
 	}
 
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceTraversal.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceTraversal.java
index 8e244d6..aac9e60 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceTraversal.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/mapping/ResourceTraversal.java
@@ -65,10 +65,10 @@
 	 * </ul>
 	 */
 	public void accept(IResourceVisitor visitor) throws CoreException {
-		for (int i = 0, imax = resources.length; i < imax; i++)
+		for (IResource resource : resources)
 			try {
-				if (resources[i].exists())
-					resources[i].accept(visitor, depth, flags);
+				if (resource.exists())
+					resource.accept(visitor, depth, flags);
 			} catch (CoreException e) {
 				//ignore failure in the case of concurrent deletion
 				if (e.getStatus().getCode() != IResourceStatus.RESOURCE_NOT_FOUND)
@@ -86,8 +86,7 @@
 	 * <code>false</code> otherwise.
 	 */
 	public boolean contains(IResource resource) {
-		for (int i = 0; i < resources.length; i++) {
-			IResource member = resources[i];
+		for (IResource member : resources) {
 			if (contains(member, resource)) {
 				return true;
 			}
@@ -114,8 +113,8 @@
 	 */
 	void doFindMarkers(ArrayList<IMarker> result, String type, boolean includeSubtypes) {
 		MarkerManager markerMan = ((Workspace) ResourcesPlugin.getWorkspace()).getMarkerManager();
-		for (int i = 0; i < resources.length; i++)
-			markerMan.doFindMarkers(resources[i], result, type, includeSubtypes, depth);
+		for (IResource resource : resources)
+			markerMan.doFindMarkers(resource, result, type, includeSubtypes, depth);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/team/ResourceRuleFactory.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/team/ResourceRuleFactory.java
index c9c4151..d41a79a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/team/ResourceRuleFactory.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/team/ResourceRuleFactory.java
@@ -247,9 +247,9 @@
 			return isReadOnly(resources[0]) ? parent(resources[0]) : null;
 		//need a lock on the parents of all read-only files
 		HashSet<ISchedulingRule> rules = new HashSet<>();
-		for (int i = 0; i < resources.length; i++)
-			if (isReadOnly(resources[i]))
-				rules.add(parent(resources[i]));
+		for (IResource resource : resources)
+			if (isReadOnly(resource))
+				rules.add(parent(resource));
 		if (rules.isEmpty())
 			return null;
 		if (rules.size() == 1)