diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java
index f70c4f2..03cae8a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java
@@ -93,10 +93,9 @@
      */
     public void dispose() {
         synchronized (fListeners) {
-            Object[] listeners = fListeners.getListeners();
-            for (int i = 0; i < listeners.length; i++) {
-                fListeners.remove(listeners[i]);
-                postListeners.remove(listeners[i]);
+			for (Object listener : fListeners.getListeners()) {
+                fListeners.remove(listener);
+                postListeners.remove(listener);
             }
         }
     }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSet.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSet.java
index abebe68..f7ad163 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSet.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSet.java
@@ -147,8 +147,8 @@
 	            "Working set elements array must not be null"); //$NON-NLS-1$
 
 	    elements = new ArrayList(newElements.length);
-	    for (int i = 0; i < newElements.length; i++) {
-	        elements.add(newElements[i]);
+	    for (IAdaptable newElement : newElements) {
+	        elements.add(newElement);
 	    }
 	}
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSetManager.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSetManager.java
index 41f6423..ce8b524 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSetManager.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractWorkingSetManager.java
@@ -145,8 +145,8 @@
 			return registry.getNewPageWorkingSetDescriptors();
 		}
 		List<WorkingSetDescriptor> result = new ArrayList<>(supportedWorkingSetIds.length);
-		for (int i = 0; i < supportedWorkingSetIds.length; i++) {
-			WorkingSetDescriptor desc = registry.getWorkingSetDescriptor(supportedWorkingSetIds[i]);
+		for (String supportedWorkingSetId : supportedWorkingSetIds) {
+			WorkingSetDescriptor desc = registry.getWorkingSetDescriptor(supportedWorkingSetId);
 			if (desc != null && desc.isEditable()) {
 				result.add(desc);
 			}
@@ -366,13 +366,13 @@
         final PropertyChangeEvent event = new PropertyChangeEvent(this,
                 changeId, oldValue, newValue);
 		Runnable notifier = () -> {
-			for (int i = 0; i < listeners.length; i++) {
-				final IPropertyChangeListener listener = (IPropertyChangeListener) listeners[i];
+			for (Object listener : listeners) {
+				final IPropertyChangeListener propertyChangeListener = (IPropertyChangeListener) listener;
 				ISafeRunnable safetyWrapper = new ISafeRunnable() {
 
 					@Override
 					public void run() throws Exception {
-						listener.propertyChange(event);
+						propertyChangeListener.propertyChange(event);
 					}
 
 					@Override
@@ -477,10 +477,8 @@
      * @param memento the persistence store
      */
 	protected void restoreWorkingSetState(IMemento memento) {
-		IMemento[] children = memento.getChildren(IWorkbenchConstants.TAG_WORKING_SET);
-
-		for (int i = 0; i < children.length; i++) {
-			AbstractWorkingSet workingSet = (AbstractWorkingSet) restoreWorkingSet(children[i]);
+		for (IMemento child : memento.getChildren(IWorkbenchConstants.TAG_WORKING_SET)) {
+			AbstractWorkingSet workingSet = (AbstractWorkingSet) restoreWorkingSet(child);
 			if (workingSet != null) {
 				internalAddWorkingSet(workingSet);
 			}
@@ -660,8 +658,7 @@
 				@Override
 				public IStatus runInUIThread(IProgressMonitor monitor) {
 					synchronized (updaters) {
-						for (int i = 0; i < descriptors.length; i++) {
-							WorkingSetDescriptor descriptor = descriptors[i];
+						for (WorkingSetDescriptor descriptor : descriptors) {
 							List workingSets = getWorkingSetsForId(descriptor
 									.getId());
 							if (workingSets.size() == 0) {
@@ -694,8 +691,7 @@
 
 	private List getWorkingSetsForId(String id) {
 		List result= new ArrayList();
-    	for (Iterator iter= workingSets.iterator(); iter.hasNext();) {
-    		IWorkingSet ws= (IWorkingSet)iter.next();
+		for (IWorkingSet ws : workingSets) {
     		if (id.equals(ws.getId())) {
 				result.add(ws);
 			}
@@ -800,8 +796,7 @@
 
 	@Override
 	public void removeExtension(IExtension extension, Object[] objects) {
-		for (int i = 0; i < objects.length; i++) {
-			Object object = objects[i];
+		for (Object object : objects) {
 			if (object instanceof IWorkingSetUpdater) {
 				removeUpdater((IWorkingSetUpdater)object);
 
@@ -859,8 +854,7 @@
 		// ideally this method would be in a static util class of some kind but
 		// we dont have any such beast for working sets and making one for one
 		// method is overkill.
-		for (int i = 0; i < workingSets.length; i++) {
-			final IWorkingSet workingSet = workingSets[i];
+		for (final IWorkingSet workingSet : workingSets) {
 			SafeRunner.run(new WorkingSetRunnable() {
 
 				@Override
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionExpression.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionExpression.java
index c14675a..fc6b486 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionExpression.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionExpression.java
@@ -163,9 +163,9 @@
 			}
 
 			list = new ArrayList(children.length);
-			for (int i = 0; i < children.length; i++) {
-				String tag = children[i].getName();
-				AbstractExpression expr = createExpression(children[i]);
+			for (IConfigurationElement configElement : children) {
+				String tag = configElement.getName();
+				AbstractExpression expr = createExpression(configElement);
 				if (EXP_TYPE_OBJECT_CLASS.equals(tag)) {
 					list.add(0, expr);
 				} else {
@@ -185,8 +185,8 @@
 					if (classNames == null) {
 						classNames = new ArrayList();
 					}
-					for (int i = 0; i < objectClasses.length; i++) {
-						classNames.add(objectClasses[i]);
+					for (String objectClass : objectClasses) {
+						classNames.add(objectClass);
 					}
 				}
 			}
@@ -328,8 +328,8 @@
 				return true;
 			}
 			Class[] superInterfaces = interfaceToCheck.getInterfaces();
-			for (int i = 0; i < superInterfaces.length; i++) {
-				if (checkInterfaceHierarchy(superInterfaces[i])) {
+			for (Class superInterface : superInterfaces) {
+				if (checkInterfaceHierarchy(superInterface)) {
 					return true;
 				}
 			}
@@ -389,8 +389,8 @@
 
 				// test all the interfaces the class implements
 				Class[] interfaces = clazz.getInterfaces();
-				for (int i = 0; i < interfaces.length; i++) {
-					if (checkInterfaceHierarchy(interfaces[i])) {
+				for (Class currentInterface : interfaces) {
+					if (checkInterfaceHierarchy(currentInterface)) {
 						return true;
 					}
 				}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionPresentation.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionPresentation.java
index a17c9c0..5e2b638 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionPresentation.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionPresentation.java
@@ -16,7 +16,6 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
 import org.eclipse.ui.SubActionBars;
@@ -97,9 +96,7 @@
         // Convert array to list.
         HashSet newList = new HashSet();
 
-        for (int i = 0; i < newArray.length; i++) {
-            IActionSetDescriptor descriptor = newArray[i];
-
+        for (IActionSetDescriptor descriptor : newArray) {
             newList.add(descriptor);
         }
         List oldList = new ArrayList(mapDescToRec.keySet());
@@ -126,9 +123,7 @@
         // Add new actions.
         ArrayList sets = new ArrayList();
 
-        for (int i = 0; i < newArray.length; i++) {
-            IActionSetDescriptor desc = newArray[i];
-
+		for (IActionSetDescriptor desc : newArray) {
             if (!mapDescToRec.containsKey(desc)) {
                 try {
                     SetRec rec;
@@ -199,8 +194,8 @@
      * @since 3.1
      */
     private boolean containsRegistration(Object[] existingRegistrations, IActionSetDescriptor set) {
-        for (int i = 0; i < existingRegistrations.length; i++) {
-            if (existingRegistrations[i] == set) {
+        for (Object existingRegistration : existingRegistrations) {
+            if (existingRegistration == set) {
 				return true;
 			}
         }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionSetActionBars.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionSetActionBars.java
index d7a464a..a7fe1b2 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionSetActionBars.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ActionSetActionBars.java
@@ -12,7 +12,6 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
-
 import org.eclipse.jface.action.ContributionItem;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.IContributionManager;
@@ -84,12 +83,10 @@
 		if (coolItemToolBarMgr == null) {
 			return;
 		}
-		IContributionItem[] items = coolItemToolBarMgr.getItems();
 		// remove the action set's items from its action bar, don't use
 		// removeAll since other items from other actions sets may be in
 		// the action bar's cool item
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem item = items[i];
+		for (IContributionItem item : coolItemToolBarMgr.getItems()) {
 			if (item instanceof PluginActionCoolBarContributionItem) {
 				PluginActionCoolBarContributionItem actionSetItem = (PluginActionCoolBarContributionItem) item;
 				if (actionSetItem.getActionSetId().equals(actionSetId)) {
@@ -284,9 +281,7 @@
 
 		// 1. Need to set visibility for all non-adjunct actions
 		if (coolItemToolBarMgr != null) {
-			IContributionItem[] items = coolItemToolBarMgr.getItems();
-			for (int i = 0; i < items.length; i++) {
-				IContributionItem item = items[i];
+			for (IContributionItem item : coolItemToolBarMgr.getItems()) {
 				if (item instanceof PluginActionCoolBarContributionItem) {
 					PluginActionCoolBarContributionItem actionSetItem = (PluginActionCoolBarContributionItem) item;
 					// Only if the action set id for this contribution item is
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AggregateWorkingSet.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AggregateWorkingSet.java
index bc8aa70..a9c0203 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AggregateWorkingSet.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AggregateWorkingSet.java
@@ -178,11 +178,8 @@
 			memento.putString(AbstractWorkingSet.TAG_AGGREGATE, Boolean.TRUE
 					.toString());
 
-			IWorkingSet[] localComponents = getComponentsInternal();
-			for (int i = 0; i < localComponents.length; i++) {
-				IWorkingSet componentSet = localComponents[i];
-				memento.createChild(IWorkbenchConstants.TAG_WORKING_SET,
-						componentSet.getName());
+			for (IWorkingSet workingSet : getComponentsInternal()) {
+				memento.createChild(IWorkbenchConstants.TAG_WORKING_SET, workingSet.getName());
 			}
 		}
 	}
@@ -240,8 +237,7 @@
 		} else if (property
 				.equals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE)) {
 			IWorkingSet[] localComponents = getComponentsInternal();
-			for (int i = 0; i < localComponents.length; i++) {
-				IWorkingSet set = localComponents[i];
+			for (IWorkingSet set : localComponents) {
 				if (set.equals(event.getNewValue())) {
 					constructElements(true);
 					break;
@@ -260,9 +256,8 @@
 				.getChildren(IWorkbenchConstants.TAG_WORKING_SET);
 		ArrayList list = new ArrayList(workingSetReferences.length);
 
-		for (int i = 0; i < workingSetReferences.length; i++) {
-			IMemento setReference = workingSetReferences[i];
-			String setId = setReference.getID();
+		for (IMemento memento : workingSetReferences) {
+			String setId = memento.getID();
 			IWorkingSet set = manager.getWorkingSet(setId);
 			if (set != null) {
 				list.add(set);
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ConfigurationInfo.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ConfigurationInfo.java
index f1c2938..b75b024 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ConfigurationInfo.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ConfigurationInfo.java
@@ -84,9 +84,7 @@
 				.getExtensionRegistry().getConfigurationElementsFor(
 						PlatformUI.PLUGIN_ID,
 						IWorkbenchRegistryConstants.PL_SYSTEM_SUMMARY_SECTIONS));
-		for (int i = 0; i < configElements.length; ++i) {
-			IConfigurationElement element = configElements[i];
-
+		for (IConfigurationElement element : configElements) {
 			Object obj = null;
 			try {
 				obj = WorkbenchPlugin.createExtension(element,
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorActionBars.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorActionBars.java
index 312b44c..82bd528 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorActionBars.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorActionBars.java
@@ -394,9 +394,7 @@
 		}
 		this.enabledAllowed = enabledAllowed;
 		if (coolItemToolBarMgr != null) {
-			IContributionItem[] items = coolItemToolBarMgr.getItems();
-			for (int i = 0; i < items.length; i++) {
-				IContributionItem item = items[i];
+			for (IContributionItem item : coolItemToolBarMgr.getItems()) {
 				if (item != null) {
 					item.update(IContributionManagerOverrides.P_ENABLED);
 				}
@@ -464,9 +462,7 @@
 
 		ICoolBarManager coolBarManager = getCastedParent().getCoolBarManager();
 		if ((coolItemToolBarMgr != null) && (coolBarManager != null)) {
-			IContributionItem[] items = coolItemToolBarMgr.getItems();
-			for (int i = 0; i < items.length; i++) {
-				IContributionItem item = items[i];
+			for (IContributionItem item : coolItemToolBarMgr.getItems()) {
 				item.setVisible(visible || !forceVisibility);
 				coolItemToolBarMgr.markDirty();
 				if (!coolBarManager.isDirty()) {
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorHistory.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorHistory.java
index 424e894..70b4172 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorHistory.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorHistory.java
@@ -13,7 +13,6 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
-
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.ui.IEditorDescriptor;
@@ -128,9 +127,8 @@
      * @param memento the memento to restore the mru history from
      */
     public IStatus restoreState(IMemento memento) {
-        IMemento[] mementos = memento.getChildren(IWorkbenchConstants.TAG_FILE);
-        for (int i = 0; i < mementos.length; i++) {
-            EditorHistoryItem item = new EditorHistoryItem(mementos[i]);
+		for (IMemento childMemento : memento.getChildren(IWorkbenchConstants.TAG_FILE)) {
+			EditorHistoryItem item = new EditorHistoryItem(childMemento);
             if (!"".equals(item.getName()) || !"".equals(item.getToolTipText())) { //$NON-NLS-1$ //$NON-NLS-2$
                 add(item, fifoList.size());
             }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorMenuManager.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorMenuManager.java
index c4b0f58..b2e8c2a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorMenuManager.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorMenuManager.java
@@ -38,9 +38,7 @@
          */
         public void updateEnabledAllowed() {
             // update the items in the map
-            IContributionItem[] items = EditorMenuManager.super.getItems();
-            for (int i = 0; i < items.length; i++) {
-                IContributionItem item = items[i];
+			for (IContributionItem item : EditorMenuManager.super.getItems()) {
                 item.update(IContributionManagerOverrides.P_ENABLED);
             }
             // update the wrapped menus
@@ -201,9 +199,8 @@
     }
 
     protected void getAllContributedActions(HashSet set) {
-        IContributionItem[] items = super.getItems();
-        for (int i = 0; i < items.length; i++) {
-			getAllContributedActions(set, items[i]);
+		for (IContributionItem item : super.getItems()) {
+			getAllContributedActions(set, item);
 		}
         if (wrappers == null) {
 			return;
@@ -216,9 +213,8 @@
 
     protected void getAllContributedActions(HashSet set, IContributionItem item) {
         if (item instanceof MenuManager) {
-            IContributionItem subItems[] = ((MenuManager) item).getItems();
-            for (int j = 0; j < subItems.length; j++) {
-				getAllContributedActions(set, subItems[j]);
+			for (IContributionItem subItem : ((MenuManager) item).getItems()) {
+				getAllContributedActions(set, subItem);
 			}
         } else if (item instanceof ActionContributionItem) {
             set.add(((ActionContributionItem) item).getAction());
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorSiteDragAndDropServiceImpl.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorSiteDragAndDropServiceImpl.java
index d124f0a..1ffacce 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorSiteDragAndDropServiceImpl.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorSiteDragAndDropServiceImpl.java
@@ -87,11 +87,11 @@
 			// Combine the two sets of transfers into one array
 			Transfer[] allTransfers = new Transfer[secondaryTransfers.length+primaryTransfers.length];
 			int curTransfer = 0;
-			for (int i = 0; i < primaryTransfers.length; i++) {
-				allTransfers[curTransfer++] = primaryTransfers[i];
+			for (Transfer primaryTransfer : primaryTransfers) {
+				allTransfers[curTransfer++] = primaryTransfer;
 			}
-			for (int i = 0; i < secondaryTransfers.length; i++) {
-				allTransfers[curTransfer++] = secondaryTransfers[i];
+			for (Transfer secondaryTransfer : secondaryTransfers) {
+				allTransfers[curTransfer++] = secondaryTransfer;
 			}
 			realDropTarget.setTransfer(allTransfers);
 
@@ -139,8 +139,8 @@
 		}
 
 		private boolean isSupportedType(Transfer[] transfers, TransferData transferType) {
-			for (int i = 0; i < transfers.length; i++) {
-				if (transfers[i].isSupportedType(transferType))
+			for (Transfer transfer : transfers) {
+				if (transfer.isSupportedType(transferType))
 					return true;
 			}
 			return false;
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ExtensionEventHandler.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ExtensionEventHandler.java
index 920989f..0c618f2 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ExtensionEventHandler.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ExtensionEventHandler.java
@@ -16,7 +16,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionDelta;
@@ -74,28 +73,28 @@
             // push action sets and perspectives to the top because incoming
             // actionSetPartAssociations and perspectiveExtensions may depend upon
             // them for their bindings.
-            for (int i = 0; i < delta.length; i++) {
-                id = delta[i].getExtensionPoint().getSimpleIdentifier();
-                if (delta[i].getKind() == IExtensionDelta.ADDED) {
+            for (IExtensionDelta extensionDelta : delta) {
+                id = extensionDelta.getExtensionPoint().getSimpleIdentifier();
+                if (extensionDelta.getKind() == IExtensionDelta.ADDED) {
                     if (id.equals(IWorkbenchRegistryConstants.PL_ACTION_SETS)) {
-						appearList.add(0, delta[i]);
+						appearList.add(0, extensionDelta);
 					} else if (!id.equals(IWorkbenchRegistryConstants.PL_PERSPECTIVES)
                             && !id.equals(IWorkbenchRegistryConstants.PL_VIEWS)
                             && !id.equals(IWorkbenchRegistryConstants.PL_ACTION_SETS)) {
 						appearList.add(appearList.size() - numPerspectives,
-                                delta[i]);
+                                extensionDelta);
 					}
                 } else {
-                    if (delta[i].getKind() == IExtensionDelta.REMOVED) {
+                    if (extensionDelta.getKind() == IExtensionDelta.REMOVED) {
                         if (id
                                 .equals(IWorkbenchRegistryConstants.PL_ACTION_SET_PART_ASSOCIATIONS)) {
-                            revokeList.add(0, delta[i]);
+                            revokeList.add(0, extensionDelta);
                             numActionSetPartAssoc++;
                         } else if (id
                                 .equals(IWorkbenchRegistryConstants.PL_PERSPECTIVES)) {
-							revokeList.add(numActionSetPartAssoc, delta[i]);
+							revokeList.add(numActionSetPartAssoc, extensionDelta);
 						} else {
-							revokeList.add(delta[i]);
+							revokeList.add(extensionDelta);
 						}
                     }
                 }
@@ -150,9 +149,8 @@
         ThemeRegistryReader reader = new ThemeRegistryReader();
         reader.setRegistry((ThemeRegistry) WorkbenchPlugin.getDefault()
                 .getThemeRegistry());
-        IConfigurationElement[] elements = ext.getConfigurationElements();
-        for (int i = 0; i < elements.length; i++) {
-			reader.readElement(elements[i]);
+		for (IConfigurationElement configElement : ext.getConfigurationElements()) {
+			reader.readElement(configElement);
 		}
 
         Collection fonts = reader.getFontDefinitions();
@@ -169,9 +167,8 @@
         ThemeRegistry registry = (ThemeRegistry) WorkbenchPlugin.getDefault()
                 .getThemeRegistry();
         reader.setRegistry(registry);
-        IConfigurationElement[] elements = ext.getConfigurationElements();
-        for (int i = 0; i < elements.length; i++) {
-			reader.readElement(elements[i]);
+		for (IConfigurationElement configElement : ext.getConfigurationElements()) {
+			reader.readElement(configElement);
 		}
 
         Collection colors = reader.getColorDefinitions();
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/LegacyResourceSupport.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/LegacyResourceSupport.java
index 9ba743e..2c29959 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/LegacyResourceSupport.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/LegacyResourceSupport.java
@@ -340,8 +340,8 @@
      * @since 3.1
      */
     public static boolean isResourceType(String objectClassName) {
-        for (int i = 0; i < resourceClassNames.length; i++) {
-            if (resourceClassNames[i].equals(objectClassName)) {
+        for (String resourceClassName : resourceClassNames) {
+            if (resourceClassName.equals(objectClassName)) {
                 return true;
             }
         }
@@ -376,8 +376,8 @@
 			return true;
 		}
 		Class[] interfaces= clazz.getInterfaces();
-		for (int i= 0; i < interfaces.length; i++) {
-			if (isInstanceOf(interfaces[i], type)) {
+		for (Class currentInterface : interfaces) {
+			if (isInstanceOf(currentInterface, type)) {
 				return true;
 			}
 		}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistory.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistory.java
index 7dc7463..42e6131 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistory.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistory.java
@@ -898,8 +898,8 @@
 
     private void disposeHistoryForTabs() {
     	Object[] keys = perTabHistoryMap.keySet().toArray();
-    	for (int i = 0; i < keys.length; i++) {
-			disposeHistoryForTab(keys[i]);
+    	for (Object key : keys) {
+			disposeHistoryForTab(key);
 		}
     }
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistoryAction.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistoryAction.java
index f83a1a4..5b4bebe 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistoryAction.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/NavigationHistoryAction.java
@@ -76,8 +76,8 @@
     			if (recreateMenu) {
 					Menu m = (Menu) e.widget;
 					MenuItem[] items = m.getItems();
-					for (int i = 0; i < items.length; i++) {
-						items[i].dispose();
+					for (MenuItem item : items) {
+						item.dispose();
 					}
 					fillMenu(m);
 				}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ObjectActionContributor.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ObjectActionContributor.java
index 32be10f..bf5ec37 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ObjectActionContributor.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ObjectActionContributor.java
@@ -387,8 +387,7 @@
 	public String toString() {
     	StringBuffer buffer = new StringBuffer();
     	IConfigurationElement[] children = config.getChildren();
-    	for (int i = 0; i < children.length; i++) {
-			IConfigurationElement element = children[i];
+    	for (IConfigurationElement element : children) {
 			String label = element.getAttribute(IWorkbenchRegistryConstants.ATT_LABEL);
 			if(label != null) {
 				buffer.append(label);
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/PreferencePersistence.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/PreferencePersistence.java
index 9c79c98..08e7eb9 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/PreferencePersistence.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/PreferencePersistence.java
@@ -271,9 +271,7 @@
 		}
 
 		final Collection parameters = new ArrayList();
-		for (int i = 0; i < parameterMementos.length; i++) {
-			final IMemento parameterMemento = parameterMementos[i];
-
+		for (final IMemento parameterMemento : parameterMementos) {
 			// Read out the id.
 			final String id = parameterMemento.getString(ATT_ID);
 			if ((id == null) || (id.length() == 0)) {
@@ -287,8 +285,7 @@
 			try {
 				final IParameter[] commandParameters = command.getParameters();
 				if (parameters != null) {
-					for (int j = 0; j < commandParameters.length; j++) {
-						final IParameter currentParameter = commandParameters[j];
+					for (final IParameter currentParameter : commandParameters) {
 						if (Util.equals(currentParameter.getId(), id)) {
 							parameter = currentParameter;
 							break;
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/RegistryPersistence.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/RegistryPersistence.java
index ac38787..4e66fea 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/RegistryPersistence.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/RegistryPersistence.java
@@ -385,9 +385,7 @@
 		}
 
 		final Collection parameters = new ArrayList();
-		for (int i = 0; i < parameterElements.length; i++) {
-			final IConfigurationElement parameterElement = parameterElements[i];
-
+		for (final IConfigurationElement parameterElement : parameterElements) {
 			// Read out the id.
 			final String id = parameterElement.getAttribute(ATT_ID);
 			if ((id == null) || (id.length() == 0)) {
@@ -402,8 +400,7 @@
 			try {
 				final IParameter[] commandParameters = command.getParameters();
 				if (parameters != null) {
-					for (int j = 0; j < commandParameters.length; j++) {
-						final IParameter currentParameter = commandParameters[j];
+					for (final IParameter currentParameter : commandParameters) {
 						if (Util.equals(currentParameter.getId(), id)) {
 							parameter = currentParameter;
 							break;
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SlaveEvaluationService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SlaveEvaluationService.java
index e3130f1..0736e71 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SlaveEvaluationService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SlaveEvaluationService.java
@@ -13,7 +13,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-
 import org.eclipse.core.expressions.Expression;
 import org.eclipse.core.expressions.IEvaluationContext;
 import org.eclipse.jface.util.IPropertyChangeListener;
@@ -125,26 +124,21 @@
 	@Override
 	public void dispose() {
 		if (!evaluationReferences.isEmpty()) {
-			Object[] array = evaluationReferences.toArray();
-			for (int i = 0; i < array.length; i++) {
-				parentService
-						.removeEvaluationListener((IEvaluationReference) array[i]);
+			for (Object evaluationListener : evaluationReferences.toArray()) {
+				parentService.removeEvaluationListener((IEvaluationReference) evaluationListener);
 			}
 		}
 		if (!serviceListeners.isEmpty()) {
-			Object[] array = serviceListeners.toArray();
-			for (int i = 0; i < array.length; i++) {
-				parentService
-						.removeServiceListener((IPropertyChangeListener) array[i]);
+			for (Object serviceListener : serviceListeners.toArray()) {
+				parentService.removeServiceListener((IPropertyChangeListener) serviceListener);
 			}
 			serviceListeners.clear();
 		}
 		// Remove any "resource", like listeners, that were associated
 		// with this service.
 		if (!sourceProviders.isEmpty()) {
-			Object[] array = sourceProviders.toArray();
-			for (int i = 0; i < array.length; i++) {
-				parentService.removeSourceProvider((ISourceProvider) array[i]);
+			for (Object sourceProvider : sourceProviders.toArray()) {
+				parentService.removeSourceProvider((ISourceProvider) sourceProvider);
 			}
 			sourceProviders.clear();
 		}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourcePriorityNameMapping.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourcePriorityNameMapping.java
index eea1826..17296ea 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourcePriorityNameMapping.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourcePriorityNameMapping.java
@@ -149,8 +149,7 @@
 
 		// Add all of the reference variables.
 		final String[] sourceNames = info.getAccessedVariableNames();
-		for (int i = 0; i < sourceNames.length; i++) {
-			final String sourceName = sourceNames[i];
+		for (final String sourceName : sourceNames) {
 			sourcePriority |= getMapping(sourceName);
 		}
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourceProviderService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourceProviderService.java
index d64291e..0ce8fbe 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourceProviderService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/SourceProviderService.java
@@ -16,7 +16,6 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-
 import org.eclipse.ui.AbstractSourceProvider;
 import org.eclipse.ui.ISourceProvider;
 import org.eclipse.ui.services.IDisposable;
@@ -84,9 +83,7 @@
 			throw new NullPointerException("The source provider cannot be null"); //$NON-NLS-1$
 		}
 
-		final String[] sourceNames = sourceProvider.getProvidedSourceNames();
-		for (int i = 0; i < sourceNames.length; i++) {
-			final String sourceName = sourceNames[i];
+		for (final String sourceName : sourceProvider.getProvidedSourceNames()) {
 			sourceProvidersByName.put(sourceName, sourceProvider);
 		}
 		sourceProviders.add(sourceProvider);
@@ -97,18 +94,16 @@
 			throw new NullPointerException("The source provider cannot be null"); //$NON-NLS-1$
 		}
 
-		final String[] sourceNames = sourceProvider.getProvidedSourceNames();
-		for (int i = 0; i < sourceNames.length; i++) {
-			sourceProvidersByName.remove(sourceNames[i]);
+		for (String sourceName : sourceProvider.getProvidedSourceNames()) {
+			sourceProvidersByName.remove(sourceName);
 		}
 		sourceProviders.remove(sourceProvider);
 	}
 
 	public final void readRegistry() {
-		AbstractSourceProvider[] sp = WorkbenchServiceRegistry.getRegistry().getSourceProviders();
-		for (int i = 0; i < sp.length; i++) {
-			sp[i].initialize(locator);
-			registerProvider(sp[i]);
+		for (AbstractSourceProvider sourceProvider : WorkbenchServiceRegistry.getRegistry().getSourceProviders()) {
+			sourceProvider.initialize(locator);
+			registerProvider(sourceProvider);
 		}
 	}
 }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/WorkbenchServiceRegistry.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/WorkbenchServiceRegistry.java
index 992fb2a..0abd1da 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/WorkbenchServiceRegistry.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/services/WorkbenchServiceRegistry.java
@@ -136,8 +136,8 @@
 							handle, IExtensionTracker.REF_WEAK);
 
 			    	List serviceNames = new ArrayList();
-					for (int j = 0; j < serviceNameElements.length; j++) {
-						String serviceName = serviceNameElements[j].getAttribute(IWorkbenchRegistryConstants.ATTR_SERVICE_CLASS);
+					for (IConfigurationElement configElement : serviceNameElements) {
+						String serviceName = configElement.getAttribute(IWorkbenchRegistryConstants.ATTR_SERVICE_CLASS);
 						if (factories.containsKey(serviceName)) {
 							WorkbenchPlugin.log("Factory already exists for " //$NON-NLS-1$
 									+ serviceName);
@@ -166,27 +166,23 @@
 	public AbstractSourceProvider[] getSourceProviders() {
 		ArrayList providers = new ArrayList();
 		IExtensionPoint ep = getExtensionPoint();
-		IConfigurationElement[] elements = ep.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i].getName().equals(
+		for (IConfigurationElement configElement : ep.getConfigurationElements()) {
+			if (configElement.getName().equals(
 					IWorkbenchRegistryConstants.TAG_SOURCE_PROVIDER)) {
 				try {
-					Object sourceProvider = elements[i]
+					Object sourceProvider = configElement
 							.createExecutableExtension(IWorkbenchRegistryConstants.ATTR_PROVIDER);
 					if (!(sourceProvider instanceof AbstractSourceProvider)) {
-						String attributeName = elements[i]
-								.getAttribute(IWorkbenchRegistryConstants.ATTR_PROVIDER);
+						String attributeName = configElement.getAttribute(IWorkbenchRegistryConstants.ATTR_PROVIDER);
 						final String message = "Source Provider '" + //$NON-NLS-1$
 								attributeName
 								+ "' should extend AbstractSourceProvider"; //$NON-NLS-1$
-						final IStatus status = new Status(IStatus.ERROR,
-								WorkbenchPlugin.PI_WORKBENCH, message);
+						final IStatus status = new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH, message);
 						WorkbenchPlugin.log(status);
 						continue;
 					}
 					providers.add(sourceProvider);
-					processVariables(elements[i]
-							.getChildren(IWorkbenchRegistryConstants.TAG_VARIABLE));
+					processVariables(configElement.getChildren(IWorkbenchRegistryConstants.TAG_VARIABLE));
 				} catch (CoreException e) {
 					StatusManager.getManager().handle(e.getStatus());
 				}
@@ -205,14 +201,12 @@
 	};
 
 	private void processVariables(IConfigurationElement[] children) {
-		for (int i = 0; i < children.length; i++) {
-			String name = children[i]
-					.getAttribute(IWorkbenchRegistryConstants.ATT_NAME);
+		for (IConfigurationElement configElement : children) {
+			String name = configElement.getAttribute(IWorkbenchRegistryConstants.ATT_NAME);
 			if (name == null || name.length() == 0) {
 				continue;
 			}
-			String level = children[i]
-					.getAttribute(IWorkbenchRegistryConstants.ATT_PRIORITY_LEVEL);
+			String level = configElement.getAttribute(IWorkbenchRegistryConstants.ATT_PRIORITY_LEVEL);
 			if (level == null || level.length() == 0) {
 				level = WORKBENCH_LEVEL;
 			} else {
@@ -241,8 +235,7 @@
 
 	@Override
 	public void removeExtension(IExtension extension, Object[] objects) {
-		for (int i = 0; i < objects.length; i++) {
-			Object object = objects[i];
+		for (Object object : objects) {
 			if (object instanceof ServiceFactoryHandle) {
 				ServiceFactoryHandle handle = (ServiceFactoryHandle) object;
 				Set locatorSet = handle.serviceLocators.keySet();
@@ -252,15 +245,14 @@
 					int l2 = loc2.getService(IWorkbenchLocationService.class).getServiceLevel();
 					return l1 < l2 ? -1 : (l1 > l2 ? 1 : 0);
 				});
-				for (int j = 0; j < locators.length; j++) {
-					ServiceLocator serviceLocator = locators[j];
+				for (ServiceLocator locator : locators) {
+					ServiceLocator serviceLocator = locator;
 					if (!serviceLocator.isDisposed()) {
 						serviceLocator.unregisterServices(handle.serviceNames);
 					}
 				}
 				handle.factory = null;
-				for (int j = 0; j < handle.serviceNames.length; j++) {
-					String serviceName = handle.serviceNames[j];
+				for (String serviceName : handle.serviceNames) {
 					if (factories.get(serviceName) == handle) {
 						factories.remove(serviceName);
 					}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/splash/SplashHandlerFactory.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/splash/SplashHandlerFactory.java
index 6a429cc..40aea16 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/splash/SplashHandlerFactory.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/splash/SplashHandlerFactory.java
@@ -13,7 +13,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;
@@ -55,12 +54,10 @@
 		IExtension[] extensions = point.getExtensions();
 		Map idToSplash = new HashMap(); // String->ConfigurationElement
 		String[] targetId = new String[1];
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement[] children = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < children.length; j++) {
-				AbstractSplashHandler handler = processElement(children[j],
-						idToSplash, targetId, product);
+		for (IExtension extension : extensions) {
+			IConfigurationElement[] children = extension.getConfigurationElements();
+			for (IConfigurationElement element : children) {
+				AbstractSplashHandler handler = processElement(element, idToSplash, targetId, product);
 				if (handler != null)
 					return handler;
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/DefaultDetailsArea.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/DefaultDetailsArea.java
index 03500bc..c07fdb0 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/DefaultDetailsArea.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/DefaultDetailsArea.java
@@ -144,17 +144,17 @@
 				keyList.add(ks);
 				KeySequence sequence = KeySequence.getInstance(keyList);
 				boolean partialMatch = false;
-				for (int i = 0; i < ts.length; i++) {
-					if (ts[i].equals(sequence)) {
+				for (TriggerSequence triggerSequence : ts) {
+					if (triggerSequence.equals(sequence)) {
 						copyToClipboard();
 						keyList.clear();
 						break;
 					}
-					if (ts[i].startsWith(sequence, false)) {
+					if (triggerSequence.startsWith(sequence, false)) {
 						partialMatch = true;
 					}
-					for (int j = 0; j < ts[i].getTriggers().length; j++) {
-						if (ts[i].getTriggers()[j].equals(ks)) {
+					for (int j = 0; j < triggerSequence.getTriggers().length; j++) {
+						if (triggerSequence.getTriggers()[j].equals(ks)) {
 							partialMatch = true;
 						}
 					}
@@ -305,9 +305,8 @@
 			appendNewLine(text, message, nesting, lineNumber[0]++);
 		}
 
-		IStatus[] children = status.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			populateList(text, children[i], nesting + 1, lineNumber);
+		for (IStatus child : status.getChildren()) {
+			populateList(text, child, nesting + 1, lineNumber);
 		}
 	}
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StackTraceSupportArea.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StackTraceSupportArea.java
index afa21d1..058ecb7 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StackTraceSupportArea.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StackTraceSupportArea.java
@@ -150,9 +150,8 @@
 			return;
 		}
 		list.add(t.toString());
-		StackTraceElement[] ste = t.getStackTrace();
-		for (int i = 0; i < ste.length; i++) {
-			list.add(ste[i].toString());
+		for (StackTraceElement stackTraceElement : t.getStackTrace()) {
+			list.add(stackTraceElement.toString());
 		}
 		if (t.getCause() != null) {
 			list.add(WorkbenchMessages.StackTraceSupportArea_CausedBy);
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerDescriptor.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerDescriptor.java
index c078e9b..60f2250 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerDescriptor.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerDescriptor.java
@@ -13,7 +13,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.ui.IPluginContribution;
@@ -69,13 +68,9 @@
 
 			Map params = new HashMap();
 
-			for (int i = 0; i < parameters.length; i++) {
-				params
-						.put(
-								parameters[i]
-										.getAttribute(IWorkbenchRegistryConstants.ATT_NAME),
-								parameters[i]
-										.getAttribute(IWorkbenchRegistryConstants.ATT_VALUE));
+			for (IConfigurationElement configElement : parameters) {
+				params.put(configElement.getAttribute(IWorkbenchRegistryConstants.ATT_NAME),
+						configElement.getAttribute(IWorkbenchRegistryConstants.ATT_VALUE));
 			}
 
 			statusHandler.setParams(params);
@@ -90,15 +85,11 @@
 	 * @return prefix parameter
 	 */
 	public String getPrefix() {
-		IConfigurationElement parameters[] = configElement
-				.getChildren(IWorkbenchRegistryConstants.TAG_PARAMETER);
+		IConfigurationElement parameters[] = configElement.getChildren(IWorkbenchRegistryConstants.TAG_PARAMETER);
 
-		for (int i = 0; i < parameters.length; i++) {
-			if (parameters[i]
-					.getAttribute(IWorkbenchRegistryConstants.ATT_NAME).equals(
-							PREFIX)) {
-				prefix = parameters[i]
-						.getAttribute(IWorkbenchRegistryConstants.ATT_VALUE);
+		for (IConfigurationElement configElement : parameters) {
+			if (configElement.getAttribute(IWorkbenchRegistryConstants.ATT_NAME).equals(PREFIX)) {
+				prefix = configElement.getAttribute(IWorkbenchRegistryConstants.ATT_VALUE);
 			}
 		}
 		return prefix;
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerRegistry.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerRegistry.java
index 3defa44..78eafd6 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerRegistry.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/StatusHandlerRegistry.java
@@ -14,7 +14,6 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;
@@ -65,8 +64,8 @@
 		statusHandlerDescriptorsMap = new StatusHandlerDescriptorsMap();
 
 		// initial population
-		for (int i = 0; i < extensions.length; i++) {
-			addExtension(tracker, extensions[i]);
+		for (IExtension extension : extensions) {
+			addExtension(tracker, extension);
 		}
 
 		tracker.registerHandler(this, ExtensionTracker
@@ -95,21 +94,17 @@
 
 	@Override
 	public void addExtension(IExtensionTracker tracker, IExtension extension) {
-		IConfigurationElement[] configElements = extension
-				.getConfigurationElements();
-		for (int j = 0; j < configElements.length; j++) {
-			if (configElements[j].getName().equals(TAG_STATUSHANDLER)) {
-				StatusHandlerDescriptor descriptor = new StatusHandlerDescriptor(
-						configElements[j]);
-				tracker.registerObject(extension, descriptor,
-						IExtensionTracker.REF_STRONG);
+		IConfigurationElement[] configElements = extension.getConfigurationElements();
+		for (IConfigurationElement configElement : configElements) {
+			if (configElement.getName().equals(TAG_STATUSHANDLER)) {
+				StatusHandlerDescriptor descriptor = new StatusHandlerDescriptor(configElement);
+				tracker.registerObject(extension, descriptor, IExtensionTracker.REF_STRONG);
 				statusHandlerDescriptors.add(descriptor);
-			} else if (configElements[j].getName().equals(
+			} else if (configElement.getName().equals(
 					TAG_STATUSHANDLER_PRODUCTBINDING)) {
 				StatusHandlerProductBindingDescriptor descriptor = new StatusHandlerProductBindingDescriptor(
-						configElements[j]);
-				tracker.registerObject(extension, descriptor,
-						IExtensionTracker.REF_STRONG);
+						configElement);
+				tracker.registerObject(extension, descriptor, IExtensionTracker.REF_STRONG);
 				productBindingDescriptors.add(descriptor);
 			}
 		}
@@ -118,11 +113,11 @@
 
 	@Override
 	public void removeExtension(IExtension extension, Object[] objects) {
-		for (int i = 0; i < objects.length; i++) {
-			if (objects[i] instanceof StatusHandlerDescriptor) {
-				statusHandlerDescriptors.remove(objects[i]);
-			} else if (objects[i] instanceof StatusHandlerProductBindingDescriptor) {
-				productBindingDescriptors.remove(objects[i]);
+		for (Object object : objects) {
+			if (object instanceof StatusHandlerDescriptor) {
+				statusHandlerDescriptors.remove(object);
+			} else if (object instanceof StatusHandlerProductBindingDescriptor) {
+				productBindingDescriptors.remove(object);
 			}
 		}
 		buildHandlersStructure();
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/WorkbenchStatusDialogManagerImpl.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/WorkbenchStatusDialogManagerImpl.java
index 71d773c..f9f5c28 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/WorkbenchStatusDialogManagerImpl.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/statushandlers/WorkbenchStatusDialogManagerImpl.java
@@ -97,8 +97,8 @@
 		if (children == null || children.length == 0) {
 			return status.matches(mask) || (handleOKStatuses && status.isOK());
 		}
-		for (int i = 0; i < children.length; i++) {
-			if (children[i].matches(mask)) {
+		for (IStatus child : children) {
+			if (child.matches(mask)) {
 				return true;
 			}
 		}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/CascadingTheme.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/CascadingTheme.java
index 6ed9989..b5c4cc53 100755
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/CascadingTheme.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/CascadingTheme.java
@@ -11,7 +11,6 @@
 package org.eclipse.ui.internal.themes;
 
 import java.util.Set;
-
 import org.eclipse.core.commands.common.EventManager;
 import org.eclipse.jface.resource.ColorRegistry;
 import org.eclipse.jface.resource.FontRegistry;
@@ -51,9 +50,8 @@
      * @param event
      */
     protected void fire(PropertyChangeEvent event) {
-        Object[] listeners = getListeners();
-        for (int i = 0; i < listeners.length; i++) {
-            ((IPropertyChangeListener) listeners[i]).propertyChange(event);
+		for (Object listener : getListeners()) {
+			((IPropertyChangeListener) listener).propertyChange(event);
         }
     }
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java
index 8887b6c..c6ca5a3 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java
@@ -153,14 +153,12 @@
 				defs = registry.getFonts();
 			}
 
-			for (int i = 0; i < defs.length; i++) {
-				if (id.equals(defs[i].getDefaultsTo())
+			for (IHierarchalThemeElementDefinition elementDefinition : defs) {
+				if (id.equals(elementDefinition.getDefaultsTo())
 						&& ColorsAndFontsPreferencePage.equals(
-								((ICategorizedThemeElementDefinition) def)
-										.getCategoryId(),
-								((ICategorizedThemeElementDefinition) defs[i])
-										.getCategoryId())) {
-					list.add(defs[i]);
+								((ICategorizedThemeElementDefinition) def).getCategoryId(),
+								((ICategorizedThemeElementDefinition) elementDefinition).getCategoryId())) {
+					list.add(elementDefinition);
 				}
 			}
 			return list.toArray();
@@ -170,13 +168,11 @@
             ArrayList list = new ArrayList();
 
             if (categoryId != null) {
-                ThemeElementCategory[] categories = registry.getCategories();
-                for (int i = 0; i < categories.length; i++) {
-                    if (categoryId.equals(categories[i].getParentId())) {
-                        Set bindings = themeRegistry
-                                .getPresentationsBindingsFor(categories[i]);
+				for (ThemeElementCategory category : registry.getCategories()) {
+					if (categoryId.equals(category.getParentId())) {
+						Set bindings = themeRegistry.getPresentationsBindingsFor(category);
 						if (bindings == null) {
-							list.add(categories[i]);
+							list.add(category);
 						}
                     }
                 }
@@ -224,10 +220,8 @@
 
         private boolean parentIsInSameCategory(ColorDefinition definition) {
             String defaultsTo = definition.getDefaultsTo();
-            ColorDefinition[] defs = registry.getColors();
-            for (int i = 0; i < defs.length; i++) {
-                if (defs[i].getId().equals(defaultsTo)
-                        && ColorsAndFontsPreferencePage.equals(defs[i]
+			for (ColorDefinition colorDef : registry.getColors()) {
+				if (colorDef.getId().equals(defaultsTo) && ColorsAndFontsPreferencePage.equals(colorDef
                                 .getCategoryId(), definition.getCategoryId())) {
 					return true;
 				}
@@ -237,10 +231,8 @@
 
         private boolean parentIsInSameCategory(FontDefinition definition) {
             String defaultsTo = definition.getDefaultsTo();
-            FontDefinition[] defs = registry.getFonts();
-            for (int i = 0; i < defs.length; i++) {
-                if (defs[i].getId().equals(defaultsTo)
-                        && ColorsAndFontsPreferencePage.equals(defs[i]
+			for (FontDefinition fontDef : registry.getFonts()) {
+				if (fontDef.getId().equals(defaultsTo) && ColorsAndFontsPreferencePage.equals(fontDef
                                 .getCategoryId(), definition.getCategoryId())) {
 					return true;
 				}
@@ -293,13 +285,11 @@
 				defs = registry.getFonts();
 			}
 
-			for (int i = 0; i < defs.length; i++) {
-				if (id.equals(defs[i].getDefaultsTo())
+			for (IHierarchalThemeElementDefinition elementDefinition : defs) {
+				if (id.equals(elementDefinition.getDefaultsTo())
 						&& ColorsAndFontsPreferencePage.equals(
-								((ICategorizedThemeElementDefinition) def)
-										.getCategoryId(),
-								((ICategorizedThemeElementDefinition) defs[i])
-										.getCategoryId())) {
+								((ICategorizedThemeElementDefinition) def).getCategoryId(),
+								((ICategorizedThemeElementDefinition) elementDefinition).getCategoryId())) {
 					return true;
 				}
 			}
@@ -312,16 +302,13 @@
             ArrayList list = new ArrayList();
             Object[] uncatChildren = getCategoryChildren(null);
             list.addAll(Arrays.asList(uncatChildren));
-            ThemeElementCategory[] categories = ((IThemeRegistry) inputElement)
-                    .getCategories();
-            for (int i = 0; i < categories.length; i++) {
-                if (categories[i].getParentId() == null) {
-                    Set bindings = themeRegistry
-                            .getPresentationsBindingsFor(categories[i]);
+			for (ThemeElementCategory category : ((IThemeRegistry) inputElement).getCategories()) {
+                if (category.getParentId() == null) {
+					Set bindings = themeRegistry.getPresentationsBindingsFor(category);
 					if (bindings == null) {
-						Object[] children = getChildren(categories[i]);
+						Object[] children = getChildren(category);
 						if (children != null && children.length > 0) {
-							list.add(categories[i]);
+							list.add(category);
 						}
 					}
                 }
@@ -428,8 +415,8 @@
                 Font font = (Font) fonts.get(baseFont);
                 if (font == null) {
                     FontData[] data = baseFont.getFontData();
-                    for (int i = 0; i < data.length; i++) {
-                        data[i].setHeight(parentHeight);
+                    for (FontData fontData : data) {
+                        fontData.setHeight(parentHeight);
                     }
                     font = new Font(display, data);
 
@@ -1127,9 +1114,9 @@
 
         Arrays.sort(sorted, new IThemeRegistry.HierarchyComparator(colors));
 
-        for (int i = 0; i < sorted.length; i++) {
-            if (id.equals(sorted[i].getDefaultsTo()))
-				list.add(sorted[i]);
+        for (ColorDefinition colorDefinition : sorted) {
+            if (id.equals(colorDefinition.getDefaultsTo()))
+				list.add(colorDefinition);
         }
         return (ColorDefinition[]) list.toArray(new ColorDefinition[list.size()]);
     }
@@ -1144,9 +1131,9 @@
 
         Arrays.sort(sorted, new IThemeRegistry.HierarchyComparator(fonts));
 
-        for (int i = 0; i < sorted.length; i++) {
-            if (id.equals(sorted[i].getDefaultsTo()))
-				list.add(sorted[i]);
+        for (FontDefinition fontDefinition : sorted) {
+            if (id.equals(fontDefinition.getDefaultsTo()))
+				list.add(fontDefinition);
         }
         return (FontDefinition[]) list.toArray(new FontDefinition[list.size()]);
     }
@@ -1466,8 +1453,8 @@
 
         Arrays.sort(definitionsCopy, new IThemeRegistry.HierarchyComparator(definitions));
 
-        for (int i = 0; i < definitionsCopy.length; i++) {
-			resetColor(definitionsCopy[i], true);
+        for (ColorDefinition colorDefinition : definitionsCopy) {
+			resetColor(colorDefinition, true);
 		}
     }
 
@@ -1511,8 +1498,8 @@
 
         Arrays.sort(definitionsCopy, new IThemeRegistry.HierarchyComparator(definitions));
 
-        for (int i = 0; i < definitionsCopy.length; i++) {
-			resetFont(definitionsCopy[i], true);
+        for (FontDefinition fontDefinition : definitionsCopy) {
+			resetFont(fontDefinition, true);
 		}
     }
 
@@ -1616,22 +1603,19 @@
      * 		identifier.
      */
     private void setDescendantRegistryValues(ColorDefinition definition, RGB newRGB) {
-        ColorDefinition[] children = getDescendantColors(definition);
-
-        for (int i = 0; i < children.length; i++) {
-            if (isDefault(children[i])) {
-                setDescendantRegistryValues(children[i], newRGB);
-                setRegistryValue(children[i], newRGB);
-                colorValuesToSet.put(children[i].getId(), newRGB);
+		for (ColorDefinition colorDefinition : getDescendantColors(definition)) {
+			if (isDefault(colorDefinition)) {
+				setDescendantRegistryValues(colorDefinition, newRGB);
+				setRegistryValue(colorDefinition, newRGB);
+				colorValuesToSet.put(colorDefinition.getId(), newRGB);
             }
         }
     }
 
 	private void setDescendantRegistryValues(FontDefinition definition, FontData[] datas, boolean reset) {
-        FontDefinition[] children = getDescendantFonts(definition);
-        for (int i = 0; i < children.length; i++) {
-            if (isDefault(children[i])) {
-				setFontPreferenceValue(children[i], datas, reset);
+		for (FontDefinition fontDefinition : getDescendantFonts(definition)) {
+			if (isDefault(fontDefinition)) {
+				setFontPreferenceValue(fontDefinition, datas, reset);
             }
         }
     }
@@ -1791,8 +1775,8 @@
 			return;
 
 		List elements = new ArrayList(expandedElementIDs.length);
-		for (int i = 0; i < expandedElementIDs.length; i++) {
-			IThemeElementDefinition def = findElementFromMarker(expandedElementIDs[i]);
+		for (String expandedElementID : expandedElementIDs) {
+			IThemeElementDefinition def = findElementFromMarker(expandedElementID);
 			if (def != null)
 				elements.add(def);
 		}
@@ -1838,8 +1822,7 @@
 		List elementIds = new ArrayList(elements.length);
 
 		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < elements.length; i++) {
-			Object object = elements[i];
+		for (Object object : elements) {
 			appendMarkerToBuffer(buffer, object);
 
 			if (buffer.length() != 0) {
@@ -1975,12 +1958,12 @@
 
 		// recalculate sample text
 		StringBuffer tmp = new StringBuffer();
-		for (int i = 0; i < fontData.length; i++) {
-			tmp.append(fontData[i].getName());
+		for (FontData currentFontData : fontData) {
+			tmp.append(currentFontData.getName());
 			tmp.append(' ');
-			tmp.append(fontData[i].getHeight());
+			tmp.append(currentFontData.getHeight());
 
-			int style = fontData[i].getStyle();
+			int style = currentFontData.getStyle();
 			if ((style & SWT.BOLD) != 0) {
 				tmp.append(' ');
 				tmp.append(RESOURCE_BUNDLE.getString("boldFont")); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.java
index cc16d1b..83b977b 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.java
@@ -149,18 +149,15 @@
                  * @param fd the new FontData for defaulted fonts
                  */
                 private void processDefaultsTo(String key, FontData[] fd) {
-                    FontDefinition[] defs = WorkbenchPlugin.getDefault()
-                            .getThemeRegistry().getFontsFor(getId());
-                    for (int i = 0; i < defs.length; i++) {
-                        String defaultsTo = defs[i].getDefaultsTo();
+					FontDefinition[] defs = WorkbenchPlugin.getDefault().getThemeRegistry().getFontsFor(getId());
+                    for (FontDefinition fontDefinition : defs) {
+                        String defaultsTo = fontDefinition.getDefaultsTo();
                         if (defaultsTo != null && defaultsTo.equals(key)) {
-                            IPreferenceStore store = WorkbenchPlugin
-                                    .getDefault().getPreferenceStore();
+							IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
                             if (store.isDefault(ThemeElementHelper
-                                    .createPreferenceKey(Theme.this, defs[i]
-                                            .getId()))) {
-                                getFontRegistry().put(defs[i].getId(), fd);
-                                processDefaultsTo(defs[i].getId(), fd);
+									.createPreferenceKey(Theme.this, fontDefinition.getId()))) {
+                                getFontRegistry().put(fontDefinition.getId(), fd);
+                                processDefaultsTo(fontDefinition.getId(), fd);
                             }
                         }
                     }
@@ -173,18 +170,15 @@
                  * @param rgb the new RGB value for defaulted colors
                  */
                 private void processDefaultsTo(String key, RGB rgb) {
-                    ColorDefinition[] defs = WorkbenchPlugin.getDefault()
-                            .getThemeRegistry().getColorsFor(getId());
-                    for (int i = 0; i < defs.length; i++) {
-                        String defaultsTo = defs[i].getDefaultsTo();
+					ColorDefinition[] defs = WorkbenchPlugin.getDefault().getThemeRegistry().getColorsFor(getId());
+                    for (ColorDefinition colorDefinition : defs) {
+                        String defaultsTo = colorDefinition.getDefaultsTo();
                         if (defaultsTo != null && defaultsTo.equals(key)) {
-                            IPreferenceStore store = WorkbenchPlugin
-                                    .getDefault().getPreferenceStore();
-                            if (store.isDefault(ThemeElementHelper
-                                    .createPreferenceKey(Theme.this, defs[i]
-                                            .getId()))) {
-                                getColorRegistry().put(defs[i].getId(), rgb);
-                                processDefaultsTo(defs[i].getId(), rgb);
+							IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
+							if (store.isDefault(
+									ThemeElementHelper.createPreferenceKey(Theme.this, colorDefinition.getId()))) {
+                                getColorRegistry().put(colorDefinition.getId(), rgb);
+                                processDefaultsTo(colorDefinition.getId(), rgb);
                             }
                         }
                     }
@@ -255,10 +249,9 @@
     }
 
     private void firePropertyChange(PropertyChangeEvent event) {
-        Object[] listeners = getListeners();
-        for (int i = 0; i < listeners.length; i++) {
-            ((IPropertyChangeListener) listeners[i]).propertyChange(event);
-        }
+		for (Object listener : getListeners()) {
+			((IPropertyChangeListener) listener).propertyChange(event);
+		}
     }
 
     @Override
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java
index 9d5dc90..efbaa7f 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java
@@ -64,14 +64,13 @@
         Arrays.sort(copyOfDefinitions, new IThemeRegistry.HierarchyComparator(
                 definitions));
 
-        for (int i = 0; i < copyOfDefinitions.length; i++) {
-            FontDefinition definition = copyOfDefinitions[i];
+        for (FontDefinition definition : copyOfDefinitions) {
             installFont(definition, theme, store, true);
         }
 
         if (defaults != null) {
-            for (int i = 0; i < defaults.length; i++) {
-                installFont(defaults[i], theme, store, false);
+            for (FontDefinition fontDef : defaults) {
+                installFont(fontDef, theme, store, false);
             }
         }
     }
@@ -124,11 +123,8 @@
 
 			//If in high contrast, ignore the defaults in jface and use the default (system) font.
 			//This is a hack to address bug #205474. See bug #228207 for a future fix.
-			FontData[] fontData = JFaceResources.getFontRegistry().getFontData(
-				display.getHighContrast()
-					? JFaceResources.DEFAULT_FONT
-					: id
-			);
+			FontData[] fontData = JFaceResources.getFontRegistry()
+					.getFontData(display.getHighContrast() ? JFaceResources.DEFAULT_FONT : id);
 			defaultFont = registry.bestDataArray(fontData, display);
         }
 
@@ -188,14 +184,13 @@
         Arrays.sort(copyOfDefinitions, new IThemeRegistry.HierarchyComparator(
                 definitions));
 
-        for (int i = 0; i < copyOfDefinitions.length; i++) {
-            ColorDefinition definition = copyOfDefinitions[i];
+        for (ColorDefinition definition : copyOfDefinitions) {
             installColor(definition, theme, store, true);
         }
 
         if (defaults != null) {
-            for (int i = 0; i < defaults.length; i++) {
-                installColor(defaults[i], theme, store, false);
+			for (ColorDefinition colorDef : defaults) {
+				installColor(colorDef, theme, store, false);
             }
         }
     }
@@ -264,8 +259,7 @@
 		System.arraycopy(allDefs, 0, copy, 0, allDefs.length);
 
         Arrays.sort(allDefs, new IThemeRegistry.HierarchyComparator(copy));
-        for (int i = 0; i < allDefs.length; i++) {
-            IHierarchalThemeElementDefinition def = allDefs[i];
+        for (IHierarchalThemeElementDefinition def : allDefs) {
             if (def.getDefaultsTo() != null) {
                 if (set.contains(def.getDefaultsTo())) {
 					set.add(def);
@@ -367,8 +361,7 @@
     public static String[] splitPropertyName(Theme theme, String property) {
     	IThemeDescriptor[] descriptors = WorkbenchPlugin.getDefault()
 				.getThemeRegistry().getThemes();
-		for (int i = 0; i < descriptors.length; i++) {
-			IThemeDescriptor themeDescriptor = descriptors[i];
+		for (IThemeDescriptor themeDescriptor : descriptors) {
 			String id = themeDescriptor.getId();
 			if (property.startsWith(id + '.')) { // the property starts with
 													// a known theme ID -
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistry.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistry.java
index 230b889..92ae00b 100755
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistry.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistry.java
@@ -172,11 +172,10 @@
      */
     private IThemeElementDefinition[] overlay(IThemeElementDefinition[] defs,
             IThemeElementDefinition[] overrides) {
-        for (int i = 0; i < overrides.length; i++) {
-            int idx = Arrays.binarySearch(defs, overrides[i],
-                    IThemeRegistry.ID_COMPARATOR);
+        for (IThemeElementDefinition override : overrides) {
+			int idx = Arrays.binarySearch(defs, override, IThemeRegistry.ID_COMPARATOR);
             if (idx >= 0) {
-                defs[idx] = overlay(defs[idx], overrides[i]);
+                defs[idx] = overlay(defs[idx], override);
             }
         }
         return defs;
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistryReader.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistryReader.java
index 0eb5d17..78e2805 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistryReader.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeRegistryReader.java
@@ -210,8 +210,7 @@
         String osname = Platform.getOS();
         String wsname = Platform.getWS();
 
-        for (int i = 0; i < elements.length; i++) {
-            IConfigurationElement element = elements[i];
+        for (IConfigurationElement element : elements) {
             String elementOs = element.getAttribute(IWorkbenchRegistryConstants.ATT_OS);
             String elementWs = element.getAttribute(IWorkbenchRegistryConstants.ATT_WS);
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java
index 54f1ad0..9731913 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java
@@ -133,8 +133,8 @@
 
 		// copy the font values from preferences.
 		FontRegistry jfaceFonts = JFaceResources.getFontRegistry();
-		for (Iterator i = jfaceFonts.getKeySet().iterator(); i.hasNext();) {
-			String key = (String) i.next();
+		for (Object fontRegistryKey : jfaceFonts.getKeySet()) {
+			String key = (String) fontRegistryKey;
 			defaultThemeFontRegistry.put(key, jfaceFonts.getFontData(key));
 		}
 
@@ -181,9 +181,8 @@
 
         IThemeDescriptor[] themeDescriptors = getThemeRegistry().getThemes();
 
-       	for (int i=0; i < themeDescriptors.length; i++) {
-        	IThemeDescriptor themeDescriptor = themeDescriptors[i];
-    		ITheme theme = (ITheme) themes.get(themeDescriptor);
+       	for (IThemeDescriptor themeDescriptor : themeDescriptors) {
+        	ITheme theme = (ITheme) themes.get(themeDescriptor);
     		//If theme is in our themes table then its already been populated
     		if (theme != null) {
                 ColorDefinition[] colorDefinitions = themeDescriptor.getColors();
@@ -228,10 +227,8 @@
 	}
 
 	protected void firePropertyChange(PropertyChangeEvent event) {
-		Object[] listeners = getListeners();
-
-		for (int i = 0; i < listeners.length; i++) {
-			((IPropertyChangeListener) listeners[i]).propertyChange(event);
+		for (Object listener : getListeners()) {
+			((IPropertyChangeListener) listener).propertyChange(event);
 		}
 	}
 
@@ -352,18 +349,16 @@
 			{
 				ColorRegistry jfaceColors = JFaceResources.getColorRegistry();
 				ColorRegistry themeColors = currentTheme.getColorRegistry();
-				for (Iterator i = themeColors.getKeySet().iterator(); i
-						.hasNext();) {
-					String key = (String) i.next();
+				for (Object themeColorKey : themeColors.getKeySet()) {
+					String key = (String) themeColorKey;
 					jfaceColors.put(key, themeColors.getRGB(key));
 				}
 			}
 			{
 				FontRegistry jfaceFonts = JFaceResources.getFontRegistry();
 				FontRegistry themeFonts = currentTheme.getFontRegistry();
-				for (Iterator i = themeFonts.getKeySet().iterator(); i
-						.hasNext();) {
-					String key = (String) i.next();
+				for (Object themeFontKey : themeFonts.getKeySet()) {
+					String key = (String) themeFontKey;
 					jfaceFonts.put(key, themeFonts.getFontData(key));
 				}
 			}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviour.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviour.java
index 17dc542..287062a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviour.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviour.java
@@ -123,8 +123,8 @@
 	public Font createInvisibleEditorsFont(Display display, Font originalFont) {
         FontData fontData[] = originalFont.getFontData();
         // Adding the bold attribute
-        for (int i = 0; i < fontData.length; i++) {
-			fontData[i].setStyle(fontData[i].getStyle() | SWT.BOLD);
+        for (FontData element : fontData) {
+			element.setStyle(element.getStyle() | SWT.BOLD);
 		}
         return new Font(display, fontData);
 	}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviourMRU.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviourMRU.java
index 70f65b2..01db412 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviourMRU.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/TabBehaviourMRU.java
@@ -52,16 +52,16 @@
 			List<IEditorReference> keep = new ArrayList<>(Arrays.asList(editors));
 			int extra = length - page.getEditorReuseThreshold();
 			// look for extra editors that should be closed
-			for (int i = 0; i < editors.length; i++) {
+			for (IEditorReference editor : editors) {
 				if (extra == 0) {
 					break;
 				}
 
-				if (editors[i].isPinned() || editors[i].isDirty()) {
+				if (editor.isPinned() || editor.isDirty()) {
 					continue;
 				}
 
-				refs.add(editors[i]);
+				refs.add(editor);
 				extra--;
 			}
 
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/Tweaklets.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/Tweaklets.java
index 6d2d266..cdaff9b 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/Tweaklets.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/tweaklets/Tweaklets.java
@@ -100,17 +100,16 @@
 		IConfigurationElement[] elements = Platform
 				.getExtensionRegistry()
 				.getConfigurationElementsFor("org.eclipse.ui.internalTweaklets"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
+		for (IConfigurationElement element : elements) {
 			if (definition.tweakClass.getName().equals(
-					elements[i].getAttribute("definition"))) { //$NON-NLS-1$
+					element.getAttribute("definition"))) { //$NON-NLS-1$
 				try {
-					Object tweaklet = elements[i].createExecutableExtension("implementation"); //$NON-NLS-1$
+					Object tweaklet = element.createExecutableExtension("implementation"); //$NON-NLS-1$
 					tweaklets.put(definition, tweaklet);
 					return tweaklet;
 				} catch (CoreException e) {
 					StatusManager.getManager().handle(
-							StatusUtil.newStatus(IStatus.ERROR,
-									"Error with extension " + elements[i], e), //$NON-NLS-1$
+							StatusUtil.newStatus(IStatus.ERROR, "Error with extension " + element, e), //$NON-NLS-1$
 							StatusManager.LOG);
 				}
 			}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Descriptors.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Descriptors.java
index a2932e2..1d8f017 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Descriptors.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Descriptors.java
@@ -282,9 +282,7 @@
             ResourceMethod[] data = (ResourceMethod[]) list.toArray(new ResourceMethod[list.size()]);
 
             // Clear out the images
-            for (int i = 0; i < data.length; i++) {
-                ResourceMethod method = data[i];
-
+            for (ResourceMethod method : data) {
                 method.dispose();
             }
         }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Util.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Util.java
index 0aa55eb..2f4b1ef 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Util.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/util/Util.java
@@ -644,11 +644,11 @@
 	 */
 	public static String createList(Object[] items) {
 		String list = null;
-		for (int i = 0; i < items.length; i++) {
+		for (Object item : items) {
 			if(list == null) {
-				list = items[i].toString();
+				list = item.toString();
 			} else {
-				list = createList(list, items[i].toString());
+				list = createList(list, item.toString());
 			}
 		}
 		return safeString(list);
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/AbstractExtensionWizardRegistry.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/AbstractExtensionWizardRegistry.java
index 1ccb6c6..c452541 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/AbstractExtensionWizardRegistry.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/AbstractExtensionWizardRegistry.java
@@ -46,8 +46,8 @@
 		reader.setInitialCollection(getWizardElements());
 		IConfigurationElement[] configurationElements = extension
 				.getConfigurationElements();
-		for (int i = 0; i < configurationElements.length; i++) {
-			reader.readElement(configurationElements[i]);
+		for (IConfigurationElement configurationElement : configurationElements) {
+			reader.readElement(configurationElement);
 		}
 		// no need to reset the wizard elements - getWizardElements will parse
 		// the
@@ -133,16 +133,13 @@
 	private void registerWizards(WizardCollectionElement collection) {
 		registerWizards(collection.getWorkbenchWizardElements());
 
-		WizardCollectionElement[] collections = collection
-				.getCollectionElements();
-		for (int i = 0; i < collections.length; i++) {
-			IConfigurationElement configurationElement = collections[i]
-					.getConfigurationElement();
+		for (WizardCollectionElement wizardCollectionElement : collection.getCollectionElements()) {
+			IConfigurationElement configurationElement = wizardCollectionElement.getConfigurationElement();
 			if (configurationElement != null) {
 				register(configurationElement.getDeclaringExtension(),
-						collections[i]);
+						wizardCollectionElement);
 			}
-			registerWizards(collections[i]);
+			registerWizards(wizardCollectionElement);
 		}
 	}
 
@@ -153,9 +150,9 @@
 	 *            the wizards to register
 	 */
 	private void registerWizards(WorkbenchWizardElement[] wizards) {
-		for (int i = 0; i < wizards.length; i++) {
-			register(wizards[i].getConfigurationElement()
-					.getDeclaringExtension(), wizards[i]);
+		for (WorkbenchWizardElement wizard : wizards) {
+			register(wizard.getConfigurationElement()
+					.getDeclaringExtension(), wizard);
 		}
 	}
 
@@ -165,8 +162,7 @@
 				getExtensionPointFilter().getUniqueIdentifier())) {
 			return;
 		}
-		for (int i = 0; i < objects.length; i++) {
-			Object object = objects[i];
+		for (Object object : objects) {
 			if (object instanceof WizardCollectionElement) {
 				// TODO: should we move child wizards to the "other" node?
 				WizardCollectionElement collection = (WizardCollectionElement) object;
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesImportPage1.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesImportPage1.java
index 68d91c0..51e3f4d 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesImportPage1.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesImportPage1.java
@@ -86,10 +86,8 @@
                 IPreferenceFilter[] matches = service.matches(prefs, filters);
                 PreferenceTransferElement[] returnTransfers = new PreferenceTransferElement[matches.length];
                 int index = 0;
-                for (int i = 0; i < matches.length; i++) {
-                    IPreferenceFilter filter = matches[i];
-                    for (int j = 0; j < transfers.length; j++) {
-                        PreferenceTransferElement element = transfers[j];
+                for (IPreferenceFilter filter : matches) {
+                    for (PreferenceTransferElement element : transfers) {
                         if (element.getFilter().equals(filter)) {
 							returnTransfers[index++] = element;
 						}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesPage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesPage.java
index 90eb9c1..0fa8ca3 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesPage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/wizards/preferences/WizardPreferencesPage.java
@@ -859,10 +859,10 @@
 						.getArray(TRANSFER_PREFERENCES_NAMES_ID);
 				if (preferenceIds != null) {
 					PreferenceTransferElement[] transfers = getTransfers();
-					for (int i = 0; i < transfers.length; i++) {
-						for (int j = 0; j < preferenceIds.length; j++) {
-							if (transfers[i].getID().equals(preferenceIds[j])) {
-								viewer.setChecked(transfers[i], true);
+					for (PreferenceTransferElement transfer : transfers) {
+						for (String preferenceId : preferenceIds) {
+							if (transfer.getID().equals(preferenceId)) {
+								viewer.setChecked(transfer, true);
 								break;
 							}
 						}
@@ -880,8 +880,8 @@
 			if (directoryNames != null) {
 				// destination
 				setDestinationValue(directoryNames[0]);
-				for (int i = 0; i < directoryNames.length; i++) {
-					addDestinationItem(directoryNames[i]);
+				for (String directoryName : directoryNames) {
+					addDestinationItem(directoryName);
 				}
 
 				String current = settings.get(STORE_DESTINATION_ID);
