diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java
index d240590..803beea 100644
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java
+++ b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java
@@ -86,8 +86,7 @@
 			workingSetElements = workingSet.getElements();
 		}
 
-        for (int i = 0; i < workingSetElements.length; i++) {
-            IAdaptable workingSetElement = workingSetElements[i];
+        for (IAdaptable workingSetElement : workingSetElements) {
             IContainmentAdapter containmentAdapter = workingSetElement.getAdapter(IContainmentAdapter.class);
 
             // if there is no IContainmentAdapter defined for the working
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java
index 872dc03..4db1e59 100644
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java
+++ b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java
@@ -170,10 +170,9 @@
 		// and trying to map the change to a remove and add is too dicey.
 		// The case is: folder A renamed to existing file B, answering yes to
 		// overwrite B.
-		IResourceDelta[] affectedChildren = delta
-				.getAffectedChildren(IResourceDelta.CHANGED);
-		for (int i = 0; i < affectedChildren.length; i++) {
-			if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
+		IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.CHANGED);
+		for (IResourceDelta affectedChild : affectedChildren) {
+			if ((affectedChild.getFlags() & IResourceDelta.TYPE) != 0) {
 				runnables.add(getRefreshRunnable(resource));
 				return;
 			}
@@ -205,8 +204,8 @@
 		}
 
 		// Handle changed children .
-		for (int i = 0; i < affectedChildren.length; i++) {
-			processDelta(affectedChildren[i], runnables);
+		for (IResourceDelta affectedChild : affectedChildren) {
+			processDelta(affectedChild, runnables);
 		}
 
 		// @issue several problems here:
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java
index 7cad071..5e32c02 100644
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java
+++ b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java
@@ -132,8 +132,8 @@
             out.writeInt(markers.length);
 
             /* write markers */
-            for (int i = 0; i < markers.length; i++) {
-                writeMarker((IMarker) markers[i], out);
+            for (Object marker : markers) {
+                writeMarker((IMarker) marker, out);
             }
             out.close();
             bytes = byteOut.toByteArray();
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java
index 90eaa63..35ba60d 100644
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java
+++ b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java
@@ -132,8 +132,8 @@
             dataOut.writeInt(resourceCount);
 
             //write each resource
-            for (int i = 0; i < resources.length; i++) {
-                writeResource(dataOut, resources[i]);
+            for (IResource resource : resources) {
+                writeResource(dataOut, resource);
             }
 
             //cleanup
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java
index 6e97417..74dd71b 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java
@@ -92,13 +92,10 @@
 			return null;
 		}
 
-        IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
-        for (int p = 0; p < providers.length; ++p) {
-            IBundleGroup[] groups = providers[p].getBundleGroups();
-            for (int g = 0; g < groups.length; ++g) {
-				if (id.equals(groups[g].getIdentifier())
-                        && versionId.equals(groups[g].getVersion())) {
-					return groups[g];
+		for (IBundleGroupProvider provider : Platform.getBundleGroupProviders()) {
+			for (IBundleGroup group : provider.getBundleGroups()) {
+				if (id.equals(group.getIdentifier()) && versionId.equals(group.getVersion())) {
+					return group;
 				}
 			}
         }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java
index f0f71c3..aee3490 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java
@@ -450,8 +450,8 @@
 		StringBuilder buff = new StringBuilder();
 
 		String path = null;
-		for (int i = 0; i < recent.length; ++i) {
-			if (recent[i] == null) {
+		for (String recentPath : recent) {
+			if (recentPath == null) {
 				break;
 			}
 
@@ -460,7 +460,7 @@
 				buff.append("\n"); //$NON-NLS-1$
 			}
 
-			path = recent[i];
+			path = recentPath;
 			buff.append(path);
 		}
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java
index 34c1b20..c069773 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java
@@ -534,10 +534,9 @@
     }
 
     private void setInitialTextValues(Combo text) {
-        String[] recentWorkspaces = launchData.getRecentWorkspaces();
-        for (int i = 0; i < recentWorkspaces.length; ++i) {
-			if (recentWorkspaces[i] != null) {
-				text.add(recentWorkspaces[i]);
+		for (String recentWorkspace : launchData.getRecentWorkspaces()) {
+			if (recentWorkspace != null) {
+				text.add(recentWorkspace);
 			}
 		}
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java
index bd9bf87..7eb13e1 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java
@@ -171,29 +171,25 @@
 	 */
 	private boolean createButtons(FormToolkit toolkit, Composite sectionClient) {
 
-		IConfigurationElement[] settings = SettingsTransfer
-				.getSettingsTransfers();
 
 		String[] enabledSettings = getEnabledSettings(IDEWorkbenchPlugin
 				.getDefault().getDialogSettings()
 				.getSection(WORKBENCH_SETTINGS));
 
-		for (int i = 0; i < settings.length; i++) {
-			final IConfigurationElement settingsTransfer = settings[i];
+		for (final IConfigurationElement settingsTransfer : SettingsTransfer.getSettingsTransfers()) {
 			final Button button = toolkit.createButton(sectionClient,
-					settings[i].getAttribute(ATT_NAME), SWT.CHECK);
+					settingsTransfer.getAttribute(ATT_NAME), SWT.CHECK);
 
-			String helpId = settings[i].getAttribute(ATT_HELP_CONTEXT);
+			String helpId = settingsTransfer.getAttribute(ATT_HELP_CONTEXT);
 
 			if (helpId != null)
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(button,
-						helpId);
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(button, helpId);
 
 			if (enabledSettings != null && enabledSettings.length > 0) {
 
-				String id = settings[i].getAttribute(ATT_ID);
-				for (int j = 0; j < enabledSettings.length; j++) {
-					if (enabledSettings[j].equals(id)) {
+				String id = settingsTransfer.getAttribute(ATT_ID);
+				for (String enabledSetting : enabledSettings) {
+					if (enabledSetting.equals(id)) {
 						button.setSelection(true);
 						selectedSettings.add(settingsTransfer);
 						break;
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java
index 5c3ffdf..4158ac3 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java
@@ -34,6 +34,7 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.IDE;
 import org.eclipse.ui.part.EditorInputTransfer;
+import org.eclipse.ui.part.EditorInputTransfer.EditorInputData;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.part.MarkerTransfer;
 import org.eclipse.ui.part.ResourceTransfer;
@@ -92,32 +93,27 @@
             /* event.data is an array of EditorInputData, which contains an IEditorInput and
              * the corresponding editorId */
             Assert.isTrue(event.data instanceof EditorInputTransfer.EditorInputData[]);
-            EditorInputTransfer.EditorInputData[] editorInputs = (EditorInputTransfer.EditorInputData []) event.data;
-            for (int i = 0; i < editorInputs.length; i++) {
-                IEditorInput editorInput = editorInputs[i].input;
-                String editorId = editorInputs[i].editorId;
+			for (EditorInputData editorInputData : (EditorInputTransfer.EditorInputData[]) event.data) {
+                IEditorInput editorInput = editorInputData.input;
+                String editorId = editorInputData.editorId;
                 openNonExternalEditor(page, editorInput, editorId);
             }
         }
 
         /* Open Editor for Marker (e.g. Tasks, Bookmarks, etc) */
-        else if (MarkerTransfer.getInstance().isSupportedType(
-                event.currentDataType)) {
+		else if (MarkerTransfer.getInstance().isSupportedType(event.currentDataType)) {
             Assert.isTrue(event.data instanceof IMarker[]);
-            IMarker[] markers = (IMarker[]) event.data;
-            for (int i = 0; i < markers.length; i++) {
-                openNonExternalEditor(page, markers[i]);
+			for (IMarker marker : (IMarker[]) event.data) {
+                openNonExternalEditor(page, marker);
             }
         }
 
         /* Open Editor for resource */
-        else if (ResourceTransfer.getInstance().isSupportedType(
-                event.currentDataType)) {
+		else if (ResourceTransfer.getInstance().isSupportedType(event.currentDataType)) {
             Assert.isTrue(event.data instanceof IResource[]);
-            IResource[] files = (IResource[]) event.data;
-            for (int i = 0; i < files.length; i++) {
-                if (files[i] instanceof IFile) {
-                    IFile file = (IFile) files[i];
+			for (IResource resource : (IResource[]) event.data) {
+				if (resource instanceof IFile) {
+					IFile file = (IFile) resource;
 
                     if (!file.isPhantom())
                     	openNonExternalEditor(page, file);
@@ -129,9 +125,8 @@
         else if (FileTransfer.getInstance().isSupportedType(
                 event.currentDataType)) {
             Assert.isTrue(event.data instanceof String[]);
-            String[] paths = (String[]) event.data;
-            for (int i = 0; i < paths.length; i++) {
-            	IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(paths[i]));
+			for (String path : (String[]) event.data) {
+            	IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(path));
             	try {
 					IDE.openEditorOnFileStore(page, fileStore);
 				} catch (PartInitException e) {
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAssociationOverrideDescriptor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAssociationOverrideDescriptor.java
index 357eb3e..88b4f39 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAssociationOverrideDescriptor.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAssociationOverrideDescriptor.java
@@ -151,14 +151,13 @@
 
 	private static EditorAssociationOverrideDescriptor[] createDescriptors(IConfigurationElement[] elements) {
 		List result= new ArrayList(elements.length);
-		for (int i= 0; i < elements.length; i++) {
-			IConfigurationElement element= elements[i];
-			if (EDITOR_ASSOCIATION_OVERRIDE_ELEMENT.equals(element.getName())) {
-				EditorAssociationOverrideDescriptor desc= new EditorAssociationOverrideDescriptor(element);
+		for (IConfigurationElement configElement : elements) {
+			if (EDITOR_ASSOCIATION_OVERRIDE_ELEMENT.equals(configElement.getName())) {
+				EditorAssociationOverrideDescriptor desc= new EditorAssociationOverrideDescriptor(configElement);
 				result.add(desc);
 			} else {
 				String message= MessageFormat.format(IDEWorkbenchMessages.editorAssociationOverride_error_invalidElementName_message,
-						element.getContributor().getName(), element.getName());
+						configElement.getContributor().getName(), configElement.getName());
 				IDEWorkbenchPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.OK, message, null));
 			}
 		}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java
index 94b04cd..7515704 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java
@@ -110,9 +110,9 @@
         });
 
         // Find primary feature
-        for (int i = 0; i < features.length; i++) {
-            if (features[i].getFeatureId().equals(primaryFeatureId)) {
-                setInitialSelections(new Object[] { features[i] });
+        for (AboutInfo feature : features) {
+            if (feature.getFeatureId().equals(primaryFeatureId)) {
+                setInitialSelections(new Object[] { feature });
                 return;
             }
         }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java
index b3409c0..6c0085b 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java
@@ -64,14 +64,12 @@
 					StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
 				}
 				if (traversals != null) {
-					ResourceTraversal traversal = null;
 					IResource[] resources = null;
-					for (int i = 0; i < traversals.length; i++) {
-						traversal = traversals[i];
+					for (ResourceTraversal traversal : traversals) {
 						resources = traversal.getResources();
 						if (resources != null) {
-							for (int j = 0; j < resources.length; j++) {
-								result.add(resources[j]);
+							for (IResource traversalResource : resources) {
+								result.add(traversalResource);
 							}
 						}
 					}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java
index 67b972e..aa556a7 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java
@@ -120,9 +120,7 @@
         natureMap.clear();
         IExtensionPoint point = Platform.getExtensionRegistry()
                 .getExtensionPoint("org.eclipse.core.resources.natures"); //$NON-NLS-1$
-        IExtension[] extensions = point.getExtensions();
-        for (int i = 0; i < extensions.length; i++) {
-            IExtension extension = extensions[i];
+		for (IExtension extension : point.getExtensions()) {
             final String localId = extension.getSimpleIdentifier();
             final String pluginId = extension.getNamespaceIdentifier();
             String natureId = extension.getUniqueIdentifier();
@@ -159,10 +157,8 @@
 		    if (mainDelta.getKind() == IResourceDelta.CHANGED
 					&& mainDelta.getResource().getType() == IResource.ROOT) {
 
-				IResourceDelta[] children = mainDelta.getAffectedChildren();
 				Set projectsToUpdate = new HashSet();
-				for (int i = 0; i < children.length; i++) {
-					IResourceDelta delta = children[i];
+				for (IResourceDelta delta : mainDelta.getAffectedChildren()) {
 					if (delta.getResource().getType() == IResource.PROJECT) {
 						IProject project = (IProject) delta.getResource();
 
@@ -190,9 +186,8 @@
 		}
 		IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI
 				.getWorkbench().getActivitySupport();
-		for (int j = 0; j < ids.length; j++) {
-			final IPluginContribution contribution = (IPluginContribution) natureMap
-					.get(ids[j]);
+		for (String id : ids) {
+			final IPluginContribution contribution = (IPluginContribution) natureMap.get(id);
 			if (contribution == null) {
 				continue; // bad nature ID.
 			}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java
index 5fefb42..a1b9763 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java
@@ -293,10 +293,9 @@
         // add an entry for each bundle group
         IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
         if (providers != null) {
-			for (int i = 0; i < providers.length; ++i) {
-                IBundleGroup[] bundleGroups = providers[i].getBundleGroups();
-                for (int j = 0; j < bundleGroups.length; ++j) {
-					infos.add(new AboutInfo(bundleGroups[j]));
+			for (IBundleGroupProvider provider : providers) {
+				for (IBundleGroup bundleGroup : provider.getBundleGroups()) {
+					infos.add(new AboutInfo(bundleGroup));
 				}
             }
 		}
@@ -354,15 +353,11 @@
 					return;
 				}
 
-				IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-				for (int i= 0; i < windows.length; i++) {
-					IWorkbenchWindow window= windows[i];
+				for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
 					IWorkbenchPage activePage= window.getActivePage();
 					if (activePage == null)
 						continue;
-					IViewReference[] refs= activePage.getViewReferences();
-					for (int j= 0; j < refs.length; j++) {
-						IViewReference viewReference= refs[j];
+					for (IViewReference viewReference : activePage.getViewReferences()) {
 						if (IPageLayout.ID_PROBLEM_VIEW.equals(viewReference.getId()))
 							try {
 								activePage.showView(viewReference.getId(), viewReference.getSecondaryId(), IWorkbenchPage.VIEW_CREATE);
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java
index fabd58b..212d07b 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java
@@ -289,9 +289,8 @@
 	 */
 	public void setEnabled(boolean enabled) {
 		group.setEnabled(enabled);
-		Control[] children = group.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			children[i].setEnabled(enabled);
+		for (Control child : group.getChildren()) {
+			child.setEnabled(enabled);
 		}
 	}
 }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java
index 400c7d1..3841554 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java
@@ -157,9 +157,8 @@
 			workingSets = (IWorkingSet[]) fWorkingSets
 					.toArray(new IWorkingSet[fWorkingSets.size()]);
 		}
-		for (int w = 0; w < workingSets.length; w++) {
-			WorkingSetDelta workingSetDelta = new WorkingSetDelta(
-					workingSets[w]);
+		for (IWorkingSet workingSet : workingSets) {
+			WorkingSetDelta workingSetDelta = new WorkingSetDelta(workingSet);
 			processResourceDelta(workingSetDelta, delta);
 			workingSetDelta.process();
 		}
@@ -192,9 +191,8 @@
 			return;
 		}
 
-		IResourceDelta[] children = delta.getAffectedChildren();
-		for (int i = 0; i < children.length; i++) {
-			processResourceDelta(result, children[i]);
+		for (IResourceDelta child : delta.getAffectedChildren()) {
+			processResourceDelta(result, child);
 		}
 	}
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java
index c847c4c..6ba9452 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java
@@ -35,9 +35,7 @@
 		List result = new ArrayList();
 
 		if (aStatus.isMultiStatus()) {
-			IStatus[] children = aStatus.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				IStatus currentChild = children[i];
+			for (IStatus currentChild : aStatus.getChildren()) {
 				if (currentChild.isMultiStatus()) {
 					Iterator childStatiiEnum = flatten(currentChild).iterator();
 					while (childStatiiEnum.hasNext()) {
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java
index aee1dcb..86c6872 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java
@@ -70,9 +70,9 @@
         AboutInfo[] featureInfos = IDEWorkbenchPlugin.getDefault()
                 .getFeatureInfos();
         ArrayList tipsAndTricksFeatures = new ArrayList(featureInfos.length);
-        for (int i = 0; i < featureInfos.length; i++) {
-            if (featureInfos[i].getTipsAndTricksHref() != null) {
-				tipsAndTricksFeatures.add(featureInfos[i]);
+        for (AboutInfo featureInfo : featureInfos) {
+            if (featureInfo.getTipsAndTricksHref() != null) {
+				tipsAndTricksFeatures.add(featureInfo);
 			}
         }
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java
index 7cc565a..dbb4083 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java
@@ -343,11 +343,10 @@
 			if (delta == null) {
 				return;
 			}
-			IResourceDelta[] projectDeltas = delta.getAffectedChildren();
-			for (int i = 0; i < projectDeltas.length; i++) {
-				int kind = projectDeltas[i].getKind();
+			for (IResourceDelta projectDelta : delta.getAffectedChildren()) {
+				int kind = projectDelta.getKind();
 				//affected by projects being opened/closed or description changes
-				boolean changed = (projectDeltas[i].getFlags() & (IResourceDelta.DESCRIPTION | IResourceDelta.OPEN)) != 0;
+				boolean changed = (projectDelta.getFlags() & (IResourceDelta.DESCRIPTION | IResourceDelta.OPEN)) != 0;
 				if (kind != IResourceDelta.CHANGED || changed) {
 					updateBuildActions(false);
 					return;
@@ -1268,8 +1267,8 @@
      * @return <code>true</code> if a welcome page was found, <code>false</code> if not
      */
     private boolean hasWelcomePage(AboutInfo[] infos) {
-        for (int i = 0; i < infos.length; i++) {
-            if (infos[i].getWelcomePageURL() != null) {
+        for (AboutInfo info : infos) {
+            if (info.getWelcomePageURL() != null) {
             	return true;
             }
         }
@@ -1283,8 +1282,8 @@
      * @return <code>true</code> if tips and tricks were found, <code>false</code> if not
      */
     private boolean hasTipsAndTricks(AboutInfo[] infos) {
-        for (int i = 0; i < infos.length; i++) {
-            if (infos[i].getTipsAndTricksHref() != null) {
+        for (AboutInfo info : infos) {
+            if (info.getTipsAndTricksHref() != null) {
             	return true;
             }
         }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java
index f400887..1d3d7ef 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java
@@ -99,24 +99,18 @@
 	 * Create a new instance of the receiver.
 	 */
 	public FileSystemSupportRegistry() {
-
-		IExtensionTracker tracker = PlatformUI.getWorkbench()
-				.getExtensionTracker();
+		IExtensionTracker tracker = PlatformUI.getWorkbench().getExtensionTracker();
 		IExtensionPoint point = Platform.getExtensionRegistry()
 				.getExtensionPoint(IDEWorkbenchPlugin.IDE_WORKBENCH,
 						FILESYSTEM_SUPPORT);
 		if (point == null) {
 			return;
 		}
-		IExtension[] extensions = point.getExtensions();
 		// initial population
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
+		for (IExtension extension : point.getExtensions()) {
 			processExtension(tracker, extension);
 		}
-		tracker.registerHandler(this, ExtensionTracker
-				.createExtensionPointFilter(point));
-
+		tracker.registerHandler(this, ExtensionTracker.createExtensionPointFilter(point));
 	}
 
 	@Override
@@ -127,8 +121,8 @@
 
 	@Override
 	public void removeExtension(IExtension extension, Object[] objects) {
-		for (int i = 0; i < objects.length; i++) {
-			registeredContributions.remove(objects[i]);
+		for (Object object : objects) {
+			registeredContributions.remove(object);
 		}
 		allConfigurations = null;//Clear the cache
 
@@ -140,16 +134,11 @@
 	 * @param tracker
 	 * @param extension
 	 */
-	private void processExtension(IExtensionTracker tracker,
-			IExtension extension) {
-		IConfigurationElement[] elements = extension.getConfigurationElements();
-		for (int j = 0; j < elements.length; j++) {
-			IConfigurationElement element = elements[j];
-			FileSystemConfiguration contribution = newConfiguration(element);
+	private void processExtension(IExtensionTracker tracker, IExtension extension) {
+		for (IConfigurationElement configElement : extension.getConfigurationElements()) {
+			FileSystemConfiguration contribution = newConfiguration(configElement);
 			registeredContributions.add(contribution);
-			tracker.registerObject(extension, contribution,
-					IExtensionTracker.REF_STRONG);
-
+			tracker.registerObject(extension, contribution, IExtensionTracker.REF_STRONG);
 		}
 	}
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java
index 1c3885c..8802aa8 100755
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java
@@ -96,9 +96,9 @@
 			Object[] result = queryFileResource();
 
 			if (result != null) {
-				for (int i = 0; i < result.length; i++) {
-					if (result[i] instanceof IFile) {
-						files.add(result[i]);
+				for (Object fileResource : result) {
+					if (fileResource instanceof IFile) {
+						files.add(fileResource);
 					}
 				}
 			}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java
index d656c38..cc931dd 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java
@@ -122,10 +122,10 @@
     		ILabelProvider treeLabelProvider,
     		ViewerComparator treeComparator,
     		IStructuredContentProvider listContentProvider,
-    		ILabelProvider listLabelProvider, 
+    		ILabelProvider listLabelProvider,
     		ViewerComparator listComparator,
     		int style, int width, int height) {
-    	
+
     	root = rootObject;
     	this.treeContentProvider = treeContentProvider;
     	this.listContentProvider = listContentProvider;
@@ -219,8 +219,7 @@
      *	time and check each one in the tree viewer as appropriate
      */
     protected void checkNewTreeElements(Object[] elements) {
-        for (int i = 0; i < elements.length; ++i) {
-            Object currentElement = elements[i];
+		for (Object currentElement : elements) {
             boolean checked = checkedStateStore.containsKey(currentElement);
             treeViewer.setChecked(currentElement, checked);
             treeViewer.setGrayed(currentElement, checked
@@ -336,9 +335,8 @@
 
         // if any children of treeElement are still gray-checked then treeElement
         // must remain gray-checked as well
-        Object[] children = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-            if (checkedStateStore.containsKey(children[i])) {
+		for (Object child : treeContentProvider.getChildren(treeElement)) {
+			if (checkedStateStore.containsKey(child)) {
 				return true;
 			}
         }
@@ -368,9 +366,8 @@
         // always go through all children first since their white-checked
         // statuses will be needed to determine the white-checked status for
         // this tree element
-        Object[] children = treeContentProvider.getElements(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-			determineWhiteCheckedDescendents(children[i]);
+		for (Object child : treeContentProvider.getElements(treeElement)) {
+			determineWhiteCheckedDescendents(child);
 		}
 
         // now determine the white-checked status for this tree element
@@ -537,13 +534,12 @@
      */
     protected void notifyCheckStateChangeListeners(
             final CheckStateChangedEvent event) {
-        Object[] array = getListeners();
-        for (int i = 0; i < array.length; i++) {
-            final ICheckStateListener l = (ICheckStateListener) array[i];
+		for (Object listener : getListeners()) {
+			final ICheckStateListener checkStateListener = (ICheckStateListener) listener;
             SafeRunner.run(new SafeRunnable() {
                 @Override
 				public void run() {
-                    l.checkStateChanged(event);
+					checkStateListener.checkStateChanged(event);
                 }
             });
         }
@@ -659,10 +655,9 @@
         }
 
         if (state) {
-            Object[] listItems = listContentProvider.getElements(treeElement);
             List listItemsChecked = new ArrayList();
-            for (int i = 0; i < listItems.length; ++i) {
-				listItemsChecked.add(listItems[i]);
+			for (Object listItem : listContentProvider.getElements(treeElement)) {
+				listItemsChecked.add(listItem);
 			}
 
             checkedStateStore.put(treeElement, listItemsChecked);
@@ -675,9 +670,8 @@
         treeViewer.setGrayed(treeElement, false);
 
         // now logically check/uncheck all children as well
-        Object[] children = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-            setTreeChecked(children[i], state);
+		for (Object child : treeContentProvider.getChildren(treeElement)) {
+			setTreeChecked(child, state);
         }
     }
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java
index 3802642..ad2a6a0 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java
@@ -48,16 +48,15 @@
 	public Object[] getChildren(Object element) {
         if (element instanceof IWorkspace) {
             // check if closed projects should be shown
-            IProject[] allProjects = ((IWorkspace) element).getRoot()
-                    .getProjects();
+			IProject[] allProjects = ((IWorkspace) element).getRoot().getProjects();
             if (showClosedProjects) {
 				return allProjects;
 			}
 
             ArrayList accessibleProjects = new ArrayList();
-            for (int i = 0; i < allProjects.length; i++) {
-                if (allProjects[i].isOpen()) {
-                    accessibleProjects.add(allProjects[i]);
+			for (IProject project : allProjects) {
+				if (project.isOpen()) {
+					accessibleProjects.add(project);
                 }
             }
             return accessibleProjects.toArray();
@@ -66,10 +65,9 @@
             if (container.isAccessible()) {
                 try {
                     List children = new ArrayList();
-                    IResource[] members = container.members();
-                    for (int i = 0; i < members.length; i++) {
-                        if (members[i].getType() != IResource.FILE) {
-                            children.add(members[i]);
+					for (IResource member : container.members()) {
+                        if (member.getType() != IResource.FILE) {
+                            children.add(member);
                         }
                     }
                     return children.toArray();
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/NotFileInfoMatcher.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/NotFileInfoMatcher.java
index b5c234d..9111db3 100755
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/NotFileInfoMatcher.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/NotFileInfoMatcher.java
@@ -13,6 +13,7 @@
 
 import org.eclipse.core.filesystem.IFileInfo;
 import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.filtermatchers.AbstractFileInfoMatcher;
 import org.eclipse.core.resources.filtermatchers.CompoundFileInfoMatcher;
 import org.eclipse.core.runtime.CoreException;
 
@@ -23,8 +24,8 @@
 
 	@Override
 	public boolean matches(IContainer parent, IFileInfo fileInfo) throws CoreException {
-		for (int i = 0; i < matchers.length; i++) {
-			if (matchers[i].matches(parent, fileInfo))
+		for (AbstractFileInfoMatcher matcher : matchers) {
+			if (matcher.matches(parent, fileInfo))
 				return false;
 		}
 		return true;
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OrFileInfoMatcher.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OrFileInfoMatcher.java
index bad4528..2dbc138 100755
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OrFileInfoMatcher.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OrFileInfoMatcher.java
@@ -13,6 +13,7 @@
 
 import org.eclipse.core.filesystem.IFileInfo;
 import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.filtermatchers.AbstractFileInfoMatcher;
 import org.eclipse.core.resources.filtermatchers.CompoundFileInfoMatcher;
 import org.eclipse.core.runtime.CoreException;
 
@@ -24,8 +25,8 @@
 	@Override
 	public boolean matches(IContainer parent, IFileInfo fileInfo) throws CoreException {
 		if (matchers.length > 0) {
-			for (int i = 0; i < matchers.length; i++) {
-				if (matchers[i].matches(parent, fileInfo))
+			for (AbstractFileInfoMatcher matcher : matchers) {
+				if (matcher.matches(parent, fileInfo))
 					return true;
 			}
 			return false;
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java
index 59b66af..e28085a 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java
@@ -43,22 +43,20 @@
                 : IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED;
         if (isOpen) {
             try {
-                String[] natureIds = project.getDescription().getNatureIds();
-                for (int i = 0; i < natureIds.length; ++i) {
-                    // Have to use a cache because OverlayIcon does not define its own equality criteria,
-                    // so WorkbenchLabelProvider would always create a new image otherwise.
-                    String imageKey = natureIds[i];
-                    ImageDescriptor overlayImage = (ImageDescriptor) imageCache
-                            .get(imageKey);
+				for (String imageKey : project.getDescription().getNatureIds()) {
+					// Have to use a cache because OverlayIcon does not define
+					// its own equality criteria,
+					// so WorkbenchLabelProvider would always create a new image
+					// otherwise.
+					ImageDescriptor overlayImage = (ImageDescriptor) imageCache.get(imageKey);
                     if (overlayImage != null) {
                         return overlayImage;
                     }
                     ImageDescriptor natureImage = IDEWorkbenchPlugin
                             .getDefault().getProjectImageRegistry()
-                            .getNatureImage(natureIds[i]);
+                            .getNatureImage(imageKey);
                     if (natureImage != null) {
-                        ImageDescriptor baseImage = IDEInternalWorkbenchImages
-                                .getImageDescriptor(baseKey);
+						ImageDescriptor baseImage = IDEInternalWorkbenchImages.getImageDescriptor(baseKey);
                         overlayImage = new OverlayIcon(baseImage,
                                 new ImageDescriptor[][] { { natureImage } },
                                 new Point(16, 16));
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java
index 9afc10c..795d0a9 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java
@@ -37,12 +37,10 @@
 		public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
 			if (adaptable instanceof IWorkingSet) {
 				IWorkingSet workingSet = (IWorkingSet) adaptable;
-				IAdaptable[] elements = workingSet.getElements();
-				for (int i = 0; i < elements.length; i++) {
-					IAdaptable element = elements[i];
-					ResourceMapping mapping = getContributedResourceMapping(element);
+				for (IAdaptable currentAdaptable : workingSet.getElements()) {
+					ResourceMapping mapping = getContributedResourceMapping(currentAdaptable);
 					if (mapping == null) {
-						mapping = getResourceMapping(element);
+						mapping = getResourceMapping(currentAdaptable);
 					}
 					if (mapping != null) {
 						return new WorkingSetResourceMapping(workingSet);
@@ -111,10 +109,8 @@
 			}
 			if (adapterType == ResourceMapping.class) {
 				IWorkingSet workingSet = (IWorkingSet) adaptableObject;
-				IAdaptable[] elements = workingSet.getElements();
-				for (int i = 0; i < elements.length; i++) {
-					IAdaptable element = elements[i];
-					ResourceMapping mapping = getResourceMapping(element);
+				for (IAdaptable adaptable : workingSet.getElements()) {
+					ResourceMapping mapping = getResourceMapping(adaptable);
 					if (mapping != null) {
 						return adapterType.cast(new WorkingSetResourceMapping(workingSet));
 					}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java
index 42fd00d..7050ff5 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java
@@ -56,12 +56,8 @@
 	@Override
 	public IProject[] getProjects() {
 		Set<IProject> result = new HashSet<>();
-		ResourceMapping[] mappings = getMappings();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping mapping = mappings[i];
-			IProject[] projects = mapping.getProjects();
-			for (int j = 0; j < projects.length; j++) {
-				IProject project = projects[j];
+		for (ResourceMapping mapping : getMappings()) {
+			for (IProject project : mapping.getProjects()) {
 				result.add(project);
 			}
 		}
@@ -75,8 +71,7 @@
 		SubMonitor subMonitor = SubMonitor.convert(mon, mappings.length);
 
 		List<ResourceTraversal> result = new ArrayList<>();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping mapping = mappings[i];
+		for (ResourceMapping mapping : mappings) {
 			result.addAll(Arrays.asList(mapping.getTraversals(context, subMonitor.split(1))));
 		}
 		return result.toArray(new ResourceTraversal[result.size()]);
@@ -87,13 +82,11 @@
 	 * @return the mappings contained in the set
 	 */
 	private ResourceMapping[] getMappings() {
-		IAdaptable[] elements = set.getElements();
 		List<ResourceMapping> result = new ArrayList<>();
-		for (int i = 0; i < elements.length; i++) {
-			IAdaptable element = elements[i];
-			ResourceMapping mapping = WorkingSetAdapterFactory.getContributedResourceMapping(element);
+		for (IAdaptable adaptable : set.getElements()) {
+			ResourceMapping mapping = WorkingSetAdapterFactory.getContributedResourceMapping(adaptable);
 			if (mapping == null) {
-				mapping = WorkingSetAdapterFactory.getResourceMapping(element);
+				mapping = WorkingSetAdapterFactory.getResourceMapping(adaptable);
 			}
 			if (mapping != null) {
 				result.add(mapping);
@@ -104,9 +97,7 @@
 
 	@Override
 	public boolean contains(ResourceMapping mapping) {
-		ResourceMapping[] mappings = getMappings();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping childMapping = mappings[i];
+		for (ResourceMapping childMapping : getMappings()) {
 			if (childMapping.contains(mapping)) {
 				return true;
 			}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java
index 525563b..8fb90ff 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java
@@ -183,8 +183,8 @@
             extensions = orderExtensions(extensions);
             extensionPoints.put(pointId, extensions);
         }
-        for (int i = 0; i < extensions.length; i++) {
-			readExtension(extensions[i]);
+        for (IExtension extension : extensions) {
+			readExtension(extension);
 		}
     }
 }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java
index c981723..1c30db6 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java
@@ -213,44 +213,33 @@
 	public IMarkerResolution[] getResolutions(IMarker marker) {
 		// Collect all matches
 		ArrayList resolutions = new ArrayList();
-		for (Iterator iter = resolutionQueries.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Entry) iter.next();
+		for (Object resolutionQueryEntry : resolutionQueries.entrySet()) {
+			Map.Entry entry = (Entry) resolutionQueryEntry;
 			MarkerQuery query = (MarkerQuery) entry.getKey();
 			MarkerQueryResult result = query.performQuery(marker);
 			if (result != null) {
 				// See if a matching result is registered
 				Map resultsTable = (Map) entry.getValue();
-
 				if (resultsTable.containsKey(result)) {
-
-					Iterator elements = ((Collection) resultsTable.get(result))
-							.iterator();
+					Iterator elements = ((Collection) resultsTable.get(result)).iterator();
 					while (elements.hasNext()) {
-						IConfigurationElement element = (IConfigurationElement) elements
-								.next();
-
+						IConfigurationElement element = (IConfigurationElement) elements.next();
 						IMarkerResolutionGenerator generator = null;
 						try {
-							generator = (IMarkerResolutionGenerator) element
-									.createExecutableExtension(ATT_CLASS);
+							generator = (IMarkerResolutionGenerator) element.createExecutableExtension(ATT_CLASS);
 						} catch (CoreException e) {
 							Policy.handle(e);
 						}
 						if (generator != null) {
-							IMarkerResolution[] generatedResolutions = generator
-									.getResolutions(marker);
-							for (int i = 0; i < generatedResolutions.length; i++) {
-								resolutions.add(generatedResolutions[i]);
+							for (IMarkerResolution generatedResolution : generator.getResolutions(marker)) {
+								resolutions.add(generatedResolution);
 							}
 						}
-
 					}
 				}
 			}
 		}
-		return (IMarkerResolution[]) resolutions
-				.toArray(new IMarkerResolution[resolutions.size()]);
+		return (IMarkerResolution[]) resolutions.toArray(new IMarkerResolution[resolutions.size()]);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java
index 9586e6d..705fe1d 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java
@@ -144,8 +144,8 @@
 			hashCode = hashCode * 37 + type.hashCode();
 		}
 
-        for (int i = 0; i < attributes.length; i++) {
-            hashCode = hashCode * 37 + attributes[i].hashCode();
+        for (String attribute : attributes) {
+            hashCode = hashCode * 37 + attribute.hashCode();
         }
     }
 
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java
index 7da499d..02f7904 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java
@@ -78,8 +78,8 @@
     public void computeHashCode() {
         hashCode = 19;
 
-        for (int i = 0; i < values.length; i++) {
-            hashCode = hashCode * 37 + values[i].hashCode();
+        for (String value : values) {
+            hashCode = hashCode * 37 + value.hashCode();
         }
     }
 }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java
index 11050eb..aecba60 100755
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java
@@ -112,9 +112,9 @@
 			resource.setResourceAttributes(resourceAttributes);
 		}
 		if (markerDescriptions != null) {
-			for (int i = 0; i < markerDescriptions.length; i++) {
-				if (markerDescriptions[i].resource.exists())
-					markerDescriptions[i].createMarker();
+			for (MarkerDescription markerDescription : markerDescriptions) {
+				if (markerDescription.resource.exists())
+					markerDescription.createMarker();
 			}
 		}
 	}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java
index 97aa3a7..17be165 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java
@@ -195,20 +195,16 @@
 		if (members != null) {
 			SubMonitor subMonitor = SubMonitor.convert(mon, UndoMessages.FolderDescription_SavingUndoInfoProgress,
 					members.length);
-			for (int i = 0; i < members.length; i++) {
+			for (AbstractResourceDescription member : members) {
 				SubMonitor iterationMonitor = subMonitor.split(1);
-				if (members[i] instanceof FileDescription) {
-					IPath path = resource.getFullPath().append(
-							((FileDescription) members[i]).name);
-					IFile fileHandle = resource.getWorkspace().getRoot().getFile(
-							path);
-					members[i].recordStateFromHistory(fileHandle, iterationMonitor);
-				} else if (members[i] instanceof FolderDescription) {
-					IPath path = resource.getFullPath().append(
-							((FolderDescription) members[i]).name);
-					IFolder folderHandle = resource.getWorkspace().getRoot()
-							.getFolder(path);
-					members[i].recordStateFromHistory(folderHandle, iterationMonitor);
+				if (member instanceof FileDescription) {
+					IPath path = resource.getFullPath().append(((FileDescription) member).name);
+					IFile fileHandle = resource.getWorkspace().getRoot().getFile(path);
+					member.recordStateFromHistory(fileHandle, iterationMonitor);
+				} else if (member instanceof FolderDescription) {
+					IPath path = resource.getFullPath().append(((FolderDescription) member).name);
+					IFolder folderHandle = resource.getWorkspace().getRoot().getFolder(path);
+					member.recordStateFromHistory(folderHandle, iterationMonitor);
 				}
 			}
 		}
@@ -236,9 +232,9 @@
 			return this;
 		}
 		// Traverse the members and find the first potential leaf
-		for (int i = 0; i < members.length; i++) {
-			if (members[i] instanceof ContainerDescription) {
-				return ((ContainerDescription) members[i]).getFirstLeafFolder();
+		for (AbstractResourceDescription member : members) {
+			if (member instanceof ContainerDescription) {
+				return ((ContainerDescription) member).getFirstLeafFolder();
 			}
 		}
 		// No child folders were found, this is a leaf
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java
index 30d9a57..fcc2a02 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java
@@ -187,9 +187,9 @@
 	 * the most recent copy of the file state is used.
 	 */
 	private IFileState getMatchingFileState(IFileState[] states) {
-		for (int i = 0; i < states.length; i++) {
-			if (localTimeStamp == states[i].getModificationTime()) {
-				return states[i];
+		for (IFileState state : states) {
+			if (localTimeStamp == state.getModificationTime()) {
+				return state;
 			}
 		}
 		return states[0];
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java
index a4e8525..369f3b3 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java
@@ -21,6 +21,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.ui.ide.dialogs.UIResourceFilterDescription;
 
 /**
  * FolderDescription is a lightweight description that describes a folder to be
@@ -84,8 +85,8 @@
 		subMonitor.setTaskName(UndoMessages.FolderDescription_NewFolderProgress);
 		if (filters != null) {
 			SubMonitor loopMonitor = subMonitor.split(100).setWorkRemaining(filters.length);
-			for (int i = 0; i < filters.length; i++) {
-				folderHandle.createFilter(filters[i].getType(), filters[i].getFileInfoMatcherDescription(), 0,
+			for (UIResourceFilterDescription filter : filters) {
+				folderHandle.createFilter(filter.getType(), filter.getFileInfoMatcherDescription(), 0,
 						loopMonitor.split(1));
 			}
 		}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java
index 8603c81..4960cdc 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java
@@ -129,9 +129,8 @@
 
         int count = 0;
         if (checkResource.isAccessible()) {
-            IResource[] children = ((IContainer) checkResource).members();
-            for (int i = 0; i < children.length; i++) {
-				count += countChildrenOf(children[i]);
+			for (IResource child : ((IContainer) checkResource).members()) {
+				count += countChildrenOf(child);
 			}
         }
 
@@ -224,8 +223,8 @@
                 }
             }
 
-            for (int i = 0; i < children.length; i++) {
-				exportResource(children[i], leadupDepth + 1);
+            for (IResource child : children) {
+				exportResource(child, leadupDepth + 1);
 			}
 
         }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java
index 7628c2a..17af23b 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java
@@ -104,9 +104,8 @@
 
         int count = 0;
         if (parentResource.isAccessible()) {
-            IResource[] children = ((IContainer) parentResource).members();
-            for (int i = 0; i < children.length; i++) {
-				count += countChildrenOf(children[i]);
+			for (IResource child : ((IContainer) parentResource).members()) {
+				count += countChildrenOf(child);
 			}
         }
 
@@ -171,8 +170,7 @@
      */
     protected void exportChildren(IResource[] children, IPath currentPath)
             throws InterruptedException {
-        for (int i = 0; i < children.length; i++) {
-            IResource child = children[i];
+		for (IResource child : children) {
 			if (!child.isAccessible() || (!resolveLinks && child.isLinked())) {
 				continue;
 			}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java
index 47574f8..eebfdb0 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java
@@ -64,9 +64,7 @@
     protected void writeChildren(IContainer folder, IPath destinationPath)
             throws CoreException, IOException {
         if (folder.isAccessible()) {
-            IResource[] children = folder.members();
-            for (int i = 0; i < children.length; i++) {
-                IResource child = children[i];
+			for (IResource child : folder.members()) {
                 writeResource(child, destinationPath.append(child.getName()));
             }
         }
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java
index b3748f2..ada313b 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java
@@ -365,8 +365,8 @@
 
             // destination
             setDestinationValue(directoryNames[0]);
-            for (int i = 0; i < directoryNames.length; i++) {
-				addDestinationItem(directoryNames[i]);
+            for (String directoryName : directoryNames) {
+				addDestinationItem(directoryName);
 			}
 
             boolean setStructure = settings
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java
index 0d05efc..79ee47c 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java
@@ -449,8 +449,8 @@
 			}
 
             // set filenames history
-            for (int i = 0; i < sourceNames.length; i++) {
-				sourceNameField.add(sourceNames[i]);
+            for (String sourceName : sourceNames) {
+				sourceNameField.add(sourceName);
 			}
 
             // radio buttons and checkboxes
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java
index fccf9a1..8821312 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java
@@ -432,8 +432,8 @@
 
             // destination
             setDestinationValue(directoryNames[0]);
-            for (int i = 0; i < directoryNames.length; i++) {
-				addDestinationItem(directoryNames[i]);
+            for (String directoryName : directoryNames) {
+				addDestinationItem(directoryName);
 			}
 
             // options
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java
index 2dbdf1a..5055dfd 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java
@@ -957,8 +957,8 @@
 			}
 
             // set filenames history
-            for (int i = 0; i < sourceNames.length; i++) {
-				sourceNameField.add(sourceNames[i]);
+            for (String sourceName : sourceNames) {
+				sourceNameField.add(sourceName);
 			}
 
             // radio buttons and checkboxes
@@ -1121,11 +1121,11 @@
                 if (files == null) {
                     throw new InterruptedException();
                 }
-                for (int i = 0; i < files.length; i++) {
+                for (Object file : files) {
                     if (monitor.isCanceled()) {
 						throw new InterruptedException();
 					}
-                    checkFile(files[i]);
+                    checkFile(file);
                 }
             }
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/model/AdaptableList.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/model/AdaptableList.java
index ccc4f47..a76dfd3 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/model/AdaptableList.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/model/AdaptableList.java
@@ -58,8 +58,8 @@
      */
     public AdaptableList(IAdaptable[] newChildren) {
         this(newChildren.length);
-        for (int i = 0; i < newChildren.length; i++) {
-            children.add(newChildren[i]);
+        for (IAdaptable adaptable : newChildren) {
+            children.add(adaptable);
         }
     }
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/operations/NonLocalUndoUserApprover.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/operations/NonLocalUndoUserApprover.java
index dd82fed..799ca0a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/operations/NonLocalUndoUserApprover.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/operations/NonLocalUndoUserApprover.java
@@ -164,8 +164,7 @@
 			// empty
 			// array of affected objects is considered a local change.
 			local = true;
-			for (int i = 0; i < modifiedElements.length; i++) {
-				Object modifiedElement = modifiedElements[i];
+			for (Object modifiedElement : modifiedElements) {
 				if (!elementsContains(modifiedElement)) {
 					// the modified element is not known by the editor
 					local = false;
@@ -257,8 +256,7 @@
 			// may provide on the preferred class if they are not instances of
 			// the preferred class. This is done only once.
 			elementsAndAdapters = new ArrayList(elements.length);
-			for (int i = 0; i < elements.length; i++) {
-				Object element = elements[i];
+			for (Object element : elements) {
 				elementsAndAdapters.add(element);
 				if (affectedObjectsClass != null
 						&& !affectedObjectsClass.isInstance(element)) {
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/themes/ColorUtil.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/themes/ColorUtil.java
index e3dd50a..ed1f8ce 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/themes/ColorUtil.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/themes/ColorUtil.java
@@ -41,8 +41,7 @@
 	private static RGB process(String value) {
 		Field [] fields = getFields();
 		try {
-			for (int i = 0; i < fields.length; i++) {
-				Field field = fields[i];
+			for (Field field : fields) {
 				if (field.getName().equals(value)) {
 					return getSystemColor(field.getInt(null));
 				}
@@ -69,8 +68,7 @@
 			Field[] allFields = clazz.getDeclaredFields();
 			ArrayList<Field> applicableFields = new ArrayList<>(allFields.length);
 
-			for (int i = 0; i < allFields.length; i++) {
-				Field field = allFields[i];
+			for (Field field : allFields) {
 				if (field.getType() == Integer.TYPE
 						&& Modifier.isStatic(field.getModifiers())
 						&& Modifier.isPublic(field.getModifiers())
