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)
