diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTClass.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTClass.java
index e54221e..a642b92 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTClass.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTClass.java
@@ -37,8 +37,8 @@
 			if (file.exists()) {
 				return file.getAbsolutePath();
 			}
-			for (String import1 : imports) {
-				file = new File(basePath + import1.replace('.', '/') + "/" + simpleName + ".java");
+			for (int i = 0; i < imports.length; i++) {
+				file = new File(basePath + imports[i].replace('.', '/') + "/" + simpleName + ".java");
 				if (file.exists()) {
 					return file.getAbsolutePath();				
 				}
@@ -53,10 +53,10 @@
 			if (file.exists()) {
 				return packageName + "." + simpleName;				
 			}
-			for (String import1 : imports) {
-				file = new File(basePath + import1.replace('.', '/') + "/" + simpleName + ".java");
+			for (int i = 0; i < imports.length; i++) {
+				file = new File(basePath + imports[i].replace('.', '/') + "/" + simpleName + ".java");
 				if (file.exists()) {
-					return import1 + "." + simpleName;				
+					return imports[i] + "." + simpleName;				
 				}
 			}
 			return simpleName;
@@ -99,7 +99,8 @@
 
 	FieldDeclaration[] fields = type.getFields();
 	List<ASTField> fid = new ArrayList<>();
-	for (FieldDeclaration field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		FieldDeclaration field = fields[i];
 		List<VariableDeclarationFragment> fragments = field.fragments();
 		for (VariableDeclarationFragment fragment : fragments) {
 			fid.add(new ASTField(this, source, field, fragment));
@@ -108,9 +109,9 @@
 	this.fields = fid.toArray(new ASTField[fid.size()]);
 	MethodDeclaration[] methods = type.getMethods();
 	List<ASTMethod> mid = new ArrayList<>();
-	for (MethodDeclaration method : methods) {
-		if (method.getReturnType2() == null) continue;
-		mid.add(new ASTMethod(this, source, method));
+	for (int i = 0; i < methods.length; i++) {
+		if (methods[i].getReturnType2() == null) continue;
+		mid.add(new ASTMethod(this, source, methods[i]));
 	}
 	this.methods = mid.toArray(new ASTMethod[mid.size()]);
 }
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTField.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTField.java
index 4427e75..1f490d2 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTField.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTField.java
@@ -100,7 +100,7 @@
 @Override
 public String getCast() {
 	String cast = ((String)getParam("cast")).trim();
-	if (!cast.isEmpty()) {
+	if (cast.length() > 0) {
 		if (!cast.startsWith("(")) cast = "(" + cast;
 		if (!cast.endsWith(")")) cast = cast + ")";
 	}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTMethod.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTMethod.java
index c251dc5..a8cd8ce 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTMethod.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTMethod.java
@@ -64,7 +64,8 @@
 	paramTypes64 = new ASTType[parameters.size()];
 	this.parameters = new ASTParameter[paramTypes.length];
 	int i = 0;
-	for (SingleVariableDeclaration param : parameters) {
+	for (Iterator<SingleVariableDeclaration> iterator = parameters.iterator(); iterator.hasNext(); i++) {
+		SingleVariableDeclaration param = iterator.next();
 		paramTypes[i] = new ASTType(declaringClass.resolver, param.getType(), param.getExtraDimensions());
 		paramTypes64[i] = paramTypes[i];
 		this.parameters[i] = new ASTParameter(this, i, param.getName().getIdentifier());
@@ -115,7 +116,8 @@
 	boolean result = true;
 	String name = getName();
 	JNIMethod[] methods = declaringClass.getDeclaredMethods();
-	for (JNIMethod mth : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod mth = methods[i];
 		if ((mth.getModifiers() & Modifier.NATIVE) != 0 &&
 			this != mth && !this.equals(mth) &&
 			name.equals(mth.getName()))
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/AbstractItem.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/AbstractItem.java
index bf40e00..181d347 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/AbstractItem.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/AbstractItem.java
@@ -31,7 +31,8 @@
 	Set<String> set = params.keySet();
 	String[] keys = set.toArray(new String[set.size()]);
 	Arrays.sort(keys);
-	for (String key : keys) {
+	for (int j = 0; j < keys.length; j++) {
+		String key = keys[j];
 		Object value = params.get(key);
 		String valueStr = "";
 		if (value instanceof String) {
@@ -76,8 +77,8 @@
 @Override
 public boolean getFlag(String flag) {
 	String[] flags = getFlags();
-	for (String flag2 : flags) {
-		if (flag2.equals(flag)) return true;
+	for (int i = 0; i < flags.length; i++) {
+		if (flags[i].equals(flag)) return true;
 	}
 	return false;
 }
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupClass.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupClass.java
index fa768cd..8f4cc1c 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupClass.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupClass.java
@@ -99,7 +99,8 @@
 	if (entries == null) {
 		entries = new String[0];
 	}
-	for (String entry : entries) {
+	for (int i = 0; i < entries.length; i++) {
+		String entry = entries[i];
 		File f = new File(file, entry);
 		if (!f.isDirectory()) {
 			if (f.getAbsolutePath().endsWith(".java")) {
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupConstants.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupConstants.java
index d0192c7..69b58d0 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupConstants.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -40,7 +40,8 @@
 
 public void generate(JNIField[] fields) {
 	sort(fields);
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if ((field.getModifiers() & Modifier.FINAL) == 0) continue;
 		generate(field);
 	}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupNatives.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupNatives.java
index 293f759..db66465 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupNatives.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/CleanupNatives.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -29,7 +29,8 @@
 
 public void generate(JNIMethod[] methods) {
 	sort(methods);	
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		generate(method);
 	}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ConstantsGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ConstantsGenerator.java
index 385371f..8bce4db 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ConstantsGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ConstantsGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.swt.tools.internal;
 
-import java.lang.reflect.*;
+import java.lang.reflect.Modifier;
 
 public class ConstantsGenerator extends JNIGenerator {
 
@@ -23,7 +23,8 @@
 public void generate(JNIField[] fields) {
 	sort(fields);
 	outputln("int main() {");
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if ((field.getModifiers() & Modifier.FINAL) == 0) continue;
 		generate(field);
 	}
@@ -51,7 +52,8 @@
 	}
 	try {
 		ConstantsGenerator gen = new ConstantsGenerator();
-		for (String clazzName : args) {
+		for (int i = 0; i < args.length; i++) {
+			String clazzName = args[i];
 			Class<?> clazz = Class.forName(clazzName);
 			gen.generate(new ReflectClass(clazz));
 		}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java
index 23694e7..1c457c1 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java
@@ -49,7 +49,8 @@
 }
 
 public void generate(JNIField[] fields) {
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		int mods = field.getModifiers();
 		if ((mods & Modifier.PUBLIC) == 0) continue;
 		if ((mods & Modifier.FINAL) != 0) continue;
@@ -69,7 +70,8 @@
 }
 
 public void generate(JNIMethod[] methods) {
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		generate(method);
 	}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGenerator.java
index 83557aa..110167a 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGenerator.java
@@ -131,7 +131,8 @@
 		StringBuilder buffer = new StringBuilder();
 		buffer.append(function);
 		buffer.append("__");
-		for (JNIType paramType : paramTypes) {
+		for (int i = 0; i < paramTypes.length; i++) {
+			JNIType paramType = paramTypes[i];
 			buffer.append(toC(paramType.getTypeSignature(false)));
 		}
 		return buffer.toString();
@@ -216,7 +217,8 @@
 	generateAutoGenNote();
 	generateIncludes();
 	sort(classes);
-	for (JNIClass clazz : classes) {
+	for (int i = 0; i < classes.length; i++) {
+		JNIClass clazz = classes[i];
 		if (getGenerate(clazz)) generate(clazz);
 		if (progress != null) progress.step();
 	}
@@ -236,7 +238,8 @@
 }
 
 public boolean getCPP() {
-	for (JNIClass clazz : classes) {
+	for (int i = 0; i < classes.length; i++) {
+		JNIClass clazz = classes[i];
 		if (clazz.getFlag(FLAG_CPP)) {
 			return true;
 		}
@@ -269,7 +272,8 @@
 }
 
 public boolean getM() {
-	for (JNIClass clazz : classes) {
+	for (int i = 0; i < classes.length; i++) {
+		JNIClass clazz = classes[i];
 		if (clazz.getFlag(FLAG_M)) {
 			return true;
 		}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorApp.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorApp.java
index 6125715..8a9ed87 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorApp.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorApp.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -226,9 +226,11 @@
 	this.progress = progress;
 	if (progress != null) {
 		int nativeCount = 0;
-		for (JNIClass clazz : natives) {
+		for (int i = 0; i < natives.length; i++) {
+			JNIClass clazz = natives[i];
 			JNIMethod[] methods = clazz.getDeclaredMethods();
-			for (JNIMethod method : methods) {
+			for (int j = 0; j < methods.length; j++) {
+				JNIMethod method = methods[j];
 				if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 				nativeCount++;
 			}
@@ -297,7 +299,8 @@
 				if(entries == null) {
 					entries = new String[0];
 				}
-				for (String entry : entries) {
+				for (int i = 0; i < entries.length; i++) {
+					String entry = entries[i];
 					File f = new File(file, entry);
 					if (!f.isDirectory()) {
 						if (f.getAbsolutePath().endsWith(".class")) {
@@ -351,7 +354,8 @@
 	if (files == null) {
 		files = new File[0];
 	}
-	for (File file : files) {
+	for (int i = 0; i < files.length; i++) {
+		File file = files[i];
 		try {
 			String path = file.getAbsolutePath().replace('\\', '/');
 			if (path.endsWith(".java")) {
@@ -377,9 +381,11 @@
 public JNIClass[] getNativesClasses(JNIClass[] classes) {
 	if (mainClass == null) return new JNIClass[0];
 	List<JNIClass> result = new ArrayList<>();
-	for (JNIClass clazz : classes) {
+	for (int i = 0; i < classes.length; i++) {
+		JNIClass clazz = classes[i];
 		JNIMethod[] methods = clazz.getDeclaredMethods();
-		for (JNIMethod method : methods) {
+		for (int j = 0; j < methods.length; j++) {
+			JNIMethod method = methods[j];
 			int mods = method.getModifiers();
 			if ((mods & Modifier.NATIVE) != 0) {
 				result.add(clazz);
@@ -404,7 +410,8 @@
 		}
 		JNIField[] fields = clazz.getDeclaredFields();
 		boolean hasPublicFields = false;
-		for (JNIField field : fields) {
+		for (int j = 0; j < fields.length; j++) {
+			JNIField field = fields[j];
 			int mods = field.getModifiers();
 			if ((mods & Modifier.PUBLIC) != 0 && (mods & Modifier.STATIC) == 0) {
 				hasPublicFields = true;
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorAppUI.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorAppUI.java
index 21274bd..7a0834b 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorAppUI.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/JNIGeneratorAppUI.java
@@ -152,7 +152,8 @@
 	shell.setCursor(cursor);
 	shell.setEnabled(false);
 	Control[] children = actionsPanel.getChildren();
-	for (Control child : children) {
+	for (int i = 0; i < children.length; i++) {
+		Control child = children[i];
 		if (child instanceof Button) child.setEnabled(false);				
 	}
 	boolean showProgress = true;
@@ -200,7 +201,8 @@
 	while (!done[0]) {
 		if (!display.readAndDispatch()) display.sleep();
 	}
-	for (Control child : children) {
+	for (int i = 0; i < children.length; i++) {
+		Control child = children[i];
 		if (child instanceof Button) child.setEnabled(true);				
 	}
 	if (showProgress) {
@@ -238,7 +240,8 @@
 	TableItem[] selection = membersLt.getSelection();
 	JNIMethod[] methods = new JNIMethod[selection.length];
 	int count = 0;
-	for (TableItem item : selection) {
+	for (int i = 0; i < selection.length; i++) {
+		TableItem item = selection [i];
 		Object data = item.getData();
 		if (data instanceof JNIMethod) {
 			methods[count++] = (JNIMethod)data;
@@ -256,7 +259,8 @@
 	TableItem[] selection = membersLt.getSelection();
 	JNIField[] fields = new JNIField[selection.length];
 	int count = 0;
-	for (TableItem item : selection) {
+	for (int i = 0; i < selection.length; i++) {
+		TableItem item = selection [i];
 		Object data = item.getData();
 		if (data instanceof JNIField) {
 			fields[count++] = (JNIField)data;
@@ -911,7 +915,8 @@
 String getFlagsString(String[] flags) {
 	if (flags.length == 0) return "";
 	StringBuilder buffer = new StringBuilder();
-	for (String flag : flags) {
+	for (int j = 0; j < flags.length; j++) {
+		String flag = flags[j];
 		if (buffer.length() != 0) buffer.append(", ");
 		buffer.append(flag);
 	}
@@ -953,7 +958,8 @@
 		item.setChecked(clazz.getGenerate());
 	}
 	TableColumn[] columns = classesLt.getColumns();
-	for (TableColumn column : columns) {
+	for (int i = 0; i < columns.length; i++) {
+		TableColumn column = columns[i];
 		column.pack();
 	}
 	classesLt.setSelection(mainIndex);
@@ -963,7 +969,8 @@
 	membersLt.removeAll();
 	membersLt.setHeaderVisible(false);
 	TableColumn[] columns = membersLt.getColumns();
-	for (TableColumn column : columns) {
+	for (int i = 0; i < columns.length; i++) {
+		TableColumn column = columns[i];
 		column.dispose();
 	}
 	int[] indices = classesLt.getSelectionIndices();
@@ -972,7 +979,8 @@
 	JNIClass clazz = (JNIClass)classItem.getData();
 	boolean hasNatives = false;
 	JNIMethod[] methods = clazz.getDeclaredMethods();
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		int mods = method.getModifiers();
 		if (hasNatives =((mods & Modifier.NATIVE) != 0)) break;
 	}
@@ -990,7 +998,8 @@
 		column.setText("Exclude");
 		*/
 		JNIGenerator.sort(methods);
-		for (JNIMethod method : methods) {
+		for (int i = 0; i < methods.length; i++) {
+			JNIMethod method = methods[i];
 			if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 			TableItem item = new TableItem(membersLt, SWT.NONE);
 			item.setData(method);
@@ -1017,7 +1026,8 @@
 		column.setText("Exclude");
 		*/
 		JNIField[] fields = clazz.getDeclaredFields();	
-		for (JNIField field : fields) {
+		for (int i = 0; i < fields.length; i++) {
+			JNIField field = fields[i];
 			int mods = field.getModifiers(); 
 			if (((mods & Modifier.PUBLIC) == 0) ||
 				((mods & Modifier.FINAL) != 0) ||
@@ -1035,7 +1045,8 @@
 		}
 	}
 	columns = membersLt.getColumns();
-	for (TableColumn column : columns) {
+	for (int i = 0; i < columns.length; i++) {
+		TableColumn column = columns[i];
 		column.pack();
 	}
 	membersLt.setHeaderVisible(true);
@@ -1065,7 +1076,8 @@
 		item.setText(PARAM_FLAGS_COLUMN, getFlagsString(param.getFlags()));
 	}
 	TableColumn[] columns = paramsLt.getColumns();
-	for (TableColumn column : columns) {
+	for (int i = 0; i < columns.length; i++) {
+		TableColumn column = columns[i];
 		column.pack();
 	}
 	paramsLt.setRedraw(true);
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/MetaDataGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/MetaDataGenerator.java
index 284516f..44f58a3 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/MetaDataGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/MetaDataGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -33,7 +33,8 @@
 }
 
 public void generate(JNIField[] fields) {
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		int mods = field.getModifiers();
 		if ((mods & Modifier.PUBLIC) == 0) continue;
 		if ((mods & Modifier.FINAL) != 0) continue;
@@ -53,7 +54,8 @@
 
 public void generate(JNIMethod[] methods) {
 	sort(methods);
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		generate(method);
 		outputln();
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
index c8583e5..f4ae947 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -72,7 +72,8 @@
 
 public void generate(JNIMethod[] methods) {
 	sort(methods);	
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		generate(method);
 		if (progress != null) progress.step();
@@ -222,7 +223,8 @@
 
 void generateExcludes(JNIMethod[] methods) {
 	HashSet<String> excludes = new HashSet<>();
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		String exclude = method.getExclude();
 		if (exclude.length() != 0) {
@@ -231,7 +233,8 @@
 	}
 	for (String exclude: excludes) {
 		outputln(exclude);
-		for (JNIMethod method : methods) {
+		for (int i = 0; i < methods.length; i++) {
+			JNIMethod method = methods[i];
 			if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 			String methodExclude = method.getExclude();
 			if (exclude.equals(methodExclude)) {
@@ -520,7 +523,8 @@
 boolean generateGetters(JNIMethod method, JNIParameter[] params) {
 	boolean genFailTag = false;
 	int criticalCount = 0;
-	for (JNIParameter param : params) {
+	for (int i = 0; i < params.length; i++) {
+		JNIParameter param = params[i];
 		if (!isCritical(param)) {
 			genFailTag |= generateGetParameter(method, param, false, 1);
 		} else {
@@ -528,7 +532,8 @@
 		}
 	}
 	if (criticalCount != 0) {
-		for (JNIParameter param : params) {
+		for (int i = 0; i < params.length; i++) {
+			JNIParameter param = params[i];
 			if (isCritical(param)) {
 				genFailTag |= generateGetParameter(method, param, true, 2);
 			}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectField.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectField.java
index da66896..6cc20a8 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectField.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectField.java
@@ -97,7 +97,7 @@
 @Override
 public String getCast() {
 	String cast = ((String)getParam("cast")).trim();
-	if (!cast.isEmpty()) {
+	if (cast.length() > 0) {
 		if (!cast.startsWith("(")) cast = "(" + cast;
 		if (!cast.endsWith(")")) cast = cast + ")";
 	}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectMethod.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectMethod.java
index e8a68ed..aef0caf 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectMethod.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectMethod.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2015 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -128,7 +128,8 @@
 	boolean result = true;
 	String name = getName();
 	JNIMethod[] methods = declaringClass.getDeclaredMethods();
-	for (JNIMethod mth : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod mth = methods[i];
 		if ((mth.getModifiers() & Modifier.NATIVE) != 0 &&
 			this != mth && !this.equals(mth) &&
 			name.equals(mth.getName()))
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/SizeofGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/SizeofGenerator.java
index a56ea3f..872a31c 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/SizeofGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/SizeofGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.swt.tools.internal;
 
-import java.lang.reflect.*;
+import java.lang.reflect.Modifier;
 
 public class SizeofGenerator extends JNIGenerator {
 
@@ -36,7 +36,8 @@
 
 public void generate(JNIField[] fields) {
 	sort(fields);	
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if ((field.getModifiers() & Modifier.FINAL) == 0) continue;
 		generate(field);
 	}
@@ -57,7 +58,8 @@
 	}
 	try {
 		SizeofGenerator gen = new SizeofGenerator();
-		for (String clazzName : args) {
+		for (int i = 0; i < args.length; i++) {
+			String clazzName = args[i];
 			Class<?> clazz = Class.forName(clazzName);
 			gen.generate(new ReflectClass(clazz));
 		}
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StatsGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StatsGenerator.java
index 8ccab69..f6d766b 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StatsGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StatsGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.swt.tools.internal;
 
-import java.lang.reflect.*;
+import java.lang.reflect.Modifier;
 
 public class StatsGenerator extends JNIGenerator {
 
@@ -110,7 +110,8 @@
 	output(className);
 	outputln("_nativeFunctionNames[] = {");
 	sort(methods);
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		String function = getFunctionName(method), function64 = getFunctionName(method, method.getParameterTypes64());
 		if (!function.equals(function64)) {
@@ -192,7 +193,8 @@
 void generateFunctionEnum(JNIMethod[] methods) {
 	if (methods.length == 0) return;
 	outputln("typedef enum {");
-	for (JNIMethod method : methods) {
+	for (int i = 0; i < methods.length; i++) {
+		JNIMethod method = methods[i];
 		if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
 		String function = getFunctionName(method), function64 = getFunctionName(method, method.getParameterTypes64());
 		if (!function.equals(function64)) {
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java
index f58d9c9..bc8d30c 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -80,7 +80,8 @@
 
 void generateExcludes(JNIClass[] classes) {
 	HashSet<String> excludes = new HashSet<>();
-	for (JNIClass clazz : classes) {
+	for (int i = 0; i < classes.length; i++) {
+		JNIClass clazz = classes[i];
 		String exclude = clazz.getExclude();
 		if (exclude.length() != 0) {
 			excludes.add(exclude);
@@ -88,7 +89,8 @@
 	}
 	for (String exclude : excludes) {
 		outputln(exclude);
-		for (JNIClass clazz : classes) {
+		for (int i = 0; i < classes.length; i++) {
+			JNIClass clazz = classes[i];
 			String classExclude = clazz.getExclude();
 			if (exclude.equals(classExclude)) {
 				output("#define NO_");
@@ -199,7 +201,8 @@
 	output("\tjfieldID ");
 	JNIField[] fields = clazz.getDeclaredFields();
 	boolean first = true;
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if (ignoreField(field)) continue;
 		if (!first) output(", ");
 		output(field.getName());
@@ -245,7 +248,8 @@
 	}
 	outputln();
 	JNIField[] fields = clazz.getDeclaredFields();
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if (ignoreField(field)) continue;
 		output("\t");
 		output(clazzName);
@@ -289,7 +293,8 @@
 		}
 	}
 	JNIField[] fields = clazz.getDeclaredFields();
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if (ignoreField(field)) continue;
 		String exclude = field.getExclude();
 		if (exclude.length() != 0) {
@@ -442,7 +447,8 @@
 		}
 	}
 	JNIField[] fields = clazz.getDeclaredFields();
-	for (JNIField field : fields) {
+	for (int i = 0; i < fields.length; i++) {
+		JNIField field = fields[i];
 		if (ignoreField(field)) continue;
 		String exclude = field.getExclude();
 		if (exclude.length() != 0) {
diff --git a/bundles/org.eclipse.swt.tools/JavadocBasher/org/eclipse/swt/tools/internal/JavadocBasher.java b/bundles/org.eclipse.swt.tools/JavadocBasher/org/eclipse/swt/tools/internal/JavadocBasher.java
index 6d6a3e5..f8dc4c1 100644
--- a/bundles/org.eclipse.swt.tools/JavadocBasher/org/eclipse/swt/tools/internal/JavadocBasher.java
+++ b/bundles/org.eclipse.swt.tools/JavadocBasher/org/eclipse/swt/tools/internal/JavadocBasher.java
@@ -450,7 +450,7 @@
 			};
 			for (Entry<String, String> entry: comments.entrySet()) {
 				String name = entry.getKey();
-				if (!entry.getValue().isEmpty()){
+				if (entry.getValue().length() > 0){
 					int i = 0;
 					for (i = 0; i < filter.length; i++) {
 						if (name.equals(filter[i])) break;
diff --git a/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGenerator.java b/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGenerator.java
index 58adc94..2c9e7c2 100644
--- a/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGenerator.java
+++ b/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2018 IBM Corporation and others.
+ * Copyright (c) 2008, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -50,7 +50,8 @@
 	if (path == null) return;
 	File[] frameworks = path.listFiles();
 	if (frameworks == null) return;
-	for (File file : frameworks) {
+	for (int i = 0; i < frameworks.length; i++) {
+		File file = frameworks[i];
 		String name = file.getName();
 		int index = name.lastIndexOf(".");
 		if (index != -1) {
@@ -673,7 +674,8 @@
 		ArrayList<Node> methods = (ArrayList<Node>)clazz[1];
 		Object[] superclass = classes.get(getSuperclassName(node));
 		if (superclass != null) {
-			for (Node method : ((ArrayList<Node>) superclass[1])) {
+			for (Iterator<Node> iterator2 = ((ArrayList<Node>)superclass[1]).iterator(); iterator2.hasNext();) {
+				Node method = iterator2.next();
 				if (isStatic(method)) {
 					methods.add(method);
 				}
diff --git a/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGeneratorUI.java b/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGeneratorUI.java
index 8621562..d5a3106 100644
--- a/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGeneratorUI.java
+++ b/bundles/org.eclipse.swt.tools/Mac Generation/org/eclipse/swt/tools/internal/MacGeneratorUI.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2018 IBM Corporation and others.
+ * Copyright (c) 2008, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -41,9 +41,9 @@
 			parentItem = lastParent;
 		} else {
 			TreeItem[] items = superItem.getItems();
-			for (TreeItem item : items) {
-				if (name.equals(item.getData())) {
-					parentItem = item;
+			for (int i = 0; i < items.length; i++) {
+				if (name.equals(items[i].getData())) {
+					parentItem = items[i];
 					break;
 				}
 			}
@@ -122,15 +122,15 @@
 			}
 			/* Figure out categories state */
 			TreeItem[] items = item.getItems();
-			for (TreeItem item2 : items) {
-				TreeItem[] children = item2.getItems();
+			for (int i = 0; i < items.length; i++) {
+				TreeItem[] children = items[i].getItems();
 				int checkedCount = 0;
 				for (int j = 0; j < children.length; j++) {
 					if (children[j].getChecked()) checkedCount++;
 					if (children[j].getGrayed()) break;
 				}
-				item2.setChecked(checkedCount != 0);
-				item2.setGrayed(checkedCount != children.length);
+				items[i].setChecked(checkedCount != 0);
+				items[i].setGrayed(checkedCount != children.length);
 			}
 		}
 	}
@@ -275,27 +275,30 @@
 //		editorTx.addListener(SWT.FocusOut, textListener);
 		editorTx.addListener(SWT.KeyDown, textListener);
 		editorTx.addListener(SWT.Traverse, textListener);
-		attribTable.addListener(SWT.MouseDown, e -> e.display.asyncExec (() -> {
-			if (attribTable.isDisposed ()) return;
-			if (e.button != 1) return;
-			Point pt = new Point(e.x, e.y);
-			TableItem item = attribTable.getItem(pt);
-			if (item == null) return;
-			int column = -1;
-			for (int i = 0; i < attribTable.getColumnCount(); i++) {
-				if (item.getBounds(i).contains(pt)) {
-					column = i;
-					break;
-				}				
+		attribTable.addListener(SWT.MouseDown, e -> e.display.asyncExec (new Runnable () {
+			@Override
+			public void run () {
+				if (attribTable.isDisposed ()) return;
+				if (e.button != 1) return;
+				Point pt = new Point(e.x, e.y);
+				TableItem item = attribTable.getItem(pt);
+				if (item == null) return;
+				int column = -1;
+				for (int i = 0; i < attribTable.getColumnCount(); i++) {
+					if (item.getBounds(i).contains(pt)) {
+						column = i;
+						break;
+					}				
+				}
+				if (column == -1) return;
+				if (!getEditable(item, column)) return;
+				editor.setColumn(column);
+				editor.setItem(item);
+				editorTx.setText(item.getText(column));
+				editorTx.selectAll();
+				editorTx.setVisible(true);
+				editorTx.setFocus();
 			}
-			if (column == -1) return;
-			if (!getEditable(item, column)) return;
-			editor.setColumn(column);
-			editor.setItem(item);
-			editorTx.setText(item.getText(column));
-			editorTx.selectAll();
-			editorTx.setVisible(true);
-			editorTx.setFocus();
 		}));
 		
 		return comp;
@@ -453,12 +456,13 @@
 	}
 	
 	TreeItem findItem(TreeItem[] items, Node node) {
-		for (TreeItem item : items) {
+		for (int i = 0; i < items.length; i++) {
+			TreeItem item = items[i];
 			checkChildren(item);
 			if (item.getData() == node) return item;
 		}
-		for (TreeItem item : items) {
-			TreeItem child = findItem(item.getItems(), node);
+		for (int i = 0; i < items.length; i++) {
+			TreeItem child = findItem(items[i].getItems(), node);
 			if (child != null) return child;
 		}
 		return null;
diff --git a/bundles/org.eclipse.swt.tools/NativeStats/org/eclipse/swt/tools/internal/NativeStats.java b/bundles/org.eclipse.swt.tools/NativeStats/org/eclipse/swt/tools/internal/NativeStats.java
index 553f0ef..dd45df8 100644
--- a/bundles/org.eclipse.swt.tools/NativeStats/org/eclipse/swt/tools/internal/NativeStats.java
+++ b/bundles/org.eclipse.swt.tools/NativeStats/org/eclipse/swt/tools/internal/NativeStats.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -109,14 +109,16 @@
 	if (funcs == null) return;
 	Arrays.sort(funcs);
 	int total = 0;
-	for (NativeFunction func : funcs) {
+	for (int i = 0; i < funcs.length; i++) {
+		NativeFunction func = funcs[i];
 		total += func.getCallCount();
 	}
 	ps.print(className);
 	ps.print("=");
 	ps.print(total);
 	ps.println();
-	for (NativeFunction func : funcs) {
+	for (int i = 0; i < funcs.length; i++) {
+		NativeFunction func = funcs[i];
 		if (func.getCallCount() > 0) {
 			ps.print("\t");
 			ps.print(func.getName());
@@ -133,7 +135,8 @@
 
 public Map<String, NativeFunction[]> snapshot() {
 	Map<String, NativeFunction[]> snapshot = new HashMap<>();
-	for (String className : classes) {
+	for (int i = 0; i < classes.length; i++) {
+		String className = classes[i];
 		snapshot(className, snapshot);
 	}
 	return snapshot;
